zmc
2023-12-22 9fdbf60165db0400c2e8e6be2dc6e88138ac719a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
U
Þ=®dìã
@srdZddlZddlmZddlmZddlmZddl    m
Z
ddl m Z ddlmZdd    lmZd
d lmZd
d lmZd
d lmZd
dlmZd
dlmZd
dlmZd
dlmZd
dlmZd
dlmZd
dlmZd
dlm Z d
dl!m"Z"ej#r ddl$Z%d
dl&m'Z'ej(dej)dej*fdZ+dddddd d!d"d#œZ,e+e+d$œd%d&„Z-e.ej)d'ej/d(gdfd)œd*d+„Z0e.ej)d'ej1d(gdfd)œd,d-„Z2dFej3d0ej4e.ej4e.ej4ej5e6e6ej4e.d1œd2d3„Z7ej*e6d4œd5d6„Z8ej9ej:ej9e.ej;e.d7œd8d9„Z<Gd:d;„d;ƒZ=Gd<d(„d(ƒZ>Gd=d>„d>e?ƒZ@Gd?d@„d@e"ƒZAGdAdB„dBe"ƒZBGdCdD„dDeCƒZDGdEd'„d'e"ƒZEdS)Gz0Compiles nodes from the parser into Python code.éN)Úcontextmanager)Úupdate_wrapper)ÚStringIO)Úchain)Ú    iskeyword)Úescape)ÚMarkupé)Únodes)ÚTemplateAssertionError)ÚSymbols)ÚVAR_LOAD_ALIAS)ÚVAR_LOAD_PARAMETER)ÚVAR_LOAD_RESOLVE)ÚVAR_LOAD_UNDEFINED)Ú EvalContext)Ú    Optimizer)Ú_PassArg)Úconcat)Ú NodeVisitor)Ú EnvironmentÚF.)Úboundz==z!=ú>z>=ú<z<=Úinznot in)ÚeqÚneÚgtZgteqÚltZlteqrÚnotin)ÚfÚreturncs2dtjdtjtjdœ‡fdd„ }tt t|¡ˆƒS)NÚ CodeGeneratorÚFrame)ÚselfÚnodeÚframeÚkwargsr"csF|jdk    r6|jjs6|j ||j¡}||kr6| ||¡Sˆ|||f|ŽS©N)Ú    optimizerÚeval_ctxÚvolatileÚvisit)r%r&r'r(Znew_node©r!©úFd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\jinja2/compiler.pyÚnew_func,s
 zoptimizeconst.<locals>.new_func)r
ÚExprÚtÚAnyrÚcastr)r!r1r/r.r0Ú optimizeconst+sþ r6r#r$)Úopr"cs"tdtjtddœ‡fdd„ ƒ}|S)Nr#©r%r&r'r"cs”|jjrNˆ|jjkrN| dˆ›d¡| |j|¡| d¡| |j|¡n8| d¡| |j|¡| dˆ›d¡| |j|¡| d¡dS)Nz environment.call_binop(context, ú, ú(ú ú))Ú environmentÚ    sandboxedZintercepted_binopsÚwriter-ÚleftÚright©r%r&r'©r7r/r0Úvisitor<sÿ
þ
 
z_make_binop.<locals>.visitor)r6r
ÚBinExprr$©r7rDr/rCr0Ú _make_binop;srGcs"tdtjtddœ‡fdd„ ƒ}|S)Nr#r8cs`|jjr6ˆ|jjkr6| dˆ›d¡| |j|¡n| dˆ¡| |j|¡| d¡dS)Nzenvironment.call_unop(context, r9r:r<)r=r>Zintercepted_unopsr?r-r&rBrCr/r0rDTsÿ
þz_make_unop.<locals>.visitor)r6r
Ú    UnaryExprr$rFr/rCr0Ú
_make_unopQs rIFTr)r&r=ÚnameÚfilenameÚstreamÚ
defer_initÚ    optimizedr"cCsHt|tjƒstdƒ‚| ||||||¡}| |¡|dkrD|j ¡SdS)z+Generate the python source for a node tree.z Can't compile non template nodesN)Ú
isinstancer
ÚTemplateÚ    TypeErrorZcode_generator_classr-rLÚgetvalue)r&r=rJrKrLrMrNÚ    generatorr/r/r0Úgeneratees
ÿ
 
