Skip to content

Commit 194cc9c

Browse files
committed
runtime(python): Add f-string support
Fixes #14033. Signed-off-by: Doug Kearns <dougkearns@gmail.com>
1 parent 126bc46 commit 194cc9c

45 files changed

Lines changed: 1491 additions & 114 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

runtime/syntax/python.vim

Lines changed: 80 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -128,18 +128,18 @@ syn match pythonDecoratorName "@\s*\h\%(\w\|\.\)*" display contains=pythonDeco
128128
" Single line multiplication.
129129
syn match pythonMatrixMultiply
130130
\ "\%(\w\|[])]\)\s*@"
131-
\ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonClass,pythonFunction,pythonDoctestValue
131+
\ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonClass,pythonFunction,pythonDoctestValue,@pythonFStringContained
132132
\ transparent
133133
" Multiplication continued on the next line after backslash.
134134
syn match pythonMatrixMultiply
135135
\ "[^\\]\\\s*\n\%(\s*\.\.\.\s\)\=\s\+@"
136-
\ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonClass,pythonFunction,pythonDoctestValue
136+
\ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonClass,pythonFunction,pythonDoctestValue,@pythonFStringContained
137137
\ transparent
138138
" Multiplication in a parenthesized expression over multiple lines with @ at
139139
" the start of each continued line; very similar to decorators and complex.
140140
syn match pythonMatrixMultiply
141141
\ "^\s*\%(\%(>>>\|\.\.\.\)\s\+\)\=\zs\%(\h\|\%(\h\|[[(]\).\{-}\%(\w\|[])]\)\)\s*\n\%(\s*\.\.\.\s\)\=\s\+@\%(.\{-}\n\%(\s*\.\.\.\s\)\=\s\+@\)*"
142-
\ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonClass,pythonFunction,pythonDoctestValue
142+
\ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonClass,pythonFunction,pythonDoctestValue,@pythonFStringContained
143143
\ transparent
144144

