Spaces:
Running
Running
Ship validated WebGPU Q1 turbo runtime
Browse filesChrome exact-token A/B: raw Q1 vec4 +18.9% median on 1.7B; accepted 27B optimization sequence about +26% GPU throughput-equivalent. Final trace-free Chrome and physical Safari 26 gates passed on 1.7B and 27B with one graph split, zero CPU ops, and full WebGPU layer placement.
- README.md +7 -5
- dist/assets/c-D33ISaQg.js +1 -0
- dist/assets/cpp-uVsU3rl9.js +0 -0
- dist/assets/graphql-aweuWxpE.js +1 -0
- dist/assets/index-DjqZvGjf.js +0 -0
- dist/assets/java-Cf25h0JE.js +1 -0
- dist/assets/jsx-BNkhNtQn.js +0 -0
- dist/assets/lua-Cr0_1Hr-.js +1 -0
- dist/assets/nginx-B19-5Nbj.js +1 -0
- dist/assets/perl-CPcQPXT6.js +1 -0
- dist/assets/php-Da7PtId8.js +0 -0
- dist/assets/ruby-1ngPIeVt.js +1 -0
- dist/assets/tsx-Cj8HH6Br.js +0 -0
- dist/assets/typescript-Di2stYAd.js +0 -0
- dist/assets/worker-CUNpJr-j.js +0 -0
- dist/assets/xml-yX2vS4f7.js +1 -0
- dist/index.html +1 -1
- dist/wasm/wllama-compat.wasm +2 -2
- dist/wasm/wllama.wasm +2 -2
- public/wasm/wllama-compat.wasm +2 -2
- public/wasm/wllama.wasm +2 -2
- src/bench/report.ts +2 -0
- vendor/wllama-bonsai/PATCH.diff +1647 -18
- vendor/wllama-bonsai/SOURCE.json +35 -20
- vendor/wllama-bonsai/esm/index.js +0 -0
README.md
CHANGED
|
@@ -181,12 +181,14 @@ stay in the browser; only model/static asset downloads contact Hugging Face.
|
|
| 181 |
- Dawn native WebGPU validation: `18eb229ef5f707c1464cc581252e7603c73a3ef0`
|
| 182 |
- custom wllama source: `912c18b75d4358c1405a64646b8dbe43a205943b`
|
| 183 |
- custom nested llama.cpp: `00fa7cb284cbf133fc426733bd64238a3588a33e`
|
| 184 |
-
- custom patch set: `
|
| 185 |
-
- custom ESM: `
|
| 186 |
-
- JSPI WASM: `
|
| 187 |
-
- compat WASM: `
|
| 188 |
- compat worker: `0b667db536815fb9e5dc9ffbfbd6ba29affdda38a4ba892d5372ddb41ce9a8c8`
|
| 189 |
-
- JSPI Q1_0 profile: raw-layout vec4 WG64
|
|
|
|
|
|
|
| 190 |
|
| 191 |
The vendored runtime exposes the validated token-embedding WebGPU placement
|
| 192 |
needed for single-graph Bonsai inference and fails closed when placement or the
|
|
|
|
| 181 |
- Dawn native WebGPU validation: `18eb229ef5f707c1464cc581252e7603c73a3ef0`
|
| 182 |
- custom wllama source: `912c18b75d4358c1405a64646b8dbe43a205943b`
|
| 183 |
- custom nested llama.cpp: `00fa7cb284cbf133fc426733bd64238a3588a33e`
|
| 184 |
+
- custom patch set: `60a5280bea5fc5ae11065f4c83fd2d532526cdcb7977cbe927cac7ae90926bde`
|
| 185 |
+
- custom ESM: `a02f02b86d7dac8e3bd6c21225910c755bb85ec64ac7d323bfbfa2477b225e3d`
|
| 186 |
+
- JSPI WASM: `dbded8334921b51877ade32009bcaee5b7423e3b39679089a970062c57128acb`
|
| 187 |
+
- compat WASM: `f9b1bd2bd2a62a6b95ab52ecda92d10c709bc1ac3b6be9bb450e5adeff8dd39f`
|
| 188 |
- compat worker: `0b667db536815fb9e5dc9ffbfbd6ba29affdda38a4ba892d5372ddb41ce9a8c8`
|
| 189 |
+
- JSPI Q1_0 profile: raw-layout vec4 WG64 with shape-aware 4/8/16-output
|
| 190 |
+
tiling, direct GDN cache writes, and dual FFN projection + SwiGLU fusion;
|
| 191 |
+
Safari compat Q1_0 profile: scalar/conservative
|
| 192 |
|
| 193 |
The vendored runtime exposes the validated token-embedding WebGPU placement
|
| 194 |
needed for single-graph Bonsai inference and fails closed when placement or the
|
dist/assets/c-D33ISaQg.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{t as e}from"./index-DjqZvGjf.js";var t=e({default:()=>n}),n=[Object.freeze(JSON.parse(`{"displayName":"C","name":"c","patterns":[{"include":"#preprocessor-rule-enabled"},{"include":"#preprocessor-rule-disabled"},{"include":"#preprocessor-rule-conditional"},{"include":"#predefined_macros"},{"include":"#comments"},{"include":"#switch_statement"},{"include":"#anon_pattern_1"},{"include":"#storage_types"},{"include":"#anon_pattern_2"},{"include":"#anon_pattern_3"},{"include":"#anon_pattern_4"},{"include":"#anon_pattern_5"},{"include":"#anon_pattern_6"},{"include":"#anon_pattern_7"},{"include":"#operators"},{"include":"#numbers"},{"include":"#strings"},{"include":"#anon_pattern_range_1"},{"include":"#anon_pattern_range_2"},{"include":"#anon_pattern_range_3"},{"include":"#pragma-mark"},{"include":"#anon_pattern_range_4"},{"include":"#anon_pattern_range_5"},{"include":"#anon_pattern_range_6"},{"include":"#anon_pattern_8"},{"include":"#anon_pattern_9"},{"include":"#anon_pattern_10"},{"include":"#anon_pattern_11"},{"include":"#anon_pattern_12"},{"include":"#anon_pattern_13"},{"include":"#block"},{"include":"#parens"},{"include":"#anon_pattern_range_7"},{"include":"#line_continuation_character"},{"include":"#anon_pattern_range_8"},{"include":"#anon_pattern_range_9"},{"include":"#anon_pattern_14"},{"include":"#anon_pattern_15"}],"repository":{"access-method":{"begin":"([A-Z_a-z][0-9A-Z_a-z]*|(?<=[])]))\\\\s*(?:(\\\\.)|(->))((?:[A-Z_a-z][0-9A-Z_a-z]*\\\\s*(?:\\\\.|->))*)\\\\s*([A-Z_a-z][0-9A-Z_a-z]*)(\\\\()","beginCaptures":{"1":{"name":"variable.object.c"},"2":{"name":"punctuation.separator.dot-access.c"},"3":{"name":"punctuation.separator.pointer-access.c"},"4":{"patterns":[{"match":"\\\\.","name":"punctuation.separator.dot-access.c"},{"match":"->","name":"punctuation.separator.pointer-access.c"},{"match":"[A-Z_a-z][0-9A-Z_a-z]*","name":"variable.object.c"},{"match":".+","name":"everything.else.c"}]},"5":{"name":"entity.name.function.member.c"},"6":{"name":"punctuation.section.arguments.begin.bracket.round.function.member.c"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.section.arguments.end.bracket.round.function.member.c"}},"name":"meta.function-call.member.c","patterns":[{"include":"#function-call-innards"}]},"anon_pattern_1":{"match":"\\\\b(break|continue|do|else|for|goto|if|_Pragma|return|while)\\\\b","name":"keyword.control.c"},"anon_pattern_10":{"match":"\\\\b((?:int8|int16|int32|int64|uint8|uint16|uint32|uint64|int_least8|int_least16|int_least32|int_least64|uint_least8|uint_least16|uint_least32|uint_least64|int_fast8|int_fast16|int_fast32|int_fast64|uint_fast8|uint_fast16|uint_fast32|uint_fast64|intptr|uintptr|intmax|uintmax)_t)\\\\b","name":"support.type.stdint.c"},"anon_pattern_11":{"match":"\\\\b(noErr|kNilOptions|kInvalidID|kVariableLengthArray)\\\\b","name":"support.constant.mac-classic.c"},"anon_pattern_12":{"match":"\\\\b(AbsoluteTime|Boolean|Byte|ByteCount|ByteOffset|BytePtr|CompTimeValue|ConstLogicalAddress|ConstStrFileNameParam|ConstStringPtr|Duration|Fixed|FixedPtr|Float32|Float32Point|Float64|Float80|Float96|FourCharCode|Fract|FractPtr|Handle|ItemCount|LogicalAddress|OptionBits|OSErr|OSStatus|OSType|OSTypePtr|PhysicalAddress|ProcessSerialNumber|ProcessSerialNumberPtr|ProcHandle|Ptr|ResType|ResTypePtr|ShortFixed|ShortFixedPtr|SignedByte|SInt16|SInt32|SInt64|SInt8|Size|StrFileName|StringHandle|StringPtr|TimeBase|TimeRecord|TimeScale|TimeValue|TimeValue64|UInt16|UInt32|UInt64|UInt8|UniChar|UniCharCount|UniCharCountPtr|UniCharPtr|UnicodeScalarValue|UniversalProcHandle|UniversalProcPtr|UnsignedFixed|UnsignedFixedPtr|UnsignedWide|UTF16Char|UTF32Char|UTF8Char)\\\\b","name":"support.type.mac-classic.c"},"anon_pattern_13":{"match":"\\\\b([0-9A-Z_a-z]+_t)\\\\b","name":"support.type.posix-reserved.c"},"anon_pattern_14":{"match":";","name":"punctuation.terminator.statement.c"},"anon_pattern_15":{"match":",","name":"punctuation.separator.delimiter.c"},"anon_pattern_2":{"match":"typedef","name":"keyword.other.typedef.c"},"anon_pattern_3":{"match":"\\\\b(const|extern|register|restrict|static|volatile|inline)\\\\b","name":"storage.modifier.c"},"anon_pattern_4":{"match":"\\\\bk[A-Z]\\\\w*\\\\b","name":"constant.other.variable.mac-classic.c"},"anon_pattern_5":{"match":"\\\\bg[A-Z]\\\\w*\\\\b","name":"variable.other.readwrite.global.mac-classic.c"},"anon_pattern_6":{"match":"\\\\bs[A-Z]\\\\w*\\\\b","name":"variable.other.readwrite.static.mac-classic.c"},"anon_pattern_7":{"match":"\\\\b(NULL|true|false|TRUE|FALSE)\\\\b","name":"constant.language.c"},"anon_pattern_8":{"match":"\\\\b(u_char|u_short|u_int|u_long|ushort|uint|u_quad_t|quad_t|qaddr_t|caddr_t|daddr_t|div_t|dev_t|fixpt_t|blkcnt_t|blksize_t|gid_t|in_addr_t|in_port_t|ino_t|key_t|mode_t|nlink_t|id_t|pid_t|off_t|segsz_t|swblk_t|uid_t|id_t|clock_t|size_t|ssize_t|time_t|useconds_t|suseconds_t)\\\\b","name":"support.type.sys-types.c"},"anon_pattern_9":{"match":"\\\\b(pthread_(?:attr_|cond_|condattr_|mutex_|mutexattr_|once_|rwlock_|rwlockattr_||key_)t)\\\\b","name":"support.type.pthread.c"},"anon_pattern_range_1":{"begin":"((?:(?>\\\\s+)|(/\\\\*)((?>(?:[^*]|(?>\\\\*+)[^/])*)((?>\\\\*+)/)))+?|(?:(?:(?:(?:\\\\b|(?<=\\\\W))|(?=\\\\W))|\\\\A)|\\\\Z))((#)\\\\s*define)\\\\b\\\\s+((?<!\\\\w)[A-Z_a-z]\\\\w*(?!\\\\w))(?:(\\\\()([^()\\\\\\\\]+)(\\\\)))?","beginCaptures":{"1":{"patterns":[{"include":"#inline_comment"}]},"2":{"name":"comment.block.c punctuation.definition.comment.begin.c"},"3":{"name":"comment.block.c"},"4":{"patterns":[{"match":"\\\\*/","name":"comment.block.c punctuation.definition.comment.end.c"},{"match":"\\\\*","name":"comment.block.c"}]},"5":{"name":"keyword.control.directive.define.c"},"6":{"name":"punctuation.definition.directive.c"},"7":{"name":"entity.name.function.preprocessor.c"},"8":{"name":"punctuation.definition.parameters.begin.c"},"9":{"patterns":[{"captures":{"1":{"name":"variable.parameter.preprocessor.c"}},"match":"(?<=[(,])\\\\s*((?<!\\\\w)[A-Z_a-z]\\\\w*(?!\\\\w))\\\\s*"},{"match":",","name":"punctuation.separator.parameters.c"},{"match":"\\\\.\\\\.\\\\.","name":"ellipses.c punctuation.vararg-ellipses.variable.parameter.preprocessor.c"}]},"10":{"name":"punctuation.definition.parameters.end.c"}},"end":"(?<!\\\\\\\\)(?=\\\\n)","name":"meta.preprocessor.macro.c","patterns":[{"include":"#preprocessor-rule-define-line-contents"}]},"anon_pattern_range_2":{"begin":"^\\\\s*((#)\\\\s*(error|warning))\\\\b\\\\s*","beginCaptures":{"1":{"name":"keyword.control.directive.diagnostic.$3.c"},"2":{"name":"punctuation.definition.directive.c"}},"end":"(?<!\\\\\\\\)(?=\\\\n)","name":"meta.preprocessor.diagnostic.c","patterns":[{"begin":"\\"","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.c"}},"end":"\\"|(?<!\\\\\\\\)(?=\\\\s*\\\\n)","endCaptures":{"0":{"name":"punctuation.definition.string.end.c"}},"name":"string.quoted.double.c","patterns":[{"include":"#line_continuation_character"}]},{"begin":"'","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.c"}},"end":"'|(?<!\\\\\\\\)(?=\\\\s*\\\\n)","endCaptures":{"0":{"name":"punctuation.definition.string.end.c"}},"name":"string.quoted.single.c","patterns":[{"include":"#line_continuation_character"}]},{"begin":"[^\\"']","end":"(?<!\\\\\\\\)(?=\\\\s*\\\\n)","name":"string.unquoted.single.c","patterns":[{"include":"#line_continuation_character"},{"include":"#comments"}]}]},"anon_pattern_range_3":{"begin":"^\\\\s*((#)\\\\s*(i(?:nclude(?:_next)?|mport)))\\\\b\\\\s*","beginCaptures":{"1":{"name":"keyword.control.directive.$3.c"},"2":{"name":"punctuation.definition.directive.c"}},"end":"(?=/[*/])|(?<!\\\\\\\\)(?=\\\\n)","name":"meta.preprocessor.include.c","patterns":[{"include":"#line_continuation_character"},{"begin":"\\"","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.c"}},"end":"\\"","endCaptures":{"0":{"name":"punctuation.definition.string.end.c"}},"name":"string.quoted.double.include.c"},{"begin":"<","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.c"}},"end":">","endCaptures":{"0":{"name":"punctuation.definition.string.end.c"}},"name":"string.quoted.other.lt-gt.include.c"}]},"anon_pattern_range_4":{"begin":"^\\\\s*((#)\\\\s*line)\\\\b","beginCaptures":{"1":{"name":"keyword.control.directive.line.c"},"2":{"name":"punctuation.definition.directive.c"}},"end":"(?=/[*/])|(?<!\\\\\\\\)(?=\\\\n)","name":"meta.preprocessor.c","patterns":[{"include":"#strings"},{"include":"#numbers"},{"include":"#line_continuation_character"}]},"anon_pattern_range_5":{"begin":"^\\\\s*((#)\\\\s*undef)\\\\b","beginCaptures":{"1":{"name":"keyword.control.directive.undef.c"},"2":{"name":"punctuation.definition.directive.c"}},"end":"(?=/[*/])|(?<!\\\\\\\\)(?=\\\\n)","name":"meta.preprocessor.c","patterns":[{"match":"[$A-Z_a-z][$\\\\w]*","name":"entity.name.function.preprocessor.c"},{"include":"#line_continuation_character"}]},"anon_pattern_range_6":{"begin":"^\\\\s*((#)\\\\s*pragma)\\\\b","beginCaptures":{"1":{"name":"keyword.control.directive.pragma.c"},"2":{"name":"punctuation.definition.directive.c"}},"end":"(?=/[*/])|(?<!\\\\\\\\)(?=\\\\n)","name":"meta.preprocessor.pragma.c","patterns":[{"include":"#strings"},{"match":"[$A-Z_a-z][-$\\\\w]*","name":"entity.other.attribute-name.pragma.preprocessor.c"},{"include":"#numbers"},{"include":"#line_continuation_character"}]},"anon_pattern_range_7":{"begin":"(?<!\\\\w)(?!\\\\s*(?:atomic_uint_least64_t|atomic_uint_least16_t|atomic_uint_least32_t|atomic_uint_least8_t|atomic_int_least16_t|atomic_uint_fast64_t|atomic_uint_fast32_t|atomic_int_least64_t|atomic_int_least32_t|pthread_rwlockattr_t|atomic_uint_fast16_t|pthread_mutexattr_t|atomic_int_fast16_t|atomic_uint_fast8_t|atomic_int_fast64_t|atomic_int_least8_t|atomic_int_fast32_t|atomic_int_fast8_t|pthread_condattr_t|pthread_rwlock_t|atomic_uintptr_t|atomic_ptrdiff_t|atomic_uintmax_t|atomic_intmax_t|atomic_char32_t|atomic_intptr_t|atomic_char16_t|pthread_mutex_t|pthread_cond_t|atomic_wchar_t|uint_least64_t|uint_least32_t|uint_least16_t|pthread_once_t|pthread_attr_t|uint_least8_t|int_least32_t|int_least16_t|pthread_key_t|uint_fast32_t|uint_fast64_t|uint_fast16_t|atomic_size_t|atomic_ushort|atomic_ullong|int_least64_t|atomic_ulong|int_least8_t|int_fast16_t|int_fast32_t|int_fast64_t|uint_fast8_t|memory_order|atomic_schar|atomic_uchar|atomic_short|atomic_llong|thread_local|atomic_bool|atomic_uint|atomic_long|int_fast8_t|suseconds_t|atomic_char|atomic_int|useconds_t|_Imaginary|uintmax_t|in_addr_t|in_port_t|_Noreturn|blksize_t|pthread_t|uintptr_t|volatile|u_quad_t|blkcnt_t|intmax_t|intptr_t|_Complex|uint16_t|uint32_t|uint64_t|_Alignof|_Alignas|continue|unsigned|restrict|intmax_t|register|int64_t|qaddr_t|segsz_t|_Atomic|alignas|default|caddr_t|nlink_t|typedef|u_short|fixpt_t|clock_t|swblk_t|ssize_t|alignof|daddr_t|int16_t|int32_t|uint8_t|struct|mode_t|size_t|time_t|ushort|u_long|u_char|int8_t|double|signed|static|extern|inline|return|switch|xor_eq|and_eq|bitand|not_eq|sizeof|quad_t|uid_t|bitor|union|off_t|key_t|ino_t|compl|u_int|short|const|false|while|float|pid_t|break|_Bool|or_eq|div_t|dev_t|gid_t|id_t|long|case|goto|else|bool|auto|id_t|enum|uint|true|NULL|void|char|for|not|int|and|xor|do|or|if)\\\\s*\\\\()(?=[A-Z_a-z]\\\\w*\\\\s*\\\\()","end":"(?!\\\\G)(?<=\\\\))","name":"meta.function.c","patterns":[{"include":"#function-innards"}]},"anon_pattern_range_8":{"begin":"([A-Z_a-z][0-9A-Z_a-z]*|(?<=[])]))?(\\\\[)(?!])","beginCaptures":{"1":{"name":"variable.object.c"},"2":{"name":"punctuation.definition.begin.bracket.square.c"}},"end":"]","endCaptures":{"0":{"name":"punctuation.definition.end.bracket.square.c"}},"name":"meta.bracket.square.access.c","patterns":[{"include":"#function-call-innards"}]},"anon_pattern_range_9":{"match":"\\\\[\\\\s*]","name":"storage.modifier.array.bracket.square.c"},"backslash_escapes":{"match":"\\\\\\\\([\\"'?\\\\\\\\abefnprtv]|[0-3][0-7]{0,2}|[4-7]\\\\d?|x\\\\h{0,2}|u\\\\h{0,4}|U\\\\h{0,8})","name":"constant.character.escape.c"},"block":{"patterns":[{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.section.block.begin.bracket.curly.c"}},"end":"}|(?=\\\\s*#\\\\s*e(?:lif|lse|ndif)\\\\b)","endCaptures":{"0":{"name":"punctuation.section.block.end.bracket.curly.c"}},"name":"meta.block.c","patterns":[{"include":"#block_innards"}]}]},"block_comment":{"patterns":[{"begin":"\\\\s*+(/\\\\*)","beginCaptures":{"1":{"name":"punctuation.definition.comment.begin.c"}},"end":"\\\\*/","endCaptures":{"0":{"name":"punctuation.definition.comment.end.c"}},"name":"comment.block.c"},{"begin":"\\\\s*+(/\\\\*)","beginCaptures":{"1":{"name":"punctuation.definition.comment.begin.c"}},"end":"\\\\*/","endCaptures":{"0":{"name":"punctuation.definition.comment.end.c"}},"name":"comment.block.c"}]},"block_innards":{"patterns":[{"include":"#preprocessor-rule-enabled-block"},{"include":"#preprocessor-rule-disabled-block"},{"include":"#preprocessor-rule-conditional-block"},{"include":"#method_access"},{"include":"#member_access"},{"include":"#c_function_call"},{"begin":"(?=\\\\s)(?<!else|new|return)(?<=\\\\w)\\\\s+(and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq|alignof|alignas)((?:[A-Z_a-z][0-9A-Z_a-z]*+|::)++|(?<=operator)(?:[-!\\\\&*+<=>]+|\\\\(\\\\)|\\\\[]))\\\\s*(\\\\()","beginCaptures":{"1":{"name":"variable.other.c"},"2":{"name":"punctuation.section.parens.begin.bracket.round.initialization.c"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.section.parens.end.bracket.round.initialization.c"}},"name":"meta.initialization.c","patterns":[{"include":"#function-call-innards"}]},{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.section.block.begin.bracket.curly.c"}},"end":"}|(?=\\\\s*#\\\\s*e(?:lif|lse|ndif)\\\\b)","endCaptures":{"0":{"name":"punctuation.section.block.end.bracket.curly.c"}},"patterns":[{"include":"#block_innards"}]},{"include":"#parens-block"},{"include":"$self"}]},"c_conditional_context":{"patterns":[{"include":"$self"},{"include":"#block_innards"}]},"c_function_call":{"begin":"(?!(?:while|for|do|if|else|switch|catch|enumerate|return|typeid|alignof|alignas|sizeof|[cr]?iterate|and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq|alignof|alignas)\\\\s*\\\\()(?=(?:[A-Z_a-z][0-9A-Z_a-z]*+|::)++\\\\s*\\\\(|(?<=operator)(?:[-!\\\\&*+<=>]+|\\\\(\\\\)|\\\\[])\\\\s*\\\\()","end":"(?<=\\\\))(?!\\\\w)","name":"meta.function-call.c","patterns":[{"include":"#function-call-innards"}]},"case_statement":{"begin":"((?>(?:(?>(?<!\\\\s)\\\\s+)|(/\\\\*)((?>(?:[^*]|(?>\\\\*+)[^/])*)((?>\\\\*+)/)))+|(?:(?:(?:(?:\\\\b|(?<=\\\\W))|(?=\\\\W))|\\\\A)|\\\\Z)))((?<!\\\\w)case(?!\\\\w))","beginCaptures":{"1":{"patterns":[{"include":"#inline_comment"}]},"2":{"name":"comment.block.c punctuation.definition.comment.begin.c"},"3":{"name":"comment.block.c"},"4":{"patterns":[{"match":"\\\\*/","name":"comment.block.c punctuation.definition.comment.end.c"},{"match":"\\\\*","name":"comment.block.c"}]},"5":{"name":"keyword.control.case.c"}},"end":"(:)","endCaptures":{"1":{"name":"punctuation.separator.colon.case.c"}},"name":"meta.conditional.case.c","patterns":[{"include":"#evaluation_context"},{"include":"#c_conditional_context"}]},"comments":{"patterns":[{"patterns":[{"patterns":[{"begin":"^(?>\\\\s*)(//[!/]+)","beginCaptures":{"1":{"name":"punctuation.definition.comment.documentation.c"}},"end":"(?<=\\\\n)(?<!\\\\\\\\\\\\n)","name":"comment.line.double-slash.documentation.c","patterns":[{"include":"#line_continuation_character"},{"match":"(?<=[!*/\\\\s])[@\\\\\\\\](?:callergraph|callgraph|else|endif|f\\\\$|f\\\\[|f]|hidecallergraph|hidecallgraph|hiderefby|hiderefs|hideinitializer|htmlinclude|n|nosubgrouping|private|privatesection|protected|protectedsection|public|publicsection|pure|showinitializer|showrefby|showrefs|tableofcontents|[\\"-%.<=>]|::|\\\\||---??)\\\\b(?:\\\\{[^}]*})?","name":"storage.type.class.doxygen.c"},{"captures":{"1":{"name":"storage.type.class.doxygen.c"},"2":{"name":"markup.italic.doxygen.c"}},"match":"((?<=[!*/\\\\s])[@\\\\\\\\](?:a|em?))\\\\s+(\\\\S+)"},{"captures":{"1":{"name":"storage.type.class.doxygen.c"},"2":{"name":"markup.bold.doxygen.c"}},"match":"((?<=[!*/\\\\s])[@\\\\\\\\]b)\\\\s+(\\\\S+)"},{"captures":{"1":{"name":"storage.type.class.doxygen.c"},"2":{"name":"markup.inline.raw.string.c"}},"match":"((?<=[!*/\\\\s])[@\\\\\\\\][cp])\\\\s+(\\\\S+)"},{"match":"(?<=[!*/\\\\s])[@\\\\\\\\](?:a|anchor|[bc]|cite|copybrief|copydetail|copydoc|def|dir|dontinclude|em??|emoji|enum|example|extends|file|idlexcept|implements|include|includedoc|includelineno|latexinclude|link|memberof|namespace|p|package|ref|refitem|related|relates|relatedalso|relatesalso|verbinclude)\\\\b(?:\\\\{[^}]*})?","name":"storage.type.class.doxygen.c"},{"match":"(?<=[!*/\\\\s])[@\\\\\\\\](?:addindex|addtogroup|category|class|defgroup|diafile|dotfile|elseif|fn|headerfile|if|ifnot|image|ingroup|interface|line|mainpage|mscfile|name|overload|page|property|protocol|section|skip|skipline|snippet|snippetdoc|snippetlineno|struct|subpage|subsection|subsubsection|typedef|union|until|vhdlflow|weakgroup)\\\\b(?:\\\\{[^}]*})?","name":"storage.type.class.doxygen.c"},{"captures":{"1":{"name":"storage.type.class.doxygen.c"},"2":{"patterns":[{"match":"in|out","name":"keyword.other.parameter.direction.$0.c"}]},"3":{"name":"variable.parameter.c"}},"match":"((?<=[!*/\\\\s])[@\\\\\\\\]param)(?:\\\\s*\\\\[((?:,?\\\\s*(?:in|out)\\\\s*)+)])?\\\\s+\\\\b(\\\\w+)\\\\b"},{"match":"(?<=[!*/\\\\s])[@\\\\\\\\](?:arg|attention|authors??|brief|bug|copyright|date|deprecated|details|exception|invariant|li|note|par|paragraph|param|post|pre|remarks??|result|returns??|retval|sa|see|short|since|test|throw|todo|tparam|version|warning|xrefitem)\\\\b(?:\\\\{[^}]*})?","name":"storage.type.class.doxygen.c"},{"match":"(?<=[!*/\\\\s])[@\\\\\\\\](?:code|cond|docbookonly|dot|htmlonly|internal|latexonly|link|manonly|msc|parblock|rtfonly|secreflist|uml|verbatim|xmlonly|endcode|endcond|enddocbookonly|enddot|endhtmlonly|endinternal|endlatexonly|endlink|endmanonly|endmsc|endparblock|endrtfonly|endsecreflist|enduml|endverbatim|endxmlonly)\\\\b(?:\\\\{[^}]*})?","name":"storage.type.class.doxygen.c"},{"match":"\\\\b[A-Z]+:|@[_a-z]+:","name":"storage.type.class.gtkdoc"}]},{"captures":{"1":{"name":"punctuation.definition.comment.begin.documentation.c"},"2":{"patterns":[{"match":"(?<=[!*/\\\\s])[@\\\\\\\\](?:callergraph|callgraph|else|endif|f\\\\$|f\\\\[|f]|hidecallergraph|hidecallgraph|hiderefby|hiderefs|hideinitializer|htmlinclude|n|nosubgrouping|private|privatesection|protected|protectedsection|public|publicsection|pure|showinitializer|showrefby|showrefs|tableofcontents|[\\"-%.<=>]|::|\\\\||---??)\\\\b(?:\\\\{[^}]*})?","name":"storage.type.class.doxygen.c"},{"captures":{"1":{"name":"storage.type.class.doxygen.c"},"2":{"name":"markup.italic.doxygen.c"}},"match":"((?<=[!*/\\\\s])[@\\\\\\\\](?:a|em?))\\\\s+(\\\\S+)"},{"captures":{"1":{"name":"storage.type.class.doxygen.c"},"2":{"name":"markup.bold.doxygen.c"}},"match":"((?<=[!*/\\\\s])[@\\\\\\\\]b)\\\\s+(\\\\S+)"},{"captures":{"1":{"name":"storage.type.class.doxygen.c"},"2":{"name":"markup.inline.raw.string.c"}},"match":"((?<=[!*/\\\\s])[@\\\\\\\\][cp])\\\\s+(\\\\S+)"},{"match":"(?<=[!*/\\\\s])[@\\\\\\\\](?:a|anchor|[bc]|cite|copybrief|copydetail|copydoc|def|dir|dontinclude|em??|emoji|enum|example|extends|file|idlexcept|implements|include|includedoc|includelineno|latexinclude|link|memberof|namespace|p|package|ref|refitem|related|relates|relatedalso|relatesalso|verbinclude)\\\\b(?:\\\\{[^}]*})?","name":"storage.type.class.doxygen.c"},{"match":"(?<=[!*/\\\\s])[@\\\\\\\\](?:addindex|addtogroup|category|class|defgroup|diafile|dotfile|elseif|fn|headerfile|if|ifnot|image|ingroup|interface|line|mainpage|mscfile|name|overload|page|property|protocol|section|skip|skipline|snippet|snippetdoc|snippetlineno|struct|subpage|subsection|subsubsection|typedef|union|until|vhdlflow|weakgroup)\\\\b(?:\\\\{[^}]*})?","name":"storage.type.class.doxygen.c"},{"captures":{"1":{"name":"storage.type.class.doxygen.c"},"2":{"patterns":[{"match":"in|out","name":"keyword.other.parameter.direction.$0.c"}]},"3":{"name":"variable.parameter.c"}},"match":"((?<=[!*/\\\\s])[@\\\\\\\\]param)(?:\\\\s*\\\\[((?:,?\\\\s*(?:in|out)\\\\s*)+)])?\\\\s+\\\\b(\\\\w+)\\\\b"},{"match":"(?<=[!*/\\\\s])[@\\\\\\\\](?:arg|attention|authors??|brief|bug|copyright|date|deprecated|details|exception|invariant|li|note|par|paragraph|param|post|pre|remarks??|result|returns??|retval|sa|see|short|since|test|throw|todo|tparam|version|warning|xrefitem)\\\\b(?:\\\\{[^}]*})?","name":"storage.type.class.doxygen.c"},{"match":"(?<=[!*/\\\\s])[@\\\\\\\\](?:code|cond|docbookonly|dot|htmlonly|internal|latexonly|link|manonly|msc|parblock|rtfonly|secreflist|uml|verbatim|xmlonly|endcode|endcond|enddocbookonly|enddot|endhtmlonly|endinternal|endlatexonly|endlink|endmanonly|endmsc|endparblock|endrtfonly|endsecreflist|enduml|endverbatim|endxmlonly)\\\\b(?:\\\\{[^}]*})?","name":"storage.type.class.doxygen.c"},{"match":"\\\\b[A-Z]+:|@[_a-z]+:","name":"storage.type.class.gtkdoc"}]},"3":{"name":"punctuation.definition.comment.end.documentation.c"}},"match":"(/\\\\*[!*]+(?=\\\\s))(.+)([!*]*\\\\*/)","name":"comment.block.documentation.c"},{"begin":"((?>\\\\s*)/\\\\*[!*]+(?:(?:\\\\n|$)|(?=\\\\s)))","beginCaptures":{"1":{"name":"punctuation.definition.comment.begin.documentation.c"}},"end":"([!*]*\\\\*/)","endCaptures":{"1":{"name":"punctuation.definition.comment.end.documentation.c"}},"name":"comment.block.documentation.c","patterns":[{"match":"(?<=[!*/\\\\s])[@\\\\\\\\](?:callergraph|callgraph|else|endif|f\\\\$|f\\\\[|f]|hidecallergraph|hidecallgraph|hiderefby|hiderefs|hideinitializer|htmlinclude|n|nosubgrouping|private|privatesection|protected|protectedsection|public|publicsection|pure|showinitializer|showrefby|showrefs|tableofcontents|[\\"-%.<=>]|::|\\\\||---??)\\\\b(?:\\\\{[^}]*})?","name":"storage.type.class.doxygen.c"},{"captures":{"1":{"name":"storage.type.class.doxygen.c"},"2":{"name":"markup.italic.doxygen.c"}},"match":"((?<=[!*/\\\\s])[@\\\\\\\\](?:a|em?))\\\\s+(\\\\S+)"},{"captures":{"1":{"name":"storage.type.class.doxygen.c"},"2":{"name":"markup.bold.doxygen.c"}},"match":"((?<=[!*/\\\\s])[@\\\\\\\\]b)\\\\s+(\\\\S+)"},{"captures":{"1":{"name":"storage.type.class.doxygen.c"},"2":{"name":"markup.inline.raw.string.c"}},"match":"((?<=[!*/\\\\s])[@\\\\\\\\][cp])\\\\s+(\\\\S+)"},{"match":"(?<=[!*/\\\\s])[@\\\\\\\\](?:a|anchor|[bc]|cite|copybrief|copydetail|copydoc|def|dir|dontinclude|em??|emoji|enum|example|extends|file|idlexcept|implements|include|includedoc|includelineno|latexinclude|link|memberof|namespace|p|package|ref|refitem|related|relates|relatedalso|relatesalso|verbinclude)\\\\b(?:\\\\{[^}]*})?","name":"storage.type.class.doxygen.c"},{"match":"(?<=[!*/\\\\s])[@\\\\\\\\](?:addindex|addtogroup|category|class|defgroup|diafile|dotfile|elseif|fn|headerfile|if|ifnot|image|ingroup|interface|line|mainpage|mscfile|name|overload|page|property|protocol|section|skip|skipline|snippet|snippetdoc|snippetlineno|struct|subpage|subsection|subsubsection|typedef|union|until|vhdlflow|weakgroup)\\\\b(?:\\\\{[^}]*})?","name":"storage.type.class.doxygen.c"},{"captures":{"1":{"name":"storage.type.class.doxygen.c"},"2":{"patterns":[{"match":"in|out","name":"keyword.other.parameter.direction.$0.c"}]},"3":{"name":"variable.parameter.c"}},"match":"((?<=[!*/\\\\s])[@\\\\\\\\]param)(?:\\\\s*\\\\[((?:,?\\\\s*(?:in|out)\\\\s*)+)])?\\\\s+\\\\b(\\\\w+)\\\\b"},{"match":"(?<=[!*/\\\\s])[@\\\\\\\\](?:arg|attention|authors??|brief|bug|copyright|date|deprecated|details|exception|invariant|li|note|par|paragraph|param|post|pre|remarks??|result|returns??|retval|sa|see|short|since|test|throw|todo|tparam|version|warning|xrefitem)\\\\b(?:\\\\{[^}]*})?","name":"storage.type.class.doxygen.c"},{"match":"(?<=[!*/\\\\s])[@\\\\\\\\](?:code|cond|docbookonly|dot|htmlonly|internal|latexonly|link|manonly|msc|parblock|rtfonly|secreflist|uml|verbatim|xmlonly|endcode|endcond|enddocbookonly|enddot|endhtmlonly|endinternal|endlatexonly|endlink|endmanonly|endmsc|endparblock|endrtfonly|endsecreflist|enduml|endverbatim|endxmlonly)\\\\b(?:\\\\{[^}]*})?","name":"storage.type.class.doxygen.c"},{"match":"\\\\b[A-Z]+:|@[_a-z]+:","name":"storage.type.class.gtkdoc"}]},{"captures":{"1":{"name":"meta.toc-list.banner.block.c"}},"match":"^/\\\\* =(\\\\s*.*?)\\\\s*= \\\\*/$\\\\n?","name":"comment.block.banner.c"},{"begin":"(/\\\\*)","beginCaptures":{"1":{"name":"punctuation.definition.comment.begin.c"}},"end":"(\\\\*/)","endCaptures":{"1":{"name":"punctuation.definition.comment.end.c"}},"name":"comment.block.c"},{"captures":{"1":{"name":"meta.toc-list.banner.line.c"}},"match":"^// =(\\\\s*.*?)\\\\s*=$\\\\n?","name":"comment.line.banner.c"},{"begin":"((?:^[\\\\t ]+)?)(?=//)","beginCaptures":{"1":{"name":"punctuation.whitespace.comment.leading.c"}},"end":"(?!\\\\G)","patterns":[{"begin":"(//)","beginCaptures":{"1":{"name":"punctuation.definition.comment.c"}},"end":"(?=\\\\n)","name":"comment.line.double-slash.c","patterns":[{"include":"#line_continuation_character"}]}]}]},{"include":"#block_comment"},{"include":"#line_comment"}]},{"include":"#block_comment"},{"include":"#line_comment"}]},"default_statement":{"begin":"((?>(?:(?>(?<!\\\\s)\\\\s+)|(/\\\\*)((?>(?:[^*]|(?>\\\\*+)[^/])*)((?>\\\\*+)/)))+|(?:(?:(?:(?:\\\\b|(?<=\\\\W))|(?=\\\\W))|\\\\A)|\\\\Z)))((?<!\\\\w)default(?!\\\\w))","beginCaptures":{"1":{"patterns":[{"include":"#inline_comment"}]},"2":{"name":"comment.block.c punctuation.definition.comment.begin.c"},"3":{"name":"comment.block.c"},"4":{"patterns":[{"match":"\\\\*/","name":"comment.block.c punctuation.definition.comment.end.c"},{"match":"\\\\*","name":"comment.block.c"}]},"5":{"name":"keyword.control.default.c"}},"end":"(:)","endCaptures":{"1":{"name":"punctuation.separator.colon.case.default.c"}},"name":"meta.conditional.case.c","patterns":[{"include":"#evaluation_context"},{"include":"#c_conditional_context"}]},"disabled":{"begin":"^\\\\s*#\\\\s*if(n?def)?\\\\b.*$","end":"^\\\\s*#\\\\s*endif\\\\b","patterns":[{"include":"#disabled"},{"include":"#pragma-mark"}]},"evaluation_context":{"patterns":[{"include":"#function-call-innards"},{"include":"$self"}]},"function-call-innards":{"patterns":[{"include":"#comments"},{"include":"#storage_types"},{"include":"#method_access"},{"include":"#member_access"},{"include":"#operators"},{"begin":"(?!(?:while|for|do|if|else|switch|catch|enumerate|return|typeid|alignof|alignas|sizeof|[cr]?iterate|and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq|alignof|alignas)\\\\s*\\\\()((?:[A-Z_a-z][0-9A-Z_a-z]*+|::)++|(?<=operator)(?:[-!\\\\&*+<=>]+|\\\\(\\\\)|\\\\[]))\\\\s*(\\\\()","beginCaptures":{"1":{"name":"entity.name.function.c"},"2":{"name":"punctuation.section.arguments.begin.bracket.round.c"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.section.arguments.end.bracket.round.c"}},"patterns":[{"include":"#function-call-innards"}]},{"begin":"\\\\(","beginCaptures":{"0":{"name":"punctuation.section.parens.begin.bracket.round.c"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.section.parens.end.bracket.round.c"}},"patterns":[{"include":"#function-call-innards"}]},{"include":"#block_innards"}]},"function-innards":{"patterns":[{"include":"#comments"},{"include":"#storage_types"},{"include":"#operators"},{"include":"#vararg_ellipses"},{"begin":"(?!(?:while|for|do|if|else|switch|catch|enumerate|return|typeid|alignof|alignas|sizeof|[cr]?iterate|and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq|alignof|alignas)\\\\s*\\\\()((?:[A-Z_a-z][0-9A-Z_a-z]*+|::)++|(?<=operator)(?:[-!\\\\&*+<=>]+|\\\\(\\\\)|\\\\[]))\\\\s*(\\\\()","beginCaptures":{"1":{"name":"entity.name.function.c"},"2":{"name":"punctuation.section.parameters.begin.bracket.round.c"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.section.parameters.end.bracket.round.c"}},"name":"meta.function.definition.parameters.c","patterns":[{"include":"#probably_a_parameter"},{"include":"#function-innards"}]},{"begin":"\\\\(","beginCaptures":{"0":{"name":"punctuation.section.parens.begin.bracket.round.c"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.section.parens.end.bracket.round.c"}},"patterns":[{"include":"#function-innards"}]},{"include":"$self"}]},"inline_comment":{"patterns":[{"patterns":[{"captures":{"1":{"name":"comment.block.c punctuation.definition.comment.begin.c"},"2":{"name":"comment.block.c"},"3":{"patterns":[{"match":"\\\\*/","name":"comment.block.c punctuation.definition.comment.end.c"},{"match":"\\\\*","name":"comment.block.c"}]}},"match":"(/\\\\*)((?>(?:[^*]|(?>\\\\*+)[^/])*)((?>\\\\*+)/))"},{"captures":{"1":{"name":"comment.block.c punctuation.definition.comment.begin.c"},"2":{"name":"comment.block.c"},"3":{"patterns":[{"match":"\\\\*/","name":"comment.block.c punctuation.definition.comment.end.c"},{"match":"\\\\*","name":"comment.block.c"}]}},"match":"(/\\\\*)((?:[^*]|\\\\*++[^/])*+(\\\\*++/))"}]},{"captures":{"1":{"name":"comment.block.c punctuation.definition.comment.begin.c"},"2":{"name":"comment.block.c"},"3":{"patterns":[{"match":"\\\\*/","name":"comment.block.c punctuation.definition.comment.end.c"},{"match":"\\\\*","name":"comment.block.c"}]}},"match":"(/\\\\*)((?:[^*]|\\\\*++[^/])*+(\\\\*++/))"}]},"line_comment":{"patterns":[{"begin":"\\\\s*+(//)","beginCaptures":{"1":{"name":"punctuation.definition.comment.c"}},"end":"(?<=\\\\n)(?<!\\\\\\\\\\\\n)","endCaptures":{},"name":"comment.line.double-slash.c","patterns":[{"include":"#line_continuation_character"}]},{"begin":"\\\\s*+(//)","beginCaptures":{"1":{"name":"punctuation.definition.comment.c"}},"end":"(?<=\\\\n)(?<!\\\\\\\\\\\\n)","endCaptures":{},"name":"comment.line.double-slash.c","patterns":[{"include":"#line_continuation_character"}]}]},"line_continuation_character":{"patterns":[{"captures":{"1":{"name":"constant.character.escape.line-continuation.c"}},"match":"(\\\\\\\\)\\\\n"}]},"member_access":{"captures":{"1":{"name":"variable.other.object.access.c"},"2":{"name":"punctuation.separator.dot-access.c"},"3":{"name":"punctuation.separator.pointer-access.c"},"4":{"patterns":[{"include":"#member_access"},{"include":"#method_access"},{"captures":{"1":{"name":"variable.other.object.access.c"},"2":{"name":"punctuation.separator.dot-access.c"},"3":{"name":"punctuation.separator.pointer-access.c"}},"match":"((?:[A-Z_a-z]\\\\w*|(?<=[])]))\\\\s*)(?:(\\\\.\\\\*?)|(->\\\\*?))"}]},"5":{"name":"variable.other.member.c"}},"match":"((?:[A-Z_a-z]\\\\w*|(?<=[])]))\\\\s*)(?:(\\\\.\\\\*?)|(->\\\\*?))((?:[A-Z_a-z]\\\\w*\\\\s*(?:\\\\.\\\\*?|->\\\\*?)\\\\s*)*)\\\\s*\\\\b((?!(?:atomic_uint_least64_t|atomic_uint_least16_t|atomic_uint_least32_t|atomic_uint_least8_t|atomic_int_least16_t|atomic_uint_fast64_t|atomic_uint_fast32_t|atomic_int_least64_t|atomic_int_least32_t|pthread_rwlockattr_t|atomic_uint_fast16_t|pthread_mutexattr_t|atomic_int_fast16_t|atomic_uint_fast8_t|atomic_int_fast64_t|atomic_int_least8_t|atomic_int_fast32_t|atomic_int_fast8_t|pthread_condattr_t|atomic_uintptr_t|atomic_ptrdiff_t|pthread_rwlock_t|atomic_uintmax_t|pthread_mutex_t|atomic_intmax_t|atomic_intptr_t|atomic_char32_t|atomic_char16_t|pthread_attr_t|atomic_wchar_t|uint_least64_t|uint_least32_t|uint_least16_t|pthread_cond_t|pthread_once_t|uint_fast64_t|uint_fast16_t|atomic_size_t|uint_least8_t|int_least64_t|int_least32_t|int_least16_t|pthread_key_t|atomic_ullong|atomic_ushort|uint_fast32_t|atomic_schar|atomic_short|uint_fast8_t|int_fast64_t|int_fast32_t|int_fast16_t|atomic_ulong|atomic_llong|int_least8_t|atomic_uchar|memory_order|suseconds_t|int_fast8_t|atomic_bool|atomic_char|atomic_uint|atomic_long|atomic_int|useconds_t|_Imaginary|blksize_t|pthread_t|in_addr_t|uintptr_t|in_port_t|uintmax_t|blkcnt_t|uint16_t|unsigned|_Complex|uint32_t|intptr_t|intmax_t|uint64_t|u_quad_t|int64_t|int32_t|ssize_t|caddr_t|clock_t|uint8_t|u_short|swblk_t|segsz_t|int16_t|fixpt_t|daddr_t|nlink_t|qaddr_t|size_t|time_t|mode_t|signed|quad_t|ushort|u_long|u_char|double|int8_t|ino_t|uid_t|pid_t|_Bool|float|dev_t|div_t|short|gid_t|off_t|u_int|key_t|id_t|uint|long|void|char|bool|id_t|int)\\\\b)[A-Z_a-z]\\\\w*\\\\b(?!\\\\())"},"method_access":{"begin":"((?:[A-Z_a-z]\\\\w*|(?<=[])]))\\\\s*)(?:(\\\\.\\\\*?)|(->\\\\*?))((?:[A-Z_a-z]\\\\w*\\\\s*(?:\\\\.\\\\*?|->\\\\*?)\\\\s*)*)\\\\s*([A-Z_a-z]\\\\w*)(\\\\()","beginCaptures":{"1":{"name":"variable.other.object.access.c"},"2":{"name":"punctuation.separator.dot-access.c"},"3":{"name":"punctuation.separator.pointer-access.c"},"4":{"patterns":[{"include":"#member_access"},{"include":"#method_access"},{"captures":{"1":{"name":"variable.other.object.access.c"},"2":{"name":"punctuation.separator.dot-access.c"},"3":{"name":"punctuation.separator.pointer-access.c"}},"match":"((?:[A-Z_a-z]\\\\w*|(?<=[])]))\\\\s*)(?:(\\\\.\\\\*?)|(->\\\\*?))"}]},"5":{"name":"entity.name.function.member.c"},"6":{"name":"punctuation.section.arguments.begin.bracket.round.function.member.c"}},"contentName":"meta.function-call.member.c","end":"(\\\\))","endCaptures":{"1":{"name":"punctuation.section.arguments.end.bracket.round.function.member.c"}},"patterns":[{"include":"#function-call-innards"}]},"numbers":{"captures":{"0":{"patterns":[{"begin":"(?=.)","end":"$","patterns":[{"captures":{"1":{"name":"keyword.other.unit.hexadecimal.c"},"2":{"name":"constant.numeric.hexadecimal.c","patterns":[{"match":"(?<=\\\\h)'(?=\\\\h)","name":"punctuation.separator.constant.numeric"}]},"3":{"name":"punctuation.separator.constant.numeric"},"4":{"name":"constant.numeric.hexadecimal.c"},"5":{"name":"constant.numeric.hexadecimal.c","patterns":[{"match":"(?<=\\\\h)'(?=\\\\h)","name":"punctuation.separator.constant.numeric"}]},"6":{"name":"punctuation.separator.constant.numeric"},"8":{"name":"keyword.other.unit.exponent.hexadecimal.c"},"9":{"name":"keyword.operator.plus.exponent.hexadecimal.c"},"10":{"name":"keyword.operator.minus.exponent.hexadecimal.c"},"11":{"name":"constant.numeric.exponent.hexadecimal.c","patterns":[{"match":"(?<=\\\\h)'(?=\\\\h)","name":"punctuation.separator.constant.numeric"}]},"12":{"name":"keyword.other.unit.suffix.floating-point.c"}},"match":"\\\\G(0[Xx])(\\\\h(?:\\\\h|((?<=\\\\h)'(?=\\\\h)))*)?((?<=\\\\h)\\\\.|\\\\.(?=\\\\h))(\\\\h(?:\\\\h|((?<=\\\\h)'(?=\\\\h)))*)?((?<!')([Pp])(\\\\+?)(-?)([0-9](?:[0-9]|(?<=\\\\h)'(?=\\\\h))*))?([FLfl](?!\\\\w))?$"},{"captures":{"2":{"name":"constant.numeric.decimal.c","patterns":[{"match":"(?<=\\\\h)'(?=\\\\h)","name":"punctuation.separator.constant.numeric"}]},"3":{"name":"punctuation.separator.constant.numeric"},"4":{"name":"constant.numeric.decimal.point.c"},"5":{"name":"constant.numeric.decimal.c","patterns":[{"match":"(?<=\\\\h)'(?=\\\\h)","name":"punctuation.separator.constant.numeric"}]},"6":{"name":"punctuation.separator.constant.numeric"},"8":{"name":"keyword.other.unit.exponent.decimal.c"},"9":{"name":"keyword.operator.plus.exponent.decimal.c"},"10":{"name":"keyword.operator.minus.exponent.decimal.c"},"11":{"name":"constant.numeric.exponent.decimal.c","patterns":[{"match":"(?<=\\\\h)'(?=\\\\h)","name":"punctuation.separator.constant.numeric"}]},"12":{"name":"keyword.other.unit.suffix.floating-point.c"}},"match":"\\\\G((?=[.0-9])(?!0[BXbx]))([0-9](?:[0-9]|((?<=\\\\h)'(?=\\\\h)))*)?((?<=[0-9])\\\\.|\\\\.(?=[0-9]))([0-9](?:[0-9]|((?<=\\\\h)'(?=\\\\h)))*)?((?<!')([Ee])(\\\\+?)(-?)([0-9](?:[0-9]|(?<=\\\\h)'(?=\\\\h))*))?([FLfl](?!\\\\w))?$"},{"captures":{"1":{"name":"keyword.other.unit.binary.c"},"2":{"name":"constant.numeric.binary.c","patterns":[{"match":"(?<=\\\\h)'(?=\\\\h)","name":"punctuation.separator.constant.numeric"}]},"3":{"name":"punctuation.separator.constant.numeric"},"4":{"name":"keyword.other.unit.suffix.integer.c"}},"match":"\\\\G(0[Bb])([01](?:[01]|((?<=\\\\h)'(?=\\\\h)))*)((?:(?:(?:(?:(?:[Uu]|[Uu]ll?)|[Uu]LL?)|ll?[Uu]?)|LL?[Uu]?)|[Ff])(?!\\\\w))?$"},{"captures":{"1":{"name":"keyword.other.unit.octal.c"},"2":{"name":"constant.numeric.octal.c","patterns":[{"match":"(?<=\\\\h)'(?=\\\\h)","name":"punctuation.separator.constant.numeric"}]},"3":{"name":"punctuation.separator.constant.numeric"},"4":{"name":"keyword.other.unit.suffix.integer.c"}},"match":"\\\\G(0)((?:[0-7]|((?<=\\\\h)'(?=\\\\h)))+)((?:(?:(?:(?:(?:[Uu]|[Uu]ll?)|[Uu]LL?)|ll?[Uu]?)|LL?[Uu]?)|[Ff])(?!\\\\w))?$"},{"captures":{"1":{"name":"keyword.other.unit.hexadecimal.c"},"2":{"name":"constant.numeric.hexadecimal.c","patterns":[{"match":"(?<=\\\\h)'(?=\\\\h)","name":"punctuation.separator.constant.numeric"}]},"3":{"name":"punctuation.separator.constant.numeric"},"5":{"name":"keyword.other.unit.exponent.hexadecimal.c"},"6":{"name":"keyword.operator.plus.exponent.hexadecimal.c"},"7":{"name":"keyword.operator.minus.exponent.hexadecimal.c"},"8":{"name":"constant.numeric.exponent.hexadecimal.c","patterns":[{"match":"(?<=\\\\h)'(?=\\\\h)","name":"punctuation.separator.constant.numeric"}]},"9":{"name":"keyword.other.unit.suffix.integer.c"}},"match":"\\\\G(0[Xx])(\\\\h(?:\\\\h|((?<=\\\\h)'(?=\\\\h)))*)((?<!')([Pp])(\\\\+?)(-?)([0-9](?:[0-9]|(?<=\\\\h)'(?=\\\\h))*))?((?:(?:(?:(?:(?:[Uu]|[Uu]ll?)|[Uu]LL?)|ll?[Uu]?)|LL?[Uu]?)|[Ff])(?!\\\\w))?$"},{"captures":{"2":{"name":"constant.numeric.decimal.c","patterns":[{"match":"(?<=\\\\h)'(?=\\\\h)","name":"punctuation.separator.constant.numeric"}]},"3":{"name":"punctuation.separator.constant.numeric"},"5":{"name":"keyword.other.unit.exponent.decimal.c"},"6":{"name":"keyword.operator.plus.exponent.decimal.c"},"7":{"name":"keyword.operator.minus.exponent.decimal.c"},"8":{"name":"constant.numeric.exponent.decimal.c","patterns":[{"match":"(?<=\\\\h)'(?=\\\\h)","name":"punctuation.separator.constant.numeric"}]},"9":{"name":"keyword.other.unit.suffix.integer.c"}},"match":"\\\\G((?=[.0-9])(?!0[BXbx]))([0-9](?:[0-9]|((?<=\\\\h)'(?=\\\\h)))*)((?<!')([Ee])(\\\\+?)(-?)([0-9](?:[0-9]|(?<=\\\\h)'(?=\\\\h))*))?((?:(?:(?:(?:(?:[Uu]|[Uu]ll?)|[Uu]LL?)|ll?[Uu]?)|LL?[Uu]?)|[Ff])(?!\\\\w))?$"},{"match":"(?:['.0-9A-Z_a-z]|(?<=[EPep])[-+])+","name":"invalid.illegal.constant.numeric"}]}]}},"match":"(?<!\\\\w)\\\\.?\\\\d(?:['.0-9A-Z_a-z]|(?<=[EPep])[-+])*"},"operators":{"patterns":[{"match":"(?<![$\\\\w])(sizeof)(?![$\\\\w])","name":"keyword.operator.sizeof.c"},{"match":"--","name":"keyword.operator.decrement.c"},{"match":"\\\\+\\\\+","name":"keyword.operator.increment.c"},{"match":"(?:[-%*+]|(?<!\\\\()/)=","name":"keyword.operator.assignment.compound.c"},{"match":"(?:[\\\\&^]|<<|>>|\\\\|)=","name":"keyword.operator.assignment.compound.bitwise.c"},{"match":"<<|>>","name":"keyword.operator.bitwise.shift.c"},{"match":"!=|<=|>=|==|[<>]","name":"keyword.operator.comparison.c"},{"match":"&&|!|\\\\|\\\\|","name":"keyword.operator.logical.c"},{"match":"[\\\\&^|~]","name":"keyword.operator.c"},{"match":"=","name":"keyword.operator.assignment.c"},{"match":"[-%*+/]","name":"keyword.operator.c"},{"begin":"(\\\\?)","beginCaptures":{"1":{"name":"keyword.operator.ternary.c"}},"end":"(:)","endCaptures":{"1":{"name":"keyword.operator.ternary.c"}},"patterns":[{"include":"#function-call-innards"},{"include":"$self"}]}]},"parens":{"begin":"\\\\(","beginCaptures":{"0":{"name":"punctuation.section.parens.begin.bracket.round.c"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.section.parens.end.bracket.round.c"}},"name":"meta.parens.c","patterns":[{"include":"$self"}]},"parens-block":{"begin":"\\\\(","beginCaptures":{"0":{"name":"punctuation.section.parens.begin.bracket.round.c"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.section.parens.end.bracket.round.c"}},"name":"meta.parens.block.c","patterns":[{"include":"#block_innards"},{"match":"(?-im:(?<!:):(?!:))","name":"punctuation.range-based.c"}]},"pragma-mark":{"captures":{"1":{"name":"meta.preprocessor.pragma.c"},"2":{"name":"keyword.control.directive.pragma.pragma-mark.c"},"3":{"name":"punctuation.definition.directive.c"},"4":{"name":"entity.name.tag.pragma-mark.c"}},"match":"^\\\\s*(((#)\\\\s*pragma\\\\s+mark)\\\\s+(.*))","name":"meta.section.c"},"predefined_macros":{"patterns":[{"captures":{"1":{"name":"entity.name.other.preprocessor.macro.predefined.$1.c"}},"match":"\\\\b(__cplusplus|__DATE__|__FILE__|__LINE__|__STDC__|__STDC_HOSTED__|__STDC_NO_COMPLEX__|__STDC_VERSION__|__STDCPP_THREADS__|__TIME__|NDEBUG|__OBJC__|__ASSEMBLER__|__ATOM__|__AVX__|__AVX2__|_CHAR_UNSIGNED|__CLR_VER|_CONTROL_FLOW_GUARD|__COUNTER__|__cplusplus_cli|__cplusplus_winrt|_CPPRTTI|_CPPUNWIND|_DEBUG|_DLL|__FUNCDNAME__|__FUNCSIG__|__FUNCTION__|_INTEGRAL_MAX_BITS|__INTELLISENSE__|_ISO_VOLATILE|_KERNEL_MODE|_M_AMD64|_M_ARM|_M_ARM_ARMV7VE|_M_ARM_FP|_M_ARM64|_M_CEE|_M_CEE_PURE|_M_CEE_SAFE|_M_FP_EXCEPT|_M_FP_FAST|_M_FP_PRECISE|_M_FP_STRICT|_M_IX86|_M_IX86_FP|_M_X64|_MANAGED|_MSC_BUILD|_MSC_EXTENSIONS|_MSC_FULL_VER|_MSC_VER|_MSVC_LANG|__MSVC_RUNTIME_CHECKS|_MT|_NATIVE_WCHAR_T_DEFINED|_OPENMP|_PREFAST|__TIMESTAMP__|_VC_NO_DEFAULTLIB|_WCHAR_T_DEFINED|_WIN32|_WIN64|_WINRT_DLL|_ATL_VER|_MFC_VER|__GFORTRAN__|__GNUC__|__GNUC_MINOR__|__GNUC_PATCHLEVEL__|__GNUG__|__STRICT_ANSI__|__BASE_FILE__|__INCLUDE_LEVEL__|__ELF__|__VERSION__|__OPTIMIZE__|__OPTIMIZE_SIZE__|__NO_INLINE__|__GNUC_STDC_INLINE__|__CHAR_UNSIGNED__|__WCHAR_UNSIGNED__|__REGISTER_PREFIX__|__SIZE_TYPE__|__PTRDIFF_TYPE__|__WCHAR_TYPE__|__WINT_TYPE__|__INTMAX_TYPE__|__UINTMAX_TYPE__|__SIG_ATOMIC_TYPE__|__INT8_TYPE__|__INT16_TYPE__|__INT32_TYPE__|__INT64_TYPE__|__UINT8_TYPE__|__UINT16_TYPE__|__UINT32_TYPE__|__UINT64_TYPE__|__INT_LEAST8_TYPE__|__INT_LEAST16_TYPE__|__INT_LEAST32_TYPE__|__INT_LEAST64_TYPE__|__UINT_LEAST8_TYPE__|__UINT_LEAST16_TYPE__|__UINT_LEAST32_TYPE__|__UINT_LEAST64_TYPE__|__INT_FAST8_TYPE__|__INT_FAST16_TYPE__|__INT_FAST32_TYPE__|__INT_FAST64_TYPE__|__UINT_FAST8_TYPE__|__UINT_FAST16_TYPE__|__UINT_FAST32_TYPE__|__UINT_FAST64_TYPE__|__INTPTR_TYPE__|__UINTPTR_TYPE__|__CHAR_BIT__|__SCHAR_MAX__|__WCHAR_MAX__|__SHRT_MAX__|__INT_MAX__|__LONG_MAX__|__LONG_LONG_MAX__|__WINT_MAX__|__SIZE_MAX__|__PTRDIFF_MAX__|__INTMAX_MAX__|__UINTMAX_MAX__|__SIG_ATOMIC_MAX__|__INT8_MAX__|__INT16_MAX__|__INT32_MAX__|__INT64_MAX__|__UINT8_MAX__|__UINT16_MAX__|__UINT32_MAX__|__UINT64_MAX__|__INT_LEAST8_MAX__|__INT_LEAST16_MAX__|__INT_LEAST32_MAX__|__INT_LEAST64_MAX__|__UINT_LEAST8_MAX__|__UINT_LEAST16_MAX__|__UINT_LEAST32_MAX__|__UINT_LEAST64_MAX__|__INT_FAST8_MAX__|__INT_FAST16_MAX__|__INT_FAST32_MAX__|__INT_FAST64_MAX__|__UINT_FAST8_MAX__|__UINT_FAST16_MAX__|__UINT_FAST32_MAX__|__UINT_FAST64_MAX__|__INTPTR_MAX__|__UINTPTR_MAX__|__WCHAR_MIN__|__WINT_MIN__|__SIG_ATOMIC_MIN__|__SCHAR_WIDTH__|__SHRT_WIDTH__|__INT_WIDTH__|__LONG_WIDTH__|__LONG_LONG_WIDTH__|__PTRDIFF_WIDTH__|__SIG_ATOMIC_WIDTH__|__SIZE_WIDTH__|__WCHAR_WIDTH__|__WINT_WIDTH__|__INT_LEAST8_WIDTH__|__INT_LEAST16_WIDTH__|__INT_LEAST32_WIDTH__|__INT_LEAST64_WIDTH__|__INT_FAST8_WIDTH__|__INT_FAST16_WIDTH__|__INT_FAST32_WIDTH__|__INT_FAST64_WIDTH__|__INTPTR_WIDTH__|__INTMAX_WIDTH__|__SIZEOF_INT__|__SIZEOF_LONG__|__SIZEOF_LONG_LONG__|__SIZEOF_SHORT__|__SIZEOF_POINTER__|__SIZEOF_FLOAT__|__SIZEOF_DOUBLE__|__SIZEOF_LONG_DOUBLE__|__SIZEOF_SIZE_T__|__SIZEOF_WCHAR_T__|__SIZEOF_WINT_T__|__SIZEOF_PTRDIFF_T__|__BYTE_ORDER__|__ORDER_LITTLE_ENDIAN__|__ORDER_BIG_ENDIAN__|__ORDER_PDP_ENDIAN__|__FLOAT_WORD_ORDER__|__DEPRECATED|__EXCEPTIONS|__GXX_RTTI|__USING_SJLJ_EXCEPTIONS__|__GXX_EXPERIMENTAL_CXX0X__|__GXX_WEAK__|__NEXT_RUNTIME__|__LP64__|_LP64|__SSP__|__SSP_ALL__|__SSP_STRONG__|__SSP_EXPLICIT__|__SANITIZE_ADDRESS__|__SANITIZE_THREAD__|__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1|__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2|__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4|__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8|__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16|__HAVE_SPECULATION_SAFE_VALUE|__GCC_HAVE_DWARF2_CFI_ASM|__FP_FAST_FMAF??|__FP_FAST_FMAL|__FP_FAST_FMAF16|__FP_FAST_FMAF32|__FP_FAST_FMAF64|__FP_FAST_FMAF128|__FP_FAST_FMAF32X|__FP_FAST_FMAF64X|__FP_FAST_FMAF128X|__GCC_IEC_559|__GCC_IEC_559_COMPLEX|__NO_MATH_ERRNO__|__has_builtin|__has_feature|__has_extension|__has_cpp_attribute|__has_c_attribute|__has_attribute|__has_declspec_attribute|__is_identifier|__has_include|__has_include_next|__has_warning|__BASE_FILE__|__FILE_NAME__|__clang__|__clang_major__|__clang_minor__|__clang_patchlevel__|__clang_version__|__fp16|_Float16)\\\\b"},{"match":"\\\\b__([A-Z_]+)__\\\\b","name":"entity.name.other.preprocessor.macro.predefined.probably.$1.c"}]},"preprocessor-rule-conditional":{"patterns":[{"begin":"^\\\\s*((#)\\\\s*if(?:n?def)?)\\\\b","beginCaptures":{"0":{"name":"meta.preprocessor.c"},"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"}},"end":"^\\\\s*((#)\\\\s*endif)\\\\b","endCaptures":{"0":{"name":"meta.preprocessor.c"},"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"}},"patterns":[{"begin":"\\\\G(?=.)(?!/(?:/|\\\\*(?!.*\\\\\\\\\\\\s*\\\\n)))","end":"(?=//)|(?=/\\\\*(?!.*\\\\\\\\\\\\s*\\\\n))|(?<!\\\\\\\\)(?=\\\\n)","name":"meta.preprocessor.c","patterns":[{"include":"#preprocessor-rule-conditional-line"}]},{"include":"#preprocessor-rule-enabled-elif"},{"include":"#preprocessor-rule-enabled-else"},{"include":"#preprocessor-rule-disabled-elif"},{"begin":"^\\\\s*((#)\\\\s*elif)\\\\b","beginCaptures":{"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"}},"end":"(?=//)|(?=/\\\\*(?!.*\\\\\\\\\\\\s*\\\\n))|(?<!\\\\\\\\)(?=\\\\n)","name":"meta.preprocessor.c","patterns":[{"include":"#preprocessor-rule-conditional-line"}]},{"include":"$self"}]},{"captures":{"0":{"name":"invalid.illegal.stray-$1.c"}},"match":"^\\\\s*#\\\\s*(e(?:lse|lif|ndif))\\\\b"}]},"preprocessor-rule-conditional-block":{"patterns":[{"begin":"^\\\\s*((#)\\\\s*if(?:n?def)?)\\\\b","beginCaptures":{"0":{"name":"meta.preprocessor.c"},"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"}},"end":"^\\\\s*((#)\\\\s*endif)\\\\b","endCaptures":{"0":{"name":"meta.preprocessor.c"},"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"}},"patterns":[{"begin":"\\\\G(?=.)(?!/(?:/|\\\\*(?!.*\\\\\\\\\\\\s*\\\\n)))","end":"(?=//)|(?=/\\\\*(?!.*\\\\\\\\\\\\s*\\\\n))|(?<!\\\\\\\\)(?=\\\\n)","name":"meta.preprocessor.c","patterns":[{"include":"#preprocessor-rule-conditional-line"}]},{"include":"#preprocessor-rule-enabled-elif-block"},{"include":"#preprocessor-rule-enabled-else-block"},{"include":"#preprocessor-rule-disabled-elif"},{"begin":"^\\\\s*((#)\\\\s*elif)\\\\b","beginCaptures":{"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"}},"end":"(?=//)|(?=/\\\\*(?!.*\\\\\\\\\\\\s*\\\\n))|(?<!\\\\\\\\)(?=\\\\n)","name":"meta.preprocessor.c","patterns":[{"include":"#preprocessor-rule-conditional-line"}]},{"include":"#block_innards"}]},{"captures":{"0":{"name":"invalid.illegal.stray-$1.c"}},"match":"^\\\\s*#\\\\s*(e(?:lse|lif|ndif))\\\\b"}]},"preprocessor-rule-conditional-line":{"patterns":[{"match":"\\\\bdefined\\\\b(?:\\\\s*$|(?=\\\\s*\\\\(*\\\\s*(?!defined\\\\b)[$A-Z_a-z][$\\\\w]*\\\\b\\\\s*\\\\)*\\\\s*(?:\\\\n|//|/\\\\*|[:?]|&&|\\\\|\\\\||\\\\\\\\\\\\s*\\\\n)))","name":"keyword.control.directive.conditional.c"},{"match":"\\\\bdefined\\\\b","name":"invalid.illegal.macro-name.c"},{"include":"#comments"},{"include":"#strings"},{"include":"#numbers"},{"begin":"\\\\?","beginCaptures":{"0":{"name":"keyword.operator.ternary.c"}},"end":":","endCaptures":{"0":{"name":"keyword.operator.ternary.c"}},"patterns":[{"include":"#preprocessor-rule-conditional-line"}]},{"include":"#operators"},{"match":"\\\\b(NULL|true|false|TRUE|FALSE)\\\\b","name":"constant.language.c"},{"match":"[$A-Z_a-z][$\\\\w]*","name":"entity.name.function.preprocessor.c"},{"include":"#line_continuation_character"},{"begin":"\\\\(","beginCaptures":{"0":{"name":"punctuation.section.parens.begin.bracket.round.c"}},"end":"\\\\)|(?=//)|(?=/\\\\*(?!.*\\\\\\\\\\\\s*\\\\n))|(?<!\\\\\\\\)(?=\\\\n)","endCaptures":{"0":{"name":"punctuation.section.parens.end.bracket.round.c"}},"patterns":[{"include":"#preprocessor-rule-conditional-line"}]}]},"preprocessor-rule-define-line-blocks":{"patterns":[{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.section.block.begin.bracket.curly.c"}},"end":"}|(?=\\\\s*#\\\\s*e(?:lif|lse|ndif)\\\\b)|(?<!\\\\\\\\)(?=\\\\s*\\\\n)","endCaptures":{"0":{"name":"punctuation.section.block.end.bracket.curly.c"}},"patterns":[{"include":"#preprocessor-rule-define-line-blocks"},{"include":"#preprocessor-rule-define-line-contents"}]},{"include":"#preprocessor-rule-define-line-contents"}]},"preprocessor-rule-define-line-contents":{"patterns":[{"include":"#vararg_ellipses"},{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.section.block.begin.bracket.curly.c"}},"end":"}|(?=\\\\s*#\\\\s*e(?:lif|lse|ndif)\\\\b)|(?<!\\\\\\\\)(?=\\\\s*\\\\n)","endCaptures":{"0":{"name":"punctuation.section.block.end.bracket.curly.c"}},"name":"meta.block.c","patterns":[{"include":"#preprocessor-rule-define-line-blocks"}]},{"match":"\\\\(","name":"punctuation.section.parens.begin.bracket.round.c"},{"match":"\\\\)","name":"punctuation.section.parens.end.bracket.round.c"},{"begin":"(?!(?:while|for|do|if|else|switch|catch|enumerate|return|typeid|alignof|alignas|sizeof|[cr]?iterate|and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq|alignof|alignas|asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void)\\\\s*\\\\()(?=(?:[A-Z_a-z][0-9A-Z_a-z]*+|::)++\\\\s*\\\\(|(?<=operator)(?:[-!\\\\&*+<=>]+|\\\\(\\\\)|\\\\[])\\\\s*\\\\()","end":"(?<=\\\\))(?!\\\\w)|(?<!\\\\\\\\)(?=\\\\s*\\\\n)","name":"meta.function.c","patterns":[{"include":"#preprocessor-rule-define-line-functions"}]},{"begin":"\\"","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.c"}},"end":"\\"|(?<!\\\\\\\\)(?=\\\\s*\\\\n)","endCaptures":{"0":{"name":"punctuation.definition.string.end.c"}},"name":"string.quoted.double.c","patterns":[{"include":"#string_escaped_char"},{"include":"#string_placeholder"},{"include":"#line_continuation_character"}]},{"begin":"'","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.c"}},"end":"'|(?<!\\\\\\\\)(?=\\\\s*\\\\n)","endCaptures":{"0":{"name":"punctuation.definition.string.end.c"}},"name":"string.quoted.single.c","patterns":[{"include":"#string_escaped_char"},{"include":"#line_continuation_character"}]},{"include":"#method_access"},{"include":"#member_access"},{"include":"$self"}]},"preprocessor-rule-define-line-functions":{"patterns":[{"include":"#comments"},{"include":"#storage_types"},{"include":"#vararg_ellipses"},{"include":"#method_access"},{"include":"#member_access"},{"include":"#operators"},{"begin":"(?!(?:while|for|do|if|else|switch|catch|enumerate|return|typeid|alignof|alignas|sizeof|[cr]?iterate|and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq|alignof|alignas)\\\\s*\\\\()((?:[A-Z_a-z][0-9A-Z_a-z]*+|::)++|(?<=operator)(?:[-!\\\\&*+<=>]+|\\\\(\\\\)|\\\\[]))\\\\s*(\\\\()","beginCaptures":{"1":{"name":"entity.name.function.c"},"2":{"name":"punctuation.section.arguments.begin.bracket.round.c"}},"end":"(\\\\))|(?<!\\\\\\\\)(?=\\\\s*\\\\n)","endCaptures":{"1":{"name":"punctuation.section.arguments.end.bracket.round.c"}},"patterns":[{"include":"#preprocessor-rule-define-line-functions"}]},{"begin":"\\\\(","beginCaptures":{"0":{"name":"punctuation.section.parens.begin.bracket.round.c"}},"end":"(\\\\))|(?<!\\\\\\\\)(?=\\\\s*\\\\n)","endCaptures":{"1":{"name":"punctuation.section.parens.end.bracket.round.c"}},"patterns":[{"include":"#preprocessor-rule-define-line-functions"}]},{"include":"#preprocessor-rule-define-line-contents"}]},"preprocessor-rule-disabled":{"patterns":[{"begin":"^\\\\s*((#)\\\\s*if)\\\\b(?=\\\\s*\\\\(*\\\\b0+\\\\b\\\\)*\\\\s*(?:$|//|/\\\\*))","beginCaptures":{"0":{"name":"meta.preprocessor.c"},"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"}},"end":"^\\\\s*((#)\\\\s*endif)\\\\b","endCaptures":{"0":{"name":"meta.preprocessor.c"},"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"}},"patterns":[{"begin":"\\\\G(?=.)(?!/(?:/|\\\\*(?!.*\\\\\\\\\\\\s*\\\\n)))","end":"(?=//)|(?=/\\\\*(?!.*\\\\\\\\\\\\s*\\\\n))|(?=\\\\n)","name":"meta.preprocessor.c","patterns":[{"include":"#preprocessor-rule-conditional-line"}]},{"include":"#comments"},{"include":"#preprocessor-rule-enabled-elif"},{"include":"#preprocessor-rule-enabled-else"},{"include":"#preprocessor-rule-disabled-elif"},{"begin":"^\\\\s*((#)\\\\s*elif)\\\\b","beginCaptures":{"0":{"name":"meta.preprocessor.c"},"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"}},"end":"(?=^\\\\s*((#)\\\\s*e(?:lif|lse|ndif))\\\\b)","patterns":[{"begin":"\\\\G(?=.)(?!/(?:/|\\\\*(?!.*\\\\\\\\\\\\s*\\\\n)))","end":"(?=//)|(?=/\\\\*(?!.*\\\\\\\\\\\\s*\\\\n))|(?<!\\\\\\\\)(?=\\\\n)","name":"meta.preprocessor.c","patterns":[{"include":"#preprocessor-rule-conditional-line"}]},{"include":"$self"}]},{"begin":"\\\\n","contentName":"comment.block.preprocessor.if-branch.c","end":"(?=^\\\\s*((#)\\\\s*e(?:lse|lif|ndif))\\\\b)","patterns":[{"include":"#disabled"},{"include":"#pragma-mark"}]}]}]},"preprocessor-rule-disabled-block":{"patterns":[{"begin":"^\\\\s*((#)\\\\s*if)\\\\b(?=\\\\s*\\\\(*\\\\b0+\\\\b\\\\)*\\\\s*(?:$|//|/\\\\*))","beginCaptures":{"0":{"name":"meta.preprocessor.c"},"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"}},"end":"^\\\\s*((#)\\\\s*endif)\\\\b","endCaptures":{"0":{"name":"meta.preprocessor.c"},"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"}},"patterns":[{"begin":"\\\\G(?=.)(?!/(?:/|\\\\*(?!.*\\\\\\\\\\\\s*\\\\n)))","end":"(?=//)|(?=/\\\\*(?!.*\\\\\\\\\\\\s*\\\\n))|(?=\\\\n)","name":"meta.preprocessor.c","patterns":[{"include":"#preprocessor-rule-conditional-line"}]},{"include":"#comments"},{"include":"#preprocessor-rule-enabled-elif-block"},{"include":"#preprocessor-rule-enabled-else-block"},{"include":"#preprocessor-rule-disabled-elif"},{"begin":"^\\\\s*((#)\\\\s*elif)\\\\b","beginCaptures":{"0":{"name":"meta.preprocessor.c"},"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"}},"end":"(?=^\\\\s*((#)\\\\s*e(?:lif|lse|ndif))\\\\b)","patterns":[{"begin":"\\\\G(?=.)(?!/(?:/|\\\\*(?!.*\\\\\\\\\\\\s*\\\\n)))","end":"(?=//)|(?=/\\\\*(?!.*\\\\\\\\\\\\s*\\\\n))|(?<!\\\\\\\\)(?=\\\\n)","name":"meta.preprocessor.c","patterns":[{"include":"#preprocessor-rule-conditional-line"}]},{"include":"#block_innards"}]},{"begin":"\\\\n","contentName":"comment.block.preprocessor.if-branch.in-block.c","end":"(?=^\\\\s*((#)\\\\s*e(?:lse|lif|ndif))\\\\b)","patterns":[{"include":"#disabled"},{"include":"#pragma-mark"}]}]}]},"preprocessor-rule-disabled-elif":{"begin":"^\\\\s*((#)\\\\s*elif)\\\\b(?=\\\\s*\\\\(*\\\\b0+\\\\b\\\\)*\\\\s*(?:$|//|/\\\\*))","beginCaptures":{"0":{"name":"meta.preprocessor.c"},"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"}},"end":"(?=^\\\\s*((#)\\\\s*e(?:lif|lse|ndif))\\\\b)","patterns":[{"begin":"\\\\G(?=.)(?!/(?:/|\\\\*(?!.*\\\\\\\\\\\\s*\\\\n)))","end":"(?=//)|(?=/\\\\*(?!.*\\\\\\\\\\\\s*\\\\n))|(?<!\\\\\\\\)(?=\\\\n)","name":"meta.preprocessor.c","patterns":[{"include":"#preprocessor-rule-conditional-line"}]},{"include":"#comments"},{"begin":"\\\\n","contentName":"comment.block.preprocessor.elif-branch.c","end":"(?=^\\\\s*((#)\\\\s*e(?:lse|lif|ndif))\\\\b)","patterns":[{"include":"#disabled"},{"include":"#pragma-mark"}]}]},"preprocessor-rule-enabled":{"patterns":[{"begin":"^\\\\s*((#)\\\\s*if)\\\\b(?=\\\\s*\\\\(*\\\\b0*1\\\\b\\\\)*\\\\s*(?:$|//|/\\\\*))","beginCaptures":{"0":{"name":"meta.preprocessor.c"},"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"},"3":{"name":"constant.numeric.preprocessor.c"}},"end":"^\\\\s*((#)\\\\s*endif)\\\\b","endCaptures":{"0":{"name":"meta.preprocessor.c"},"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"}},"patterns":[{"begin":"\\\\G(?=.)(?!/(?:/|\\\\*(?!.*\\\\\\\\\\\\s*\\\\n)))","end":"(?=//)|(?=/\\\\*(?!.*\\\\\\\\\\\\s*\\\\n))|(?=\\\\n)","name":"meta.preprocessor.c","patterns":[{"include":"#preprocessor-rule-conditional-line"}]},{"include":"#comments"},{"begin":"^\\\\s*((#)\\\\s*else)\\\\b","beginCaptures":{"0":{"name":"meta.preprocessor.c"},"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"}},"contentName":"comment.block.preprocessor.else-branch.c","end":"(?=^\\\\s*((#)\\\\s*endif)\\\\b)","patterns":[{"include":"#disabled"},{"include":"#pragma-mark"}]},{"begin":"^\\\\s*((#)\\\\s*elif)\\\\b","beginCaptures":{"0":{"name":"meta.preprocessor.c"},"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"}},"contentName":"comment.block.preprocessor.if-branch.c","end":"(?=^\\\\s*((#)\\\\s*e(?:lse|lif|ndif))\\\\b)","patterns":[{"include":"#disabled"},{"include":"#pragma-mark"}]},{"begin":"\\\\n","end":"(?=^\\\\s*((#)\\\\s*e(?:lse|lif|ndif))\\\\b)","patterns":[{"include":"$self"}]}]}]},"preprocessor-rule-enabled-block":{"patterns":[{"begin":"^\\\\s*((#)\\\\s*if)\\\\b(?=\\\\s*\\\\(*\\\\b0*1\\\\b\\\\)*\\\\s*(?:$|//|/\\\\*))","beginCaptures":{"0":{"name":"meta.preprocessor.c"},"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"}},"end":"^\\\\s*((#)\\\\s*endif)\\\\b","endCaptures":{"0":{"name":"meta.preprocessor.c"},"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"}},"patterns":[{"begin":"\\\\G(?=.)(?!/(?:/|\\\\*(?!.*\\\\\\\\\\\\s*\\\\n)))","end":"(?=//)|(?=/\\\\*(?!.*\\\\\\\\\\\\s*\\\\n))|(?=\\\\n)","name":"meta.preprocessor.c","patterns":[{"include":"#preprocessor-rule-conditional-line"}]},{"include":"#comments"},{"begin":"^\\\\s*((#)\\\\s*else)\\\\b","beginCaptures":{"0":{"name":"meta.preprocessor.c"},"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"}},"contentName":"comment.block.preprocessor.else-branch.in-block.c","end":"(?=^\\\\s*((#)\\\\s*endif)\\\\b)","patterns":[{"include":"#disabled"},{"include":"#pragma-mark"}]},{"begin":"^\\\\s*((#)\\\\s*elif)\\\\b","beginCaptures":{"0":{"name":"meta.preprocessor.c"},"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"}},"contentName":"comment.block.preprocessor.if-branch.in-block.c","end":"(?=^\\\\s*((#)\\\\s*e(?:lse|lif|ndif))\\\\b)","patterns":[{"include":"#disabled"},{"include":"#pragma-mark"}]},{"begin":"\\\\n","end":"(?=^\\\\s*((#)\\\\s*e(?:lse|lif|ndif))\\\\b)","patterns":[{"include":"#block_innards"}]}]}]},"preprocessor-rule-enabled-elif":{"begin":"^\\\\s*((#)\\\\s*elif)\\\\b(?=\\\\s*\\\\(*\\\\b0*1\\\\b\\\\)*\\\\s*(?:$|//|/\\\\*))","beginCaptures":{"0":{"name":"meta.preprocessor.c"},"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"}},"end":"(?=^\\\\s*((#)\\\\s*endif)\\\\b)","patterns":[{"begin":"\\\\G(?=.)(?!/(?:/|\\\\*(?!.*\\\\\\\\\\\\s*\\\\n)))","end":"(?=//)|(?=/\\\\*(?!.*\\\\\\\\\\\\s*\\\\n))|(?<!\\\\\\\\)(?=\\\\n)","name":"meta.preprocessor.c","patterns":[{"include":"#preprocessor-rule-conditional-line"}]},{"include":"#comments"},{"begin":"\\\\n","end":"(?=^\\\\s*((#)\\\\s*endif)\\\\b)","patterns":[{"begin":"^\\\\s*((#)\\\\s*(else))\\\\b","beginCaptures":{"0":{"name":"meta.preprocessor.c"},"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"}},"contentName":"comment.block.preprocessor.elif-branch.c","end":"(?=^\\\\s*((#)\\\\s*endif)\\\\b)","patterns":[{"include":"#disabled"},{"include":"#pragma-mark"}]},{"begin":"^\\\\s*((#)\\\\s*(elif))\\\\b","beginCaptures":{"0":{"name":"meta.preprocessor.c"},"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"}},"contentName":"comment.block.preprocessor.elif-branch.c","end":"(?=^\\\\s*((#)\\\\s*e(?:lse|lif|ndif))\\\\b)","patterns":[{"include":"#disabled"},{"include":"#pragma-mark"}]},{"include":"$self"}]}]},"preprocessor-rule-enabled-elif-block":{"begin":"^\\\\s*((#)\\\\s*elif)\\\\b(?=\\\\s*\\\\(*\\\\b0*1\\\\b\\\\)*\\\\s*(?:$|//|/\\\\*))","beginCaptures":{"0":{"name":"meta.preprocessor.c"},"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"}},"end":"(?=^\\\\s*((#)\\\\s*endif)\\\\b)","patterns":[{"begin":"\\\\G(?=.)(?!/(?:/|\\\\*(?!.*\\\\\\\\\\\\s*\\\\n)))","end":"(?=//)|(?=/\\\\*(?!.*\\\\\\\\\\\\s*\\\\n))|(?<!\\\\\\\\)(?=\\\\n)","name":"meta.preprocessor.c","patterns":[{"include":"#preprocessor-rule-conditional-line"}]},{"include":"#comments"},{"begin":"\\\\n","end":"(?=^\\\\s*((#)\\\\s*endif)\\\\b)","patterns":[{"begin":"^\\\\s*((#)\\\\s*(else))\\\\b","beginCaptures":{"0":{"name":"meta.preprocessor.c"},"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"}},"contentName":"comment.block.preprocessor.elif-branch.in-block.c","end":"(?=^\\\\s*((#)\\\\s*endif)\\\\b)","patterns":[{"include":"#disabled"},{"include":"#pragma-mark"}]},{"begin":"^\\\\s*((#)\\\\s*(elif))\\\\b","beginCaptures":{"0":{"name":"meta.preprocessor.c"},"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"}},"contentName":"comment.block.preprocessor.elif-branch.c","end":"(?=^\\\\s*((#)\\\\s*e(?:lse|lif|ndif))\\\\b)","patterns":[{"include":"#disabled"},{"include":"#pragma-mark"}]},{"include":"#block_innards"}]}]},"preprocessor-rule-enabled-else":{"begin":"^\\\\s*((#)\\\\s*else)\\\\b","beginCaptures":{"0":{"name":"meta.preprocessor.c"},"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"}},"end":"(?=^\\\\s*((#)\\\\s*endif)\\\\b)","patterns":[{"include":"$self"}]},"preprocessor-rule-enabled-else-block":{"begin":"^\\\\s*((#)\\\\s*else)\\\\b","beginCaptures":{"0":{"name":"meta.preprocessor.c"},"1":{"name":"keyword.control.directive.conditional.c"},"2":{"name":"punctuation.definition.directive.c"}},"end":"(?=^\\\\s*((#)\\\\s*endif)\\\\b)","patterns":[{"include":"#block_innards"}]},"probably_a_parameter":{"captures":{"1":{"name":"variable.parameter.probably.c"}},"match":"(?<=[0-9A-Z_a-z] |[]\\\\&)*>])\\\\s*([A-Z_a-z]\\\\w*)\\\\s*(?=(?:\\\\[]\\\\s*)?[),])"},"static_assert":{"begin":"((?>(?:(?>(?<!\\\\s)\\\\s+)|(/\\\\*)((?>(?:[^*]|(?>\\\\*+)[^/])*)((?>\\\\*+)/)))+|(?:(?:(?:(?:\\\\b|(?<=\\\\W))|(?=\\\\W))|\\\\A)|\\\\Z)))((?<!\\\\w)static_assert|_Static_assert(?!\\\\w))((?>(?:(?>(?<!\\\\s)\\\\s+)|(/\\\\*)((?>(?:[^*]|(?>\\\\*+)[^/])*)((?>\\\\*+)/)))+|(?:(?:(?:(?:\\\\b|(?<=\\\\W))|(?=\\\\W))|\\\\A)|\\\\Z)))(\\\\()","beginCaptures":{"1":{"patterns":[{"include":"#inline_comment"}]},"2":{"name":"comment.block.c punctuation.definition.comment.begin.c"},"3":{"name":"comment.block.c"},"4":{"patterns":[{"match":"\\\\*/","name":"comment.block.c punctuation.definition.comment.end.c"},{"match":"\\\\*","name":"comment.block.c"}]},"5":{"name":"keyword.other.static_assert.c"},"6":{"patterns":[{"include":"#inline_comment"}]},"7":{"name":"comment.block.c punctuation.definition.comment.begin.c"},"8":{"name":"comment.block.c"},"9":{"patterns":[{"match":"\\\\*/","name":"comment.block.c punctuation.definition.comment.end.c"},{"match":"\\\\*","name":"comment.block.c"}]},"10":{"name":"punctuation.section.arguments.begin.bracket.round.static_assert.c"}},"end":"(\\\\))","endCaptures":{"1":{"name":"punctuation.section.arguments.end.bracket.round.static_assert.c"}},"patterns":[{"begin":"(,)\\\\s*(?=(?:L|u8?|U\\\\s*\\")?)","beginCaptures":{"1":{"name":"punctuation.separator.delimiter.comma.c"}},"end":"(?=\\\\))","name":"meta.static_assert.message.c","patterns":[{"include":"#string_context"}]},{"include":"#evaluation_context"}]},"storage_types":{"patterns":[{"match":"(?-im:(?<!\\\\w)(?:unsigned|signed|double|_Bool|short|float|long|void|char|bool|int)(?!\\\\w))","name":"storage.type.built-in.primitive.c"},{"match":"(?-im:(?<!\\\\w)(?:atomic_uint_least64_t|atomic_uint_least16_t|atomic_uint_least32_t|pthread_rwlockattr_t|atomic_uint_fast64_t|atomic_uint_fast32_t|atomic_uint_fast16_t|atomic_int_least64_t|atomic_int_least32_t|atomic_int_least16_t|atomic_uint_least8_t|atomic_uint_fast8_t|atomic_int_least8_t|atomic_int_fast16_t|pthread_mutexattr_t|atomic_int_fast32_t|atomic_int_fast64_t|atomic_int_fast8_t|pthread_condattr_t|atomic_ptrdiff_t|pthread_rwlock_t|atomic_uintptr_t|atomic_uintmax_t|atomic_intmax_t|atomic_intptr_t|atomic_char32_t|atomic_char16_t|pthread_mutex_t|pthread_cond_t|atomic_wchar_t|uint_least64_t|uint_least32_t|uint_least16_t|pthread_once_t|pthread_attr_t|int_least32_t|pthread_key_t|int_least16_t|int_least64_t|uint_least8_t|uint_fast16_t|uint_fast32_t|uint_fast64_t|atomic_ushort|atomic_ullong|atomic_size_t|int_fast16_t|int_fast64_t|uint_fast8_t|atomic_short|atomic_uchar|atomic_schar|int_least8_t|memory_order|atomic_llong|atomic_ulong|int_fast32_t|atomic_long|atomic_uint|atomic_char|int_fast8_t|suseconds_t|atomic_bool|atomic_int|_Imaginary|useconds_t|in_port_t|uintmax_t|pthread_t|blksize_t|in_addr_t|uintptr_t|blkcnt_t|uint16_t|uint32_t|uint64_t|u_quad_t|_Complex|intptr_t|intmax_t|segsz_t|u_short|nlink_t|uint8_t|int64_t|int32_t|int16_t|fixpt_t|daddr_t|caddr_t|qaddr_t|ssize_t|clock_t|swblk_t|u_long|mode_t|int8_t|time_t|ushort|u_char|quad_t|size_t|pid_t|gid_t|uid_t|dev_t|div_t|off_t|u_int|key_t|ino_t|uint|id_t)(?!\\\\w))","name":"storage.type.built-in.c"},{"match":"(?-im:\\\\b(enum|struct|union)\\\\b)","name":"storage.type.$1.c"},{"begin":"\\\\b(__asm__|asm)\\\\b\\\\s*((?:volatile)?)","beginCaptures":{"1":{"name":"storage.type.asm.c"},"2":{"name":"storage.modifier.c"}},"end":"(?!\\\\G)","name":"meta.asm.c","patterns":[{"captures":{"1":{"patterns":[{"include":"#inline_comment"}]},"2":{"name":"comment.block.c punctuation.definition.comment.begin.c"},"3":{"name":"comment.block.c"},"4":{"patterns":[{"match":"\\\\*/","name":"comment.block.c punctuation.definition.comment.end.c"},{"match":"\\\\*","name":"comment.block.c"}]}},"match":"^((?:(?>\\\\s+)|(/\\\\*)((?>(?:[^*]|(?>\\\\*+)[^/])*)((?>\\\\*+)/)))+?|(?:(?:(?:(?:\\\\b|(?<=\\\\W))|(?=\\\\W))|\\\\A)|\\\\Z))(?:\\\\n|$)"},{"include":"#comments"},{"begin":"(((?:(?>\\\\s+)|(/\\\\*)((?>(?:[^*]|(?>\\\\*+)[^/])*)((?>\\\\*+)/)))+?|(?:(?:(?:(?:\\\\b|(?<=\\\\W))|(?=\\\\W))|\\\\A)|\\\\Z))\\\\()","beginCaptures":{"1":{"name":"punctuation.section.parens.begin.bracket.round.assembly.c"},"2":{"patterns":[{"include":"#inline_comment"}]},"3":{"name":"comment.block.c punctuation.definition.comment.begin.c"},"4":{"name":"comment.block.c"},"5":{"patterns":[{"match":"\\\\*/","name":"comment.block.c punctuation.definition.comment.end.c"},{"match":"\\\\*","name":"comment.block.c"}]}},"end":"(\\\\))","endCaptures":{"1":{"name":"punctuation.section.parens.end.bracket.round.assembly.c"}},"patterns":[{"begin":"(R?)(\\")","beginCaptures":{"1":{"name":"meta.encoding.c"},"2":{"name":"punctuation.definition.string.begin.assembly.c"}},"contentName":"meta.embedded.assembly.c","end":"(\\")","endCaptures":{"1":{"name":"punctuation.definition.string.end.assembly.c"}},"name":"string.quoted.double.c","patterns":[{"include":"source.asm"},{"include":"source.x86"},{"include":"source.x86_64"},{"include":"source.arm"},{"include":"#backslash_escapes"},{"include":"#string_escaped_char"}]},{"begin":"(\\\\()","beginCaptures":{"1":{"name":"punctuation.section.parens.begin.bracket.round.assembly.inner.c"}},"end":"(\\\\))","endCaptures":{"1":{"name":"punctuation.section.parens.end.bracket.round.assembly.inner.c"}},"patterns":[{"include":"#evaluation_context"}]},{"captures":{"1":{"patterns":[{"include":"#inline_comment"}]},"2":{"name":"comment.block.c punctuation.definition.comment.begin.c"},"3":{"name":"comment.block.c"},"4":{"patterns":[{"match":"\\\\*/","name":"comment.block.c punctuation.definition.comment.end.c"},{"match":"\\\\*","name":"comment.block.c"}]},"5":{"name":"variable.other.asm.label.c"},"6":{"patterns":[{"include":"#inline_comment"}]},"7":{"name":"comment.block.c punctuation.definition.comment.begin.c"},"8":{"name":"comment.block.c"},"9":{"patterns":[{"match":"\\\\*/","name":"comment.block.c punctuation.definition.comment.end.c"},{"match":"\\\\*","name":"comment.block.c"}]}},"match":"\\\\[((?:(?>\\\\s+)|(/\\\\*)((?>(?:[^*]|(?>\\\\*+)[^/])*)((?>\\\\*+)/)))+?|(?:(?:(?:(?:\\\\b|(?<=\\\\W))|(?=\\\\W))|\\\\A)|\\\\Z))([A-Z_a-z]\\\\w*)((?:(?>\\\\s+)|(/\\\\*)((?>(?:[^*]|(?>\\\\*+)[^/])*)((?>\\\\*+)/)))+?|(?:(?:(?:(?:\\\\b|(?<=\\\\W))|(?=\\\\W))|\\\\A)|\\\\Z))]"},{"match":":","name":"punctuation.separator.delimiter.colon.assembly.c"},{"include":"#comments"}]}]}]},"string_escaped_char":{"patterns":[{"match":"\\\\\\\\([\\"'?\\\\\\\\abefnprtv]|[0-3]\\\\d{0,2}|[4-7]\\\\d?|x\\\\h{0,2}|u\\\\h{0,4}|U\\\\h{0,8})","name":"constant.character.escape.c"},{"match":"\\\\\\\\.","name":"invalid.illegal.unknown-escape.c"}]},"string_placeholder":{"patterns":[{"match":"%(\\\\d+\\\\$)?[- #'+0]*[,:;_]?((-?\\\\d+)|\\\\*(-?\\\\d+\\\\$)?)?(\\\\.((-?\\\\d+)|\\\\*(-?\\\\d+\\\\$)?)?)?(hh?|ll|[Ljlqtz]|vh|vl?|hv|hl)?[%AC-GOSUXac-ginopsux]","name":"constant.other.placeholder.c"},{"captures":{"1":{"name":"invalid.illegal.placeholder.c"}},"match":"(%)(?!\\"\\\\s*(PRI|SCN))"}]},"strings":{"patterns":[{"begin":"\\"","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.c"}},"end":"\\"","endCaptures":{"0":{"name":"punctuation.definition.string.end.c"}},"name":"string.quoted.double.c","patterns":[{"include":"#string_escaped_char"},{"include":"#string_placeholder"},{"include":"#line_continuation_character"}]},{"begin":"'","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.c"}},"end":"'","endCaptures":{"0":{"name":"punctuation.definition.string.end.c"}},"name":"string.quoted.single.c","patterns":[{"include":"#string_escaped_char"},{"include":"#line_continuation_character"}]}]},"switch_conditional_parentheses":{"begin":"((?>(?:(?>(?<!\\\\s)\\\\s+)|(/\\\\*)((?>(?:[^*]|(?>\\\\*+)[^/])*)((?>\\\\*+)/)))+|(?:(?:(?:(?:\\\\b|(?<=\\\\W))|(?=\\\\W))|\\\\A)|\\\\Z)))(\\\\()","beginCaptures":{"1":{"patterns":[{"include":"#inline_comment"}]},"2":{"name":"comment.block.c punctuation.definition.comment.begin.c"},"3":{"name":"comment.block.c"},"4":{"patterns":[{"match":"\\\\*/","name":"comment.block.c punctuation.definition.comment.end.c"},{"match":"\\\\*","name":"comment.block.c"}]},"5":{"name":"punctuation.section.parens.begin.bracket.round.conditional.switch.c"}},"end":"(\\\\))","endCaptures":{"1":{"name":"punctuation.section.parens.end.bracket.round.conditional.switch.c"}},"name":"meta.conditional.switch.c","patterns":[{"include":"#evaluation_context"},{"include":"#c_conditional_context"}]},"switch_statement":{"begin":"(((?>(?:(?>(?<!\\\\s)\\\\s+)|(/\\\\*)((?>(?:[^*]|(?>\\\\*+)[^/])*)((?>\\\\*+)/)))+|(?:(?:(?:(?:\\\\b|(?<=\\\\W))|(?=\\\\W))|\\\\A)|\\\\Z)))((?<!\\\\w)switch(?!\\\\w)))","beginCaptures":{"1":{"name":"meta.head.switch.c"},"2":{"patterns":[{"include":"#inline_comment"}]},"3":{"name":"comment.block.c punctuation.definition.comment.begin.c"},"4":{"name":"comment.block.c"},"5":{"patterns":[{"match":"\\\\*/","name":"comment.block.c punctuation.definition.comment.end.c"},{"match":"\\\\*","name":"comment.block.c"}]},"6":{"name":"keyword.control.switch.c"}},"end":"(?<=}|%>|\\\\?\\\\?>)|(?=[];=>\\\\[])","name":"meta.block.switch.c","patterns":[{"begin":"\\\\G ?","end":"(\\\\{|<%|\\\\?\\\\?<|(?=;))","endCaptures":{"1":{"name":"punctuation.section.block.begin.bracket.curly.switch.c"}},"name":"meta.head.switch.c","patterns":[{"include":"#switch_conditional_parentheses"},{"include":"$self"}]},{"begin":"(?<=\\\\{|<%|\\\\?\\\\?<)","end":"(}|%>|\\\\?\\\\?>)","endCaptures":{"1":{"name":"punctuation.section.block.end.bracket.curly.switch.c"}},"name":"meta.body.switch.c","patterns":[{"include":"#default_statement"},{"include":"#case_statement"},{"include":"$self"},{"include":"#block_innards"}]},{"begin":"(?<=}|%>|\\\\?\\\\?>)[\\\\n\\\\s]*","end":"[\\\\n\\\\s]*(?=;)","name":"meta.tail.switch.c","patterns":[{"include":"$self"}]}]},"vararg_ellipses":{"match":"(?<!\\\\.)\\\\.\\\\.\\\\.(?!\\\\.)","name":"punctuation.vararg-ellipses.c"}},"scopeName":"source.c"}`))];export{t as n,n as t};
|
dist/assets/cpp-uVsU3rl9.js
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dist/assets/graphql-aweuWxpE.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import e from"./javascript-BgS3c2Ky.js";import{t}from"./typescript-Di2stYAd.js";import{t as n}from"./jsx-BNkhNtQn.js";import{t as r}from"./tsx-Cj8HH6Br.js";var i=Object.freeze(JSON.parse(`{"displayName":"GraphQL","fileTypes":["graphql","graphqls","gql","graphcool"],"name":"graphql","patterns":[{"include":"#graphql"}],"repository":{"graphql":{"patterns":[{"include":"#graphql-comment"},{"include":"#graphql-description-docstring"},{"include":"#graphql-description-singleline"},{"include":"#graphql-fragment-definition"},{"include":"#graphql-directive-definition"},{"include":"#graphql-type-interface"},{"include":"#graphql-enum"},{"include":"#graphql-scalar"},{"include":"#graphql-union"},{"include":"#graphql-schema"},{"include":"#graphql-operation-def"},{"include":"#literal-quasi-embedded"}]},"graphql-ampersand":{"captures":{"1":{"name":"keyword.operator.logical.graphql"}},"match":"\\\\s*(&)"},"graphql-arguments":{"begin":"\\\\s*(\\\\()","beginCaptures":{"1":{"name":"meta.brace.round.directive.graphql"}},"end":"\\\\s*(\\\\))","endCaptures":{"1":{"name":"meta.brace.round.directive.graphql"}},"name":"meta.arguments.graphql","patterns":[{"include":"#graphql-comment"},{"include":"#graphql-description-docstring"},{"include":"#graphql-description-singleline"},{"begin":"\\\\s*([A-Z_a-z][0-9A-Z_a-z]*)\\\\s*(:)","beginCaptures":{"1":{"name":"variable.parameter.graphql"},"2":{"name":"punctuation.colon.graphql"}},"end":"(?=\\\\s*(?:([A-Z_a-z][0-9A-Z_a-z]*)\\\\s*(:)|\\\\)))|\\\\s*(,)","endCaptures":{"3":{"name":"punctuation.comma.graphql"}},"patterns":[{"include":"#graphql-comment"},{"include":"#graphql-description-docstring"},{"include":"#graphql-description-singleline"},{"include":"#graphql-directive"},{"include":"#graphql-value"},{"include":"#graphql-skip-newlines"}]},{"include":"#literal-quasi-embedded"}]},"graphql-boolean-value":{"captures":{"1":{"name":"constant.language.boolean.graphql"}},"match":"\\\\s*\\\\b(true|false)\\\\b"},"graphql-colon":{"captures":{"1":{"name":"punctuation.colon.graphql"}},"match":"\\\\s*(:)"},"graphql-comma":{"captures":{"1":{"name":"punctuation.comma.graphql"}},"match":"\\\\s*(,)"},"graphql-comment":{"patterns":[{"captures":{"1":{"name":"punctuation.whitespace.comment.leading.graphql"}},"match":"(\\\\s*)(#).*","name":"comment.line.graphql.js"},{"begin":"(\\"\\"\\")","beginCaptures":{"1":{"name":"punctuation.whitespace.comment.leading.graphql"}},"end":"(\\"\\"\\")","name":"comment.line.graphql.js"},{"begin":"(\\")","beginCaptures":{"1":{"name":"punctuation.whitespace.comment.leading.graphql"}},"end":"(\\")","name":"comment.line.graphql.js"}]},"graphql-description-docstring":{"begin":"\\"\\"\\"","end":"\\"\\"\\"","name":"comment.block.graphql"},"graphql-description-singleline":{"match":"#(?=([^\\"]*\\"[^\\"]*\\")*[^\\"]*$).*$","name":"comment.line.number-sign.graphql"},"graphql-directive":{"applyEndPatternLast":1,"begin":"\\\\s*((@)\\\\s*([A-Z_a-z][0-9A-Z_a-z]*))","beginCaptures":{"1":{"name":"entity.name.function.directive.graphql"}},"end":"(?=.)","patterns":[{"include":"#graphql-comment"},{"include":"#graphql-description-docstring"},{"include":"#graphql-description-singleline"},{"include":"#graphql-arguments"},{"include":"#literal-quasi-embedded"},{"include":"#graphql-skip-newlines"}]},"graphql-directive-definition":{"applyEndPatternLast":1,"begin":"\\\\s*\\\\b(directive)\\\\b\\\\s*(@[A-Z_a-z][0-9A-Z_a-z]*)","beginCaptures":{"1":{"name":"keyword.directive.graphql"},"2":{"name":"entity.name.function.directive.graphql"},"3":{"name":"keyword.on.graphql"},"4":{"name":"support.type.graphql"}},"end":"(?=.)","patterns":[{"include":"#graphql-variable-definitions"},{"applyEndPatternLast":1,"begin":"\\\\s*\\\\b(on)\\\\b\\\\s*([A-Z_a-z]*)","beginCaptures":{"1":{"name":"keyword.on.graphql"},"2":{"name":"support.type.location.graphql"}},"end":"(?=.)","patterns":[{"include":"#graphql-skip-newlines"},{"include":"#graphql-comment"},{"include":"#literal-quasi-embedded"},{"captures":{"2":{"name":"support.type.location.graphql"}},"match":"\\\\s*(\\\\|)\\\\s*([A-Z_a-z]*)"}]},{"include":"#graphql-skip-newlines"},{"include":"#graphql-comment"},{"include":"#literal-quasi-embedded"}]},"graphql-enum":{"begin":"\\\\s*+\\\\b(enum)\\\\b\\\\s*([A-Z_a-z][0-9A-Z_a-z]*)","beginCaptures":{"1":{"name":"keyword.enum.graphql"},"2":{"name":"support.type.enum.graphql"}},"end":"(?<=})","name":"meta.enum.graphql","patterns":[{"begin":"\\\\s*(\\\\{)","beginCaptures":{"1":{"name":"punctuation.operation.graphql"}},"end":"\\\\s*(})","endCaptures":{"1":{"name":"punctuation.operation.graphql"}},"name":"meta.type.object.graphql","patterns":[{"include":"#graphql-object-type"},{"include":"#graphql-comment"},{"include":"#graphql-description-docstring"},{"include":"#graphql-description-singleline"},{"include":"#graphql-directive"},{"include":"#graphql-enum-value"},{"include":"#literal-quasi-embedded"}]},{"include":"#graphql-comment"},{"include":"#graphql-description-docstring"},{"include":"#graphql-description-singleline"},{"include":"#graphql-directive"}]},"graphql-enum-value":{"match":"\\\\s*(?!=\\\\b(true|false|null)\\\\b)([A-Z_a-z][0-9A-Z_a-z]*)","name":"constant.character.enum.graphql"},"graphql-field":{"patterns":[{"captures":{"1":{"name":"string.unquoted.alias.graphql"},"2":{"name":"punctuation.colon.graphql"}},"match":"\\\\s*([A-Z_a-z][0-9A-Z_a-z]*)\\\\s*(:)"},{"captures":{"1":{"name":"variable.graphql"}},"match":"\\\\s*([A-Z_a-z][0-9A-Z_a-z]*)"},{"include":"#graphql-arguments"},{"include":"#graphql-directive"},{"include":"#graphql-selection-set"},{"include":"#literal-quasi-embedded"},{"include":"#graphql-skip-newlines"}]},"graphql-float-value":{"captures":{"1":{"name":"constant.numeric.float.graphql"}},"match":"\\\\s*(-?(0|[1-9][0-9]*)(\\\\.[0-9]+)?(([Ee])([-+])?[0-9]+)?)"},"graphql-fragment-definition":{"begin":"\\\\s*\\\\b(fragment)\\\\b\\\\s*([A-Z_a-z][0-9A-Z_a-z]*)?\\\\s*\\\\b(on)\\\\b\\\\s*([A-Z_a-z][0-9A-Z_a-z]*)","captures":{"1":{"name":"keyword.fragment.graphql"},"2":{"name":"entity.name.fragment.graphql"},"3":{"name":"keyword.on.graphql"},"4":{"name":"support.type.graphql"}},"end":"(?<=})","name":"meta.fragment.graphql","patterns":[{"include":"#graphql-comment"},{"include":"#graphql-description-docstring"},{"include":"#graphql-description-singleline"},{"include":"#graphql-selection-set"},{"include":"#graphql-directive"},{"include":"#graphql-skip-newlines"},{"include":"#literal-quasi-embedded"}]},"graphql-fragment-spread":{"applyEndPatternLast":1,"begin":"\\\\s*(\\\\.\\\\.\\\\.)\\\\s*(?!\\\\bon\\\\b)([A-Z_a-z][0-9A-Z_a-z]*)","captures":{"1":{"name":"keyword.operator.spread.graphql"},"2":{"name":"variable.fragment.graphql"}},"end":"(?=.)","patterns":[{"include":"#graphql-comment"},{"include":"#graphql-description-docstring"},{"include":"#graphql-description-singleline"},{"include":"#graphql-selection-set"},{"include":"#graphql-directive"},{"include":"#literal-quasi-embedded"},{"include":"#graphql-skip-newlines"}]},"graphql-ignore-spaces":{"match":"\\\\s*"},"graphql-inline-fragment":{"applyEndPatternLast":1,"begin":"\\\\s*(\\\\.\\\\.\\\\.)\\\\s*(?:\\\\b(on)\\\\b\\\\s*([A-Z_a-z][0-9A-Z_a-z]*))?","captures":{"1":{"name":"keyword.operator.spread.graphql"},"2":{"name":"keyword.on.graphql"},"3":{"name":"support.type.graphql"}},"end":"(?=.)","patterns":[{"include":"#graphql-comment"},{"include":"#graphql-description-docstring"},{"include":"#graphql-description-singleline"},{"include":"#graphql-selection-set"},{"include":"#graphql-directive"},{"include":"#graphql-skip-newlines"},{"include":"#literal-quasi-embedded"}]},"graphql-input-types":{"patterns":[{"include":"#graphql-scalar-type"},{"captures":{"1":{"name":"support.type.graphql"},"2":{"name":"keyword.operator.nulltype.graphql"}},"match":"\\\\s*([A-Z_a-z][0-9A-Z_a-z]*)(?:\\\\s*(!))?"},{"begin":"\\\\s*(\\\\[)","captures":{"1":{"name":"meta.brace.square.graphql"},"2":{"name":"keyword.operator.nulltype.graphql"}},"end":"\\\\s*(])(?:\\\\s*(!))?","name":"meta.type.list.graphql","patterns":[{"include":"#graphql-comment"},{"include":"#graphql-description-docstring"},{"include":"#graphql-description-singleline"},{"include":"#graphql-input-types"},{"include":"#graphql-comma"},{"include":"#literal-quasi-embedded"}]}]},"graphql-list-value":{"patterns":[{"begin":"\\\\s*+(\\\\[)","beginCaptures":{"1":{"name":"meta.brace.square.graphql"}},"end":"\\\\s*(])","endCaptures":{"1":{"name":"meta.brace.square.graphql"}},"name":"meta.listvalues.graphql","patterns":[{"include":"#graphql-value"}]}]},"graphql-name":{"captures":{"1":{"name":"entity.name.function.graphql"}},"match":"\\\\s*([A-Z_a-z][0-9A-Z_a-z]*)"},"graphql-null-value":{"captures":{"1":{"name":"constant.language.null.graphql"}},"match":"\\\\s*\\\\b(null)\\\\b"},"graphql-object-field":{"captures":{"1":{"name":"constant.object.key.graphql"},"2":{"name":"string.unquoted.graphql"},"3":{"name":"punctuation.graphql"}},"match":"\\\\s*(([A-Z_a-z][0-9A-Z_a-z]*))\\\\s*(:)"},"graphql-object-value":{"patterns":[{"begin":"\\\\s*+(\\\\{)","beginCaptures":{"1":{"name":"meta.brace.curly.graphql"}},"end":"\\\\s*(})","endCaptures":{"1":{"name":"meta.brace.curly.graphql"}},"name":"meta.objectvalues.graphql","patterns":[{"include":"#graphql-object-field"},{"include":"#graphql-value"}]}]},"graphql-operation-def":{"patterns":[{"include":"#graphql-query-mutation"},{"include":"#graphql-name"},{"include":"#graphql-variable-definitions"},{"include":"#graphql-directive"},{"include":"#graphql-selection-set"}]},"graphql-query-mutation":{"captures":{"1":{"name":"keyword.operation.graphql"}},"match":"\\\\s*\\\\b(query|mutation)\\\\b"},"graphql-scalar":{"captures":{"1":{"name":"keyword.scalar.graphql"},"2":{"name":"entity.scalar.graphql"}},"match":"\\\\s*\\\\b(scalar)\\\\b\\\\s*([A-Z_a-z][0-9A-Z_a-z]*)"},"graphql-scalar-type":{"captures":{"1":{"name":"support.type.builtin.graphql"},"2":{"name":"keyword.operator.nulltype.graphql"}},"match":"\\\\s*\\\\b(Int|Float|String|Boolean|ID)\\\\b(?:\\\\s*(!))?"},"graphql-schema":{"begin":"\\\\s*\\\\b(schema)\\\\b","beginCaptures":{"1":{"name":"keyword.schema.graphql"}},"end":"(?<=})","patterns":[{"begin":"\\\\s*(\\\\{)","beginCaptures":{"1":{"name":"punctuation.operation.graphql"}},"end":"\\\\s*(})","endCaptures":{"1":{"name":"punctuation.operation.graphql"}},"patterns":[{"begin":"\\\\s*([A-Z_a-z][0-9A-Z_a-z]*)(?=\\\\s*\\\\(|:)","beginCaptures":{"1":{"name":"variable.arguments.graphql"}},"end":"(?=\\\\s*(([A-Z_a-z][0-9A-Z_a-z]*)\\\\s*([(:])|(})))|\\\\s*(,)","endCaptures":{"5":{"name":"punctuation.comma.graphql"}},"patterns":[{"captures":{"1":{"name":"support.type.graphql"}},"match":"\\\\s*([A-Z_a-z][0-9A-Z_a-z]*)"},{"include":"#graphql-comment"},{"include":"#graphql-description-docstring"},{"include":"#graphql-description-singleline"},{"include":"#graphql-colon"},{"include":"#graphql-skip-newlines"}]},{"include":"#graphql-comment"},{"include":"#graphql-description-docstring"},{"include":"#graphql-description-singleline"},{"include":"#graphql-skip-newlines"}]},{"include":"#graphql-comment"},{"include":"#graphql-description-docstring"},{"include":"#graphql-description-singleline"},{"include":"#graphql-directive"},{"include":"#graphql-skip-newlines"}]},"graphql-selection-set":{"begin":"\\\\s*(\\\\{)","beginCaptures":{"1":{"name":"punctuation.operation.graphql"}},"end":"\\\\s*(})","endCaptures":{"1":{"name":"punctuation.operation.graphql"}},"name":"meta.selectionset.graphql","patterns":[{"include":"#graphql-comment"},{"include":"#graphql-description-docstring"},{"include":"#graphql-description-singleline"},{"include":"#graphql-field"},{"include":"#graphql-fragment-spread"},{"include":"#graphql-inline-fragment"},{"include":"#graphql-comma"},{"include":"#native-interpolation"},{"include":"#literal-quasi-embedded"}]},"graphql-skip-newlines":{"match":"\\\\s*\\\\n"},"graphql-string-content":{"patterns":[{"match":"\\\\\\\\[\\"'/\\\\\\\\bfnrt]","name":"constant.character.escape.graphql"},{"match":"\\\\\\\\u(\\\\h{4})","name":"constant.character.escape.graphql"}]},"graphql-string-value":{"begin":"\\\\s*+((\\"))","beginCaptures":{"1":{"name":"string.quoted.double.graphql"},"2":{"name":"punctuation.definition.string.begin.graphql"}},"contentName":"string.quoted.double.graphql","end":"\\\\s*+(?:((\\"))|(\\\\n))","endCaptures":{"1":{"name":"string.quoted.double.graphql"},"2":{"name":"punctuation.definition.string.end.graphql"},"3":{"name":"invalid.illegal.newline.graphql"}},"patterns":[{"include":"#graphql-string-content"},{"include":"#literal-quasi-embedded"}]},"graphql-type-definition":{"begin":"\\\\s*([A-Z_a-z][0-9A-Z_a-z]*)(?=\\\\s*\\\\(|:)","beginCaptures":{"1":{"name":"variable.graphql"}},"end":"(?=\\\\s*(([A-Z_a-z][0-9A-Z_a-z]*)\\\\s*([(:])|(})))|\\\\s*(,)","endCaptures":{"5":{"name":"punctuation.comma.graphql"}},"patterns":[{"include":"#graphql-comment"},{"include":"#graphql-description-docstring"},{"include":"#graphql-description-singleline"},{"include":"#graphql-directive"},{"include":"#graphql-variable-definitions"},{"include":"#graphql-type-object"},{"include":"#graphql-colon"},{"include":"#graphql-input-types"},{"include":"#literal-quasi-embedded"}]},"graphql-type-interface":{"applyEndPatternLast":1,"begin":"\\\\s*\\\\b(?:(extends?)?\\\\b\\\\s*\\\\b(type)|(interface)|(input))\\\\b\\\\s*([A-Z_a-z][0-9A-Z_a-z]*)?","captures":{"1":{"name":"keyword.type.graphql"},"2":{"name":"keyword.type.graphql"},"3":{"name":"keyword.interface.graphql"},"4":{"name":"keyword.input.graphql"},"5":{"name":"support.type.graphql"}},"end":"(?=.)","name":"meta.type.interface.graphql","patterns":[{"begin":"\\\\s*\\\\b(implements)\\\\b\\\\s*","beginCaptures":{"1":{"name":"keyword.implements.graphql"}},"end":"\\\\s*(?=\\\\{)","patterns":[{"captures":{"1":{"name":"support.type.graphql"}},"match":"\\\\s*([A-Z_a-z][0-9A-Z_a-z]*)"},{"include":"#graphql-comment"},{"include":"#graphql-description-docstring"},{"include":"#graphql-description-singleline"},{"include":"#graphql-directive"},{"include":"#graphql-ampersand"},{"include":"#graphql-comma"}]},{"include":"#graphql-comment"},{"include":"#graphql-description-docstring"},{"include":"#graphql-description-singleline"},{"include":"#graphql-directive"},{"include":"#graphql-type-object"},{"include":"#literal-quasi-embedded"},{"include":"#graphql-ignore-spaces"}]},"graphql-type-object":{"begin":"\\\\s*(\\\\{)","beginCaptures":{"1":{"name":"punctuation.operation.graphql"}},"end":"\\\\s*(})","endCaptures":{"1":{"name":"punctuation.operation.graphql"}},"name":"meta.type.object.graphql","patterns":[{"include":"#graphql-comment"},{"include":"#graphql-description-docstring"},{"include":"#graphql-description-singleline"},{"include":"#graphql-object-type"},{"include":"#graphql-type-definition"},{"include":"#literal-quasi-embedded"}]},"graphql-union":{"applyEndPatternLast":1,"begin":"\\\\s*\\\\b(union)\\\\b\\\\s*([A-Z_a-z][0-9A-Z_a-z]*)","captures":{"1":{"name":"keyword.union.graphql"},"2":{"name":"support.type.graphql"}},"end":"(?=.)","patterns":[{"applyEndPatternLast":1,"begin":"\\\\s*(=)\\\\s*([A-Z_a-z][0-9A-Z_a-z]*)","captures":{"1":{"name":"punctuation.assignment.graphql"},"2":{"name":"support.type.graphql"}},"end":"(?=.)","patterns":[{"include":"#graphql-comment"},{"include":"#graphql-description-docstring"},{"include":"#graphql-description-singleline"},{"include":"#graphql-skip-newlines"},{"include":"#literal-quasi-embedded"},{"captures":{"1":{"name":"punctuation.or.graphql"},"2":{"name":"support.type.graphql"}},"match":"\\\\s*(\\\\|)\\\\s*([A-Z_a-z][0-9A-Z_a-z]*)"}]},{"include":"#graphql-comment"},{"include":"#graphql-description-docstring"},{"include":"#graphql-description-singleline"},{"include":"#graphql-skip-newlines"},{"include":"#literal-quasi-embedded"}]},"graphql-union-mark":{"captures":{"1":{"name":"punctuation.union.graphql"}},"match":"\\\\s*(\\\\|)"},"graphql-value":{"patterns":[{"include":"#graphql-comment"},{"include":"#graphql-description-docstring"},{"include":"#graphql-variable-name"},{"include":"#graphql-float-value"},{"include":"#graphql-string-value"},{"include":"#graphql-boolean-value"},{"include":"#graphql-null-value"},{"include":"#graphql-enum-value"},{"include":"#graphql-list-value"},{"include":"#graphql-object-value"},{"include":"#literal-quasi-embedded"}]},"graphql-variable-assignment":{"applyEndPatternLast":1,"begin":"\\\\s(=)","beginCaptures":{"1":{"name":"punctuation.assignment.graphql"}},"end":"(?=[\\\\n),])","patterns":[{"include":"#graphql-value"}]},"graphql-variable-definition":{"begin":"\\\\s*(\\\\$?[A-Z_a-z][0-9A-Z_a-z]*)(?=\\\\s*\\\\(|:)","beginCaptures":{"1":{"name":"variable.parameter.graphql"}},"end":"(?=\\\\s*((\\\\$?[A-Z_a-z][0-9A-Z_a-z]*)\\\\s*([(:])|([)}])))|\\\\s*(,)","endCaptures":{"5":{"name":"punctuation.comma.graphql"}},"name":"meta.variables.graphql","patterns":[{"include":"#graphql-comment"},{"include":"#graphql-description-docstring"},{"include":"#graphql-description-singleline"},{"include":"#graphql-directive"},{"include":"#graphql-colon"},{"include":"#graphql-input-types"},{"include":"#graphql-variable-assignment"},{"include":"#literal-quasi-embedded"},{"include":"#graphql-skip-newlines"}]},"graphql-variable-definitions":{"begin":"\\\\s*(\\\\()","captures":{"1":{"name":"meta.brace.round.graphql"}},"end":"\\\\s*(\\\\))","patterns":[{"include":"#graphql-comment"},{"include":"#graphql-description-docstring"},{"include":"#graphql-description-singleline"},{"include":"#graphql-variable-definition"},{"include":"#literal-quasi-embedded"}]},"graphql-variable-name":{"captures":{"1":{"name":"variable.graphql"}},"match":"\\\\s*(\\\\$[A-Z_a-z][0-9A-Z_a-z]*)"},"native-interpolation":{"begin":"\\\\s*(\\\\$\\\\{)","beginCaptures":{"1":{"name":"keyword.other.substitution.begin"}},"end":"(})","endCaptures":{"1":{"name":"keyword.other.substitution.end"}},"name":"native.interpolation","patterns":[{"include":"source.js"},{"include":"source.ts"},{"include":"source.js.jsx"},{"include":"source.tsx"}]}},"scopeName":"source.graphql","embeddedLangs":["javascript","typescript","jsx","tsx"],"aliases":["gql"]}`)),a=[...e,...t,...n,...r,i];export{a as default};
|
dist/assets/index-DjqZvGjf.js
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dist/assets/java-Cf25h0JE.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{t as e}from"./index-DjqZvGjf.js";var t=e({default:()=>n}),n=[Object.freeze(JSON.parse(`{"displayName":"Java","name":"java","patterns":[{"begin":"\\\\b(package)\\\\b\\\\s*","beginCaptures":{"1":{"name":"keyword.other.package.java"}},"contentName":"storage.modifier.package.java","end":"\\\\s*(;)","endCaptures":{"1":{"name":"punctuation.terminator.java"}},"name":"meta.package.java","patterns":[{"include":"#comments"},{"match":"(?<=\\\\.)\\\\s*\\\\.|\\\\.(?=\\\\s*;)","name":"invalid.illegal.character_not_allowed_here.java"},{"match":"(?<!_)_(?=\\\\s*([.;]))|\\\\b\\\\d+|-+","name":"invalid.illegal.character_not_allowed_here.java"},{"match":"[A-Z]+","name":"invalid.deprecated.package_name_not_lowercase.java"},{"match":"\\\\b(?<!\\\\$)(abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|native|new|non-sealed|package|permits|private|protected|public|return|sealed|short|static|strictfp|super|switch|syncronized|this|throws??|transient|try|void|volatile|while|yield|true|false|null)\\\\b","name":"invalid.illegal.character_not_allowed_here.java"},{"match":"\\\\.","name":"punctuation.separator.java"}]},{"begin":"\\\\b(import)\\\\b\\\\s*\\\\b(static)?\\\\b\\\\s","beginCaptures":{"1":{"name":"keyword.other.import.java"},"2":{"name":"storage.modifier.java"}},"contentName":"storage.modifier.import.java","end":"\\\\s*(;)","endCaptures":{"1":{"name":"punctuation.terminator.java"}},"name":"meta.import.java","patterns":[{"include":"#comments"},{"match":"(?<=\\\\.)\\\\s*\\\\.|\\\\.(?=\\\\s*;)","name":"invalid.illegal.character_not_allowed_here.java"},{"match":"(?<!\\\\.)\\\\s*\\\\*","name":"invalid.illegal.character_not_allowed_here.java"},{"match":"(?<!_)_(?=\\\\s*([.;]))|\\\\b\\\\d+|-+","name":"invalid.illegal.character_not_allowed_here.java"},{"match":"\\\\b(?<!\\\\$)(abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|native|new|non-sealed|package|permits|private|protected|public|return|sealed|short|static|strictfp|super|switch|syncronized|this|throws??|transient|try|void|volatile|while|yield|true|false|null)\\\\b","name":"invalid.illegal.character_not_allowed_here.java"},{"match":"\\\\.","name":"punctuation.separator.java"},{"match":"\\\\*","name":"variable.language.wildcard.java"}]},{"include":"#comments-javadoc"},{"include":"#code"},{"include":"#module"}],"repository":{"all-types":{"patterns":[{"include":"#primitive-arrays"},{"include":"#primitive-types"},{"include":"#object-types"}]},"annotations":{"patterns":[{"begin":"((@)\\\\s*([^(\\\\s]+))(\\\\()","beginCaptures":{"2":{"name":"punctuation.definition.annotation.java"},"3":{"name":"storage.type.annotation.java"},"4":{"name":"punctuation.definition.annotation-arguments.begin.bracket.round.java"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.definition.annotation-arguments.end.bracket.round.java"}},"name":"meta.declaration.annotation.java","patterns":[{"captures":{"1":{"name":"constant.other.key.java"},"2":{"name":"keyword.operator.assignment.java"}},"match":"(\\\\w*)\\\\s*(=)"},{"include":"#code"}]},{"captures":{"1":{"name":"punctuation.definition.annotation.java"},"2":{"name":"storage.modifier.java"},"3":{"name":"storage.type.annotation.java"},"5":{"name":"punctuation.definition.annotation.java"},"6":{"name":"storage.type.annotation.java"}},"match":"(@)(interface)\\\\s+(\\\\w*)|((@)\\\\s*(\\\\w+))","name":"meta.declaration.annotation.java"}]},"anonymous-block-and-instance-initializer":{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.section.block.begin.bracket.curly.java"}},"end":"}","endCaptures":{"0":{"name":"punctuation.section.block.end.bracket.curly.java"}},"patterns":[{"include":"#code"}]},"anonymous-classes-and-new":{"begin":"\\\\bnew\\\\b","beginCaptures":{"0":{"name":"keyword.control.new.java"}},"end":"(?=[])-.:;?}]|/(?![*/])|[!%\\\\&=^|])","patterns":[{"include":"#comments"},{"include":"#function-call"},{"include":"#all-types"},{"begin":"(?<=\\\\))","end":"(?=[])-.:;?}]|/(?![*/])|[!%\\\\&=^|])","patterns":[{"include":"#comments"},{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.section.inner-class.begin.bracket.curly.java"}},"end":"}","endCaptures":{"0":{"name":"punctuation.section.inner-class.end.bracket.curly.java"}},"name":"meta.inner-class.java","patterns":[{"include":"#class-body"}]}]},{"begin":"(?<=])","end":"(?=[])-.:;?}]|/(?![*/])|[!%\\\\&=^|])","patterns":[{"include":"#comments"},{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.section.array-initializer.begin.bracket.curly.java"}},"end":"}","endCaptures":{"0":{"name":"punctuation.section.array-initializer.end.bracket.curly.java"}},"name":"meta.array-initializer.java","patterns":[{"include":"#code"}]}]},{"include":"#parens"}]},"assertions":{"patterns":[{"begin":"\\\\b(assert)\\\\s","beginCaptures":{"1":{"name":"keyword.control.assert.java"}},"end":"$","name":"meta.declaration.assertion.java","patterns":[{"match":":","name":"keyword.operator.assert.expression-separator.java"},{"include":"#code"}]}]},"class":{"begin":"(?=\\\\w?[-\\\\w\\\\s]*\\\\b(?:class|(?<!@)interface|enum)\\\\s+[$\\\\w]+)","end":"}","endCaptures":{"0":{"name":"punctuation.section.class.end.bracket.curly.java"}},"name":"meta.class.java","patterns":[{"include":"#storage-modifiers"},{"include":"#generics"},{"include":"#comments"},{"captures":{"1":{"name":"storage.modifier.java"},"2":{"name":"entity.name.type.class.java"}},"match":"(class|(?<!@)interface|enum)\\\\s+([$\\\\w]+)","name":"meta.class.identifier.java"},{"begin":"extends","beginCaptures":{"0":{"name":"storage.modifier.extends.java"}},"end":"(?=\\\\{|implements|permits)","name":"meta.definition.class.inherited.classes.java","patterns":[{"include":"#object-types-inherited"},{"include":"#comments"}]},{"begin":"(implements)\\\\s","beginCaptures":{"1":{"name":"storage.modifier.implements.java"}},"end":"(?=\\\\s*extends|permits|\\\\{)","name":"meta.definition.class.implemented.interfaces.java","patterns":[{"include":"#object-types-inherited"},{"include":"#comments"}]},{"begin":"(permits)\\\\s","beginCaptures":{"1":{"name":"storage.modifier.permits.java"}},"end":"(?=\\\\s*extends|implements|\\\\{)","name":"meta.definition.class.permits.classes.java","patterns":[{"include":"#object-types-inherited"},{"include":"#comments"}]},{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.section.class.begin.bracket.curly.java"}},"contentName":"meta.class.body.java","end":"(?=})","patterns":[{"include":"#class-body"}]}]},"class-body":{"patterns":[{"include":"#comments-javadoc"},{"include":"#comments"},{"include":"#enums"},{"include":"#class"},{"include":"#generics"},{"include":"#static-initializer"},{"include":"#class-fields-and-methods"},{"include":"#annotations"},{"include":"#storage-modifiers"},{"include":"#member-variables"},{"include":"#code"}]},"class-fields-and-methods":{"patterns":[{"begin":"(?==)","end":"(?=;)","patterns":[{"include":"#code"}]},{"include":"#methods"}]},"code":{"patterns":[{"include":"#annotations"},{"include":"#comments"},{"include":"#enums"},{"include":"#class"},{"include":"#record"},{"include":"#anonymous-block-and-instance-initializer"},{"include":"#try-catch-finally"},{"include":"#assertions"},{"include":"#parens"},{"include":"#constants-and-special-vars"},{"include":"#numbers"},{"include":"#anonymous-classes-and-new"},{"include":"#lambda-expression"},{"include":"#keywords"},{"include":"#storage-modifiers"},{"include":"#method-call"},{"include":"#function-call"},{"include":"#variables"},{"include":"#variables-local"},{"include":"#objects"},{"include":"#properties"},{"include":"#strings"},{"include":"#all-types"},{"match":",","name":"punctuation.separator.delimiter.java"},{"match":"\\\\.","name":"punctuation.separator.period.java"},{"match":";","name":"punctuation.terminator.java"}]},"comments":{"patterns":[{"captures":{"0":{"name":"punctuation.definition.comment.java"}},"match":"/\\\\*\\\\*/","name":"comment.block.empty.java"},{"include":"#comments-inline"}]},"comments-inline":{"patterns":[{"begin":"/\\\\*","captures":{"0":{"name":"punctuation.definition.comment.java"}},"end":"\\\\*/","name":"comment.block.java"},{"begin":"(^[\\\\t ]+)?(?=//)","beginCaptures":{"1":{"name":"punctuation.whitespace.comment.leading.java"}},"end":"(?!\\\\G)","patterns":[{"begin":"//","beginCaptures":{"0":{"name":"punctuation.definition.comment.java"}},"end":"\\\\n","name":"comment.line.double-slash.java"}]}]},"comments-javadoc":{"patterns":[{"begin":"^\\\\s*(/\\\\*\\\\*)(?!/)","beginCaptures":{"1":{"name":"punctuation.definition.comment.java"}},"end":"\\\\*/","endCaptures":{"0":{"name":"punctuation.definition.comment.java"}},"name":"comment.block.javadoc.java","patterns":[{"match":"@(author|deprecated|return|see|serial|since|version)\\\\b","name":"keyword.other.documentation.javadoc.java"},{"captures":{"1":{"name":"keyword.other.documentation.javadoc.java"},"2":{"name":"variable.parameter.java"}},"match":"(@param)\\\\s+(\\\\S+)"},{"captures":{"1":{"name":"keyword.other.documentation.javadoc.java"},"2":{"name":"entity.name.type.class.java"}},"match":"(@(?:exception|throws))\\\\s+(\\\\S+)"},{"captures":{"1":{"name":"keyword.other.documentation.javadoc.java"},"2":{"name":"entity.name.type.class.java"},"3":{"name":"variable.parameter.java"}},"match":"\\\\{(@link)\\\\s+(\\\\S+)?#([$\\\\w]+\\\\s*\\\\([^()]*\\\\)).*?}"}]}]},"constants-and-special-vars":{"patterns":[{"match":"\\\\b(true|false|null)\\\\b","name":"constant.language.java"},{"match":"\\\\bthis\\\\b","name":"variable.language.this.java"},{"match":"\\\\bsuper\\\\b","name":"variable.language.java"}]},"enums":{"begin":"^\\\\s*([\\\\w\\\\s]*)(enum)\\\\s+(\\\\w+)","beginCaptures":{"1":{"patterns":[{"include":"#storage-modifiers"}]},"2":{"name":"storage.modifier.java"},"3":{"name":"entity.name.type.enum.java"}},"end":"}","endCaptures":{"0":{"name":"punctuation.section.enum.end.bracket.curly.java"}},"name":"meta.enum.java","patterns":[{"begin":"\\\\b(extends)\\\\b","beginCaptures":{"1":{"name":"storage.modifier.extends.java"}},"end":"(?=\\\\{|\\\\bimplements\\\\b)","name":"meta.definition.class.inherited.classes.java","patterns":[{"include":"#object-types-inherited"},{"include":"#comments"}]},{"begin":"\\\\b(implements)\\\\b","beginCaptures":{"1":{"name":"storage.modifier.implements.java"}},"end":"(?=\\\\{|\\\\bextends\\\\b)","name":"meta.definition.class.implemented.interfaces.java","patterns":[{"include":"#object-types-inherited"},{"include":"#comments"}]},{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.section.enum.begin.bracket.curly.java"}},"end":"(?=})","patterns":[{"begin":"(?<=\\\\{)","end":"(?=[;}])","patterns":[{"include":"#comments-javadoc"},{"include":"#comments"},{"begin":"\\\\b(\\\\w+)\\\\b","beginCaptures":{"1":{"name":"constant.other.enum.java"}},"end":"(,)|(?=[;}])","endCaptures":{"1":{"name":"punctuation.separator.delimiter.java"}},"patterns":[{"include":"#comments-javadoc"},{"include":"#comments"},{"begin":"\\\\(","beginCaptures":{"0":{"name":"punctuation.bracket.round.java"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.bracket.round.java"}},"patterns":[{"include":"#code"}]},{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.bracket.curly.java"}},"end":"}","endCaptures":{"0":{"name":"punctuation.bracket.curly.java"}},"patterns":[{"include":"#class-body"}]}]}]},{"include":"#class-body"}]}]},"function-call":{"begin":"([$A-Z_a-z][$\\\\w]*)\\\\s*(\\\\()","beginCaptures":{"1":{"name":"entity.name.function.java"},"2":{"name":"punctuation.definition.parameters.begin.bracket.round.java"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.definition.parameters.end.bracket.round.java"}},"name":"meta.function-call.java","patterns":[{"include":"#code"}]},"generics":{"begin":"<","beginCaptures":{"0":{"name":"punctuation.bracket.angle.java"}},"end":">","endCaptures":{"0":{"name":"punctuation.bracket.angle.java"}},"patterns":[{"match":"\\\\b(extends|super)\\\\b","name":"storage.modifier.$1.java"},{"captures":{"1":{"name":"storage.type.java"}},"match":"(?<!\\\\.)([$A-Z_a-z][$0-9A-Z_a-z]*)(?=\\\\s*<)"},{"include":"#primitive-arrays"},{"match":"[$A-Z_a-z][$0-9A-Z_a-z]*","name":"storage.type.generic.java"},{"match":"\\\\?","name":"storage.type.generic.wildcard.java"},{"match":"&","name":"punctuation.separator.types.java"},{"match":",","name":"punctuation.separator.delimiter.java"},{"match":"\\\\.","name":"punctuation.separator.period.java"},{"include":"#parens"},{"include":"#generics"},{"include":"#comments"}]},"keywords":{"patterns":[{"match":"\\\\bthrow\\\\b","name":"keyword.control.throw.java"},{"match":"[:?]","name":"keyword.control.ternary.java"},{"match":"\\\\b(return|yield|break|case|continue|default|do|while|for|switch|if|else)\\\\b","name":"keyword.control.java"},{"match":"\\\\b(instanceof)\\\\b","name":"keyword.operator.instanceof.java"},{"match":"(<<|>>>?|[\\\\^~])","name":"keyword.operator.bitwise.java"},{"match":"(([\\\\&^|]|<<|>>>?)=)","name":"keyword.operator.assignment.bitwise.java"},{"match":"(===?|!=|<=|>=|<>|[<>])","name":"keyword.operator.comparison.java"},{"match":"([-%*+/]=)","name":"keyword.operator.assignment.arithmetic.java"},{"match":"(=)","name":"keyword.operator.assignment.java"},{"match":"(--|\\\\+\\\\+)","name":"keyword.operator.increment-decrement.java"},{"match":"([-%*+/])","name":"keyword.operator.arithmetic.java"},{"match":"(!|&&|\\\\|\\\\|)","name":"keyword.operator.logical.java"},{"match":"([\\\\&|])","name":"keyword.operator.bitwise.java"},{"match":"\\\\b(const|goto)\\\\b","name":"keyword.reserved.java"}]},"lambda-expression":{"patterns":[{"match":"->","name":"storage.type.function.arrow.java"}]},"member-variables":{"begin":"(?=private|protected|public|native|synchronized|abstract|threadsafe|transient|static|final)","end":"(?=[;=])","patterns":[{"include":"#storage-modifiers"},{"include":"#variables"},{"include":"#primitive-arrays"},{"include":"#object-types"}]},"method-call":{"begin":"(\\\\.)\\\\s*([$A-Z_a-z][$\\\\w]*)\\\\s*(\\\\()","beginCaptures":{"1":{"name":"punctuation.separator.period.java"},"2":{"name":"entity.name.function.java"},"3":{"name":"punctuation.definition.parameters.begin.bracket.round.java"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.definition.parameters.end.bracket.round.java"}},"name":"meta.method-call.java","patterns":[{"include":"#code"}]},"methods":{"begin":"(?!new)(?=[<\\\\w].*\\\\s+)(?=([^/=]|/(?!/))+\\\\()","end":"(})|(?=;)","endCaptures":{"1":{"name":"punctuation.section.method.end.bracket.curly.java"}},"name":"meta.method.java","patterns":[{"include":"#storage-modifiers"},{"begin":"(\\\\w+)\\\\s*(\\\\()","beginCaptures":{"1":{"name":"entity.name.function.java"},"2":{"name":"punctuation.definition.parameters.begin.bracket.round.java"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.definition.parameters.end.bracket.round.java"}},"name":"meta.method.identifier.java","patterns":[{"include":"#parameters"},{"include":"#parens"},{"include":"#comments"}]},{"include":"#generics"},{"begin":"(?=\\\\w.*\\\\s+\\\\w+\\\\s*\\\\()","end":"(?=\\\\s+\\\\w+\\\\s*\\\\()","name":"meta.method.return-type.java","patterns":[{"include":"#all-types"},{"include":"#parens"},{"include":"#comments"}]},{"include":"#throws"},{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.section.method.begin.bracket.curly.java"}},"contentName":"meta.method.body.java","end":"(?=})","patterns":[{"include":"#code"}]},{"include":"#comments"}]},"module":{"begin":"((open)\\\\s)?(module)\\\\s+(\\\\w+)","beginCaptures":{"1":{"name":"storage.modifier.java"},"3":{"name":"storage.modifier.java"},"4":{"name":"entity.name.type.module.java"}},"end":"}","endCaptures":{"0":{"name":"punctuation.section.module.end.bracket.curly.java"}},"name":"meta.module.java","patterns":[{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.section.module.begin.bracket.curly.java"}},"contentName":"meta.module.body.java","end":"(?=})","patterns":[{"include":"#comments"},{"include":"#comments-javadoc"},{"match":"\\\\b(requires|transitive|exports|opens|to|uses|provides|with)\\\\b","name":"keyword.module.java"}]}]},"numbers":{"patterns":[{"match":"\\\\b(?<!\\\\$)0([Xx])((?<!\\\\.)\\\\h([_\\\\h]*\\\\h)?[Ll]?(?!\\\\.)|(\\\\h([_\\\\h]*\\\\h)?\\\\.?|(\\\\h([_\\\\h]*\\\\h)?)?\\\\.\\\\h([_\\\\h]*\\\\h)?)[Pp][-+]?[0-9]([0-9_]*[0-9])?[DFdf]?)\\\\b(?!\\\\$)","name":"constant.numeric.hex.java"},{"match":"\\\\b(?<!\\\\$)0([Bb])[01]([01_]*[01])?[Ll]?\\\\b(?!\\\\$)","name":"constant.numeric.binary.java"},{"match":"\\\\b(?<!\\\\$)0[0-7]([0-7_]*[0-7])?[Ll]?\\\\b(?!\\\\$)","name":"constant.numeric.octal.java"},{"match":"(?<!\\\\$)(\\\\b[0-9]([0-9_]*[0-9])?\\\\.\\\\B(?!\\\\.)|\\\\b[0-9]([0-9_]*[0-9])?\\\\.([Ee][-+]?[0-9]([0-9_]*[0-9])?)[DFdf]?\\\\b|\\\\b[0-9]([0-9_]*[0-9])?\\\\.([Ee][-+]?[0-9]([0-9_]*[0-9])?)?[DFdf]\\\\b|\\\\b[0-9]([0-9_]*[0-9])?\\\\.([0-9]([0-9_]*[0-9])?)([Ee][-+]?[0-9]([0-9_]*[0-9])?)?[DFdf]?\\\\b|(?<!\\\\.)\\\\B\\\\.[0-9]([0-9_]*[0-9])?([Ee][-+]?[0-9]([0-9_]*[0-9])?)?[DFdf]?\\\\b|\\\\b[0-9]([0-9_]*[0-9])?([Ee][-+]?[0-9]([0-9_]*[0-9])?)[DFdf]?\\\\b|\\\\b[0-9]([0-9_]*[0-9])?([Ee][-+]?[0-9]([0-9_]*[0-9])?)?[DFdf]\\\\b|\\\\b(0|[1-9]([0-9_]*[0-9])?)(?!\\\\.)[Ll]?\\\\b)(?!\\\\$)","name":"constant.numeric.decimal.java"}]},"object-types":{"patterns":[{"include":"#generics"},{"begin":"\\\\b((?:[A-Z_a-z]\\\\w*\\\\s*\\\\.\\\\s*)*)([A-Z_]\\\\w*)\\\\s*(?=\\\\[)","beginCaptures":{"1":{"patterns":[{"match":"[A-Z_a-z]\\\\w*","name":"storage.type.java"},{"match":"\\\\.","name":"punctuation.separator.period.java"}]},"2":{"name":"storage.type.object.array.java"}},"end":"(?!\\\\s*\\\\[)","patterns":[{"include":"#comments"},{"include":"#parens"}]},{"captures":{"1":{"patterns":[{"match":"[A-Z_a-z]\\\\w*","name":"storage.type.java"},{"match":"\\\\.","name":"punctuation.separator.period.java"}]}},"match":"\\\\b((?:[A-Z_a-z]\\\\w*\\\\s*\\\\.\\\\s*)*[A-Z_]\\\\w*)\\\\s*(?=<)"},{"captures":{"1":{"patterns":[{"match":"[A-Z_a-z]\\\\w*","name":"storage.type.java"},{"match":"\\\\.","name":"punctuation.separator.period.java"}]}},"match":"\\\\b((?:[A-Z_a-z]\\\\w*\\\\s*\\\\.\\\\s*)*[A-Z_]\\\\w*)\\\\b((?=\\\\s*[\\\\n$A-Z_a-z])|(?=\\\\s*\\\\.\\\\.\\\\.))"}]},"object-types-inherited":{"patterns":[{"include":"#generics"},{"captures":{"1":{"name":"punctuation.separator.period.java"}},"match":"\\\\b(?:[A-Z]\\\\w*\\\\s*(\\\\.)\\\\s*)*[A-Z]\\\\w*\\\\b","name":"entity.other.inherited-class.java"},{"match":",","name":"punctuation.separator.delimiter.java"}]},"objects":{"match":"(?<![$\\\\w])[$A-Z_a-z][$\\\\w]*(?=\\\\s*\\\\.\\\\s*[$\\\\w]+)","name":"variable.other.object.java"},"parameters":{"patterns":[{"match":"\\\\bfinal\\\\b","name":"storage.modifier.java"},{"include":"#annotations"},{"include":"#all-types"},{"include":"#strings"},{"match":"\\\\w+","name":"variable.parameter.java"},{"match":",","name":"punctuation.separator.delimiter.java"},{"match":"\\\\.\\\\.\\\\.","name":"punctuation.definition.parameters.varargs.java"}]},"parens":{"patterns":[{"begin":"\\\\(","beginCaptures":{"0":{"name":"punctuation.bracket.round.java"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.bracket.round.java"}},"patterns":[{"include":"#code"}]},{"begin":"\\\\[","beginCaptures":{"0":{"name":"punctuation.bracket.square.java"}},"end":"]","endCaptures":{"0":{"name":"punctuation.bracket.square.java"}},"patterns":[{"include":"#code"}]},{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.bracket.curly.java"}},"end":"}","endCaptures":{"0":{"name":"punctuation.bracket.curly.java"}},"patterns":[{"include":"#code"}]}]},"primitive-arrays":{"patterns":[{"begin":"\\\\b(void|boolean|byte|char|short|int|float|long|double)\\\\b\\\\s*(?=\\\\[)","beginCaptures":{"1":{"name":"storage.type.primitive.array.java"}},"end":"(?!\\\\s*\\\\[)","patterns":[{"include":"#comments"},{"include":"#parens"}]}]},"primitive-types":{"match":"\\\\b(void|boolean|byte|char|short|int|float|long|double)\\\\b","name":"storage.type.primitive.java"},"properties":{"patterns":[{"captures":{"1":{"name":"punctuation.separator.period.java"},"2":{"name":"keyword.control.new.java"}},"match":"(\\\\.)\\\\s*(new)"},{"captures":{"1":{"name":"punctuation.separator.period.java"},"2":{"name":"variable.other.object.property.java"}},"match":"(\\\\.)\\\\s*([$A-Z_a-z][$\\\\w]*)(?=\\\\s*\\\\.\\\\s*[$A-Z_a-z][$\\\\w]*)"},{"captures":{"1":{"name":"punctuation.separator.period.java"},"2":{"name":"variable.other.object.property.java"}},"match":"(\\\\.)\\\\s*([$A-Z_a-z][$\\\\w]*)"},{"captures":{"1":{"name":"punctuation.separator.period.java"},"2":{"name":"invalid.illegal.identifier.java"}},"match":"(\\\\.)\\\\s*([0-9][$\\\\w]*)"}]},"record":{"begin":"(?=\\\\w?[\\\\w\\\\s]*\\\\brecord\\\\s+[$\\\\w]+)","end":"}","endCaptures":{"0":{"name":"punctuation.section.class.end.bracket.curly.java"}},"name":"meta.record.java","patterns":[{"include":"#storage-modifiers"},{"include":"#generics"},{"include":"#comments"},{"begin":"(record)\\\\s+([$\\\\w]+)(<[$\\\\w]+>)?(\\\\()","beginCaptures":{"1":{"name":"storage.modifier.java"},"2":{"name":"entity.name.type.record.java"},"3":{"patterns":[{"include":"#generics"}]},"4":{"name":"punctuation.definition.parameters.begin.bracket.round.java"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.definition.parameters.end.bracket.round.java"}},"name":"meta.record.identifier.java","patterns":[{"include":"#code"}]},{"begin":"(implements)\\\\s","beginCaptures":{"1":{"name":"storage.modifier.implements.java"}},"end":"(?=\\\\s*\\\\{)","name":"meta.definition.class.implemented.interfaces.java","patterns":[{"include":"#object-types-inherited"},{"include":"#comments"}]},{"include":"#record-body"}]},"record-body":{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.section.class.begin.bracket.curly.java"}},"end":"(?=})","name":"meta.record.body.java","patterns":[{"include":"#record-constructor"},{"include":"#class-body"}]},"record-constructor":{"begin":"(?!new)(?=[<\\\\w].*\\\\s+)(?=([^(/=]|/(?!/))+(?=\\\\{))","end":"(})|(?=;)","endCaptures":{"1":{"name":"punctuation.section.method.end.bracket.curly.java"}},"name":"meta.method.java","patterns":[{"include":"#storage-modifiers"},{"begin":"(\\\\w+)","beginCaptures":{"1":{"name":"entity.name.function.java"}},"end":"(?=\\\\s*\\\\{)","name":"meta.method.identifier.java","patterns":[{"include":"#comments"}]},{"include":"#comments"},{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.section.method.begin.bracket.curly.java"}},"contentName":"meta.method.body.java","end":"(?=})","patterns":[{"include":"#code"}]}]},"static-initializer":{"patterns":[{"include":"#anonymous-block-and-instance-initializer"},{"match":"static","name":"storage.modifier.java"}]},"storage-modifiers":{"match":"\\\\b(public|private|protected|static|final|native|synchronized|abstract|threadsafe|transient|volatile|default|strictfp|sealed|non-sealed)\\\\b","name":"storage.modifier.java"},"strings":{"patterns":[{"begin":"\\"\\"\\"","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.java"}},"end":"\\"\\"\\"","endCaptures":{"0":{"name":"punctuation.definition.string.end.java"}},"name":"string.quoted.triple.java","patterns":[{"match":"(\\\\\\\\\\"\\"\\")(?!\\")|(\\\\\\\\.)","name":"constant.character.escape.java"}]},{"begin":"\\"","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.java"}},"end":"\\"","endCaptures":{"0":{"name":"punctuation.definition.string.end.java"}},"name":"string.quoted.double.java","patterns":[{"match":"\\\\\\\\.","name":"constant.character.escape.java"}]},{"begin":"'","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.java"}},"end":"'","endCaptures":{"0":{"name":"punctuation.definition.string.end.java"}},"name":"string.quoted.single.java","patterns":[{"match":"\\\\\\\\.","name":"constant.character.escape.java"}]}]},"throws":{"begin":"throws","beginCaptures":{"0":{"name":"storage.modifier.java"}},"end":"(?=[;{])","name":"meta.throwables.java","patterns":[{"match":",","name":"punctuation.separator.delimiter.java"},{"match":"[$A-Z_a-z][$.0-9A-Z_a-z]*","name":"storage.type.java"},{"include":"#comments"}]},"try-catch-finally":{"patterns":[{"begin":"\\\\btry\\\\b","beginCaptures":{"0":{"name":"keyword.control.try.java"}},"end":"}","endCaptures":{"0":{"name":"punctuation.section.try.end.bracket.curly.java"}},"name":"meta.try.java","patterns":[{"begin":"\\\\(","beginCaptures":{"0":{"name":"punctuation.section.try.resources.begin.bracket.round.java"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.section.try.resources.end.bracket.round.java"}},"name":"meta.try.resources.java","patterns":[{"include":"#code"}]},{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.section.try.begin.bracket.curly.java"}},"contentName":"meta.try.body.java","end":"(?=})","patterns":[{"include":"#code"}]}]},{"begin":"\\\\b(catch)\\\\b","beginCaptures":{"1":{"name":"keyword.control.catch.java"}},"end":"}","endCaptures":{"0":{"name":"punctuation.section.catch.end.bracket.curly.java"}},"name":"meta.catch.java","patterns":[{"include":"#comments"},{"begin":"\\\\(","beginCaptures":{"0":{"name":"punctuation.definition.parameters.begin.bracket.round.java"}},"contentName":"meta.catch.parameters.java","end":"\\\\)","endCaptures":{"0":{"name":"punctuation.definition.parameters.end.bracket.round.java"}},"patterns":[{"include":"#comments"},{"include":"#storage-modifiers"},{"begin":"[$A-Z_a-z][$.0-9A-Z_a-z]*","beginCaptures":{"0":{"name":"storage.type.java"}},"end":"(\\\\|)|(?=\\\\))","endCaptures":{"1":{"name":"punctuation.catch.separator.java"}},"patterns":[{"include":"#comments"},{"captures":{"0":{"name":"variable.parameter.java"}},"match":"\\\\w+"}]}]},{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.section.catch.begin.bracket.curly.java"}},"contentName":"meta.catch.body.java","end":"(?=})","patterns":[{"include":"#code"}]}]},{"begin":"\\\\bfinally\\\\b","beginCaptures":{"0":{"name":"keyword.control.finally.java"}},"end":"}","endCaptures":{"0":{"name":"punctuation.section.finally.end.bracket.curly.java"}},"name":"meta.finally.java","patterns":[{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.section.finally.begin.bracket.curly.java"}},"contentName":"meta.finally.body.java","end":"(?=})","patterns":[{"include":"#code"}]}]}]},"variables":{"begin":"(?=\\\\b((void|boolean|byte|char|short|int|float|long|double)|(?>(\\\\w+\\\\.)*[A-Z_]+\\\\w*))\\\\b\\\\s*(<[],.<>?\\\\[\\\\w\\\\s]*>)?\\\\s*((\\\\[])*)?\\\\s+[$A-Z_a-z][$\\\\w]*([]$,\\\\[\\\\w][],\\\\[\\\\w\\\\s]*)?\\\\s*([:;=]))","end":"(?=[:;=])","name":"meta.definition.variable.java","patterns":[{"captures":{"1":{"name":"variable.other.definition.java"}},"match":"([$A-Z_a-z][$\\\\w]*)(?=\\\\s*(\\\\[])*\\\\s*([,:;=]))"},{"include":"#all-types"},{"include":"#code"}]},"variables-local":{"begin":"(?=\\\\b(var)\\\\b\\\\s+[$A-Z_a-z][$\\\\w]*\\\\s*([:;=]))","end":"(?=[:;=])","name":"meta.definition.variable.local.java","patterns":[{"match":"\\\\bvar\\\\b","name":"storage.type.local.java"},{"captures":{"1":{"name":"variable.other.definition.java"}},"match":"([$A-Z_a-z][$\\\\w]*)(?=\\\\s*(\\\\[])*\\\\s*([:;=]))"},{"include":"#code"}]}},"scopeName":"source.java"}`))];export{t as n,n as t};
|
dist/assets/jsx-BNkhNtQn.js
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dist/assets/lua-Cr0_1Hr-.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{t as e}from"./c-D33ISaQg.js";var t=Object.freeze(JSON.parse(`{"displayName":"Lua","name":"lua","patterns":[{"begin":"\\\\b(?:(local)\\\\s+)?(function)\\\\b(?![,:])","beginCaptures":{"1":{"name":"keyword.local.lua"},"2":{"name":"keyword.control.lua"}},"end":"(?<=[-\\\\]\\"')\\\\[{}])","name":"meta.function.lua","patterns":[{"include":"#comment"},{"begin":"(\\\\()","beginCaptures":{"1":{"name":"punctuation.definition.parameters.begin.lua"}},"end":"(\\\\))|(?=[-\\\\]\\"'\\\\[{}])|(?<!\\\\.)\\\\.(?!\\\\.)","endCaptures":{"1":{"name":"punctuation.definition.parameters.finish.lua"}},"name":"meta.parameter.lua","patterns":[{"include":"#comment"},{"captures":{"1":{"name":"constant.language.lua"},"2":{"name":"variable.parameter.function.lua"}},"match":"(\\\\.{3})\\\\s*([A-Z_a-z][0-9A-Z_a-z]*)"},{"match":"[A-Z_a-z][0-9A-Z_a-z]*","name":"variable.parameter.function.lua"},{"match":",","name":"punctuation.separator.arguments.lua"},{"begin":":","beginCaptures":{"0":{"name":"punctuation.separator.arguments.lua"}},"end":"(?=[),])","patterns":[{"include":"#emmydoc.type"}]}]},{"match":"\\\\b([A-Z_a-z][0-9A-Z_a-z]*)\\\\b\\\\s*(?=:)","name":"entity.name.class.lua"},{"match":"\\\\b([A-Z_a-z][0-9A-Z_a-z]*)\\\\b","name":"entity.name.function.lua"}]},{"match":"(?<![.\\\\w\\\\d])0[Xx]\\\\h+(\\\\.\\\\h*)?([Ee]-?\\\\d*)?([Pp][-+]\\\\d+)?","name":"constant.numeric.float.hexadecimal.lua"},{"match":"(?<![.\\\\w\\\\d])0[Xx]\\\\.\\\\h+([Ee]-?\\\\d*)?([Pp][-+]\\\\d+)?","name":"constant.numeric.float.hexadecimal.lua"},{"match":"(?<![.\\\\w\\\\d])0[Xx]\\\\h+(?![.0-9EPep])","name":"constant.numeric.integer.hexadecimal.lua"},{"match":"(?<![.\\\\w\\\\d])\\\\d+(\\\\.\\\\d*)?([Ee]-?\\\\d*)?","name":"constant.numeric.float.lua"},{"match":"(?<![.\\\\w\\\\d])\\\\.\\\\d+([Ee]-?\\\\d*)?","name":"constant.numeric.float.lua"},{"match":"(?<![.\\\\w\\\\d])\\\\d+(?![.0-9EPep])","name":"constant.numeric.integer.lua"},{"include":"#string"},{"captures":{"1":{"name":"punctuation.definition.comment.lua"}},"match":"\\\\A(#!).*$\\\\n?","name":"comment.line.shebang.lua"},{"include":"#comment"},{"captures":{"1":{"name":"keyword.control.goto.lua"},"2":{"name":"string.tag.lua"}},"match":"\\\\b(goto)\\\\s+([A-Z_a-z][0-9A-Z_a-z]*)"},{"captures":{"1":{"name":"punctuation.section.embedded.begin.lua"},"2":{"name":"punctuation.section.embedded.end.lua"}},"match":"(::)\\\\s*[A-Z_a-z][0-9A-Z_a-z]*\\\\s*(::)","name":"string.tag.lua"},{"captures":{"0":{"name":"storage.type.attribute.lua"}},"match":"<\\\\s*(c(?:onst|lose))\\\\s*>"},{"match":"<[*A-Z_a-z][-*.0-9A-Z_a-z]*>","name":"storage.type.generic.lua"},{"match":"\\\\b(break|do|else|for|if|elseif|goto|return|then|repeat|while|until|end|in)\\\\b","name":"keyword.control.lua"},{"match":"\\\\b(local)\\\\b","name":"keyword.local.lua"},{"captures":{"1":{"name":"keyword.global.lua"}},"match":"^\\\\s*(global)\\\\b(?!\\\\s*=)"},{"match":"\\\\b(function)\\\\b(?![,:])","name":"keyword.control.lua"},{"match":"(?<![^.]\\\\.|:)\\\\b(false|nil(?!:)|true|_ENV|_G|_VERSION|math\\\\.(pi|huge|maxinteger|mininteger)|utf8\\\\.charpattern|io\\\\.(std(?:in|out|err))|package\\\\.(config|cpath|loaded|loaders|path|preload|searchers))\\\\b|(?<!\\\\.)\\\\.{3}(?!\\\\.)","name":"constant.language.lua"},{"match":"(?<![^.]\\\\.|:)\\\\b(self)\\\\b","name":"variable.language.self.lua"},{"match":"(?<![^.]\\\\.|:)\\\\b(assert|collectgarbage|dofile|error|getfenv|getmetatable|ipairs|load|loadfile|loadstring|module|next|pairs|pcall|print|rawequal|rawget|rawlen|rawset|require|select|setfenv|setmetatable|tonumber|tostring|type|unpack|xpcall)\\\\b(?!\\\\s*=(?!=))","name":"support.function.lua"},{"match":"(?<![^.]\\\\.|:)\\\\b(async)\\\\b(?!\\\\s*=(?!=))","name":"entity.name.tag.lua"},{"match":"(?<![^.]\\\\.|:)\\\\b(coroutine\\\\.(create|isyieldable|close|resume|running|status|wrap|yield)|string\\\\.(byte|char|dump|find|format|gmatch|gsub|len|lower|match|pack|packsize|rep|reverse|sub|unpack|upper)|table\\\\.(concat|create|insert|maxn|move|pack|remove|sort|unpack)|math\\\\.(abs|acos|asin|atan2?|ceil|cosh?|deg|exp|floor|fmod|frexp|ldexp|log|log10|max|min|modf|pow|rad|random|randomseed|sinh?|sqrt|tanh?|tointeger|type)|io\\\\.(close|flush|input|lines|open|output|popen|read|tmpfile|type|write)|os\\\\.(clock|date|difftime|execute|exit|getenv|remove|rename|setlocale|time|tmpname)|package\\\\.(loadlib|seeall|searchpath)|debug\\\\.(debug|[gs]etfenv|[gs]ethook|getinfo|[gs]etlocal|[gs]etmetatable|getregistry|[gs]etupvalue|[gs]etuservalue|set[Cc]stacklimit|traceback|upvalueid|upvaluejoin)|bit32\\\\.(arshift|band|bnot|bor|btest|bxor|extract|replace|lrotate|lshift|rrotate|rshift)|utf8\\\\.(char|codes|codepoint|len|offset))\\\\b(?!\\\\s*=(?!=))","name":"support.function.library.lua"},{"match":"\\\\b(\\\\|\\\\||&&|!)\\\\b","name":"keyword.operator.lua"},{"match":"\\\\b(and|or|not)\\\\b","name":"keyword.operator.logical.lua"},{"match":"\\\\b([A-Z_a-z][0-9A-Z_a-z]*)\\\\b(?=\\\\s*(?:[\\"'({]|\\\\[\\\\[))","name":"support.function.any-method.lua"},{"match":"\\\\b([A-Z_a-z][0-9A-Z_a-z]*)\\\\b(?=\\\\s*\\\\??:)","name":"entity.name.class.lua"},{"match":"(?<=[^.]\\\\.|:)\\\\b([A-Z_a-z][0-9A-Z_a-z]*)\\\\b(?!\\\\s*=\\\\s*\\\\b(function)\\\\b)","name":"entity.other.attribute.lua"},{"match":"\\\\b([A-Z_a-z][0-9A-Z_a-z]*)\\\\b(?!\\\\s*=\\\\s*\\\\b(function)\\\\b)","name":"variable.other.lua"},{"match":"\\\\b([A-Z_a-z][0-9A-Z_a-z]*)\\\\b(?=\\\\s*=\\\\s*\\\\b(function)\\\\b)","name":"entity.name.function.lua"},{"match":"[-#%*+/^]|==?|~=|!=|<=?|>=?|(?<!\\\\.)\\\\.{2}(?!\\\\.)","name":"keyword.operator.lua"}],"repository":{"comment":{"patterns":[{"begin":"(^[\\\\t ]+)?(?=--)","beginCaptures":{"1":{"name":"punctuation.whitespace.comment.leading.lua"}},"end":"(?!\\\\G)((?!^)[\\\\t ]+\\\\n)?","endCaptures":{"1":{"name":"punctuation.whitespace.comment.trailing.lua"}},"patterns":[{"begin":"--\\\\[(=*)\\\\[@@@","beginCaptures":{"0":{"name":"punctuation.definition.comment.begin.lua"}},"end":"(--)?]\\\\1]","endCaptures":{"0":{"name":"punctuation.definition.comment.end.lua"}},"name":"","patterns":[{"include":"source.lua"}]},{"begin":"--\\\\[(=*)\\\\[","beginCaptures":{"0":{"name":"punctuation.definition.comment.begin.lua"}},"end":"(--)?]\\\\1]","endCaptures":{"0":{"name":"punctuation.definition.comment.end.lua"}},"name":"comment.block.lua","patterns":[{"include":"#emmydoc"},{"include":"#ldoc_tag"}]},{"begin":"----","beginCaptures":{"0":{"name":"punctuation.definition.comment.lua"}},"end":"\\\\n","name":"comment.line.double-dash.lua"},{"begin":"---","beginCaptures":{"0":{"name":"punctuation.definition.comment.lua"}},"end":"\\\\n","name":"comment.line.double-dash.documentation.lua","patterns":[{"include":"#emmydoc"},{"include":"#ldoc_tag"}]},{"begin":"--","beginCaptures":{"0":{"name":"punctuation.definition.comment.lua"}},"end":"\\\\n","name":"comment.line.double-dash.lua","patterns":[{"include":"#ldoc_tag"}]}]},{"begin":"/\\\\*","beginCaptures":{"0":{"name":"punctuation.definition.comment.begin.lua"}},"end":"\\\\*/","endCaptures":{"0":{"name":"punctuation.definition.comment.end.lua"}},"name":"comment.block.lua","patterns":[{"include":"#emmydoc"},{"include":"#ldoc_tag"}]}]},"emmydoc":{"patterns":[{"begin":"(?<=---)[\\\\t ]*@class","beginCaptures":{"0":{"name":"storage.type.annotation.lua"}},"end":"(?=[\\\\n#@])","patterns":[{"match":"\\\\b([*A-Z_a-z][-*.0-9A-Z_a-z]*)","name":"support.class.lua"},{"match":"[,:]","name":"keyword.operator.lua"}]},{"begin":"(?<=---)[\\\\t ]*@enum","beginCaptures":{"0":{"name":"storage.type.annotation.lua"}},"end":"(?=[\\\\n#@])","patterns":[{"begin":"\\\\b([*A-Z_a-z][-*.0-9A-Z_a-z]*)","beginCaptures":{"0":{"name":"variable.lua"}},"end":"(?=\\\\n)"}]},{"begin":"(?<=---)[\\\\t ]*@type","beginCaptures":{"0":{"name":"storage.type.annotation.lua"}},"end":"(?=[\\\\n#@])","patterns":[{"include":"#emmydoc.type"}]},{"begin":"(?<=---)[\\\\t ]*@alias","beginCaptures":{"0":{"name":"storage.type.annotation.lua"}},"end":"(?=[\\\\n#@])","patterns":[{"begin":"\\\\b([*A-Z_a-z][-*.0-9A-Z_a-z]*)","beginCaptures":{"0":{"name":"variable.lua"}},"end":"(?=[\\\\n#])","patterns":[{"include":"#emmydoc.type"}]}]},{"begin":"(?<=---)[\\\\t ]*(@operator)\\\\s*(\\\\b[a-z]+)?","beginCaptures":{"1":{"name":"storage.type.annotation.lua"},"2":{"name":"support.function.library.lua"}},"end":"(?=[\\\\n#@])","patterns":[{"include":"#emmydoc.type"}]},{"begin":"(?<=---)[\\\\t ]*@cast","beginCaptures":{"0":{"name":"storage.type.annotation.lua"}},"end":"(?=[\\\\n#@])","patterns":[{"begin":"\\\\b([*A-Z_a-z][-*.0-9A-Z_a-z]*)","beginCaptures":{"0":{"name":"variable.other.lua"}},"end":"(?=\\\\n)","patterns":[{"include":"#emmydoc.type"},{"match":"([+-|])","name":"keyword.operator.lua"}]}]},{"begin":"(?<=---)[\\\\t ]*@param","beginCaptures":{"0":{"name":"storage.type.annotation.lua"}},"end":"(?=[\\\\n#@])","patterns":[{"begin":"\\\\b([A-Z_a-z][0-9A-Z_a-z]*)\\\\b(\\\\??)","beginCaptures":{"1":{"name":"entity.name.variable.lua"},"2":{"name":"keyword.operator.lua"}},"end":"(?=[\\\\n#])","patterns":[{"include":"#emmydoc.type"}]}]},{"begin":"(?<=---)[\\\\t ]*@return","beginCaptures":{"0":{"name":"storage.type.annotation.lua"}},"end":"(?=[\\\\n#@])","patterns":[{"match":"\\\\?","name":"keyword.operator.lua"},{"include":"#emmydoc.type"}]},{"begin":"(?<=---)[\\\\t ]*@field","beginCaptures":{"0":{"name":"storage.type.annotation.lua"}},"end":"(?=[\\\\n#@])","patterns":[{"begin":"(\\\\b([A-Z_a-z][0-9A-Z_a-z]*)\\\\b|(\\\\[))(\\\\??)","beginCaptures":{"2":{"name":"entity.name.variable.lua"},"3":{"name":"keyword.operator.lua"}},"end":"(?=[\\\\n#])","patterns":[{"include":"#string"},{"include":"#emmydoc.type"},{"match":"]","name":"keyword.operator.lua"}]}]},{"begin":"(?<=---)[\\\\t ]*@generic","beginCaptures":{"0":{"name":"storage.type.annotation.lua"}},"end":"(?=[\\\\n#@])","patterns":[{"begin":"\\\\b([A-Z_a-z][0-9A-Z_a-z]*)\\\\b","beginCaptures":{"0":{"name":"storage.type.generic.lua"}},"end":"(?=\\\\n)|(,)","endCaptures":{"0":{"name":"keyword.operator.lua"}},"patterns":[{"match":":","name":"keyword.operator.lua"},{"include":"#emmydoc.type"}]}]},{"begin":"(?<=---)[\\\\t ]*@vararg","beginCaptures":{"0":{"name":"storage.type.annotation.lua"}},"end":"(?=[\\\\n#@])","patterns":[{"include":"#emmydoc.type"}]},{"begin":"(?<=---)[\\\\t ]*@overload","beginCaptures":{"0":{"name":"storage.type.annotation.lua"}},"end":"(?=[\\\\n#@])","patterns":[{"include":"#emmydoc.type"}]},{"begin":"(?<=---)[\\\\t ]*@deprecated","beginCaptures":{"0":{"name":"storage.type.annotation.lua"}},"end":"(?=[\\\\n#@])"},{"begin":"(?<=---)[\\\\t ]*@meta","beginCaptures":{"0":{"name":"storage.type.annotation.lua"}},"end":"(?=[\\\\n#@])"},{"begin":"(?<=---)[\\\\t ]*@private","beginCaptures":{"0":{"name":"storage.type.annotation.lua"}},"end":"(?=[\\\\n#@])"},{"begin":"(?<=---)[\\\\t ]*@protected","beginCaptures":{"0":{"name":"storage.type.annotation.lua"}},"end":"(?=[\\\\n#@])"},{"begin":"(?<=---)[\\\\t ]*@package","beginCaptures":{"0":{"name":"storage.type.annotation.lua"}},"end":"(?=[\\\\n#@])"},{"begin":"(?<=---)[\\\\t ]*@version","beginCaptures":{"0":{"name":"storage.type.annotation.lua"}},"end":"(?=[\\\\n#@])","patterns":[{"match":"\\\\b(5\\\\.1|5\\\\.2|5\\\\.3|5\\\\.4|JIT)\\\\b","name":"support.class.lua"},{"match":"[,<>]","name":"keyword.operator.lua"}]},{"begin":"(?<=---)[\\\\t ]*@see","beginCaptures":{"0":{"name":"storage.type.annotation.lua"}},"end":"(?=[\\\\n#@])","patterns":[{"match":"\\\\b([*A-Z_a-z][-*.0-9A-Z_a-z]*)","name":"support.class.lua"},{"match":"#","name":"keyword.operator.lua"}]},{"begin":"(?<=---)[\\\\t ]*@diagnostic","beginCaptures":{"0":{"name":"storage.type.annotation.lua"}},"end":"(?=[\\\\n#@])","patterns":[{"begin":"([-0-9A-Z_a-z]+)[\\\\t ]*(:)?","beginCaptures":{"1":{"name":"keyword.other.unit"},"2":{"name":"keyword.operator.unit"}},"end":"(?=\\\\n)","patterns":[{"match":"\\\\b([*A-Z_a-z][-0-9A-Z_a-z]*)","name":"support.class.lua"},{"match":",","name":"keyword.operator.lua"}]}]},{"begin":"(?<=---)[\\\\t ]*@module","beginCaptures":{"0":{"name":"storage.type.annotation.lua"}},"end":"(?=[\\\\n#@])","patterns":[{"include":"#string"}]},{"match":"(?<=---)[\\\\t ]*@(async|nodiscard)","name":"storage.type.annotation.lua"},{"begin":"(?<=---)\\\\|\\\\s*[+>]?","beginCaptures":{"0":{"name":"storage.type.annotation.lua"}},"end":"(?=[\\\\n#@])","patterns":[{"include":"#string"}]}]},"emmydoc.type":{"patterns":[{"begin":"\\\\bfun\\\\b","beginCaptures":{"0":{"name":"keyword.control.lua"}},"end":"(?=[#\\\\s])","patterns":[{"match":"[](),:<>?\\\\[][\\\\t ]*","name":"keyword.operator.lua"},{"match":"([A-Z_a-z][-*.0-9A-Z_a-z]*)(?<!,)[\\\\t ]*(?=\\\\??:)","name":"entity.name.variable.lua"},{"include":"#emmydoc.type"},{"include":"#string"}]},{"match":"<[*A-Z_a-z][-*.0-9A-Z_a-z]*>","name":"storage.type.generic.lua"},{"match":"\\\\basync\\\\b","name":"entity.name.tag.lua"},{"match":"[,:?\`{|}][\\\\t ]*","name":"keyword.operator.lua"},{"begin":"(?=[\\"'*.A-\\\\[_a-z])","end":"(?=[#),:?|}\\\\s])","patterns":[{"match":"([-\\\\]*,.0-9<>A-\\\\[_a-z]+)(?<!,)[\\\\t ]*","name":"support.type.lua"},{"match":"(\\\\.\\\\.\\\\.)[\\\\t ]*","name":"constant.language.lua"},{"include":"#string"}]}]},"escaped_char":{"patterns":[{"match":"\\\\\\\\[\\\\n\\"'\\\\\\\\abfnrtv]","name":"constant.character.escape.lua"},{"match":"\\\\\\\\z[\\\\t\\\\n ]*","name":"constant.character.escape.lua"},{"match":"\\\\\\\\\\\\d{1,3}","name":"constant.character.escape.byte.lua"},{"match":"\\\\\\\\x\\\\h\\\\h","name":"constant.character.escape.byte.lua"},{"match":"\\\\\\\\u\\\\{\\\\h+}","name":"constant.character.escape.unicode.lua"},{"match":"\\\\\\\\.","name":"invalid.illegal.character.escape.lua"}]},"ldoc_tag":{"captures":{"1":{"name":"punctuation.definition.block.tag.ldoc"},"2":{"name":"storage.type.class.ldoc"}},"match":"\\\\G[\\\\t ]*(@)(alias|annotation|author|charset|class|classmod|comment|constructor|copyright|description|example|export|factory|field|file|fixme|function|include|lfunction|license|local|module|name|param|pragma|private|raise|release|return|script|section|see|set|static|submodule|summary|tfield|thread|tparam|treturn|todo|topic|type|usage|warning|within)\\\\b"},"string":{"patterns":[{"begin":"'","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.lua"}},"end":"'[\\\\t ]*|(?=\\\\n)","endCaptures":{"0":{"name":"punctuation.definition.string.end.lua"}},"name":"string.quoted.single.lua","patterns":[{"include":"#escaped_char"}]},{"begin":"\\"","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.lua"}},"end":"\\"[\\\\t ]*|(?=\\\\n)","endCaptures":{"0":{"name":"punctuation.definition.string.end.lua"}},"name":"string.quoted.double.lua","patterns":[{"include":"#escaped_char"}]},{"begin":"\`","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.lua"}},"end":"\`[\\\\t ]*|(?=\\\\n)","endCaptures":{"0":{"name":"punctuation.definition.string.end.lua"}},"name":"string.quoted.double.lua"},{"begin":"(?<=\\\\.cdef)\\\\s*(\\\\[(=*)\\\\[)","beginCaptures":{"0":{"name":"string.quoted.other.multiline.lua"},"1":{"name":"punctuation.definition.string.begin.lua"}},"contentName":"meta.embedded.lua","end":"(]\\\\2])[\\\\t ]*","endCaptures":{"0":{"name":"string.quoted.other.multiline.lua"},"1":{"name":"punctuation.definition.string.end.lua"}},"patterns":[{"include":"source.c"}]},{"begin":"(?<!--)\\\\[(=*)\\\\[","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.lua"}},"end":"]\\\\1][\\\\t ]*","endCaptures":{"0":{"name":"punctuation.definition.string.end.lua"}},"name":"string.quoted.other.multiline.lua"}]}},"scopeName":"source.lua","embeddedLangs":["c"]}`)),n=[...e,t];export{n as default};
|
dist/assets/nginx-B19-5Nbj.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import e from"./lua-Cr0_1Hr-.js";var t=Object.freeze(JSON.parse(`{"displayName":"Nginx","fileTypes":["conf.erb","conf","ngx","nginx.conf","mime.types","fastcgi_params","scgi_params","uwsgi_params"],"foldingStartMarker":"\\\\{\\\\s*$","foldingStopMarker":"^\\\\s*}","name":"nginx","patterns":[{"match":"#.*","name":"comment.line.number-sign"},{"begin":"\\\\b((?:content|rewrite|access|init_worker|init|set|log|balancer|ssl_(?:client_hello|session_fetch|certificate))_by_lua(?:_block)?)\\\\s*\\\\{","beginCaptures":{"1":{"name":"storage.type.directive.context.nginx"}},"contentName":"meta.embedded.block.lua","end":"}","name":"meta.context.lua.nginx","patterns":[{"include":"source.lua"}]},{"begin":"\\\\b((?:content|rewrite|access|init_worker|init|set|log|balancer|ssl_(?:client_hello|session_fetch|certificate))_by_lua)\\\\s*'","beginCaptures":{"1":{"name":"storage.type.directive.context.nginx"}},"contentName":"meta.embedded.block.lua","end":"'","name":"meta.context.lua.nginx","patterns":[{"include":"source.lua"}]},{"begin":"\\\\b(events) +\\\\{","beginCaptures":{"1":{"name":"storage.type.directive.context.nginx"}},"end":"}","name":"meta.context.events.nginx","patterns":[{"include":"$self"}]},{"begin":"\\\\b(http) +\\\\{","beginCaptures":{"1":{"name":"storage.type.directive.context.nginx"}},"end":"}","name":"meta.context.http.nginx","patterns":[{"include":"$self"}]},{"begin":"\\\\b(mail) +\\\\{","beginCaptures":{"1":{"name":"storage.type.directive.context.nginx"}},"end":"}","name":"meta.context.mail.nginx","patterns":[{"include":"$self"}]},{"begin":"\\\\b(stream) +\\\\{","beginCaptures":{"1":{"name":"storage.type.directive.context.nginx"}},"end":"}","name":"meta.context.stream.nginx","patterns":[{"include":"$self"}]},{"begin":"\\\\b(server) +\\\\{","beginCaptures":{"1":{"name":"storage.type.directive.context.nginx"}},"end":"}","name":"meta.context.server.nginx","patterns":[{"include":"$self"}]},{"begin":"\\\\b(location) +(\\\\^?~\\\\*?|=) +(.*?)\\\\{","beginCaptures":{"1":{"name":"storage.type.directive.context.nginx"},"2":{"name":"keyword.operator.nginx"},"3":{"name":"string.regexp.nginx"}},"end":"}","name":"meta.context.location.nginx","patterns":[{"include":"$self"}]},{"begin":"\\\\b(location) +(.*?)\\\\{","beginCaptures":{"1":{"name":"storage.type.directive.context.nginx"},"2":{"name":"entity.name.context.location.nginx"}},"end":"}","name":"meta.context.location.nginx","patterns":[{"include":"$self"}]},{"begin":"\\\\b(limit_except) +\\\\{","beginCaptures":{"1":{"name":"storage.type.directive.context.nginx"}},"end":"}","name":"meta.context.limit_except.nginx","patterns":[{"include":"$self"}]},{"begin":"\\\\b(if) +\\\\(","beginCaptures":{"1":{"name":"keyword.control.nginx"}},"end":"\\\\)","name":"meta.context.if.nginx","patterns":[{"include":"#if_condition"}]},{"begin":"\\\\b(upstream) +(.*?)\\\\{","beginCaptures":{"1":{"name":"storage.type.directive.context.nginx"},"2":{"name":"entity.name.context.location.nginx"}},"end":"}","name":"meta.context.upstream.nginx","patterns":[{"include":"$self"}]},{"begin":"\\\\b(types) +\\\\{","beginCaptures":{"1":{"name":"storage.type.directive.context.nginx"}},"end":"}","name":"meta.context.types.nginx","patterns":[{"include":"$self"}]},{"begin":"\\\\b(map) +(\\\\$)([0-9A-Z_a-z]+) +(\\\\$)([0-9A-Z_a-z]+) *\\\\{","beginCaptures":{"1":{"name":"storage.type.directive.context.nginx"},"2":{"name":"punctuation.definition.variable.nginx"},"3":{"name":"variable.parameter.nginx"},"4":{"name":"punctuation.definition.variable.nginx"},"5":{"name":"variable.other.nginx"}},"end":"}","name":"meta.context.map.nginx","patterns":[{"include":"#values"},{"match":";","name":"punctuation.terminator.nginx"},{"match":"#.*","name":"comment.line.number-sign"}]},{"begin":"\\\\{","end":"}","name":"meta.block.nginx","patterns":[{"include":"$self"}]},{"begin":"\\\\b(return)\\\\b","beginCaptures":{"1":{"name":"keyword.control.nginx"}},"end":";","patterns":[{"include":"#values"}]},{"begin":"\\\\b(rewrite)\\\\s+","beginCaptures":{"1":{"name":"keyword.directive.nginx"}},"end":"(last|break|redirect|permanent)?(;)","endCaptures":{"1":{"name":"keyword.other.nginx"},"2":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"\\\\b(server)\\\\s+","beginCaptures":{"1":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"1":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#server_parameters"}]},{"begin":"\\\\b(internal|empty_gif|f4f|flv|hls|mp4|break|status|stub_status|ip_hash|ntlm|least_conn|upstream_conf|least_conn|zone_sync)\\\\b","beginCaptures":{"1":{"name":"keyword.directive.nginx"}},"end":"(;|$)","endCaptures":{"1":{"name":"punctuation.terminator.nginx"}}},{"begin":"([\\"'\\\\s]|^)(accept_)(mutex(?:|_delay))([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(debug_)(connection|points)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(error_)(log|page)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(ssl_)(engine|buffer_size|certificate|certificate_key|ciphers|client_certificate|conf_command|crl|dhparam|early_data|ecdh_curve|ocsp|ocsp_cache|ocsp_responder|password_file|prefer_server_ciphers|protocols|reject_handshake|session_cache|session_ticket_key|session_tickets|session_timeout|stapling|stapling_file|stapling_responder|stapling_verify|trusted_certificate|verify_client|verify_depth|alpn|handshake_timeout|preread)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(worker_)(aio_requests|connections|cpu_affinity|priority|processes|rlimit_core|rlimit_nofile|shutdown_timeout)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(auth_)(delay|basic|basic_user_file|jwt|jwt_claim_set|jwt_header_set|jwt_key_cache|jwt_key_file|jwt_key_request|jwt_leeway|jwt_type|jwt_require|request|request_set|http|http_header|http_pass_client_cert|http_timeout)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(client_)(body_buffer_size|body_in_file_only|body_in_single_buffer|body_temp_path|body_timeout|header_buffer_size|header_timeout|max_body_size)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(keepalive_)(disable|requests|time|timeout)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(limit_)(rate|rate_after|conn|conn_dry_run|conn_log_level|conn_status|conn_zone|zone|req|req_dry_run|req_log_level|req_status|req_zone)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(lingering_)(close|time|timeout)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(log_)(not_found|subrequest|format)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(max_)(ranges|errors)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(msie_)(padding|refresh)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(open_)(file_cache|file_cache_errors|file_cache_min_uses|file_cache_valid|log_file_cache)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(send_)(lowat|timeout)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(server_)(name|name_in_redirect|names_hash_bucket_size|names_hash_max_size|tokens)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(tcp_)(no(?:delay|push))([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(types_)(hash_(?:bucket|max)_size)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(variables_)(hash_(?:bucket|max)_size)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(add_)(before_body|after_body|header|trailer)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(status_)(zone|format)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(autoindex_)(exact_size|format|localtime)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(ancient_)(browser(?:|_value))([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(modern_)(browser(?:|_value))([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(charset_)(map|types)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(dav_)(access|methods)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(fastcgi_)(bind|buffer_size|buffering|buffers|busy_buffers_size|cache|cache_background_update|cache_bypass|cache_key|cache_lock|cache_lock_age|cache_lock_timeout|cache_max_range_offset|cache_methods|cache_min_uses|cache_path|cache_purge|cache_revalidate|cache_use_stale|cache_valid|catch_stderr|connect_timeout|force_ranges|hide_header|ignore_client_abort|ignore_headers|index|intercept_errors|keep_conn|limit_rate|max_temp_file_size|next_upstream|next_upstream_timeout|next_upstream_tries|no_cache|param|pass|pass_header|pass_request_body|pass_request_headers|read_timeout|request_buffering|send_lowat|send_timeout|socket_keepalive|split_path_info|store|store_access|temp_file_write_size|temp_path)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(geoip_)(country|city|org|proxy|proxy_recursive)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(grpc_)(bind|buffer_size|connect_timeout|hide_header|ignore_headers|intercept_errors|next_upstream|next_upstream_timeout|next_upstream_tries|pass|pass_header|read_timeout|send_timeout|set_header|socket_keepalive|ssl_certificate|ssl_certificate_key|ssl_ciphers|ssl_conf_command|ssl_crl|ssl_name|ssl_password_file|ssl_protocols|ssl_server_name|ssl_session_reuse|ssl_trusted_certificate|ssl_verify|ssl_verify_depth)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(gzip_)(buffers|comp_level|disable|http_version|min_length|proxied|types|vary|static)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(hls_)(buffers|forward_args|fragment|mp4_buffer_size|mp4_max_buffer_size)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(image_)(filter(?:|_buffer|_interlace|_jpeg_quality|_sharpen|_transparency|_webp_quality))([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(map_)(hash_(?:bucket|max)_size)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(memcached_)(bind|buffer_size|connect_timeout|gzip_flag|next_upstream|next_upstream_timeout|next_upstream_tries|pass|read_timeout|send_timeout|socket_keepalive)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(mp4_)(buffer_size|max_buffer_size|limit_rate|limit_rate_after|start_key_frame)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(perl_)(modules|require|set)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(proxy_)(bind|buffer_size|buffering|buffers|busy_buffers_size|cache|cache_background_update|cache_bypass|cache_convert_head|cache_key|cache_lock|cache_lock_age|cache_lock_timeout|cache_max_range_offset|cache_methods|cache_min_uses|cache_path|cache_purge|cache_revalidate|cache_use_stale|cache_valid|connect_timeout|cookie_domain|cookie_flags|cookie_path|force_ranges|headers_hash_bucket_size|headers_hash_max_size|hide_header|http_version|ignore_client_abort|ignore_headers|intercept_errors|limit_rate|max_temp_file_size|method|next_upstream|next_upstream_timeout|next_upstream_tries|no_cache|pass|pass_header|pass_request_body|pass_request_headers|read_timeout|redirect|request_buffering|send_lowat|send_timeout|set_body|set_header|socket_keepalive|ssl_certificate|ssl_certificate_key|ssl_ciphers|ssl_conf_command|ssl_crl|ssl_name|ssl_password_file|ssl_protocols|ssl_server_name|ssl_session_reuse|ssl_trusted_certificate|ssl_verify|ssl_verify_depth|store|store_access|temp_file_write_size|temp_path|buffer|pass_error_message|protocol|smtp_auth|timeout|protocol_timeout|download_rate|half_close|requests|responses|session_drop|ssl|upload_rate)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(real_)(ip_(?:header|recursive))([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(referer_)(hash_(?:bucket|max)_size)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(scgi_)(bind|buffer_size|buffering|buffers|busy_buffers_size|cache|cache_background_update|cache_bypass|cache_key|cache_lock|cache_lock_age|cache_lock_timeout|cache_max_range_offset|cache_methods|cache_min_uses|cache_path|cache_purge|cache_revalidate|cache_use_stale|cache_valid|connect_timeout|force_ranges|hide_header|ignore_client_abort|ignore_headers|intercept_errors|limit_rate|max_temp_file_size|next_upstream|next_upstream_timeout|next_upstream_tries|no_cache|param|pass|pass_header|pass_request_body|pass_request_headers|read_timeout|request_buffering|send_timeout|socket_keepalive|store|store_access|temp_file_write_size|temp_path)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(secure_)(link(?:|_md5|_secret))([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(session_)(log(?:|_format|_zone))([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(ssi_)(last_modified|min_file_chunk|silent_errors|types|value_length)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(sub_)(filter(?:|_last_modified|_once|_types))([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(health_)(check(?:|_timeout))([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(userid_)(domain|expires|flags|mark|name|p3p|path|service)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(uwsgi_)(bind|buffer_size|buffering|buffers|busy_buffers_size|cache|cache_background_update|cache_bypass|cache_key|cache_lock|cache_lock_age|cache_lock_timeout|cache_max_range_offset|cache_methods|cache_min_uses|cache_path|cache_purge|cache_revalidate|cache_use_stale|cache_valid|connect_timeout|force_ranges|hide_header|ignore_client_abort|ignore_headers|intercept_errors|limit_rate|max_temp_file_size|modifier1|modifier2|next_upstream|next_upstream_timeout|next_upstream_tries|no_cache|param|pass|pass_header|pass_request_body|pass_request_headers|read_timeout|request_buffering|send_timeout|socket_keepalive|ssl_certificate|ssl_certificate_key|ssl_ciphers|ssl_conf_command|ssl_crl|ssl_name|ssl_password_file|ssl_protocols|ssl_server_name|ssl_session_reuse|ssl_trusted_certificate|ssl_verify|ssl_verify_depth|store|store_access|temp_file_write_size|temp_path)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(http2_)(body_preread_size|chunk_size|idle_timeout|max_concurrent_pushes|max_concurrent_streams|max_field_size|max_header_size|max_requests|push|push_preload|recv_buffer_size|recv_timeout)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(http3_)(hq|max_concurrent_streams|stream_buffer_size)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(quic_)(active_connection_id_limit|bpf|gso|host_key|retry)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(xslt_)(last_modified|param|string_param|stylesheet|types)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(imap_)(auth|capabilities|client_buffer)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(pop3_)(auth|capabilities)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(smtp_)(auth|capabilities|client_buffer|greeting_delay)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(preread_)(buffer_size|timeout)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(mqtt_)(preread|buffers|rewrite_buffer_size|set_connect)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(zone_)(sync_(?:buffers|connect_retry_interval|connect_timeout|interval|recv_buffer_size|server|ssl|ssl_certificate|ssl_certificate_key|ssl_ciphers|ssl_conf_command|ssl_crl|ssl_name|ssl_password_file|ssl_protocols|ssl_server_name|ssl_trusted_certificate|ssl_verify|ssl_verify_depth|timeout))([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(otel_)(exporter|service_name|trace|trace_context|span_name|span_attr)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(js_)(body_filter|content|fetch_buffer_size|fetch_ciphers|fetch_max_response_buffer_size|fetch_protocols|fetch_timeout|fetch_trusted_certificate|fetch_verify|fetch_verify_depth|header_filter|import|include|path|periodic|preload_object|set|shared_dict_zone|var|access|filter|preread)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"},"4":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"([\\"'\\\\s]|^)(daemon|env|include|pid|user??|aio|alias|directio|etag|listen|resolver|root|satisfy|sendfile|allow|deny|api|autoindex|charset|geo|gunzip|gzip|expires|index|keyval|mirror|perl|set|slice|ssi|ssl|zone|state|hash|keepalive|queue|random|sticky|match|userid|http2|http3|protocol|timeout|xclient|starttls|mqtt|load_module|lock_file|master_process|multi_accept|pcre_jit|thread_pool|timer_resolution|working_directory|absolute_redirect|aio_write|chunked_transfer_encoding|connection_pool_size|default_type|directio_alignment|disable_symlinks|if_modified_since|ignore_invalid_headers|large_client_header_buffers|merge_slashes|output_buffers|port_in_redirect|postpone_output|read_ahead|recursive_error_pages|request_pool_size|reset_timedout_connection|resolver_timeout|sendfile_max_chunk|subrequest_output_buffer_size|try_files|underscores_in_headers|addition_types|override_charset|source_charset|create_full_put_path|min_delete_depth|f4f_buffer_size|gunzip_buffers|internal_redirect|keyval_zone|access_log|mirror_request_body|random_index|set_real_ip_from|valid_referers|rewrite_log|uninitialized_variable_warn|split_clients|least_time|sticky_cookie_insert|xml_entities|google_perftools_profiles)([\\"'\\\\s]|$)","beginCaptures":{"1":{"name":"keyword.directive.nginx"},"2":{"name":"keyword.directive.nginx"},"3":{"name":"keyword.directive.nginx"}},"end":";","endCaptures":{"0":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"\\\\b([0-9A-Z_a-z]+)\\\\s+","beginCaptures":{"1":{"name":"keyword.directive.unknown.nginx"}},"end":"(;|$)","endCaptures":{"1":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]},{"begin":"\\\\b([a-z]+/[-+.0-9A-Za-z]+)\\\\b","beginCaptures":{"1":{"name":"constant.other.mediatype.nginx"}},"end":"(;)","endCaptures":{"1":{"name":"punctuation.terminator.nginx"}},"patterns":[{"include":"#values"}]}],"repository":{"if_condition":{"patterns":[{"include":"#variables"},{"match":"!?~\\\\*?\\\\s","name":"keyword.operator.nginx"},{"match":"!?-[defx]\\\\s","name":"keyword.operator.nginx"},{"match":"!?=[^=]","name":"keyword.operator.nginx"},{"include":"#regexp_and_string"}]},"regexp_and_string":{"patterns":[{"match":"\\\\^.*?\\\\$","name":"string.regexp.nginx"},{"begin":"\\"","end":"\\"","name":"string.quoted.double.nginx","patterns":[{"match":"\\\\\\\\[\\"'\\\\\\\\nt]","name":"constant.character.escape.nginx"},{"include":"#variables"}]},{"begin":"'","end":"'","name":"string.quoted.single.nginx","patterns":[{"match":"\\\\\\\\[\\"'\\\\\\\\nt]","name":"constant.character.escape.nginx"},{"include":"#variables"}]}]},"server_parameters":{"patterns":[{"captures":{"1":{"name":"variable.parameter.nginx"},"2":{"name":"keyword.operator.nginx"},"3":{"name":"constant.numeric.nginx"}},"match":"(?:^|\\\\s)(weight|max_conn|max_fails|fail_timeout|slow_start)(=)(\\\\d[.\\\\d]*[BDGHKMSTbdghkmst]?)(?:[;\\\\s]|$)"},{"include":"#values"}]},"values":{"patterns":[{"include":"#variables"},{"match":"#.*","name":"comment.line.number-sign"},{"captures":{"1":{"name":"constant.numeric.nginx"}},"match":"(?<=\\\\G|\\\\s)(=?[0-9][.0-9]*[BDGHKMSTbdghkmst]?)(?=[\\\\t ;])"},{"match":"(?<=\\\\G|\\\\s)(on|off|true|false)(?=[\\\\t ;])","name":"constant.language.nginx"},{"match":"(?<=\\\\G|\\\\s)(kqueue|rtsig|epoll|/dev/poll|select|poll|eventport|max|all|default_server|default|main|crit|error|debug|warn|notice|last)(?=[\\\\t ;])","name":"constant.language.nginx"},{"match":"\\\\\\\\.* |~\\\\*?|!~\\\\*?","name":"keyword.operator.nginx"},{"include":"#regexp_and_string"}]},"variables":{"patterns":[{"captures":{"1":{"name":"punctuation.definition.variable.nginx"},"2":{"name":"variable.other.nginx"}},"match":"(\\\\$)([0-9A-Z_a-z]+)\\\\b"},{"captures":{"1":{"name":"punctuation.definition.variable.nginx"},"2":{"name":"variable.other.nginx"},"3":{"name":"punctuation.definition.variable.nginx"}},"match":"(\\\\$\\\\{)([0-9A-Z_a-z]+)(})"}]}},"scopeName":"source.nginx","embeddedLangs":["lua"]}`)),n=[...e,t];export{n as default};
|
dist/assets/perl-CPcQPXT6.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import e from"./sql-BsFa4tDR.js";import t from"./css-BsVw1vtW.js";import n from"./javascript-BgS3c2Ky.js";import r from"./html-BY76lXLH.js";import i from"./xml-yX2vS4f7.js";var a=Object.freeze(JSON.parse(`{"displayName":"Perl","name":"perl","patterns":[{"include":"#line_comment"},{"begin":"^(?==[A-Za-z]+)","end":"^(=cut\\\\b.*)$","endCaptures":{"1":{"patterns":[{"include":"#pod"}]}},"name":"comment.block.documentation.perl","patterns":[{"include":"#pod"}]},{"include":"#variable"},{"applyEndPatternLast":1,"begin":"\\\\b(?=qr\\\\s*[^\\\\s\\\\w])","end":"((([acdegil-prsux]*)))(?=(\\\\s+\\\\S|\\\\s*[#),;{}]|\\\\s*$))","endCaptures":{"1":{"name":"string.regexp.compile.perl"},"2":{"name":"punctuation.definition.string.perl"},"3":{"name":"keyword.control.regexp-option.perl"}},"patterns":[{"begin":"(qr)\\\\s*\\\\{","captures":{"0":{"name":"punctuation.definition.string.perl"},"1":{"name":"support.function.perl"}},"end":"}","name":"string.regexp.compile.nested_braces.perl","patterns":[{"include":"#escaped_char"},{"include":"#variable"},{"include":"#nested_braces_interpolated"}]},{"begin":"(qr)\\\\s*\\\\[","captures":{"0":{"name":"punctuation.definition.string.perl"},"1":{"name":"support.function.perl"}},"end":"]","name":"string.regexp.compile.nested_brackets.perl","patterns":[{"include":"#escaped_char"},{"include":"#variable"},{"include":"#nested_brackets_interpolated"}]},{"begin":"(qr)\\\\s*<","captures":{"0":{"name":"punctuation.definition.string.perl"},"1":{"name":"support.function.perl"}},"end":">","name":"string.regexp.compile.nested_ltgt.perl","patterns":[{"include":"#escaped_char"},{"include":"#variable"},{"include":"#nested_ltgt_interpolated"}]},{"begin":"(qr)\\\\s*\\\\(","captures":{"0":{"name":"punctuation.definition.string.perl"},"1":{"name":"support.function.perl"}},"end":"\\\\)","name":"string.regexp.compile.nested_parens.perl","patterns":[{"match":"\\\\$(?=[^'(<\\\\[\\\\\\\\{\\\\s\\\\w])"},{"include":"#escaped_char"},{"include":"#variable"},{"include":"#nested_parens_interpolated"}]},{"begin":"(qr)\\\\s*'","captures":{"0":{"name":"punctuation.definition.string.perl"},"1":{"name":"support.function.perl"}},"end":"'","name":"string.regexp.compile.single-quote.perl","patterns":[{"include":"#escaped_char"}]},{"begin":"(qr)\\\\s*([^'(<\\\\[{\\\\s\\\\w])","captures":{"0":{"name":"punctuation.definition.string.perl"},"1":{"name":"support.function.perl"}},"end":"\\\\2","name":"string.regexp.compile.simple-delimiter.perl","patterns":[{"match":"\\\\$(?=[^'(<\\\\[{\\\\s\\\\w])","name":"keyword.control.anchor.perl"},{"include":"#escaped_char"},{"include":"#variable"},{"include":"#nested_parens_interpolated"}]}]},{"applyEndPatternLast":1,"begin":"(?<![-+{])\\\\b(?=m\\\\s*[^0-9A-Za-z\\\\s])","end":"((([acdegil-prsux]*)))(?=(\\\\s+\\\\S|\\\\s*[#),;{}]|\\\\s*$))","endCaptures":{"1":{"name":"string.regexp.find-m.perl"},"2":{"name":"punctuation.definition.string.perl"},"3":{"name":"keyword.control.regexp-option.perl"}},"patterns":[{"begin":"(m)\\\\s*\\\\{","captures":{"0":{"name":"punctuation.definition.string.perl"},"1":{"name":"support.function.perl"}},"end":"}","name":"string.regexp.find-m.nested_braces.perl","patterns":[{"include":"#escaped_char"},{"include":"#variable"},{"include":"#nested_braces_interpolated"}]},{"begin":"(m)\\\\s*\\\\[","captures":{"0":{"name":"punctuation.definition.string.perl"},"1":{"name":"support.function.perl"}},"end":"]","name":"string.regexp.find-m.nested_brackets.perl","patterns":[{"include":"#escaped_char"},{"include":"#variable"},{"include":"#nested_brackets_interpolated"}]},{"begin":"(m)\\\\s*<","captures":{"0":{"name":"punctuation.definition.string.perl"},"1":{"name":"support.function.perl"}},"end":">","name":"string.regexp.find-m.nested_ltgt.perl","patterns":[{"include":"#escaped_char"},{"include":"#variable"},{"include":"#nested_ltgt_interpolated"}]},{"begin":"(m)\\\\s*\\\\(","captures":{"0":{"name":"punctuation.definition.string.perl"},"1":{"name":"support.function.perl"}},"end":"\\\\)","name":"string.regexp.find-m.nested_parens.perl","patterns":[{"include":"#escaped_char"},{"include":"#variable"},{"include":"#nested_parens_interpolated"}]},{"begin":"(m)\\\\s*'","captures":{"0":{"name":"punctuation.definition.string.perl"},"1":{"name":"support.function.perl"}},"end":"'","name":"string.regexp.find-m.single-quote.perl","patterns":[{"include":"#escaped_char"}]},{"begin":"\\\\G(?<![-+{])(m)(?!_)\\\\s*([^'(0-9<A-\\\\[a-{\\\\s])","captures":{"0":{"name":"punctuation.definition.string.perl"},"1":{"name":"support.function.perl"}},"end":"\\\\2","name":"string.regexp.find-m.simple-delimiter.perl","patterns":[{"match":"\\\\$(?=[^'(0-9<A-\\\\[a-{\\\\s])","name":"keyword.control.anchor.perl"},{"include":"#escaped_char"},{"include":"#variable"},{"begin":"\\\\[","beginCaptures":{"1":{"name":"punctuation.definition.character-class.begin.perl"}},"end":"]","endCaptures":{"1":{"name":"punctuation.definition.character-class.end.perl"}},"name":"constant.other.character-class.set.perl","patterns":[{"match":"\\\\$(?=[^'(<\\\\[{\\\\s\\\\w])","name":"keyword.control.anchor.perl"},{"include":"#escaped_char"}]},{"include":"#nested_parens_interpolated"}]}]},{"applyEndPatternLast":1,"begin":"\\\\b(?=(?<!&)(s)(\\\\s+\\\\S|\\\\s*[(),;<\\\\[{}]|$))","end":"((([acdegil-prsux]*)))(?=(\\\\s+\\\\S|\\\\s*[]),;>{}]|\\\\s*$))","endCaptures":{"1":{"name":"string.regexp.replace.perl"},"2":{"name":"punctuation.definition.string.perl"},"3":{"name":"keyword.control.regexp-option.perl"}},"patterns":[{"begin":"(s)\\\\s*\\\\{","captures":{"0":{"name":"punctuation.definition.string.perl"},"1":{"name":"support.function.perl"}},"end":"}","name":"string.regexp.nested_braces.perl","patterns":[{"include":"#escaped_char"},{"include":"#nested_braces"}]},{"begin":"(s)\\\\s*\\\\[","captures":{"0":{"name":"punctuation.definition.string.perl"},"1":{"name":"support.function.perl"}},"end":"]","name":"string.regexp.nested_brackets.perl","patterns":[{"include":"#escaped_char"},{"include":"#nested_brackets"}]},{"begin":"(s)\\\\s*<","captures":{"0":{"name":"punctuation.definition.string.perl"},"1":{"name":"support.function.perl"}},"end":">","name":"string.regexp.nested_ltgt.perl","patterns":[{"include":"#escaped_char"},{"include":"#nested_ltgt"}]},{"begin":"(s)\\\\s*\\\\(","captures":{"0":{"name":"punctuation.definition.string.perl"},"1":{"name":"support.function.perl"}},"end":"\\\\)","name":"string.regexp.nested_parens.perl","patterns":[{"include":"#escaped_char"},{"include":"#nested_parens"}]},{"begin":"\\\\{","captures":{"0":{"name":"punctuation.definition.string.perl"}},"end":"}","name":"string.regexp.format.nested_braces.perl","patterns":[{"include":"#escaped_char"},{"include":"#variable"},{"include":"#nested_braces_interpolated"}]},{"begin":"\\\\[","captures":{"0":{"name":"punctuation.definition.string.perl"}},"end":"]","name":"string.regexp.format.nested_brackets.perl","patterns":[{"include":"#escaped_char"},{"include":"#variable"},{"include":"#nested_brackets_interpolated"}]},{"begin":"<","captures":{"0":{"name":"punctuation.definition.string.perl"}},"end":">","name":"string.regexp.format.nested_ltgt.perl","patterns":[{"include":"#escaped_char"},{"include":"#variable"},{"include":"#nested_ltgt_interpolated"}]},{"begin":"\\\\(","captures":{"0":{"name":"punctuation.definition.string.perl"}},"end":"\\\\)","name":"string.regexp.format.nested_parens.perl","patterns":[{"include":"#escaped_char"},{"include":"#variable"},{"include":"#nested_parens_interpolated"}]},{"begin":"'","captures":{"0":{"name":"punctuation.definition.string.perl"}},"end":"'","name":"string.regexp.format.single_quote.perl","patterns":[{"match":"\\\\\\\\['\\\\\\\\]","name":"constant.character.escape.perl"}]},{"begin":"([^(;<\\\\[{\\\\s\\\\w])","captures":{"0":{"name":"punctuation.definition.string.perl"}},"end":"\\\\1","name":"string.regexp.format.simple_delimiter.perl","patterns":[{"include":"#escaped_char"},{"include":"#variable"}]},{"match":"\\\\s+"}]},{"begin":"\\\\b(?=s([^(0-9<A-\\\\[a-{\\\\s]).*\\\\1([acdegil-prsux]*)([),;}]|\\\\s+))","end":"((([acdegil-prsux]*)))(?=([),;}]|\\\\s+|\\\\s*$))","endCaptures":{"1":{"name":"string.regexp.replace.perl"},"2":{"name":"punctuation.definition.string.perl"},"3":{"name":"keyword.control.regexp-option.perl"}},"patterns":[{"begin":"(s\\\\s*)([^(0-9<A-\\\\[a-{\\\\s])","captures":{"0":{"name":"punctuation.definition.string.perl"},"1":{"name":"support.function.perl"}},"end":"(?=\\\\2)","name":"string.regexp.replaceXXX.simple_delimiter.perl","patterns":[{"include":"#escaped_char"}]},{"begin":"'","captures":{"0":{"name":"punctuation.definition.string.perl"}},"end":"'","name":"string.regexp.replaceXXX.format.single_quote.perl","patterns":[{"match":"\\\\\\\\['\\\\\\\\]","name":"constant.character.escape.perl.perl"}]},{"begin":"([^(0-9<A-\\\\[a-{\\\\s])","captures":{"0":{"name":"punctuation.definition.string.perl"}},"end":"\\\\1","name":"string.regexp.replaceXXX.format.simple_delimiter.perl","patterns":[{"include":"#escaped_char"},{"include":"#variable"}]}]},{"begin":"\\\\b(?=(?<!\\\\\\\\)s\\\\s*([^(<>\\\\[{\\\\s\\\\w]))","end":"((([acdegilmoprsu]*x[acdegilmoprsu]*)))\\\\b","endCaptures":{"1":{"name":"string.regexp.replace.perl"},"2":{"name":"punctuation.definition.string.perl"},"3":{"name":"keyword.control.regexp-option.perl"}},"patterns":[{"begin":"(s)\\\\s*(.)","captures":{"0":{"name":"punctuation.definition.string.perl"},"1":{"name":"support.function.perl"}},"end":"(?=\\\\2)","name":"string.regexp.replace.extended.simple_delimiter.perl","patterns":[{"include":"#escaped_char"}]},{"begin":"'","captures":{"0":{"name":"punctuation.definition.string.perl"}},"end":"'(?=[acdegilmoprsu]*x[acdegilmoprsu]*)\\\\b","name":"string.regexp.replace.extended.simple_delimiter.perl","patterns":[{"include":"#escaped_char"}]},{"begin":"(.)","captures":{"0":{"name":"punctuation.definition.string.perl"}},"end":"\\\\1(?=[acdegilmoprsu]*x[acdegilmoprsu]*)\\\\b","name":"string.regexp.replace.extended.simple_delimiter.perl","patterns":[{"include":"#escaped_char"},{"include":"#variable"}]}]},{"begin":"(?<=[\\\\&({|~]|if|unless|^)\\\\s*((/))","beginCaptures":{"1":{"name":"string.regexp.find.perl"},"2":{"name":"punctuation.definition.string.perl"}},"contentName":"string.regexp.find.perl","end":"((\\\\1([acdegil-prsux]*)))(?=(\\\\s+\\\\S|\\\\s*[#),;{}]|\\\\s*$))","endCaptures":{"1":{"name":"string.regexp.find.perl"},"2":{"name":"punctuation.definition.string.perl"},"3":{"name":"keyword.control.regexp-option.perl"}},"patterns":[{"match":"\\\\$(?=/)","name":"keyword.control.anchor.perl"},{"include":"#escaped_char"},{"include":"#variable"}]},{"captures":{"1":{"name":"constant.other.key.perl"}},"match":"\\\\b(\\\\w+)\\\\s*(?==>)"},{"match":"(?<=\\\\{)\\\\s*\\\\w+\\\\s*(?=})","name":"constant.other.bareword.perl"},{"captures":{"1":{"name":"keyword.control.perl"},"2":{"name":"entity.name.type.class.perl"}},"match":"^\\\\s*(package)\\\\s+([^;\\\\s]+)","name":"meta.class.perl"},{"captures":{"1":{"name":"storage.type.sub.perl"},"2":{"name":"entity.name.function.perl"},"3":{"name":"storage.type.method.perl"}},"match":"\\\\b(sub)(?:\\\\s+([-0-9A-Z_a-z]+))?\\\\s*(?:\\\\([$*;@]*\\\\))?[^{\\\\w]","name":"meta.function.perl"},{"captures":{"1":{"name":"entity.name.function.perl"},"2":{"name":"punctuation.definition.parameters.perl"},"3":{"name":"variable.parameter.function.perl"}},"match":"^\\\\s*(BEGIN|UNITCHECK|CHECK|INIT|END|DESTROY)\\\\b","name":"meta.function.perl"},{"begin":"^(?=(\\\\t| {4}))","end":"(?=[^\\\\t\\\\s])","name":"meta.leading-tabs","patterns":[{"captures":{"1":{"name":"meta.odd-tab"},"2":{"name":"meta.even-tab"}},"match":"(\\\\t| {4})(\\\\t| {4})?"}]},{"captures":{"1":{"name":"support.function.perl"},"2":{"name":"punctuation.definition.string.perl"},"5":{"name":"punctuation.definition.string.perl"},"8":{"name":"punctuation.definition.string.perl"}},"match":"\\\\b(tr|y)\\\\s*([^0-9A-Za-z\\\\s])(.*?)(?<!\\\\\\\\)(\\\\\\\\{2})*(\\\\2)(.*?)(?<!\\\\\\\\)(\\\\\\\\{2})*(\\\\2)","name":"string.regexp.replace.perl"},{"match":"\\\\b(__(?:FILE|LINE|PACKAGE|SUB)__)\\\\b","name":"constant.language.perl"},{"begin":"\\\\b(__(?:DATA__|END__))\\\\n?","beginCaptures":{"1":{"name":"constant.language.perl"}},"contentName":"comment.block.documentation.perl","end":"\\\\z","patterns":[{"include":"#pod"}]},{"match":"(?<!->)\\\\b(continue|default|die|do|else|elsif|exit|for|foreach|given|goto|if|last|next|redo|return|select|unless|until|wait|when|while|switch|case|require|use|eval)\\\\b","name":"keyword.control.perl"},{"match":"\\\\b(my|our|local)\\\\b","name":"storage.modifier.perl"},{"match":"(?<!\\\\w)-[ABCMORSTWXb-gklopr-uwxz]\\\\b","name":"keyword.operator.filetest.perl"},{"match":"\\\\b(and|or|xor|as|not)\\\\b","name":"keyword.operator.logical.perl"},{"match":"((?:<=|[-=])>)","name":"keyword.operator.comparison.perl"},{"include":"#heredoc"},{"begin":"\\\\bqq\\\\s*([^(<\\\\[{\\\\w\\\\s])","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.perl"}},"end":"\\\\1","endCaptures":{"0":{"name":"punctuation.definition.string.end.perl"}},"name":"string.quoted.other.qq.perl","patterns":[{"include":"#escaped_char"},{"include":"#variable"}]},{"begin":"\\\\bqx\\\\s*([^'(<\\\\[{\\\\w\\\\s])","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.perl"}},"end":"\\\\1","endCaptures":{"0":{"name":"punctuation.definition.string.end.perl"}},"name":"string.interpolated.qx.perl","patterns":[{"include":"#escaped_char"},{"include":"#variable"}]},{"begin":"\\\\bqx\\\\s*'","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.perl"}},"end":"'","endCaptures":{"0":{"name":"punctuation.definition.string.end.perl"}},"name":"string.interpolated.qx.single-quote.perl","patterns":[{"include":"#escaped_char"}]},{"begin":"\\"","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.perl"}},"end":"\\"","endCaptures":{"0":{"name":"punctuation.definition.string.end.perl"}},"name":"string.quoted.double.perl","patterns":[{"include":"#escaped_char"},{"include":"#variable"}]},{"begin":"(?<!->)\\\\bqw?\\\\s*([^(<\\\\[{\\\\w\\\\s])","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.perl"}},"end":"\\\\1","endCaptures":{"0":{"name":"punctuation.definition.string.end.perl"}},"name":"string.quoted.other.q.perl"},{"begin":"'","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.perl"}},"end":"'","endCaptures":{"0":{"name":"punctuation.definition.string.end.perl"}},"name":"string.quoted.single.perl","patterns":[{"match":"\\\\\\\\['\\\\\\\\]","name":"constant.character.escape.perl"}]},{"begin":"\`","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.perl"}},"end":"\`","endCaptures":{"0":{"name":"punctuation.definition.string.end.perl"}},"name":"string.interpolated.perl","patterns":[{"include":"#escaped_char"},{"include":"#variable"}]},{"begin":"(?<!->)\\\\bqq\\\\s*\\\\(","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.perl"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.definition.string.end.perl"}},"name":"string.quoted.other.qq-paren.perl","patterns":[{"include":"#escaped_char"},{"include":"#nested_parens_interpolated"},{"include":"#variable"}]},{"begin":"\\\\bqq\\\\s*\\\\{","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.perl"}},"end":"}","endCaptures":{"0":{"name":"punctuation.definition.string.end.perl"}},"name":"string.quoted.other.qq-brace.perl","patterns":[{"include":"#escaped_char"},{"include":"#nested_braces_interpolated"},{"include":"#variable"}]},{"begin":"\\\\bqq\\\\s*\\\\[","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.perl"}},"end":"]","endCaptures":{"0":{"name":"punctuation.definition.string.end.perl"}},"name":"string.quoted.other.qq-bracket.perl","patterns":[{"include":"#escaped_char"},{"include":"#nested_brackets_interpolated"},{"include":"#variable"}]},{"begin":"\\\\bqq\\\\s*<","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.perl"}},"end":">","endCaptures":{"0":{"name":"punctuation.definition.string.end.perl"}},"name":"string.quoted.other.qq-ltgt.perl","patterns":[{"include":"#escaped_char"},{"include":"#nested_ltgt_interpolated"},{"include":"#variable"}]},{"begin":"(?<!->)\\\\bqx\\\\s*\\\\(","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.perl"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.definition.string.end.perl"}},"name":"string.interpolated.qx-paren.perl","patterns":[{"include":"#escaped_char"},{"include":"#nested_parens_interpolated"},{"include":"#variable"}]},{"begin":"\\\\bqx\\\\s*\\\\{","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.perl"}},"end":"}","endCaptures":{"0":{"name":"punctuation.definition.string.end.perl"}},"name":"string.interpolated.qx-brace.perl","patterns":[{"include":"#escaped_char"},{"include":"#nested_braces_interpolated"},{"include":"#variable"}]},{"begin":"\\\\bqx\\\\s*\\\\[","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.perl"}},"end":"]","endCaptures":{"0":{"name":"punctuation.definition.string.end.perl"}},"name":"string.interpolated.qx-bracket.perl","patterns":[{"include":"#escaped_char"},{"include":"#nested_brackets_interpolated"},{"include":"#variable"}]},{"begin":"\\\\bqx\\\\s*<","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.perl"}},"end":">","endCaptures":{"0":{"name":"punctuation.definition.string.end.perl"}},"name":"string.interpolated.qx-ltgt.perl","patterns":[{"include":"#escaped_char"},{"include":"#nested_ltgt_interpolated"},{"include":"#variable"}]},{"begin":"(?<!->)\\\\bqw?\\\\s*\\\\(","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.perl"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.definition.string.end.perl"}},"name":"string.quoted.other.q-paren.perl","patterns":[{"include":"#nested_parens"}]},{"begin":"\\\\bqw?\\\\s*\\\\{","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.perl"}},"end":"}","endCaptures":{"0":{"name":"punctuation.definition.string.end.perl"}},"name":"string.quoted.other.q-brace.perl","patterns":[{"include":"#nested_braces"}]},{"begin":"\\\\bqw?\\\\s*\\\\[","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.perl"}},"end":"]","endCaptures":{"0":{"name":"punctuation.definition.string.end.perl"}},"name":"string.quoted.other.q-bracket.perl","patterns":[{"include":"#nested_brackets"}]},{"begin":"\\\\bqw?\\\\s*<","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.perl"}},"end":">","endCaptures":{"0":{"name":"punctuation.definition.string.end.perl"}},"name":"string.quoted.other.q-ltgt.perl","patterns":[{"include":"#nested_ltgt"}]},{"begin":"^__\\\\w+__","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.perl"}},"end":"$","endCaptures":{"0":{"name":"punctuation.definition.string.end.perl"}},"name":"string.unquoted.program-block.perl"},{"begin":"\\\\b(format)\\\\s+(\\\\w+)\\\\s*=","beginCaptures":{"1":{"name":"support.function.perl"},"2":{"name":"entity.name.function.format.perl"}},"end":"^\\\\.\\\\s*$","name":"meta.format.perl","patterns":[{"include":"#line_comment"},{"include":"#variable"}]},{"captures":{"1":{"name":"support.function.perl"},"2":{"name":"entity.name.function.perl"}},"match":"\\\\b(x)\\\\s*(\\\\d+)\\\\b"},{"match":"\\\\b(ARGV|DATA|ENV|SIG|STDERR|STDIN|STDOUT|atan2|bind|binmode|bless|caller|chdir|chmod|chomp|chop|chown|chr|chroot|close|closedir|cmp|connect|cos|crypt|dbmclose|dbmopen|defined|delete|dump|each|endgrent|endhostent|endnetent|endprotoent|endpwent|endservent|eof|eq|eval|exec|exists|exp|fcntl|fileno|flock|fork|formline|ge|getc|getgrent|getgrgid|getgrnam|gethostbyaddr|gethostbyname|gethostent|getlogin|getnetbyaddr|getnetbyname|getnetent|getpeername|getpgrp|getppid|getpriority|getprotobyname|getprotobynumber|getprotoent|getpwent|getpwnam|getpwuid|getservbyname|getservbyport|getservent|getsockname|getsockopt|glob|gmtime|grep|gt|hex|import|index|int|ioctl|join|keys|kill|lc|lcfirst|le|length|link|listen|local|localtime|log|lstat|lt|m|map|mkdir|msgctl|msgget|msgrcv|msgsnd|ne|no|oct|open|opendir|ord|pack|pipe|pop|pos|printf??|push|quotemeta|rand|read|readdir|readlink|recv|ref|rename|reset|reverse|rewinddir|rindex|rmdir|s|say|scalar|seek|seekdir|semctl|semget|semop|send|setgrent|sethostent|setnetent|setpgrp|setpriority|setprotoent|setpwent|setservent|setsockopt|shift|shmctl|shmget|shmread|shmwrite|shutdown|sin|sleep|socket|socketpair|sort|splice|split|sprintf|sqrt|srand|stat|study|substr|symlink|syscall|sysopen|sysread|system|syswrite|tell|telldir|tied??|times??|tr|truncate|uc|ucfirst|umask|undef|unlink|unpack|unshift|untie|utime|values|vec|waitpid|wantarray|warn|write|y)\\\\b","name":"support.function.perl"},{"captures":{"1":{"name":"punctuation.section.scope.begin.perl"},"2":{"name":"punctuation.section.scope.end.perl"}},"match":"(\\\\{)(})"},{"captures":{"1":{"name":"punctuation.section.scope.begin.perl"},"2":{"name":"punctuation.section.scope.end.perl"}},"match":"(\\\\()(\\\\))"}],"repository":{"escaped_char":{"patterns":[{"match":"\\\\\\\\\\\\d+","name":"constant.character.escape.perl"},{"match":"\\\\\\\\c[^\\\\\\\\\\\\s]","name":"constant.character.escape.perl"},{"match":"\\\\\\\\g(?:\\\\{(?:\\\\w*|-\\\\d+)}|\\\\d+)","name":"constant.character.escape.perl"},{"match":"\\\\\\\\k(?:\\\\{\\\\w*}|<\\\\w*>|'\\\\w*')","name":"constant.character.escape.perl"},{"match":"\\\\\\\\N\\\\{[^}]*}","name":"constant.character.escape.perl"},{"match":"\\\\\\\\o\\\\{\\\\d*}","name":"constant.character.escape.perl"},{"match":"\\\\\\\\[Pp](?:\\\\{\\\\w*}|P)","name":"constant.character.escape.perl"},{"match":"\\\\\\\\x(?:[0-9A-Za-z]{2}|\\\\{\\\\w*})?","name":"constant.character.escape.perl"},{"match":"\\\\\\\\.","name":"constant.character.escape.perl"}]},"heredoc":{"patterns":[{"begin":"((((<<(~)?) *')(HTML)(')))(.*)\\\\n?","beginCaptures":{"1":{"name":"string.unquoted.heredoc.raw.perl"},"2":{"name":"punctuation.definition.string.begin.perl"},"3":{"name":"punctuation.definition.delimiter.begin.perl"},"7":{"name":"punctuation.definition.delimiter.end.perl"},"8":{"patterns":[{"include":"$self"}]}},"contentName":"string.unquoted.heredoc.raw.perl","end":"^((?!\\\\5)\\\\s+)?((\\\\6))$","endCaptures":{"2":{"name":"string.unquoted.heredoc.raw.perl"},"3":{"name":"punctuation.definition.string.end.perl"}},"name":"meta.embedded.block.html","patterns":[{"begin":"^","end":"\\\\n","name":"text.html.basic","patterns":[{"include":"text.html.basic"}]}]},{"begin":"((((<<(~)?) *')(XML)(')))(.*)\\\\n?","beginCaptures":{"1":{"name":"string.unquoted.heredoc.raw.perl"},"2":{"name":"punctuation.definition.string.begin.perl"},"3":{"name":"punctuation.definition.delimiter.begin.perl"},"7":{"name":"punctuation.definition.delimiter.end.perl"},"8":{"patterns":[{"include":"$self"}]}},"contentName":"string.unquoted.heredoc.raw.perl","end":"^((?!\\\\5)\\\\s+)?((\\\\6))$","endCaptures":{"2":{"name":"string.unquoted.heredoc.raw.perl"},"3":{"name":"punctuation.definition.string.end.perl"}},"name":"meta.embedded.block.xml","patterns":[{"begin":"^","end":"\\\\n","name":"text.xml","patterns":[{"include":"text.xml"}]}]},{"begin":"((((<<(~)?) *')(CSS)(')))(.*)\\\\n?","beginCaptures":{"1":{"name":"string.unquoted.heredoc.raw.perl"},"2":{"name":"punctuation.definition.string.begin.perl"},"3":{"name":"punctuation.definition.delimiter.begin.perl"},"7":{"name":"punctuation.definition.delimiter.end.perl"},"8":{"patterns":[{"include":"$self"}]}},"contentName":"string.unquoted.heredoc.raw.perl","end":"^((?!\\\\5)\\\\s+)?((\\\\6))$","endCaptures":{"2":{"name":"string.unquoted.heredoc.raw.perl"},"3":{"name":"punctuation.definition.string.end.perl"}},"name":"meta.embedded.block.css","patterns":[{"begin":"^","end":"\\\\n","name":"source.css","patterns":[{"include":"source.css"}]}]},{"begin":"((((<<(~)?) *')(JAVASCRIPT)(')))(.*)\\\\n?","beginCaptures":{"1":{"name":"string.unquoted.heredoc.raw.perl"},"2":{"name":"punctuation.definition.string.begin.perl"},"3":{"name":"punctuation.definition.delimiter.begin.perl"},"7":{"name":"punctuation.definition.delimiter.end.perl"},"8":{"patterns":[{"include":"$self"}]}},"contentName":"string.unquoted.heredoc.raw.perl","end":"^((?!\\\\5)\\\\s+)?((\\\\6))$","endCaptures":{"2":{"name":"string.unquoted.heredoc.raw.perl"},"3":{"name":"punctuation.definition.string.end.perl"}},"name":"meta.embedded.block.js","patterns":[{"begin":"^","end":"\\\\n","name":"source.js","patterns":[{"include":"source.js"}]}]},{"begin":"((((<<(~)?) *')(SQL)(')))(.*)\\\\n?","beginCaptures":{"1":{"name":"string.unquoted.heredoc.raw.perl"},"2":{"name":"punctuation.definition.string.begin.perl"},"3":{"name":"punctuation.definition.delimiter.begin.perl"},"7":{"name":"punctuation.definition.delimiter.end.perl"},"8":{"patterns":[{"include":"$self"}]}},"contentName":"string.unquoted.heredoc.raw.perl","end":"^((?!\\\\5)\\\\s+)?((\\\\6))$","endCaptures":{"2":{"name":"string.unquoted.heredoc.raw.perl"},"3":{"name":"punctuation.definition.string.end.perl"}},"name":"meta.embedded.block.sql","patterns":[{"begin":"^","end":"\\\\n","name":"source.sql","patterns":[{"include":"source.sql"}]}]},{"begin":"((((<<(~)?) *')(POSTSCRIPT)(')))(.*)\\\\n?","beginCaptures":{"1":{"name":"string.unquoted.heredoc.raw.perl"},"2":{"name":"punctuation.definition.string.begin.perl"},"3":{"name":"punctuation.definition.delimiter.begin.perl"},"7":{"name":"punctuation.definition.delimiter.end.perl"},"8":{"patterns":[{"include":"$self"}]}},"contentName":"string.unquoted.heredoc.raw.perl","end":"^((?!\\\\5)\\\\s+)?((\\\\6))$","endCaptures":{"2":{"name":"string.unquoted.heredoc.raw.perl"},"3":{"name":"punctuation.definition.string.end.perl"}},"name":"meta.embedded.block.postscript","patterns":[{"begin":"^","end":"\\\\n","name":"source.postscript","patterns":[{"include":"source.postscript"}]}]},{"begin":"((((<<(~)?) *')([^']*)(')))(.*)\\\\n?","beginCaptures":{"1":{"name":"string.unquoted.heredoc.raw.perl"},"2":{"name":"punctuation.definition.string.begin.perl"},"3":{"name":"punctuation.definition.delimiter.begin.perl"},"7":{"name":"punctuation.definition.delimiter.end.perl"},"8":{"patterns":[{"include":"$self"}]}},"contentName":"string.unquoted.heredoc.raw.perl","end":"^((?!\\\\5)\\\\s+)?((\\\\6))$","endCaptures":{"2":{"name":"string.unquoted.heredoc.raw.perl"},"3":{"name":"punctuation.definition.string.end.perl"}}},{"begin":"((((<<(~)?) *\\\\\\\\)((?![ $(=\\\\d])[^\\"'),;\`\\\\s]*)()))(.*)\\\\n?","beginCaptures":{"1":{"name":"string.unquoted.heredoc.raw.perl"},"2":{"name":"punctuation.definition.string.begin.perl"},"3":{"name":"punctuation.definition.delimiter.begin.perl"},"7":{"name":"punctuation.definition.delimiter.end.perl"},"8":{"patterns":[{"include":"$self"}]}},"contentName":"string.unquoted.heredoc.raw.perl","end":"^((?!\\\\5)\\\\s+)?((\\\\6))$","endCaptures":{"2":{"name":"string.unquoted.heredoc.raw.perl"},"3":{"name":"punctuation.definition.string.end.perl"}}},{"begin":"((((<<(~)?) *\\")(HTML)(\\")))(.*)\\\\n?","beginCaptures":{"1":{"name":"string.unquoted.heredoc.interpolated.perl"},"2":{"name":"punctuation.definition.string.begin.perl"},"3":{"name":"punctuation.definition.delimiter.begin.perl"},"7":{"name":"punctuation.definition.delimiter.end.perl"},"8":{"patterns":[{"include":"$self"}]}},"contentName":"string.unquoted.heredoc.interpolated.perl","end":"^((?!\\\\5)\\\\s+)?((\\\\6))$","endCaptures":{"2":{"name":"string.unquoted.heredoc.interpolated.perl"},"3":{"name":"punctuation.definition.string.end.perl"}},"name":"meta.embedded.block.html","patterns":[{"begin":"^","end":"\\\\n","name":"text.html.basic","patterns":[{"include":"#escaped_char"},{"include":"#variable"},{"include":"text.html.basic"}]}]},{"begin":"((((<<(~)?) *\\")(XML)(\\")))(.*)\\\\n?","beginCaptures":{"1":{"name":"string.unquoted.heredoc.interpolated.perl"},"2":{"name":"punctuation.definition.string.begin.perl"},"3":{"name":"punctuation.definition.delimiter.begin.perl"},"7":{"name":"punctuation.definition.delimiter.end.perl"},"8":{"patterns":[{"include":"$self"}]}},"contentName":"string.unquoted.heredoc.interpolated.perl","end":"^((?!\\\\5)\\\\s+)?((\\\\6))$","endCaptures":{"2":{"name":"string.unquoted.heredoc.interpolated.perl"},"3":{"name":"punctuation.definition.string.end.perl"}},"name":"meta.embedded.block.xml","patterns":[{"begin":"^","end":"\\\\n","name":"text.xml","patterns":[{"include":"#escaped_char"},{"include":"#variable"},{"include":"text.xml"}]}]},{"begin":"((((<<(~)?) *\\")(CSS)(\\")))(.*)\\\\n?","beginCaptures":{"1":{"name":"string.unquoted.heredoc.interpolated.perl"},"2":{"name":"punctuation.definition.string.begin.perl"},"3":{"name":"punctuation.definition.delimiter.begin.perl"},"7":{"name":"punctuation.definition.delimiter.end.perl"},"8":{"patterns":[{"include":"$self"}]}},"contentName":"string.unquoted.heredoc.interpolated.perl","end":"^((?!\\\\5)\\\\s+)?((\\\\6))$","endCaptures":{"2":{"name":"string.unquoted.heredoc.interpolated.perl"},"3":{"name":"punctuation.definition.string.end.perl"}},"name":"meta.embedded.block.css","patterns":[{"begin":"^","end":"\\\\n","name":"source.css","patterns":[{"include":"#escaped_char"},{"include":"#variable"},{"include":"source.css"}]}]},{"begin":"((((<<(~)?) *\\")(JAVASCRIPT)(\\")))(.*)\\\\n?","beginCaptures":{"1":{"name":"string.unquoted.heredoc.interpolated.perl"},"2":{"name":"punctuation.definition.string.begin.perl"},"3":{"name":"punctuation.definition.delimiter.begin.perl"},"7":{"name":"punctuation.definition.delimiter.end.perl"},"8":{"patterns":[{"include":"$self"}]}},"contentName":"string.unquoted.heredoc.interpolated.perl","end":"^((?!\\\\5)\\\\s+)?((\\\\6))$","endCaptures":{"2":{"name":"string.unquoted.heredoc.interpolated.perl"},"3":{"name":"punctuation.definition.string.end.perl"}},"name":"meta.embedded.block.js","patterns":[{"begin":"^","end":"\\\\n","name":"source.js","patterns":[{"include":"#escaped_char"},{"include":"#variable"},{"include":"source.js"}]}]},{"begin":"((((<<(~)?) *\\")(SQL)(\\")))(.*)\\\\n?","beginCaptures":{"1":{"name":"string.unquoted.heredoc.interpolated.perl"},"2":{"name":"punctuation.definition.string.begin.perl"},"3":{"name":"punctuation.definition.delimiter.begin.perl"},"7":{"name":"punctuation.definition.delimiter.end.perl"},"8":{"patterns":[{"include":"$self"}]}},"contentName":"string.unquoted.heredoc.interpolated.perl","end":"^((?!\\\\5)\\\\s+)?((\\\\6))$","endCaptures":{"2":{"name":"string.unquoted.heredoc.interpolated.perl"},"3":{"name":"punctuation.definition.string.end.perl"}},"name":"meta.embedded.block.sql","patterns":[{"begin":"^","end":"\\\\n","name":"source.sql","patterns":[{"include":"#escaped_char"},{"include":"#variable"},{"include":"source.sql"}]}]},{"begin":"((((<<(~)?) *\\")(POSTSCRIPT)(\\")))(.*)\\\\n?","beginCaptures":{"1":{"name":"string.unquoted.heredoc.interpolated.perl"},"2":{"name":"punctuation.definition.string.begin.perl"},"3":{"name":"punctuation.definition.delimiter.begin.perl"},"7":{"name":"punctuation.definition.delimiter.end.perl"},"8":{"patterns":[{"include":"$self"}]}},"contentName":"string.unquoted.heredoc.interpolated.perl","end":"^((?!\\\\5)\\\\s+)?((\\\\6))$","endCaptures":{"2":{"name":"string.unquoted.heredoc.interpolated.perl"},"3":{"name":"punctuation.definition.string.end.perl"}},"name":"meta.embedded.block.postscript","patterns":[{"begin":"^","end":"\\\\n","name":"source.postscript","patterns":[{"include":"#escaped_char"},{"include":"#variable"},{"include":"source.postscript"}]}]},{"begin":"((((<<(~)?) *\\")([^\\"]*)(\\")))(.*)\\\\n?","beginCaptures":{"1":{"name":"string.unquoted.heredoc.interpolated.perl"},"2":{"name":"punctuation.definition.string.begin.perl"},"3":{"name":"punctuation.definition.delimiter.begin.perl"},"7":{"name":"punctuation.definition.delimiter.end.perl"},"8":{"patterns":[{"include":"$self"}]}},"contentName":"string.unquoted.heredoc.interpolated.perl","end":"^((?!\\\\5)\\\\s+)?((\\\\6))$","endCaptures":{"2":{"name":"string.unquoted.heredoc.interpolated.perl"},"3":{"name":"punctuation.definition.string.end.perl"}},"patterns":[{"include":"#escaped_char"},{"include":"#variable"}]},{"begin":"((((<<(~)?) *)(HTML)()))(.*)\\\\n?","beginCaptures":{"1":{"name":"string.unquoted.heredoc.interpolated.perl"},"2":{"name":"punctuation.definition.string.begin.perl"},"3":{"name":"punctuation.definition.delimiter.begin.perl"},"7":{"name":"punctuation.definition.delimiter.end.perl"},"8":{"patterns":[{"include":"$self"}]}},"contentName":"string.unquoted.heredoc.interpolated.perl","end":"^((?!\\\\5)\\\\s+)?((\\\\6))$","endCaptures":{"2":{"name":"string.unquoted.heredoc.interpolated.perl"},"3":{"name":"punctuation.definition.string.end.perl"}},"name":"meta.embedded.block.html","patterns":[{"begin":"^","end":"\\\\n","name":"text.html.basic","patterns":[{"include":"#escaped_char"},{"include":"#variable"},{"include":"text.html.basic"}]}]},{"begin":"((((<<(~)?) *)(XML)()))(.*)\\\\n?","beginCaptures":{"1":{"name":"string.unquoted.heredoc.interpolated.perl"},"2":{"name":"punctuation.definition.string.begin.perl"},"3":{"name":"punctuation.definition.delimiter.begin.perl"},"7":{"name":"punctuation.definition.delimiter.end.perl"},"8":{"patterns":[{"include":"$self"}]}},"contentName":"string.unquoted.heredoc.interpolated.perl","end":"^((?!\\\\5)\\\\s+)?((\\\\6))$","endCaptures":{"2":{"name":"string.unquoted.heredoc.interpolated.perl"},"3":{"name":"punctuation.definition.string.end.perl"}},"name":"meta.embedded.block.xml","patterns":[{"begin":"^","end":"\\\\n","name":"text.xml","patterns":[{"include":"#escaped_char"},{"include":"#variable"},{"include":"text.xml"}]}]},{"begin":"((((<<(~)?) *)(CSS)()))(.*)\\\\n?","beginCaptures":{"1":{"name":"string.unquoted.heredoc.interpolated.perl"},"2":{"name":"punctuation.definition.string.begin.perl"},"3":{"name":"punctuation.definition.delimiter.begin.perl"},"7":{"name":"punctuation.definition.delimiter.end.perl"},"8":{"patterns":[{"include":"$self"}]}},"contentName":"string.unquoted.heredoc.interpolated.perl","end":"^((?!\\\\5)\\\\s+)?((\\\\6))$","endCaptures":{"2":{"name":"string.unquoted.heredoc.interpolated.perl"},"3":{"name":"punctuation.definition.string.end.perl"}},"name":"meta.embedded.block.css","patterns":[{"begin":"^","end":"\\\\n","name":"source.css","patterns":[{"include":"#escaped_char"},{"include":"#variable"},{"include":"source.css"}]}]},{"begin":"((((<<(~)?) *)(JAVASCRIPT)()))(.*)\\\\n?","beginCaptures":{"1":{"name":"string.unquoted.heredoc.interpolated.perl"},"2":{"name":"punctuation.definition.string.begin.perl"},"3":{"name":"punctuation.definition.delimiter.begin.perl"},"7":{"name":"punctuation.definition.delimiter.end.perl"},"8":{"patterns":[{"include":"$self"}]}},"contentName":"string.unquoted.heredoc.interpolated.perl","end":"^((?!\\\\5)\\\\s+)?((\\\\6))$","endCaptures":{"2":{"name":"string.unquoted.heredoc.interpolated.perl"},"3":{"name":"punctuation.definition.string.end.perl"}},"name":"meta.embedded.block.js","patterns":[{"begin":"^","end":"\\\\n","name":"source.js","patterns":[{"include":"#escaped_char"},{"include":"#variable"},{"include":"source.js"}]}]},{"begin":"((((<<(~)?) *)(SQL)()))(.*)\\\\n?","beginCaptures":{"1":{"name":"string.unquoted.heredoc.interpolated.perl"},"2":{"name":"punctuation.definition.string.begin.perl"},"3":{"name":"punctuation.definition.delimiter.begin.perl"},"7":{"name":"punctuation.definition.delimiter.end.perl"},"8":{"patterns":[{"include":"$self"}]}},"contentName":"string.unquoted.heredoc.interpolated.perl","end":"^((?!\\\\5)\\\\s+)?((\\\\6))$","endCaptures":{"2":{"name":"string.unquoted.heredoc.interpolated.perl"},"3":{"name":"punctuation.definition.string.end.perl"}},"name":"meta.embedded.block.sql","patterns":[{"begin":"^","end":"\\\\n","name":"source.sql","patterns":[{"include":"#escaped_char"},{"include":"#variable"},{"include":"source.sql"}]}]},{"begin":"((((<<(~)?) *)(POSTSCRIPT)()))(.*)\\\\n?","beginCaptures":{"1":{"name":"string.unquoted.heredoc.interpolated.perl"},"2":{"name":"punctuation.definition.string.begin.perl"},"3":{"name":"punctuation.definition.delimiter.begin.perl"},"7":{"name":"punctuation.definition.delimiter.end.perl"},"8":{"patterns":[{"include":"$self"}]}},"contentName":"string.unquoted.heredoc.interpolated.perl","end":"^((?!\\\\5)\\\\s+)?((\\\\6))$","endCaptures":{"2":{"name":"string.unquoted.heredoc.interpolated.perl"},"3":{"name":"punctuation.definition.string.end.perl"}},"name":"meta.embedded.block.postscript","patterns":[{"begin":"^","end":"\\\\n","name":"source.postscript","patterns":[{"include":"#escaped_char"},{"include":"#variable"},{"include":"source.postscript"}]}]},{"begin":"((((<<(~)?) *)((?![ $(=\\\\d])[^\\"'),;\`\\\\s]*)()))(.*)\\\\n?","beginCaptures":{"1":{"name":"string.unquoted.heredoc.interpolated.perl"},"2":{"name":"punctuation.definition.string.begin.perl"},"3":{"name":"punctuation.definition.delimiter.begin.perl"},"7":{"name":"punctuation.definition.delimiter.end.perl"},"8":{"patterns":[{"include":"$self"}]}},"contentName":"string.unquoted.heredoc.interpolated.perl","end":"^((?!\\\\5)\\\\s+)?((\\\\6))$","endCaptures":{"2":{"name":"string.unquoted.heredoc.interpolated.perl"},"3":{"name":"punctuation.definition.string.end.perl"}},"patterns":[{"include":"#escaped_char"},{"include":"#variable"}]},{"begin":"((((<<(~)?) *\`)([^\`]*)(\`)))(.*)\\\\n?","beginCaptures":{"1":{"name":"string.unquoted.heredoc.interpolated.perl"},"2":{"name":"punctuation.definition.string.begin.perl"},"3":{"name":"punctuation.definition.delimiter.begin.perl"},"7":{"name":"punctuation.definition.delimiter.end.perl"},"8":{"patterns":[{"include":"$self"}]}},"contentName":"string.unquoted.heredoc.shell.perl","end":"^((?!\\\\5)\\\\s+)?((\\\\6))$","endCaptures":{"2":{"name":"string.unquoted.heredoc.interpolated.perl"},"3":{"name":"punctuation.definition.string.end.perl"}},"patterns":[{"include":"#escaped_char"},{"include":"#variable"}]}]},"line_comment":{"patterns":[{"begin":"(^[\\\\t ]+)?(?=#)","beginCaptures":{"1":{"name":"punctuation.whitespace.comment.leading.perl"}},"end":"(?!\\\\G)","patterns":[{"begin":"#","beginCaptures":{"0":{"name":"punctuation.definition.comment.perl"}},"end":"\\\\n","name":"comment.line.number-sign.perl"}]}]},"nested_braces":{"begin":"\\\\{","captures":{"1":{"name":"punctuation.section.scope.perl"}},"end":"}","patterns":[{"include":"#escaped_char"},{"include":"#nested_braces"}]},"nested_braces_interpolated":{"begin":"\\\\{","captures":{"1":{"name":"punctuation.section.scope.perl"}},"end":"}","patterns":[{"include":"#escaped_char"},{"include":"#variable"},{"include":"#nested_braces_interpolated"}]},"nested_brackets":{"begin":"\\\\[","captures":{"1":{"name":"punctuation.section.scope.perl"}},"end":"]","patterns":[{"include":"#escaped_char"},{"include":"#nested_brackets"}]},"nested_brackets_interpolated":{"begin":"\\\\[","captures":{"1":{"name":"punctuation.section.scope.perl"}},"end":"]","patterns":[{"include":"#escaped_char"},{"include":"#variable"},{"include":"#nested_brackets_interpolated"}]},"nested_ltgt":{"begin":"<","captures":{"1":{"name":"punctuation.section.scope.perl"}},"end":">","patterns":[{"include":"#nested_ltgt"}]},"nested_ltgt_interpolated":{"begin":"<","captures":{"1":{"name":"punctuation.section.scope.perl"}},"end":">","patterns":[{"include":"#variable"},{"include":"#nested_ltgt_interpolated"}]},"nested_parens":{"begin":"\\\\(","captures":{"1":{"name":"punctuation.section.scope.perl"}},"end":"\\\\)","patterns":[{"include":"#escaped_char"},{"include":"#nested_parens"}]},"nested_parens_interpolated":{"begin":"\\\\(","captures":{"1":{"name":"punctuation.section.scope.perl"}},"end":"\\\\)","patterns":[{"match":"\\\\$(?=[^'(<\\\\[{\\\\s\\\\w])","name":"keyword.control.anchor.perl"},{"include":"#escaped_char"},{"include":"#variable"},{"include":"#nested_parens_interpolated"}]},"pod":{"patterns":[{"match":"^=(pod|back|cut)\\\\b","name":"storage.type.class.pod.perl"},{"begin":"^(=begin)\\\\s+(html)\\\\s*$","beginCaptures":{"1":{"name":"storage.type.class.pod.perl"},"2":{"name":"variable.other.pod.perl"}},"contentName":"text.embedded.html.basic","end":"^(?:(=end)\\\\s+(html)|(?==cut))","endCaptures":{"1":{"name":"storage.type.class.pod.perl"},"2":{"name":"variable.other.pod.perl"}},"name":"meta.embedded.pod.perl","patterns":[{"include":"text.html.basic"}]},{"captures":{"1":{"name":"storage.type.class.pod.perl"},"2":{"name":"variable.other.pod.perl","patterns":[{"include":"#pod-formatting"}]}},"match":"^(=(?:head[1-4]|item|over|encoding|begin|end|for))\\\\b\\\\s*(.*)"},{"include":"#pod-formatting"}]},"pod-formatting":{"patterns":[{"captures":{"1":{"name":"markup.italic.pod.perl"},"2":{"name":"markup.italic.pod.perl"}},"match":"I(?:<([^<>]+)>|<+(\\\\s+(?:(?<!\\\\s)>|[^>])+\\\\s+)>+)","name":"entity.name.type.instance.pod.perl"},{"captures":{"1":{"name":"markup.bold.pod.perl"},"2":{"name":"markup.bold.pod.perl"}},"match":"B(?:<([^<>]+)>|<+(\\\\s+(?:(?<!\\\\s)>|[^>])+\\\\s+)>+)","name":"entity.name.type.instance.pod.perl"},{"captures":{"1":{"name":"markup.raw.pod.perl"},"2":{"name":"markup.raw.pod.perl"}},"match":"C(?:<([^<>]+)>|<+(\\\\\\\\s+(?:(?<!\\\\\\\\s)>|[^>])+\\\\\\\\s+)>+)","name":"entity.name.type.instance.pod.perl"},{"captures":{"1":{"name":"markup.underline.link.hyperlink.pod.perl"}},"match":"L<([^>]+)>","name":"entity.name.type.instance.pod.perl"},{"match":"[EFSXZ]<[^>]*>","name":"entity.name.type.instance.pod.perl"}]},"variable":{"patterns":[{"captures":{"1":{"name":"punctuation.definition.variable.perl"}},"match":"(\\\\$)&(?![0-9A-Z_a-z])","name":"variable.other.regexp.match.perl"},{"captures":{"1":{"name":"punctuation.definition.variable.perl"}},"match":"(\\\\$)\`(?![0-9A-Z_a-z])","name":"variable.other.regexp.pre-match.perl"},{"captures":{"1":{"name":"punctuation.definition.variable.perl"}},"match":"(\\\\$)'(?![0-9A-Z_a-z])","name":"variable.other.regexp.post-match.perl"},{"captures":{"1":{"name":"punctuation.definition.variable.perl"}},"match":"(\\\\$)\\\\+(?![0-9A-Z_a-z])","name":"variable.other.regexp.last-paren-match.perl"},{"captures":{"1":{"name":"punctuation.definition.variable.perl"}},"match":"(\\\\$)\\"(?![0-9A-Z_a-z])","name":"variable.other.readwrite.list-separator.perl"},{"captures":{"1":{"name":"punctuation.definition.variable.perl"}},"match":"(\\\\$)0(?![0-9A-Z_a-z])","name":"variable.other.predefined.program-name.perl"},{"captures":{"1":{"name":"punctuation.definition.variable.perl"}},"match":"(\\\\$)[!#$%()*,-/:-@\\\\[-_ab|~](?![0-9A-Z_a-z])","name":"variable.other.predefined.perl"},{"captures":{"1":{"name":"punctuation.definition.variable.perl"}},"match":"(\\\\$)[0-9]+(?![0-9A-Z_a-z])","name":"variable.other.subpattern.perl"},{"captures":{"1":{"name":"punctuation.definition.variable.perl"}},"match":"([$%@](#)?)([$7A-Za-z]|::)([$0-9A-Z_a-z]|::)*\\\\b","name":"variable.other.readwrite.global.perl"},{"captures":{"1":{"name":"punctuation.definition.variable.perl"},"2":{"name":"punctuation.definition.variable.perl"}},"match":"(\\\\$\\\\{)(?:[$7A-Za-z]|::)(?:[$0-9A-Z_a-z]|::)*(})","name":"variable.other.readwrite.global.perl"},{"captures":{"1":{"name":"punctuation.definition.variable.perl"}},"match":"([$%@](#)?)[0-9_]\\\\b","name":"variable.other.readwrite.global.special.perl"}]}},"scopeName":"source.perl","embeddedLangs":["html","xml","css","javascript","sql"]}`)),o=[...r,...i,...t,...n,...e,a];export{o as default};
|
dist/assets/php-Da7PtId8.js
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dist/assets/ruby-1ngPIeVt.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import e from"./shellscript-CLZ0U2zV.js";import{t}from"./c-D33ISaQg.js";import n from"./sql-BsFa4tDR.js";import r from"./cpp-uVsU3rl9.js";import i from"./css-BsVw1vtW.js";import a from"./javascript-BgS3c2Ky.js";import o from"./graphql-aweuWxpE.js";import s from"./html-BY76lXLH.js";import c from"./lua-Cr0_1Hr-.js";import l from"./xml-yX2vS4f7.js";import u from"./yaml-rwi0_p6S.js";var d=Object.freeze(JSON.parse(`{"displayName":"Ruby Haml","fileTypes":["haml","html.haml"],"foldingStartMarker":"^\\\\s*([-#%.:=\\\\w].*)\\\\s$","foldingStopMarker":"^\\\\s*$","name":"haml","patterns":[{"begin":"^(\\\\s*)==","contentName":"string.quoted.double.ruby","end":"$\\\\n*","patterns":[{"include":"#interpolated_ruby"}]},{"begin":"^(\\\\s*):ruby","end":"^(?!\\\\1\\\\s+|$\\\\n*)","name":"source.ruby.embedded.filter.haml","patterns":[{"include":"source.ruby"}]},{"captures":{"1":{"name":"punctuation.definition.prolog.haml"}},"match":"^(!!!)($|\\\\s.*)","name":"meta.prolog.haml"},{"begin":"^(\\\\s*):javascript","end":"^(?!\\\\1\\\\s+|$\\\\n*)","name":"js.haml","patterns":[{"include":"source.js"}]},{"begin":"^(\\\\s*)%script","end":"^(?!\\\\1\\\\s+|$\\\\n*)","name":"js.inline.haml","patterns":[{"include":"source.js"}]},{"begin":"^(\\\\s*):ruby$","end":"^(?!\\\\1\\\\s+|$\\\\n*)","name":"source.ruby.embedded.filter.haml","patterns":[{"include":"source.ruby"}]},{"captures":{"1":{"name":"punctuation.section.comment.haml"}},"match":"^(\\\\s*)(/\\\\[[^]].*?$\\\\n?)","name":"comment.line.slash.haml"},{"begin":"^(\\\\s*)(-#|/|-\\\\s*/\\\\*+)","beginCaptures":{"2":{"name":"punctuation.section.comment.haml"}},"end":"^(?!\\\\1\\\\s+|\\\\n)","name":"comment.block.haml","patterns":[{"include":"text.haml"}]},{"begin":"^\\\\s*(?:((%)([-:\\\\w]+))|(?=[#.]))","captures":{"1":{"name":"meta.tag.haml"},"2":{"name":"punctuation.definition.tag.haml"},"3":{"name":"entity.name.tag.haml"}},"end":"$|(?![#(.\\\\[{]|&|[-=~]|!=|&=|/)","patterns":[{"begin":"==","contentName":"string.quoted.double.ruby","end":"$\\\\n?","patterns":[{"include":"#interpolated_ruby"}]},{"captures":{"1":{"name":"entity.other.attribute-name.class"}},"match":"(\\\\.[-:\\\\w]+)","name":"meta.selector.css"},{"captures":{"1":{"name":"entity.other.attribute-name.id"}},"match":"(#[-\\\\w]+)","name":"meta.selector.css"},{"begin":"(?<!#)\\\\{(?=.*(,|(do)|[{|}]|(#.*)|\\\\R)\\\\s*)","end":"\\\\s*}(?!\\\\s*,)(?!\\\\s*\\\\|)(?!#\\\\{.*})","name":"meta.section.attributes.haml","patterns":[{"include":"source.ruby"},{"include":"#continuation"},{"include":"#rubyline"}]},{"begin":"\\\\(","end":"\\\\)","name":"meta.section.attributes.plain.haml","patterns":[{"match":"([-\\\\w]+)","name":"constant.other.symbol.ruby"},{"match":"=","name":"punctuation"},{"include":"#variables"},{"begin":"\\"","end":"\\"","name":"string.quoted.double.ruby","patterns":[{"match":"\\\\\\\\(x\\\\h{2}|[012][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)","name":"constant.character.escape.ruby"},{"include":"#interpolated_ruby"}]},{"include":"#interpolated_ruby"}]},{"begin":"\\\\[(?=.+([],\\\\[|]|(#.*))\\\\s*)","end":"\\\\s*](?!.*(?!#\\\\[)])","name":"meta.section.object.haml","patterns":[{"include":"source.ruby"},{"include":"#continuation"},{"include":"#rubyline"}]},{"include":"#interpolated_ruby_line"},{"include":"#rubyline"},{"match":"/","name":"punctuation.terminator.tag.haml"}]},{"begin":"^(\\\\s*):(ruby|opal)$","end":"^(?!\\\\1\\\\s+|$\\\\n*)","name":"source.ruby.embedded.filter.haml","patterns":[{"include":"source.ruby"}]},{"begin":"^(\\\\s*):ruby$","end":"^(?!\\\\1\\\\s+|$\\\\n*)","name":"source.ruby.embedded.filter.haml","patterns":[{"include":"source.ruby"}]},{"begin":"^(\\\\s*):(s(?:tyle|ass))$","end":"^(?=\\\\1\\\\s+|$\\\\n*)","name":"source.sass.embedded.filter.haml","patterns":[{"include":"source.sass"}]},{"begin":"^(\\\\s*):coffee(script)?","end":"^(?!\\\\1\\\\s+|$\\\\n*)","name":"source.coffee.embedded.filter.haml","patterns":[{"include":"source.coffee"}]},{"begin":"^(\\\\s*):plain$","end":"^(?=\\\\1\\\\s+|$\\\\n*)","name":"text.plain.embedded.filter.haml","patterns":[{"include":"text.plain"}]},{"begin":"^(\\\\s*)(:ruby)","beginCaptures":{"2":{"name":"keyword.control.filter.haml"}},"end":"(?m:(?<=\\\\n)(?!\\\\1\\\\s+|$\\\\n*))","name":"source.ruby.embedded.filter.haml","patterns":[{"include":"source.ruby"}]},{"begin":"^(\\\\s*)(:sass)","beginCaptures":{"2":{"name":"keyword.control.filter.haml"}},"end":"^(?!\\\\1\\\\s+|$\\\\n*)","name":"source.embedded.filter.sass","patterns":[{"include":"source.sass"}]},{"begin":"^(\\\\s*):(s(?:tyles|ass))$","end":"^(?=\\\\1\\\\s+|$\\\\n*)","name":"source.sass.embedded.filter.haml","patterns":[{"include":"source.sass"}]},{"begin":"^(\\\\s*):plain$","end":"^(?=\\\\1\\\\s+|$\\\\n*)","name":"text.plain.embedded.filter.haml","patterns":[{"include":"text.plain"}]},{"captures":{"1":{"name":"meta.escape.haml"}},"match":"^\\\\s*(\\\\.)"},{"begin":"^\\\\s*(?=[-=~]|!=|&=)","end":"$","patterns":[{"include":"#interpolated_ruby_line"},{"include":"#rubyline"}]},{"begin":"^(\\\\s*)(:php)","captures":{"2":{"name":"entity.name.tag.haml"}},"end":"^(?!\\\\1\\\\s+|$\\\\n*)","name":"meta.embedded.php","patterns":[{"include":"text.html.php#language"}]},{"begin":"^(\\\\s*)(:markdown)","captures":{"2":{"name":"entity.name.tag.haml"}},"end":"^(?!\\\\1\\\\s+|$\\\\n*)","name":"meta.embedded.markdown","patterns":[{"include":"text.html.markdown"}]},{"begin":"^(\\\\s*)(:(css|styles?))$","captures":{"2":{"name":"entity.name.tag.haml"}},"end":"^(?!\\\\1\\\\s+|$\\\\n*)","name":"meta.embedded.css","patterns":[{"include":"source.css"}]},{"begin":"^(\\\\s*)(:sass)$","captures":{"2":{"name":"entity.name.tag.haml"}},"end":"^(?!\\\\1\\\\s+|$\\\\n*)","name":"meta.embedded.sass","patterns":[{"include":"source.sass"}]},{"begin":"^(\\\\s*)(:scss)$","captures":{"2":{"name":"entity.name.tag.haml"}},"end":"^(?!\\\\1\\\\s+|$\\\\n*)","name":"meta.embedded.scss","patterns":[{"include":"source.scss"}]}],"repository":{"continuation":{"captures":{"1":{"name":"punctuation.separator.continuation.haml"}},"match":"(\\\\|)\\\\s*\\\\n"},"interpolated_ruby":{"patterns":[{"captures":{"0":{"name":"punctuation.section.embedded.ruby"},"1":{"name":"source.ruby.embedded.source.empty"}},"match":"#\\\\{(})","name":"source.ruby.embedded.source"},{"begin":"#\\\\{","captures":{"0":{"name":"punctuation.section.embedded.ruby"}},"end":"(})","name":"source.ruby.embedded.source","patterns":[{"include":"#nest_curly_and_self"},{"include":"source.ruby"}]},{"include":"#variables"}]},"interpolated_ruby_line":{"begin":"!?==","contentName":"string.source.ruby.embedded.haml","end":"$","name":"meta.line.ruby.interpolated.haml","patterns":[{"include":"#interpolated_ruby"},{"include":"source.ruby#escaped_char"}]},"nest_curly_and_self":{"patterns":[{"begin":"\\\\{","captures":{"0":{"name":"punctuation.section.scope.ruby"}},"end":"}","patterns":[{"include":"#nest_curly_and_self"},{"include":"source.ruby"}]}]},"rubyline":{"begin":"(&|!)?([-=~])","contentName":"source.ruby.embedded.haml","end":"((do|\\\\{)( \\\\|[*.]+\\\\|)?)$|$|^(?!.*\\\\|\\\\s*)$\\\\n?","endCaptures":{"1":{"name":"source.ruby.embedded.html"},"2":{"name":"keyword.control.ruby.start-block"}},"name":"meta.line.ruby.haml","patterns":[{"captures":{"1":{"name":"keyword.control.php"}},"match":"\\\\s+((elseif|foreach|switch|declare|default|use))(?=[(\\\\s])"},{"captures":{"1":{"name":"keyword.control.import.include.php"}},"match":"\\\\s+((?:requir|includ)e_once)(?=[(\\\\s])"},{"match":"\\\\s+(catch|try|throw|exception|finally|die)(?=[(\\\\s]|\\\\n*)","name":"keyword.control.exception.php"},{"captures":{"1":{"name":"storage.type.function.php"}},"match":"\\\\s+(function\\\\s*)((?=\\\\())"},{"captures":{"1":{"name":"keyword.control.php"}},"match":"\\\\s+(use\\\\s*)((?=\\\\())"},{"match":"([,<|]|do|\\\\{)\\\\s*(#.*)?$\\\\n*","name":"source.ruby","patterns":[{"include":"#rubyline"}]},{"match":"#.*$","name":"comment.line.number-sign.ruby"},{"include":"source.ruby"},{"include":"#continuation"}]},"variables":{"patterns":[{"captures":{"1":{"name":"punctuation.definition.variable.ruby"}},"match":"(#@)[A-Z_a-z]\\\\w*","name":"variable.other.readwrite.instance.ruby"},{"captures":{"1":{"name":"punctuation.definition.variable.ruby"}},"match":"(#@@)[A-Z_a-z]\\\\w*","name":"variable.other.readwrite.class.ruby"},{"captures":{"1":{"name":"punctuation.definition.variable.ruby"}},"match":"(#\\\\$)[A-Z_a-z]\\\\w*","name":"variable.other.readwrite.global.ruby"}]}},"scopeName":"text.haml","embeddedLangs":["javascript","css"],"embeddedLangsLazy":["ruby","sass","coffee","markdown"]}`)),f=[...a,...i,d],p=Object.freeze(JSON.parse(`{"displayName":"Ruby","name":"ruby","patterns":[{"captures":{"1":{"name":"keyword.control.class.ruby"},"2":{"name":"entity.name.type.class.ruby"},"5":{"name":"punctuation.separator.namespace.ruby"},"7":{"name":"punctuation.separator.inheritance.ruby"},"8":{"name":"entity.other.inherited-class.ruby"},"11":{"name":"punctuation.separator.namespace.ruby"}},"match":"\\\\b(class)\\\\s+(([0-9A-Z_a-z]+)((::)[0-9A-Z_a-z]+)*)\\\\s*((<)\\\\s*(([0-9A-Z_a-z]+)((::)[0-9A-Z_a-z]+)*))?","name":"meta.class.ruby"},{"captures":{"1":{"name":"keyword.control.module.ruby"},"2":{"name":"entity.name.type.module.ruby"},"5":{"name":"punctuation.separator.namespace.ruby"}},"match":"\\\\b(module)\\\\s+(([0-9A-Z_a-z]+)((::)[0-9A-Z_a-z]+)*)","name":"meta.module.ruby"},{"captures":{"1":{"name":"keyword.control.class.ruby"},"2":{"name":"punctuation.separator.inheritance.ruby"}},"match":"\\\\b(class)\\\\s*(<<)\\\\s*","name":"meta.class.ruby"},{"match":"(?<!\\\\.)\\\\belse(\\\\s)+if\\\\b","name":"invalid.deprecated.ruby"},{"captures":{"1":{"name":"variable.ruby"},"2":{"name":"keyword.operator.assignment.augmented.ruby"}},"match":"^\\\\s*([_a-z][0-9A-Z_a-z]*)\\\\s*((&&|\\\\|\\\\|)=)"},{"captures":{"1":{"name":"keyword.control.ruby"},"3":{"name":"variable.ruby"},"4":{"name":"keyword.operator.assignment.augmented.ruby"}},"match":"(?<!\\\\.)\\\\b(case|if|elsif|unless|until|while)\\\\b\\\\s*(\\\\()*?\\\\s*([_a-z][0-9A-Z_a-z]*)\\\\s*((&&|\\\\|\\\\|)=)"},{"captures":{"1":{"name":"variable.ruby"},"2":{"name":"keyword.operator.assignment.augmented.ruby"}},"match":"^\\\\s*([_a-z][0-9A-Z_a-z]*)\\\\s*(([-%*+/]|\\\\*\\\\*|[\\\\&^|]|<<|>>)=)"},{"captures":{"1":{"name":"keyword.control.ruby"},"3":{"name":"variable.ruby"},"4":{"name":"keyword.operator.assignment.augmented.ruby"}},"match":"(?<!\\\\.)\\\\b(case|if|elsif|unless|until|while)\\\\b\\\\s*(\\\\()*?\\\\s*([_a-z][0-9A-Z_a-z]*)\\\\s*(([-%*+/]|\\\\*\\\\*|[\\\\&^|]|<<|>>)=)"},{"captures":{"1":{"name":"variable.ruby"}},"match":"^\\\\s*([_a-z][0-9A-Z_a-z]*)\\\\s*(?==[^=>])"},{"captures":{"1":{"name":"keyword.control.ruby"},"3":{"name":"variable.ruby"}},"match":"(?<!\\\\.)\\\\b(case|if|elsif|unless|until|while)\\\\b\\\\s*(\\\\()*?\\\\s*([_a-z][0-9A-Z_a-z]*)\\\\s*=[^=>]"},{"captures":{"1":{"name":"punctuation.definition.constant.hashkey.ruby"}},"match":"(?>[A-Z_a-z]\\\\w*[!?]?)(:)(?!:)","name":"constant.language.symbol.hashkey.ruby"},{"captures":{"1":{"name":"punctuation.definition.constant.ruby"}},"match":"(?<!:)(:)(?>[A-Z_a-z]\\\\w*[!?]?)(?=\\\\s*=>)","name":"constant.language.symbol.hashkey.ruby"},{"match":"(?<!\\\\.)\\\\b(BEGIN|begin|case|class|else|elsif|END|end|ensure|for|if|in|module|rescue|then|unless|until|when|while)\\\\b(?![!?])","name":"keyword.control.ruby"},{"match":"(?<!\\\\.)\\\\bdo\\\\b","name":"keyword.control.start-block.ruby"},{"match":"(?<=\\\\{)(\\\\s+)","name":"meta.syntax.ruby.start-block"},{"match":"(?<!\\\\.)\\\\b(alias|alias_method|break|next|redo|retry|return|super|undef|yield)\\\\b(?![!?])|\\\\bdefined\\\\?|\\\\b(block_given|iterator)\\\\?","name":"keyword.control.pseudo-method.ruby"},{"match":"\\\\bnil\\\\b(?![!?])","name":"constant.language.nil.ruby"},{"match":"\\\\b(true|false)\\\\b(?![!?])","name":"constant.language.boolean.ruby"},{"match":"\\\\b(__(FILE|LINE)__)\\\\b(?![!?])","name":"variable.language.ruby"},{"match":"\\\\bself\\\\b(?![!?])","name":"variable.language.self.ruby"},{"match":"\\\\b(initialize|new|loop|include|extend|prepend|raise|fail|attr_reader|attr_writer|attr_accessor|attr|catch|throw|private|private_class_method|module_function|public|public_class_method|protected|refine|using)\\\\b(?![!?])","name":"keyword.other.special-method.ruby"},{"begin":"\\\\b(?<!\\\\.|::)(require(?:|_relative))\\\\b(?![!?])","captures":{"1":{"name":"keyword.other.special-method.ruby"}},"end":"$|(?=[#}])","name":"meta.require.ruby","patterns":[{"include":"$self"}]},{"captures":{"1":{"name":"punctuation.definition.variable.ruby"}},"match":"(@)[A-Z_a-z]\\\\w*","name":"variable.other.readwrite.instance.ruby"},{"captures":{"1":{"name":"punctuation.definition.variable.ruby"}},"match":"(@@)[A-Z_a-z]\\\\w*","name":"variable.other.readwrite.class.ruby"},{"captures":{"1":{"name":"punctuation.definition.variable.ruby"}},"match":"(\\\\$)[A-Z_a-z]\\\\w*","name":"variable.other.readwrite.global.ruby"},{"captures":{"1":{"name":"punctuation.definition.variable.ruby"}},"match":"(\\\\$)([!\\\\&'+@\`]|\\\\d+|[\\"$*,./:-?\\\\\\\\_~]|-[0FIadilpv])","name":"variable.other.readwrite.global.pre-defined.ruby"},{"begin":"\\\\b(ENV)\\\\[","beginCaptures":{"1":{"name":"variable.other.constant.ruby"}},"end":"]","name":"meta.environment-variable.ruby","patterns":[{"include":"$self"}]},{"match":"\\\\b[A-Z]\\\\w*(?=((\\\\.|::)[A-Za-z]|\\\\[))","name":"support.class.ruby"},{"match":"\\\\b((abort|at_exit|autoload|binding|callcc|caller|caller_locations|chomp|chop|eval|exec|exit|fork|format|gets|global_variables|gsub|lambda|load|local_variables|open|p|printf??|proc|putc|puts|rand|readlines??|select|set_trace_func|sleep|spawn|sprintf|srand|sub|syscall|system|test|trace_var|trap|untrace_var|warn)\\\\b(?![!?])|autoload\\\\?|exit!)","name":"support.function.kernel.ruby"},{"match":"\\\\b[A-Z_]\\\\w*\\\\b","name":"variable.other.constant.ruby"},{"begin":"(->)\\\\(","beginCaptures":{"1":{"name":"support.function.kernel.ruby"}},"end":"\\\\)","patterns":[{"begin":"(?=[\\\\&*A-Z_a-z])","end":"(?=[),])","patterns":[{"include":"#method_parameters"}]},{"include":"#method_parameters"}]},{"begin":"(?=def\\\\b)(?<=^|\\\\s)(def)\\\\s+((?>[A-Z_a-z]\\\\w*(?>\\\\.|::))?(?>[A-Z_a-z]\\\\w*(?>[!?]|=(?!>))?|===?|!=|>[=>]?|<=>|<[<=]?|[%\\\\&/\`|]|\\\\*\\\\*?|=?~|[-+]@?|\\\\[]=?))\\\\s*(\\\\()","beginCaptures":{"1":{"name":"keyword.control.def.ruby"},"2":{"name":"entity.name.function.ruby"},"3":{"name":"punctuation.definition.parameters.ruby"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.definition.parameters.ruby"}},"name":"meta.function.method.with-arguments.ruby","patterns":[{"begin":"(?=[\\\\&*A-Z_a-z])","end":"(?=[),])","patterns":[{"include":"#method_parameters"}]},{"include":"#method_parameters"}]},{"begin":"(?=def\\\\b)(?<=^|\\\\s)(def)\\\\s+((?>[A-Z_a-z]\\\\w*(?>\\\\.|::))?(?>[A-Z_a-z]\\\\w*(?>[!?]|=(?!>))?|===?|!=|>[=>]?|<=>|<[<=]?|[%\\\\&/\`|]|\\\\*\\\\*?|=?~|[-+]@?|\\\\[]=?))[\\\\t ](?=[\\\\t ]*[^#;\\\\s])","beginCaptures":{"1":{"name":"keyword.control.def.ruby"},"2":{"name":"entity.name.function.ruby"}},"end":"(?=;)|(?<=[]!\\"')?\`}\\\\w])(?=\\\\s*#|\\\\s*$)","name":"meta.function.method.with-arguments.ruby","patterns":[{"begin":"(?=[\\\\&*A-Z_a-z])","end":"(?=[,;]|\\\\s*#|\\\\s*$)","patterns":[{"include":"#method_parameters"}]},{"include":"#method_parameters"}]},{"captures":{"1":{"name":"keyword.control.def.ruby"},"3":{"name":"entity.name.function.ruby"}},"match":"(?=def\\\\b)(?<=^|\\\\s)(def)\\\\b(\\\\s+((?>[A-Z_a-z]\\\\w*(?>\\\\.|::))?(?>[A-Z_a-z]\\\\w*(?>[!?]|=(?!>))?|===?|!=|>[=>]?|<=>|<[<=]?|[%\\\\&/\`|]|\\\\*\\\\*?|=?~|[-+]@?|\\\\[]=?)))?","name":"meta.function.method.without-arguments.ruby"},{"match":"\\\\b(\\\\d(?>_?\\\\d)*(\\\\.(?![^\\\\s\\\\d])(?>_?\\\\d)*)?([Ee][-+]?\\\\d(?>_?\\\\d)*)?|0(?:[Xx]\\\\h(?>_?\\\\h)*|[Oo]?[0-7](?>_?[0-7])*|[Bb][01](?>_?[01])*|[Dd]\\\\d(?>_?\\\\d)*))\\\\b","name":"constant.numeric.ruby"},{"begin":":'","beginCaptures":{"0":{"name":"punctuation.definition.symbol.begin.ruby"}},"end":"'","endCaptures":{"0":{"name":"punctuation.definition.symbol.end.ruby"}},"name":"constant.language.symbol.ruby","patterns":[{"match":"\\\\\\\\['\\\\\\\\]","name":"constant.character.escape.ruby"}]},{"begin":":\\"","beginCaptures":{"0":{"name":"punctuation.section.symbol.begin.ruby"}},"end":"\\"","endCaptures":{"0":{"name":"punctuation.section.symbol.end.ruby"}},"name":"constant.language.symbol.interpolated.ruby","patterns":[{"include":"#interpolated_ruby"},{"include":"#escaped_char"}]},{"match":"(?<!\\\\()/=","name":"keyword.operator.assignment.augmented.ruby"},{"begin":"'","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.ruby"}},"end":"'","endCaptures":{"0":{"name":"punctuation.definition.string.end.ruby"}},"name":"string.quoted.single.ruby","patterns":[{"match":"\\\\\\\\['\\\\\\\\]","name":"constant.character.escape.ruby"}]},{"begin":"\\"","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.ruby"}},"end":"\\"","endCaptures":{"0":{"name":"punctuation.definition.string.end.ruby"}},"name":"string.quoted.double.interpolated.ruby","patterns":[{"include":"#interpolated_ruby"},{"include":"#escaped_char"}]},{"begin":"(?<!\\\\.)\`","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.ruby"}},"end":"\`","endCaptures":{"0":{"name":"punctuation.definition.string.end.ruby"}},"name":"string.interpolated.ruby","patterns":[{"include":"#interpolated_ruby"},{"include":"#escaped_char"}]},{"begin":"(?<![)\\\\w])((/))(?![*+?])(?!\\\\s*$)(?=(?:\\\\\\\\/|[^/])*+/[eimnosux]*\\\\s*(?:[]#),.:?}]|\\\\|\\\\||&&|<=>|=>|==|=~|!~|!=|;|$|if|else|elsif|then|do|end|unless|while|until|or|and))","captures":{"1":{"name":"string.regexp.interpolated.ruby"},"2":{"name":"punctuation.section.regexp.ruby"}},"contentName":"string.regexp.interpolated.ruby","end":"((/[eimnosux]*))","patterns":[{"include":"#regex_sub"}]},{"begin":"%r\\\\{","beginCaptures":{"0":{"name":"punctuation.section.regexp.begin.ruby"}},"end":"}[eimnosux]*","endCaptures":{"0":{"name":"punctuation.section.regexp.end.ruby"}},"name":"string.regexp.interpolated.ruby","patterns":[{"include":"#regex_sub"},{"include":"#nest_curly_r"}]},{"begin":"%r\\\\[","beginCaptures":{"0":{"name":"punctuation.section.regexp.begin.ruby"}},"end":"][eimnosux]*","endCaptures":{"0":{"name":"punctuation.section.regexp.end.ruby"}},"name":"string.regexp.interpolated.ruby","patterns":[{"include":"#regex_sub"},{"include":"#nest_brackets_r"}]},{"begin":"%r\\\\(","beginCaptures":{"0":{"name":"punctuation.section.regexp.begin.ruby"}},"end":"\\\\)[eimnosux]*","endCaptures":{"0":{"name":"punctuation.section.regexp.end.ruby"}},"name":"string.regexp.interpolated.ruby","patterns":[{"include":"#regex_sub"},{"include":"#nest_parens_r"}]},{"begin":"%r<","beginCaptures":{"0":{"name":"punctuation.section.regexp.begin.ruby"}},"end":">[eimnosux]*","endCaptures":{"0":{"name":"punctuation.section.regexp.end.ruby"}},"name":"string.regexp.interpolated.ruby","patterns":[{"include":"#regex_sub"},{"include":"#nest_ltgt_r"}]},{"begin":"%r(\\\\W)","beginCaptures":{"0":{"name":"punctuation.section.regexp.begin.ruby"}},"end":"\\\\1[eimnosux]*","endCaptures":{"0":{"name":"punctuation.section.regexp.end.ruby"}},"name":"string.regexp.interpolated.ruby","patterns":[{"include":"#regex_sub"}]},{"begin":"%I\\\\[","beginCaptures":{"0":{"name":"punctuation.section.array.begin.ruby"}},"end":"]","endCaptures":{"0":{"name":"punctuation.section.array.end.ruby"}},"name":"constant.language.symbol.interpolated.ruby","patterns":[{"include":"#interpolated_ruby"},{"include":"#escaped_char"},{"include":"#nest_brackets_i"}]},{"begin":"%I\\\\(","beginCaptures":{"0":{"name":"punctuation.section.array.begin.ruby"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.section.array.end.ruby"}},"name":"constant.language.symbol.interpolated.ruby","patterns":[{"include":"#interpolated_ruby"},{"include":"#escaped_char"},{"include":"#nest_parens_i"}]},{"begin":"%I<","beginCaptures":{"0":{"name":"punctuation.section.array.begin.ruby"}},"end":">","endCaptures":{"0":{"name":"punctuation.section.array.end.ruby"}},"name":"constant.language.symbol.interpolated.ruby","patterns":[{"include":"#interpolated_ruby"},{"include":"#escaped_char"},{"include":"#nest_ltgt_i"}]},{"begin":"%I\\\\{","beginCaptures":{"0":{"name":"punctuation.section.array.begin.ruby"}},"end":"}","endCaptures":{"0":{"name":"punctuation.section.array.end.ruby"}},"name":"constant.language.symbol.interpolated.ruby","patterns":[{"include":"#interpolated_ruby"},{"include":"#escaped_char"},{"include":"#nest_curly_i"}]},{"begin":"%I(\\\\W)","beginCaptures":{"0":{"name":"punctuation.section.array.begin.ruby"}},"end":"\\\\1","endCaptures":{"0":{"name":"punctuation.section.array.end.ruby"}},"name":"constant.language.symbol.interpolated.ruby","patterns":[{"include":"#interpolated_ruby"},{"include":"#escaped_char"}]},{"begin":"%i\\\\[","beginCaptures":{"0":{"name":"punctuation.section.array.begin.ruby"}},"end":"]","endCaptures":{"0":{"name":"punctuation.section.array.end.ruby"}},"name":"constant.language.symbol.ruby","patterns":[{"match":"\\\\\\\\[]\\\\\\\\]","name":"constant.character.escape.ruby"},{"include":"#nest_brackets"}]},{"begin":"%i\\\\(","beginCaptures":{"0":{"name":"punctuation.section.array.begin.ruby"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.section.array.end.ruby"}},"name":"constant.language.symbol.ruby","patterns":[{"match":"\\\\\\\\[)\\\\\\\\]","name":"constant.character.escape.ruby"},{"include":"#nest_parens"}]},{"begin":"%i<","beginCaptures":{"0":{"name":"punctuation.section.array.begin.ruby"}},"end":">","endCaptures":{"0":{"name":"punctuation.section.array.end.ruby"}},"name":"constant.language.symbol.ruby","patterns":[{"match":"\\\\\\\\[>\\\\\\\\]","name":"constant.character.escape.ruby"},{"include":"#nest_ltgt"}]},{"begin":"%i\\\\{","beginCaptures":{"0":{"name":"punctuation.section.array.begin.ruby"}},"end":"}","endCaptures":{"0":{"name":"punctuation.section.array.end.ruby"}},"name":"constant.language.symbol.ruby","patterns":[{"match":"\\\\\\\\[\\\\\\\\}]","name":"constant.character.escape.ruby"},{"include":"#nest_curly"}]},{"begin":"%i(\\\\W)","beginCaptures":{"0":{"name":"punctuation.section.array.begin.ruby"}},"end":"\\\\1","endCaptures":{"0":{"name":"punctuation.section.array.end.ruby"}},"name":"constant.language.symbol.ruby","patterns":[{"match":"\\\\\\\\."}]},{"begin":"%W\\\\[","beginCaptures":{"0":{"name":"punctuation.section.array.begin.ruby"}},"end":"]","endCaptures":{"0":{"name":"punctuation.section.array.end.ruby"}},"name":"string.quoted.other.interpolated.ruby","patterns":[{"include":"#interpolated_ruby"},{"include":"#escaped_char"},{"include":"#nest_brackets_i"}]},{"begin":"%W\\\\(","beginCaptures":{"0":{"name":"punctuation.section.array.begin.ruby"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.section.array.end.ruby"}},"name":"string.quoted.other.interpolated.ruby","patterns":[{"include":"#interpolated_ruby"},{"include":"#escaped_char"},{"include":"#nest_parens_i"}]},{"begin":"%W<","beginCaptures":{"0":{"name":"punctuation.section.array.begin.ruby"}},"end":">","endCaptures":{"0":{"name":"punctuation.section.array.end.ruby"}},"name":"string.quoted.other.interpolated.ruby","patterns":[{"include":"#interpolated_ruby"},{"include":"#escaped_char"},{"include":"#nest_ltgt_i"}]},{"begin":"%W\\\\{","beginCaptures":{"0":{"name":"punctuation.section.array.begin.ruby"}},"end":"}","endCaptures":{"0":{"name":"punctuation.section.array.end.ruby"}},"name":"string.quoted.other.interpolated.ruby","patterns":[{"include":"#interpolated_ruby"},{"include":"#escaped_char"},{"include":"#nest_curly_i"}]},{"begin":"%W(\\\\W)","beginCaptures":{"0":{"name":"punctuation.section.array.begin.ruby"}},"end":"\\\\1","endCaptures":{"0":{"name":"punctuation.section.array.end.ruby"}},"name":"string.quoted.other.interpolated.ruby","patterns":[{"include":"#interpolated_ruby"},{"include":"#escaped_char"}]},{"begin":"%w\\\\[","beginCaptures":{"0":{"name":"punctuation.section.array.begin.ruby"}},"end":"]","endCaptures":{"0":{"name":"punctuation.section.array.end.ruby"}},"name":"string.quoted.other.ruby","patterns":[{"match":"\\\\\\\\[]\\\\\\\\]","name":"constant.character.escape.ruby"},{"include":"#nest_brackets"}]},{"begin":"%w\\\\(","beginCaptures":{"0":{"name":"punctuation.section.array.begin.ruby"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.section.array.end.ruby"}},"name":"string.quoted.other.ruby","patterns":[{"match":"\\\\\\\\[)\\\\\\\\]","name":"constant.character.escape.ruby"},{"include":"#nest_parens"}]},{"begin":"%w<","beginCaptures":{"0":{"name":"punctuation.section.array.begin.ruby"}},"end":">","endCaptures":{"0":{"name":"punctuation.section.array.end.ruby"}},"name":"string.quoted.other.ruby","patterns":[{"match":"\\\\\\\\[>\\\\\\\\]","name":"constant.character.escape.ruby"},{"include":"#nest_ltgt"}]},{"begin":"%w\\\\{","beginCaptures":{"0":{"name":"punctuation.section.array.begin.ruby"}},"end":"}","endCaptures":{"0":{"name":"punctuation.section.array.end.ruby"}},"name":"string.quoted.other.ruby","patterns":[{"match":"\\\\\\\\[\\\\\\\\}]","name":"constant.character.escape.ruby"},{"include":"#nest_curly"}]},{"begin":"%w(\\\\W)","beginCaptures":{"0":{"name":"punctuation.section.array.begin.ruby"}},"end":"\\\\1","endCaptures":{"0":{"name":"punctuation.section.array.end.ruby"}},"name":"string.quoted.other.ruby","patterns":[{"match":"\\\\\\\\."}]},{"begin":"%[Qx]?\\\\(","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.ruby"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.definition.string.end.ruby"}},"name":"string.quoted.other.interpolated.ruby","patterns":[{"include":"#interpolated_ruby"},{"include":"#escaped_char"},{"include":"#nest_parens_i"}]},{"begin":"%[Qx]?\\\\[","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.ruby"}},"end":"]","endCaptures":{"0":{"name":"punctuation.definition.string.end.ruby"}},"name":"string.quoted.other.interpolated.ruby","patterns":[{"include":"#interpolated_ruby"},{"include":"#escaped_char"},{"include":"#nest_brackets_i"}]},{"begin":"%[Qx]?\\\\{","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.ruby"}},"end":"}","endCaptures":{"0":{"name":"punctuation.definition.string.end.ruby"}},"name":"string.quoted.other.interpolated.ruby","patterns":[{"include":"#interpolated_ruby"},{"include":"#escaped_char"},{"include":"#nest_curly_i"}]},{"begin":"%[Qx]?<","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.ruby"}},"end":">","endCaptures":{"0":{"name":"punctuation.definition.string.end.ruby"}},"name":"string.quoted.other.interpolated.ruby","patterns":[{"include":"#interpolated_ruby"},{"include":"#escaped_char"},{"include":"#nest_ltgt_i"}]},{"begin":"%[Qx](\\\\W)","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.ruby"}},"end":"\\\\1","endCaptures":{"0":{"name":"punctuation.definition.string.end.ruby"}},"name":"string.quoted.other.interpolated.ruby","patterns":[{"include":"#interpolated_ruby"},{"include":"#escaped_char"}]},{"begin":"%([^=\\\\w\\\\s])","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.ruby"}},"end":"\\\\1","endCaptures":{"0":{"name":"punctuation.definition.string.end.ruby"}},"name":"string.quoted.other.interpolated.ruby","patterns":[{"include":"#interpolated_ruby"},{"include":"#escaped_char"}]},{"begin":"%q\\\\(","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.ruby"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.definition.string.end.ruby"}},"name":"string.quoted.other.ruby","patterns":[{"match":"\\\\\\\\[)\\\\\\\\]","name":"constant.character.escape.ruby"},{"include":"#nest_parens"}]},{"begin":"%q<","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.ruby"}},"end":">","endCaptures":{"0":{"name":"punctuation.definition.string.end.ruby"}},"name":"string.quoted.other.ruby","patterns":[{"match":"\\\\\\\\[>\\\\\\\\]","name":"constant.character.escape.ruby"},{"include":"#nest_ltgt"}]},{"begin":"%q\\\\[","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.ruby"}},"end":"]","endCaptures":{"0":{"name":"punctuation.definition.string.end.ruby"}},"name":"string.quoted.other.ruby","patterns":[{"match":"\\\\\\\\[]\\\\\\\\]","name":"constant.character.escape.ruby"},{"include":"#nest_brackets"}]},{"begin":"%q\\\\{","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.ruby"}},"end":"}","endCaptures":{"0":{"name":"punctuation.definition.string.end.ruby"}},"name":"string.quoted.other.ruby","patterns":[{"match":"\\\\\\\\[\\\\\\\\}]","name":"constant.character.escape.ruby"},{"include":"#nest_curly"}]},{"begin":"%q(\\\\W)","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.ruby"}},"end":"\\\\1","endCaptures":{"0":{"name":"punctuation.definition.string.end.ruby"}},"name":"string.quoted.other.ruby","patterns":[{"match":"\\\\\\\\."}]},{"begin":"%s\\\\(","beginCaptures":{"0":{"name":"punctuation.definition.symbol.begin.ruby"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.definition.symbol.end.ruby"}},"name":"constant.language.symbol.ruby","patterns":[{"match":"\\\\\\\\[)\\\\\\\\]","name":"constant.character.escape.ruby"},{"include":"#nest_parens"}]},{"begin":"%s<","beginCaptures":{"0":{"name":"punctuation.definition.symbol.begin.ruby"}},"end":">","endCaptures":{"0":{"name":"punctuation.definition.symbol.end.ruby"}},"name":"constant.language.symbol.ruby","patterns":[{"match":"\\\\\\\\[>\\\\\\\\]","name":"constant.character.escape.ruby"},{"include":"#nest_ltgt"}]},{"begin":"%s\\\\[","beginCaptures":{"0":{"name":"punctuation.definition.symbol.begin.ruby"}},"end":"]","endCaptures":{"0":{"name":"punctuation.definition.symbol.end.ruby"}},"name":"constant.language.symbol.ruby","patterns":[{"match":"\\\\\\\\[]\\\\\\\\]","name":"constant.character.escape.ruby"},{"include":"#nest_brackets"}]},{"begin":"%s\\\\{","beginCaptures":{"0":{"name":"punctuation.definition.symbol.begin.ruby"}},"end":"}","endCaptures":{"0":{"name":"punctuation.definition.symbol.end.ruby"}},"name":"constant.language.symbol.ruby","patterns":[{"match":"\\\\\\\\[\\\\\\\\}]","name":"constant.character.escape.ruby"},{"include":"#nest_curly"}]},{"begin":"%s(\\\\W)","beginCaptures":{"0":{"name":"punctuation.definition.symbol.begin.ruby"}},"end":"\\\\1","endCaptures":{"0":{"name":"punctuation.definition.symbol.end.ruby"}},"name":"constant.language.symbol.ruby","patterns":[{"match":"\\\\\\\\."}]},{"captures":{"1":{"name":"punctuation.definition.constant.ruby"}},"match":"(?<!:)(:)(?>[$A-Z_a-z]\\\\w*(?>[!?]|=(?![=>]))?|===?|<=>|>[=>]?|<[<=]?|[%\\\\&/\`|]|\\\\*\\\\*?|=?~|[-+]@?|\\\\[]=?|@@?[A-Z_a-z]\\\\w*)","name":"constant.language.symbol.ruby"},{"begin":"^=begin","captures":{"0":{"name":"punctuation.definition.comment.ruby"}},"end":"^=end","name":"comment.block.documentation.ruby"},{"include":"#yard"},{"begin":"(^[\\\\t ]+)?(?=#)","beginCaptures":{"1":{"name":"punctuation.whitespace.comment.leading.ruby"}},"end":"(?!\\\\G)","patterns":[{"begin":"#","beginCaptures":{"0":{"name":"punctuation.definition.comment.ruby"}},"end":"\\\\n","name":"comment.line.number-sign.ruby"}]},{"match":"(?<!\\\\w)\\\\?(\\\\\\\\(x\\\\h{1,2}(?!\\\\h)\\\\b|0[0-7]{0,2}(?![0-7])\\\\b|[^0CMx])|(\\\\\\\\[CM]-)+\\\\w|[^\\\\\\\\\\\\s])","name":"constant.numeric.ruby"},{"begin":"^__END__\\\\n","captures":{"0":{"name":"string.unquoted.program-block.ruby"}},"contentName":"text.plain","end":"(?=not)impossible","patterns":[{"begin":"(?=<?xml|<(?i:html\\\\b)|!DOCTYPE (?i:html\\\\b))","end":"(?=not)impossible","name":"text.html.embedded.ruby","patterns":[{"include":"text.html.basic"}]}]},{"begin":"(?=(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)HTML)\\\\b\\\\1))","end":"^\\\\s*((?:[_\\\\w]+_|)HTML)$\\\\n?","endCaptures":{"0":{"name":"string.definition.end.ruby"}},"name":"meta.embedded.block.html","patterns":[{"begin":"(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)HTML)\\\\b\\\\1)","beginCaptures":{"0":{"name":"string.definition.begin.ruby"}},"contentName":"text.html","patterns":[{"include":"#heredoc"},{"include":"#interpolated_ruby"},{"include":"text.html.basic"},{"include":"#escaped_char"}],"while":"^(?!\\\\s*((?:[_\\\\w]+_|)HTML)\\\\s*$)"}]},{"begin":"(?=(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)HAML)\\\\b\\\\1))","end":"^\\\\s*((?:[_\\\\w]+_|)HAML)$\\\\n?","endCaptures":{"0":{"name":"string.definition.end.ruby"}},"name":"meta.embedded.block.haml","patterns":[{"begin":"(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)HAML)\\\\b\\\\1)","beginCaptures":{"0":{"name":"string.definition.begin.ruby"}},"contentName":"text.haml","patterns":[{"include":"#heredoc"},{"include":"#interpolated_ruby"},{"include":"text.haml"},{"include":"#escaped_char"}],"while":"^(?!\\\\s*((?:[_\\\\w]+_|)HAML)\\\\s*$)"}]},{"begin":"(?=(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)XML)\\\\b\\\\1))","end":"^\\\\s*((?:[_\\\\w]+_|)XML)$\\\\n?","endCaptures":{"0":{"name":"string.definition.end.ruby"}},"name":"meta.embedded.block.xml","patterns":[{"begin":"(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)XML)\\\\b\\\\1)","beginCaptures":{"0":{"name":"string.definition.begin.ruby"}},"contentName":"text.xml","patterns":[{"include":"#heredoc"},{"include":"#interpolated_ruby"},{"include":"text.xml"},{"include":"#escaped_char"}],"while":"^(?!\\\\s*((?:[_\\\\w]+_|)XML)\\\\s*$)"}]},{"begin":"(?=(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)SQL)\\\\b\\\\1))","end":"^\\\\s*((?:[_\\\\w]+_|)SQL)$\\\\n?","endCaptures":{"0":{"name":"string.definition.end.ruby"}},"name":"meta.embedded.block.sql","patterns":[{"begin":"(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)SQL)\\\\b\\\\1)","beginCaptures":{"0":{"name":"string.definition.begin.ruby"}},"contentName":"source.sql","patterns":[{"include":"#heredoc"},{"include":"#interpolated_ruby"},{"include":"source.sql"},{"include":"#escaped_char"}],"while":"^(?!\\\\s*((?:[_\\\\w]+_|)SQL)\\\\s*$)"}]},{"begin":"(?=(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)G(?:RAPHQL|QL))\\\\b\\\\1))","end":"^\\\\s*((?:[_\\\\w]+_|)G(?:RAPHQL|QL))$\\\\n?","endCaptures":{"0":{"name":"string.definition.end.ruby"}},"name":"meta.embedded.block.graphql","patterns":[{"begin":"(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)G(?:RAPHQL|QL))\\\\b\\\\1)","beginCaptures":{"0":{"name":"string.definition.begin.ruby"}},"contentName":"source.graphql","patterns":[{"include":"#heredoc"},{"include":"#interpolated_ruby"},{"include":"source.graphql"},{"include":"#escaped_char"}],"while":"^(?!\\\\s*((?:[_\\\\w]+_|)G(?:RAPHQL|QL))\\\\s*$)"}]},{"begin":"(?=(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)CSS)\\\\b\\\\1))","end":"^\\\\s*((?:[_\\\\w]+_|)CSS)$\\\\n?","endCaptures":{"0":{"name":"string.definition.end.ruby"}},"name":"meta.embedded.block.css","patterns":[{"begin":"(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)CSS)\\\\b\\\\1)","beginCaptures":{"0":{"name":"string.definition.begin.ruby"}},"contentName":"source.css","patterns":[{"include":"#heredoc"},{"include":"#interpolated_ruby"},{"include":"source.css"},{"include":"#escaped_char"}],"while":"^(?!\\\\s*((?:[_\\\\w]+_|)CSS)\\\\s*$)"}]},{"begin":"(?=(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)CPP)\\\\b\\\\1))","end":"^\\\\s*((?:[_\\\\w]+_|)CPP)$\\\\n?","endCaptures":{"0":{"name":"string.definition.end.ruby"}},"name":"meta.embedded.block.cpp","patterns":[{"begin":"(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)CPP)\\\\b\\\\1)","beginCaptures":{"0":{"name":"string.definition.begin.ruby"}},"contentName":"source.cpp","patterns":[{"include":"#heredoc"},{"include":"#interpolated_ruby"},{"include":"source.cpp"},{"include":"#escaped_char"}],"while":"^(?!\\\\s*((?:[_\\\\w]+_|)CPP)\\\\s*$)"}]},{"begin":"(?=(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)C)\\\\b\\\\1))","end":"^\\\\s*((?:[_\\\\w]+_|)C)$\\\\n?","endCaptures":{"0":{"name":"string.definition.end.ruby"}},"name":"meta.embedded.block.c","patterns":[{"begin":"(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)C)\\\\b\\\\1)","beginCaptures":{"0":{"name":"string.definition.begin.ruby"}},"contentName":"source.c","patterns":[{"include":"#heredoc"},{"include":"#interpolated_ruby"},{"include":"source.c"},{"include":"#escaped_char"}],"while":"^(?!\\\\s*((?:[_\\\\w]+_|)C)\\\\s*$)"}]},{"begin":"(?=(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)J(?:S|AVASCRIPT))\\\\b\\\\1))","end":"^\\\\s*((?:[_\\\\w]+_|)J(?:S|AVASCRIPT))$\\\\n?","endCaptures":{"0":{"name":"string.definition.end.ruby"}},"name":"meta.embedded.block.js","patterns":[{"begin":"(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)J(?:S|AVASCRIPT))\\\\b\\\\1)","beginCaptures":{"0":{"name":"string.definition.begin.ruby"}},"contentName":"source.js","patterns":[{"include":"#heredoc"},{"include":"#interpolated_ruby"},{"include":"source.js"},{"include":"#escaped_char"}],"while":"^(?!\\\\s*((?:[_\\\\w]+_|)J(?:S|AVASCRIPT))\\\\s*$)"}]},{"begin":"(?=(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)JQUERY)\\\\b\\\\1))","end":"^\\\\s*((?:[_\\\\w]+_|)JQUERY)$\\\\n?","endCaptures":{"0":{"name":"string.definition.end.ruby"}},"name":"meta.embedded.block.js.jquery","patterns":[{"begin":"(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)JQUERY)\\\\b\\\\1)","beginCaptures":{"0":{"name":"string.definition.begin.ruby"}},"contentName":"source.js.jquery","patterns":[{"include":"#heredoc"},{"include":"#interpolated_ruby"},{"include":"source.js.jquery"},{"include":"#escaped_char"}],"while":"^(?!\\\\s*((?:[_\\\\w]+_|)JQUERY)\\\\s*$)"}]},{"begin":"(?=(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)SH(?:|ELL))\\\\b\\\\1))","end":"^\\\\s*((?:[_\\\\w]+_|)SH(?:|ELL))$\\\\n?","endCaptures":{"0":{"name":"string.definition.end.ruby"}},"name":"meta.embedded.block.shell","patterns":[{"begin":"(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)SH(?:|ELL))\\\\b\\\\1)","beginCaptures":{"0":{"name":"string.definition.begin.ruby"}},"contentName":"source.shell","patterns":[{"include":"#heredoc"},{"include":"#interpolated_ruby"},{"include":"source.shell"},{"include":"#escaped_char"}],"while":"^(?!\\\\s*((?:[_\\\\w]+_|)SH(?:|ELL))\\\\s*$)"}]},{"begin":"(?=(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)LUA)\\\\b\\\\1))","end":"^\\\\s*((?:[_\\\\w]+_|)LUA)$\\\\n?","endCaptures":{"0":{"name":"string.definition.end.ruby"}},"name":"meta.embedded.block.lua","patterns":[{"begin":"(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)LUA)\\\\b\\\\1)","beginCaptures":{"0":{"name":"string.definition.begin.ruby"}},"contentName":"source.lua","patterns":[{"include":"#heredoc"},{"include":"#interpolated_ruby"},{"include":"source.lua"},{"include":"#escaped_char"}],"while":"^(?!\\\\s*((?:[_\\\\w]+_|)LUA)\\\\s*$)"}]},{"begin":"(?=(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)RUBY)\\\\b\\\\1))","end":"^\\\\s*((?:[_\\\\w]+_|)RUBY)$\\\\n?","endCaptures":{"0":{"name":"string.definition.end.ruby"}},"name":"meta.embedded.block.ruby","patterns":[{"begin":"(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)RUBY)\\\\b\\\\1)","beginCaptures":{"0":{"name":"string.definition.begin.ruby"}},"contentName":"source.ruby","patterns":[{"include":"#heredoc"},{"include":"#interpolated_ruby"},{"include":"source.ruby"},{"include":"#escaped_char"}],"while":"^(?!\\\\s*((?:[_\\\\w]+_|)RUBY)\\\\s*$)"}]},{"begin":"(?=(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)YA?ML)\\\\b\\\\1))","end":"^\\\\s*((?:[_\\\\w]+_|)YA?ML)$\\\\n?","endCaptures":{"0":{"name":"string.definition.end.ruby"}},"name":"meta.embedded.block.yaml","patterns":[{"begin":"(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)YA?ML)\\\\b\\\\1)","beginCaptures":{"0":{"name":"string.definition.begin.ruby"}},"contentName":"source.yaml","patterns":[{"include":"#heredoc"},{"include":"#interpolated_ruby"},{"include":"source.yaml"},{"include":"#escaped_char"}],"while":"^(?!\\\\s*((?:[_\\\\w]+_|)YA?ML)\\\\s*$)"}]},{"begin":"(?=(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)SLIM)\\\\b\\\\1))","end":"^\\\\s*((?:[_\\\\w]+_|)SLIM)$\\\\n?","endCaptures":{"0":{"name":"string.definition.end.ruby"}},"name":"meta.embedded.block.slim","patterns":[{"begin":"(?><<[-~]?([\\"'\`]?)((?:[_\\\\w]+_|)SLIM)\\\\b\\\\1)","beginCaptures":{"0":{"name":"string.definition.begin.ruby"}},"contentName":"text.slim","patterns":[{"include":"#heredoc"},{"include":"#interpolated_ruby"},{"include":"text.slim"},{"include":"#escaped_char"}],"while":"^(?!\\\\s*((?:[_\\\\w]+_|)SLIM)\\\\s*$)"}]},{"begin":"(?>=\\\\s*<<([\\"'\`]?)(\\\\w+)\\\\1)","beginCaptures":{"0":{"name":"string.definition.begin.ruby"}},"contentName":"string.unquoted.heredoc.ruby","end":"^\\\\2$","endCaptures":{"0":{"name":"string.definition.end.ruby"}},"patterns":[{"include":"#heredoc"},{"include":"#interpolated_ruby"},{"include":"#escaped_char"}]},{"begin":"(?>((<<[-~]?([\\"'\`]?)(\\\\w+)\\\\3,\\\\s?)*<<[-~]?([\\"'\`]?)(\\\\w+)\\\\5))(.*)","beginCaptures":{"1":{"name":"string.definition.begin.ruby"},"7":{"patterns":[{"include":"source.ruby"}]}},"contentName":"string.unquoted.heredoc.ruby","end":"^\\\\s*\\\\6$","endCaptures":{"0":{"name":"string.definition.end.ruby"}},"patterns":[{"include":"#heredoc"},{"include":"#interpolated_ruby"},{"include":"#escaped_char"}]},{"begin":"(?<=\\\\{|\\\\{\\\\s+|[^$0-:@-Z_a-z]do|^do|[^$0-:@-Z_a-z]do\\\\s+|^do\\\\s+)(\\\\|)","captures":{"1":{"name":"punctuation.separator.variable.ruby"}},"end":"(?<!\\\\|)(\\\\|)(?!\\\\|)","name":"meta.block.parameters.ruby","patterns":[{"begin":"(?![(,|\\\\s])","end":"(?=,|\\\\|\\\\s*)","patterns":[{"captures":{"1":{"name":"storage.type.variable.ruby"},"2":{"name":"variable.other.block.ruby"}},"match":"\\\\G((?:&|\\\\*\\\\*?)?)([A-Z_a-z][_\\\\w]*)"}]},{"match":",","name":"punctuation.separator.variable.ruby"}]},{"match":"=>","name":"punctuation.separator.key-value"},{"match":"->","name":"support.function.kernel.ruby"},{"match":"<<=|%=|&{1,2}=|\\\\*=|\\\\*\\\\*=|\\\\+=|-=|\\\\^=|\\\\|{1,2}=|<<","name":"keyword.operator.assignment.augmented.ruby"},{"match":"<=>|<(?![<=])|>(?![<=>])|<=|>=|===?|=~|!=|!~|(?<=[\\\\t ])\\\\?","name":"keyword.operator.comparison.ruby"},{"match":"(?<!\\\\.)\\\\b(and|not|or)\\\\b(?![!?])","name":"keyword.operator.logical.ruby"},{"match":"(?<=^|[\\\\t !])!|&&|\\\\|\\\\||\\\\^","name":"keyword.operator.logical.ruby"},{"captures":{"1":{"name":"keyword.operator.logical.ruby"}},"match":"(&\\\\.)\\\\s*(?![A-Z])"},{"match":"([%\\\\&]|\\\\*\\\\*|[-*+/])","name":"keyword.operator.arithmetic.ruby"},{"match":"=","name":"keyword.operator.assignment.ruby"},{"match":"[|~]|>>","name":"keyword.operator.other.ruby"},{"match":";","name":"punctuation.separator.statement.ruby"},{"match":",","name":"punctuation.separator.object.ruby"},{"captures":{"1":{"name":"punctuation.separator.namespace.ruby"}},"match":"(::)\\\\s*(?=[A-Z])"},{"captures":{"1":{"name":"punctuation.separator.method.ruby"}},"match":"(\\\\.|::)\\\\s*(?![A-Z])"},{"match":":","name":"punctuation.separator.other.ruby"},{"match":"\\\\{","name":"punctuation.section.scope.begin.ruby"},{"match":"}","name":"punctuation.section.scope.end.ruby"},{"match":"\\\\[","name":"punctuation.section.array.begin.ruby"},{"match":"]","name":"punctuation.section.array.end.ruby"},{"match":"[()]","name":"punctuation.section.function.ruby"},{"begin":"(?<=[^.]\\\\.|::)(?=[A-Za-z][!0-9?A-Z_a-z]*[^!0-9?A-Z_a-z])","end":"(?<=[!0-9?A-Z_a-z])(?=[^!0-9?A-Z_a-z])","name":"meta.function-call.ruby","patterns":[{"match":"([A-Za-z][!0-9?A-Z_a-z]*)(?=[^!0-9?A-Z_a-z])","name":"entity.name.function.ruby"}]},{"begin":"([A-Za-z]\\\\w*[!?]?)(\\\\()","beginCaptures":{"1":{"name":"entity.name.function.ruby"},"2":{"name":"punctuation.section.function.ruby"}},"end":"(\\\\))","endCaptures":{"1":{"name":"punctuation.section.function.ruby"}},"name":"meta.function-call.ruby","patterns":[{"include":"$self"}]}],"repository":{"escaped_char":{"match":"\\\\\\\\(?:[0-7]{1,3}|x[A-Fa-f\\\\d]{1,2}|.)","name":"constant.character.escape.ruby"},"heredoc":{"begin":"^<<[-~]?\\\\w+","end":"$","patterns":[{"include":"$self"}]},"interpolated_ruby":{"patterns":[{"begin":"#\\\\{","beginCaptures":{"0":{"name":"punctuation.section.embedded.begin.ruby"}},"contentName":"source.ruby","end":"}","endCaptures":{"0":{"name":"punctuation.section.embedded.end.ruby"}},"name":"meta.embedded.line.ruby","patterns":[{"include":"#nest_curly_and_self"},{"include":"$self"}]},{"captures":{"1":{"name":"punctuation.definition.variable.ruby"}},"match":"(#@)[A-Z_a-z]\\\\w*","name":"variable.other.readwrite.instance.ruby"},{"captures":{"1":{"name":"punctuation.definition.variable.ruby"}},"match":"(#@@)[A-Z_a-z]\\\\w*","name":"variable.other.readwrite.class.ruby"},{"captures":{"1":{"name":"punctuation.definition.variable.ruby"}},"match":"(#\\\\$)[A-Z_a-z]\\\\w*","name":"variable.other.readwrite.global.ruby"}]},"method_parameters":{"patterns":[{"include":"#parens"},{"include":"#braces"},{"include":"#brackets"},{"include":"#params"},{"include":"$self"}],"repository":{"braces":{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.section.scope.begin.ruby"}},"end":"}","endCaptures":{"0":{"name":"punctuation.section.scope.end.ruby"}},"patterns":[{"include":"#parens"},{"include":"#braces"},{"include":"#brackets"},{"include":"$self"}]},"brackets":{"begin":"\\\\[","beginCaptures":{"0":{"name":"punctuation.section.array.begin.ruby"}},"end":"]","endCaptures":{"0":{"name":"punctuation.section.array.end.ruby"}},"patterns":[{"include":"#parens"},{"include":"#braces"},{"include":"#brackets"},{"include":"$self"}]},"params":{"captures":{"1":{"name":"storage.type.variable.ruby"},"2":{"name":"constant.other.symbol.hashkey.parameter.function.ruby"},"3":{"name":"punctuation.definition.constant.ruby"},"4":{"name":"variable.parameter.function.ruby"}},"match":"\\\\G(&|\\\\*\\\\*?)?(?:([A-Z_a-z]\\\\w*[!?]?(:))|([A-Z_a-z]\\\\w*))"},"parens":{"begin":"\\\\(","beginCaptures":{"0":{"name":"punctuation.section.function.begin.ruby"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.section.function.end.ruby"}},"patterns":[{"include":"#parens"},{"include":"#braces"},{"include":"#brackets"},{"include":"$self"}]}}},"nest_brackets":{"begin":"\\\\[","captures":{"0":{"name":"punctuation.section.scope.ruby"}},"end":"]","patterns":[{"include":"#nest_brackets"}]},"nest_brackets_i":{"begin":"\\\\[","captures":{"0":{"name":"punctuation.section.scope.ruby"}},"end":"]","patterns":[{"include":"#interpolated_ruby"},{"include":"#escaped_char"},{"include":"#nest_brackets_i"}]},"nest_brackets_r":{"begin":"\\\\[","captures":{"0":{"name":"punctuation.section.scope.ruby"}},"end":"]","patterns":[{"include":"#regex_sub"},{"include":"#nest_brackets_r"}]},"nest_curly":{"begin":"\\\\{","captures":{"0":{"name":"punctuation.section.scope.ruby"}},"end":"}","patterns":[{"include":"#nest_curly"}]},"nest_curly_and_self":{"patterns":[{"begin":"\\\\{","captures":{"0":{"name":"punctuation.section.scope.ruby"}},"end":"}","patterns":[{"include":"#nest_curly_and_self"}]},{"include":"$self"}]},"nest_curly_i":{"begin":"\\\\{","captures":{"0":{"name":"punctuation.section.scope.ruby"}},"end":"}","patterns":[{"include":"#interpolated_ruby"},{"include":"#escaped_char"},{"include":"#nest_curly_i"}]},"nest_curly_r":{"begin":"\\\\{","captures":{"0":{"name":"punctuation.section.scope.ruby"}},"end":"}","patterns":[{"include":"#regex_sub"},{"include":"#nest_curly_r"}]},"nest_ltgt":{"begin":"<","captures":{"0":{"name":"punctuation.section.scope.ruby"}},"end":">","patterns":[{"include":"#nest_ltgt"}]},"nest_ltgt_i":{"begin":"<","captures":{"0":{"name":"punctuation.section.scope.ruby"}},"end":">","patterns":[{"include":"#interpolated_ruby"},{"include":"#escaped_char"},{"include":"#nest_ltgt_i"}]},"nest_ltgt_r":{"begin":"<","captures":{"0":{"name":"punctuation.section.scope.ruby"}},"end":">","patterns":[{"include":"#regex_sub"},{"include":"#nest_ltgt_r"}]},"nest_parens":{"begin":"\\\\(","captures":{"0":{"name":"punctuation.section.scope.ruby"}},"end":"\\\\)","patterns":[{"include":"#nest_parens"}]},"nest_parens_i":{"begin":"\\\\(","captures":{"0":{"name":"punctuation.section.scope.ruby"}},"end":"\\\\)","patterns":[{"include":"#interpolated_ruby"},{"include":"#escaped_char"},{"include":"#nest_parens_i"}]},"nest_parens_r":{"begin":"\\\\(","captures":{"0":{"name":"punctuation.section.scope.ruby"}},"end":"\\\\)","patterns":[{"include":"#regex_sub"},{"include":"#nest_parens_r"}]},"regex_sub":{"patterns":[{"include":"#interpolated_ruby"},{"include":"#escaped_char"},{"captures":{"1":{"name":"punctuation.definition.arbitrary-repetition.ruby"},"3":{"name":"punctuation.definition.arbitrary-repetition.ruby"}},"match":"(\\\\{)\\\\d+(,\\\\d+)?(})","name":"string.regexp.arbitrary-repetition.ruby"},{"begin":"\\\\[(?:\\\\^?])?","captures":{"0":{"name":"punctuation.definition.character-class.ruby"}},"end":"]","name":"string.regexp.character-class.ruby","patterns":[{"include":"#escaped_char"}]},{"begin":"\\\\(\\\\?#","beginCaptures":{"0":{"name":"punctuation.definition.comment.begin.ruby"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.definition.comment.end.ruby"}},"name":"comment.line.number-sign.ruby","patterns":[{"include":"#escaped_char"}]},{"begin":"\\\\(","captures":{"0":{"name":"punctuation.definition.group.ruby"}},"end":"\\\\)","name":"string.regexp.group.ruby","patterns":[{"include":"#regex_sub"}]},{"begin":"(?<=^|\\\\s)(#)\\\\s(?=[-\\\\t !,.0-9?A-Za-z[^\\\\x00-\\\\x7F]]*$)","beginCaptures":{"1":{"name":"punctuation.definition.comment.ruby"}},"end":"$\\\\n?","endCaptures":{"0":{"name":"punctuation.definition.comment.ruby"}},"name":"comment.line.number-sign.ruby"}]},"yard":{"patterns":[{"include":"#yard_comment"},{"include":"#yard_param_types"},{"include":"#yard_option"},{"include":"#yard_tag"},{"include":"#yard_types"},{"include":"#yard_directive"},{"include":"#yard_see"},{"include":"#yard_macro_attribute"}]},"yard_comment":{"begin":"^(\\\\s*)(#)(\\\\s*)(@)(abstract|api|author|deprecated|example|macro|note|overload|since|todo|version)(?=\\\\s|$)","beginCaptures":{"2":{"name":"punctuation.definition.comment.ruby"},"4":{"name":"comment.line.keyword.punctuation.yard.ruby"},"5":{"name":"comment.line.keyword.yard.ruby"}},"contentName":"comment.line.string.yard.ruby","end":"^(?!\\\\s*#\\\\3\\\\s{2,}|\\\\s*#\\\\s*$)","name":"comment.line.number-sign.ruby","patterns":[{"include":"#yard"},{"include":"#yard_continuation"}]},"yard_continuation":{"match":"^\\\\s*#","name":"punctuation.definition.comment.ruby"},"yard_directive":{"begin":"^(\\\\s*)(#)(\\\\s*)(@!)(endgroup|group|method|parse|scope|visibility)(\\\\s+((\\\\[).+(])))?(?=\\\\s)","beginCaptures":{"2":{"name":"punctuation.definition.comment.ruby"},"4":{"name":"comment.line.keyword.punctuation.yard.ruby"},"5":{"name":"comment.line.keyword.yard.ruby"},"7":{"name":"comment.line.type.yard.ruby"},"8":{"name":"comment.line.punctuation.yard.ruby"},"9":{"name":"comment.line.punctuation.yard.ruby"}},"contentName":"comment.line.string.yard.ruby","end":"^(?!\\\\s*#\\\\3\\\\s{2,}|\\\\s*#\\\\s*$)","name":"comment.line.number-sign.ruby","patterns":[{"include":"#yard"},{"include":"#yard_continuation"}]},"yard_macro_attribute":{"begin":"^(\\\\s*)(#)(\\\\s*)(@!)(attribute|macro)(\\\\s+((\\\\[).+(])))?(?=\\\\s)(\\\\s+([_a-z]\\\\w*:?))?","beginCaptures":{"2":{"name":"punctuation.definition.comment.ruby"},"4":{"name":"comment.line.keyword.punctuation.yard.ruby"},"5":{"name":"comment.line.keyword.yard.ruby"},"7":{"name":"comment.line.type.yard.ruby"},"8":{"name":"comment.line.punctuation.yard.ruby"},"9":{"name":"comment.line.punctuation.yard.ruby"},"11":{"name":"comment.line.parameter.yard.ruby"}},"contentName":"comment.line.string.yard.ruby","end":"^(?!\\\\s*#\\\\3\\\\s{2,}|\\\\s*#\\\\s*$)","name":"comment.line.number-sign.ruby","patterns":[{"include":"#yard"},{"include":"#yard_continuation"}]},"yard_option":{"begin":"^(\\\\s*)(#)(\\\\s*)(@)(option)(?=\\\\s)(?>\\\\s+([_a-z]\\\\w*:?))?(?>\\\\s+((\\\\[).+(])))?(?>\\\\s+((\\\\S*)))?(?>\\\\s+((\\\\().+(\\\\))))?","beginCaptures":{"2":{"name":"punctuation.definition.comment.ruby"},"4":{"name":"comment.line.keyword.punctuation.yard.ruby"},"5":{"name":"comment.line.keyword.yard.ruby"},"6":{"name":"comment.line.parameter.yard.ruby"},"7":{"name":"comment.line.type.yard.ruby"},"8":{"name":"comment.line.punctuation.yard.ruby"},"9":{"name":"comment.line.punctuation.yard.ruby"},"10":{"name":"comment.line.keyword.yard.ruby"},"11":{"name":"comment.line.hashkey.yard.ruby"},"12":{"name":"comment.line.defaultvalue.yard.ruby"},"13":{"name":"comment.line.punctuation.yard.ruby"},"14":{"name":"comment.line.punctuation.yard.ruby"}},"contentName":"comment.line.string.yard.ruby","end":"^(?!\\\\s*#\\\\3\\\\s{2,}|\\\\s*#\\\\s*$)","name":"comment.line.number-sign.ruby","patterns":[{"include":"#yard"},{"include":"#yard_continuation"}]},"yard_param_types":{"begin":"^(\\\\s*)(#)(\\\\s*)(@)(attr|attr_reader|attr_writer|yieldparam|param)(?=\\\\s)(?>\\\\s+(?>([_a-z]\\\\w*:?)|((\\\\[).+(]))))?(?>\\\\s+(?>((\\\\[).+(]))|([_a-z]\\\\w*:?)))?","beginCaptures":{"2":{"name":"punctuation.definition.comment.ruby"},"4":{"name":"comment.line.keyword.punctuation.yard.ruby"},"5":{"name":"comment.line.keyword.yard.ruby"},"6":{"name":"comment.line.parameter.yard.ruby"},"7":{"name":"comment.line.type.yard.ruby"},"8":{"name":"comment.line.punctuation.yard.ruby"},"9":{"name":"comment.line.punctuation.yard.ruby"},"10":{"name":"comment.line.type.yard.ruby"},"11":{"name":"comment.line.punctuation.yard.ruby"},"12":{"name":"comment.line.punctuation.yard.ruby"},"13":{"name":"comment.line.parameter.yard.ruby"}},"contentName":"comment.line.string.yard.ruby","end":"^(?!\\\\s*#\\\\3\\\\s{2,}|\\\\s*#\\\\s*$)","name":"comment.line.number-sign.ruby","patterns":[{"include":"#yard"},{"include":"#yard_continuation"}]},"yard_see":{"begin":"^(\\\\s*)(#)(\\\\s*)(@)(see)(?=\\\\s)(\\\\s+(.+?))?(?=\\\\s|$)","beginCaptures":{"2":{"name":"punctuation.definition.comment.ruby"},"4":{"name":"comment.line.keyword.punctuation.yard.ruby"},"5":{"name":"comment.line.keyword.yard.ruby"},"7":{"name":"comment.line.parameter.yard.ruby"}},"contentName":"comment.line.string.yard.ruby","end":"^(?!\\\\s*#\\\\3\\\\s{2,}|\\\\s*#\\\\s*$)","name":"comment.line.number-sign.ruby","patterns":[{"include":"#yard"},{"include":"#yard_continuation"}]},"yard_tag":{"captures":{"2":{"name":"punctuation.definition.comment.ruby"},"4":{"name":"comment.line.keyword.punctuation.yard.ruby"},"5":{"name":"comment.line.keyword.yard.ruby"}},"match":"^(\\\\s*)(#)(\\\\s*)(@)(private)$","name":"comment.line.number-sign.ruby"},"yard_types":{"begin":"^(\\\\s*)(#)(\\\\s*)(@)(raise|return|yield(?:return)?)(?=\\\\s)(\\\\s+((\\\\[).+(])))?","beginCaptures":{"2":{"name":"punctuation.definition.comment.ruby"},"4":{"name":"comment.line.keyword.punctuation.yard.ruby"},"5":{"name":"comment.line.keyword.yard.ruby"},"7":{"name":"comment.line.type.yard.ruby"},"8":{"name":"comment.line.punctuation.yard.ruby"},"9":{"name":"comment.line.punctuation.yard.ruby"}},"contentName":"comment.line.string.yard.ruby","end":"^(?!\\\\s*#\\\\3\\\\s{2,}|\\\\s*#\\\\s*$)","name":"comment.line.number-sign.ruby","patterns":[{"include":"#yard"},{"include":"#yard_continuation"}]}},"scopeName":"source.ruby","embeddedLangs":["html","haml","xml","sql","graphql","css","cpp","c","javascript","shellscript","lua","yaml"],"aliases":["rb"]}`)),m=[...s,...f,...l,...n,...o,...i,...r,...t,...a,...e,...c,...u,p];export{m as default};
|
dist/assets/tsx-Cj8HH6Br.js
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dist/assets/typescript-Di2stYAd.js
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dist/assets/worker-CUNpJr-j.js
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dist/assets/xml-yX2vS4f7.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{t as e}from"./java-Cf25h0JE.js";var t=Object.freeze(JSON.parse(`{"displayName":"XML","name":"xml","patterns":[{"begin":"(<\\\\?)\\\\s*([-0-9A-Z_a-z]+)","captures":{"1":{"name":"punctuation.definition.tag.xml"},"2":{"name":"entity.name.tag.xml"}},"end":"(\\\\?>)","name":"meta.tag.preprocessor.xml","patterns":[{"match":" ([-A-Za-z]+)","name":"entity.other.attribute-name.xml"},{"include":"#doublequotedString"},{"include":"#singlequotedString"}]},{"begin":"(<!)(DOCTYPE)\\\\s+([:A-Z_a-z][-.0-:A-Z_a-z]*)","captures":{"1":{"name":"punctuation.definition.tag.xml"},"2":{"name":"keyword.other.doctype.xml"},"3":{"name":"variable.language.documentroot.xml"}},"end":"\\\\s*(>)","name":"meta.tag.sgml.doctype.xml","patterns":[{"include":"#internalSubset"}]},{"include":"#comments"},{"begin":"(<)((?:([-0-9A-Z_a-z]+)(:))?([-0-:A-Z_a-z]+))(?=(\\\\s[^>]*)?></\\\\2>)","beginCaptures":{"1":{"name":"punctuation.definition.tag.xml"},"2":{"name":"entity.name.tag.xml"},"3":{"name":"entity.name.tag.namespace.xml"},"4":{"name":"punctuation.separator.namespace.xml"},"5":{"name":"entity.name.tag.localname.xml"}},"end":"(>)(</)((?:([-0-9A-Z_a-z]+)(:))?([-0-:A-Z_a-z]+))(>)","endCaptures":{"1":{"name":"punctuation.definition.tag.xml"},"2":{"name":"punctuation.definition.tag.xml"},"3":{"name":"entity.name.tag.xml"},"4":{"name":"entity.name.tag.namespace.xml"},"5":{"name":"punctuation.separator.namespace.xml"},"6":{"name":"entity.name.tag.localname.xml"},"7":{"name":"punctuation.definition.tag.xml"}},"name":"meta.tag.no-content.xml","patterns":[{"include":"#tagStuff"}]},{"begin":"(</?)(?:([-.\\\\w]+)((:)))?([-.:\\\\w]+)","captures":{"1":{"name":"punctuation.definition.tag.xml"},"2":{"name":"entity.name.tag.namespace.xml"},"3":{"name":"entity.name.tag.xml"},"4":{"name":"punctuation.separator.namespace.xml"},"5":{"name":"entity.name.tag.localname.xml"}},"end":"(/?>)","name":"meta.tag.xml","patterns":[{"include":"#tagStuff"}]},{"include":"#entity"},{"include":"#bare-ampersand"},{"begin":"<%@","beginCaptures":{"0":{"name":"punctuation.section.embedded.begin.xml"}},"end":"%>","endCaptures":{"0":{"name":"punctuation.section.embedded.end.xml"}},"name":"source.java-props.embedded.xml","patterns":[{"match":"page|include|taglib","name":"keyword.other.page-props.xml"}]},{"begin":"<%[!=]?(?!--)","beginCaptures":{"0":{"name":"punctuation.section.embedded.begin.xml"}},"end":"(?!--)%>","endCaptures":{"0":{"name":"punctuation.section.embedded.end.xml"}},"name":"source.java.embedded.xml","patterns":[{"include":"source.java"}]},{"begin":"<!\\\\[CDATA\\\\[","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.xml"}},"end":"]]>","endCaptures":{"0":{"name":"punctuation.definition.string.end.xml"}},"name":"string.unquoted.cdata.xml"}],"repository":{"EntityDecl":{"begin":"(<!)(ENTITY)\\\\s+(%\\\\s+)?([:A-Z_a-z][-.0-:A-Z_a-z]*)(\\\\s+(?:SYSTEM|PUBLIC)\\\\s+)?","captures":{"1":{"name":"punctuation.definition.tag.xml"},"2":{"name":"keyword.other.entity.xml"},"3":{"name":"punctuation.definition.entity.xml"},"4":{"name":"variable.language.entity.xml"},"5":{"name":"keyword.other.entitytype.xml"}},"end":"(>)","patterns":[{"include":"#doublequotedString"},{"include":"#singlequotedString"}]},"bare-ampersand":{"match":"&","name":"invalid.illegal.bad-ampersand.xml"},"comments":{"patterns":[{"begin":"<%--","captures":{"0":{"name":"punctuation.definition.comment.xml"},"end":"--%>","name":"comment.block.xml"}},{"begin":"<!--","captures":{"0":{"name":"punctuation.definition.comment.xml"}},"end":"-->","name":"comment.block.xml","patterns":[{"begin":"--(?!>)","captures":{"0":{"name":"invalid.illegal.bad-comments-or-CDATA.xml"}}}]}]},"doublequotedString":{"begin":"\\"","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.xml"}},"end":"\\"","endCaptures":{"0":{"name":"punctuation.definition.string.end.xml"}},"name":"string.quoted.double.xml","patterns":[{"include":"#entity"},{"include":"#bare-ampersand"}]},"entity":{"captures":{"1":{"name":"punctuation.definition.constant.xml"},"3":{"name":"punctuation.definition.constant.xml"}},"match":"(&)([:A-Z_a-z][-.0-:A-Z_a-z]*|#[0-9]+|#x\\\\h+)(;)","name":"constant.character.entity.xml"},"internalSubset":{"begin":"(\\\\[)","captures":{"1":{"name":"punctuation.definition.constant.xml"}},"end":"(])","name":"meta.internalsubset.xml","patterns":[{"include":"#EntityDecl"},{"include":"#parameterEntity"},{"include":"#comments"}]},"parameterEntity":{"captures":{"1":{"name":"punctuation.definition.constant.xml"},"3":{"name":"punctuation.definition.constant.xml"}},"match":"(%)([:A-Z_a-z][-.0-:A-Z_a-z]*)(;)","name":"constant.character.parameter-entity.xml"},"singlequotedString":{"begin":"'","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.xml"}},"end":"'","endCaptures":{"0":{"name":"punctuation.definition.string.end.xml"}},"name":"string.quoted.single.xml","patterns":[{"include":"#entity"},{"include":"#bare-ampersand"}]},"tagStuff":{"patterns":[{"captures":{"1":{"name":"entity.other.attribute-name.namespace.xml"},"2":{"name":"entity.other.attribute-name.xml"},"3":{"name":"punctuation.separator.namespace.xml"},"4":{"name":"entity.other.attribute-name.localname.xml"}},"match":"(?:^|\\\\s+)(?:([-.\\\\w]+)((:)))?([-.:\\\\w]+)\\\\s*="},{"include":"#doublequotedString"},{"include":"#singlequotedString"}]}},"scopeName":"text.xml","embeddedLangs":["java"]}`)),n=[...e,t];export{n as default};
|
dist/index.html
CHANGED
|
@@ -10,7 +10,7 @@
|
|
| 10 |
content="Bonsai Chat runs private WebGPU language models locally in your browser."
|
| 11 |
/>
|
| 12 |
<title>Bonsai Chat · WebGPU</title>
|
| 13 |
-
<script type="module" crossorigin src="/assets/index-
|
| 14 |
<link rel="stylesheet" crossorigin href="/assets/index-BE6Zfvfx.css">
|
| 15 |
</head>
|
| 16 |
<body>
|
|
|
|
| 10 |
content="Bonsai Chat runs private WebGPU language models locally in your browser."
|
| 11 |
/>
|
| 12 |
<title>Bonsai Chat · WebGPU</title>
|
| 13 |
+
<script type="module" crossorigin src="/assets/index-DjqZvGjf.js"></script>
|
| 14 |
<link rel="stylesheet" crossorigin href="/assets/index-BE6Zfvfx.css">
|
| 15 |
</head>
|
| 16 |
<body>
|
dist/wasm/wllama-compat.wasm
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:f9b1bd2bd2a62a6b95ab52ecda92d10c709bc1ac3b6be9bb450e5adeff8dd39f
|
| 3 |
+
size 14885188
|
dist/wasm/wllama.wasm
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:dbded8334921b51877ade32009bcaee5b7423e3b39679089a970062c57128acb
|
| 3 |
+
size 8048681
|
public/wasm/wllama-compat.wasm
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:f9b1bd2bd2a62a6b95ab52ecda92d10c709bc1ac3b6be9bb450e5adeff8dd39f
|
| 3 |
+
size 14885188
|
public/wasm/wllama.wasm
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:dbded8334921b51877ade32009bcaee5b7423e3b39679089a970062c57128acb
|
| 3 |
+
size 8048681
|
src/bench/report.ts
CHANGED
|
@@ -170,6 +170,7 @@ export interface BenchmarkReport {
|
|
| 170 |
opsOnCpu: number;
|
| 171 |
gpuLayers: BackendReport['layersGpu'];
|
| 172 |
confirmedBackends: string[];
|
|
|
|
| 173 |
};
|
| 174 |
runtime: {
|
| 175 |
implementation: EngineCapabilities['runtime']['implementation'];
|
|
@@ -649,6 +650,7 @@ export function buildBenchmarkReport(observation: BenchmarkObservation): Benchma
|
|
| 649 |
opsOnCpu: backendReport.opsOnCpu,
|
| 650 |
gpuLayers: backendReport.layersGpu,
|
| 651 |
confirmedBackends: [...backendReport.backends],
|
|
|
|
| 652 |
},
|
| 653 |
runtime: {
|
| 654 |
implementation: capabilities.runtime.implementation,
|
|
|
|
| 170 |
opsOnCpu: number;
|
| 171 |
gpuLayers: BackendReport['layersGpu'];
|
| 172 |
confirmedBackends: string[];
|
| 173 |
+
webgpuTrace: string[];
|
| 174 |
};
|
| 175 |
runtime: {
|
| 176 |
implementation: EngineCapabilities['runtime']['implementation'];
|
|
|
|
| 650 |
opsOnCpu: backendReport.opsOnCpu,
|
| 651 |
gpuLayers: backendReport.layersGpu,
|
| 652 |
confirmedBackends: [...backendReport.backends],
|
| 653 |
+
webgpuTrace: [...backendReport.webgpuTrace],
|
| 654 |
},
|
| 655 |
runtime: {
|
| 656 |
implementation: capabilities.runtime.implementation,
|
vendor/wllama-bonsai/PATCH.diff
CHANGED
|
@@ -177,19 +177,30 @@ index 56b945c..14a4c88 100644
|
|
| 177 |
"repository": {
|
| 178 |
"type": "git",
|
| 179 |
diff --git a/scripts/docker-compose.yml b/scripts/docker-compose.yml
|
| 180 |
-
index 107f45a..
|
| 181 |
--- a/scripts/docker-compose.yml
|
| 182 |
+++ b/scripts/docker-compose.yml
|
| 183 |
-
@@ -13,6 +13,
|
| 184 |
environment:
|
| 185 |
- WLLAMA_TEST_BACKEND=${WLLAMA_TEST_BACKEND:-}
|
| 186 |
- SKIP_COMPAT=${SKIP_COMPAT:-}
|
| 187 |
+ - GGML_WEBGPU_Q1_VEC4=${GGML_WEBGPU_Q1_VEC4:-}
|
| 188 |
+ - GGML_WEBGPU_Q1_VEC4_WG_SIZE=${GGML_WEBGPU_Q1_VEC4_WG_SIZE:-64}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 189 |
volumes:
|
| 190 |
- ..:/source:Z
|
| 191 |
entrypoint: /bin/bash
|
| 192 |
-
@@ -34,12 +
|
| 193 |
"https://github.com/google/dawn/releases/download/$${DAWN_TAG}/$${EMDAWN_PKG}"
|
| 194 |
python3 -c "import zipfile; zf=zipfile.ZipFile('emdawn.zip','r'); zf.extractall('/source/build/emdawn'); zf.close()"
|
| 195 |
|
|
@@ -200,20 +211,65 @@ index 107f45a..7c8b7d5 100644
|
|
| 200 |
+ TEST_BACKEND_FLAG="-DWLLAMA_TEST_BACKEND=ON";
|
| 201 |
fi
|
| 202 |
+ JSPI_Q1_VEC4="$${GGML_WEBGPU_Q1_VEC4:-1}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 203 |
+ case "$${JSPI_Q1_VEC4}" in
|
| 204 |
+ 0) JSPI_Q1_FLAGS="-DGGML_WEBGPU_Q1_VEC4=OFF" ;;
|
| 205 |
-
+ 1) JSPI_Q1_FLAGS="-DGGML_WEBGPU_Q1_VEC4=ON -DGGML_WEBGPU_Q1_VEC4_WG_SIZE=$${GGML_WEBGPU_Q1_VEC4_WG_SIZE}" ;;
|
| 206 |
+ *) echo "GGML_WEBGPU_Q1_VEC4 must be 0 or 1" >&2; exit 2 ;;
|
| 207 |
+ esac
|
| 208 |
-
+
|
| 209 |
-
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 210 |
|
| 211 |
- emcmake cmake .. -DGGML_WEBGPU=ON -DGGML_WEBGPU_JSPI=ON -DEMDAWNWEBGPU_DIR="$${EMDAWNWEBGPU_DIR}" $${CMAKE_EXTRA_FLAGS}
|
| 212 |
+ emcmake cmake .. -DGGML_WEBGPU=ON -DGGML_WEBGPU_JSPI=ON -DEMDAWNWEBGPU_DIR="$${EMDAWNWEBGPU_DIR}" $${JSPI_CMAKE_EXTRA_FLAGS}
|
| 213 |
emmake make wllama -j
|
| 214 |
|
| 215 |
# go back to root
|
| 216 |
-
@@ -54,7 +
|
| 217 |
if [ -z "${SKIP_COMPAT}" ]; then
|
| 218 |
mkdir -p build-compat
|
| 219 |
cd build-compat
|
|
@@ -437,38 +493,99 @@ index be62030..9f5144a 100644
|
|
| 437 |
const outputLen = new Uint32Array(
|
| 438 |
getHeapU8().buffer,
|
| 439 |
diff --git a/llama.cpp/ggml/src/ggml-webgpu/CMakeLists.txt b/llama.cpp/ggml/src/ggml-webgpu/CMakeLists.txt
|
| 440 |
-
index 1503a1e..
|
| 441 |
--- a/llama.cpp/ggml/src/ggml-webgpu/CMakeLists.txt
|
| 442 |
+++ b/llama.cpp/ggml/src/ggml-webgpu/CMakeLists.txt
|
| 443 |
-
@@ -2,6 +2,
|
| 444 |
|
| 445 |
find_package(Python3 REQUIRED)
|
| 446 |
|
| 447 |
+option(GGML_WEBGPU_Q1_VEC4 "Use the benchmark-only vector-dot Q1_0 matvec kernel" OFF)
|
| 448 |
-
+set(GGML_WEBGPU_Q1_VEC4_WG_SIZE "64" CACHE STRING "Q1_0 vector-dot workgroup size (64 or 128)")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 449 |
+
|
| 450 |
# Shader locations
|
| 451 |
set(SHADER_DIR "${CMAKE_CURRENT_SOURCE_DIR}/wgsl-shaders")
|
| 452 |
set(SHADER_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated")
|
| 453 |
-
@@ -39,6 +
|
| 454 |
|
| 455 |
add_dependencies(ggml-webgpu generate_shaders)
|
| 456 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 457 |
+if (GGML_WEBGPU_Q1_VEC4)
|
| 458 |
-
+ if (NOT GGML_WEBGPU_Q1_VEC4_WG_SIZE MATCHES "^(64|128)$")
|
| 459 |
-
+ message(FATAL_ERROR "GGML_WEBGPU_Q1_VEC4_WG_SIZE must be 64 or 128")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 460 |
+ endif()
|
| 461 |
+ target_compile_definitions(ggml-webgpu PRIVATE
|
| 462 |
+ GGML_WEBGPU_Q1_VEC4=1
|
| 463 |
+ GGML_WEBGPU_Q1_VEC4_WG_SIZE=${GGML_WEBGPU_Q1_VEC4_WG_SIZE}
|
|
|
|
|
|
|
| 464 |
+ )
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 465 |
+endif()
|
| 466 |
+
|
| 467 |
if(EMSCRIPTEN)
|
| 468 |
set(EMDAWNWEBGPU_DIR "" CACHE PATH "Path to emdawnwebgpu_pkg")
|
| 469 |
|
| 470 |
diff --git a/llama.cpp/ggml/src/ggml-webgpu/ggml-webgpu-shader-lib.hpp b/llama.cpp/ggml/src/ggml-webgpu/ggml-webgpu-shader-lib.hpp
|
| 471 |
-
index d769236..
|
| 472 |
--- a/llama.cpp/ggml/src/ggml-webgpu/ggml-webgpu-shader-lib.hpp
|
| 473 |
+++ b/llama.cpp/ggml/src/ggml-webgpu/ggml-webgpu-shader-lib.hpp
|
| 474 |
@@ -50,6 +50,11 @@
|
|
@@ -483,7 +600,126 @@ index d769236..3ebbd19 100644
|
|
| 483 |
|
| 484 |
#define WEBGPU_MUL_MAT_VEC_FLOAT_OUTPUTS_PER_WG 4
|
| 485 |
#define WEBGPU_MUL_MAT_VEC_LEGACY_Q_OUTPUTS_PER_WG 4
|
| 486 |
-
@@ -
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 487 |
std::transform(type_upper.begin(), type_upper.end(), type_upper.begin(), ::toupper);
|
| 488 |
|
| 489 |
defines.push_back("BYTE_HELPERS");
|
|
@@ -500,13 +736,29 @@ index d769236..3ebbd19 100644
|
|
| 500 |
defines.push_back("U32_DEQUANT_HELPERS");
|
| 501 |
defines.push_back("SRC0_INNER_TYPE=u32");
|
| 502 |
switch (context.src0->type) {
|
| 503 |
-
@@ -
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 504 |
|
| 505 |
if (key.src0_type == GGML_TYPE_Q1_0) {
|
| 506 |
outputs_per_wg = WEBGPU_MUL_MAT_VEC_LEGACY_Q_OUTPUTS_PER_WG;
|
| 507 |
+#if defined(GGML_WEBGPU_Q1_VEC4)
|
| 508 |
+ wg_size = GGML_WEBGPU_Q1_VEC4_WG_SIZE;
|
|
|
|
| 509 |
+ variant += "_wg" + std::to_string(wg_size);
|
|
|
|
| 510 |
+#else
|
| 511 |
+ if (!context.supports_subgroups) {
|
| 512 |
+ wg_size = WEBGPU_MUL_MAT_VEC_Q1_NO_SG_WG_SIZE;
|
|
@@ -516,11 +768,1054 @@ index d769236..3ebbd19 100644
|
|
| 516 |
} else if (key.src0_type >= GGML_TYPE_Q2_K) {
|
| 517 |
outputs_per_wg = WEBGPU_MUL_MAT_VEC_K_Q_OUTPUTS_PER_WG;
|
| 518 |
} else if (key.src0_type >= GGML_TYPE_Q4_0) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 519 |
diff --git a/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_acc.tmpl b/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_acc.tmpl
|
| 520 |
-
index 8fd0d19..
|
| 521 |
--- a/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_acc.tmpl
|
| 522 |
+++ b/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_acc.tmpl
|
| 523 |
-
@@ -61,6 +61,
|
| 524 |
}
|
| 525 |
#endif
|
| 526 |
|
|
@@ -558,9 +1853,19 @@ index 8fd0d19..f12848f 100644
|
|
| 558 |
+ for (var row = 0u; row < OUTPUTS_PER_WG; row += 1u) {
|
| 559 |
+ let output_row = row_base + row;
|
| 560 |
+ if (output_row < params.m) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 561 |
+ let block_byte_base = (src0_batch_offset + output_row * params.stride_01 + block) * BLOCK_SIZE_BYTES;
|
| 562 |
+ let d = f32(load_f16_at_src0(block_byte_base));
|
| 563 |
+ let q_word = load_u32_at_src0(block_byte_base + 2u + thread_within_block * 4u);
|
|
|
|
| 564 |
+ for (var col = 0u; col < NUM_COLS; col += 1u) {
|
| 565 |
+ var row_sum = 0.0;
|
| 566 |
+ for (var i = 0u; i < VECS_PER_THREAD; i += 1u) {
|
|
@@ -579,3 +1884,327 @@ index 8fd0d19..f12848f 100644
|
|
| 579 |
#ifdef MUL_ACC_Q1_0
|
| 580 |
#define BLOCK_SIZE 128
|
| 581 |
#define BLOCK_SIZE_BYTES 18
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 177 |
"repository": {
|
| 178 |
"type": "git",
|
| 179 |
diff --git a/scripts/docker-compose.yml b/scripts/docker-compose.yml
|
| 180 |
+
index 107f45a..10b8813 100644
|
| 181 |
--- a/scripts/docker-compose.yml
|
| 182 |
+++ b/scripts/docker-compose.yml
|
| 183 |
+
@@ -13,6 +13,19 @@ services:
|
| 184 |
environment:
|
| 185 |
- WLLAMA_TEST_BACKEND=${WLLAMA_TEST_BACKEND:-}
|
| 186 |
- SKIP_COMPAT=${SKIP_COMPAT:-}
|
| 187 |
+ - GGML_WEBGPU_Q1_VEC4=${GGML_WEBGPU_Q1_VEC4:-}
|
| 188 |
+ - GGML_WEBGPU_Q1_VEC4_WG_SIZE=${GGML_WEBGPU_Q1_VEC4_WG_SIZE:-64}
|
| 189 |
+
+ - GGML_WEBGPU_Q1_VEC4_OUTPUTS_PER_WG=${GGML_WEBGPU_Q1_VEC4_OUTPUTS_PER_WG:-4}
|
| 190 |
+
+ - GGML_WEBGPU_Q1_VEC4_SHAPE_AWARE_OUTPUTS=${GGML_WEBGPU_Q1_VEC4_SHAPE_AWARE_OUTPUTS:-}
|
| 191 |
+
+ - GGML_WEBGPU_Q1_VEC4_LARGE_K_THRESHOLD=${GGML_WEBGPU_Q1_VEC4_LARGE_K_THRESHOLD:-4096}
|
| 192 |
+
+ - GGML_WEBGPU_Q1_ROW_RETILE=${GGML_WEBGPU_Q1_ROW_RETILE:-}
|
| 193 |
+
+ - GGML_WEBGPU_COMMAND_SUBMIT_BATCH_SIZE=${GGML_WEBGPU_COMMAND_SUBMIT_BATCH_SIZE:-64}
|
| 194 |
+
+ - GGML_WEBGPU_TURBO_TRACE=${GGML_WEBGPU_TURBO_TRACE:-}
|
| 195 |
+
+ - GGML_WEBGPU_GPU_PROFILE=${GGML_WEBGPU_GPU_PROFILE:-}
|
| 196 |
+
+ - GGML_WEBGPU_BATCH_PARAM_UPLOADS=${GGML_WEBGPU_BATCH_PARAM_UPLOADS:-}
|
| 197 |
+
+ - GGML_WEBGPU_Q1_GLU_FUSION=${GGML_WEBGPU_Q1_GLU_FUSION:-}
|
| 198 |
+
+ - GGML_WEBGPU_Q1_DUAL_GLU_FUSION=${GGML_WEBGPU_Q1_DUAL_GLU_FUSION:-}
|
| 199 |
+
+ - GGML_WEBGPU_GDN_CACHE_FUSION=${GGML_WEBGPU_GDN_CACHE_FUSION:-}
|
| 200 |
volumes:
|
| 201 |
- ..:/source:Z
|
| 202 |
entrypoint: /bin/bash
|
| 203 |
+
@@ -34,12 +47,65 @@ services:
|
| 204 |
"https://github.com/google/dawn/releases/download/$${DAWN_TAG}/$${EMDAWN_PKG}"
|
| 205 |
python3 -c "import zipfile; zf=zipfile.ZipFile('emdawn.zip','r'); zf.extractall('/source/build/emdawn'); zf.close()"
|
| 206 |
|
|
|
|
| 211 |
+ TEST_BACKEND_FLAG="-DWLLAMA_TEST_BACKEND=ON";
|
| 212 |
fi
|
| 213 |
+ JSPI_Q1_VEC4="$${GGML_WEBGPU_Q1_VEC4:-1}"
|
| 214 |
+
+ case "$${GGML_WEBGPU_Q1_VEC4_SHAPE_AWARE_OUTPUTS:-0}" in
|
| 215 |
+
+ 0|'') Q1_SHAPE_AWARE_FLAGS="-DGGML_WEBGPU_Q1_VEC4_SHAPE_AWARE_OUTPUTS=OFF" ;;
|
| 216 |
+
+ 1) Q1_SHAPE_AWARE_FLAGS="-DGGML_WEBGPU_Q1_VEC4_SHAPE_AWARE_OUTPUTS=ON -DGGML_WEBGPU_Q1_VEC4_LARGE_K_THRESHOLD=$${GGML_WEBGPU_Q1_VEC4_LARGE_K_THRESHOLD}" ;;
|
| 217 |
+
+ *) echo "GGML_WEBGPU_Q1_VEC4_SHAPE_AWARE_OUTPUTS must be 0 or 1" >&2; exit 2 ;;
|
| 218 |
+
+ esac
|
| 219 |
+
+ case "$${GGML_WEBGPU_Q1_ROW_RETILE:-0}" in
|
| 220 |
+
+ 0|'') Q1_ROW_RETILE_FLAG="-DGGML_WEBGPU_Q1_ROW_RETILE=OFF" ;;
|
| 221 |
+
+ 1) Q1_ROW_RETILE_FLAG="-DGGML_WEBGPU_Q1_ROW_RETILE=ON" ;;
|
| 222 |
+
+ *) echo "GGML_WEBGPU_Q1_ROW_RETILE must be 0 or 1" >&2; exit 2 ;;
|
| 223 |
+
+ esac
|
| 224 |
+ case "$${JSPI_Q1_VEC4}" in
|
| 225 |
+ 0) JSPI_Q1_FLAGS="-DGGML_WEBGPU_Q1_VEC4=OFF" ;;
|
| 226 |
+
+ 1) JSPI_Q1_FLAGS="-DGGML_WEBGPU_Q1_VEC4=ON -DGGML_WEBGPU_Q1_VEC4_WG_SIZE=$${GGML_WEBGPU_Q1_VEC4_WG_SIZE} -DGGML_WEBGPU_Q1_VEC4_OUTPUTS_PER_WG=$${GGML_WEBGPU_Q1_VEC4_OUTPUTS_PER_WG} $${Q1_SHAPE_AWARE_FLAGS} $${Q1_ROW_RETILE_FLAG}" ;;
|
| 227 |
+ *) echo "GGML_WEBGPU_Q1_VEC4 must be 0 or 1" >&2; exit 2 ;;
|
| 228 |
+ esac
|
| 229 |
+
+ case "$${GGML_WEBGPU_COMMAND_SUBMIT_BATCH_SIZE:-64}" in
|
| 230 |
+
+ ''|*[!0-9]*) echo "GGML_WEBGPU_COMMAND_SUBMIT_BATCH_SIZE must be a positive integer" >&2; exit 2 ;;
|
| 231 |
+
+ 0) echo "GGML_WEBGPU_COMMAND_SUBMIT_BATCH_SIZE must be a positive integer" >&2; exit 2 ;;
|
| 232 |
+
+ esac
|
| 233 |
+
+ case "$${GGML_WEBGPU_TURBO_TRACE:-0}" in
|
| 234 |
+
+ 0|'') TURBO_TRACE_FLAG="-DGGML_WEBGPU_TURBO_TRACE=OFF" ;;
|
| 235 |
+
+ 1) TURBO_TRACE_FLAG="-DGGML_WEBGPU_TURBO_TRACE=ON" ;;
|
| 236 |
+
+ *) echo "GGML_WEBGPU_TURBO_TRACE must be 0 or 1" >&2; exit 2 ;;
|
| 237 |
+
+ esac
|
| 238 |
+
+ case "$${GGML_WEBGPU_GPU_PROFILE:-0}" in
|
| 239 |
+
+ 0|'') GPU_PROFILE_FLAG="-DGGML_WEBGPU_GPU_PROFILE=OFF" ;;
|
| 240 |
+
+ 1) GPU_PROFILE_FLAG="-DGGML_WEBGPU_GPU_PROFILE=ON" ;;
|
| 241 |
+
+ *) echo "GGML_WEBGPU_GPU_PROFILE must be 0 or 1" >&2; exit 2 ;;
|
| 242 |
+
+ esac
|
| 243 |
+
+ case "$${GGML_WEBGPU_BATCH_PARAM_UPLOADS:-0}" in
|
| 244 |
+
+ 0|'') BATCH_PARAM_UPLOADS_FLAG="-DGGML_WEBGPU_BATCH_PARAM_UPLOADS=OFF" ;;
|
| 245 |
+
+ 1) BATCH_PARAM_UPLOADS_FLAG="-DGGML_WEBGPU_BATCH_PARAM_UPLOADS=ON" ;;
|
| 246 |
+
+ *) echo "GGML_WEBGPU_BATCH_PARAM_UPLOADS must be 0 or 1" >&2; exit 2 ;;
|
| 247 |
+
+ esac
|
| 248 |
+
+ case "$${GGML_WEBGPU_Q1_GLU_FUSION:-0}" in
|
| 249 |
+
+ 0|'') Q1_GLU_FUSION_FLAG="-DGGML_WEBGPU_Q1_GLU_FUSION=OFF" ;;
|
| 250 |
+
+ 1) Q1_GLU_FUSION_FLAG="-DGGML_WEBGPU_Q1_GLU_FUSION=ON" ;;
|
| 251 |
+
+ *) echo "GGML_WEBGPU_Q1_GLU_FUSION must be 0 or 1" >&2; exit 2 ;;
|
| 252 |
+
+ esac
|
| 253 |
+
+ case "$${GGML_WEBGPU_Q1_DUAL_GLU_FUSION:-0}" in
|
| 254 |
+
+ 0|'') Q1_DUAL_GLU_FUSION_FLAG="-DGGML_WEBGPU_Q1_DUAL_GLU_FUSION=OFF" ;;
|
| 255 |
+
+ 1) Q1_DUAL_GLU_FUSION_FLAG="-DGGML_WEBGPU_Q1_DUAL_GLU_FUSION=ON" ;;
|
| 256 |
+
+ *) echo "GGML_WEBGPU_Q1_DUAL_GLU_FUSION must be 0 or 1" >&2; exit 2 ;;
|
| 257 |
+
+ esac
|
| 258 |
+
+ case "$${GGML_WEBGPU_GDN_CACHE_FUSION:-0}" in
|
| 259 |
+
+ 0|'') GDN_CACHE_FUSION_FLAG="-DGGML_WEBGPU_GDN_CACHE_FUSION=OFF" ;;
|
| 260 |
+
+ 1) GDN_CACHE_FUSION_FLAG="-DGGML_WEBGPU_GDN_CACHE_FUSION=ON" ;;
|
| 261 |
+
+ *) echo "GGML_WEBGPU_GDN_CACHE_FUSION must be 0 or 1" >&2; exit 2 ;;
|
| 262 |
+
+ esac
|
| 263 |
+
+ COMMON_WEBGPU_FLAGS="-DGGML_WEBGPU_COMMAND_SUBMIT_BATCH_SIZE=$${GGML_WEBGPU_COMMAND_SUBMIT_BATCH_SIZE:-64} $${TURBO_TRACE_FLAG} $${GPU_PROFILE_FLAG}"
|
| 264 |
+
+ JSPI_CMAKE_EXTRA_FLAGS="$${TEST_BACKEND_FLAG} $${JSPI_Q1_FLAGS} $${Q1_GLU_FUSION_FLAG} $${Q1_DUAL_GLU_FUSION_FLAG} $${GDN_CACHE_FUSION_FLAG} $${BATCH_PARAM_UPLOADS_FLAG} $${COMMON_WEBGPU_FLAGS}"
|
| 265 |
+
+ COMPAT_CMAKE_EXTRA_FLAGS="$${TEST_BACKEND_FLAG} -DGGML_WEBGPU_Q1_VEC4=OFF -DGGML_WEBGPU_Q1_ROW_RETILE=OFF -DGGML_WEBGPU_Q1_GLU_FUSION=OFF -DGGML_WEBGPU_Q1_DUAL_GLU_FUSION=OFF -DGGML_WEBGPU_GDN_CACHE_FUSION=OFF -DGGML_WEBGPU_BATCH_PARAM_UPLOADS=OFF $${COMMON_WEBGPU_FLAGS}"
|
| 266 |
|
| 267 |
- emcmake cmake .. -DGGML_WEBGPU=ON -DGGML_WEBGPU_JSPI=ON -DEMDAWNWEBGPU_DIR="$${EMDAWNWEBGPU_DIR}" $${CMAKE_EXTRA_FLAGS}
|
| 268 |
+ emcmake cmake .. -DGGML_WEBGPU=ON -DGGML_WEBGPU_JSPI=ON -DEMDAWNWEBGPU_DIR="$${EMDAWNWEBGPU_DIR}" $${JSPI_CMAKE_EXTRA_FLAGS}
|
| 269 |
emmake make wllama -j
|
| 270 |
|
| 271 |
# go back to root
|
| 272 |
+
@@ -54,7 +120,7 @@ services:
|
| 273 |
if [ -z "${SKIP_COMPAT}" ]; then
|
| 274 |
mkdir -p build-compat
|
| 275 |
cd build-compat
|
|
|
|
| 493 |
const outputLen = new Uint32Array(
|
| 494 |
getHeapU8().buffer,
|
| 495 |
diff --git a/llama.cpp/ggml/src/ggml-webgpu/CMakeLists.txt b/llama.cpp/ggml/src/ggml-webgpu/CMakeLists.txt
|
| 496 |
+
index 1503a1e..a4cd824 100644
|
| 497 |
--- a/llama.cpp/ggml/src/ggml-webgpu/CMakeLists.txt
|
| 498 |
+++ b/llama.cpp/ggml/src/ggml-webgpu/CMakeLists.txt
|
| 499 |
+
@@ -2,6 +2,26 @@ cmake_minimum_required(VERSION 3.13)
|
| 500 |
|
| 501 |
find_package(Python3 REQUIRED)
|
| 502 |
|
| 503 |
+option(GGML_WEBGPU_Q1_VEC4 "Use the benchmark-only vector-dot Q1_0 matvec kernel" OFF)
|
| 504 |
+
+set(GGML_WEBGPU_Q1_VEC4_WG_SIZE "64" CACHE STRING "Q1_0 vector-dot workgroup size (32, 64, or 128)")
|
| 505 |
+
+set(GGML_WEBGPU_Q1_VEC4_OUTPUTS_PER_WG "4" CACHE STRING "Q1_0 vector-dot output rows computed by each workgroup (4, 8, or 16)")
|
| 506 |
+
+option(GGML_WEBGPU_Q1_VEC4_SHAPE_AWARE_OUTPUTS "Use the configured Q1_0 output tile for small-K matrices and 8 rows for large-K matrices" OFF)
|
| 507 |
+
+set(GGML_WEBGPU_Q1_VEC4_LARGE_K_THRESHOLD "4096" CACHE STRING "Largest K dimension that uses the small-K Q1_0 output tile")
|
| 508 |
+
+option(GGML_WEBGPU_Q1_ROW_RETILE "Retile pairs of Q1_0 blocks for aligned code-word loads on WebGPU" OFF)
|
| 509 |
+
+set(GGML_WEBGPU_COMMAND_SUBMIT_BATCH_SIZE "64" CACHE STRING "Maximum kernels encoded into one WebGPU command submission")
|
| 510 |
+
+option(GGML_WEBGPU_TURBO_TRACE "Log per-graph WebGPU encoding and submission counts" OFF)
|
| 511 |
+
+option(GGML_WEBGPU_BATCH_PARAM_UPLOADS "Batch per-dispatch uniforms into one upload per command submission" OFF)
|
| 512 |
+
+option(GGML_WEBGPU_Q1_GLU_FUSION "Fuse decode-only Q1_0 FFN second projection with its SwiGLU epilogue" OFF)
|
| 513 |
+
+option(GGML_WEBGPU_Q1_DUAL_GLU_FUSION "Fuse both decode-only Q1_0 FFN projections with SwiGLU" OFF)
|
| 514 |
+
+option(GGML_WEBGPU_GDN_CACHE_FUSION "Write Gated Delta Net state snapshots directly into the cache" OFF)
|
| 515 |
+
+
|
| 516 |
+
+if (NOT GGML_WEBGPU_COMMAND_SUBMIT_BATCH_SIZE MATCHES "^[1-9][0-9]*$")
|
| 517 |
+
+ message(FATAL_ERROR "GGML_WEBGPU_COMMAND_SUBMIT_BATCH_SIZE must be a positive integer")
|
| 518 |
+
+endif()
|
| 519 |
+
+if (GGML_WEBGPU_COMMAND_SUBMIT_BATCH_SIZE GREATER 16384)
|
| 520 |
+
+ message(FATAL_ERROR "GGML_WEBGPU_COMMAND_SUBMIT_BATCH_SIZE must not exceed 16384")
|
| 521 |
+
+endif()
|
| 522 |
+
|
| 523 |
# Shader locations
|
| 524 |
set(SHADER_DIR "${CMAKE_CURRENT_SOURCE_DIR}/wgsl-shaders")
|
| 525 |
set(SHADER_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated")
|
| 526 |
+
@@ -39,6 +59,60 @@ ggml_add_backend_library(ggml-webgpu
|
| 527 |
|
| 528 |
add_dependencies(ggml-webgpu generate_shaders)
|
| 529 |
|
| 530 |
+
+target_compile_definitions(ggml-webgpu PRIVATE
|
| 531 |
+
+ GGML_WEBGPU_COMMAND_SUBMIT_BATCH_SIZE=${GGML_WEBGPU_COMMAND_SUBMIT_BATCH_SIZE}
|
| 532 |
+
+)
|
| 533 |
+
+
|
| 534 |
+
+if (GGML_WEBGPU_TURBO_TRACE)
|
| 535 |
+
+ target_compile_definitions(ggml-webgpu PRIVATE GGML_WEBGPU_TURBO_TRACE=1)
|
| 536 |
+
+endif()
|
| 537 |
+
+
|
| 538 |
+
+if (GGML_WEBGPU_BATCH_PARAM_UPLOADS)
|
| 539 |
+
+ target_compile_definitions(ggml-webgpu PRIVATE GGML_WEBGPU_BATCH_PARAM_UPLOADS=1)
|
| 540 |
+
+endif()
|
| 541 |
+
+
|
| 542 |
+
+if (GGML_WEBGPU_Q1_GLU_FUSION)
|
| 543 |
+
+ if (NOT GGML_WEBGPU_Q1_VEC4)
|
| 544 |
+
+ message(FATAL_ERROR "GGML_WEBGPU_Q1_GLU_FUSION requires GGML_WEBGPU_Q1_VEC4")
|
| 545 |
+
+ endif()
|
| 546 |
+
+ target_compile_definitions(ggml-webgpu PRIVATE GGML_WEBGPU_Q1_GLU_FUSION=1)
|
| 547 |
+
+endif()
|
| 548 |
+
+
|
| 549 |
+
+if (GGML_WEBGPU_Q1_DUAL_GLU_FUSION)
|
| 550 |
+
+ if (NOT GGML_WEBGPU_Q1_VEC4)
|
| 551 |
+
+ message(FATAL_ERROR "GGML_WEBGPU_Q1_DUAL_GLU_FUSION requires GGML_WEBGPU_Q1_VEC4")
|
| 552 |
+
+ endif()
|
| 553 |
+
+ target_compile_definitions(ggml-webgpu PRIVATE GGML_WEBGPU_Q1_DUAL_GLU_FUSION=1)
|
| 554 |
+
+endif()
|
| 555 |
+
+
|
| 556 |
+
+if (GGML_WEBGPU_GDN_CACHE_FUSION)
|
| 557 |
+
+ target_compile_definitions(ggml-webgpu PRIVATE GGML_WEBGPU_GDN_CACHE_FUSION=1)
|
| 558 |
+
+endif()
|
| 559 |
+
+
|
| 560 |
+if (GGML_WEBGPU_Q1_VEC4)
|
| 561 |
+
+ if (NOT GGML_WEBGPU_Q1_VEC4_WG_SIZE MATCHES "^(32|64|128)$")
|
| 562 |
+
+ message(FATAL_ERROR "GGML_WEBGPU_Q1_VEC4_WG_SIZE must be 32, 64, or 128")
|
| 563 |
+
+ endif()
|
| 564 |
+
+ if (NOT GGML_WEBGPU_Q1_VEC4_OUTPUTS_PER_WG MATCHES "^(4|8|16)$")
|
| 565 |
+
+ message(FATAL_ERROR "GGML_WEBGPU_Q1_VEC4_OUTPUTS_PER_WG must be 4, 8, or 16")
|
| 566 |
+
+ endif()
|
| 567 |
+
+ if (NOT GGML_WEBGPU_Q1_VEC4_LARGE_K_THRESHOLD MATCHES "^[1-9][0-9]*$")
|
| 568 |
+
+ message(FATAL_ERROR "GGML_WEBGPU_Q1_VEC4_LARGE_K_THRESHOLD must be a positive integer")
|
| 569 |
+ endif()
|
| 570 |
+ target_compile_definitions(ggml-webgpu PRIVATE
|
| 571 |
+ GGML_WEBGPU_Q1_VEC4=1
|
| 572 |
+ GGML_WEBGPU_Q1_VEC4_WG_SIZE=${GGML_WEBGPU_Q1_VEC4_WG_SIZE}
|
| 573 |
+
+ GGML_WEBGPU_Q1_VEC4_OUTPUTS_PER_WG=${GGML_WEBGPU_Q1_VEC4_OUTPUTS_PER_WG}
|
| 574 |
+
+ GGML_WEBGPU_Q1_VEC4_LARGE_K_THRESHOLD=${GGML_WEBGPU_Q1_VEC4_LARGE_K_THRESHOLD}
|
| 575 |
+ )
|
| 576 |
+
+ if (GGML_WEBGPU_Q1_VEC4_SHAPE_AWARE_OUTPUTS)
|
| 577 |
+
+ target_compile_definitions(ggml-webgpu PRIVATE GGML_WEBGPU_Q1_VEC4_SHAPE_AWARE_OUTPUTS=1)
|
| 578 |
+
+ endif()
|
| 579 |
+
+ if (GGML_WEBGPU_Q1_ROW_RETILE)
|
| 580 |
+
+ target_compile_definitions(ggml-webgpu PRIVATE GGML_WEBGPU_Q1_ROW_RETILE=1)
|
| 581 |
+
+ endif()
|
| 582 |
+endif()
|
| 583 |
+
|
| 584 |
if(EMSCRIPTEN)
|
| 585 |
set(EMDAWNWEBGPU_DIR "" CACHE PATH "Path to emdawnwebgpu_pkg")
|
| 586 |
|
| 587 |
diff --git a/llama.cpp/ggml/src/ggml-webgpu/ggml-webgpu-shader-lib.hpp b/llama.cpp/ggml/src/ggml-webgpu/ggml-webgpu-shader-lib.hpp
|
| 588 |
+
index d769236..26b178c 100644
|
| 589 |
--- a/llama.cpp/ggml/src/ggml-webgpu/ggml-webgpu-shader-lib.hpp
|
| 590 |
+++ b/llama.cpp/ggml/src/ggml-webgpu/ggml-webgpu-shader-lib.hpp
|
| 591 |
@@ -50,6 +50,11 @@
|
|
|
|
| 600 |
|
| 601 |
#define WEBGPU_MUL_MAT_VEC_FLOAT_OUTPUTS_PER_WG 4
|
| 602 |
#define WEBGPU_MUL_MAT_VEC_LEGACY_Q_OUTPUTS_PER_WG 4
|
| 603 |
+
@@ -379,9 +384,10 @@ struct ggml_webgpu_gated_delta_net_pipeline_key {
|
| 604 |
+
int type;
|
| 605 |
+
int s_v;
|
| 606 |
+
int kda;
|
| 607 |
+
+ int fused_cache;
|
| 608 |
+
|
| 609 |
+
bool operator==(const ggml_webgpu_gated_delta_net_pipeline_key & other) const {
|
| 610 |
+
- return type == other.type && s_v == other.s_v && kda == other.kda;
|
| 611 |
+
+ return type == other.type && s_v == other.s_v && kda == other.kda && fused_cache == other.fused_cache;
|
| 612 |
+
}
|
| 613 |
+
};
|
| 614 |
+
|
| 615 |
+
@@ -391,6 +397,7 @@ struct ggml_webgpu_gated_delta_net_pipeline_key_hash {
|
| 616 |
+
ggml_webgpu_hash_combine(seed, key.type);
|
| 617 |
+
ggml_webgpu_hash_combine(seed, key.s_v);
|
| 618 |
+
ggml_webgpu_hash_combine(seed, key.kda);
|
| 619 |
+
+ ggml_webgpu_hash_combine(seed, key.fused_cache);
|
| 620 |
+
return seed;
|
| 621 |
+
}
|
| 622 |
+
};
|
| 623 |
+
@@ -907,10 +914,12 @@ struct ggml_webgpu_mul_mat_vec_pipeline_key {
|
| 624 |
+
int vectorized;
|
| 625 |
+
uint32_t num_cols;
|
| 626 |
+
bool use_mmvq;
|
| 627 |
+
+ uint32_t q1_outputs_per_wg;
|
| 628 |
+
|
| 629 |
+
bool operator==(const ggml_webgpu_mul_mat_vec_pipeline_key & other) const {
|
| 630 |
+
return src0_type == other.src0_type && src1_type == other.src1_type && vectorized == other.vectorized &&
|
| 631 |
+
- num_cols == other.num_cols && use_mmvq == other.use_mmvq;
|
| 632 |
+
+ num_cols == other.num_cols && use_mmvq == other.use_mmvq &&
|
| 633 |
+
+ q1_outputs_per_wg == other.q1_outputs_per_wg;
|
| 634 |
+
}
|
| 635 |
+
};
|
| 636 |
+
|
| 637 |
+
@@ -922,6 +931,7 @@ struct ggml_webgpu_mul_mat_vec_pipeline_key_hash {
|
| 638 |
+
ggml_webgpu_hash_combine(seed, key.vectorized);
|
| 639 |
+
ggml_webgpu_hash_combine(seed, key.num_cols);
|
| 640 |
+
ggml_webgpu_hash_combine(seed, key.use_mmvq);
|
| 641 |
+
+ ggml_webgpu_hash_combine(seed, key.q1_outputs_per_wg);
|
| 642 |
+
return seed;
|
| 643 |
+
}
|
| 644 |
+
};
|
| 645 |
+
@@ -1189,6 +1199,12 @@ class ggml_webgpu_shader_lib {
|
| 646 |
+
flash_attn_blk_pipelines;
|
| 647 |
+
std::unordered_map<ggml_webgpu_mul_mat_vec_pipeline_key, webgpu_pipeline, ggml_webgpu_mul_mat_vec_pipeline_key_hash>
|
| 648 |
+
mul_mat_vec_pipelines; // fast mat-vec (n==1)
|
| 649 |
+
+#ifdef GGML_WEBGPU_Q1_GLU_FUSION
|
| 650 |
+
+ std::unordered_map<int, webgpu_pipeline> mul_mat_vec_q1_glu_pipelines; // key is fixed
|
| 651 |
+
+#endif
|
| 652 |
+
+#ifdef GGML_WEBGPU_Q1_DUAL_GLU_FUSION
|
| 653 |
+
+ std::unordered_map<uint32_t, webgpu_pipeline> mul_mat_vec_q1_dual_glu_pipelines; // outputs per workgroup
|
| 654 |
+
+#endif
|
| 655 |
+
std::unordered_map<ggml_webgpu_mul_mat_pipeline_key, webgpu_pipeline, ggml_webgpu_mul_mat_pipeline_key_hash>
|
| 656 |
+
mul_mat_fast_pipelines; // fast mat-mat (reg-tile or subgroup)
|
| 657 |
+
std::unordered_map<ggml_webgpu_quantize_q8_pipeline_key, webgpu_pipeline, ggml_webgpu_quantize_q8_pipeline_key_hash>
|
| 658 |
+
@@ -1591,6 +1607,11 @@ class ggml_webgpu_shader_lib {
|
| 659 |
+
|
| 660 |
+
if (key.src_type == GGML_TYPE_Q1_0) {
|
| 661 |
+
defines.push_back("BLOCK_SIZE=128u");
|
| 662 |
+
+#if defined(GGML_WEBGPU_Q1_ROW_RETILE)
|
| 663 |
+
+ defines.push_back("Q1_ROW_RETILED");
|
| 664 |
+
+ variant += "_row_retiled";
|
| 665 |
+
+#endif
|
| 666 |
+
+
|
| 667 |
+
} else if ((key.src_type >= GGML_TYPE_Q4_0 && key.src_type <= GGML_TYPE_Q8_1) ||
|
| 668 |
+
key.src_type == GGML_TYPE_IQ4_NL || key.src_type == GGML_TYPE_MXFP4) {
|
| 669 |
+
defines.push_back("BLOCK_SIZE=32u");
|
| 670 |
+
@@ -1786,11 +1807,13 @@ class ggml_webgpu_shader_lib {
|
| 671 |
+
return ssm_scan_pipelines[key];
|
| 672 |
+
}
|
| 673 |
+
|
| 674 |
+
- webgpu_pipeline get_gated_delta_net_pipeline(const ggml_webgpu_shader_lib_context & context) {
|
| 675 |
+
+ webgpu_pipeline get_gated_delta_net_pipeline(const ggml_webgpu_shader_lib_context & context,
|
| 676 |
+
+ bool fused_cache = false) {
|
| 677 |
+
ggml_webgpu_gated_delta_net_pipeline_key key = {};
|
| 678 |
+
key.type = context.dst->type;
|
| 679 |
+
key.s_v = (int) context.src2->ne[0];
|
| 680 |
+
key.kda = context.src3->ne[0] == context.src2->ne[0];
|
| 681 |
+
+ key.fused_cache = fused_cache;
|
| 682 |
+
|
| 683 |
+
auto it = gated_delta_net_pipelines.find(key);
|
| 684 |
+
if (it != gated_delta_net_pipelines.end()) {
|
| 685 |
+
@@ -1813,6 +1836,11 @@ class ggml_webgpu_shader_lib {
|
| 686 |
+
variant += "_kda";
|
| 687 |
+
}
|
| 688 |
+
|
| 689 |
+
+ if (key.fused_cache) {
|
| 690 |
+
+ defines.push_back("FUSED_CACHE");
|
| 691 |
+
+ variant += "_cache";
|
| 692 |
+
+ }
|
| 693 |
+
+
|
| 694 |
+
defines.push_back("S_V=" + std::to_string(key.s_v) + "u");
|
| 695 |
+
defines.push_back("WG_SIZE=" + std::to_string(key.s_v) + "u");
|
| 696 |
+
|
| 697 |
+
@@ -1899,6 +1927,24 @@ class ggml_webgpu_shader_lib {
|
| 698 |
+
key.num_cols = context.dst->ne[1];
|
| 699 |
+
key.use_mmvq =
|
| 700 |
+
ggml_webgpu_can_use_mmvq(context.src0, context.src1, context.supports_dot_product, context.vendor);
|
| 701 |
+
+#if defined(GGML_WEBGPU_Q1_VEC4)
|
| 702 |
+
+ if (context.src0->type == GGML_TYPE_Q1_0) {
|
| 703 |
+
+# if defined(GGML_WEBGPU_Q1_VEC4_SHAPE_AWARE_OUTPUTS)
|
| 704 |
+
+ const uint32_t q1_k = context.src0->ne[0];
|
| 705 |
+
+ const uint32_t q1_m = context.dst->ne[0];
|
| 706 |
+
+ if (q1_k <= GGML_WEBGPU_Q1_VEC4_LARGE_K_THRESHOLD ||
|
| 707 |
+
+ q1_m < GGML_WEBGPU_Q1_VEC4_LARGE_K_THRESHOLD) {
|
| 708 |
+
+ key.q1_outputs_per_wg = GGML_WEBGPU_Q1_VEC4_OUTPUTS_PER_WG;
|
| 709 |
+
+ } else if (q1_m >= GGML_WEBGPU_Q1_VEC4_LARGE_K_THRESHOLD && q1_m < q1_k) {
|
| 710 |
+
+ key.q1_outputs_per_wg = 16u;
|
| 711 |
+
+ } else {
|
| 712 |
+
+ key.q1_outputs_per_wg = 8u;
|
| 713 |
+
+ }
|
| 714 |
+
+# else
|
| 715 |
+
+ key.q1_outputs_per_wg = GGML_WEBGPU_Q1_VEC4_OUTPUTS_PER_WG;
|
| 716 |
+
+# endif
|
| 717 |
+
+ }
|
| 718 |
+
+#endif
|
| 719 |
+
|
| 720 |
+
auto it = mul_mat_vec_pipelines.find(key);
|
| 721 |
+
if (it != mul_mat_vec_pipelines.end()) {
|
| 722 |
+
@@ -1931,7 +1977,15 @@ class ggml_webgpu_shader_lib {
|
| 723 |
std::transform(type_upper.begin(), type_upper.end(), type_upper.begin(), ::toupper);
|
| 724 |
|
| 725 |
defines.push_back("BYTE_HELPERS");
|
|
|
|
| 736 |
defines.push_back("U32_DEQUANT_HELPERS");
|
| 737 |
defines.push_back("SRC0_INNER_TYPE=u32");
|
| 738 |
switch (context.src0->type) {
|
| 739 |
+
@@ -1973,6 +2027,13 @@ class ggml_webgpu_shader_lib {
|
| 740 |
+
}
|
| 741 |
+
}
|
| 742 |
+
|
| 743 |
+
+#if defined(GGML_WEBGPU_Q1_ROW_RETILE)
|
| 744 |
+
+ if (context.src0->type == GGML_TYPE_Q1_0) {
|
| 745 |
+
+ defines.push_back("Q1_ROW_RETILED");
|
| 746 |
+
+ variant += "_row_retiled";
|
| 747 |
+
+ }
|
| 748 |
+
+#endif
|
| 749 |
+
+
|
| 750 |
+
// src1 type (vector)
|
| 751 |
+
switch (context.src1->type) {
|
| 752 |
+
case GGML_TYPE_F32:
|
| 753 |
+
@@ -1995,6 +2056,17 @@ class ggml_webgpu_shader_lib {
|
| 754 |
|
| 755 |
if (key.src0_type == GGML_TYPE_Q1_0) {
|
| 756 |
outputs_per_wg = WEBGPU_MUL_MAT_VEC_LEGACY_Q_OUTPUTS_PER_WG;
|
| 757 |
+#if defined(GGML_WEBGPU_Q1_VEC4)
|
| 758 |
+ wg_size = GGML_WEBGPU_Q1_VEC4_WG_SIZE;
|
| 759 |
+
+ outputs_per_wg = key.q1_outputs_per_wg;
|
| 760 |
+ variant += "_wg" + std::to_string(wg_size);
|
| 761 |
+
+ variant += "_out" + std::to_string(outputs_per_wg);
|
| 762 |
+#else
|
| 763 |
+ if (!context.supports_subgroups) {
|
| 764 |
+ wg_size = WEBGPU_MUL_MAT_VEC_Q1_NO_SG_WG_SIZE;
|
|
|
|
| 768 |
} else if (key.src0_type >= GGML_TYPE_Q2_K) {
|
| 769 |
outputs_per_wg = WEBGPU_MUL_MAT_VEC_K_Q_OUTPUTS_PER_WG;
|
| 770 |
} else if (key.src0_type >= GGML_TYPE_Q4_0) {
|
| 771 |
+
@@ -2008,7 +2080,12 @@ class ggml_webgpu_shader_lib {
|
| 772 |
+
|
| 773 |
+
defines.push_back(std::string("WG_SIZE=") + std::to_string(wg_size));
|
| 774 |
+
defines.push_back(std::string("OUTPUTS_PER_WG=") + std::to_string(outputs_per_wg));
|
| 775 |
+
- defines.push_back(context.supports_subgroups ? "USE_SUBGROUP_REDUCTION" : "USE_WORKGROUP_REDUCTION");
|
| 776 |
+
+ if (key.src0_type == GGML_TYPE_Q1_0 && wg_size == 32 && context.supports_subgroups) {
|
| 777 |
+
+ defines.push_back("USE_SUBGROUP_REDUCTION");
|
| 778 |
+
+ defines.push_back("USE_SINGLE_SUBGROUP_REDUCTION");
|
| 779 |
+
+ } else {
|
| 780 |
+
+ defines.push_back(context.supports_subgroups ? "USE_SUBGROUP_REDUCTION" : "USE_WORKGROUP_REDUCTION");
|
| 781 |
+
+ }
|
| 782 |
+
variant += context.supports_subgroups ? "_sg_reduce" : "_wg_reduce";
|
| 783 |
+
if (key.vectorized) {
|
| 784 |
+
variant += "_vectorized";
|
| 785 |
+
@@ -2027,6 +2104,87 @@ class ggml_webgpu_shader_lib {
|
| 786 |
+
return mul_mat_vec_pipelines[key];
|
| 787 |
+
}
|
| 788 |
+
|
| 789 |
+
+#ifdef GGML_WEBGPU_Q1_GLU_FUSION
|
| 790 |
+
+ webgpu_pipeline get_mul_mat_vec_q1_glu_pipeline(const ggml_webgpu_shader_lib_context & context) {
|
| 791 |
+
+ GGML_ASSERT(context.src0->type == GGML_TYPE_Q1_0);
|
| 792 |
+
+ GGML_ASSERT(context.src1->type == GGML_TYPE_F32);
|
| 793 |
+
+ GGML_ASSERT(context.src2->type == GGML_TYPE_F32);
|
| 794 |
+
+ GGML_ASSERT(context.dst->type == GGML_TYPE_F32);
|
| 795 |
+
+ GGML_ASSERT(context.supports_subgroups);
|
| 796 |
+
+
|
| 797 |
+
+ auto it = mul_mat_vec_q1_glu_pipelines.find(1);
|
| 798 |
+
+ if (it != mul_mat_vec_q1_glu_pipelines.end()) {
|
| 799 |
+
+ return it->second;
|
| 800 |
+
+ }
|
| 801 |
+
+
|
| 802 |
+
+ const uint32_t wg_size = GGML_WEBGPU_Q1_VEC4_WG_SIZE;
|
| 803 |
+
+ const uint32_t outputs_per_wg = WEBGPU_MUL_MAT_VEC_LEGACY_Q_OUTPUTS_PER_WG;
|
| 804 |
+
+ std::vector<std::string> defines = {
|
| 805 |
+
+ std::string("WG_SIZE=") + std::to_string(wg_size),
|
| 806 |
+
+ std::string("OUTPUTS_PER_WG=") + std::to_string(outputs_per_wg),
|
| 807 |
+
+ };
|
| 808 |
+
+ std::string variant = "mul_mat_vec_q1_glu_wg" + std::to_string(wg_size);
|
| 809 |
+
+#if defined(GGML_WEBGPU_Q1_ROW_RETILE)
|
| 810 |
+
+ defines.push_back("Q1_ROW_RETILED");
|
| 811 |
+
+ variant += "_row_retiled";
|
| 812 |
+
+#endif
|
| 813 |
+
+ auto processed = preprocessor.preprocess(wgsl_mul_mat_vec_q1_glu, defines);
|
| 814 |
+
+ auto decisions = std::make_shared<ggml_webgpu_mul_mat_vec_shader_decisions>();
|
| 815 |
+
+ decisions->wg_size = wg_size;
|
| 816 |
+
+ decisions->outputs_per_wg = outputs_per_wg;
|
| 817 |
+
+ decisions->vec_size = 1;
|
| 818 |
+
+
|
| 819 |
+
+ webgpu_pipeline pipeline = ggml_webgpu_create_pipeline(device, processed, variant);
|
| 820 |
+
+ pipeline.context = decisions;
|
| 821 |
+
+ mul_mat_vec_q1_glu_pipelines[1] = pipeline;
|
| 822 |
+
+ return mul_mat_vec_q1_glu_pipelines[1];
|
| 823 |
+
+ }
|
| 824 |
+
+#endif
|
| 825 |
+
+
|
| 826 |
+
+#ifdef GGML_WEBGPU_Q1_DUAL_GLU_FUSION
|
| 827 |
+
+ webgpu_pipeline get_mul_mat_vec_q1_dual_glu_pipeline(const ggml_webgpu_shader_lib_context & context) {
|
| 828 |
+
+ GGML_ASSERT(context.src0->type == GGML_TYPE_Q1_0);
|
| 829 |
+
+ GGML_ASSERT(context.src1->type == GGML_TYPE_Q1_0);
|
| 830 |
+
+ GGML_ASSERT(context.src2->type == GGML_TYPE_F32);
|
| 831 |
+
+ GGML_ASSERT(context.dst->type == GGML_TYPE_F32);
|
| 832 |
+
+ GGML_ASSERT(context.supports_subgroups);
|
| 833 |
+
+
|
| 834 |
+
+ const uint32_t q1_k = context.src0->ne[0];
|
| 835 |
+
+ const uint32_t q1_m = context.dst->ne[0];
|
| 836 |
+
+ uint32_t outputs_per_wg;
|
| 837 |
+
+ if (q1_k <= 4096 || q1_m < 4096) {
|
| 838 |
+
+ outputs_per_wg = 4;
|
| 839 |
+
+ } else if (q1_m >= 4096 && q1_m < q1_k) {
|
| 840 |
+
+ outputs_per_wg = 16;
|
| 841 |
+
+ } else {
|
| 842 |
+
+ outputs_per_wg = 8;
|
| 843 |
+
+ }
|
| 844 |
+
+
|
| 845 |
+
+ auto it = mul_mat_vec_q1_dual_glu_pipelines.find(outputs_per_wg);
|
| 846 |
+
+ if (it != mul_mat_vec_q1_dual_glu_pipelines.end()) {
|
| 847 |
+
+ return it->second;
|
| 848 |
+
+ }
|
| 849 |
+
+
|
| 850 |
+
+ const uint32_t wg_size = GGML_WEBGPU_Q1_VEC4_WG_SIZE;
|
| 851 |
+
+ std::vector<std::string> defines = {
|
| 852 |
+
+ std::string("WG_SIZE=") + std::to_string(wg_size),
|
| 853 |
+
+ std::string("OUTPUTS_PER_WG=") + std::to_string(outputs_per_wg),
|
| 854 |
+
+ };
|
| 855 |
+
+ std::string variant = "mul_mat_vec_q1_dual_glu_wg" + std::to_string(wg_size) + "_out" +
|
| 856 |
+
+ std::to_string(outputs_per_wg);
|
| 857 |
+
+ auto processed = preprocessor.preprocess(wgsl_mul_mat_vec_q1_dual_glu, defines);
|
| 858 |
+
+ auto decisions = std::make_shared<ggml_webgpu_mul_mat_vec_shader_decisions>();
|
| 859 |
+
+ decisions->wg_size = wg_size;
|
| 860 |
+
+ decisions->outputs_per_wg = outputs_per_wg;
|
| 861 |
+
+ decisions->vec_size = 1;
|
| 862 |
+
+
|
| 863 |
+
+ webgpu_pipeline pipeline = ggml_webgpu_create_pipeline(device, processed, variant);
|
| 864 |
+
+ pipeline.context = decisions;
|
| 865 |
+
+ mul_mat_vec_q1_dual_glu_pipelines[outputs_per_wg] = pipeline;
|
| 866 |
+
+ return mul_mat_vec_q1_dual_glu_pipelines[outputs_per_wg];
|
| 867 |
+
+ }
|
| 868 |
+
+#endif
|
| 869 |
+
+
|
| 870 |
+
webgpu_pipeline get_mul_mat_fast_pipeline(const ggml_webgpu_shader_lib_context & context) {
|
| 871 |
+
ggml_webgpu_mul_mat_pipeline_key key = {};
|
| 872 |
+
key.src0_type = context.src0->type;
|
| 873 |
+
@@ -2091,6 +2249,13 @@ class ggml_webgpu_shader_lib {
|
| 874 |
+
defines.push_back("U32_DEQUANT_HELPERS");
|
| 875 |
+
defines.push_back("SRC0_INNER_TYPE=u32");
|
| 876 |
+
|
| 877 |
+
+#if defined(GGML_WEBGPU_Q1_ROW_RETILE)
|
| 878 |
+
+ if (context.src0->type == GGML_TYPE_Q1_0) {
|
| 879 |
+
+ defines.push_back("Q1_ROW_RETILED");
|
| 880 |
+
+ variant += "_row_retiled";
|
| 881 |
+
+ }
|
| 882 |
+
+#endif
|
| 883 |
+
+
|
| 884 |
+
switch (context.src0->type) {
|
| 885 |
+
case GGML_TYPE_IQ1_S:
|
| 886 |
+
case GGML_TYPE_IQ1_M:
|
| 887 |
+
@@ -2263,6 +2428,13 @@ class ggml_webgpu_shader_lib {
|
| 888 |
+
defines.push_back("U32_DEQUANT_HELPERS");
|
| 889 |
+
defines.push_back("SRC0_INNER_TYPE=u32");
|
| 890 |
+
|
| 891 |
+
+#if defined(GGML_WEBGPU_Q1_ROW_RETILE)
|
| 892 |
+
+ if (context.src0->type == GGML_TYPE_Q1_0) {
|
| 893 |
+
+ defines.push_back("Q1_ROW_RETILED");
|
| 894 |
+
+ variant += "_row_retiled";
|
| 895 |
+
+ }
|
| 896 |
+
+#endif
|
| 897 |
+
+
|
| 898 |
+
switch (context.src0->type) {
|
| 899 |
+
case GGML_TYPE_IQ1_S:
|
| 900 |
+
case GGML_TYPE_IQ1_M:
|
| 901 |
+
diff --git a/llama.cpp/ggml/src/ggml-webgpu/ggml-webgpu.cpp b/llama.cpp/ggml/src/ggml-webgpu/ggml-webgpu.cpp
|
| 902 |
+
index 29025e9..00a4920 100644
|
| 903 |
+
--- a/llama.cpp/ggml/src/ggml-webgpu/ggml-webgpu.cpp
|
| 904 |
+
+++ b/llama.cpp/ggml/src/ggml-webgpu/ggml-webgpu.cpp
|
| 905 |
+
@@ -17,12 +17,19 @@
|
| 906 |
+
#include <webgpu/webgpu_cpp.h>
|
| 907 |
+
|
| 908 |
+
#include <atomic>
|
| 909 |
+
+#if defined(GGML_WEBGPU_GPU_PROFILE) || defined(GGML_WEBGPU_GDN_CACHE_FUSION)
|
| 910 |
+
+# include <algorithm>
|
| 911 |
+
+#endif
|
| 912 |
+
+#ifdef GGML_WEBGPU_TURBO_TRACE
|
| 913 |
+
+# include <chrono>
|
| 914 |
+
+#endif
|
| 915 |
+
#include <cstdint>
|
| 916 |
+
#include <cstring>
|
| 917 |
+
#ifdef GGML_WEBGPU_GPU_PROFILE
|
| 918 |
+
# include <iomanip>
|
| 919 |
+
#endif
|
| 920 |
+
-#if defined(GGML_WEBGPU_DEBUG) || defined(GGML_WEBGPU_CPU_PROFILE) || defined(GGML_WEBGPU_GPU_PROFILE)
|
| 921 |
+
+#if defined(GGML_WEBGPU_DEBUG) || defined(GGML_WEBGPU_CPU_PROFILE) || defined(GGML_WEBGPU_GPU_PROFILE) || \
|
| 922 |
+
+ defined(GGML_WEBGPU_TURBO_TRACE)
|
| 923 |
+
# include <iostream>
|
| 924 |
+
#endif
|
| 925 |
+
#include <memory>
|
| 926 |
+
@@ -86,7 +93,11 @@ static inline uint32_t ggml_webgpu_u32_from_f32(float value) {
|
| 927 |
+
|
| 928 |
+
/* Constants */
|
| 929 |
+
|
| 930 |
+
-#define WEBGPU_DEFAULT_COMMAND_SUBMIT_BATCH_SIZE 64u
|
| 931 |
+
+#ifndef GGML_WEBGPU_COMMAND_SUBMIT_BATCH_SIZE
|
| 932 |
+
+# define GGML_WEBGPU_COMMAND_SUBMIT_BATCH_SIZE 64
|
| 933 |
+
+#endif
|
| 934 |
+
+
|
| 935 |
+
+#define WEBGPU_DEFAULT_COMMAND_SUBMIT_BATCH_SIZE (GGML_WEBGPU_COMMAND_SUBMIT_BATCH_SIZE + 0u)
|
| 936 |
+
#define WEBGPU_NUM_PARAM_SLOT_SAFETY_MARGIN 10u
|
| 937 |
+
#define WEBGPU_RUNTIME_WAIT_TIMEOUT_MS 30000u
|
| 938 |
+
#define WEBGPU_RUNTIME_WAIT_TIMEOUT_NS (WEBGPU_RUNTIME_WAIT_TIMEOUT_MS * 1e6)
|
| 939 |
+
@@ -119,8 +130,14 @@ static void ggml_webgpu_create_buffer(wgpu::Device & device,
|
| 940 |
+
// cursor is reset immediately after that batch is submitted.
|
| 941 |
+
struct webgpu_param_arena {
|
| 942 |
+
wgpu::Buffer buffer;
|
| 943 |
+
+#ifdef GGML_WEBGPU_BATCH_PARAM_UPLOADS
|
| 944 |
+
+ std::vector<uint8_t> host_data;
|
| 945 |
+
+#endif
|
| 946 |
+
size_t slot_stride = 0;
|
| 947 |
+
size_t slot_size = 0;
|
| 948 |
+
+#ifdef GGML_WEBGPU_BATCH_PARAM_UPLOADS
|
| 949 |
+
+ size_t dirty_end = 0;
|
| 950 |
+
+#endif
|
| 951 |
+
uint32_t slot_count = 0;
|
| 952 |
+
uint32_t next_slot = 0;
|
| 953 |
+
|
| 954 |
+
@@ -129,6 +146,10 @@ struct webgpu_param_arena {
|
| 955 |
+
this->slot_size = slot_size;
|
| 956 |
+
this->slot_count = slot_count;
|
| 957 |
+
this->next_slot = 0;
|
| 958 |
+
+#ifdef GGML_WEBGPU_BATCH_PARAM_UPLOADS
|
| 959 |
+
+ this->dirty_end = 0;
|
| 960 |
+
+ this->host_data.resize(this->slot_stride * slot_count);
|
| 961 |
+
+#endif
|
| 962 |
+
|
| 963 |
+
ggml_webgpu_create_buffer(device, buffer, this->slot_stride * slot_count,
|
| 964 |
+
wgpu::BufferUsage::CopyDst | wgpu::BufferUsage::Uniform, "ggml_webgpu_param_arena");
|
| 965 |
+
@@ -143,13 +164,39 @@ struct webgpu_param_arena {
|
| 966 |
+
return slot_stride * next_slot++;
|
| 967 |
+
}
|
| 968 |
+
|
| 969 |
+
- void reset() { next_slot = 0; }
|
| 970 |
+
+#ifdef GGML_WEBGPU_BATCH_PARAM_UPLOADS
|
| 971 |
+
+ void write_slot(size_t offset, const void * data, size_t size) {
|
| 972 |
+
+ GGML_ASSERT(offset + size <= host_data.size());
|
| 973 |
+
+ memcpy(host_data.data() + offset, data, size);
|
| 974 |
+
+ dirty_end = std::max(dirty_end, offset + size);
|
| 975 |
+
+ }
|
| 976 |
+
+
|
| 977 |
+
+ bool flush(wgpu::Queue & queue) {
|
| 978 |
+
+ if (dirty_end == 0) {
|
| 979 |
+
+ return false;
|
| 980 |
+
+ }
|
| 981 |
+
+ queue.WriteBuffer(buffer, 0, host_data.data(), dirty_end);
|
| 982 |
+
+ dirty_end = 0;
|
| 983 |
+
+ return true;
|
| 984 |
+
+ }
|
| 985 |
+
+#endif
|
| 986 |
+
+
|
| 987 |
+
+ void reset() {
|
| 988 |
+
+#ifdef GGML_WEBGPU_BATCH_PARAM_UPLOADS
|
| 989 |
+
+ GGML_ASSERT(dirty_end == 0);
|
| 990 |
+
+#endif
|
| 991 |
+
+ next_slot = 0;
|
| 992 |
+
+ }
|
| 993 |
+
|
| 994 |
+
void cleanup() {
|
| 995 |
+
if (buffer) {
|
| 996 |
+
buffer.Destroy();
|
| 997 |
+
buffer = nullptr;
|
| 998 |
+
}
|
| 999 |
+
+#ifdef GGML_WEBGPU_BATCH_PARAM_UPLOADS
|
| 1000 |
+
+ host_data.clear();
|
| 1001 |
+
+ dirty_end = 0;
|
| 1002 |
+
+#endif
|
| 1003 |
+
}
|
| 1004 |
+
|
| 1005 |
+
~webgpu_param_arena() { this->cleanup(); }
|
| 1006 |
+
@@ -167,6 +214,9 @@ struct webgpu_dispatch_desc {
|
| 1007 |
+
std::vector<uint32_t> params;
|
| 1008 |
+
std::vector<wgpu::BindGroupEntry> bind_group_entries;
|
| 1009 |
+
std::pair<uint32_t, uint32_t> workgroups = { 1, 1 };
|
| 1010 |
+
+#ifdef GGML_WEBGPU_GPU_PROFILE
|
| 1011 |
+
+ std::string profile_name = {};
|
| 1012 |
+
+#endif
|
| 1013 |
+
};
|
| 1014 |
+
|
| 1015 |
+
struct webgpu_capabilities {
|
| 1016 |
+
@@ -256,15 +306,21 @@ struct webgpu_context_struct {
|
| 1017 |
+
wgpu::ComputePassEncoder active_compute_pass;
|
| 1018 |
+
bool batch_compute_passes = true;
|
| 1019 |
+
|
| 1020 |
+
+#ifdef GGML_WEBGPU_TURBO_TRACE
|
| 1021 |
+
+ uint64_t turbo_trace_graph_count = 0;
|
| 1022 |
+
+#endif
|
| 1023 |
+
+
|
| 1024 |
+
size_t memset_bytes_per_thread;
|
| 1025 |
+
|
| 1026 |
+
#ifdef GGML_WEBGPU_GPU_PROFILE
|
| 1027 |
+
// Profiling: per-shader GPU time in ms
|
| 1028 |
+
std::unordered_map<std::string, double> shader_gpu_time_ms;
|
| 1029 |
+
+ std::unordered_map<std::string, double> profile_graph_gpu_time_ms;
|
| 1030 |
+
wgpu::Buffer profile_timestamp_dev_buf;
|
| 1031 |
+
wgpu::Buffer profile_timestamp_host_buf;
|
| 1032 |
+
wgpu::QuerySet profile_timestamp_query_set;
|
| 1033 |
+
uint32_t profile_timestamp_query_count = 0;
|
| 1034 |
+
+ uint64_t profile_graph_count = 0;
|
| 1035 |
+
#endif
|
| 1036 |
+
|
| 1037 |
+
~webgpu_context_struct() {
|
| 1038 |
+
@@ -536,7 +592,9 @@ static webgpu_encoded_op ggml_backend_webgpu_build_multi(webgpu_context &
|
| 1039 |
+
const std::vector<webgpu_dispatch_desc> & dispatches) {
|
| 1040 |
+
webgpu_encoded_op result = {};
|
| 1041 |
+
std::vector<wgpu::BindGroup> bind_groups;
|
| 1042 |
+
+#ifndef GGML_WEBGPU_BATCH_PARAM_UPLOADS
|
| 1043 |
+
std::vector<size_t> param_offsets;
|
| 1044 |
+
+#endif
|
| 1045 |
+
result.num_kernels = dispatches.size();
|
| 1046 |
+
|
| 1047 |
+
for (size_t i = 0; i < dispatches.size(); i++) {
|
| 1048 |
+
@@ -555,13 +613,19 @@ static webgpu_encoded_op ggml_backend_webgpu_build_multi(webgpu_context &
|
| 1049 |
+
bind_group_desc.entries = entries.data();
|
| 1050 |
+
bind_group_desc.label = dispatch.pipeline.name.c_str();
|
| 1051 |
+
bind_groups.push_back(ctx->global_ctx->device.CreateBindGroup(&bind_group_desc));
|
| 1052 |
+
+#ifdef GGML_WEBGPU_BATCH_PARAM_UPLOADS
|
| 1053 |
+
+ ctx->param_arena.write_slot(param_offset, dispatch.params.data(), param_size);
|
| 1054 |
+
+#else
|
| 1055 |
+
param_offsets.push_back(param_offset);
|
| 1056 |
+
+#endif
|
| 1057 |
+
}
|
| 1058 |
+
|
| 1059 |
+
+#ifndef GGML_WEBGPU_BATCH_PARAM_UPLOADS
|
| 1060 |
+
for (size_t i = 0; i < param_offsets.size(); i++) {
|
| 1061 |
+
ctx->global_ctx->queue.WriteBuffer(ctx->param_arena.buffer, param_offsets[i], dispatches[i].params.data(),
|
| 1062 |
+
dispatches[i].params.size() * sizeof(uint32_t));
|
| 1063 |
+
}
|
| 1064 |
+
+#endif
|
| 1065 |
+
|
| 1066 |
+
#ifdef GGML_WEBGPU_GPU_PROFILE
|
| 1067 |
+
for (size_t i = 0; i < dispatches.size(); i++) {
|
| 1068 |
+
@@ -582,7 +646,8 @@ static webgpu_encoded_op ggml_backend_webgpu_build_multi(webgpu_context &
|
| 1069 |
+
pass.SetBindGroup(0, bind_groups[i]);
|
| 1070 |
+
pass.DispatchWorkgroups(dispatches[i].workgroups.first, dispatches[i].workgroups.second, 1);
|
| 1071 |
+
pass.End();
|
| 1072 |
+
- result.pipeline_names.push_back(dispatches[i].pipeline.name);
|
| 1073 |
+
+ result.pipeline_names.push_back(dispatches[i].profile_name.empty() ? dispatches[i].pipeline.name :
|
| 1074 |
+
+ dispatches[i].profile_name);
|
| 1075 |
+
}
|
| 1076 |
+
#else
|
| 1077 |
+
for (size_t i = 0; i < dispatches.size(); i++) {
|
| 1078 |
+
@@ -1229,7 +1294,9 @@ static webgpu_encoded_op ggml_webgpu_gated_delta_net(webgpu_context & ctx,
|
| 1079 |
+
ggml_tensor * src3,
|
| 1080 |
+
ggml_tensor * src4,
|
| 1081 |
+
ggml_tensor * src5,
|
| 1082 |
+
- ggml_tensor * dst) {
|
| 1083 |
+
+ ggml_tensor * dst,
|
| 1084 |
+
+ ggml_tensor * state_cache = nullptr,
|
| 1085 |
+
+ uint32_t cache_slot_stride = 0) {
|
| 1086 |
+
ggml_webgpu_shader_lib_context shader_lib_ctx = {};
|
| 1087 |
+
shader_lib_ctx.src0 = src0;
|
| 1088 |
+
shader_lib_ctx.src1 = src1;
|
| 1089 |
+
@@ -1239,7 +1306,7 @@ static webgpu_encoded_op ggml_webgpu_gated_delta_net(webgpu_context & ctx,
|
| 1090 |
+
shader_lib_ctx.dst = dst;
|
| 1091 |
+
shader_lib_ctx.max_wg_size = ctx->global_ctx->capabilities.limits.maxComputeInvocationsPerWorkgroup;
|
| 1092 |
+
|
| 1093 |
+
- webgpu_pipeline pipeline = ctx->shader_lib->get_gated_delta_net_pipeline(shader_lib_ctx);
|
| 1094 |
+
+ webgpu_pipeline pipeline = ctx->shader_lib->get_gated_delta_net_pipeline(shader_lib_ctx, state_cache != nullptr);
|
| 1095 |
+
|
| 1096 |
+
const uint32_t s_v = (uint32_t) src2->ne[0];
|
| 1097 |
+
const uint32_t h = (uint32_t) src2->ne[1];
|
| 1098 |
+
@@ -1272,6 +1339,10 @@ static webgpu_encoded_op ggml_webgpu_gated_delta_net(webgpu_context & ctx,
|
| 1099 |
+
(uint32_t) (src2->ne[3] / src0->ne[3]),
|
| 1100 |
+
K,
|
| 1101 |
+
scale_u32,
|
| 1102 |
+
+ state_cache != nullptr
|
| 1103 |
+
+ ? (uint32_t) (ggml_webgpu_tensor_misalignment(ctx, state_cache) / ggml_type_size(state_cache->type))
|
| 1104 |
+
+ : 0,
|
| 1105 |
+
+ cache_slot_stride,
|
| 1106 |
+
};
|
| 1107 |
+
|
| 1108 |
+
std::vector<wgpu::BindGroupEntry> entries = {
|
| 1109 |
+
@@ -1280,10 +1351,89 @@ static webgpu_encoded_op ggml_webgpu_gated_delta_net(webgpu_context & ctx,
|
| 1110 |
+
ggml_webgpu_make_tensor_bind_group_entry(ctx, 4, src4), ggml_webgpu_make_tensor_bind_group_entry(ctx, 5, src5),
|
| 1111 |
+
ggml_webgpu_make_tensor_bind_group_entry(ctx, 6, dst),
|
| 1112 |
+
};
|
| 1113 |
+
+ if (state_cache != nullptr) {
|
| 1114 |
+
+ entries.push_back(ggml_webgpu_make_tensor_bind_group_entry(ctx, 7, state_cache));
|
| 1115 |
+
+ }
|
| 1116 |
+
|
| 1117 |
+
return ggml_backend_webgpu_build(ctx, pipeline, params, entries, h, n_seqs);
|
| 1118 |
+
}
|
| 1119 |
+
|
| 1120 |
+
+#ifdef GGML_WEBGPU_GDN_CACHE_FUSION
|
| 1121 |
+
+struct ggml_webgpu_gdn_cache_fusion {
|
| 1122 |
+
+ ggml_tensor * cache;
|
| 1123 |
+
+ uint32_t slot_stride;
|
| 1124 |
+
+ int num_encoded_ops;
|
| 1125 |
+
+};
|
| 1126 |
+
+
|
| 1127 |
+
+static bool ggml_webgpu_is_view_or_noop(const ggml_tensor * tensor) {
|
| 1128 |
+
+ return ggml_is_empty(tensor) || tensor->op == GGML_OP_RESHAPE || tensor->op == GGML_OP_TRANSPOSE ||
|
| 1129 |
+
+ tensor->op == GGML_OP_VIEW || tensor->op == GGML_OP_PERMUTE || tensor->op == GGML_OP_NONE;
|
| 1130 |
+
+}
|
| 1131 |
+
+
|
| 1132 |
+
+static std::optional<ggml_webgpu_gdn_cache_fusion> ggml_webgpu_try_gdn_cache_fusion(webgpu_context & ctx,
|
| 1133 |
+
+ ggml_cgraph * cgraph,
|
| 1134 |
+
+ int node_idx) {
|
| 1135 |
+
+ ggml_tensor * gdn = cgraph->nodes[node_idx];
|
| 1136 |
+
+ if (gdn->op != GGML_OP_GATED_DELTA_NET || gdn->type != GGML_TYPE_F32 ||
|
| 1137 |
+
+ (gdn->flags & GGML_TENSOR_FLAG_OUTPUT)) {
|
| 1138 |
+
+ return std::nullopt;
|
| 1139 |
+
+ }
|
| 1140 |
+
+
|
| 1141 |
+
+ const ggml_tensor * src_v = gdn->src[2];
|
| 1142 |
+
+ if (src_v == nullptr) {
|
| 1143 |
+
+ return std::nullopt;
|
| 1144 |
+
+ }
|
| 1145 |
+
+ const int64_t s_v = src_v->ne[0];
|
| 1146 |
+
+ const int64_t h = src_v->ne[1];
|
| 1147 |
+
+ const int64_t n_tokens = src_v->ne[2];
|
| 1148 |
+
+ const int64_t n_seqs = src_v->ne[3];
|
| 1149 |
+
+ const int64_t d = s_v * s_v * h;
|
| 1150 |
+
+ const int64_t k = ggml_get_op_params_i32(gdn, 0);
|
| 1151 |
+
+ if (k < 1 || n_tokens < 1) {
|
| 1152 |
+
+ return std::nullopt;
|
| 1153 |
+
+ }
|
| 1154 |
+
+ const int64_t n_written = std::min<int64_t>(n_tokens, k);
|
| 1155 |
+
+ const size_t tail_off = ggml_row_size(GGML_TYPE_F32, s_v * h * n_tokens * n_seqs);
|
| 1156 |
+
+
|
| 1157 |
+
+ ggml_tensor * cpy = nullptr;
|
| 1158 |
+
+ int cpy_idx = -1;
|
| 1159 |
+
+ for (int j = node_idx + 1; j < cgraph->n_nodes; ++j) {
|
| 1160 |
+
+ ggml_tensor * candidate = cgraph->nodes[j];
|
| 1161 |
+
+ if (ggml_webgpu_is_view_or_noop(candidate)) {
|
| 1162 |
+
+ continue;
|
| 1163 |
+
+ }
|
| 1164 |
+
+ if (candidate->op != GGML_OP_CPY || (candidate->flags & GGML_TENSOR_FLAG_OUTPUT)) {
|
| 1165 |
+
+ return std::nullopt;
|
| 1166 |
+
+ }
|
| 1167 |
+
+ cpy = candidate;
|
| 1168 |
+
+ cpy_idx = j;
|
| 1169 |
+
+ break;
|
| 1170 |
+
+ }
|
| 1171 |
+
+ if (cpy == nullptr) {
|
| 1172 |
+
+ return std::nullopt;
|
| 1173 |
+
+ }
|
| 1174 |
+
+
|
| 1175 |
+
+ ggml_tensor * src = cpy->src[0];
|
| 1176 |
+
+ ggml_tensor * dst = cpy->src[1];
|
| 1177 |
+
+ if (src == nullptr || dst == nullptr || src->op != GGML_OP_VIEW || src->view_src != gdn ||
|
| 1178 |
+
+ src->view_offs != tail_off || !ggml_is_contiguous(src) || dst->op != GGML_OP_VIEW ||
|
| 1179 |
+
+ dst->type != GGML_TYPE_F32 || dst->buffer == nullptr || dst->ne[0] != d || dst->ne[1] != n_seqs ||
|
| 1180 |
+
+ dst->ne[2] != n_written || dst->ne[3] != 1 || dst->nb[0] != ggml_type_size(GGML_TYPE_F32) ||
|
| 1181 |
+
+ dst->nb[1] != ggml_row_size(GGML_TYPE_F32, d) || ggml_nelements(src) != ggml_nelements(dst) ||
|
| 1182 |
+
+ dst->nb[2] % sizeof(float) != 0) {
|
| 1183 |
+
+ return std::nullopt;
|
| 1184 |
+
+ }
|
| 1185 |
+
+
|
| 1186 |
+
+ const size_t slot_stride = k > 1 ? dst->nb[2] / sizeof(float) : 0;
|
| 1187 |
+
+ const size_t cache_offset = ggml_webgpu_tensor_misalignment(ctx, dst) / sizeof(float);
|
| 1188 |
+
+ if (slot_stride > UINT32_MAX || cache_offset > UINT32_MAX) {
|
| 1189 |
+
+ return std::nullopt;
|
| 1190 |
+
+ }
|
| 1191 |
+
+
|
| 1192 |
+
+ return ggml_webgpu_gdn_cache_fusion{ dst, (uint32_t) slot_stride, cpy_idx - node_idx + 1 };
|
| 1193 |
+
+}
|
| 1194 |
+
+#endif
|
| 1195 |
+
+
|
| 1196 |
+
static std::optional<webgpu_encoded_op> ggml_webgpu_set_rows(webgpu_context & ctx,
|
| 1197 |
+
ggml_tensor * src,
|
| 1198 |
+
ggml_tensor * idx,
|
| 1199 |
+
@@ -1564,10 +1714,211 @@ static webgpu_encoded_op ggml_webgpu_mul_mat(webgpu_context & ctx,
|
| 1200 |
+
dispatches.push_back({
|
| 1201 |
+
pipeline, std::move(params), std::move(entries), { wg_x, wg_y }
|
| 1202 |
+
});
|
| 1203 |
+
+#ifdef GGML_WEBGPU_GPU_PROFILE
|
| 1204 |
+
+ if (use_mat_vec && src0->type == GGML_TYPE_Q1_0) {
|
| 1205 |
+
+ dispatches.back().profile_name = pipeline.name + "_m" + std::to_string(dst->ne[0]) + "_k" +
|
| 1206 |
+
+ std::to_string(src0->ne[0]);
|
| 1207 |
+
+ }
|
| 1208 |
+
+#endif
|
| 1209 |
+
|
| 1210 |
+
return ggml_backend_webgpu_build_multi(ctx, dispatches);
|
| 1211 |
+
}
|
| 1212 |
+
|
| 1213 |
+
+#ifdef GGML_WEBGPU_Q1_GLU_FUSION
|
| 1214 |
+
+static bool ggml_webgpu_can_fuse_q1_glu(const webgpu_context & ctx,
|
| 1215 |
+
+ const ggml_cgraph * cgraph,
|
| 1216 |
+
+ int node_idx,
|
| 1217 |
+
+ bool & computed_is_gate) {
|
| 1218 |
+
+ if (node_idx < 1 || node_idx + 1 >= cgraph->n_nodes || !ctx->global_ctx->capabilities.supports_subgroups ||
|
| 1219 |
+
+ ctx->global_ctx->capabilities.limits.maxComputeInvocationsPerWorkgroup < GGML_WEBGPU_Q1_VEC4_WG_SIZE ||
|
| 1220 |
+
+ cgraph->nodes[node_idx - 1]->op != GGML_OP_MUL_MAT ||
|
| 1221 |
+
+ !ggml_can_fuse_subgraph(cgraph, node_idx, { GGML_OP_MUL_MAT, GGML_OP_GLU }, { node_idx + 1 })) {
|
| 1222 |
+
+ return false;
|
| 1223 |
+
+ }
|
| 1224 |
+
+
|
| 1225 |
+
+ const ggml_tensor * first = cgraph->nodes[node_idx - 1];
|
| 1226 |
+
+ const ggml_tensor * computed = cgraph->nodes[node_idx];
|
| 1227 |
+
+ const ggml_tensor * glu = cgraph->nodes[node_idx + 1];
|
| 1228 |
+
+ const ggml_tensor * gate = nullptr;
|
| 1229 |
+
+ const ggml_tensor * up = nullptr;
|
| 1230 |
+
+ if (glu->src[0] == first && glu->src[1] == computed) {
|
| 1231 |
+
+ gate = first;
|
| 1232 |
+
+ up = computed;
|
| 1233 |
+
+ computed_is_gate = false;
|
| 1234 |
+
+ } else if (glu->src[0] == computed && glu->src[1] == first) {
|
| 1235 |
+
+ gate = computed;
|
| 1236 |
+
+ up = first;
|
| 1237 |
+
+ computed_is_gate = true;
|
| 1238 |
+
+ } else {
|
| 1239 |
+
+ return false;
|
| 1240 |
+
+ }
|
| 1241 |
+
+
|
| 1242 |
+
+ const ggml_tensor * gate_weights = gate->src[0];
|
| 1243 |
+
+ const ggml_tensor * up_weights = up->src[0];
|
| 1244 |
+
+ const ggml_tensor * input = gate->src[1];
|
| 1245 |
+
+ if (up->src[1] != input || ggml_get_glu_op(glu) != GGML_GLU_OP_SWIGLU ||
|
| 1246 |
+
+ ggml_get_op_params_i32(glu, 1) != 0 || gate_weights->type != GGML_TYPE_Q1_0 ||
|
| 1247 |
+
+ up_weights->type != GGML_TYPE_Q1_0 || input->type != GGML_TYPE_F32 || gate->type != GGML_TYPE_F32 ||
|
| 1248 |
+
+ up->type != GGML_TYPE_F32 || glu->type != GGML_TYPE_F32) {
|
| 1249 |
+
+ return false;
|
| 1250 |
+
+ }
|
| 1251 |
+
+
|
| 1252 |
+
+ const ggml_tensor * other = computed_is_gate ? up : gate;
|
| 1253 |
+
+ const bool safe_other_overlap =
|
| 1254 |
+
+ !ggml_webgpu_tensor_overlap(glu, other) || ggml_webgpu_tensor_equal(glu, other);
|
| 1255 |
+
+ if (!ggml_are_same_shape(gate_weights, up_weights) || !ggml_are_same_stride(gate_weights, up_weights) ||
|
| 1256 |
+
+ !ggml_are_same_shape(gate, up) || !ggml_are_same_shape(gate, glu) || ggml_nrows(input) != 1 ||
|
| 1257 |
+
+ gate_weights->ne[2] != 1 || gate_weights->ne[3] != 1 || gate_weights->ne[0] != input->ne[0] ||
|
| 1258 |
+
+ gate_weights->ne[1] != glu->ne[0] || gate_weights->ne[0] % ggml_blck_size(GGML_TYPE_Q1_0) != 0 ||
|
| 1259 |
+
+ !ggml_is_contiguous(input) || !ggml_is_contiguous(other) || !ggml_is_contiguous(glu) || !safe_other_overlap) {
|
| 1260 |
+
+ return false;
|
| 1261 |
+
+ }
|
| 1262 |
+
+
|
| 1263 |
+
+ return !ggml_webgpu_tensor_overlap(glu, gate_weights) && !ggml_webgpu_tensor_overlap(glu, up_weights) &&
|
| 1264 |
+
+ !ggml_webgpu_tensor_overlap(glu, input);
|
| 1265 |
+
+}
|
| 1266 |
+
+
|
| 1267 |
+
+static webgpu_encoded_op ggml_webgpu_mul_mat_q1_glu(webgpu_context & ctx,
|
| 1268 |
+
+ ggml_tensor * computed,
|
| 1269 |
+
+ ggml_tensor * other,
|
| 1270 |
+
+ bool computed_is_gate,
|
| 1271 |
+
+ ggml_tensor * glu) {
|
| 1272 |
+
+ ggml_tensor * weights = computed->src[0];
|
| 1273 |
+
+ ggml_tensor * input = computed->src[1];
|
| 1274 |
+
+
|
| 1275 |
+
+ ggml_webgpu_shader_lib_context shader_lib_ctx = {};
|
| 1276 |
+
+ shader_lib_ctx.src0 = weights;
|
| 1277 |
+
+ shader_lib_ctx.src1 = input;
|
| 1278 |
+
+ shader_lib_ctx.src2 = other;
|
| 1279 |
+
+ shader_lib_ctx.dst = glu;
|
| 1280 |
+
+ shader_lib_ctx.supports_subgroups = ctx->global_ctx->capabilities.supports_subgroups;
|
| 1281 |
+
+ shader_lib_ctx.max_wg_size = ctx->global_ctx->capabilities.limits.maxComputeInvocationsPerWorkgroup;
|
| 1282 |
+
+
|
| 1283 |
+
+ webgpu_pipeline pipeline = ctx->shader_lib->get_mul_mat_vec_q1_glu_pipeline(shader_lib_ctx);
|
| 1284 |
+
+ auto * decisions = static_cast<ggml_webgpu_mul_mat_vec_shader_decisions *>(pipeline.context.get());
|
| 1285 |
+
+
|
| 1286 |
+
+ std::vector<uint32_t> params = {
|
| 1287 |
+
+ (uint32_t) (ggml_webgpu_tensor_misalignment(ctx, weights) / ggml_type_size(weights->type)),
|
| 1288 |
+
+ (uint32_t) (ggml_webgpu_tensor_misalignment(ctx, input) / ggml_type_size(input->type)),
|
| 1289 |
+
+ (uint32_t) (ggml_webgpu_tensor_misalignment(ctx, other) / ggml_type_size(other->type)),
|
| 1290 |
+
+ (uint32_t) (ggml_webgpu_tensor_misalignment(ctx, glu) / ggml_type_size(glu->type)),
|
| 1291 |
+
+ (uint32_t) glu->ne[0],
|
| 1292 |
+
+ (uint32_t) weights->ne[0],
|
| 1293 |
+
+ (uint32_t) (weights->nb[1] / ggml_type_size(weights->type)),
|
| 1294 |
+
+ computed_is_gate ? 1u : 0u,
|
| 1295 |
+
+ };
|
| 1296 |
+
+ std::vector<wgpu::BindGroupEntry> entries = {
|
| 1297 |
+
+ ggml_webgpu_make_tensor_bind_group_entry(ctx, 0, weights),
|
| 1298 |
+
+ ggml_webgpu_make_tensor_bind_group_entry(ctx, 1, input),
|
| 1299 |
+
+ ggml_webgpu_make_tensor_bind_group_entry(ctx, 2, other),
|
| 1300 |
+
+ ggml_webgpu_make_tensor_bind_group_entry(ctx, 3, glu),
|
| 1301 |
+
+ };
|
| 1302 |
+
+
|
| 1303 |
+
+ uint32_t wg_x;
|
| 1304 |
+
+ uint32_t wg_y;
|
| 1305 |
+
+ compute_2d_workgroups(CEIL_DIV((uint32_t) glu->ne[0], decisions->outputs_per_wg),
|
| 1306 |
+
+ ctx->global_ctx->capabilities.limits.maxComputeWorkgroupsPerDimension, wg_x, wg_y);
|
| 1307 |
+
+ return ggml_backend_webgpu_build(ctx, pipeline, params, entries, wg_x, wg_y);
|
| 1308 |
+
+}
|
| 1309 |
+
+#endif
|
| 1310 |
+
+
|
| 1311 |
+
+#ifdef GGML_WEBGPU_Q1_DUAL_GLU_FUSION
|
| 1312 |
+
+struct ggml_webgpu_q1_dual_glu_fusion {
|
| 1313 |
+
+ ggml_tensor * gate;
|
| 1314 |
+
+ ggml_tensor * up;
|
| 1315 |
+
+ ggml_tensor * glu;
|
| 1316 |
+
+};
|
| 1317 |
+
+
|
| 1318 |
+
+static std::optional<ggml_webgpu_q1_dual_glu_fusion> ggml_webgpu_try_q1_dual_glu_fusion(
|
| 1319 |
+
+ const webgpu_context & ctx, const ggml_cgraph * cgraph, int node_idx) {
|
| 1320 |
+
+ if (node_idx + 2 >= cgraph->n_nodes || !ctx->global_ctx->capabilities.supports_subgroups ||
|
| 1321 |
+
+ ctx->global_ctx->capabilities.limits.maxComputeInvocationsPerWorkgroup < GGML_WEBGPU_Q1_VEC4_WG_SIZE ||
|
| 1322 |
+
+ !ggml_can_fuse_subgraph(cgraph, node_idx, { GGML_OP_MUL_MAT, GGML_OP_MUL_MAT, GGML_OP_GLU },
|
| 1323 |
+
+ { node_idx + 2 })) {
|
| 1324 |
+
+ return std::nullopt;
|
| 1325 |
+
+ }
|
| 1326 |
+
+
|
| 1327 |
+
+ ggml_tensor * first = cgraph->nodes[node_idx];
|
| 1328 |
+
+ ggml_tensor * second = cgraph->nodes[node_idx + 1];
|
| 1329 |
+
+ ggml_tensor * glu = cgraph->nodes[node_idx + 2];
|
| 1330 |
+
+ ggml_tensor * gate = nullptr;
|
| 1331 |
+
+ ggml_tensor * up = nullptr;
|
| 1332 |
+
+ if (glu->src[0] == first && glu->src[1] == second) {
|
| 1333 |
+
+ gate = first;
|
| 1334 |
+
+ up = second;
|
| 1335 |
+
+ } else if (glu->src[0] == second && glu->src[1] == first) {
|
| 1336 |
+
+ gate = second;
|
| 1337 |
+
+ up = first;
|
| 1338 |
+
+ } else {
|
| 1339 |
+
+ return std::nullopt;
|
| 1340 |
+
+ }
|
| 1341 |
+
+
|
| 1342 |
+
+ ggml_tensor * gate_weights = gate->src[0];
|
| 1343 |
+
+ ggml_tensor * up_weights = up->src[0];
|
| 1344 |
+
+ ggml_tensor * input = gate->src[1];
|
| 1345 |
+
+ if (gate_weights == nullptr || up_weights == nullptr || input == nullptr || up->src[1] != input ||
|
| 1346 |
+
+ ggml_get_glu_op(glu) != GGML_GLU_OP_SWIGLU || ggml_get_op_params_i32(glu, 1) != 0 ||
|
| 1347 |
+
+ gate_weights->type != GGML_TYPE_Q1_0 || up_weights->type != GGML_TYPE_Q1_0 ||
|
| 1348 |
+
+ input->type != GGML_TYPE_F32 || gate->type != GGML_TYPE_F32 || up->type != GGML_TYPE_F32 ||
|
| 1349 |
+
+ glu->type != GGML_TYPE_F32 || !ggml_are_same_shape(gate_weights, up_weights) ||
|
| 1350 |
+
+ !ggml_are_same_stride(gate_weights, up_weights) || !ggml_are_same_shape(gate, up) ||
|
| 1351 |
+
+ !ggml_are_same_shape(gate, glu) || ggml_nrows(input) != 1 || gate_weights->ne[2] != 1 ||
|
| 1352 |
+
+ gate_weights->ne[3] != 1 || gate_weights->ne[0] != input->ne[0] || gate_weights->ne[1] != glu->ne[0] ||
|
| 1353 |
+
+ gate_weights->ne[0] % ggml_blck_size(GGML_TYPE_Q1_0) != 0 || !ggml_is_contiguous(input) ||
|
| 1354 |
+
+ !ggml_is_contiguous(glu)) {
|
| 1355 |
+
+ return std::nullopt;
|
| 1356 |
+
+ }
|
| 1357 |
+
+
|
| 1358 |
+
+ if (ggml_webgpu_tensor_overlap(glu, gate_weights) || ggml_webgpu_tensor_overlap(glu, up_weights) ||
|
| 1359 |
+
+ ggml_webgpu_tensor_overlap(glu, input)) {
|
| 1360 |
+
+ return std::nullopt;
|
| 1361 |
+
+ }
|
| 1362 |
+
+ return ggml_webgpu_q1_dual_glu_fusion{ gate, up, glu };
|
| 1363 |
+
+}
|
| 1364 |
+
+
|
| 1365 |
+
+static webgpu_encoded_op ggml_webgpu_mul_mat_q1_dual_glu(webgpu_context & ctx,
|
| 1366 |
+
+ const ggml_webgpu_q1_dual_glu_fusion & fusion) {
|
| 1367 |
+
+ ggml_tensor * gate_weights = fusion.gate->src[0];
|
| 1368 |
+
+ ggml_tensor * up_weights = fusion.up->src[0];
|
| 1369 |
+
+ ggml_tensor * input = fusion.gate->src[1];
|
| 1370 |
+
+ ggml_tensor * glu = fusion.glu;
|
| 1371 |
+
+
|
| 1372 |
+
+ ggml_webgpu_shader_lib_context shader_lib_ctx = {};
|
| 1373 |
+
+ shader_lib_ctx.src0 = gate_weights;
|
| 1374 |
+
+ shader_lib_ctx.src1 = up_weights;
|
| 1375 |
+
+ shader_lib_ctx.src2 = input;
|
| 1376 |
+
+ shader_lib_ctx.dst = glu;
|
| 1377 |
+
+ shader_lib_ctx.supports_subgroups = ctx->global_ctx->capabilities.supports_subgroups;
|
| 1378 |
+
+ shader_lib_ctx.supports_dot_product = ctx->global_ctx->capabilities.supports_dot_product;
|
| 1379 |
+
+ shader_lib_ctx.max_wg_size = ctx->global_ctx->capabilities.limits.maxComputeInvocationsPerWorkgroup;
|
| 1380 |
+
+
|
| 1381 |
+
+ webgpu_pipeline pipeline = ctx->shader_lib->get_mul_mat_vec_q1_dual_glu_pipeline(shader_lib_ctx);
|
| 1382 |
+
+ auto * decisions = static_cast<ggml_webgpu_mul_mat_vec_shader_decisions *>(pipeline.context.get());
|
| 1383 |
+
+ std::vector<uint32_t> params = {
|
| 1384 |
+
+ (uint32_t) (ggml_webgpu_tensor_misalignment(ctx, gate_weights) / ggml_type_size(gate_weights->type)),
|
| 1385 |
+
+ (uint32_t) (ggml_webgpu_tensor_misalignment(ctx, up_weights) / ggml_type_size(up_weights->type)),
|
| 1386 |
+
+ (uint32_t) (ggml_webgpu_tensor_misalignment(ctx, input) / ggml_type_size(input->type)),
|
| 1387 |
+
+ (uint32_t) (ggml_webgpu_tensor_misalignment(ctx, glu) / ggml_type_size(glu->type)),
|
| 1388 |
+
+ (uint32_t) glu->ne[0],
|
| 1389 |
+
+ (uint32_t) gate_weights->ne[0],
|
| 1390 |
+
+ (uint32_t) (gate_weights->nb[1] / ggml_type_size(gate_weights->type)),
|
| 1391 |
+
+ (uint32_t) (up_weights->nb[1] / ggml_type_size(up_weights->type)),
|
| 1392 |
+
+ };
|
| 1393 |
+
+ std::vector<wgpu::BindGroupEntry> entries = {
|
| 1394 |
+
+ ggml_webgpu_make_tensor_bind_group_entry(ctx, 0, gate_weights),
|
| 1395 |
+
+ ggml_webgpu_make_tensor_bind_group_entry(ctx, 1, up_weights),
|
| 1396 |
+
+ ggml_webgpu_make_tensor_bind_group_entry(ctx, 2, input),
|
| 1397 |
+
+ ggml_webgpu_make_tensor_bind_group_entry(ctx, 3, glu),
|
| 1398 |
+
+ };
|
| 1399 |
+
+
|
| 1400 |
+
+ uint32_t wg_x;
|
| 1401 |
+
+ uint32_t wg_y;
|
| 1402 |
+
+ compute_2d_workgroups(CEIL_DIV((uint32_t) glu->ne[0], decisions->outputs_per_wg),
|
| 1403 |
+
+ ctx->global_ctx->capabilities.limits.maxComputeWorkgroupsPerDimension, wg_x, wg_y);
|
| 1404 |
+
+ return ggml_backend_webgpu_build(ctx, pipeline, params, entries, wg_x, wg_y);
|
| 1405 |
+
+}
|
| 1406 |
+
+#endif
|
| 1407 |
+
+
|
| 1408 |
+
static webgpu_encoded_op ggml_webgpu_mul_mat_id_vec(webgpu_context & ctx,
|
| 1409 |
+
ggml_tensor * src0,
|
| 1410 |
+
ggml_tensor * src1,
|
| 1411 |
+
@@ -3094,6 +3445,23 @@ static std::optional<webgpu_encoded_op> ggml_webgpu_encode(webgpu_context ctx,
|
| 1412 |
+
case GGML_OP_GET_ROWS:
|
| 1413 |
+
return ggml_webgpu_get_rows(ctx, src0, src1, node);
|
| 1414 |
+
case GGML_OP_MUL_MAT:
|
| 1415 |
+
+#ifdef GGML_WEBGPU_Q1_DUAL_GLU_FUSION
|
| 1416 |
+
+ if (auto fusion = ggml_webgpu_try_q1_dual_glu_fusion(ctx, cgraph, node_idx)) {
|
| 1417 |
+
+ num_encoded_ops = 3;
|
| 1418 |
+
+ return ggml_webgpu_mul_mat_q1_dual_glu(ctx, *fusion);
|
| 1419 |
+
+ }
|
| 1420 |
+
+#endif
|
| 1421 |
+
+#ifdef GGML_WEBGPU_Q1_GLU_FUSION
|
| 1422 |
+
+ {
|
| 1423 |
+
+ bool computed_is_gate = false;
|
| 1424 |
+
+ if (ggml_webgpu_can_fuse_q1_glu(ctx, cgraph, node_idx, computed_is_gate)) {
|
| 1425 |
+
+ num_encoded_ops = 2;
|
| 1426 |
+
+ ggml_tensor * glu = nodes[node_idx + 1];
|
| 1427 |
+
+ ggml_tensor * other = computed_is_gate ? glu->src[1] : glu->src[0];
|
| 1428 |
+
+ return ggml_webgpu_mul_mat_q1_glu(ctx, node, other, computed_is_gate, glu);
|
| 1429 |
+
+ }
|
| 1430 |
+
+ }
|
| 1431 |
+
+#endif
|
| 1432 |
+
return ggml_webgpu_mul_mat(ctx, src0, src1, node);
|
| 1433 |
+
case GGML_OP_MUL_MAT_ID:
|
| 1434 |
+
return ggml_webgpu_mul_mat_id(ctx, src0, src1, src2, node);
|
| 1435 |
+
@@ -3148,6 +3516,13 @@ static std::optional<webgpu_encoded_op> ggml_webgpu_encode(webgpu_context ctx,
|
| 1436 |
+
return ggml_webgpu_ssm_scan(ctx, src0, src1, src2, node->src[3], node->src[4], node->src[5], node->src[6],
|
| 1437 |
+
node);
|
| 1438 |
+
case GGML_OP_GATED_DELTA_NET:
|
| 1439 |
+
+#ifdef GGML_WEBGPU_GDN_CACHE_FUSION
|
| 1440 |
+
+ if (auto fusion = ggml_webgpu_try_gdn_cache_fusion(ctx, cgraph, node_idx)) {
|
| 1441 |
+
+ num_encoded_ops = fusion->num_encoded_ops;
|
| 1442 |
+
+ return ggml_webgpu_gated_delta_net(ctx, src0, src1, src2, node->src[3], node->src[4], node->src[5],
|
| 1443 |
+
+ node, fusion->cache, fusion->slot_stride);
|
| 1444 |
+
+ }
|
| 1445 |
+
+#endif
|
| 1446 |
+
return ggml_webgpu_gated_delta_net(ctx, src0, src1, src2, node->src[3], node->src[4], node->src[5], node);
|
| 1447 |
+
case GGML_OP_PAD:
|
| 1448 |
+
return ggml_webgpu_pad(ctx, src0, node);
|
| 1449 |
+
@@ -3201,6 +3576,7 @@ static void ggml_backend_webgpu_collect_profile_results(webgpu_context &
|
| 1450 |
+
// WebGPU timestamps are in ns; convert to ms.
|
| 1451 |
+
const double elapsed_ms = double(ts_data[2 * i + 1] - ts_data[2 * i]) * 1e-6;
|
| 1452 |
+
ctx->shader_gpu_time_ms[pipeline_names[i]] += elapsed_ms;
|
| 1453 |
+
+ ctx->profile_graph_gpu_time_ms[pipeline_names[i]] += elapsed_ms;
|
| 1454 |
+
}
|
| 1455 |
+
|
| 1456 |
+
ctx->profile_timestamp_host_buf.Unmap();
|
| 1457 |
+
@@ -3244,9 +3620,19 @@ static ggml_status ggml_backend_webgpu_graph_compute(ggml_backend_t backend, str
|
| 1458 |
+
bool contains_set_rows = false;
|
| 1459 |
+
int num_encoded_ops = 1;
|
| 1460 |
+
int node_idx = 0;
|
| 1461 |
+
+#ifdef GGML_WEBGPU_TURBO_TRACE
|
| 1462 |
+
+ uint32_t num_param_uploads = 0;
|
| 1463 |
+
+ uint32_t num_total_kernels = 0;
|
| 1464 |
+
+ uint32_t num_submit_batches = 0;
|
| 1465 |
+
+#endif
|
| 1466 |
+
+
|
| 1467 |
+
+#ifdef GGML_WEBGPU_TURBO_TRACE
|
| 1468 |
+
+ const auto turbo_trace_started_at = std::chrono::steady_clock::now();
|
| 1469 |
+
+#endif
|
| 1470 |
+
|
| 1471 |
+
#ifdef GGML_WEBGPU_GPU_PROFILE
|
| 1472 |
+
ctx->profile_timestamp_query_count = 0;
|
| 1473 |
+
+ ctx->profile_graph_gpu_time_ms.clear();
|
| 1474 |
+
std::vector<std::string> profile_pipeline_names;
|
| 1475 |
+
#endif
|
| 1476 |
+
|
| 1477 |
+
@@ -3262,6 +3648,12 @@ static ggml_status ggml_backend_webgpu_graph_compute(ggml_backend_t backend, str
|
| 1478 |
+
if (auto cmd = ggml_webgpu_encode(ctx, cgraph, node_idx, num_encoded_ops)) {
|
| 1479 |
+
commands.push_back(*cmd);
|
| 1480 |
+
num_batched_kernels += cmd.value().num_kernels;
|
| 1481 |
+
+#ifdef GGML_WEBGPU_TURBO_TRACE
|
| 1482 |
+
+ num_total_kernels += cmd.value().num_kernels;
|
| 1483 |
+
+#ifndef GGML_WEBGPU_BATCH_PARAM_UPLOADS
|
| 1484 |
+
+ num_param_uploads += cmd.value().num_kernels;
|
| 1485 |
+
+#endif
|
| 1486 |
+
+#endif
|
| 1487 |
+
#ifdef GGML_WEBGPU_GPU_PROFILE
|
| 1488 |
+
profile_pipeline_names.insert(profile_pipeline_names.end(), cmd->pipeline_names.begin(),
|
| 1489 |
+
cmd->pipeline_names.end());
|
| 1490 |
+
@@ -3272,9 +3664,19 @@ static ggml_status ggml_backend_webgpu_graph_compute(ggml_backend_t backend, str
|
| 1491 |
+
if (ctx->active_compute_pass) {
|
| 1492 |
+
ctx->active_compute_pass.End();
|
| 1493 |
+
}
|
| 1494 |
+
+#ifdef GGML_WEBGPU_BATCH_PARAM_UPLOADS
|
| 1495 |
+
+ if (ctx->param_arena.flush(ctx->global_ctx->queue)) {
|
| 1496 |
+
+#ifdef GGML_WEBGPU_TURBO_TRACE
|
| 1497 |
+
+ num_param_uploads++;
|
| 1498 |
+
+#endif
|
| 1499 |
+
+ }
|
| 1500 |
+
+#endif
|
| 1501 |
+
num_batched_kernels = 0;
|
| 1502 |
+
wgpu::CommandBuffer batch_commands = ctx->active_command_encoder.Finish();
|
| 1503 |
+
ggml_backend_webgpu_submit_commands(ctx, batch_commands, num_inflight_batches);
|
| 1504 |
+
+#ifdef GGML_WEBGPU_TURBO_TRACE
|
| 1505 |
+
+ num_submit_batches++;
|
| 1506 |
+
+#endif
|
| 1507 |
+
|
| 1508 |
+
// reset state for next batch
|
| 1509 |
+
ctx->active_command_encoder = ctx->global_ctx->device.CreateCommandEncoder();
|
| 1510 |
+
@@ -3305,8 +3707,18 @@ static ggml_status ggml_backend_webgpu_graph_compute(ggml_backend_t backend, str
|
| 1511 |
+
}
|
| 1512 |
+
|
| 1513 |
+
if (num_batched_kernels > 0) {
|
| 1514 |
+
+#ifdef GGML_WEBGPU_BATCH_PARAM_UPLOADS
|
| 1515 |
+
+ if (ctx->param_arena.flush(ctx->global_ctx->queue)) {
|
| 1516 |
+
+#ifdef GGML_WEBGPU_TURBO_TRACE
|
| 1517 |
+
+ num_param_uploads++;
|
| 1518 |
+
+#endif
|
| 1519 |
+
+ }
|
| 1520 |
+
+#endif
|
| 1521 |
+
wgpu::CommandBuffer batch_commands = ctx->active_command_encoder.Finish();
|
| 1522 |
+
ggml_backend_webgpu_submit_commands(ctx, batch_commands, num_inflight_batches);
|
| 1523 |
+
+#ifdef GGML_WEBGPU_TURBO_TRACE
|
| 1524 |
+
+ num_submit_batches++;
|
| 1525 |
+
+#endif
|
| 1526 |
+
ctx->param_arena.reset();
|
| 1527 |
+
commands.clear();
|
| 1528 |
+
}
|
| 1529 |
+
@@ -3314,6 +3726,27 @@ static ggml_status ggml_backend_webgpu_graph_compute(ggml_backend_t backend, str
|
| 1530 |
+
|
| 1531 |
+
#ifdef GGML_WEBGPU_GPU_PROFILE
|
| 1532 |
+
ggml_backend_webgpu_collect_profile_results(ctx, profile_pipeline_names, num_inflight_batches);
|
| 1533 |
+
+
|
| 1534 |
+
+ const uint64_t profile_graph_count = ++ctx->profile_graph_count;
|
| 1535 |
+
+ double profile_graph_total_ms = 0.0;
|
| 1536 |
+
+ std::vector<std::pair<std::string, double>> profile_graph_pipelines;
|
| 1537 |
+
+ profile_graph_pipelines.reserve(ctx->profile_graph_gpu_time_ms.size());
|
| 1538 |
+
+ for (const auto & kv : ctx->profile_graph_gpu_time_ms) {
|
| 1539 |
+
+ profile_graph_total_ms += kv.second;
|
| 1540 |
+
+ profile_graph_pipelines.push_back(kv);
|
| 1541 |
+
+ }
|
| 1542 |
+
+ std::sort(profile_graph_pipelines.begin(), profile_graph_pipelines.end(),
|
| 1543 |
+
+ [](const auto & lhs, const auto & rhs) { return lhs.second > rhs.second; });
|
| 1544 |
+
+ std::cout << "@@WEBGPU_TRACE@@gpu_profile graph=" << profile_graph_count << " total_ms=" << std::fixed
|
| 1545 |
+
+ << std::setprecision(3) << profile_graph_total_ms << " top=";
|
| 1546 |
+
+ const size_t profile_top_count = std::min<size_t>(16, profile_graph_pipelines.size());
|
| 1547 |
+
+ for (size_t i = 0; i < profile_top_count; ++i) {
|
| 1548 |
+
+ if (i > 0) {
|
| 1549 |
+
+ std::cout << ",";
|
| 1550 |
+
+ }
|
| 1551 |
+
+ std::cout << profile_graph_pipelines[i].first << ":" << profile_graph_pipelines[i].second;
|
| 1552 |
+
+ }
|
| 1553 |
+
+ std::cout << std::endl;
|
| 1554 |
+
#endif
|
| 1555 |
+
|
| 1556 |
+
if (contains_set_rows) {
|
| 1557 |
+
@@ -3321,6 +3754,20 @@ static ggml_status ggml_backend_webgpu_graph_compute(ggml_backend_t backend, str
|
| 1558 |
+
}
|
| 1559 |
+
|
| 1560 |
+
WEBGPU_CPU_PROFILE_TOTAL_END(graph_compute, ctx->global_ctx);
|
| 1561 |
+
+
|
| 1562 |
+
+#ifdef GGML_WEBGPU_TURBO_TRACE
|
| 1563 |
+
+ const uint64_t graph_count = ++ctx->turbo_trace_graph_count;
|
| 1564 |
+
+ if (graph_count <= 16 || (graph_count & (graph_count - 1)) == 0) {
|
| 1565 |
+
+ const auto elapsed_us = std::chrono::duration_cast<std::chrono::microseconds>(
|
| 1566 |
+
+ std::chrono::steady_clock::now() - turbo_trace_started_at)
|
| 1567 |
+
+ .count();
|
| 1568 |
+
+ std::cout << "@@WEBGPU_TRACE@@turbo_graph graph=" << graph_count << " nodes=" << cgraph->n_nodes
|
| 1569 |
+
+ << " kernels=" << num_total_kernels << " submissions=" << num_submit_batches
|
| 1570 |
+
+ << " parameter_uploads=" << num_param_uploads
|
| 1571 |
+
+ << " batch_size=" << ctx->global_ctx->command_submit_batch_size << " encode_us=" << elapsed_us
|
| 1572 |
+
+ << std::endl;
|
| 1573 |
+
+ }
|
| 1574 |
+
+#endif
|
| 1575 |
+
return GGML_STATUS_SUCCESS;
|
| 1576 |
+
}
|
| 1577 |
+
|
| 1578 |
+
@@ -3376,6 +3823,44 @@ static void ggml_backend_webgpu_event_wait(ggml_backend_t backend, ggml_backend_
|
| 1579 |
+
ggml_backend_webgpu_device_event_synchronize(nullptr, event);
|
| 1580 |
+
}
|
| 1581 |
+
|
| 1582 |
+
+#ifdef GGML_WEBGPU_Q1_ROW_RETILE
|
| 1583 |
+
+static const void * ggml_webgpu_prepare_q1_row_retiled_data(const ggml_tensor * tensor,
|
| 1584 |
+
+ const void * data,
|
| 1585 |
+
+ size_t offset,
|
| 1586 |
+
+ size_t size,
|
| 1587 |
+
+ std::vector<uint8_t> & retiled) {
|
| 1588 |
+
+ if (tensor->type != GGML_TYPE_Q1_0) {
|
| 1589 |
+
+ return data;
|
| 1590 |
+
+ }
|
| 1591 |
+
+ if (offset != 0 || size != ggml_nbytes(tensor) || !ggml_is_contiguous(tensor)) {
|
| 1592 |
+
+ GGML_ABORT("ggml_webgpu: Q1_0 row retiling requires a full contiguous tensor upload\n");
|
| 1593 |
+
+ }
|
| 1594 |
+
+
|
| 1595 |
+
+ const size_t blocks_per_row = tensor->ne[0] / 128;
|
| 1596 |
+
+ const size_t row_bytes = blocks_per_row * 18;
|
| 1597 |
+
+ const size_t rows = ggml_nrows(tensor);
|
| 1598 |
+
+ GGML_ASSERT(tensor->ne[0] % 128 == 0);
|
| 1599 |
+
+ GGML_ASSERT(blocks_per_row % 2 == 0);
|
| 1600 |
+
+ GGML_ASSERT(size == rows * row_bytes);
|
| 1601 |
+
+
|
| 1602 |
+
+ const uint8_t * src = static_cast<const uint8_t *>(data);
|
| 1603 |
+
+ retiled.resize(size);
|
| 1604 |
+
+ for (size_t row = 0; row < rows; ++row) {
|
| 1605 |
+
+ const uint8_t * src_row = src + row * row_bytes;
|
| 1606 |
+
+ uint8_t * dst_row = retiled.data() + row * row_bytes;
|
| 1607 |
+
+ for (size_t block_pair = 0; block_pair < blocks_per_row / 2; ++block_pair) {
|
| 1608 |
+
+ const uint8_t * src_pair = src_row + block_pair * 36;
|
| 1609 |
+
+ uint8_t * dst_pair = dst_row + block_pair * 36;
|
| 1610 |
+
+ memcpy(dst_pair, src_pair + 2, 16);
|
| 1611 |
+
+ memcpy(dst_pair + 16, src_pair + 20, 16);
|
| 1612 |
+
+ memcpy(dst_pair + 32, src_pair, 2);
|
| 1613 |
+
+ memcpy(dst_pair + 34, src_pair + 18, 2);
|
| 1614 |
+
+ }
|
| 1615 |
+
+ }
|
| 1616 |
+
+ return retiled.data();
|
| 1617 |
+
+}
|
| 1618 |
+
+#endif
|
| 1619 |
+
+
|
| 1620 |
+
static void ggml_backend_webgpu_set_tensor_async(ggml_backend_t backend,
|
| 1621 |
+
ggml_tensor * tensor,
|
| 1622 |
+
const void * data,
|
| 1623 |
+
@@ -3385,6 +3870,11 @@ static void ggml_backend_webgpu_set_tensor_async(ggml_backend_t backend,
|
| 1624 |
+
auto * buf_ctx = (ggml_backend_webgpu_buffer_context *) tensor->buffer->context;
|
| 1625 |
+
size_t total_offset = ggml_webgpu_tensor_offset(tensor) + offset;
|
| 1626 |
+
|
| 1627 |
+
+#ifdef GGML_WEBGPU_Q1_ROW_RETILE
|
| 1628 |
+
+ std::vector<uint8_t> retiled;
|
| 1629 |
+
+ data = ggml_webgpu_prepare_q1_row_retiled_data(tensor, data, offset, size, retiled);
|
| 1630 |
+
+#endif
|
| 1631 |
+
+
|
| 1632 |
+
// Write aligned portion
|
| 1633 |
+
buf_ctx->global_ctx->queue.WriteBuffer(buf_ctx->buffer, total_offset, data, (size / 4) * 4);
|
| 1634 |
+
|
| 1635 |
+
@@ -3486,6 +3976,11 @@ static void ggml_backend_webgpu_buffer_set_tensor(ggml_backend_buffer_t buffer,
|
| 1636 |
+
|
| 1637 |
+
size_t total_offset = ggml_webgpu_tensor_offset(tensor) + offset;
|
| 1638 |
+
|
| 1639 |
+
+#ifdef GGML_WEBGPU_Q1_ROW_RETILE
|
| 1640 |
+
+ std::vector<uint8_t> retiled;
|
| 1641 |
+
+ data = ggml_webgpu_prepare_q1_row_retiled_data(tensor, data, offset, size, retiled);
|
| 1642 |
+
+#endif
|
| 1643 |
+
+
|
| 1644 |
+
buf_ctx->global_ctx->queue.WriteBuffer(buf_ctx->buffer, total_offset, data, (size / 4) * 4);
|
| 1645 |
+
|
| 1646 |
+
if (size % 4 != 0) {
|
| 1647 |
+
diff --git a/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/common_decls.tmpl b/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/common_decls.tmpl
|
| 1648 |
+
index 6634fbd..97227b0 100644
|
| 1649 |
+
--- a/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/common_decls.tmpl
|
| 1650 |
+
+++ b/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/common_decls.tmpl
|
| 1651 |
+
@@ -25,6 +25,10 @@ fn load_u32_at_src(byte_offset: u32) -> u32 {
|
| 1652 |
+
return select(shifted, lo, shift == 0u);
|
| 1653 |
+
}
|
| 1654 |
+
|
| 1655 |
+
+fn load_u32_at_src_aligned(byte_offset: u32) -> u32 {
|
| 1656 |
+
+ return src[byte_offset / 4u];
|
| 1657 |
+
+}
|
| 1658 |
+
+
|
| 1659 |
+
fn load_f16_at_src(byte_offset: u32) -> f16 {
|
| 1660 |
+
let packed = unpack2x16float(load_u16_at_src(byte_offset));
|
| 1661 |
+
return f16(packed[0]);
|
| 1662 |
+
diff --git a/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/gated_delta_net.wgsl b/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/gated_delta_net.wgsl
|
| 1663 |
+
index 7d7b347..d3a04d5 100644
|
| 1664 |
+
--- a/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/gated_delta_net.wgsl
|
| 1665 |
+
+++ b/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/gated_delta_net.wgsl
|
| 1666 |
+
@@ -19,6 +19,11 @@ var<storage, read_write> src_state: array<f32>;
|
| 1667 |
+
@group(0) @binding(6)
|
| 1668 |
+
var<storage, read_write> dst: array<f32>;
|
| 1669 |
+
|
| 1670 |
+
+#ifdef FUSED_CACHE
|
| 1671 |
+
+@group(0) @binding(7)
|
| 1672 |
+
+var<storage, read_write> state_cache: array<f32>;
|
| 1673 |
+
+#endif
|
| 1674 |
+
+
|
| 1675 |
+
struct Params {
|
| 1676 |
+
h: u32,
|
| 1677 |
+
n_tokens: u32,
|
| 1678 |
+
@@ -41,9 +46,15 @@ struct Params {
|
| 1679 |
+
rq3: u32,
|
| 1680 |
+
K: u32,
|
| 1681 |
+
scale: f32,
|
| 1682 |
+
+ cache_offset: u32,
|
| 1683 |
+
+ cache_slot_stride: u32,
|
| 1684 |
+
};
|
| 1685 |
+
|
| 1686 |
+
+#ifdef FUSED_CACHE
|
| 1687 |
+
+@group(0) @binding(8)
|
| 1688 |
+
+#else
|
| 1689 |
+
@group(0) @binding(7)
|
| 1690 |
+
+#endif
|
| 1691 |
+
var<uniform> params: Params;
|
| 1692 |
+
|
| 1693 |
+
var<workgroup> sh_k: array<f32, S_V>;
|
| 1694 |
+
@@ -131,9 +142,17 @@ fn main(
|
| 1695 |
+
// snapshot slot mapping: slot 0 = most recent state, slot s = s tokens back.
|
| 1696 |
+
let target_slot = i32(params.n_tokens) - 1 - i32(t);
|
| 1697 |
+
if (target_slot >= 0 && target_slot < i32(params.K)) {
|
| 1698 |
+
+ #ifdef FUSED_CACHE
|
| 1699 |
+
+ let slot_base = params.cache_offset + u32(target_slot) * params.cache_slot_stride + state_out_base;
|
| 1700 |
+
+ #else
|
| 1701 |
+
let slot_base = params.s_off + u32(target_slot) * state_size_per_snap + state_out_base;
|
| 1702 |
+
+ #endif
|
| 1703 |
+
for (var i = 0u; i < S_V; i++) {
|
| 1704 |
+
+ #ifdef FUSED_CACHE
|
| 1705 |
+
+ state_cache[slot_base + col * S_V + i] = state[i];
|
| 1706 |
+
+ #else
|
| 1707 |
+
dst[slot_base + col * S_V + i] = state[i];
|
| 1708 |
+
+ #endif
|
| 1709 |
+
}
|
| 1710 |
+
}
|
| 1711 |
+
}
|
| 1712 |
+
@@ -143,7 +162,11 @@ fn main(
|
| 1713 |
+
|
| 1714 |
+
if (params.K == 1u) {
|
| 1715 |
+
for (var i = 0u; i < S_V; i++) {
|
| 1716 |
+
+ #ifdef FUSED_CACHE
|
| 1717 |
+
+ state_cache[params.cache_offset + state_out_base + col * S_V + i] = state[i];
|
| 1718 |
+
+ #else
|
| 1719 |
+
dst[params.s_off + state_out_base + col * S_V + i] = state[i];
|
| 1720 |
+
+ #endif
|
| 1721 |
+
}
|
| 1722 |
+
}
|
| 1723 |
+
}
|
| 1724 |
+
diff --git a/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/get_rows.wgsl b/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/get_rows.wgsl
|
| 1725 |
+
index 487edb3..e671b03 100644
|
| 1726 |
+
--- a/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/get_rows.wgsl
|
| 1727 |
+
+++ b/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/get_rows.wgsl
|
| 1728 |
+
@@ -29,10 +29,23 @@ fn copy_elements(src_base: u32, dst_base: u32, offset: u32) {
|
| 1729 |
+
|
| 1730 |
+
#ifdef Q1_0
|
| 1731 |
+
fn copy_elements(src_base: u32, dst_base: u32, offset: u32) {
|
| 1732 |
+
+#ifdef Q1_ROW_RETILED
|
| 1733 |
+
+ let row_byte_base = src_base * 18u;
|
| 1734 |
+
+ let block_in_pair = offset & 1u;
|
| 1735 |
+
+ let pair_byte_base = row_byte_base + (offset / 2u) * 36u;
|
| 1736 |
+
+ let d = load_f16_as_f32_at_src(pair_byte_base + 32u + block_in_pair * 2u);
|
| 1737 |
+
+#else
|
| 1738 |
+
let block_byte_base = (src_base + offset) * 18;
|
| 1739 |
+
let d = load_f16_as_f32_at_src(block_byte_base);
|
| 1740 |
+
+#endif
|
| 1741 |
+
for (var j: u32 = 0u; j < 4u; j++) {
|
| 1742 |
+
+#ifdef Q1_ROW_RETILED
|
| 1743 |
+
+ let q_packed = load_u32_at_src_aligned(
|
| 1744 |
+
+ pair_byte_base + block_in_pair * 16u + j * 4u
|
| 1745 |
+
+ );
|
| 1746 |
+
+#else
|
| 1747 |
+
let q_packed = load_u32_at_src(block_byte_base + 2u + j * 4u);
|
| 1748 |
+
+#endif
|
| 1749 |
+
let dst_base128 = dst_base + offset * 128u + j * 32u;
|
| 1750 |
+
for (var k: u32 = 0; k < 4u; k++) {
|
| 1751 |
+
let q_byte = get_byte(q_packed, k);
|
| 1752 |
+
diff --git a/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_decls.tmpl b/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_decls.tmpl
|
| 1753 |
+
index 13996ab..9329fd3 100644
|
| 1754 |
+
--- a/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_decls.tmpl
|
| 1755 |
+
+++ b/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_decls.tmpl
|
| 1756 |
+
@@ -84,9 +84,19 @@ fn init_shmem_src0(thread_id: u32, batch_offset: u32, offset_m: u32, k_outer: u3
|
| 1757 |
+
let block_k = global_k_start / BLOCK_SIZE;
|
| 1758 |
+
let byte_in_block = (global_k_start % BLOCK_SIZE) / 8u;
|
| 1759 |
+
let src0_idx = batch_offset + global_m * params.stride_01 + block_k;
|
| 1760 |
+
+#ifdef Q1_ROW_RETILED
|
| 1761 |
+
+ let row_byte_base = (batch_offset + global_m * params.stride_01) * BLOCK_SIZE_BYTES;
|
| 1762 |
+
+ let block_in_pair = block_k & 1u;
|
| 1763 |
+
+ let pair_byte_base = row_byte_base + (block_k / 2u) * 36u;
|
| 1764 |
+
+ let d = load_f16_at_src0(pair_byte_base + 32u + block_in_pair * 2u);
|
| 1765 |
+
+ let q_byte_offset = block_in_pair * 16u + byte_in_block;
|
| 1766 |
+
+ let q_word = load_u32_at_src0_aligned(pair_byte_base + q_byte_offset);
|
| 1767 |
+
+ let q_byte = (q_word >> ((q_byte_offset & 3u) * 8u)) & 0xFFu;
|
| 1768 |
+
+#else
|
| 1769 |
+
let block_byte_base = src0_idx * BLOCK_SIZE_BYTES;
|
| 1770 |
+
let d = load_f16_at_src0(block_byte_base);
|
| 1771 |
+
let q_byte = load_u32_at_src0(block_byte_base + 2u + byte_in_block) & 0xFFu;
|
| 1772 |
+
+#endif
|
| 1773 |
+
|
| 1774 |
+
for (var bit = 0u; bit < NQ; bit++) {
|
| 1775 |
+
let global_k = global_k_start + bit;
|
| 1776 |
+
diff --git a/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec.wgsl b/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec.wgsl
|
| 1777 |
+
index ebdf095..c989c8c 100644
|
| 1778 |
+
--- a/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec.wgsl
|
| 1779 |
+
+++ b/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec.wgsl
|
| 1780 |
+
@@ -101,6 +101,14 @@ fn main(
|
| 1781 |
+
for (var col = 0u;col < NUM_COLS;col += 1) {
|
| 1782 |
+
|
| 1783 |
+
#ifdef USE_SUBGROUP_REDUCTION
|
| 1784 |
+
+#ifdef USE_SINGLE_SUBGROUP_REDUCTION
|
| 1785 |
+
+ for (var row = 0u; row < OUTPUTS_PER_WG; row++) {
|
| 1786 |
+
+ let row_total = subgroupAdd(acc[col][row]);
|
| 1787 |
+
+ if (subgroup_invocation_id == 0u && row_base + row < params.m) {
|
| 1788 |
+
+ dst[dst_idx_base + col * params.m + row] = row_total;
|
| 1789 |
+
+ }
|
| 1790 |
+
+ }
|
| 1791 |
+
+#else
|
| 1792 |
+
for (var row = 0u; row < OUTPUTS_PER_WG; row++) {
|
| 1793 |
+
let subgroup_total = subgroupAdd(acc[col][row]);
|
| 1794 |
+
if (subgroup_invocation_id == 0u) {
|
| 1795 |
+
@@ -122,6 +130,7 @@ fn main(
|
| 1796 |
+
}
|
| 1797 |
+
}
|
| 1798 |
+
#endif
|
| 1799 |
+
+#endif
|
| 1800 |
+
|
| 1801 |
+
#ifdef USE_WORKGROUP_REDUCTION
|
| 1802 |
+
for (var row = 0u; row < OUTPUTS_PER_WG; row++) {
|
| 1803 |
+
@@ -151,7 +160,9 @@ fn main(
|
| 1804 |
+
}
|
| 1805 |
+
#endif
|
| 1806 |
+
|
| 1807 |
+
- workgroupBarrier();
|
| 1808 |
+
+#ifndef USE_SINGLE_SUBGROUP_REDUCTION
|
| 1809 |
+
+ workgroupBarrier();
|
| 1810 |
+
+#endif
|
| 1811 |
+
|
| 1812 |
+
}
|
| 1813 |
+
}
|
| 1814 |
diff --git a/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_acc.tmpl b/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_acc.tmpl
|
| 1815 |
+
index 8fd0d19..3bf03a9 100644
|
| 1816 |
--- a/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_acc.tmpl
|
| 1817 |
+++ b/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_acc.tmpl
|
| 1818 |
+
@@ -61,6 +61,68 @@ fn accumulate_vec_dot(thread_id: u32, row_base: u32, src0_batch_offset: u32, src
|
| 1819 |
}
|
| 1820 |
#endif
|
| 1821 |
|
|
|
|
| 1853 |
+ for (var row = 0u; row < OUTPUTS_PER_WG; row += 1u) {
|
| 1854 |
+ let output_row = row_base + row;
|
| 1855 |
+ if (output_row < params.m) {
|
| 1856 |
+
+#ifdef Q1_ROW_RETILED
|
| 1857 |
+
+ let row_byte_base = (src0_batch_offset + output_row * params.stride_01) * BLOCK_SIZE_BYTES;
|
| 1858 |
+
+ let block_in_pair = block & 1u;
|
| 1859 |
+
+ let pair_byte_base = row_byte_base + (block / 2u) * 36u;
|
| 1860 |
+
+ let d = f32(load_f16_at_src0(pair_byte_base + 32u + block_in_pair * 2u));
|
| 1861 |
+
+ let q_word = load_u32_at_src0_aligned(
|
| 1862 |
+
+ pair_byte_base + block_in_pair * 16u + thread_within_block * 4u
|
| 1863 |
+
+ );
|
| 1864 |
+
+#else
|
| 1865 |
+ let block_byte_base = (src0_batch_offset + output_row * params.stride_01 + block) * BLOCK_SIZE_BYTES;
|
| 1866 |
+ let d = f32(load_f16_at_src0(block_byte_base));
|
| 1867 |
+ let q_word = load_u32_at_src0(block_byte_base + 2u + thread_within_block * 4u);
|
| 1868 |
+
+#endif
|
| 1869 |
+ for (var col = 0u; col < NUM_COLS; col += 1u) {
|
| 1870 |
+ var row_sum = 0.0;
|
| 1871 |
+ for (var i = 0u; i < VECS_PER_THREAD; i += 1u) {
|
|
|
|
| 1884 |
#ifdef MUL_ACC_Q1_0
|
| 1885 |
#define BLOCK_SIZE 128
|
| 1886 |
#define BLOCK_SIZE_BYTES 18
|
| 1887 |
+
@@ -82,9 +144,19 @@ fn accumulate_vec_dot(thread_id: u32, row_base: u32, src0_batch_offset: u32, src
|
| 1888 |
+
for (var row = 0u; row < OUTPUTS_PER_WG; row++) {
|
| 1889 |
+
let output_row = row_base + row;
|
| 1890 |
+
if (output_row < params.m) {
|
| 1891 |
+
+#ifdef Q1_ROW_RETILED
|
| 1892 |
+
+ let row_byte_base = (src0_batch_offset + output_row * params.stride_01) * BLOCK_SIZE_BYTES;
|
| 1893 |
+
+ let block_in_pair = block & 1u;
|
| 1894 |
+
+ let pair_byte_base = row_byte_base + (block / 2u) * 36u;
|
| 1895 |
+
+ let d = f32(load_f16_at_src0(pair_byte_base + 32u + block_in_pair * 2u));
|
| 1896 |
+
+ let q_byte_offset = block_in_pair * 16u + thread_within_block;
|
| 1897 |
+
+ let q_word = load_u32_at_src0_aligned(pair_byte_base + q_byte_offset);
|
| 1898 |
+
+ let q_byte = (q_word >> ((q_byte_offset & 3u) * 8u)) & 0xFFu;
|
| 1899 |
+
+#else
|
| 1900 |
+
let block_byte_base = (src0_batch_offset + output_row * params.stride_01 + block) * BLOCK_SIZE_BYTES;
|
| 1901 |
+
let d = f32(load_f16_at_src0(block_byte_base));
|
| 1902 |
+
let q_byte = load_u32_at_src0(block_byte_base + 2u + thread_within_block) & 0xFFu;
|
| 1903 |
+
+#endif
|
| 1904 |
+
for (var col = 0u;col < NUM_COLS;col += 1) {
|
| 1905 |
+
var row_sum = 0.0;
|
| 1906 |
+
for (var bit = 0u; bit < 8u; bit++) {
|
| 1907 |
+
diff --git a/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_q1_glu.wgsl b/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_q1_glu.wgsl
|
| 1908 |
+
new file mode 100644
|
| 1909 |
+
index 0000000..9d86a26
|
| 1910 |
+
--- /dev/null
|
| 1911 |
+
+++ b/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_q1_glu.wgsl
|
| 1912 |
+
@@ -0,0 +1,141 @@
|
| 1913 |
+
+enable subgroups;
|
| 1914 |
+
+
|
| 1915 |
+
+struct Params {
|
| 1916 |
+
+ offset_weights: u32,
|
| 1917 |
+
+ offset_input: u32,
|
| 1918 |
+
+ offset_other: u32,
|
| 1919 |
+
+ offset_dst: u32,
|
| 1920 |
+
+ m: u32,
|
| 1921 |
+
+ k: u32,
|
| 1922 |
+
+ stride_weights_01: u32,
|
| 1923 |
+
+ computed_is_gate: u32,
|
| 1924 |
+
+};
|
| 1925 |
+
+
|
| 1926 |
+
+@group(0) @binding(0) var<storage, read_write> weights: array<u32>;
|
| 1927 |
+
+@group(0) @binding(1) var<storage, read_write> input: array<f32>;
|
| 1928 |
+
+@group(0) @binding(2) var<storage, read_write> other: array<f32>;
|
| 1929 |
+
+@group(0) @binding(3) var<storage, read_write> dst: array<f32>;
|
| 1930 |
+
+@group(0) @binding(4) var<uniform> params: Params;
|
| 1931 |
+
+
|
| 1932 |
+
+var<workgroup> partial_sums: array<f32, OUTPUTS_PER_WG * WG_SIZE>;
|
| 1933 |
+
+
|
| 1934 |
+
+fn partial_index(row: u32, subgroup: u32) -> u32 {
|
| 1935 |
+
+ return row * WG_SIZE + subgroup;
|
| 1936 |
+
+}
|
| 1937 |
+
+
|
| 1938 |
+
+fn load_u16_weights(byte_offset: u32) -> u32 {
|
| 1939 |
+
+ let word = weights[byte_offset / 4u];
|
| 1940 |
+
+ let shift = (byte_offset & 0x2u) * 8u;
|
| 1941 |
+
+ return (word >> shift) & 0xFFFFu;
|
| 1942 |
+
+}
|
| 1943 |
+
+
|
| 1944 |
+
+fn load_u32_weights(byte_offset: u32) -> u32 {
|
| 1945 |
+
+ let word_idx = byte_offset / 4u;
|
| 1946 |
+
+ let shift = (byte_offset & 0x3u) * 8u;
|
| 1947 |
+
+ let lo = weights[word_idx];
|
| 1948 |
+
+ let hi = weights[word_idx + 1u];
|
| 1949 |
+
+ return select((lo >> shift) | (hi << (32u - shift)), lo, shift == 0u);
|
| 1950 |
+
+}
|
| 1951 |
+
+
|
| 1952 |
+
+fn load_f16_weights(byte_offset: u32) -> f32 {
|
| 1953 |
+
+ return unpack2x16float(load_u16_weights(byte_offset))[0];
|
| 1954 |
+
+}
|
| 1955 |
+
+
|
| 1956 |
+
+fn q1_signs4(word: u32, shift: u32) -> vec4<f32> {
|
| 1957 |
+
+ let bit_offsets = vec4<u32>(shift, shift + 1u, shift + 2u, shift + 3u);
|
| 1958 |
+
+ let bits = (vec4<u32>(word) >> bit_offsets) & vec4<u32>(1u);
|
| 1959 |
+
+ return select(vec4<f32>(-1.0), vec4<f32>(1.0), bits == vec4<u32>(1u));
|
| 1960 |
+
+}
|
| 1961 |
+
+
|
| 1962 |
+
+fn swiglu(gate: f32, up: f32) -> f32 {
|
| 1963 |
+
+ return gate / (1.0 + exp(-gate)) * up;
|
| 1964 |
+
+}
|
| 1965 |
+
+
|
| 1966 |
+
+@compute @workgroup_size(WG_SIZE)
|
| 1967 |
+
+fn main(
|
| 1968 |
+
+ @builtin(local_invocation_id) local_id: vec3<u32>,
|
| 1969 |
+
+ @builtin(workgroup_id) wg_id: vec3<u32>,
|
| 1970 |
+
+ @builtin(subgroup_id) subgroup_id: u32,
|
| 1971 |
+
+ @builtin(subgroup_invocation_id) subgroup_invocation_id: u32,
|
| 1972 |
+
+ @builtin(num_subgroups) num_subgroups: u32,
|
| 1973 |
+
+ @builtin(subgroup_size) subgroup_size: u32,
|
| 1974 |
+
+) {
|
| 1975 |
+
+ const BLOCK_SIZE: u32 = 128u;
|
| 1976 |
+
+ const BLOCK_SIZE_BYTES: u32 = 18u;
|
| 1977 |
+
+ const THREADS_PER_BLOCK: u32 = 4u;
|
| 1978 |
+
+ const VECS_PER_THREAD: u32 = 8u;
|
| 1979 |
+
+
|
| 1980 |
+
+ let thread_id = local_id.x;
|
| 1981 |
+
+ let row_base = wg_id.x * OUTPUTS_PER_WG;
|
| 1982 |
+
+ let num_blocks = params.k / BLOCK_SIZE;
|
| 1983 |
+
+ let thread_within_block = thread_id % THREADS_PER_BLOCK;
|
| 1984 |
+
+ var acc: array<f32, OUTPUTS_PER_WG>;
|
| 1985 |
+
+
|
| 1986 |
+
+ for (
|
| 1987 |
+
+ var block = thread_id / THREADS_PER_BLOCK;
|
| 1988 |
+
+ block < num_blocks;
|
| 1989 |
+
+ block += WG_SIZE / THREADS_PER_BLOCK
|
| 1990 |
+
+ ) {
|
| 1991 |
+
+ let x_base = params.offset_input + block * BLOCK_SIZE + thread_within_block * 32u;
|
| 1992 |
+
+ var x_block: array<vec4<f32>, VECS_PER_THREAD>;
|
| 1993 |
+
+ for (var i = 0u; i < VECS_PER_THREAD; i += 1u) {
|
| 1994 |
+
+ let x = x_base + i * 4u;
|
| 1995 |
+
+ x_block[i] = vec4<f32>(input[x], input[x + 1u], input[x + 2u], input[x + 3u]);
|
| 1996 |
+
+ }
|
| 1997 |
+
+
|
| 1998 |
+
+ for (var row = 0u; row < OUTPUTS_PER_WG; row += 1u) {
|
| 1999 |
+
+ let output_row = row_base + row;
|
| 2000 |
+
+ if (output_row < params.m) {
|
| 2001 |
+
+#ifdef Q1_ROW_RETILED
|
| 2002 |
+
+ let row_byte_base =
|
| 2003 |
+
+ (params.offset_weights + output_row * params.stride_weights_01) * BLOCK_SIZE_BYTES;
|
| 2004 |
+
+ let block_in_pair = block & 1u;
|
| 2005 |
+
+ let pair_byte_base = row_byte_base + (block / 2u) * 36u;
|
| 2006 |
+
+ let d = load_f16_weights(pair_byte_base + 32u + block_in_pair * 2u);
|
| 2007 |
+
+ let q = load_u32_weights(
|
| 2008 |
+
+ pair_byte_base + block_in_pair * 16u + thread_within_block * 4u
|
| 2009 |
+
+ );
|
| 2010 |
+
+#else
|
| 2011 |
+
+ let block_byte_base =
|
| 2012 |
+
+ (params.offset_weights + output_row * params.stride_weights_01 + block) * BLOCK_SIZE_BYTES;
|
| 2013 |
+
+ let d = load_f16_weights(block_byte_base);
|
| 2014 |
+
+ let q = load_u32_weights(block_byte_base + 2u + thread_within_block * 4u);
|
| 2015 |
+
+#endif
|
| 2016 |
+
+ var row_sum = 0.0;
|
| 2017 |
+
+ for (var i = 0u; i < VECS_PER_THREAD; i += 1u) {
|
| 2018 |
+
+ row_sum += d * dot(x_block[i], q1_signs4(q, i * 4u));
|
| 2019 |
+
+ }
|
| 2020 |
+
+ acc[row] += row_sum;
|
| 2021 |
+
+ }
|
| 2022 |
+
+ }
|
| 2023 |
+
+ }
|
| 2024 |
+
+
|
| 2025 |
+
+ for (var row = 0u; row < OUTPUTS_PER_WG; row += 1u) {
|
| 2026 |
+
+ let subgroup_total = subgroupAdd(acc[row]);
|
| 2027 |
+
+ if (subgroup_invocation_id == 0u) {
|
| 2028 |
+
+ partial_sums[partial_index(row, subgroup_id)] = subgroup_total;
|
| 2029 |
+
+ }
|
| 2030 |
+
+ }
|
| 2031 |
+
+
|
| 2032 |
+
+ workgroupBarrier();
|
| 2033 |
+
+
|
| 2034 |
+
+ for (
|
| 2035 |
+
+ var row = subgroup_id;
|
| 2036 |
+
+ row < OUTPUTS_PER_WG && row_base + row < params.m;
|
| 2037 |
+
+ row += num_subgroups
|
| 2038 |
+
+ ) {
|
| 2039 |
+
+ var row_acc = 0.0;
|
| 2040 |
+
+ for (var subgroup = subgroup_invocation_id; subgroup < num_subgroups; subgroup += subgroup_size) {
|
| 2041 |
+
+ row_acc += partial_sums[partial_index(row, subgroup)];
|
| 2042 |
+
+ }
|
| 2043 |
+
+ let computed = subgroupAdd(row_acc);
|
| 2044 |
+
+ if (subgroup_invocation_id == 0u) {
|
| 2045 |
+
+ let index = row_base + row;
|
| 2046 |
+
+ let other_value = other[params.offset_other + index];
|
| 2047 |
+
+ let computed_is_gate = params.computed_is_gate != 0u;
|
| 2048 |
+
+ let gate = select(other_value, computed, computed_is_gate);
|
| 2049 |
+
+ let up = select(computed, other_value, computed_is_gate);
|
| 2050 |
+
+ dst[params.offset_dst + index] = swiglu(gate, up);
|
| 2051 |
+
+ }
|
| 2052 |
+
+ }
|
| 2053 |
+
+}
|
| 2054 |
+
diff --git a/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_q1_dual_glu.wgsl b/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_q1_dual_glu.wgsl
|
| 2055 |
+
new file mode 100644
|
| 2056 |
+
index 0000000..0ae71e8
|
| 2057 |
+
--- /dev/null
|
| 2058 |
+
+++ b/llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_q1_dual_glu.wgsl
|
| 2059 |
+
@@ -0,0 +1,151 @@
|
| 2060 |
+
+enable subgroups;
|
| 2061 |
+
+
|
| 2062 |
+
+struct Params {
|
| 2063 |
+
+ offset_gate_weights: u32,
|
| 2064 |
+
+ offset_up_weights: u32,
|
| 2065 |
+
+ offset_input: u32,
|
| 2066 |
+
+ offset_dst: u32,
|
| 2067 |
+
+ m: u32,
|
| 2068 |
+
+ k: u32,
|
| 2069 |
+
+ stride_gate_weights_01: u32,
|
| 2070 |
+
+ stride_up_weights_01: u32,
|
| 2071 |
+
+};
|
| 2072 |
+
+
|
| 2073 |
+
+@group(0) @binding(0) var<storage, read_write> gate_weights: array<u32>;
|
| 2074 |
+
+@group(0) @binding(1) var<storage, read_write> up_weights: array<u32>;
|
| 2075 |
+
+@group(0) @binding(2) var<storage, read_write> input: array<f32>;
|
| 2076 |
+
+@group(0) @binding(3) var<storage, read_write> dst: array<f32>;
|
| 2077 |
+
+@group(0) @binding(4) var<uniform> params: Params;
|
| 2078 |
+
+
|
| 2079 |
+
+var<workgroup> partial_gate: array<f32, OUTPUTS_PER_WG * WG_SIZE>;
|
| 2080 |
+
+var<workgroup> partial_up: array<f32, OUTPUTS_PER_WG * WG_SIZE>;
|
| 2081 |
+
+
|
| 2082 |
+
+fn partial_index(row: u32, subgroup: u32) -> u32 {
|
| 2083 |
+
+ return row * WG_SIZE + subgroup;
|
| 2084 |
+
+}
|
| 2085 |
+
+
|
| 2086 |
+
+fn load_u16_gate(byte_offset: u32) -> u32 {
|
| 2087 |
+
+ let word = gate_weights[byte_offset / 4u];
|
| 2088 |
+
+ let shift = (byte_offset & 0x2u) * 8u;
|
| 2089 |
+
+ return (word >> shift) & 0xFFFFu;
|
| 2090 |
+
+}
|
| 2091 |
+
+
|
| 2092 |
+
+fn load_u16_up(byte_offset: u32) -> u32 {
|
| 2093 |
+
+ let word = up_weights[byte_offset / 4u];
|
| 2094 |
+
+ let shift = (byte_offset & 0x2u) * 8u;
|
| 2095 |
+
+ return (word >> shift) & 0xFFFFu;
|
| 2096 |
+
+}
|
| 2097 |
+
+
|
| 2098 |
+
+fn load_u32_gate(byte_offset: u32) -> u32 {
|
| 2099 |
+
+ let word_idx = byte_offset / 4u;
|
| 2100 |
+
+ let shift = (byte_offset & 0x3u) * 8u;
|
| 2101 |
+
+ let lo = gate_weights[word_idx];
|
| 2102 |
+
+ let hi = gate_weights[word_idx + 1u];
|
| 2103 |
+
+ return select((lo >> shift) | (hi << (32u - shift)), lo, shift == 0u);
|
| 2104 |
+
+}
|
| 2105 |
+
+
|
| 2106 |
+
+fn load_u32_up(byte_offset: u32) -> u32 {
|
| 2107 |
+
+ let word_idx = byte_offset / 4u;
|
| 2108 |
+
+ let shift = (byte_offset & 0x3u) * 8u;
|
| 2109 |
+
+ let lo = up_weights[word_idx];
|
| 2110 |
+
+ let hi = up_weights[word_idx + 1u];
|
| 2111 |
+
+ return select((lo >> shift) | (hi << (32u - shift)), lo, shift == 0u);
|
| 2112 |
+
+}
|
| 2113 |
+
+
|
| 2114 |
+
+fn q1_signs4(word: u32, shift: u32) -> vec4<f32> {
|
| 2115 |
+
+ let bit_offsets = vec4<u32>(shift, shift + 1u, shift + 2u, shift + 3u);
|
| 2116 |
+
+ let bits = (vec4<u32>(word) >> bit_offsets) & vec4<u32>(1u);
|
| 2117 |
+
+ return select(vec4<f32>(-1.0), vec4<f32>(1.0), bits == vec4<u32>(1u));
|
| 2118 |
+
+}
|
| 2119 |
+
+
|
| 2120 |
+
+fn swiglu(gate: f32, up: f32) -> f32 {
|
| 2121 |
+
+ return gate / (1.0 + exp(-gate)) * up;
|
| 2122 |
+
+}
|
| 2123 |
+
+
|
| 2124 |
+
+@compute @workgroup_size(WG_SIZE)
|
| 2125 |
+
+fn main(
|
| 2126 |
+
+ @builtin(local_invocation_id) local_id: vec3<u32>,
|
| 2127 |
+
+ @builtin(workgroup_id) wg_id: vec3<u32>,
|
| 2128 |
+
+ @builtin(subgroup_id) subgroup_id: u32,
|
| 2129 |
+
+ @builtin(subgroup_invocation_id) subgroup_invocation_id: u32,
|
| 2130 |
+
+ @builtin(num_subgroups) num_subgroups: u32,
|
| 2131 |
+
+ @builtin(subgroup_size) subgroup_size: u32,
|
| 2132 |
+
+) {
|
| 2133 |
+
+ const BLOCK_SIZE: u32 = 128u;
|
| 2134 |
+
+ const BLOCK_SIZE_BYTES: u32 = 18u;
|
| 2135 |
+
+ const THREADS_PER_BLOCK: u32 = 4u;
|
| 2136 |
+
+ const VECS_PER_THREAD: u32 = 8u;
|
| 2137 |
+
+
|
| 2138 |
+
+ let thread_id = local_id.x;
|
| 2139 |
+
+ let row_base = wg_id.x * OUTPUTS_PER_WG;
|
| 2140 |
+
+ let num_blocks = params.k / BLOCK_SIZE;
|
| 2141 |
+
+ let thread_within_block = thread_id % THREADS_PER_BLOCK;
|
| 2142 |
+
+ var gate_acc: array<f32, OUTPUTS_PER_WG>;
|
| 2143 |
+
+ var up_acc: array<f32, OUTPUTS_PER_WG>;
|
| 2144 |
+
+
|
| 2145 |
+
+ for (
|
| 2146 |
+
+ var block = thread_id / THREADS_PER_BLOCK;
|
| 2147 |
+
+ block < num_blocks;
|
| 2148 |
+
+ block += WG_SIZE / THREADS_PER_BLOCK
|
| 2149 |
+
+ ) {
|
| 2150 |
+
+ let x_base = params.offset_input + block * BLOCK_SIZE + thread_within_block * 32u;
|
| 2151 |
+
+ var x_block: array<vec4<f32>, VECS_PER_THREAD>;
|
| 2152 |
+
+ for (var i = 0u; i < VECS_PER_THREAD; i += 1u) {
|
| 2153 |
+
+ let x = x_base + i * 4u;
|
| 2154 |
+
+ x_block[i] = vec4<f32>(input[x], input[x + 1u], input[x + 2u], input[x + 3u]);
|
| 2155 |
+
+ }
|
| 2156 |
+
+
|
| 2157 |
+
+ for (var row = 0u; row < OUTPUTS_PER_WG; row += 1u) {
|
| 2158 |
+
+ let output_row = row_base + row;
|
| 2159 |
+
+ if (output_row < params.m) {
|
| 2160 |
+
+ let gate_byte_base =
|
| 2161 |
+
+ (params.offset_gate_weights + output_row * params.stride_gate_weights_01 + block) *
|
| 2162 |
+
+ BLOCK_SIZE_BYTES;
|
| 2163 |
+
+ let up_byte_base =
|
| 2164 |
+
+ (params.offset_up_weights + output_row * params.stride_up_weights_01 + block) *
|
| 2165 |
+
+ BLOCK_SIZE_BYTES;
|
| 2166 |
+
+ let gate_d = unpack2x16float(load_u16_gate(gate_byte_base))[0];
|
| 2167 |
+
+ let up_d = unpack2x16float(load_u16_up(up_byte_base))[0];
|
| 2168 |
+
+ let gate_q = load_u32_gate(gate_byte_base + 2u + thread_within_block * 4u);
|
| 2169 |
+
+ let up_q = load_u32_up(up_byte_base + 2u + thread_within_block * 4u);
|
| 2170 |
+
+ var gate_sum = 0.0;
|
| 2171 |
+
+ var up_sum = 0.0;
|
| 2172 |
+
+ for (var i = 0u; i < VECS_PER_THREAD; i += 1u) {
|
| 2173 |
+
+ gate_sum += gate_d * dot(x_block[i], q1_signs4(gate_q, i * 4u));
|
| 2174 |
+
+ up_sum += up_d * dot(x_block[i], q1_signs4(up_q, i * 4u));
|
| 2175 |
+
+ }
|
| 2176 |
+
+ gate_acc[row] += gate_sum;
|
| 2177 |
+
+ up_acc[row] += up_sum;
|
| 2178 |
+
+ }
|
| 2179 |
+
+ }
|
| 2180 |
+
+ }
|
| 2181 |
+
+
|
| 2182 |
+
+ for (var row = 0u; row < OUTPUTS_PER_WG; row += 1u) {
|
| 2183 |
+
+ let gate_total = subgroupAdd(gate_acc[row]);
|
| 2184 |
+
+ let up_total = subgroupAdd(up_acc[row]);
|
| 2185 |
+
+ if (subgroup_invocation_id == 0u) {
|
| 2186 |
+
+ partial_gate[partial_index(row, subgroup_id)] = gate_total;
|
| 2187 |
+
+ partial_up[partial_index(row, subgroup_id)] = up_total;
|
| 2188 |
+
+ }
|
| 2189 |
+
+ }
|
| 2190 |
+
+
|
| 2191 |
+
+ workgroupBarrier();
|
| 2192 |
+
+
|
| 2193 |
+
+ for (
|
| 2194 |
+
+ var row = subgroup_id;
|
| 2195 |
+
+ row < OUTPUTS_PER_WG && row_base + row < params.m;
|
| 2196 |
+
+ row += num_subgroups
|
| 2197 |
+
+ ) {
|
| 2198 |
+
+ var gate_row_acc = 0.0;
|
| 2199 |
+
+ var up_row_acc = 0.0;
|
| 2200 |
+
+ for (var subgroup = subgroup_invocation_id; subgroup < num_subgroups; subgroup += subgroup_size) {
|
| 2201 |
+
+ gate_row_acc += partial_gate[partial_index(row, subgroup)];
|
| 2202 |
+
+ up_row_acc += partial_up[partial_index(row, subgroup)];
|
| 2203 |
+
+ }
|
| 2204 |
+
+ let gate = subgroupAdd(gate_row_acc);
|
| 2205 |
+
+ let up = subgroupAdd(up_row_acc);
|
| 2206 |
+
+ if (subgroup_invocation_id == 0u) {
|
| 2207 |
+
+ dst[params.offset_dst + row_base + row] = swiglu(gate, up);
|
| 2208 |
+
+ }
|
| 2209 |
+
+ }
|
| 2210 |
+
+}
|
vendor/wllama-bonsai/SOURCE.json
CHANGED
|
@@ -8,15 +8,23 @@
|
|
| 8 |
"patchSet": {
|
| 9 |
"format": "git-diff-binary",
|
| 10 |
"path": "vendor/wllama-bonsai/PATCH.diff",
|
| 11 |
-
"bytes":
|
| 12 |
-
"sha256": "
|
| 13 |
"files": [
|
| 14 |
"CMakeLists.txt",
|
| 15 |
"cpp/glue.hpp",
|
| 16 |
"cpp/wllama-context.h",
|
| 17 |
"llama.cpp/ggml/src/ggml-webgpu/CMakeLists.txt",
|
| 18 |
"llama.cpp/ggml/src/ggml-webgpu/ggml-webgpu-shader-lib.hpp",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
"llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_acc.tmpl",
|
|
|
|
|
|
|
| 20 |
"package.json",
|
| 21 |
"scripts/docker-compose.yml",
|
| 22 |
"src/glue/messages.ts",
|
|
@@ -44,8 +52,8 @@
|
|
| 44 |
"files": [
|
| 45 |
{
|
| 46 |
"path": "vendor/wllama-bonsai/esm/index.js",
|
| 47 |
-
"bytes":
|
| 48 |
-
"sha256": "
|
| 49 |
},
|
| 50 |
{
|
| 51 |
"path": "vendor/wllama-bonsai/esm/index.cjs",
|
|
@@ -64,13 +72,13 @@
|
|
| 64 |
},
|
| 65 |
{
|
| 66 |
"path": "public/wasm/wllama.wasm",
|
| 67 |
-
"bytes":
|
| 68 |
-
"sha256": "
|
| 69 |
},
|
| 70 |
{
|
| 71 |
"path": "public/wasm/wllama-compat.wasm",
|
| 72 |
-
"bytes":
|
| 73 |
-
"sha256": "
|
| 74 |
},
|
| 75 |
{
|
| 76 |
"path": "public/wasm/wllama-compat.js",
|
|
@@ -78,20 +86,27 @@
|
|
| 78 |
"sha256": "0b667db536815fb9e5dc9ffbfbd6ba29affdda38a4ba892d5372ddb41ce9a8c8"
|
| 79 |
}
|
| 80 |
],
|
| 81 |
-
"
|
| 82 |
-
"id": "q1-
|
| 83 |
-
"status": "release",
|
| 84 |
"compileDefinitions": {
|
| 85 |
"GGML_WEBGPU_Q1_VEC4": true,
|
| 86 |
-
"GGML_WEBGPU_Q1_VEC4_WG_SIZE": 64
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 87 |
},
|
| 88 |
-
"wasmSha256": "
|
| 89 |
-
"
|
| 90 |
-
"
|
| 91 |
-
|
| 92 |
-
"results/phase5/q1-raw-vec4-wg64-27b-ab.json",
|
| 93 |
-
"results/space-agent/27b-html-artifact-q1-raw-vec4-wg64.json",
|
| 94 |
-
"results/phase5/safari-gate-q1-raw-vec4-wg64-candidate-r6-1_7b.json"
|
| 95 |
-
]
|
| 96 |
}
|
| 97 |
}
|
|
|
|
| 8 |
"patchSet": {
|
| 9 |
"format": "git-diff-binary",
|
| 10 |
"path": "vendor/wllama-bonsai/PATCH.diff",
|
| 11 |
+
"bytes": 97836,
|
| 12 |
+
"sha256": "60a5280bea5fc5ae11065f4c83fd2d532526cdcb7977cbe927cac7ae90926bde",
|
| 13 |
"files": [
|
| 14 |
"CMakeLists.txt",
|
| 15 |
"cpp/glue.hpp",
|
| 16 |
"cpp/wllama-context.h",
|
| 17 |
"llama.cpp/ggml/src/ggml-webgpu/CMakeLists.txt",
|
| 18 |
"llama.cpp/ggml/src/ggml-webgpu/ggml-webgpu-shader-lib.hpp",
|
| 19 |
+
"llama.cpp/ggml/src/ggml-webgpu/ggml-webgpu.cpp",
|
| 20 |
+
"llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/common_decls.tmpl",
|
| 21 |
+
"llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/gated_delta_net.wgsl",
|
| 22 |
+
"llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/get_rows.wgsl",
|
| 23 |
+
"llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_decls.tmpl",
|
| 24 |
+
"llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec.wgsl",
|
| 25 |
"llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_acc.tmpl",
|
| 26 |
+
"llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_q1_dual_glu.wgsl",
|
| 27 |
+
"llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_q1_glu.wgsl",
|
| 28 |
"package.json",
|
| 29 |
"scripts/docker-compose.yml",
|
| 30 |
"src/glue/messages.ts",
|
|
|
|
| 52 |
"files": [
|
| 53 |
{
|
| 54 |
"path": "vendor/wllama-bonsai/esm/index.js",
|
| 55 |
+
"bytes": 366883,
|
| 56 |
+
"sha256": "a02f02b86d7dac8e3bd6c21225910c755bb85ec64ac7d323bfbfa2477b225e3d"
|
| 57 |
},
|
| 58 |
{
|
| 59 |
"path": "vendor/wllama-bonsai/esm/index.cjs",
|
|
|
|
| 72 |
},
|
| 73 |
{
|
| 74 |
"path": "public/wasm/wllama.wasm",
|
| 75 |
+
"bytes": 8048681,
|
| 76 |
+
"sha256": "dbded8334921b51877ade32009bcaee5b7423e3b39679089a970062c57128acb"
|
| 77 |
},
|
| 78 |
{
|
| 79 |
"path": "public/wasm/wllama-compat.wasm",
|
| 80 |
+
"bytes": 14885188,
|
| 81 |
+
"sha256": "f9b1bd2bd2a62a6b95ab52ecda92d10c709bc1ac3b6be9bb450e5adeff8dd39f"
|
| 82 |
},
|
| 83 |
{
|
| 84 |
"path": "public/wasm/wllama-compat.js",
|
|
|
|
| 86 |
"sha256": "0b667db536815fb9e5dc9ffbfbd6ba29affdda38a4ba892d5372ddb41ce9a8c8"
|
| 87 |
}
|
| 88 |
],
|
| 89 |
+
"experiment": {
|
| 90 |
+
"id": "turbo-q1-tritile-gdn-dual-glu-release-v1",
|
| 91 |
+
"status": "release-candidate",
|
| 92 |
"compileDefinitions": {
|
| 93 |
"GGML_WEBGPU_Q1_VEC4": true,
|
| 94 |
+
"GGML_WEBGPU_Q1_VEC4_WG_SIZE": 64,
|
| 95 |
+
"GGML_WEBGPU_Q1_VEC4_OUTPUTS_PER_WG": 4,
|
| 96 |
+
"GGML_WEBGPU_Q1_VEC4_SHAPE_AWARE_OUTPUTS": true,
|
| 97 |
+
"GGML_WEBGPU_Q1_VEC4_LARGE_K_THRESHOLD": 4096,
|
| 98 |
+
"GGML_WEBGPU_Q1_ROW_RETILE": false,
|
| 99 |
+
"GGML_WEBGPU_COMMAND_SUBMIT_BATCH_SIZE": 64,
|
| 100 |
+
"GGML_WEBGPU_TURBO_TRACE": false,
|
| 101 |
+
"GGML_WEBGPU_GPU_PROFILE": false,
|
| 102 |
+
"GGML_WEBGPU_BATCH_PARAM_UPLOADS": false,
|
| 103 |
+
"GGML_WEBGPU_Q1_GLU_FUSION": false,
|
| 104 |
+
"GGML_WEBGPU_Q1_DUAL_GLU_FUSION": true,
|
| 105 |
+
"GGML_WEBGPU_GDN_CACHE_FUSION": true
|
| 106 |
},
|
| 107 |
+
"wasmSha256": "dbded8334921b51877ade32009bcaee5b7423e3b39679089a970062c57128acb",
|
| 108 |
+
"moduleSha256": "a02f02b86d7dac8e3bd6c21225910c755bb85ec64ac7d323bfbfa2477b225e3d",
|
| 109 |
+
"compatWasmSha256": "f9b1bd2bd2a62a6b95ab52ecda92d10c709bc1ac3b6be9bb450e5adeff8dd39f",
|
| 110 |
+
"compatWorkerSha256": "0b667db536815fb9e5dc9ffbfbd6ba29affdda38a4ba892d5372ddb41ce9a8c8"
|
|
|
|
|
|
|
|
|
|
|
|
|
| 111 |
}
|
| 112 |
}
|
vendor/wllama-bonsai/esm/index.js
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|