rT©Úvaluer"cCs†|dks|tks|tkrdSt|ƒttttttt    hkr:dSt|ƒt
t t t hkr`tdd„|DƒƒSt|ƒtkr‚tdd„| ¡DƒƒSdS)z)Does the node have a safe representation?NTcss|]}t|ƒVqdSr)©Ú has_safe_repr)Ú.0Úvr/r/r0Ú    <genexpr>†sz has_safe_repr.<locals>.<genexpr>css"|]\}}t|ƒot|ƒVqdSr)rW©rYÚkrZr/r/r0r[‰sF)ÚNotImplementedÚEllipsisÚtypeÚboolÚintÚfloatÚcomplexÚrangeÚstrrÚtupleÚlistÚsetÚ    frozensetÚallÚdictÚitems©rVr/r/r0rX}s rX)r
Únamesr"cCs<t|ƒ}z|D]}| |¡qWntk
r4YnX|jS)z”Check if the names passed are accessed undeclared.  The return value
    is a set of all the undeclared names from the sequence of names found.
    )ÚUndeclaredNameVisitorr-Ú VisitorExitÚ
undeclared)r
rorDr&r/r/r0Úfind_undeclaredŽsrsc@s*eZdZejejejfddœdd„ZdS)ÚMacroRefN©r&r"cCs||_d|_d|_d|_dS©NF)r&Úaccesses_callerÚaccesses_kwargsÚaccesses_varargs©r%r&r/r/r0Ú__init__žszMacroRef.__init__)    Ú__name__Ú
__module__Ú __qualname__r3ÚUnionr
ÚMacroÚ    CallBlockr{r/r/r/r0rtsrtc@sdeZdZdZdeejdejeddœdd„Zddœdd„Z    de
dd
œd d „Z ddœd d„Z e    Z dS)r$z&Holds compile time information for us.N)r+ÚparentÚlevelr"cCs~||_||_|dkr4t|d|_d|_d|_d|_n(t|j|d|_|j|_|j|_|j|_d|_d|_d|_    d|_
d|_ dS)N©rƒF) r+r‚r ÚsymbolsÚrequire_output_checkÚbufferÚblockÚtoplevelÚ    rootlevelÚ
loop_frameÚ block_frameÚ
soft_frame)r%r+r‚rƒr/r/r0r{¨s  zFrame.__init__©r"cCs*t |j¡}|j |j¡|j ¡|_|S)z!Create a copy of the current one.)ÚobjectÚ__new__Ú    __class__Ú__dict__Úupdater…Úcopy©r%Úrvr/r/r0r”Ûs  z
Frame.copyF)Úisolatedr"cCs&|rt|j|jjddSt|j|ƒS)zReturn an inner frame.r    r„)r$r+r…rƒ)r%r—r/r/r0Úinnerâsz Frame.innercCs| ¡}d|_d|_|S)a&Return a soft frame.  A soft frame may not be modified as
        standalone thing as it shares the resources with the frame it
        was created of, but it's not a rootlevel frame any longer.
 
        This is only used to implement if-statements and conditional
        expressions.
        FT)r”rŠrr•r/r/r0Úsoftèsz
Frame.soft)NN)F)r|r}r~Ú__doc__rr3ÚOptionalrbr{r”rar˜r™Ú__copy__r/r/r/r0r$¥süû 3 c@seZdZdZdS)rqz?Exception used by the `UndeclaredNameVisitor` to signal a stop.N©r|r}r~ršr/r/r/r0rqøsrqc@sTeZdZdZddœdd„Zejddœdd„Zejddœd    d
„Z    ej
ddœd d „Z dS) ÚDependencyFinderVisitorz.A visitor that collects filter and test calls.NrŽcCstƒ|_tƒ|_dSr))riÚfiltersÚtests©r%r/r/r0r{ÿsz DependencyFinderVisitor.__init__rucCs| |¡|j |j¡dSr))Ú generic_visitrŸÚaddrJrzr/r/r0Ú visit_Filters
z$DependencyFinderVisitor.visit_FiltercCs| |¡|j |j¡dSr))r¢r r£rJrzr/r/r0Ú
visit_Tests
z"DependencyFinderVisitor.visit_TestcCsdS)zStop visiting at blocks.Nr/rzr/r/r0Ú visit_Block sz#DependencyFinderVisitor.visit_Block) r|r}r~ršr{r
ÚFilterr¤ÚTestr¥ÚBlockr¦r/r/r/r0ržüs
ržc@sJeZdZdZejeddœdd„Zej    ddœdd„Z
ej ddœd    d
„Z dS) rpz¡A visitor that checks if a name is accessed without being
    declared.  This is different from the frame visitor as it will
    not stop at closure frames.
    N)ror"cCst|ƒ|_tƒ|_dSr))rirorr)r%ror/r/r0r{s
zUndeclaredNameVisitor.__init__rucCsJ|jdkr8|j|jkr8|j |j¡|j|jkrFtƒ‚n|j |j¡dS)NÚload)ÚctxrJrorrr£rqÚdiscardrzr/r/r0Ú
visit_Names
 z UndeclaredNameVisitor.visit_NamecCsdS)zStop visiting a blocks.Nr/rzr/r/r0r¦!sz!UndeclaredNameVisitor.visit_Block) r|r}r~ršr3ÚIterablerfr{r
ÚNamer­r©r¦r/r/r/r0rpsrpc@seZdZdZdS)Ú CompilerExitz¼Raised if the compiler encountered a situation where it just
    doesn't make sense to further process the code.  Any block that
    raises such an exception is not further processed.
    Nrr/r/r/r0r°%sr°c    @sJeZdZUdëdejeejeejejeeddœdd„Ze    edœd    d
„ƒZ
ee d d œd d„Z edœdd„Z eddœdd„Zdìeeddœdd„Zddœdd„Zdíe ddœdd„Zdîeejejddœdd„Zeddœd d!„Zdïeeejejdd"œd#d$„Zejejedd%œd&d'„Zedd(œd)d*„Zdðeejeje dd,œd-d.„Zdñejeje dd/œd0d1„Zdòejejejej feejej!eej"fdd2œd3d4„Z#ejejdd5œd6d7„Z$eddœd8d9„Z%dóeedd:œd;d<„Z&dôeeed?œd@dA„Z'eedBœdCdD„Z(ejej)ej*feej+ee,fdEœdFdG„Z-e,eddHœdIdJ„Z.ejedKœdLdM„Z/eedœdNdO„Z0ddœdPdQ„Z1eddœdRdS„Z2ddœdTdU„Z3eddVœdWdX„Z4eddVœdYdZ„Z5ddœd[d\„Z6edœd]d^„Z7edœd_d`„Z8eedœdadb„Z9eedVœdcdd„Z:ddœdedf„Z;eddœdgdh„Z<dõej=ejeddEœdidj„Z>ej?eddEœdkdl„Z@ejAeddEœdmdn„ZBejCeddEœdodp„ZDejejEejFfeddEœdqdr„ZGejEeddEœdsdt„ZHejFeddEœdudv„ZIejJeddEœdwdx„ZKejLeddEœdydz„ZMej)eddEœd{d|„ZNej*eddEœd}d~„ZOejPeddEœdd€„ZQejReddEœdd‚„ZSejTeddEœdƒd„„ZUGd…d†„d†ejVƒZWeXej"ej"d‡œdˆd‰„ƒZYdZZejeWe[dŠ<eWdœd‹dŒ„Z\ejej"edœdŽd„Z]ej^eeWedœd‘d’„Z_ej^eeWddœd“d”„Z`ej^eeWddœd•d–„ZaejbeddEœd—d˜„ZcejdeddEœd™dš„ZeejfeddEœd›dœ„ZgejheddEœddž„ZiejjeddEœdŸd „ZkejleddEœd¡d¢„ZmejneddEœd£d¤„Zoej+eddEœd¥d¦„ZpejqeddEœd§d¨„ZrejseddEœd©dª„Zteud«ƒZveud¬ƒZweud­ƒZxeud®ƒZyeud¯ƒZzeud°ƒZ{eud±ƒZ|eud²ƒZ}eud³ƒZ~ed«ƒZ€ed¬ƒZed´ƒZ‚eƒej„eddEœdµd¶„ƒZ…eƒej†eddEœd·d¸„ƒZ‡ejˆeddEœd¹dº„Z‰eƒejŠeddEœd»d¼„ƒZ‹eƒejŒeddEœd½d¾„ƒZejŽeddEœd¿dÀ„Zeejejej feeej‘ddÁœdÂdăZ’eƒejeddEœdÄdńƒZ“eƒej eddEœdÆdDŽƒZ”eƒej•eddEœdÈdɄƒZ–eƒdöejeeddʜdËd̄ƒZ—ej˜eddEœdÍd΄Z™ejšeddEœdÏdЄZ›ejœeddEœdÑd҄ZejžeddEœdÓdԄZŸej eddEœdÕdքZ¡ej¢eddEœd×d؄Z£ej¤eddEœdÙdڄZ¥ej¦eddEœdÛd܄Z§ej¨eddEœdÝdބZ©ejªeddEœdßdà„Z«ej¬eddEœdádâ„Z­ej®eddEœdãdä„Z¯ej°eddEœdådæ„Z±ej²eddEœdçdè„Z³ej´eddEœdédê„ZµdS)÷r#NFTr)r=rJrKrLrMrNr"cCs²|dkrtƒ}||_||_||_||_d|_||_d|_|rFt|ƒ|_i|_    i|_
d|_ d|_ d|_ i|_i|_g|_d|_d|_d|_d|_d|_d|_g|_g|_dg|_dS)NFrr    TÚcontext)rr=rJrKrLZcreated_block_contextrMr*rÚimport_aliasesÚblocksÚextends_so_farÚhas_known_extendsÚ code_linenor rŸÚ
debug_infoÚ_write_debug_infoÚ
_new_linesÚ
_last_lineÚ _first_writeÚ_last_identifierÚ _indentationÚ _assign_stackÚ_param_def_blockÚ_context_reference_stack)r%r=rJrKrLrMrNr/r/r0r{-s8    
zCodeGenerator.__init__rŽcCs
|jdk    Sr))r*r¡r/r/r0rNvszCodeGenerator.optimizedz te.NoReturn)ÚmsgÚlinenor"cCst|||j|jƒ‚dS)z*Fail with a :exc:`TemplateAssertionError`.N)r rJrK)r%rÁrÂr/r/r0Úfail|szCodeGenerator.failcCs|jd7_d|j›S)zGet a new unique identifier.r    Zt_)r¼r¡r/r/r0Útemporary_identifier€sz"CodeGenerator.temporary_identifier)r'r"cCs | ¡|_| |j›d¡dS)z7Enable buffering for the frame from that point onwards.z = []N)rÄr‡Ú    writeline©r%r'r/r/r0r‡…s
zCodeGenerator.buffer)r'Úforce_unescapedr"cCs¤|sŒ|jjrl| d¡| ¡| d|j›d¡| ¡| d¡| ¡| d|j›d¡| ¡dS|jjrŒ| d|j›d¡dS| d|j›d¡dS)z(Return the buffer contents of the frame.zif context.eval_ctx.autoescape:zreturn Markup(concat(ú))úelse:zreturn concat(r<N)r+r,rÅÚindentr‡ÚoutdentÚ
autoescape)r%r'rÇr/r/r0Úreturn_buffer_contentsŠs
 
