o ÂÏgzã@sdZddlZddlmZddlmZddlmZddl 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*fdZ+dddddd d!d"d#œZ,d$e+d%e+fd&d'„Z-d(e.d%ej)d)ej/d*gdffd+d,„Z0d(e.d%ej)d)ej1d*gdffd-d.„Z2  / 0dNd1ej3d2d3d4ej4e.d5ej4e.d6ej4ej5d7e6d8e6d%ej4e.fd9d:„Z7d;ej*d%e6fdej9ej:d?ej9e.d%ej;e.fd@dA„ZGdEdF„dFe?ƒZ@GdGdH„dHe"ƒZAGdIdJ„dJe"ƒZBGdKdL„dLeCƒZDGdMd)„d)e"ƒZEdS)Oz0Compiles 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>=ú.new_func)r ÚExprÚtÚAnyrÚcastr)r#r4r2r1r3Ú optimizeconst+sÿÿÿÿþ r9Úopr&r)c ó(tdddtjdtddf‡fdd„ ƒ}|S)Nr%r&r'r(r$cs”|jjr'ˆ|jjvr'| dˆ›d¡| |j|¡| d¡| |j|¡n| d¡| |j|¡| dˆ›d¡| |j|¡| d¡dS)Nz environment.call_binop(context, ú, ú(ú ú))Ú environmentÚ sandboxedÚintercepted_binopsÚwriter/ÚleftÚright©r%r'r(©r:r2r3Úvisitor<sÿ   z_make_binop..visitor)r9r ÚBinExprr)©r:rHr2rGr3Ú _make_binop;s"rKc r;)Nr%r&r'r(r$cs`|jjrˆ|jjvr| dˆ›d¡| |j|¡n| dˆ¡| |j|¡| d¡dS)Nzenvironment.call_unop(context, r<r=r?)r@rAÚintercepted_unopsrCr/r'rFrGr2r3rHTsÿ z_make_unop..visitor)r9r Ú UnaryExprr)rJr2rGr3Ú _make_unopQs" rNFTr'r@rÚnameÚfilenameÚstreamÚ defer_initÚ optimizedcCsHt|tjƒs tdƒ‚| ||||||¡}| |¡|dur"|j ¡SdS)z+Generate the python source for a node tree.z Can't compile non template nodesN)Ú isinstancer ÚTemplateÚ TypeErrorÚcode_generator_classr/rQÚgetvalue)r'r@rOrPrQrRrSÚ generatorr2r2r3Úgeneratees  ÿ  rZÚvaluecCs†|dus |tus |turdSt|ƒttttttt hvrdSt|ƒt t t t hvr0tdd„|DƒƒSt|ƒturAtdd„| ¡DƒƒSdS)z)Does the node have a safe representation?NTcss|]}t|ƒVqdSr+©Ú has_safe_repr)Ú.0Úvr2r2r3Ú †s€z has_safe_repr..css$|] \}}t|ƒo t|ƒVqdSr+r\©r^Úkr_r2r2r3r`‰s€"F)ÚNotImplementedÚEllipsisÚtypeÚboolÚintÚfloatÚcomplexÚrangeÚstrrÚtupleÚlistÚsetÚ frozensetÚallÚdictÚitems©r[r2r2r3r]}s r]r ÚnamescCs<t|ƒ}z|D]}| |¡qW|jStyY|jSw)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 rtrHr'r2r2r3Úfind_undeclaredŽs ÿ þþrxc@s,eZdZdejejejfddfdd„ZdS)ÚMacroRefr'r$NcCs||_d|_d|_d|_dS©NF)r'Úaccesses_callerÚaccesses_kwargsÚaccesses_varargs©r%r'r2r2r3Ú__init__žs zMacroRef.__init__) Ú__name__Ú __module__Ú __qualname__r6ÚUnionr ÚMacroÚ CallBlockrr2r2r2r3rys$ryc @sheZdZdZ  ddedejddejeddfdd„Zdd d „Z dd e ddfd d„Z ddd„Z e Z dS)r)z&Holds compile time information for us.Nr-ÚparentÚlevelr$cCs~||_||_|durt|d|_d|_d|_d|_nt|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‡r2r2r3r¨s   zFrame.__init__cCs2t tt |j¡¡}|j |j¡|j  ¡|_|S)z!Create a copy of the current one.) r6r8r)ÚobjectÚ__new__Ú __class__Ú__dict__Úupdater‰Úcopy©r%Úrvr2r2r3r—Ûs z Frame.copyFÚisolatedcCs&|r t|j|jjddSt|j|ƒS)zReturn an inner frame.r rˆ)r)r-r‰r‡)r%ršr2r2r3Úinnerâs z 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˜r2r2r3Úsoftèsz Frame.soft)NN)r$r)©F)r€rr‚Ú__doc__rr6ÚOptionalrgrr—rfr›rœÚ__copy__r2r2r2r3r)¥s"üþýü û 3  c@óeZdZdZdS)rvz?Exception used by the `UndeclaredNameVisitor` to signal a stop.N©r€rr‚ržr2r2r2r3rvøórvc@sVeZdZdZd dd„Zdejddfdd„Zdejddfd d „Z dej ddfd d „Z dS)ÚDependencyFinderVisitorz.A visitor that collects filter and test calls.r$NcCstƒ|_tƒ|_dSr+)rnÚfiltersÚtests©r%r2r2r3rÿs z DependencyFinderVisitor.__init__r'cCó| |¡|j |j¡dSr+)Ú generic_visitr¥ÚaddrOr~r2r2r3Ú visit_Filteró z$DependencyFinderVisitor.visit_FiltercCr¨r+)r©r¦rªrOr~r2r2r3Ú visit_Testr¬z"DependencyFinderVisitor.visit_TestcCódS)zStop visiting at blocks.Nr2r~r2r2r3Ú visit_Block óz#DependencyFinderVisitor.visit_Block©r$N) r€rr‚ržrr ÚFilterr«ÚTestr­ÚBlockr¯r2r2r2r3r¤üs  r¤c@sPeZdZdZdejeddfdd„Zdej ddfdd „Z dej ddfd d „Z dS) ruz¡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. rtr$NcCst|ƒ|_tƒ|_dSr+)rnrtrw)r%rtr2r2r3rs  zUndeclaredNameVisitor.__init__r'cCsL|jdkr|j|jvr|j |j¡|j|jkrtƒ‚dS|j |j¡dS)NÚload)ÚctxrOrtrwrªrvÚdiscardr~r2r2r3Ú visit_Names  ÿz UndeclaredNameVisitor.visit_NamecCr®)zStop visiting a blocks.Nr2r~r2r2r3r¯!r°z!UndeclaredNameVisitor.visit_Block) r€rr‚ržr6ÚIterablerkrr ÚNamer¸r´r¯r2r2r2r3rus ruc@r¡)Ú 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¢r2r2r2r3r»%r£r»c@sŠ eZdZU   dídddejedejedejejd ed ed dfd d „Ze d efdd„ƒZ dede d dfdd„Z d efdd„Z ded dfdd„Z dîdeded dfdd„Zdïdd„Zdðd e d dfd!d"„Zdñded#ejejd dfd$d%„Zded dfd&d'„Z dñd(eded#ejejd dfd)d*„Zd+ejejded dfd,d-„Zd.ed dfd/d0„Z 1dòd.ed#ejejd2e d dfd3d4„Zdòd#ejejd2e d dfd5d6„Z dñd#ejejejej fded7ejej!eej"fd dfd8d9„Z#d+ejejd dfd:d;„Z$ded dfded dfd?d@„Z&dódCedDed efdEdF„Z'ded efdGdH„Z(d#ejej)ej*fded ej+ee,ffdIdJ„Z-dKe,ded dfdLdM„Z.d#ejd efdNdO„Z/ded efdPdQ„Z0dïdRdS„Z1ded dfdTdU„Z2dïdVdW„Z3dXed dfdYdZ„Z4dXed dfd[d\„Z5dïd]d^„Z6d efd_d`„Z7d efdadb„Z8ded efdcdd„Z9dXed efdedf„Z:dïdgdh„Z;ded dfdidj„Z< dñd#ej=dejed dfdkdl„Z>d#ej?ded dfdmdn„Z@d#ejAded dfdodp„ZBd#ejCded dfdqdr„ZDd#ejejEejFfded dfdsdt„ZGd#ejEded dfdudv„ZHd#ejFded dfdwdx„ZId#ejJded dfdydz„ZKd#ejLded dfd{d|„ZMd#ej)ded dfd}d~„ZNd#ej*ded dfdd€„ZOd#ejPded dfdd‚„ZQd#ejRded dfdƒd„„ZSd#ejTded dfd…d†„ZUGd‡dˆ„dˆejVƒZWeXd‰ej"d ej"fdŠd‹„ƒZYdZZejeWe[dŒ<d eWfddŽ„Z\dejej"d efdd‘„Z]d#ej^ded’eWd efd“d”„Z_d#ej^ded’eWd dfd•d–„Z`d#ej^ded’eWd dfd—d˜„Zad#ejbded dfd™dš„Zcd#ejdded dfd›dœ„Zed#ejfded dfddž„Zgd#ejhded dfdŸd „Zid#ejjded dfd¡d¢„Zkd#ejlded dfd£d¤„Zmd#ejnded dfd¥d¦„Zod#ej+ded dfd§d¨„Zpd#ejqded dfd©dª„Zrd#ejsded dfd«d¬„Zteud­ƒZveud®ƒZweud¯ƒZxeud°ƒZyeud±ƒZzeud²ƒZ{eud³ƒZ|eud´ƒZ}eudµƒZ~ed­ƒZ€ed®ƒZed¶ƒZ‚eƒd#ej„ded dfd·d¸„ƒZ…eƒd#ej†ded dfd¹dº„ƒZ‡d#ejˆded dfd»d¼„Z‰eƒd#ejŠded dfd½d¾„ƒZ‹eƒd#ejŒded dfd¿dÀ„ƒZd#ejŽded dfdÁd„Zed#ejejej fdedÃed ej‘dfdÄdÅ„ƒZ’eƒd#ejded dfdÆdÇ„ƒZ“eƒd#ej ded dfdÈdÉ„ƒZ”eƒd#ej•ded dfdÊdË„ƒZ–eƒ dîd#ejdedÌed dfdÍd΄ƒZ—d#ej˜ded dfdÏdЄZ™d#ejšded dfdÑdÒ„Z›d#ejœded dfdÓdÔ„Zd#ejžded dfdÕdÖ„ZŸd#ej ded dfd×dØ„Z¡d#ej¢ded dfdÙdÚ„Z£d#ej¤ded dfdÛdÜ„Z¥d#ej¦ded dfdÝdÞ„Z§d#ej¨ded dfdßdà„Z©d#ejªded dfdádâ„Z«d#ej¬ded dfdãdä„Z­d#ej®ded dfdådæ„Z¯d#ej°ded dfdçdè„Z±d#ej²ded dfdédê„Z³d#ej´ded dfdëdì„ZµdS)ôr&NFTr@rrOrPrQrRrSr$cCs²|durtƒ}||_||_||_||_d|_||_d|_|r#t|ƒ|_i|_ i|_ d|_ d|_ d|_ i|_i|_g|_d|_d|_d|_d|_d|_d|_g|_g|_dg|_dS)NFrr TÚcontext)rr@rOrPrQÚcreated_block_contextrRr,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@rOrPrQrRrSr2r2r3r-s8   zCodeGenerator.__init__cCs |jduSr+)r,r§r2r2r3rSvs zCodeGenerator.optimizedÚmsgÚlinenoz te.NoReturncCst|||j|jƒ‚)z*Fail with a :exc:`TemplateAssertionError`.)r rOrP)r%rÍrÎr2r2r3Úfail|ózCodeGenerator.failcCs|jd7_d|j›S)zGet a new unique identifier.r Út_)rÈr§r2r2r3Útemporary_identifier€s z"CodeGenerator.temporary_identifierr(cCs | ¡|_| |j›d¡dS)z7Enable buffering for the frame from that point onwards.z = []N)rÒr‹Ú writeline©r%r(r2r2r3r‹…s zCodeGenerator.bufferÚforce_unescapedcCs¤|sF|jjr6| d¡| ¡| d|j›d¡| ¡| d¡| ¡| d|j›d¡| ¡dS|jjrF| 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Õr2r2r3Úreturn_buffer_contentsŠs  z$CodeGenerator.return_buffer_contentscCs|jd7_dS)zIndent by one.r N©rÉr§r2r2r3rØžrÐzCodeGenerator.indentr ÚstepcCs|j|8_dS)zOutdent by step.NrÜ)r%rÝr2r2r3rÙ¢rÐzCodeGenerator.outdentr'cCs2|jdur | d|¡dS| |j›d|¡dS)z%Yield or write into the frame buffer.Núyield ú.append()r‹rÓ)r%r(r'r2r2r3Ú start_write¦s zCodeGenerator.start_writecCs|jdur | d¡dSdS)z1End the writing process started by `start_write`.Nr?)r‹rCrÔr2r2r3Ú end_write­s ÿzCodeGenerator.end_writeÚscCs$| ||¡| |¡| |¡dS)z4Simple shortcut for start_write + write + end_write.N)ràrCrá)r%râr(r'r2r2r3Ú simple_write²s  zCodeGenerator.simple_writer cCs<z| d¡|D]}| ||¡qWdStyYdSw)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'r2r2r3Ú blockvisitºs ÿ ÿzCodeGenerator.blockvisitÚxcCs€|jr8|js)|j d|j¡|j|j7_|jdur)|j |j|jf¡d|_d|_|j d|j¡d|_|j |¡dS)z&Write a string into the output stream.Ú NFz r) rÅrÇrQrCrÂrÄrÃÚappendrÉ)r%rær2r2r3rCÅs zCodeGenerator.writerÚextracCs| ||¡| |¡dS)z!Combination of newline and write.N)ÚnewlinerC)r%rær'rér2r2r3rÓÓs zCodeGenerator.writelinecCsBt|jd|ƒ|_|dur|j|jkr|j|_|j|_dSdSdS)z/Add one or more newlines before the next write.r N)ÚmaxrÅrÎrÆrÄ)r%r'rér2r2r3rêÚs  þzCodeGenerator.newlineÚ extra_kwargsc Cs°tdd„tdd„|jDƒ|pdƒDƒƒ}|jD] }| d¡| ||¡q|sP|jD] }| d¡| ||¡q*|durP| ¡D]\}}| d|›d|›¡q@|jr_| d¡| |j|¡|rÃ|jdurl| d ¡n| d ¡|jD]}| |j ›d ¡| |j |¡| d¡qt|dur¤| ¡D]\}}| |›d |›d¡q”|jdur¼| d ¡| |j|¡| d ¡dS| d¡dS|jdurÖ| d¡| |j|¡dSdS)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_keywordr6r8rk)r^rbr2r2r3r`ïs €ÿ ÿz*CodeGenerator.signature..csó|]}|jVqdSr+)Úkey©r^rær2r2r3r`ñó€r2r<Nú=z, *z , **dict({z, **{ú: z}, **r?ú}z, **) Úanyrr*ÚargsrCr/rrÚdyn_argsÚ dyn_kwargsrïr[) r%r'r(rìÚkwarg_workaroundÚargÚkwargrïr[r2r2r3Ú signatureásHþ              þzCodeGenerator.signaturec Cs tƒ}|D]}| |¡q|j|jdf|j|jdffD]h\}}}t|ƒD]^}||vr0| ¡||<| d¡| ¡| ||›d|›d|›d¡| ¡| d¡| ¡| d¡| d ||›d ¡| ¡| d |d d …›d|›d¡| ¡| ¡q$qd 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 rHr'Úid_maprtÚ dependencyrOr2r2r3Úpull_dependenciess:   ý      ÿÿ ìûzCodeGenerator.pull_dependenciesc Cs¬g}|jj ¡D]<\}\}}|tkrq|tkr(| |›d| ¡›d|›d¡q|tkr7| |›d|›¡q|tkrA|  |¡qt dƒ‚|rT| d  |¡›d¡dSdS)Nú = r=r?zunknown load instructionú = missing) r‰ÚloadsrrrrrÓÚget_resolve_funcr rrèÚNotImplementedErrorÚjoin)r%r(ÚundefsÚtargetÚactionÚparamr2r2r3Ú enter_frameEs" ÿzCodeGenerator.enter_frameÚwith_python_scopecCsF|sg}|jjD]}| |¡q|r!| d |¡›d¡dSdSdS)Nrr)r‰r rèrÓr )r%r(rr rr2r2r3Ú leave_frameUs  ûzCodeGenerator.leave_frameúasync ÚÚ async_valueÚ sync_valuecCs|jjr|S|Sr+)r@Úis_async)r%rrr2r2r3Ú choose_async]ózCodeGenerator.choose_asynccCs| ¡›d|›S)Nr)r)r%rOr2r2r3Úfunc`szCodeGenerator.funcc CsŠ| ¡}|j |¡t|ƒ}d}tƒ}g}t|jƒD] \}}|jdkr%|}|jdvr0| |j¡|  |j  |j¡¡qt |j dƒ} d| vrr|durfz |j |t|jƒWntye| d|j¡Yn w|  |j d¡¡d|_d| vr†d|vr†|  |j d¡¡d|_d| vršd|vrš|  |j d¡¡d|_d |_|j |¡| | d ¡›d d  |¡›d |¡| ¡| |¡| |¡| |¡t|jƒD]V\}}|j  |j¡} | d| ›d¡| ¡z |j |t|jƒ} Wnty | | ›d|j›d|j›d¡Ynw| | ›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=r<ú):úif ú is missing:z = undefined("parameter z was not provided", name=r?r)rÕ©r)%r›r‰Ú analyze_noderyrnÚ enumeraterörOrªrèÚrefrxÚbodyÚdefaultsÚlenÚ IndexErrorrÏrÎÚdeclare_parameterr{r|r}rŠrÓrr rØr‹rÚpush_parameter_definitionsr/Úmark_parameter_storedrÙÚpop_parameter_definitionsrårÛr) r%r'r(Ú macro_refÚexplicit_callerÚskip_special_paramsröÚidxrúrwr%Údefaultr2r2r3Ú macro_bodycsz      üÿ $   ÿÿÿ   zCodeGenerator.macro_bodyr.c Csrd dd„|jjDƒ¡}t|jddƒ}t|jjƒdkr|d7}| d|›d |›d |j›d|j›d|j›d ¡dS) z.rONr ú,zMacro(environment, macro, z, (z), z, context.eval_ctx.autoescape)) r r'röÚgetattrr(rCr|r}r{)r%r.r(Ú arg_tuplerOr2r2r3Ú macro_def¶sÿÿþÿzCodeGenerator.macro_defcCs*d|j›}|jdur|›d|j›}|S)z.Return a human readable position for the node.zline Nú in )rÎrO)r%r'r™r2r2r3ÚpositionÂs  zCodeGenerator.positioncCs*d dd„|j ¡ ¡Dƒ¡}d|›dS)Nr<css"|] \}}|›d|›VqdS©róNr2)r^rOrr2r2r3r`Ês € ÿ ÿz3CodeGenerator.dump_local_context..ú{rô)r r‰Ú dump_storesrr)r%r(Úitems_kvr2r2r3Údump_local_contextÉs  þ z CodeGenerator.dump_local_contextcCs,| 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.undefinedzcond_expr_undefined = Undefinedzif 0: yield NoneN©rÓr§r2r2r3Ú 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‰Údump_param_targetsrÔr2r2r3r+Üsz(CodeGenerator.push_parameter_definitionscCs|j ¡dS)z+Pops the current parameter definitions set.N)rËÚpopr§r2r2r3r-åsz'CodeGenerator.pop_parameter_definitionsrcCs|jr |jd |¡dSdS)z€Marks a parameter in the current parameter definitions as stored. This will skip the enforced undefined checks. rN)rËr·©r%rr2r2r3r,ésÿz#CodeGenerator.mark_parameter_storedcCs|j |¡dSr+)rÌrèrDr2r2r3Úpush_context_referenceðrz$CodeGenerator.push_context_referencecCs|j ¡dSr+)rÌrCr§r2r2r3Úpop_context_referenceósz#CodeGenerator.pop_context_referencecCs |jdS)Nr©rÌr§r2r2r3Úget_context_refös zCodeGenerator.get_context_refcCs |jd}|dkr dS|›dS)Nrr¼Úresolvez.resolverGrDr2r2r3r ùs  zCodeGenerator.get_resolve_funccCs| ¡›d| |¡›dS)Nz .derived(r?)rHr?rÔr2r2r3Úderive_contextÿszCodeGenerator.derive_contextcCs|jsdS||jdvS)z4Checks if a given target is an undeclared parameter.Fr)rËrDr2r2r3Úparameter_is_undeclaredsz%CodeGenerator.parameter_is_undeclaredcCs|j tƒ¡dS)z+Pushes a new layer for assignment tracking.N)rÊrèrnr§r2r2r3Úpush_assign_trackingrÐz"CodeGenerator.push_assign_trackingcCsŽ|j ¡}|js|js|jr|sdSdd„|Dƒ}t|ƒdkrWtt|ƒƒ}|j  |¡}|jr;|  d|›d|›¡dS|jrK|  d|›d|›¡dS|  d|›d|›¡n<|jr`|  d ¡n|jri|  d ¡n|  d ¡t |ƒD]\}}|r}|  d ¡|j  |¡}|  |›d |›¡qr|  d¡|jsÁ|jsÃ|rÅt|ƒdkr®|  d|d›d¡dSd   tt|ƒ¡}|  d|›d¡dSdSdSdS)zoPops the topmost level for assignment tracking and updates the context variables if necessary. NcSs g|] }|dd…dkr|‘qS)Nr Ú_r2rðr2r2r3Ú s z5CodeGenerator.pop_assign_tracking..r z _loop_vars[ú] = z _block_vars[ú context.vars[z_loop_vars.update({z_block_vars.update({úcontext.vars.update({r<róú})úcontext.exported_vars.add(rr?zcontext.exported_vars.update((rÖ)rÊrCrrrr(ÚnextÚiterr‰r%rÓr$rCr Úmapr4)r%r(ÚvarsÚ public_namesrOr%r1Ú names_strr2r2r3Úpop_assign_tracking sL ÿþýü           ûz!CodeGenerator.pop_assign_trackingc Cs |dusJdƒ‚t|j|jƒ}ddlm}m}|jjr"t||ƒ}nt|ƒ}| d¡| dd  |¡¡|j r:dnd}|  t j ¡du}| t j¡D]} | j|jvr^| d | j›d | j¡| |j| j<qJ| t j¡D]:} | j|jvr¥| j} | ¡|j| <} d | vrš|  d d¡\} }| d | ›d |›d| ›¡qk| d| ›d| ›¡qk| d|j›¡|j| d¡›d|›ddd| ¡| ¡t|ƒ}dt|jdƒvrá|j d¡}| |›d¡|j  |¡d|_!|_"|oò|j# |_$|rû| d¡| %|¡| &|j¡| '|j|¡|j(|dd| )¡|rR|j#s(| ¡| d¡| ¡|jjs7| d¡n| d¡| ¡| d¡| )¡| )d|j# ¡|j *¡D]ƒ\}} | | d|¡›d|›d| d¡| ¡| ¡t|ƒ}d|_+t| jd ƒ}d|vr•|j d¡}| |›d¡d!|vr®|j d!¡}| |›d"|›d#|›d$¡|j  | ¡||_,| d%¡| %|¡| &| j¡| '| j|¡|j(|dd| )¡qWd  d&d'„|jDƒ¡}|jd(|›d)ddd*  d+d'„|j-Dƒ¡}| d,|›¡dS)-Nzno root frame allowedr )ÚexportedÚasync_exportedz%from __future__ import generator_stopzfrom jinja2.runtime import r<rz, 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 eventÚblock_)r%Úsuperraz = context.super(z, block_r?z_block_vars = {}css|] }|›d|›VqdS)z: block_Nr2rðr2r2r3r`«s€z/CodeGenerator.visit_Template..z blocks = {rôú&css"|] \}}|›d|›VqdS)ròNr2rar2r2r3r`­s€ z debug_info = ).rr@rOÚruntimer[r\rrrÓr rRÚfindr ÚExtendsÚfind_allr´r¿rÏrÎÚ ImportedNameÚ importnamer¾rÒÚrsplitrrØrAr)rxr&r‰r*r#rrŽrÁrŠrrrårrÙrrrrŒrÃ)r%r'r(r-r[r\Úexported_namesÚenvenvÚ have_extendsrŒÚimport_ÚimpÚaliasÚmoduleÚobjr%rOrrwÚ blocks_kv_strÚ debug_kv_strr2r2r3Úvisit_Template9s¬   €ÿ         ÿ ý          zCodeGenerator.visit_TemplatecCsd}|jr|jr dS|jdkr| d¡| ¡|d7}|jr%| |¡}n| ¡}|jrJ| d|j ›d|¡| ¡| d|j ›d|¡|  ¡|j j sb|j durb| 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)rrÁrÀrÓrØÚscopedrJrHÚrequiredrOrÙr@rr‹rrã)r%r'r(r‡r¼r2r2r3r¯°sF    þÿ ÿÿý zCodeGenerator.visit_BlockcCsÄ|js | d|j¡|jdkr*|js| d¡| ¡| d¡|jr&tƒ‚| ¡| d|¡|  |j |¡|  d|j ›d¡| d¡| ¡| d ¡| ¡|j rYd |_|jd 7_d S) zCalls the extender.z,cannot use extend from a non top-level scoperr_z5raise TemplateRuntimeError("extended multiple times")z+parent_template = environment.get_template(r<r?z9for name, parent_block in parent_template.blocks.items():z8context.blocks.setdefault(name, []).append(parent_block)Tr N)rrÏrÎrÀrÁrÓrØr»rÙr/ÚtemplaterCrOrŽrFr2r2r3Ú visit_ExtendsÛs(      zCodeGenerator.visit_ExtendscCsl|jr | d¡| ¡d}t|jtjƒr+t|jjtƒrd}nt|jjt t fƒr*d}n t|jtj tj fƒr7d}| d|›d|¡|  |j|¡| d|j›d¡|jrt| ¡| d ¡| ¡| d ¡| ¡| d ¡| ¡d }|jrŠ| | ¡›d | |¡›d¡n|jjr”| d¡n| d¡d}|s«| ¡| d|¡| ¡|jr´| ¡dSdS)zHandles includes.rýÚget_or_select_templateÚ get_templateÚselect_templateztemplate = environment.r=r<r?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_streamTrvN)Úignore_missingrÓrØrTryr ÚConstr[rkrlrmÚTupleÚListr/rCrOrÙÚ with_contextrr?r@rrã)r%r'r(Ú func_nameÚskip_event_yieldr2r2r3Ú visit_IncludesV €    þÿÿ   ÿzCodeGenerator.visit_IncludecCsŠ| | d¡›d¡| |j|¡| d|j›d¡|jr7d| d¡›}| |›d| |¡›d¡dS| d | d¡›d ¡dS) Núawait zenvironment.get_template(r<z).Ú make_moduleÚ_asyncz(context.get_all(), True, r?Ú_get_default_modulez (context))rCrr/ryrOr‚r?)r%r'r(Úf_namer2r2r3Ú_import_common9sÿzCodeGenerator._import_commoncCst| |j |j¡›d|¡|jr| d|j›d¡| ||¡|jr6|j d¡s8| d|j›d¡dSdSdS)zVisit regular imports.rrPrOrMúcontext.exported_vars.discard(r?N)rÓr‰r%rrrCr‹Ú startswithrFr2r2r3Ú visit_ImportHs ÿzCodeGenerator.visit_Importc s¼| |¡| d¡| |ˆ¡g}g}|jD]k}t|tƒr#|\}}n|}| ˆj |¡›d|›d¡| dˆj |¡›d¡|  ¡|  |¡  dd¡  dd ¡}d |›d |›}| ˆj |¡›d |›d |›d¡|  ¡ˆj r‚| |¡| d¡s‚| |¡q|r´t|ƒdkrŸ|d}| d|›dˆj |¡›¡nd ‡fdd„|Dƒ¡} | d| ›d¡|rÜt|ƒdkrÉ| d|d›d¡dSd tt|ƒ¡} | d| ›d¡dSdS)zVisit named imports.zincluded_template = z = getattr(included_template, z , missing)r r!r<z{{rôz}}z9the template {included_template.__name__!r} (imported on z%) does not export the requested name z = undefined(fz, name=r?rMr rrPrOr<c3s&|]}|›dˆj |¡›VqdSr;)r‰r%)r^rO©r(r2r3r`}s€ ÿz1CodeGenerator.visit_FromImport..rQrRrŒz)context.exported_vars.difference_update((rÖN)rêrCr‹rtrTrlrÓr‰r%rØr:ÚreplacerÙrrèrr(r rVr4) r%r'r(Ú var_namesÚdiscarded_namesrOror:ÚmessageÚnames_kvrYr2rr3Úvisit_FromImportSs`      ÿÿÿþÿÿ   €  ÿ  ÿûzCodeGenerator.visit_FromImportc Cs|| ¡}d|_| ¡}| ¡}|jp)dt|jdddƒvp)tdd„| tj¡Dƒƒ}d}|r4|j   d¡}|j j |dd |j rG|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|jrÞ| | d¡›d|¡| ¡| |¡|j|_|rè| |›d¡| tj¡D]} | jdkr| jdkr| d| j¡qî|j r| ¡} | | ›d¡| | d d¡|¡| |j|¡|r8| d|›d| d¡›d¡n| d¡|j rI| |›d¡|jrS| d ¡n!|jj r`|s`| d!¡| |j!|¡|jj rt|st| d"¡|j r}| d"¡|jr‡| d#¡n | |rŽd$nd¡| ¡| |¡| d%¡| "|j#|¡|j r²| | ›d&¡| ¡|j||joÀ|j d|j ré| d| ›d¡| ¡| |¡| "|j |¡| |¡| ¡|jr,| $|¡| ¡| %||¡| | d'¡›d(¡|jj r| d!¡| |j!|¡|jj r"| d"¡| d)¡| &|¡|j'r<|j'd* (|j j)¡dSdS)+NTÚloop)r&)Úonly)r–csrîr+)rw)r^rŒr2r2r3r`—rñz*CodeGenerator.visit_For..r&)Ú for_branchÚelseÚtestz(fiter):z async for zfor r9zauto_aiter(fiter)Úfiterú:r rÞér"z%(reciter, loop_render_func, depth=0):rÚstorez8Can't assign to special loop variable in for-loop targetz = 1r<ÚAsyncz LoopContext(r=Úreciterz auto_aiter(r?z&, undefined, loop_render_func, depth):z , undefined):z_loop_vars = {}z = 0r†zloop(z, loop)r)*r›rÚ recursiverxÚiter_child_nodesrõrfr r´r‰r*r#Úelse_ršrÒrÓrrØrrr/rrCrÙrr‹rºr¶rOrÏrÎr@rrUrår&rÛràrárÊÚdifference_updateÚstores) r%r'r(rÚ test_frameÚ else_frameÚ extended_loopÚloop_refÚloop_filter_funcrOÚiteration_indicatorr2r2r3Ú visit_ForŠsÖÿÿü       ÿ þ€         ÿ          ÿzCodeGenerator.visit_ForcCsÎ| ¡}| d|¡| |j|¡| d¡| ¡| |j|¡| ¡|j D]#}| d|¡| |j|¡| d¡| ¡| |j|¡| ¡q(|j re| d¡| ¡| |j |¡| ¡dSdS)Nr rœzelif r×) rœrÓr/ršrCrØrår&rÙÚelif_r£)r%r'r(Úif_framer­r2r2r3Úvisit_Ifs(        üzCodeGenerator.visit_IfcCs|| ||¡\}}| ¡|jr)|j d¡s| d|j›d¡| d|j›d¡| |j |j¡›d¡|  ||¡dS)NrMrSr?rPrOr) r3rêrrOrrCrÓr‰r%r8)r%r'r(Ú macro_framer.r2r2r3Ú visit_Macro*s zCodeGenerator.visit_MacrocCsR| ||¡\}}| d¡| ||¡| ||¡|j|j|dd| |¡dS)Nz caller = T)Úforward_caller)r3rÓr8ràÚ visit_CallÚcallrá)r%r'r(Ú call_framer.r2r2r3Úvisit_CallBlock4s    zCodeGenerator.visit_CallBlockcCsh| ¡}|j |¡| |¡| |¡| |j|¡| ||¡| |j |¡|  |¡|  |¡dSr+) r›r‰r#rr‹rår&ràr«Úfilterrár)r%r'r(Ú filter_framer2r2r3Úvisit_FilterBlock<s     zCodeGenerator.visit_FilterBlockcCs|| ¡}|j |¡| |¡t|j|jƒD]\}}| ¡| ||¡|  d¡| ||¡q|  |j |¡|  |¡dS©Nr) r›r‰r#rÚzipÚtargetsÚvaluesrêr/rCrår&r)r%r'r(Ú with_framerÚexprr2r2r3Ú visit_WithGs    zCodeGenerator.visit_WithcCs| |¡| |j|¡dSr+)rêr/r'rFr2r2r3Úvisit_ExprStmtSr¬zCodeGenerator.visit_ExprStmtc@s4eZdZUejejdefed<ejeed<dS)zCodeGenerator._FinalizeInfo.ÚconstÚsrcN)r€rr‚r6rŸÚCallablerkÚ__annotations__r2r2r2r3Ú _FinalizeInfoWs rÆr[cCst|ƒ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. )rkrsr2r2r3Ú_default_finalize[szCodeGenerator._default_finalizeÚ _finalizecsƈjdurˆjSˆj}‰d}ˆjjrYd}ˆjj‰tjdtjdtjdi t ˆ¡¡}d}|dur?dt j dt j f‡‡fdd „ }n|›|›d }|dkrYdt j dt j f‡‡‡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@r[r$cs ˆˆ|ƒƒSr+r2rs)r2Ú env_finalizer2r3Úfinalize‡s z.CodeGenerator._make_finalize..finalizer<csˆˆˆj|ƒƒSr+)r@rs©r2rÊr%r2r3rËr) rÈrÇr@rËrr¼Ú eval_contextÚgetÚfrom_objr6r7rÆ)r%rËrÃÚpass_argr2rÌr3Ú_make_finalizees.  ýÿüzCodeGenerator._make_finalizeÚgroupcCs tt|ƒƒS)z™Given a group of constant values converted from ``Output`` child nodes, produce a string to write to the template module source. )r4r)r%rÒr2r2r3Ú_output_const_repr•s z CodeGenerator._output_const_reprrËcCs:| |j¡}|jjrt|ƒ}t|tjƒrt|ƒ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ÚrrTr Ú TemplateDatarkrÂ)r%r'r(rËrÂr2r2r3Ú_output_child_to_constœs   z$CodeGenerator._output_child_to_constcCsP|jjr | d¡n|jjr| d¡n| d¡|jdur&| |j¡dSdS)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.rCrÚrér%r'r(rËr2r2r3Ú_output_child_pre±s    ÿzCodeGenerator._output_child_precCs&| d¡|jdur| d¡dSdS)zWOutput extra source code after visiting a child of an ``Output`` node. r?N)rCrÃr×r2r2r3Ú_output_child_postÁs  ÿz CodeGenerator._output_child_postc Csä|jr|jrdS| d¡| ¡| ¡}g}|jD]A}z|js*t|tjƒs*t  ¡‚|  |||¡}Wntj t fyC|  |¡Yqw|rUt|dt ƒrU|d  |¡q|  |g¡q|jdur~t|ƒdkrq| |j›d¡n | |j›d¡| ¡|D]P}t|t ƒr¡| |¡}|jdur™| d|¡q€| |d¡q€|jdur­| d|¡n| |¡| |||¡| ||¡| |||¡|jdurÐ| d¡q€|jdurç| ¡| t|ƒdkrädnd ¡|jrð| ¡dSdS) Nrurr rßz .extend((rÞr5r?rÖ)rŠrÁrÓrØrÑr rÂrTrÕÚ ImpossiblerÖÚ Exceptionrèrmr‹r(rÓrêrØr/rÙrCrÙ) r%r'r(rËr&ÚchildrÂÚitemÚvalr2r2r3Ú visit_OutputÌs`  ý ú û          €  ÿzCodeGenerator.visit_OutputcCsF| ¡| |¡| |j|¡| d¡| |j|¡| |¡dSrº)rLrêr/rrCr'rZrFr2r2r3Ú visit_Assigns   zCodeGenerator.visit_AssigncCs¶| ¡| ¡}d|_|j |¡| |¡| |¡| |j|¡|  |¡|  |j |¡|  d¡|j dur@| |j |¡n |  d|j›d¡|  d¡| |¡| |¡dS)NFz9 = (Markup if context.eval_ctx.autoescape else identity)(úconcat(r?)rLr›rŠr‰r#rr‹rår&rêr/rrCr·r«rZr)r%r'r(rr2r2r3Úvisit_AssignBlock#s         zCodeGenerator.visit_AssignBlockc Cs¨|jdkr|js|js|jr|jr|jd |j¡|j |j¡}|jdkrM|j  |¡}|dur;|dt kr;|  |¡rM|  d|j›d|›d|›d¡dS|  |¡dS) Nržrrµrz(undefined(name=z) if z is missing else r?) r¶rrrrÊrªrOr‰r%Ú find_loadrrKrC)r%r'r(r%rµr2r2r3r¸;s* ÿÿÿ   ÿÿ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‰r%rOrÓrØrÙÚattr)r%r'r(r%r2r2r3Ú visit_NSRefTsÿzCodeGenerator.visit_NSRefcCs:| |j¡}t|tƒr| t|ƒ¡dS| t|ƒ¡dSr+)rÔr-rTrhrCrkr4)r%r'r(rÞr2r2r3Ú visit_Constbs  zCodeGenerator.visit_ConstcCsHz| t| |j¡ƒ¡WdStjy#| d|j›d¡YdSw©Nz6(Markup if context.eval_ctx.autoescape else identity)(r?)rCr4rÔr-r rÚÚdatarFr2r2r3Úvisit_TemplateDatais  ÿÿz CodeGenerator.visit_TemplateDatacCs\| d¡d}t|jƒD]\}}|r| d¡| ||¡q | |dkr)d¡dSd¡dS)Nr=rr<rz,)r?©rCr$rrr/©r%r'r(r1rÝr2r2r3Ú visit_Tupleqs   zCodeGenerator.visit_TuplecCsF| d¡t|jƒD]\}}|r| d¡| ||¡q | d¡dS)Nrþr<rÿrêrër2r2r3Ú visit_Listzs  zCodeGenerator.visit_ListcCs`| d¡t|jƒD]\}}|r| d¡| |j|¡| d¡| |j|¡q | d¡dS)Nr<r<rórô)rCr$rrr/rïr[rër2r2r3Ú visit_Dict‚s   zCodeGenerator.visit_Dictú+ú-Ú*ú/z//z**ú%ÚandÚorznot cCs`|jjrd}n |jjrd}nd}| |›d¡|jD] }| ||¡| d¡q| d¡dS)Nz8(markup_join if context.eval_ctx.volatile else str_join)Ú markup_joinÚstr_joinz((r<rÖ)r-r.rÚrCr r/)r%r'r(rƒrúr2r2r3Ú visit_Concat™s   zCodeGenerator.visit_ConcatcCs>| d¡| |j|¡|jD]}| ||¡q| d¡dS)Nr=r?)rCr/r¿Úops)r%r'r(r:r2r2r3Ú visit_Compare§s  zCodeGenerator.visit_ComparecCs*| dt|j›d¡| |j|¡dS)Nr>)rCÚ operatorsr:r/r¿rFr2r2r3Ú visit_Operand¯szCodeGenerator.visit_OperandcCsX|jjr | d¡| d¡| |j|¡| d|j›d¡|jjr*| d¡dSdS)Nú(await auto_await(zenvironment.getattr(r<r?rÖ)r@rrCr/r'rärFr2r2r3Ú visit_Getattr³s  ÿzCodeGenerator.visit_GetattrcCs¨t|jtjƒr!| |j|¡| d¡| |j|¡| d¡dS|jjr*| d¡| d¡| |j|¡| d¡| |j|¡| d¡|jjrR| d¡dSdS)Nrþrÿrýzenvironment.getitem(r<r?rÖ) rTrúr ÚSlicer/r'rCr@rrFr2r2r3Ú visit_Getitem¿s     ÿzCodeGenerator.visit_GetitemcCsd|jdur | |j|¡| d¡|jdur| |j|¡|jdur0| d¡| |j|¡dSdS)Nrœ)Ústartr/rCÚstoprÝrFr2r2r3Ú visit_SliceÔs     þzCodeGenerator.visit_SliceÚ is_filterccs|jjr | d¡|r!| |j|j›d¡|jj |j¡}n| |j|j›d¡|jj |j¡}|durQ|jsQ|r@dnd}| d|›d|j›d|j ¡t j dt j d t jd i t   |¡¡}|durn| |›d ¡dV| ||¡| d ¡|jjr‡| d ¡dSdS) Núawait auto_await(r=r·ršzNo rr]r¼rÉr@r<r?)r@rrCr¥rOrÎr¦r‘rÏrÎrr¼rÍrÏrü)r%r'r(rrÚ type_namerÐr2r2r3Ú_filter_test_commonÞs6€  ýÿü  ÿz!CodeGenerator._filter_test_commoncCsÖ| ||d¡Z|jdur| |j|¡n4|jjr(| d|j›d|j›d¡n)|jjr7| d|j›d¡n"| d|j›d¡WdƒdSWdƒdSWdƒdSWdƒdS1sdwYdS)NTz(Markup(concat(z.)) if context.eval_ctx.autoescape else concat(rÖzMarkup(concat(rár?)rr'r/r-r.rCr‹rÚrFr2r2r3r«s&  ÿÿóüú "õzCodeGenerator.visit_FiltercCsB| ||d¡| |j|¡WdƒdS1swYdSrz)rr/r'rFr2r2r3r­s"ÿzCodeGenerator.visit_Testcshˆ ¡‰d‡‡‡fdd„ }ˆ d¡ˆ ˆjˆ¡ˆ d¡ˆ ˆjˆ¡ˆ d¡|ƒˆ d¡dS) Nr$cs8ˆjdurˆ ˆjˆ¡dSˆ dˆ ˆ¡›d¡dS)Nz1cond_expr_undefined("the inline if-expression on z6 evaluated to false and no else section was defined."))Úexpr2r/rCr:r2©r(r'r%r2r3Ú write_expr2"s ÿÿz1CodeGenerator.visit_CondExpr..write_expr2r=z if z else r?r±)rœrCr/Úexpr1rš)r%r'r(r r2r r3Úvisit_CondExprs   zCodeGenerator.visit_CondExprr²cCsÔ|jjr | d¡|jjr| d¡n| d¡| |j|¡|r%ddind}|jr.ddini}|jr7ddini}|rE|j|fi|¤Žn |sI|rQt |fi|¤Ž}|  |||¡| d¡|jjrh| d¡dSdS)Nrzenvironment.call(context, z context.call(rÚ _loop_varsÚ _block_varsr?) r@rrCrAr/r'rrr–rqrü)r%r'r(r²rìÚ loop_kwargsÚ block_kwargsr2r2r3r³5s$    ÿzCodeGenerator.visit_CallcCs"| |jd¡| |j|¡dS)Nrò)rCrïr/r[rFr2r2r3Ú visit_KeywordLszCodeGenerator.visit_KeywordcCó&| d¡| |j|¡| d¡dS)NzMarkup(r?©rCr/r¿rFr2r2r3Úvisit_MarkSafeRs zCodeGenerator.visit_MarkSafecCrrçrrFr2r2r3Úvisit_MarkSafeIfAutoescapeWs z(CodeGenerator.visit_MarkSafeIfAutoescapecCs| d|j¡dS)Nz environment.©rCrOrFr2r2r3Úvisit_EnvironmentAttribute^óz(CodeGenerator.visit_EnvironmentAttributecCs| d|j›d|j›¡dS)Nzenvironment.extensions[z].)rCÚ identifierrOrFr2r2r3Úvisit_ExtensionAttributecsz&CodeGenerator.visit_ExtensionAttributecCs| |j|j¡dSr+)rCr¾rhrFr2r2r3Úvisit_ImportedNamehsz CodeGenerator.visit_ImportedNamecCs| |j¡dSr+rrFr2r2r3Úvisit_InternalNamekrz CodeGenerator.visit_InternalNamecCs| d¡dS)Nr¼)rCrFr2r2r3Úvisit_ContextReferencensz$CodeGenerator.visit_ContextReferencecCs| | |¡¡dSr+)rCrJrFr2r2r3Úvisit_DerivedContextReferencesrz+CodeGenerator.visit_DerivedContextReferencecCó| d|¡dS)NÚcontinuer@rFr2r2r3Úvisit_ContinuexrzCodeGenerator.visit_ContinuecCr)NÚbreakr@rFr2r2r3Ú visit_Break{rzCodeGenerator.visit_BreakcCs:| ¡}|j |¡| |¡| |j|¡| |¡dSr+)r›r‰r#rrår&r)r%r'r(Ú scope_framer2r2r3Ú visit_Scope~s   zCodeGenerator.visit_ScopecCs| ¡}| |›d| |¡›¡| |›d¡| |j|¡| |¡|jdd}|j |¡|  |¡|  |j |¡|  |¡|  ¡dS)Nrz.vars = T)rš)rÒrÓrJr/r¼rEr›r‰r#rrår&rrF)r%r'r(r¶r$r2r2r3Úvisit_OverlayScope…s      z CodeGenerator.visit_OverlayScopec Csr|jD]3}| d|j›d¡| |j|¡z |j |j¡}Wntjy-d|j_ Yqwt |j|j|ƒqdS)Nzcontext.eval_ctx.rT) ÚoptionsrÓrïr/r[rÔr-r rÚr.Úsetattr)r%r'r(ÚkeywordrÞr2r2r3Úvisit_EvalContextModifier“s  ÿøz'CodeGenerator.visit_EvalContextModifiercCsh| ¡}|j ¡}| |›d¡| ||¡|jD]}| ||¡q|j |¡| d|›d¡dS)Nz = context.eval_ctx.save()zcontext.eval_ctx.revert(r?)rÒr-ÚsaverÓr*r&r/Úrevert)r%r'r(Ú old_ctx_nameÚ saved_ctxrÜr2r2r3Úvisit_ScopedEvalContextModifier s    z-CodeGenerator.visit_ScopedEvalContextModifier©NFTrr±)r r+)Nr)rr)¶r€rr‚r6rŸrkÚTextIOrfrÚpropertyrSrgrÏrÒr)r‹rÛrØrÙr ÚNoderàrárãr¹rårCrÓrêrƒÚCallr²r³ÚMappingr7rürrrrrr„r…r€ryr3r8r:r?rAr+r-r,rErFrHr rJrKrLrZrUrtr´r¯rerzÚIncluder…ÚImportÚ FromImportr‹rŽr•ÚForr¬ÚIfr¯r±r¶Ú FilterBlockr¹ÚWithrÀÚExprStmtrÁÚ NamedTuplerÆÚ staticmethodrÇrÈrÅrÑrÓr5rÖrØrÙÚOutputrßÚAssignràÚ AssignBlockrârºr¸ÚNSRefrårrærÕrérìrríÚDictrîrKÚ visit_AddÚ visit_SubÚ visit_MulÚ visit_DivÚvisit_FloorDivÚ visit_PowÚ visit_ModÚ visit_AndÚvisit_OrrNÚ visit_PosÚ visit_NegÚ visit_Notr9ÚConcatrøÚComparerúÚOperandrüÚGetattrrþÚGetitemrrÿrrÚIteratorrr«r­ÚCondExprr r³ÚKeywordrÚMarkSaferÚMarkSafeIfAutoescaperÚEnvironmentAttributerÚExtensionAttributerrgrÚ InternalNamerÚContextReferencerÚDerivedContextReferencerÚContinuer!ÚBreakr#ÚScoper%Ú OverlayScoper&ÚEvalContextModifierr*ÚScopedEvalContextModifierr/r2r2r2r3r&,s" ùþýü ûúù øIÿÿÿ þ  ÿÿÿ ÿ þ ÿÿ ÿÿ þ  üþýü û9+ÿÿ  þS     .ÿÿÿ þw++3ÿÿ þ 7    0ÿÿÿ þÿÿÿ þÿÿÿ þ O     ÿÿÿ þ)ÿÿÿÿ þÿÿ þÿÿ þÿÿ þÿÿ þÿÿ þÿÿ þ ÿÿþr0)FržÚtypingr6Ú contextlibrÚ functoolsrÚiorÚ itertoolsrr)rríÚ markupsaferrrr Ú exceptionsr Ú idtrackingr r rrrrr,rÚutilsrrrHrÚ TYPE_CHECKINGÚtyping_extensionsÚter@rÚTypeVarrÄr7rrûr9rkrIrKrMrNrUrŸr1rfrZr]r¹r3ÚSetrxryr)Ú RuntimeErrorrvr¤rurÛr»r&r2r2r2r3Ús˜                    ø $ÿ þùÿþýü ûúù ø ÿÿ þS