145145
syn match pythonClass "\h\w*" display contained
@@ -161,33 +161,22 @@ syn region pythonRawString matchgroup=pythonQuotes
161161
syn region pythonRawString matchgroup=pythonTripleQuotes
162162
\ start=+[rR]\z('''\|"""\)+ end="\z1" keepend
163163
\ contains=pythonSpaceError,pythonDoctest,@Spell
164-
165-
" Formatted string literals (f-strings)
166-
" https://docs.python.org/3/reference/lexical_analysis.html#f-strings
167-
syn region pythonFString
168-
\ matchgroup=pythonQuotes
169-
\ start=+\cF\z(['"]\)+
170-
\ end="\z1"
171-
\ skip="\\\\\|\\\z1"
172-
\ contains=pythonFStringField,pythonFStringSkip,pythonEscape,pythonUnicodeEscape,@Spell
173-
syn region pythonFString
174-
\ matchgroup=pythonTripleQuotes
175-
\ start=+\cF\z('''\|"""\)+
176-
\ end="\z1"
177-
\ keepend
178-
\ contains=pythonFStringField,pythonFStringSkip,pythonEscape,pythonUnicodeEscape,pythonSpaceError,pythonDoctest,@Spell
179-
syn region pythonRawFString
180-
\ matchgroup=pythonQuotes
181-
\ start=+\c\%(FR\|RF\)\z(['"]\)+
182-
\ end="\z1"
183-
\ skip="\\\\\|\\\z1"
184-
\ contains=pythonFStringField,pythonFStringSkip,@Spell
185-
syn region pythonRawFString
186-
\ matchgroup=pythonTripleQuotes
187-
\ start=+\c\%(FR\|RF\)\z('''\|"""\)+
188-
\ end="\z1"
189-
\ keepend
190-
\ contains=pythonFStringField,pythonFStringSkip,pythonSpaceError,pythonDoctest,@Spell
164+
syn region pythonFString matchgroup=pythonQuotes
165+
\ start=+[fF]\z(['"]\)+
166+
\ end="$\|\z1" skip="\\\\\|\\\z1"
167+
\ contains=pythonEscape,pythonUnicodeEscape,pythonFStringEscapedBrace,pythonFStringReplacement,@Spell
168+
syn region pythonFString matchgroup=pythonTripleQuotes
169+
\ start=+[fF]\z('''\|"""\)+
170+
\ end="\z1" keepend
171+
\ contains=pythonEscape,pythonUnicodeEscape,pythonSpaceError,pythonFStringEscapedBrace,pythonFStringReplacement,pythonDoctest,@Spell
172+
syn region pythonRawFString matchgroup=pythonQuotes
173+
\ start=+\%([fF][rR]\|[rR][fF]\)\z(['"]\)+
174+
\ end="$\|\z1" skip="\\\\\|\\\r\=$\|\\\z1"
175+
\ contains=pythonFStringEscapedBrace,pythonFStringReplacement,@Spell
176+
syn region pythonRawFString matchgroup=pythonTripleQuotes
177+
\ start=+\%([fF][rR]\|[rR][fF]\)\z('''\|"""\)+
178+
\ end="\z1" keepend
179+
\ contains=pythonSpaceError,pythonFStringEscapedBrace,pythonFStringReplacement,pythonDoctest,@Spell
191180

192181
" Bytes
193182
syn region pythonBytes
@@ -213,24 +202,6 @@ syn region pythonRawBytes
213202
\ end="\z1"
214203
\ keepend
215204

216-
" F-string replacement fields
217-
"
218-
" - Matched parentheses, brackets and braces are ignored
219-
" - A bare # is ignored to end of line
220-
" - A bare = (surrounded by optional whitespace) enables debugging
221-
" - A bare ! prefixes a conversion field
222-
" - A bare : begins a format specification
223-
" - Matched braces inside a format specification are ignored
224-
"
225-
syn region pythonFStringField
226-
\ matchgroup=pythonFStringDelimiter
227-
\ start=/{/
228-
\ skip=/([^)]*)\|\[[^]]*]\|{[^}]*}\|#.*$/
229-
\ end=/\%(\s*=\s*\)\=\%(!\a\)\=\%(:\%({[^}]*}\|[^}]*\)\+\)\=}/
230-
\ contained
231-
" Doubled braces and Unicode escapes are not replacement fields
232-
syn match pythonFStringSkip /{{\|\\N{/ transparent contained contains=NONE
233-
234205
syn match pythonEscape +\\[abfnrtv'"\\]+ contained
235206
syn match pythonEscape "\\\o\{1,3}" contained
236207
syn match pythonEscape "\\x\x\{2}" contained
@@ -239,6 +210,62 @@ syn match pythonUnicodeEscape "\%(\\u\x\{4}\|\\U\x\{8}\)" contained
239210
" The specification: https://www.unicode.org/versions/Unicode16.0.0/core-spec/chapter-4/#G135165
240211
syn match pythonUnicodeEscape "\\N{\a\+\%(\%(\s\a\+[[:alnum:]]*\)\|\%(-[[:alnum:]]\+\)\)*}" contained
241212
syn match pythonEscape "\\$"
213+
syn match pythonEscape "\\\r\=$"
214+
215+
" f-strings
216+
" See https://docs.python.org/3/reference/lexical_analysis.html#formatted-string-literals
217+
syn region pythonFStringReplacement matchgroup=pythonFStringBrace start=+{+ end=+}+ contained contains=pythonFStringExpression
218+
219+
" Skip contained '[:!]'
220+
" TODO: this should contain @pythonExpression rather than TOP
221+
syn region pythonFStringBrackets
222+
\ start="{" end="}"
223+
\ contained contains=TOP
224+
\ transparent
225+
syn region pythonFStringBrackets
226+
\ start="(" end=")"
227+
\ contained contains=TOP
228+
\ transparent
229+
syn region pythonFStringBrackets
230+
\ start="\[" end="]"
231+
\ contained contains=TOP
232+
\ transparent
233+
234+
syn region pythonFStringReplacementWhitespace start="\s" end="\ze\S" contained nextgroup=pythonFStringConversion,pythonFStringFormatSpec
235+
236+
" TODO: contains (yield_expr | star_expressions)
237+
" True False None yield from if else for lambda await
238+
syn cluster pythonExpression
239+
\ contains=pythonNumber,python.*String,pythonOperator,pythonBuiltin,pythonAttribute,pythonComment,pythonFStringBrackets
240+
241+
syn region pythonFStringExpression
242+
\ start="." end="\ze[=!:}]"
243+
\ contained contains=@pythonExpression
244+
\ nextgroup=pythonFStringEquals,pythonFStringConversion,pythonFStringFormatSpec
245+
246+
" TODO: it would be better to match pythonOperator with priority but symbolic
247+
" operators are not currently matched
248+
" skip operators
249+
syn match pythonFStringEquals "[!<>=]\@1<!==\@!"
250+
\ contained
251+
\ nextgroup=pythonFStringConversion,pythonFStringFormatSpec,pythonFStringReplacementWhitespace,pythonComment
252+
\ skipwhite skipempty
253+
hi def link pythonFStringEquals Special
254+
255+
syn match pythonFStringConversion "![ars]"
256+
\ contained
257+
\ nextgroup=pythonFStringFormatSpec,pythonFStringReplacementWhitespace,pythonComment
258+
\ skipwhite skipempty
259+
hi def link pythonFStringConversion Special
260+
261+
syn region pythonFStringFormatSpec
262+
\ matchgroup=Delimiter start=":" matchgroup=NONE end="\ze}"
263+
\ contained contains=pythonFStringReplacement
264+
hi def link pythonFStringFormatSpec Special
265+
266+
syn match pythonFStringEscapedBrace "{{\|}}" contained
267+
268+
syn cluster pythonFStringContained contains=pythonFString.\+
242269

243270
" It is very important to understand all details before changing the
244271
" regular expressions below or their order.
@@ -303,7 +330,7 @@ if !exists("python_no_builtin_highlight")
303330
syn keyword pythonBuiltin tuple type vars zip __import__
304331
" avoid highlighting attributes as builtins
305332
syn match pythonAttribute /\.\h\w*/hs=s+1
306-
\ contains=ALLBUT,pythonBuiltin,pythonClass,pythonFunction,pythonAsync
333+
\ contains=ALLBUT,pythonBuiltin,pythonClass,pythonFunction,pythonAsync,pythonFStringExpression
307334
\ transparent
308335
endif
309336

@@ -360,7 +387,7 @@ if !exists("python_no_doctest_highlight")
360387
if !exists("python_no_doctest_code_highlight")
361388
syn region pythonDoctest
362389
\ start="^\s*>>>\s" end="^\s*$"
363-
\ contained contains=ALLBUT,pythonDoctest,pythonClass,pythonFunction,@Spell
390+
\ contained contains=ALLBUT,pythonDoctest,pythonClass,pythonFunction,@pythonFStringContained,@Spell
364391
syn region pythonDoctestValue
365392
\ start=+^\s*\%(>>>\s\|\.\.\.\s\|"""\|'''\)\@!\S\++ end="$"
366393
\ contained
@@ -399,7 +426,9 @@ hi def link pythonQuotes String
399426
hi def link pythonTripleQuotes pythonQuotes
400427
hi def link pythonEscape Special
401428
hi def link pythonUnicodeEscape pythonEscape
402-
hi def link pythonFStringDelimiter Special
429+
" hi def link pythonFStringDelimiter Special
430+
hi def link pythonFStringEscapedBrace Special
431+
hi def link pythonFStringBrace Include
403432
if !exists("python_no_number_highlight")
404433
hi def link pythonNumber Number
405434
endif
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
>#+0#0000e05#ffffff0| |P|y|t|h|o|n| |f|-|s|t|r|i|n|g| |t|e|s|t|s| +0#0000000&@51
2+
@75
3+
|#+0#0000e05&| |T|h|i|s| |f|i|l|e| |c|o|n|t|a|i|n|s| |c|o|d|e| |d|e|r|i|v|e|d| |f|r|o|m| |t|h|e| |C|P|y|t|h|o|n| |p|r|o|j|e|c|t|,| +0#0000000&@15
4+
|#+0#0000e05&| |s|p|e|c|i|f|i|c|a|l@1|y| |f|r|o|m| |t|h|e| |f|i|l|e| |'|L|i|b|/|t|e|s|t|/|t|e|s|t|_|f|s|t|r|i|n|g|.|p|y|'|.| +0#0000000&@18
5+
|#+0#0000e05&| +0#0000000&@73
6+
|#+0#0000e05&| |T|h|e| |o|r|i|g|i|n|a|l| |c|o|d|e| |i|s| |C|o|p|y|r|i|g|h|t| |(|c|)| |2|0@1|1|-|2|0|2|5| |P|y|t|h|o|n| |S|o|f|t|w|a|r|e| |F|o|u|n|d|a|t|i|o|n|;| +0#0000000&
7+
|#+0#0000e05&| |A|l@1| |R|i|g|h|t|s| |R|e|s|e|r|v|e|d| +0#0000000&@53
8+
|#+0#0000e05&| +0#0000000&@73
9+
|#+0#0000e05&| |I|t| |i|s| |l|i|c|e|n|s|e|d| |u|n|d|e|r| |t|h|e| |P|S|F| |L|i|c|e|n|s|e| |A|g|r|e@1|m|e|n|t|:| +0#0000000&@25
10+
|#+0#0000e05&| |h|t@1|p|s|:|/@1|d|o|c|s|.|p|y|t|h|o|n|.|o|r|g|/|3|/|l|i|c|e|n|s|e|.|h|t|m|l| +0#0000000&@34
11+
|#+0#0000e05&| +0#0000000&@73
12+
|#+0#0000e05&| |M|o|d|i|f|i|c|a|t|i|o|n|s| |f|r|o|m| |t|h|e| |o|r|i|g|i|n|a|l|:| +0#0000000&@40
13+
|#+0#0000e05&| |-| |T|e|s|t| |i|n|p|u|t| |e|x|p|r|e|s@1|i|o|n|s| |h|a|v|e| |b|e@1|n| |e|x|t|r|a|c|t|e|d| |f|r|o|m| |t|h|e| |t|e|s|t| |f|u|n|c|t|i|o|n|s| |a|n|d|
14+
|t|h|e| +0#0000000&@71
15+
|#+0#0000e05&| @2|f|u|n|c|t|i|o|n|s| |d|e|l|e|t|e|d| +0#0000000&@53
16+
|#+0#0000e05&| +0#0000000&@73
17+
|#+0#0000e05&| |T|h|i|s| |i|n|c|l|u|s|i|o|n| |i|s| |f|o|r| |t|e|s|t|i|n|g| |p|u|r|p|o|s|e|s| |o|f| |V|i|m|'|s| |P|y|t|h|o|n| |s|y|n|t|a|x| |h|i|g|h|l|i|g|h|t|i|n
18+
|g|.| +0#0000000&@72
19+
@75
20+
@57|1|,|1| @10|T|o|p|
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
|#+0#0000e05#ffffff0| |-| |T|e|s|t| |i|n|p|u|t| |e|x|p|r|e|s@1|i|o|n|s| |h|a|v|e| |b|e@1|n| |e|x|t|r|a|c|t|e|d| |f|r|o|m| |t|h|e| |t|e|s|t| |f|u|n|c|t|i|o|n|s| |a|n|d|
2+
|t|h|e| +0#0000000&@71
3+
|#+0#0000e05&| @2|f|u|n|c|t|i|o|n|s| |d|e|l|e|t|e|d| +0#0000000&@53
4+
|#+0#0000e05&| +0#0000000&@73
5+
|#+0#0000e05&| |T|h|i|s| |i|n|c|l|u|s|i|o|n| |i|s| |f|o|r| |t|e|s|t|i|n|g| |p|u|r|p|o|s|e|s| |o|f| |V|i|m|'|s| |P|y|t|h|o|n| |s|y|n|t|a|x| |h|i|g|h|l|i|g|h|t|i|n
6+
|g|.| +0#0000000&@72
7+
> @74
8+
|#+0#0000e05&| |P|y|t|h|o|n|-|3|.|1|2|.|2|/|L|i|b|/|t|e|s|t|/|t|e|s|t|_|f|s|t|r|i|n|g|.|p|y| |(|r|e|f|o|r|m|a|t@1|e|d| |f|o|r| |s|y|n|t|a|x| |t|e|s|t|i|n|g|)| +0#0000000&@1
9+
@75
10+
|#+0#0000e05&@1| |t|e|s|t|_|a|s|t| +0#0000000&@63
11+
|f+0#e000002&|'|{+0#e000e06&|a+0#0000000&| |*| |x|(|)|}+0#e000e06&|'+0#e000002&| +0#0000000&@62
12+
@75
13+
|#+0#0000e05&@1| |t|e|s|t|_|a|s|t|_|l|i|n|e|_|n|u|m|b|e|r|s|_|m|u|l|t|i|p|l|e|_|f|o|r|m|a|t@1|e|d|v|a|l|u|e|s| +0#0000000&@25
14+
|f+0#e000002&|'|n|o| |f|o|r|m|a|t@1|e|d| |v|a|l|u|e|s|'| +0#0000000&@52
15+
|f+0#e000002&|'|e|g@1|s| |{+0#e000e06&|a+0#0000000&| |*| |x|(|)|}+0#e000e06&| +0#e000002&|s|p|a|m| |{+0#e000e06&|b+0#0000000&| |+| |y|(|)|}+0#e000e06&|'+0#e000002&| +0#0000000&@42
16+
@75
17+
|#+0#0000e05&@1| |t|e|s|t|_|a|s|t|_|l|i|n|e|_|n|u|m|b|e|r|s|_|n|e|s|t|e|d| +0#0000000&@43
18+
|f+0#e000002&|'|{+0#e000e06&|a+0#0000000&| |*| |f+0#e000002&|"|-|{+0#e000e06&|x+0#0000000&|(|)|}+0#e000e06&|-+0#e000002&|"|}+0#e000e06&|'+0#e000002&| +0#0000000&@55
19+
@75
20+
@57|1|7|,|0|-|1| @8|1|%|
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
| +0&#ffffff0@74
2+
|#+0#0000e05&@1| |t|e|s|t|_|a|s|t|_|l|i|n|e|_|n|u|m|b|e|r|s|_|d|u|p|l|i|c|a|t|e|_|e|x|p|r|e|s@1|i|o|n| +0#0000000&@29
3+
|f+0#e000002&|'|{+0#e000e06&|a+0#0000000&| |*| |x|(|)|}+0#e000e06&| +0#e000002&|{+0#e000e06&|a+0#0000000&| |*| |x|(|)|}+0#e000e06&| +0#e000002&|{+0#e000e06&|a+0#0000000&| |*| |x|(|)|}+0#e000e06&|'+0#e000002&| +0#0000000&@42
4+
@75
5+
|#+0#0000e05&@1| |t|e|s|t|_|a|s|t|_|n|u|m|b|e|r|s|_|f|s|t|r|i|n|g|_|w|i|t|h|_|f|o|r|m|a|t@1|i|n|g| +0#0000000&@31
6+
>'+0#e000002&|f|"|H|e|r|e| |i|s| |t|h|a|t| |p|e|s|k|y| |{|x@2|:|.|3|f|}| |a|g|a|i|n|"|'| +0#0000000&@35
7+
@75
8+
|#+0#0000e05&@1| |t|e|s|t|_|a|s|t|_|l|i|n|e|_|n|u|m|b|e|r|s|_|m|u|l|t|i|l|i|n|e|_|f|s|t|r|i|n|g| +0#0000000&@32
9+
|f+0#e000002&|'@2| +0#0000000&@70
10+
| +0#e000002&@1|{+0#e000e06&|a+0#0000000&| @70
11+
@5|*| @68
12+
@7|x|(|)|}+0#e000e06&| +0#0000000&@63
13+
|n+0#e000002&|o|n|-|i|m|p|o|r|t|a|n|t| |c|o|n|t|e|n|t| +0#0000000&@53
14+
|'+0#e000002&@2| +0#0000000&@71
15+
@75
16+
|f+0#e000002&|'@2| +0#0000000&@70
17+
| +0#e000002&@9|{+0#e000e06&|b+0#0000000&|l|e|c|h|}+0#e000e06&| +0#0000000&@57
18+
|'+0#e000002&@2| +0#0000000&@71
19+
@75
20+
@57|3|4|,|1| @10|4|%|
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
| +0&#ffffff0@74
2+
|#+0#0000e05&@1| |t|e|s|t|_|a|s|t|_|l|i|n|e|_|n|u|m|b|e|r|s|_|w|i|t|h|_|p|a|r|e|n|t|h|e|s|e|s| +0#0000000&@33
3+
|x| |=| |(| @69
4+
@4|f+0#e000002&|"| |{+0#e000e06&|t+0#0000000&|e|s|t|(|t|)|}+0#e000e06&|"+0#e000002&| +0#0000000&@57
5+
|)| @73
6+
> @74
7+
|x| |=| |(| @69
8+
@4|u+0#e000002&|'|w|a|t|'|,+0#0000000&| @63
9+
@4|u+0#e000002&|"|w|a|t|"|,+0#0000000&| @63
10+
@4|b+0#e000002&|'|w|a|t|'|,+0#0000000&| @63
11+
@4|b+0#e000002&|"|w|a|t|"|,+0#0000000&| @63
12+
@4|f+0#e000002&|'|w|a|t|'|,+0#0000000&| @63
13+
@4|f+0#e000002&|"|w|a|t|"|,+0#0000000&| @63
14+
|)| @73
15+
@75
16+
|y| |=| |(| @69
17+
@4|u+0#e000002&|'@2|w|a|t|'@2|,+0#0000000&| @59
18+
@4|u+0#e000002&|"@2|w|a|t|"@2|,+0#0000000&| @59
19+
@4|b+0#e000002&|'@2|w|a|t|'@2|,+0#0000000&| @59
20+
@57|5|2|,|0|-|1| @8|7|%|
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
| +0&#ffffff0@3|b+0#e000002&|'@2|w|a|t|'@2|,+0#0000000&| @59
2+
@4|b+0#e000002&|"@2|w|a|t|"@2|,+0#0000000&| @59
3+
@4|f+0#e000002&|'@2|w|a|t|'@2|,+0#0000000&| @59
4+
@4|f+0#e000002&|"@2|w|a|t|"@2|,+0#0000000&| @59
5+
|)| @73
6+
> @74
7+
|x| |=| |(| @69
8+
@8|'+0#e000002&|P|E|R|L|_|M@1|_|O|P|T|'|,+0#0000000&| |(| @50
9+
@12|f+0#e000002&|'|w|a|t|'| +0#0000000&@56
10+
@12|f+0#e000002&|'|s|o|m|e|_|s|t|r|i|n|g|=|{+0#e000e06&|f+0#0000000&|(|x|)|}+0#e000e06&| +0#e000002&|'| +0#0000000&@40
11+
@12|f+0#e000002&|'|w|a|t|'| +0#0000000&@56
12+
@8|)|,| @64
13+
|)| @73
14+
@75
15+
|#+0#0000e05&@1| |t|e|s|t|_|a|s|t|_|f|s|t|r|i|n|g|_|e|m|p|t|y|_|f|o|r|m|a|t|_|s|p|e|c| +0#0000000&@37
16+
|f+0#e000002&|'|{+0#e000e06&|e+0#0000000&|x|p|r|:+0#e000e06&|}|'+0#e000002&| +0#0000000&@64
17+
@75
18+
@75
19+
|#+0#0000e05&@1| |t|e|s|t|_|d|o|c|s|t|r|i|n|g| +0#0000000&@57
20+
@57|7|0|,|0|-|1| @7|1|0|%|
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
|#+0#0000e05#ffffff0@1| |t|e|s|t|_|d|o|c|s|t|r|i|n|g| +0#0000000&@57
2+
|d+0#af5f00255&|e|f| +0#0000000&|f+0#00e0e07&|(+0#0000000&|)|:| @66
3+
@4|f+0#e000002&|'@2|N|o|t| |a| |d|o|c|s|t|r|i|n|g|'@2| +0#0000000&@48
4+
@75
5+
|d+0#af5f00255&|e|f| +0#0000000&|g+0#00e0e07&|(+0#0000000&|)|:| @66
6+
@4>'+0#e000002&@2|N|o|t| |a| |d|o|c|s|t|r|i|n|g|'@2| +0#0000000&|\+0#e000e06&| +0#0000000&@47
7+
@4|f+0#e000002&|'@1| +0#0000000&@67
8+
@75
9+
@75
10+
|#+0#0000e05&@1| |t|e|s|t|_|a|s|t|_|c|o|m|p|i|l|e|_|t|i|m|e|_|c|o|n|c|a|t| +0#0000000&@43
11+
|(|'+0#e000002&|f|o@1|'| +0#0000000&|f+0#e000002&|'|{+0#e000e06&|3+0#e000002&|}+0#e000e06&|'+0#e000002&|,+0#0000000&| |'+0#e000002&|f|o@1|3|'|)+0#0000000&| @52
12+
@75
13+
|#+0#0000e05&@1| |t|e|s|t|_|l|i|t|e|r|a|l| +0#0000000&@59
14+
|(|f+0#e000002&|'@1|,+0#0000000&| |'+0#e000002&@1|)+0#0000000&| @65
15+
|(|f+0#e000002&|'|a|'|,+0#0000000&| |'+0#e000002&|a|'|)+0#0000000&| @63
16+
|(|f+0#e000002&|'| |'|,+0#0000000&| |'+0#e000002&| |'|)+0#0000000&| @63
17+
@75
18+
|#+0#0000e05&@1| |t|e|s|t|_|d|o|u|b|l|e|_|b|r|a|c|e|s| +0#0000000&@53
19+
|(|f+0#e000002&|'|{+0#e000e06&@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|{|'|)+0#0000000&| @62
20+
@57|8@1|,|5| @9|1|3|%|
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
|(+0&#ffffff0|f+0#e000002&|'|{+0#e000e06&@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|{|'|)+0#0000000&| @62
2+
|(|f+0#e000002&|'|a|{+0#e000e06&@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|a|{|'|)+0#0000000&| @60
3+
|(|f+0#e000002&|'|{+0#e000e06&@1|b+0#e000002&|'|,+0#0000000&| |'+0#e000002&|{|b|'|)+0#0000000&| @60
4+
|(|f+0#e000002&|'|a|{+0#e000e06&@1|b+0#e000002&|'|,+0#0000000&| |'+0#e000002&|a|{|b|'|)+0#0000000&| @58
5+
|(|f+0#e000002&|'|}+0#e000e06&@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|}|'|)+0#0000000&| @62
6+
>(|f+0#e000002&|'|a|}+0#e000e06&@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|a|}|'|)+0#0000000&| @60
7+
|(|f+0#e000002&|'|}+0#e000e06&@1|b+0#e000002&|'|,+0#0000000&| |'+0#e000002&|}|b|'|)+0#0000000&| @60
8+
|(|f+0#e000002&|'|a|}+0#e000e06&@1|b+0#e000002&|'|,+0#0000000&| |'+0#e000002&|a|}|b|'|)+0#0000000&| @58
9+
|(|f+0#e000002&|'|{+0#e000e06&@1|}@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|{|}|'|)+0#0000000&| @59
10+
|(|f+0#e000002&|'|a|{+0#e000e06&@1|}@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|a|{|}|'|)+0#0000000&| @57
11+
|(|f+0#e000002&|'|{+0#e000e06&@1|b+0#e000002&|}+0#e000e06&@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|{|b|}|'|)+0#0000000&| @57
12+
|(|f+0#e000002&|'|{+0#e000e06&@1|}@1|c+0#e000002&|'|,+0#0000000&| |'+0#e000002&|{|}|c|'|)+0#0000000&| @57
13+
|(|f+0#e000002&|'|a|{+0#e000e06&@1|b+0#e000002&|}+0#e000e06&@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|a|{|b|}|'|)+0#0000000&| @55
14+
|(|f+0#e000002&|'|a|{+0#e000e06&@1|}@1|c+0#e000002&|'|,+0#0000000&| |'+0#e000002&|a|{|}|c|'|)+0#0000000&| @55
15+
|(|f+0#e000002&|'|{+0#e000e06&@1|b+0#e000002&|}+0#e000e06&@1|c+0#e000002&|'|,+0#0000000&| |'+0#e000002&|{|b|}|c|'|)+0#0000000&| @55
16+
|(|f+0#e000002&|'|a|{+0#e000e06&@1|b+0#e000002&|}+0#e000e06&@1|c+0#e000002&|'|,+0#0000000&| |'+0#e000002&|a|{|b|}|c|'|)+0#0000000&| @53
17+
@75
18+
|(|f+0#e000002&|'|{+0#e000e06&@2|1+0#e000002&|0|}+0#e000e06&|'+0#e000002&|,+0#0000000&| |'+0#e000002&|{|1|0|'|)+0#0000000&| @56
19+
|(|f+0#e000002&|'|}+0#e000e06&@1|{|1+0#e000002&|0|}+0#e000e06&|'+0#e000002&|,+0#0000000&| |'+0#e000002&|}|1|0|'|)+0#0000000&| @56
20+
@57|1|0|6|,|1| @8|1|6|%|
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
|(+0&#ffffff0|f+0#e000002&|'|}+0#e000e06&@1|{|1+0#e000002&|0|}+0#e000e06&|'+0#e000002&|,+0#0000000&| |'+0#e000002&|}|1|0|'|)+0#0000000&| @56
2+
|(|f+0#e000002&|'|}+0#e000e06&@1|{@2|1+0#e000002&|0|}+0#e000e06&|'+0#e000002&|,+0#0000000&| |'+0#e000002&|}|{|1|0|'|)+0#0000000&| @53
3+
|(|f+0#e000002&|'|}+0#e000e06&@1|a+0#e000002&|{+0#e000e06&@2|1+0#e000002&|0|}+0#e000e06&|'+0#e000002&|,+0#0000000&| |'+0#e000002&|}|a|{|1|0|'|)+0#0000000&| @51
4+
@75
5+
|(|f+0#e000002&|'|{+0#e000e06&|1+0#e000002&|0|}+0#e000e06&|{@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|1|0|{|'|)+0#0000000&| @56
6+
>(|f+0#e000002&|'|{+0#e000e06&|1+0#e000002&|0|}+0#e000e06&@2|'+0#e000002&|,+0#0000000&| |'+0#e000002&|1|0|}|'|)+0#0000000&| @56
7+
|(|f+0#e000002&|'|{+0#e000e06&|1+0#e000002&|0|}+0#e000e06&@2|{@1|'+0#e000002&|,+0#0000000&| |'+0#e000002&|1|0|}|{|'|)+0#0000000&| @53
8+
|(|f+0#e000002&|'|{+0#e000e06&|1+0#e000002&|0|}+0#e000e06&@2|a+0#e000002&|{+0#e000e06&@1|'+0#e000002&| +0#0000000&|'+0#e000002&|}|'|,+0#0000000&| |'+0#e000002&|1|0|}|a|{|}|'|)+0#0000000&| @46
9+
@75
10+
|#+0#0000e05&| |I|n|s|i|d|e| |o|f| |s|t|r|i|n|g|s|,| |d|o|n|'|t| |i|n|t|e|r|p|r|e|t| |d|o|u|b|l|e|d| |b|r|a|c|k|e|t|s|.| +0#0000000&@20
11+
|(|f+0#e000002&|'|{+0#e000e06&|"+0#e000002&|{@1|}@1|"|}+0#e000e06&|'+0#e000002&|,+0#0000000&| |'+0#e000002&|{@1|}@1|'|)+0#0000000&| @53
12+
@75
13+
|#+0#0000e05&@1| |t|e|s|t|_|c|o|m|p|i|l|e|_|t|i|m|e|_|c|o|n|c|a|t| +0#0000000&@47
14+
|x| |=| |'+0#e000002&|d|e|f|'| +0#0000000&@65
15+
|(|'+0#e000002&|a|b|c|'| +0#0000000&|f+0#e000002&|'|#@1| |{+0#e000e06&|x+0#0000000&|}+0#e000e06&|g+0#e000002&|h|i|'|,+0#0000000&| |'+0#e000002&|a|b|c|#@1| |d|e|f|g|h|i|'|)+0#0000000&| @38
16+
|(|'+0#e000002&|a|b|c|'| +0#0000000&|f+0#e000002&|'|{+0#e000e06&|x+0#0000000&|}+0#e000e06&|'+0#e000002&| +0#0000000&|'+0#e000002&|g|h|i|'|,+0#0000000&| |'+0#e000002&|a|b|c|d|e|f|g|h|i|'|)+0#0000000&| @41
17+
|(|'+0#e000002&|a|b|c|'| +0#0000000&|f+0#e000002&|'|{+0#e000e06&|x+0#0000000&|}+0#e000e06&|'+0#e000002&| +0#0000000&|'+0#e000002&|g|h|'| +0#0000000&|f+0#e000002&|'|i|{+0#e000e06&|x+0#0000000&|:+0#e000e06&|4|}|'+0#e000002&|,+0#0000000&| |'+0#e000002&|a|b|c|d|e|f|g|h|i|d|e|f| |'|)+0#0000000&| @28
18+
|(|'+0#e000002&|{|x|}|'| +0#0000000&|f+0#e000002&|'|{+0#e000e06&|x+0#0000000&|}+0#e000e06&|'+0#e000002&|,+0#0000000&| |'+0#e000002&|{|x|}|d|e|f|'|)+0#0000000&| @50
19+
|(|'+0#e000002&|{|x|'| +0#0000000&|f+0#e000002&|'|{+0#e000e06&|x+0#0000000&|}+0#e000e06&|'+0#e000002&|,+0#0000000&| |'+0#e000002&|{|x|d|e|f|'|)+0#0000000&| @52
20+
@57|1|2|4|,|1| @8|1|9|%|

0 commit comments

Comments
 (0)