z$CodeGenerator.return_buffer_contentscCs|jd7_dS)zIndent by one.r    N©r½r¡r/r/r0rʞszCodeGenerator.indentr    )Ústepr"cCs|j|8_dS)zOutdent by step.NrÎ)r%rÏr/r/r0rË¢szCodeGenerator.outdent)r'r&r"cCs0|jdkr| d|¡n| |j›d|¡dS)z%Yield or write into the frame buffer.Núyield ú.append()r‡rÅ)r%r'r&r/r/r0Ú start_write¦s
zCodeGenerator.start_writecCs|jdk    r| d¡dS)z1End the writing process started by `start_write`.Nr<)r‡r?rÆr/r/r0Ú    end_write­s
zCodeGenerator.end_write)Úsr'r&r"cCs$| ||¡| |¡| |¡dS)z4Simple shortcut for start_write + write + end_write.N)rÒr?rÓ)r%rÔr'r&r/r/r0Ú simple_write²s 
zCodeGenerator.simple_write)r
r'r"cCs>z$| d¡|D]}| ||¡qWntk
r8YnXdS)z•Visit a list of nodes as block in a frame.  If the current frame
        is no buffer a dummy ``if 0: yield None`` is written automatically.
        ÚpassN)rÅr-r°)r%r
r'r&r/r/r0Ú
blockvisitºs 
zCodeGenerator.blockvisit)Úxr"cCs€|jrp|jsR|j d|j¡|j|j7_|jdk    rR|j |j|jf¡d|_d|_|j d|j¡d|_|j |¡dS)z&Write a string into the output stream.Ú
NFz    r)    r¹r»rLr?r¶r¸r·Úappendr½)r%rØr/r/r0r?Ås
zCodeGenerator.writer)rØr&Úextrar"cCs| ||¡| |¡dS)z!Combination of newline and write.N)Únewliner?)r%rØr&rÛr/r/r0rÅÓs zCodeGenerator.writeline)r&rÛr"cCs:t|jd|ƒ|_|dk    r6|j|jkr6|j|_|j|_dS)z/Add one or more newlines before the next write.r    N)Úmaxr¹rÂrºr¸)r%r&rÛr/r/r0rÜÚszCodeGenerator.newline)r&r'Ú extra_kwargsr"c    Cs²tdd„tdd„|jDƒ|pdƒDƒƒ}|jD]}| d¡| ||¡q.|s |jD]}| d¡| ||¡qT|dk    r | ¡D]\}}| d|›d|›¡q€|jr¾| d¡| |j|¡|rŠ|jdk    rÚ| d    ¡n
| d
¡|jD].}| |j    ›d ¡| |j
|¡| d¡qê|dk    rN| ¡D] \}}| |›d |›d¡q,|jdk    r~| d ¡| |j|¡| d ¡n
| d¡n$|jdk    r®| d¡| |j|¡dS)a+Writes a function call to the stream for the current node.
        A leading comma is added automatically.  The extra keyword
        arguments may not include python keywords otherwise a syntax
        error could occur.  The extra keyword arguments should be given
        as python dict.
        css|]}tt t|¡ƒVqdSr))Úis_python_keywordr3r5rf)rYr]r/r/r0r[ïsÿz*CodeGenerator.signature.<locals>.<genexpr>css|] }|jVqdSr))Úkey©rYrØr/r/r0r[ñsr/r9Nú=z, *z
, **dict({z, **{ú: z}, **r<Ú}z, **) Úanyrr(Úargsr?r-rmZdyn_argsZ
dyn_kwargsràrV)    r%r&r'rÞZkwarg_workaroundÚargÚkwargràrVr/r/r0Ú    signatureásFþ
 
 
 
 
 
 
 
 
 
 
zCodeGenerator.signature)r
r"c
Cs tƒ}|D]}| |¡q
|j|jdf|j|jdffD]Ð\}}}t|ƒD]¼}||kr`| ¡||<| d¡| ¡| ||›d|›d|›d¡| ¡| d¡| ¡| d¡| d    ||›d
¡| ¡| d |d d …›d|›d¡| ¡| ¡qHq6d S)aæFind all filter and test names used in the template and
        assign them to variables in the compiled namespace. Checking
        that the names are registered with the environment is done when
        compiling the Filter and Test nodes. If the node is in an If or
        CondExpr node, the check is done at runtime instead.
 
        .. versionchanged:: 3.0
            Filters and tests in If and CondExpr nodes are checked at
            runtime instead of compile time.
        rŸr útry:z = environment.ú[ú]zexcept KeyError:z @internalcodeúdef z
(*unused):zraise TemplateRuntimeError("No Néÿÿÿÿú named z     found."))    ržr-rŸr ÚsortedrÄrÅrÊrË)r%r
rDr&Zid_maproÚ
dependencyrJr/r/r0Úpull_dependenciess2   ý  
 
 
ÿzCodeGenerator.pull_dependenciesc    Csªg}|jj ¡D]z\}\}}|tkr&q|tkrP| |›d| ¡›d|›d¡q|tkrn| |›d|›¡q|tkr‚|     |¡qt
dƒ‚q|r¦| d  |¡›d¡dS)Nú = r:r<zunknown load instructionú
 = missing) r…ÚloadsrmrrrÅÚget_resolve_funcr rrÚÚNotImplementedErrorÚjoin)r%r'ÚundefsÚtargetÚactionÚparamr/r/r0Ú enter_frameEs" 
zCodeGenerator.enter_frame)r'Úwith_python_scoper"cCs>|s:g}|jjD]}| |¡q|r:| d |¡›d¡dS)Nrórô)r…rõrÚrÅrø)r%r'rþrùrúr/r/r0Ú leave_frameUs   zCodeGenerator.leave_frameúasync Ú)Ú async_valueÚ
sync_valuer"cCs|jjr |S|Sr))r=Úis_async)r%rrr/r/r0Ú choose_async]szCodeGenerator.choose_async)rJr"cCs| ¡›d|›S)Nrí)r)r%rJr/r/r0Úfunc`szCodeGenerator.func)r&r'r"c Csš| ¡}|j |¡t|ƒ}d}tƒ}g}t|jƒD]@\}}|jdkrJ|}|jdkr`| |j¡|     |j 
|j¡¡q4t |j dƒ}    d|    krè|dk    rÐz|j |t|jƒWqâtk
rÌ| d|j¡YqâXn|     |j d¡¡d|_d|    krd|kr|     |j d¡¡d|_d|    kr@d|kr@|     |j d¡¡d|_d    |_|j |¡| | d
¡›d d  |¡›d |¡| ¡| |¡| |¡| |¡t|jƒD]°\}}|j 
|j¡}
| d|
›d¡| ¡z|j |t|jƒ} Wn6tk
r$| |
›d|j›d|j›d¡YnX| |
›d¡| | |¡| |
¡|  ¡q¦| !¡| "|j |¡|j#|dd|j$|dd|  ¡||fS)z/Dump the function def of a macro or call block.NÚcaller)r(Úvarargs)rr(rzhWhen defining macros or call blocks the special "caller" argument must be omitted or be given a default.Tr(rFÚmacror:r9ú):úif ú  is missing:z = undefined("parameter z was not provided", name=r<ró)rÇ©rþ)%r˜r…Ú analyze_nodertriÚ    enumeraterærJr£rÚÚrefrsÚbodyÚdefaultsÚlenÚ
IndexErrorrÃrÂÚdeclare_parameterrwrxryr†rÅrrørÊr‡rýÚpush_parameter_definitionsr-Úmark_parameter_storedrËÚpop_parameter_definitionsr×rÍrÿ) r%r&r'Ú    macro_refZexplicit_callerZskip_special_paramsræÚidxrçrrrÚdefaultr/r/r0Ú
macro_bodycsr 
 
  ü  $
 
 
ÿ
 
 zCodeGenerator.macro_body)rr'r"c Csrd dd„|jjDƒ¡}t|jddƒ}t|jjƒdkr>|d7}| d|›d    |›d
|j›d|j›d|j›d  ¡dS) z<Dump the macro definition for the def created by macro_body.r9css|]}t|jƒVqdSr))ÚreprrJrár/r/r0r[¸sz*CodeGenerator.macro_def.<locals>.<genexpr>rJNr    ú,zMacro(environment, macro, z, (z), z, context.eval_ctx.autoescape))    rør&ræÚgetattrrr?rxryrw)r%rr'Z    arg_tuplerJr/r/r0Ú    macro_def¶s(ÿzCodeGenerator.macro_defrucCs*d|j›}|jdk    r&|›d|j›}|S)z.Return a human readable position for the node.zline Nú in )rÂrJ)r%r&r–r/r/r0ÚpositionÂs 
zCodeGenerator.positioncCs*d dd„|j ¡ ¡Dƒ¡}d|›dS)Nr9css |]\}}|›d|›VqdS©rãNr/)rYrJrúr/r/r0r[Êsÿz3CodeGenerator.dump_local_context.<locals>.<genexpr>Ú{rä)rør…Z dump_storesrm)r%r'Zitems_kvr/r/r0Údump_local_contextÉs
 þz CodeGenerator.dump_local_contextcCs6| d¡| d¡| d¡| d¡| d¡dS)z·Writes a common preamble that is used by root and block functions.
        Primarily this sets up common local helpers and enforces a generator
        through a dead branch.
        z$resolve = context.resolve_or_missingz!undefined = environment.undefinedzconcat = environment.concatzcond_expr_undefined = Undefinedzif 0: yield NoneN©rÅr¡r/r/r0Ú write_commonsÐs
 
 
 
 
zCodeGenerator.write_commonscCs|j |j ¡¡dS)aQPushes all parameter targets from the given frame into a local
        stack that permits tracking of yet to be assigned parameters.  In
        particular this enables the optimization from `visit_Name` to skip
        undefined expressions for parameters in macros as macros can reference
        otherwise unbound parameters.
        N)r¿rÚr…Zdump_param_targetsrÆr/r/r0rÝsz(CodeGenerator.push_parameter_definitionscCs|j ¡dS)z+Pops the current parameter definitions set.N)r¿Úpopr¡r/r/r0ræsz'CodeGenerator.pop_parameter_definitions)rúr"cCs|jr|jd |¡dS)z€Marks a parameter in the current parameter definitions as stored.
        This will skip the enforced undefined checks.
        rîN)r¿r¬©r%rúr/r/r0rêsz#CodeGenerator.mark_parameter_storedcCs|j |¡dSr))rÀrÚr)r/r/r0Úpush_context_referenceñsz$CodeGenerator.push_context_referencecCs|j ¡dSr))rÀr(r¡r/r/r0Úpop_context_referenceôsz#CodeGenerator.pop_context_referencecCs
|jdS)Nrî©rÀr¡r/r/r0Úget_context_ref÷szCodeGenerator.get_context_refcCs |jd}|dkrdS|›dS)Nrîr±Úresolvez.resolver,r)r/r/r0röús
zCodeGenerator.get_resolve_funccCs| ¡›d| |¡›dS)Nz    .derived(r<)r-r%rÆr/r/r0Úderive_contextszCodeGenerator.derive_contextcCs|js
dS||jdkS)z4Checks if a given target is an undeclared parameter.Frî)r¿r)r/r/r0Úparameter_is_undeclaredsz%CodeGenerator.parameter_is_undeclaredcCs|j tƒ¡dS)z+Pushes a new layer for assignment tracking.N)r¾rÚrir¡r/r/r0Úpush_assign_tracking    sz"CodeGenerator.push_assign_trackingcCsˆ|j ¡}|js|js|jr |s$dSdd„|Dƒ}t|ƒdkr®tt|ƒƒ}|j     |¡}|jrv| 
d|›d|›¡dS|jr–| 
d|›d|›¡dS| 
d|›d|›¡nx|jrÀ| 
d    ¡n|jrÒ| 
d
¡n
d ¡t |ƒD]6\}}|rú|  d ¡|j     |¡}|  |›d |›¡qä|  d¡|js„|js„|r„t|ƒdkrb| 
d|d›d¡n"d   tt|ƒ¡}| 
d|›d¡dS)zoPops the topmost level for assignment tracking and updates the
        context variables if necessary.
        NcSs g|]}|dd…dkr|‘qS)Nr    Ú_r/rár/r/r0Ú
<listcomp>sz5CodeGenerator.pop_assign_tracking.<locals>.<listcomp>r    z _loop_vars[ú] = z _block_vars[ú context.vars[z_loop_vars.update({z_block_vars.update({úcontext.vars.update({r9rãú})úcontext.exported_vars.add(rr<zcontext.exported_vars.update((rÈ)r¾r(rŒr‹r‰rÚnextÚiterr…rrÅrr?røÚmapr)r%r'ÚvarsZ public_namesrJrrÚ    names_strr/r/r0Úpop_assign_tracking sJ
ÿþýü     
 
 
z!CodeGenerator.pop_assign_trackingc    Cs |dkstdƒ‚t|j|jƒ}ddlm}m}|jjrDt||ƒ}nt|ƒ}|     dd 
|¡¡|j rjdnd}|  t j¡dk    }| t j¡D]4}    |    j|jkr²| d|    j›d    |    j¡|    |j|    j<qŠ| t j¡D]v}
|
j|jkrÌ|
j} | ¡|j| <} d
| kr,|  d
d¡\} }|     d | ›d |›d | ›¡qÌ|     d| ›d | ›¡qÌ|     d|j›¡|j    | d¡›d|›ddd| ¡| ¡t|ƒ}dt|jdƒkr¼|j  d¡}|     |›d¡|j !|¡d|_"|_#|oà|j$ |_%|rô|     d¡| &|¡| '|j¡| (|j|¡|j)|dd| *¡|r¢|j$sN| ¡|     d¡| ¡|jjsl|     d¡n$|     d¡| ¡|     d¡| *¡| *d|j$ ¡|j +¡D]\}}    |     | d|¡›d|›d|    d¡| ¡| ¡t|ƒ}d|_,t|    jdƒ}d|kr*|j  d¡}|     |›d¡d |kr\|j  d ¡}|     |›d!|›d"|›d#¡|j !|    ¡||_-|     d$¡| &|¡| '|    j¡| (|    j|¡|j)|dd| *¡q¬d 
d%d&„|jDƒ¡}|j    d'|›d(ddd) 
d*d&„|j.Dƒ¡}|     d+|›¡dS),Nzno root frame allowedr    )ÚexportedÚasync_exportedzfrom jinja2.runtime import r9rz, environment=environmentzblock z defined twiceÚ.zfrom z import z as zimport zname = Úrootz(context, missing=missingr
)rÛr%r¡z = TemplateReference(context)Tzparent_template = Noner úif parent_template is not None:z4yield from parent_template.root_render_func(context)z=async for event in parent_template.root_render_func(context):z yield eventZblock_)r%ÚsuperrDz = context.super(z, block_r<z_block_vars = {}css|]}|›d|›VqdS)z: block_Nr/rár/r/r0r[«sz/CodeGenerator.visit_Template.<locals>.<genexpr>z
blocks = {räú&css |]\}}|›d|›VqdS)râNr/r\r/r/r0r[­sz debug_info = )/ÚAssertionErrorrr=rJZruntimer?r@rrðrÅrørMÚfindr
ÚExtendsÚfind_allr©r³rÃrÂÚ ImportedNameÚ
importnamer²rÄÚrsplitrrÊr'r$rsrr…rrr‰rŠrµr†rýròr×rÿrËrmrŒrˆr·)r%r&r'r+r?r@Zexported_namesZenvenvZ have_extendsrˆÚimport_ÚimpÚaliasÚmoduleÚobjrrJrŒrrZ blocks_kv_strZ debug_kv_strr/r/r0Úvisit_Template:sª  
ÿ   
 
 
 
 ÿ
ý 
 
 
 
  zCodeGenerator.visit_TemplatecCsd}|jr8|jrdS|jdkr8| d¡| ¡|d7}|jrJ| |¡}n| ¡}|jr”| d|j    ›d|¡| ¡| d|j    ›d|¡| 
¡|j j sÄ|j dkrÄ| d    |j    ›d
|›d |¡n@| | ¡›d |j    ›d
|›d |¡| ¡| d|¡| 
¡| 
|¡dS)z.Call a block and register it for the template.rNúif parent_template is None:r    zif len(context.blocks[z]) <= 1:z+raise TemplateRuntimeError("Required block z  not found")zyield from context.blocks[z][0](r<zfor event in context.blocks[r
Úevent)r‰rµr´rÅrÊÚscopedr/r-ÚrequiredrJrËr=rr‡rrÕ)r%r&r'rƒr±r/r/r0r¦°s@
 
  þÿý zCodeGenerator.visit_BlockcCsÆ|js| d|j¡|jdkrV|js6| d¡| ¡| d¡|jrNtƒ‚n| ¡| d|¡|     |j
|¡|  d|j ›d¡| d¡| ¡| d    ¡| ¡|j r´d
|_|jd 7_d S) zCalls the extender.z,cannot use extend from a non top-level scoperrCz5raise TemplateRuntimeError("extended multiple times")z+parent_template = environment.get_template(r9r<z9for name, parent_block in parent_template.blocks.items():z8context.blocks.setdefault(name, []).append(parent_block)Tr    N)r‰rÃrÂr´rµrÅrÊr°rËr-Útemplater?rJrŠrBr/r/r0Ú visit_ExtendsÛs(
 
 
 
 
zCodeGenerator.visit_ExtendscCsp|jr| d¡| ¡d}t|jtjƒrVt|jjtƒr>d}qnt|jjt    t
fƒrnd}nt|jtj tj fƒrnd}| d|›d|¡|  |j|¡| d|j›d¡|jrè| ¡| d    ¡| ¡| d
¡| ¡| d ¡| ¡d }|jr| | ¡›d | |¡›d¡n$|jjr,| d¡n| d¡d}|s\| ¡| d|¡| ¡|jrl| ¡dS)zHandles includes.rêZget_or_select_templateZ get_templateZselect_templateztemplate = environment.r:r9r<zexcept TemplateNotFound:rÖrÉFzUfor event in template.root_render_func(template.new_context(context.get_all(), True, z)):zGfor event in (await template._get_default_module_async())._body_stream:z6yield from template._get_default_module()._body_streamTrTN)Zignore_missingrÅrÊrOrWr
ÚConstrVrfrgrhÚTupleÚListr-r?rJrËÚ with_contextrr%r=rrÕ)r%r&r'Ú    func_nameZskip_event_yieldr/r/r0Ú visit_IncludesN
 
 
 
ÿ
ÿ
 zCodeGenerator.visit_IncludecCsˆ| | d¡›d¡| |j|¡| d|j›d¡|jrld| d¡›}| |›d| |¡›d¡n| d    | d¡›d
¡dS) Núawait zenvironment.get_template(r9z).Z make_moduleZ_asyncz(context.get_all(), True, r<Z_get_default_modulez    (context))r?rr-rWrJr\r%)r%r&r'Úf_namer/r/r0Ú_import_common9sÿzCodeGenerator._import_commoncCsl| |j |j¡›d|¡|jr6| d|j›d¡| ||¡|jrh|j d¡sh| d|j›d¡dS)zVisit regular imports.rór5r4r2úcontext.exported_vars.discard(r<N)rÅr…rrúr‰r?raÚ
startswithrBr/r/r0Ú visit_ImportHs  zCodeGenerator.visit_Importc
    sª| |¡| d¡| |ˆ¡g}g}|jD]Â}t|tƒrF|\}}n|}| ˆj |¡›d|›d¡| dˆj |¡›d¡|     ¡d| 
|¡›d|›}| ˆj |¡›d|›d    |›d
¡|  ¡ˆj r.|  |¡| d ¡s.|  |¡q.|rXt|ƒd kr.|d }| d|›dˆj |¡›¡n*d ‡fdd„|Dƒ¡}| d|›d¡|r¦t|ƒd kr„| d|d ›d
¡n"d tt|ƒ¡}    | d|    ›d¡dS)zVisit named imports.zincluded_template = z = getattr(included_template, z
, missing)r r z9the template {included_template.__name__!r} (imported on z%) does not export the requested name z = undefined(fz, name=r<r2r    rr5r4r9c3s$|]}|›dˆj |¡›VqdSr#)r…r)rYrJ©r'r/r0r[xsz1CodeGenerator.visit_FromImport.<locals>.<genexpr>r6r7rbz)context.exported_vars.difference_update((rÈN)rÜr?rarorOrgrÅr…rrÊr"rËr‰rÚrcrrør;r)
r%r&r'Z    var_namesZdiscarded_namesrJrOÚmessageZnames_kvr=r/rer0Úvisit_FromImportSsN
 
 
 
 
ÿÿÿ
 
  ÿ
ÿzCodeGenerator.visit_FromImportc Cs€| ¡}d|_| ¡}| ¡}|jpRdt|jdddƒkpRtdd„| tj¡Dƒƒ}d}|rh|j     
d¡}|j    j |dd    |j rŽ|j    j |d
d    |j r†| ¡}|j    j |d d    | | |¡›d |j ¡| ¡| |¡| | d d¡¡| |j|¡| d¡| | dd¡¡| d¡| ¡| d|j ¡| |j |¡| d¡| ¡| d¡| |j|¡| d¡|j|dd|jrÀ| | d¡›d|¡| ¡| |¡|j|_|rÖ| |›d¡| tj¡D],}    |    jdkrâ|    jdkrâ| d|    j¡qâ|j r0| ¡}
| |
›d¡| | d d¡|¡| |j|¡|rx| d|›d| d¡›d¡n
| d¡|j rš| |›d¡|jr®| d ¡nB|jj rÈ|sÈ| d!¡| |j!|¡|jj rð|sð| d"¡|j r| d"¡|jr| d#¡n| |r$d$nd¡| ¡| |¡| d%¡| "|j#|¡|j rl| |
›d&¡| ¡|j||joˆ|j d|j rÚ| d|
›d¡| ¡| |¡| "|j |¡| |¡| ¡|jr`| $|¡| ¡| %||¡| | d'¡›d(¡|jj r*| d!¡| |j!|¡|jj rL| d"¡| d)¡| &|¡|j'r||j'd* (|j    j)¡dS)+NTÚloop)r)Úonly)rhcss|] }|jVqdSr))rU)rYrˆr/r/r0r[’sz*CodeGenerator.visit_For.<locals>.<genexpr>r)Z
for_branchÚelseÚtestz(fiter):z
async for zfor r!zauto_aiter(fiter)Zfiterú:r rÐér z%(reciter, loop_render_func, depth=0):rôÚstorez8Can't assign to special loop variable in for-loop targetz = 1r9ZAsyncz LoopContext(r:Zreciterz auto_aiter(r<z&, undefined, loop_render_func, depth):z , undefined):z_loop_vars = {}z = 0r_zloop(z, loop)rî)*r˜r‹Ú    recursiversZiter_child_nodesrårIr
r©r…rrÚelse_rkrÄrÅrrÊrýrr-rúr?rËrÿr‡r¯r«rJrÃrÂr=rr:r×rrÍrÒrÓr¾Údifference_updateZstores) r%r&r'r‹Z
test_frameZ
else_frameZ extended_loopZloop_refZloop_filter_funcrJZiteration_indicatorr/r/r0Ú    visit_For…sÖÿÿü 
 
 
 
 
 
ÿ
þ 
 
 
 
 
 
ÿ
 
 
 
 
 
 
 
 
zCodeGenerator.visit_ForcCsÊ| ¡}| d|¡| |j|¡| d¡| ¡| |j|¡| ¡|j    D]F}| d|¡| |j|¡| d¡| ¡| |j|¡| ¡qP|j
rÆ| d¡| ¡| |j
|¡| ¡dS)Nr rlzelif rÉ) r™rÅr-rkr?rÊr×rrËÚelif_rp)r%r&r'Zif_framersr/r/r0Úvisit_Ifs& 
 
 
 
 
zCodeGenerator.visit_IfcCs|| ||¡\}}| ¡|jrR|j d¡s>| d|j›d¡| d|j›d¡| |j |j¡›d¡|     ||¡dS)Nr2r8r<r5r4ró)
rrÜr‰rJrcr?rÅr…rr )r%r&r'Z macro_framerr/r/r0Ú visit_Macro%s zCodeGenerator.visit_MacrocCsR| ||¡\}}| d¡| ||¡| ||¡|j|j|dd| |¡dS)Nz    caller = T)Úforward_caller)rrÅr rÒÚ
visit_CallÚcallrÓ)r%r&r'Z
call_framerr/r/r0Úvisit_CallBlock/s 
  zCodeGenerator.visit_CallBlockcCsh| ¡}|j |¡| |¡| |¡| |j|¡| ||¡| |j    |¡| 
|¡|  |¡dSr)) r˜r…rrýr‡r×rrÒr¤ÚfilterrÓrÿ)r%r&r'Z filter_framer/r/r0Úvisit_FilterBlock7s 
 
 
zCodeGenerator.visit_FilterBlockcCs|| ¡}|j |¡| |¡t|j|jƒD]2\}}| ¡| ||¡|     d¡| ||¡q,| 
|j |¡|  |¡dS©Nró) r˜r…rrýÚzipÚtargetsÚvaluesrÜr-r?r×rrÿ)r%r&r'Z
with_framerúÚexprr/r/r0Ú
visit_WithBs 
 
zCodeGenerator.visit_WithcCs| |¡| |j|¡dSr))rÜr-r&rBr/r/r0Úvisit_ExprStmtNs
zCodeGenerator.visit_ExprStmtc@s4eZdZUejejdefed<ejeed<dS)zCodeGenerator._FinalizeInfo.ÚconstÚsrcN)r|r}r~r3r›ÚCallablerfÚ__annotations__r/r/r/r0Ú _FinalizeInfoRs
r‡rUcCst|ƒS)z¼The default finalize function if the environment isn't
        configured with one. Or, if the environment has one, this is
        called on that function's output for constants.
        )rfrnr/r/r0Ú_default_finalizeVszCodeGenerator._default_finalizeÚ    _finalizecsˆjdk    rˆjSˆj}‰d}ˆjjr®d}ˆjj‰tjdtjdtjdi t ˆ¡¡}d}|dkr|t    j
t    j
dœ‡‡fdd„ }n2|›|›d    }|dkr®t    j
t    j
dœ‡‡‡fd
d„ }ˆ  ||¡ˆ_ˆjS) a‰Build the finalize function to be used on constants and at
        runtime. Cached so it's only created once for all output nodes.
 
        Returns a ``namedtuple`` with the following attributes:
 
        ``const``
            A function to finalize constant data at compile time.
 
        ``src``
            Source code to output around nodes to be evaluated at
            runtime.
        Nzenvironment.finalize(r±úcontext.eval_ctxr=rUcs ˆˆ|ƒƒSr)r/rn)rÚ env_finalizer/r0Úfinalize‚sz.CodeGenerator._make_finalize.<locals>.finalizer9csˆˆˆj|ƒƒSr))r=rn©rr‹r%r/r0rŒŠs) r‰rˆr=rŒrr±Ú eval_contextÚgetÚfrom_objr3r4r‡)r%rŒr„Úpass_argr/rr0Ú_make_finalize`s0
 
ýûzCodeGenerator._make_finalize)Úgroupr"cCs tt|ƒƒS)z™Given a group of constant values converted from ``Output``
        child nodes, produce a string to write to the template module
        source.
        )rr)r%r“r/r/r0Ú_output_const_reprsz CodeGenerator._output_const_repr)r&r'rŒr"cCs:| |j¡}|jjrt|ƒ}t|tjƒr0t|ƒS| |¡S)aCTry to optimize a child of an ``Output`` node by trying to
        convert it to constant, finalized data at compile time.
 
        If :exc:`Impossible` is raised, the node is not constant and
        will be evaluated at runtime. Any other exception will also be
        evaluated at runtime for easier debugging.
        )    Úas_constr+rÌrrOr
Ú TemplateDatarfrƒ)r%r&r'rŒrƒr/r/r0Ú_output_child_to_const—s
 z$CodeGenerator._output_child_to_constcCsL|jjr| d¡n|jjr(| d¡n
| d¡|jdk    rH| |j¡dS)zXOutput extra source code before visiting a child of an
        ``Output`` node.
        z1(escape if context.eval_ctx.autoescape else str)(zescape(zstr(N)r+r,r?rÌr„©r%r&r'rŒr/r/r0Ú_output_child_pre¬s  
 
zCodeGenerator._output_child_precCs"| d¡|jdk    r| d¡dS)zWOutput extra source code after visiting a child of an
        ``Output`` node.
        r<N)r?r„r˜r/r/r0Ú_output_child_post¼s
 
z CodeGenerator._output_child_postc    
Csø|jr"|jrdS| d¡| ¡| ¡}g}|jD]ˆ}z,|jsTt|tjƒsTt     ¡‚| 
|||¡}Wn(tj    t fk
rŒ|  |¡Yq4YnX|r°t|dt ƒr°|d  |¡q4|  |g¡q4|jdk    rt|ƒdkrê| |j›d¡n| |j›d¡| ¡|D]ª}t|t ƒrN| |¡}|jdkr>| d|¡n| |d¡nb|jdkrh| d|¡n
| |¡| |||¡| ||¡| |||¡|jdk    r| d¡q|jdk    rä| ¡| t|ƒdkrÞdnd    ¡|jrô| ¡dS)
NrSrîr    rÑz    .extend((rÐrr<rÈ)r†rµrÅrÊr’r
rƒrOr–Ú
Impossibler—Ú    ExceptionrÚrhr‡rr”rÜr™r-ršr?rË)    r%r&r'rŒrÚchildrƒÚitemÚvalr/r/r0Ú visit_OutputÇsZ
 
ý
ú
 
 
 
   zCodeGenerator.visit_OutputcCsF| ¡| |¡| |j|¡| d¡| |j|¡| |¡dSr|)r1rÜr-rúr?r&r>rBr/r/r0Ú visit_Assigns 
 
zCodeGenerator.visit_AssigncCs¶| ¡| ¡}d|_|j |¡| |¡| |¡| |j|¡|     |¡| 
|j |¡|  d¡|j dk    r€| |j |¡n|  d|j›d¡|  d¡| |¡| |¡dS)NFz9 = (Markup if context.eval_ctx.autoescape else identity)(úconcat(r<)r1r˜r†r…rrýr‡r×rrÜr-rúr?rzr¤r>rÿ)r%r&r'rŒr/r/r0Úvisit_AssignBlocks  
 
 
 
 
 
 
zCodeGenerator.visit_AssignBlockc    Cs¨|jdkr4|js|js|jr4|jr4|jd |j¡|j |j¡}|jdkrš|j     |¡}|dk    rv|dt
krv|  |¡rš|  d|j›d|›d|›d¡dS|  |¡dS)    Nrnrîrªrz(undefined(name=z) if z is missing else r<) r«r‰r‹rŒr¾r£rJr…rZ    find_loadrr0r?)r%r&r'rrªr/r/r0r­6s.
ÿÿÿ
 ÿ
þýÿzCodeGenerator.visit_NamecCsV|j |j¡}| d|›d¡| ¡| d¡| ¡| |›d|j›d¡dS)Nzif not isinstance(z , Namespace):zMraise TemplateRuntimeError("cannot assign attribute on non-namespace object")rërì)r…rrJrÅrÊrËÚattr)r%r&r'rr/r/r0Ú visit_NSRefOsÿzCodeGenerator.visit_NSRefcCs8| |j¡}t|tƒr&| t|ƒ¡n| t|ƒ¡dSr))r•r+rOrcr?rfr)r%r&r'rŸr/r/r0Ú visit_Const]s 
zCodeGenerator.visit_ConstcCsJz| t| |j¡ƒ¡Wn*tjk
rD| d|j›d¡YnXdS©Nz6(Markup if context.eval_ctx.autoescape else identity)(r<)r?rr•r+r
r›ÚdatarBr/r/r0Úvisit_TemplateDatads  ÿz CodeGenerator.visit_TemplateDatacCsV| d¡d}t|jƒD]"\}}|r.| d¡| ||¡q| |dkrLdnd¡dS)Nr:rîr9rz,)r<©r?rrmr-©r%r&r'rržr/r/r0Ú visit_Tuplels
 
zCodeGenerator.visit_TuplecCsF| d¡t|jƒD]"\}}|r*| d¡| ||¡q| d¡dS)Nrër9rìrªr«r/r/r0Ú
visit_Listus 
 
zCodeGenerator.visit_ListcCs`| d¡t|jƒD]<\}}|r*| d¡| |j|¡| d¡| |j|¡q| d¡dS)Nr$r9rãrä)r?rrmr-ràrVr«r/r/r0Ú
visit_Dict}s
 
 
zCodeGenerator.visit_Dictú+ú-Ú*ú/z//z**ú%ÚandÚorznot cCs`|jjrd}n|jjrd}nd}| |›d¡|jD]}| ||¡| d¡q6| d¡dS)Nz8(markup_join if context.eval_ctx.volatile else str_join)Z markup_joinZstr_joinz((r9rÈ)r+r,rÌr?r
r-)r%r&r'r]rçr/r/r0Ú visit_Concat”s
  zCodeGenerator.visit_ConcatcCs>| d¡| |j|¡|jD]}| ||¡q| d¡dS)Nr:r<)r?r-r€Úops)r%r&r'r7r/r/r0Ú visit_Compare¢s
 
 
zCodeGenerator.visit_ComparecCs*| dt|j›d¡| |j|¡dS)Nr;)r?Ú    operatorsr7r-r€rBr/r/r0Ú visit_OperandªszCodeGenerator.visit_OperandcCsT|jjr| d¡| d¡| |j|¡| d|j›d¡|jjrP| d¡dS)Nú(await auto_await(zenvironment.getattr(r9r<rÈ)r=rr?r-r&r¤rBr/r/r0Ú visit_Getattr®s
 
zCodeGenerator.visit_GetattrcCs¢t|jtjƒr@| |j|¡| d¡| |j|¡| d¡n^|jjrR| d¡| d¡| |j|¡| d¡| |j|¡| d¡|jjrž| d¡dS)Nrërìr»zenvironment.getitem(r9r<rÈ)    rOrçr
ÚSlicer-r&r?r=rrBr/r/r0Ú visit_Getitemºs
 
 
 
 
zCodeGenerator.visit_GetitemcCs`|jdk    r| |j|¡| d¡|jdk    r:| |j|¡|jdk    r\| d¡| |j|¡dS)Nrl)Ústartr-r?ÚstoprÏrBr/r/r0Ú visit_SliceÏs
 
 
 
 
zCodeGenerator.visit_Slice)r&r'Ú    is_filterr"ccs|jjr| d¡|r@| |j|j›d¡|jj |j¡}n(| |j|j›d¡|jj |j¡}|dkr |js |r~dnd}| d|›d|j›d|j    ¡t
j dt
j d    t
jd
i t
  |¡¡}|dk    rÚ| |›d ¡dV| ||¡| d ¡|jjr
| d ¡dS)Nr»r:rzrkzNo rïrAr±rŠr=r9r<rÈ)r=rr?rŸrJrr rrÃrÂrr±rŽrré)r%r&r'rÂrZ    type_namer‘r/r/r0Ú_filter_test_commonÙs4
 ýû 
 
z!CodeGenerator._filter_test_commonc    Cs| ||d¡x|jdk    r*| |j|¡nX|jjrP| d|j›d|j›d¡n2|jjrn| d|j›d¡n| d|j›d¡W5QRXdS)NTz(Markup(concat(z.)) if context.eval_ctx.autoescape else concat(rÈzMarkup(concat(r¢r<)rÃr&r-r+r,r?r‡rÌrBr/r/r0r¤s
ÿzCodeGenerator.visit_Filterc    Cs,| ||d¡| |j|¡W5QRXdSrv)rÃr-r&rBr/r/r0r¥szCodeGenerator.visit_Testcslˆ ¡‰ddœ‡‡‡fdd„ }ˆ d¡ˆ ˆjˆ¡ˆ d¡ˆ ˆjˆ¡ˆ d¡|ƒˆ d¡dS)NrŽcs8ˆjdk    rˆ ˆjˆ¡dSˆ dˆ ˆ¡›d¡dS)Nz1cond_expr_undefined("the inline if-expression on z6 evaluated to false and no else section was defined."))Zexpr2r-r?r"r/©r'r&r%r/r0Ú write_expr2s 
ÿz1CodeGenerator.visit_CondExpr.<locals>.write_expr2r:z if z else r<)r™r?r-Úexpr1rk)r%r&r'rÅr/rÄr0Úvisit_CondExprs
 
 
zCodeGenerator.visit_CondExpr)r&r'rvr"cCsÈ|jjr| d¡|jjr&| d¡n
| d¡| |j|¡|rJddind}|jr\ddini}|jrnddini}|r†|j|f|Žn|sŽ|ršt    |f|Ž}| 
|||¡| d¡|jjrÄ| d¡dS)    Nr»zenvironment.call(context, z context.call(rZ
_loop_varsZ _block_varsr<rÈ) r=rr?r>r-r&r‹rŒr“rlré)r%r&r'rvrÞZ loop_kwargsZ block_kwargsr/r/r0rw0s"
 
 
zCodeGenerator.visit_CallcCs"| |jd¡| |j|¡dS)Nrâ)r?ràr-rVrBr/r/r0Ú visit_KeywordGszCodeGenerator.visit_KeywordcCs&| d¡| |j|¡| d¡dS)NzMarkup(r<©r?r-r€rBr/r/r0Úvisit_MarkSafeMs
zCodeGenerator.visit_MarkSafecCs&| d¡| |j|¡| d¡dSr§rÉrBr/r/r0Úvisit_MarkSafeIfAutoescapeRs
z(CodeGenerator.visit_MarkSafeIfAutoescapecCs| d|j¡dS)Nz environment.©r?rJrBr/r/r0Úvisit_EnvironmentAttributeYsz(CodeGenerator.visit_EnvironmentAttributecCs| d|j›d|j›¡dS)Nzenvironment.extensions[z].)r?Ú
identifierrJrBr/r/r0Úvisit_ExtensionAttribute^sz&CodeGenerator.visit_ExtensionAttributecCs| |j|j¡dSr))r?r²rKrBr/r/r0Úvisit_ImportedNamecsz CodeGenerator.visit_ImportedNamecCs| |j¡dSr)rÌrBr/r/r0Úvisit_InternalNamefsz CodeGenerator.visit_InternalNamecCs| d¡dS)Nr±)r?rBr/r/r0Úvisit_ContextReferenceisz$CodeGenerator.visit_ContextReferencecCs| | |¡¡dSr))r?r/rBr/r/r0Úvisit_DerivedContextReferencensz+CodeGenerator.visit_DerivedContextReferencecCs| d|¡dS)NÚcontinuer&rBr/r/r0Úvisit_ContinuesszCodeGenerator.visit_ContinuecCs| d|¡dS)NÚbreakr&rBr/r/r0Ú visit_BreakvszCodeGenerator.visit_BreakcCs:| ¡}|j |¡| |¡| |j|¡| |¡dSr))r˜r…rrýr×rrÿ)r%r&r'Ú scope_framer/r/r0Ú visit_Scopeys
 
zCodeGenerator.visit_ScopecCs| ¡}| |›d| |¡›¡| |›d¡| |j|¡| |¡|jdd}|j |¡|     |¡| 
|j |¡|  |¡|  ¡dS)Nróz.vars = T)r—)rÄrÅr/r-r±r*r˜r…rrýr×rrÿr+)r%r&r'r«rØr/r/r0Úvisit_OverlayScope€s
 
 
z CodeGenerator.visit_OverlayScopec    Cst|jD]h}| d|j›d¡| |j|¡z|j |j¡}Wntjk
r\d|j_    YqXt
|j|j|ƒqdS)Nzcontext.eval_ctx.róT) ÚoptionsrÅràr-rVr•r+r
r›r,Úsetattr)r%r&r'ÚkeywordrŸr/r/r0Úvisit_EvalContextModifierŽs
z'CodeGenerator.visit_EvalContextModifiercCsh| ¡}|j ¡}| |›d¡| ||¡|jD]}| ||¡q4|j |¡| d|›d¡dS)Nz = context.eval_ctx.save()zcontext.eval_ctx.revert(r<)rÄr+ÚsaverÅrÞrr-Úrevert)r%r&r'Z old_ctx_nameZ    saved_ctxrr/r/r0Úvisit_ScopedEvalContextModifier›s
 
 z-CodeGenerator.visit_ScopedEvalContextModifier)NFT)F)r    )N)N)Nr)Nr)N)F)rr)N)F)¶r|r}r~r3r›rfÚTextIOrar{ÚpropertyrNrbrÃrÄr$r‡rÍrÊrËr
ÚNoderÒrÓrÕr®r×r?rÅrÜrZCallr§r¨ÚMappingr4réròrýrÿrrr€rrZrtrr r"r%r'rrrr*r+r-rör/r0r1r>rPrRr©r¦rHrXÚIncluder^ZImportZ
FromImportrardrgZForrrZIfrtruryZ FilterBlockr{ZWithrZExprStmtr‚Ú
NamedTupler‡Ú staticmethodrˆr‰r†r’r”r2r—r™ršZOutputr ZAssignr¡Z AssignBlockr£r¯r­ZNSRefr¥rYr¦r–r©r¬r[r­ÚDictr®rGZ    visit_AddZ    visit_SubZ    visit_MulZ    visit_DivZvisit_FloorDivZ    visit_PowZ    visit_ModZ    visit_AndZvisit_OrrIZ    visit_PosZ    visit_NegZ    visit_Notr6ZConcatr¶ZComparer¸ZOperandrºZGetattrr¼ZGetitemr¾r½rÁrÚIteratorrÃr¤r¥ZCondExprrÇrwÚKeywordrÈZMarkSaferÊZMarkSafeIfAutoescaperËZEnvironmentAttributerÍZExtensionAttributerÏrJrÐZ InternalNamerÑZContextReferencerÒZDerivedContextReferencerÓÚContinuerÕZBreakr×ZScoperÙZ OverlayScoperÚZEvalContextModifierrÞZScopedEvalContextModifierrár/r/r/r0r#,s 
ù
ø Iÿþ ÿ
þ  ÿ
þ  üû 9+ þ S      .ÿþ v++4þ  2 
  0þ þ þ O    
 
þ)ÿþþ þ þ þ þ þ þ)NFT)FršÚtypingr3Ú
contextlibrÚ    functoolsrÚiorÚ    itertoolsrrÝrrßZ
markupsaferrrr
Ú
exceptionsr Z
idtrackingr r rrrrr*rÚutilsrrrDrÚ TYPE_CHECKINGZtyping_extensionsÚter=rÚTypeVarr…r4rr¹r6rfrErGrHrIrPr›rârarTrXr®räÚSetrsrtr$Ú RuntimeErrorrqržrprœr°r#r/r/r/r0Ú<module>s~                    ø "þ ù
ø 
þ S