ó
    NÎh%Ÿ  ã                   ó  • S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
Jr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJrJrJrJrJ r J!r!J"r"J#r#J$r$J%r%J&r&J'r'J(r(J)r)J*r*J+r+  SSK,J-r-J.r.J/r/J0r0J1r1J2r2  \(       a  SSK3J4r4J5r5  SSK6J7r7  \Rp                  \Rr                  4r:\" SS9r;Sr< " S S\=5      r>\)" S5      r?S r@ " S S\A5      rB " S S\A5      rC " S S\Rˆ                  5      rE\F" S \RŽ                   5       5      rHS rISrJS rK " S  S!\A5      rLS" rMS# rNS$ rOS% rPS& rQS' rRS( rSS) rTS* rU\" 5       rV\;S+ 5       rWS, rXS- rYS. rZS/ r[S0 r\S1 r]S2 r^\R¾                  S3:¼  a  SS4K`Jarb  g\Lrbg)5a+  
MIT License

Copyright (c) 2021 Alex Hall

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
é    N)Údefaultdict)Údeepcopy)Ú	lru_cache)Úislice)Úzip_longest)Ú
attrgetter)ÚPath)ÚRLock)Údetect_encoding)ÚTYPE_CHECKINGÚAnyÚCallableÚDictÚIterableÚIteratorÚListÚOptionalÚSequenceÚSetÚSizedÚTupleÚTypeÚTypeVarÚUnionÚcasté   )Úmangled_nameÚassert_ÚEnhancedASTÚEnhancedInstructionÚInstructionÚget_instructions)Ú	ASTTokensÚASTText)ÚASTTextBase)Úmaxsizec                   ó.   ^ • \ rS rSr/ 4U 4S jjrSrU =r$ )ÚNotOneValueFoundé9   c                 ó8   >• X l         [        [        U ]  U5        g ©N)ÚvaluesÚsuperr(   Ú__init__)ÚselfÚmsgr,   Ú	__class__s      €ÚP/home/mande/repo/quber/.venv/lib/python3.13/site-packages/executing/executing.pyr.   ÚNotOneValueFound.__init__:   s   ø€ àŒÜÔ˜tÑ-¨cÕ2ó    )r,   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r.   Ú__static_attributes__Ú__classcell__©r1   s   @r2   r(   r(   9   s   ø† Ø!#÷ 3õ 3r4   r(   ÚTc                 ó2  • [        U [        5      (       a4  [        U 5      S:w  a  [        S[        U 5      -  5      e[	        U 5      S   $ [        [        U S5      5      n[        U5      S:X  a  [        S5      e[        U5      S:”  a  [        SU5      eUS   $ )Nr   zExpected one value, found %sr   é   zExpected one value, found 0z!Expected one value, found several)Ú
isinstancer   Úlenr(   ÚlistÚtupler   )ÚitÚlsts     r2   ÚonlyrE   B   s†   € ä�"”e×ÑÜˆr‹7�a‹<Ü"Ð#AÄCÈÃGÑ#KÓLÐLä�B‹x˜‰{Ðä
”�r˜1“Ó
€CÜ
ˆ3ƒx�1ƒ}ÜÐ<Ó=Ð=Ü
ˆ3ƒx�!ƒ|ÜÐBÀ3ÓGÐGØˆq‰6€Mr4   c                   óÒ   • \ rS rSrSrS r\SS j5       r\  SS j5       r\S 5       r	\S 5       r
\S	 5       r\S
 5       r\S 5       rS rS rS r\S 5       r\S 5       rS rSrg)ÚSourceéR   a   
The source code of a single file and associated metadata.

The main method of interest is the classmethod `executing(frame)`.

If you want an instance of this class, don't construct it.
Ideally use the classmethod `for_frame(frame)`.
If you don't have a frame, use `for_filename(filename [, module_globals])`.
These methods cache instances by filename, so at most one instance exists per filename.

Attributes:
    - filename
    - text
    - lines
    - tree: AST parsed from text, or None if text is not valid Python
        All nodes in the tree have an extra `parent` attribute

Other methods of interest:
    - statements_at_line
    - asttokens
    - code_qualname
c                 ó  • Xl         SR                  U5      U l        U Vs/ s H  o3R                  S5      PM     snU l        [        [        5      U l        SU l        0 U l	        SU l
        SU l         [        R                  " U R                  US9U l        [        R                  " U R                  5       Hs  n[        R                  " U5       H&  n[!        ["        U5      [!        ["        U5      l        M(     ['        U5       H!  nU R                  U   R)                  U5        M#     Mu     [+        5       nUR-                  U R                  5        UR.                  U l	        gs  snf ! [0        [2        4 a     gf = f)z7
Don't call this constructor, see the class docstring.
Ú z
N©Úfilename)rL   ÚjoinÚtextÚrstripÚlinesr   rA   Ú_nodes_by_lineÚtreeÚ
_qualnamesÚ
_asttokensÚ_asttextÚastÚparseÚwalkÚiter_child_nodesr   r   ÚparentÚnode_linenosÚappendÚQualnameVisitorÚvisitÚ	qualnamesÚSyntaxErrorÚ
ValueError)r/   rL   rP   ÚlineÚnodeÚchildÚlinenoÚvisitors           r2   r.   ÚSource.__init__j   s*  € ð !ŒØ—G‘G˜E“NˆŒ	Ù6;Ó<²e¨d—k‘k &Ö)±eÑ<ˆŒ
ä)¬$Ó/ˆÔØˆŒ	ØˆŒØˆŒØˆŒð	0ÜŸ	š	 $§)¡)°hÑ?ˆDŒIô Ÿš §¡Ö+�Ü ×1Ò1°$Ö7�EÜ6:¼;ÈÓ6M”Dœ eÓ,Ö3ñ 8ä*¨4Ö0�FØ×'Ñ'¨Ñ/×6Ñ6°tÖ<ó 1ñ ,ô &Ó'ˆGØ�M‰M˜$Ÿ)™)Ô$Ø%×/Ñ/ˆD�Oùò+ =øô œZÐ(ó 	Ùð	ús   ¡E&Á4$E+ Å+E>Å=E>c                 óv   • U R                  UR                  R                  UR                  =(       d    0 U5      $ )zR
Returns the `Source` object corresponding to the file the frame is executing in.
)Úfor_filenameÚf_codeÚco_filenameÚ	f_globals)ÚclsÚframeÚ	use_caches      r2   Ú	for_frameÚSource.for_frame‰   s-   € ð ×Ñ §¡× 8Ñ 8¸%¿/¹/×:OÈRÐQZÓ[Ð[r4   Nc                 óJ  ^^• [        T[        5      (       a  [        T5      mUU4S jn[        R                  R                  T5      n[        R                  " T5        U" 5       nUb!  U(       d  U[        R                  T'   U" 5       nU R                  T[        U5      5      $ )Nc                  óN   >• [         R                  " [        [        T 5      T5      $ r+   )Ú	linecacheÚgetlinesr   Ústr)rL   Úmodule_globalss   €€r2   Ú	get_linesÚ&Source.for_filename.<locals>.get_linesœ   s   ø€ ä×%Ò%¤d¬3°Ó&9¸>ÓJÐJr4   )	r?   r	   rv   rt   ÚcacheÚgetÚ
checkcacheÚ_for_filename_and_linesrB   )rm   rL   rw   ro   rx   ÚentryrP   s    ``    r2   ri   ÚSource.for_filename‘   s‚   ù€ ô �h¤×%Ñ%Ü˜8“}ˆHö	Kô
 —‘×#Ñ# HÓ-ˆÜ×Ò˜XÔ&Ù“ˆØÑ¦Uð
 ).ŒI�O‰O˜HÑ%Ù“KˆEà×*Ñ*¨8´U¸5³\ÓBÐBr4   c                 ór   • U R                  S0 5      n X1U4   $ ! [         a     Of = fU " X5      =oCX4'   U$ )NÚ__source_cache_with_lines)Ú_class_localÚKeyError)rm   rL   rP   Úsource_cacheÚresults        r2   r}   ÚSource._for_filename_and_lines®   sX   € ð ×'Ñ'Ð(CÀRÓHˆð	Ø¨5Ð 1Ñ2Ð2øÜó 	Ùð	úñ 47°xÓ3GÐGˆ˜xÐ/Ñ0Øˆs   ” š
'¦'c                 ón   • [         R                  " UR                  R                  UR                  5        g r+   )rt   Ú	lazycacherj   rk   rl   )rm   rn   s     r2   rˆ   ÚSource.lazycacheº   s"   € ô 	×Ò˜EŸL™L×4Ñ4°e·o±oÕFr4   c                 óü  • [        U[        R                  5      (       a'  UnUR                  nUR                  nUR
                  nOUnUR                  nUR                  nUR                  nU[        U5      U4nU R                  S0 5      nUR                  U5      n	U	(       d±  S=n
=p¼U R                  U5      nUR                  nU(       a€   UR                  U5      nU(       aD  [        U5      (       a  [!        X5X½5      u  pÊO%[#        X;XåU5      nUR$                  n
UR&                  nU
(       a  [)        U
5      1n[+        UU:*  5        UnXÚX¼4=X‡'   n	[1        U/U	Q76 $ ! [,         a    [.        (       a  e  N,f = f)zv
Returns an `Executing` object representing the operation
currently executing in the given frame or traceback object.
Ú__executing_cacheN)r?   ÚtypesÚTracebackTypeÚtb_frameÚ	tb_linenoÚtb_lastiÚf_linenoÚf_lastirj   Úidr‚   r{   rp   rR   Ústatements_at_lineÚis_ipython_cell_codeÚfind_node_ipythonÚ
NodeFinderr…   Ú	decoratorÚstatement_containing_noder   Ú	ExceptionÚTESTINGÚ	Executing)rm   Úframe_or_tbÚtbrn   re   ÚlastiÚcodeÚkeyÚexecuting_cacheÚargsrc   Ústmtsr˜   ÚsourcerR   Únode_finderÚ	new_stmtss                    r2   Ú	executingÚSource.executing¿   st  € ô �k¤5×#6Ñ#6×7Ñ7ð ˆBØ—K‘KˆEØ—\‘\ˆFØ—K‘K‰EàˆEØ—^‘^ˆFØ—M‘MˆEð �|‰|ˆØ”R˜“X˜uÐ%ˆØ×*Ñ*Ð+>ÀÓCˆà×"Ñ" 3Ó'ˆÞØ'+Ð+ˆDÐ+�5Ø—]‘] 5Ó)ˆFØ—;‘;ˆDÞðØ"×5Ñ5°fÓ=�EÞÜ/°×5Ñ5Ü.?ÀÈeÓ.\™O˜I tä*4°UÀ4ÐPVÓ*W˜KØ#.×#5Ñ#5˜DØ(3×(=Ñ(=˜IæÜ%>¸tÓ%DÐ$E˜	Ü 	¨UÑ 2Ô3Ø )˜ð
 +1¸Ð*HÐHˆOÑ  4ä˜Ð& Ò&Ð&øô !ó ß’wØñ ðús   ÃA?E" Å"E;Å:E;c                 óT   • U R                   R                  X5      n[        XU5        U$ )zs
Returns an attribute directly associated with this class
(as opposed to subclasses), setting default if necessary
)Ú__dict__r{   Úsetattr)rm   ÚnameÚdefaultr…   s       r2   r‚   ÚSource._class_localù   s'   € ð —‘×!Ñ! $Ó0ˆÜ�˜6Ô"Øˆr4   c                 ó^   • U R                   U    Vs1 s H  n[        U5      iM     sn$ s  snf )aB  
Returns the statement nodes overlapping the given line.

Returns at most one statement unless semicolons are present.

If the `text` attribute is not valid python, meaning
`tree` is None, returns an empty set.

Otherwise, `Source.for_frame(frame).statements_at_line(frame.f_lineno)`
should return at least one statement.
)rQ   r™   )r/   re   rc   s      r2   r”   ÚSource.statements_at_line  s>   € ð$ ×Ñ Ò'ó
ò (ð ô & dÖ+á'ñ
ð 	
ùò 
s   ’*c                 ó–   • SSK Jn  U R                  c+  U" U R                  U R                  U R
                  S9U l        U R                  $ )z‡
Returns an ASTText object for getting the source of specific AST nodes.

See http://asttokens.readthedocs.io/en/latest/api-index.html
r   )r$   ©rR   rL   )Ú	asttokensr$   rU   rN   rR   rL   )r/   r$   s     r2   ÚasttextÚSource.asttext  s7   € õ 	&à�=‰=Ñ Ù# D§I¡I°D·I±IÈÏÉÑVˆDŒMà�}‰}Ðr4   c                 ó  • SSK nU R                  cp  [        US5      (       a+  U R                  5       R                   U l        U R                  $ UR	                  U R
                  U R                  U R                  S9U l        U R                  $ )z‰
Returns an ASTTokens object for getting the source of specific AST nodes.

See http://asttokens.readthedocs.io/en/latest/api-index.html
r   Nr$   r³   )r´   rT   Úhasattrrµ   r#   rN   rR   rL   ©r/   r´   s     r2   r´   ÚSource.asttokens(  sq   € ó 	à�?‰?Ñ"Ü�y )×,Ñ,Ø"&§,¡,£.×":Ñ":�”ð �‰Ðð #,×"5Ñ"5°d·i±iÀdÇiÁiÐZ^×ZgÑZgÐ"5Ð"h�”Ø�‰Ðr4   c                 ól   • SS K n[        US5      (       a  U R                  5       $ U R                  5       $ )Nr   r$   )r´   r¸   rµ   r¹   s     r2   Ú_asttext_baseÚSource._asttext_base8  s+   € ãä�9˜i×(Ñ(Ø—<‘<“>Ð!à—>‘>Ó#Ð#r4   c                 ó|   • [        U [        5      (       a&  [        R                  U 5      nU R	                  U5      $ U $ r+   )r?   ÚbytesrG   r   Údecode)r¥   Úencodings     r2   Údecode_sourceÚSource.decode_sourceA  s5   € ô �fœe×$Ñ$Ü×-Ñ-¨fÓ5ˆHØ—=‘= Ó*Ð*àˆMr4   c                 óZ   • [        [        R                  " U 5      R                  5      S   $ )Nr   )r   ÚioÚBytesIOÚreadline)r¥   s    r2   r   ÚSource.detect_encodingJ  s#   € ô œrŸzšz¨&Ó1×:Ñ:Ó;¸AÑ>Ð>r4   c                 ó¾   • [        UR                  U R                  :H  5        U R                  R	                  UR
                  UR                  4UR
                  5      $ )aŽ  
Imitates the __qualname__ attribute of functions for code objects.
Given:

    - A function `func`
    - A frame `frame` for an execution of `func`, meaning:
        `frame.f_code is func.__code__`

`Source.for_frame(frame).code_qualname(frame.f_code)`
will be equal to `func.__qualname__`*. Works for Python 2 as well,
where of course no `__qualname__` attribute exists.

Falls back to `code.co_name` if there is no appropriate qualname.

Based on https://github.com/wbolster/qualname

(* unless `func` is a lambda
nested inside another lambda on the same line, in which case
the outer lambda's qualname will be returned for the codes
of both lambdas)
)r   rk   rL   rS   r{   Úco_nameÚco_firstlineno)r/   r    s     r2   Úcode_qualnameÚSource.code_qualnameO  sE   € ô. 	�× Ñ  D§M¡MÑ1Ô2Ø�‰×"Ñ" D§L¡L°$×2EÑ2EÐ#FÈÏÉÓUÐUr4   )rU   rT   rQ   rS   rL   rP   rN   rR   )T©NT)r5   r6   r7   r8   Ú__doc__r.   Úclassmethodrp   ri   r}   rˆ   r¨   r‚   rz   r”   rµ   r´   r¼   ÚstaticmethodrÂ   r   rÌ   r9   © r4   r2   rG   rG   R   sä   † ñò.0ð> ó\ó ð\ð ð Øó	Có ðCð8 ñ	ó ð	ð ñGó ðGð ñ7'ó ð7'ðr ñ	ó ð	ð ñ
ó ð
ò(òò $ð ñó ðð ñ?ó ð?õVr4   rG   c                   ó0   • \ rS rSrSrS rS rS rS rSr	g)	rœ   ij  am  
Information about the operation a frame is currently executing.

Generally you will just want `node`, which is the AST node being executed,
or None if it's unknown.

If a decorator is currently being called, then:
    - `node` is a function or class definition
    - `decorator` is the expression in `node.decorator_list` being called
    - `statements == {node}`
c                 ó@   • Xl         X l        X0l        X@l        XPl        g r+   )rn   r¥   rc   Ú
statementsr˜   )r/   rn   r¥   rc   r¤   r˜   s         r2   r.   ÚExecuting.__init__w  s   € àŒ
ØŒØŒ	ØŒØ"�r4   c                 ó`   • U R                   R                  U R                  R                  5      $ r+   )r¥   rÌ   rn   rj   ©r/   s    r2   rÌ   ÚExecuting.code_qualname  s!   € à�{‰{×(Ñ(¨¯©×):Ñ):Ó;Ð;r4   c                 óh   • U R                   R                  5       R                  U R                  5      $ r+   )r¥   r¼   Úget_textrc   rØ   s    r2   rN   ÚExecuting.textƒ  s$   € à�{‰{×(Ñ(Ó*×3Ñ3°D·I±IÓ>Ð>r4   c                 óh   • U R                   R                  5       R                  U R                  5      $ r+   )r¥   r¼   Úget_text_rangerc   rØ   s    r2   Ú
text_rangeÚExecuting.text_range‡  s$   € à�{‰{×(Ñ(Ó*×9Ñ9¸$¿)¹)ÓDÐDr4   )r˜   rn   rc   r¥   rÕ   N)
r5   r6   r7   r8   rÏ   r.   rÌ   rN   rß   r9   rÒ   r4   r2   rœ   rœ   j  s   † ñ
ò#ò<ò?õEr4   rœ   c                   óL   ^ • \ rS rSrU 4S jrSS jrSS jr\rS rS r	Sr
U =r$ )	r]   iŒ  c                 óF   >• [         [        U ]  5         / U l        0 U l        g r+   )r-   r]   r.   Ústackr_   )r/   r1   s    €r2   r.   ÚQualnameVisitor.__init__�  s   ø€ äŒo˜tÑ-Ô/ØˆŒ
Øˆ�r4   c                 ó@  • U=(       d    UR                   nU R                  R                  U5        [        USS5      (       a  UR                  S   R
                  nOUR
                  nU R                  R                  X#4SR                  U R                  5      5        g )NÚdecorator_listrÒ   r   Ú.)	r­   rã   r\   Úgetattrræ   re   r_   Ú
setdefaultrM   )r/   rc   r­   re   s       r2   Úadd_qualnameÚQualnameVisitor.add_qualname“  st   € à× �t—y‘yˆØ�
‰
×Ñ˜$ÔÜ�4Ð)¨2×.Ñ.Ø×(Ñ(¨Ñ+×2Ñ2‰Fà—[‘[ˆFØ�‰×!Ñ! 4 .°#·(±(¸4¿:¹:Ó2FÕGr4   c                 óN  • [        U[        R                  [        R                  [        R                  45      (       d   U5       eU R                  X5        U R                  R                  S5        / n[        U[        R                  5      (       a  UR                  /nOUR                  nU H  nU R                  U5        M     U R                  R                  5         U R                  R                  5         [        R                  " U5       H‘  u  pTUS:X  a  M  [        U[        R                  5      (       a  U R                  U5        M?  [        U[        5      (       d  MV  U H5  n[        U[        R                  5      (       d  M$  U R                  U5        M7     M“     g )Nz<locals>Úbody)r?   rV   ÚFunctionDefÚAsyncFunctionDefÚLambdarê   rã   r\   rí   r^   ÚpopÚiter_fieldsÚASTrA   )r/   rc   r­   Úchildrenrd   ÚfieldÚ
grandchilds          r2   Úvisit_FunctionDefÚ!QualnameVisitor.visit_FunctionDef�  s  € ä˜$¤§¡´#×2FÑ2FÌÏ
É
Ð S×TÑTÐZÐVZÓZÐTØ×Ñ˜$Ô%Ø�
‰
×Ñ˜*Ô%ØˆÜ�dœCŸJ™J×'Ñ'ØŸ	™	�{‰Hà—y‘yˆHÛˆEØ�J‰J�uÖñ à�
‰
�‰ÔØ�
‰
�‰Ôô
  ŸOšO¨DÖ1‰LˆEØ˜‹ÙÜ˜%¤§¡×)Ñ)Ø—
‘
˜5Ö!Ü˜E¤4×(Ó(Û"'�JÜ! *¬c¯g©g×6Ó6ØŸ
™
 :Ö.ó #(ò 2r4   c                 ój   • [        U[        R                  5      (       d   eU R                  US5        g )Nz<lambda>)r?   rV   rð   r÷   ©r/   rc   s     r2   Úvisit_LambdaÚQualnameVisitor.visit_Lambda»  s)   € ä˜$¤§
¡
×+Ñ+Ð+Ð+Ø×Ñ˜t ZÕ0r4   c                 ó¾   • [        U[        R                  5      (       d   eU R                  U5        U R	                  U5        U R
                  R                  5         g r+   )r?   rV   ÚClassDefrê   Úgeneric_visitrã   rñ   rú   s     r2   Úvisit_ClassDefÚQualnameVisitor.visit_ClassDefÀ  sC   € ä˜$¤§¡×-Ñ-Ð-Ð-Ø×Ñ˜$ÔØ×Ñ˜4Ô Ø�
‰
�‰Õr4   )r_   rã   r+   )r5   r6   r7   r8   r.   rê   r÷   Úvisit_AsyncFunctionDefrû   r   r9   r:   r;   s   @r2   r]   r]   Œ  s*   ø† õôHô/ð8 /Ðò1÷
ð r4   r]   c              #   óV   #   • U  H  n[        [        U5      R                  v •  M!     g 7fr+   )rè   Ú
__future__Úcompiler_flag)Ú.0Úfnames     r2   Ú	<genexpr>r  Ë  s!   é € ð Ú:V°„GŒJ˜Ó×,Ö,Ò:Vùs   ‚')c                 óR   • [        U UR                  S[        UR                  -  SS9$ )NÚexecT)ÚflagsÚdont_inherit)Úcompilerk   Úfuture_flagsÚco_flags)r¥   Úmatching_codes     r2   Úcompile_similar_tor  Ð  s/   € äØØ×!Ñ!ØÜ˜]×3Ñ3Ñ3Øñð r4   Ú8io8urthglkjdghvljusketgIYRFYUVGHFRTBGVHKGF78678957647698c                 ó8   • [        S [        U 5       5       5      $ )Nc              3   óÆ   #   • U  HW  nUR                   S :g  =(       a<    [        UR                  [        5      =(       a    UR                  R	                  S5      v •  MY     g7f)Ú
LOAD_CONSTz@pyN)Úopnamer?   Úargvalrv   Ú
startswith)r  Úbcs     r2   r  Ú)is_rewritten_by_pytest.<locals>.<genexpr>ß  sH   é € ð â(ˆBð 	�	‰	�\Ñ!×_¤j°·±¼3Ó&?×_ÀBÇIÁI×DXÑDXÐY^ÓD_Ô_Ú(ùs   ‚AA!)Úanyr"   ©r    s    r2   Úis_rewritten_by_pytestr  Ý  s!   € äñ ä" 4Ô(óó ð r4   c                   óH   • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rSrg)ÚSentinelNodeFinderiå  Nc                 óv	  ^^• [        U5        Xl        X0l        UR                  =U l        n[        U5      U l        U R                  (       a  [        [        U5      5      U l	        O[        5       U l	        S U l
        U R                  U5      =U l        mTR                  nS n[        S 5      n	[        S 5      n
UR                  S5      (       a  [         R"                  n
GOœUR                  S5      (       a"  [         R$                  n
[         R&                  n	GOdUR                  S5      (       aç  [         R(                  n
[+        [         R,                  [         R.                  [1        [         SS5      [         R2                  [         R4                  [         R6                  [         R8                  [         R:                  [         R<                  [         R>                  [         R@                  [         RB                  [         RD                  S9U   mU4S jnGOgUR                  S	5      (       a^  [         RF                  n
[+        [         RH                  [         RJ                  [         RL                  [         RN                  S
9U   mU4S jnOóUS;   a'  [         RP                  n
[         R&                  n	U4S jnOÆUS;   a'  [         RR                  n
[         R&                  n	U4S jnO™US;   a  [         RT                  n
S nOUR                  S5      (       a!  [         RV                  n	[         R$                  n
OHUR                  S5      (       a'  [         RV                  n	[         RP                  n
U4S jnO[Y        U5      e[Z           U VVs1 s H�  n[         R\                  " U5        Hc  n[_        XÊ5      (       d  M  [_        [1        USS 5      U	5      (       d  M3  U" U5      (       d  MB  [a        U5      U:X  d  MS  [c        [d        U5      iMe     Mƒ     nnnU	[         RV                  :X  a  [g        U5      U l4         S S S 5        g [k        U Rm                  U5      5      nU(       d&  U
[         R"                  :X  a  U Ro                  U5        O[g        U5      U l4        S S S 5        g s  snnf ! , (       d  f       g = f)Nc                 ó   • grÎ   rÒ   ©Úes    r2   Ú<lambda>Ú-SentinelNodeFinder.__init__.<locals>.<lambda>ù  s   €  r4   ÚCALL_)ÚBINARY_SUBSCRzSLICE+ÚBINARY_ÚMatMultrÒ   )ÚBINARY_POWERÚBINARY_MULTIPLYÚBINARY_MATRIX_MULTIPLYÚBINARY_FLOOR_DIVIDEÚBINARY_TRUE_DIVIDEÚBINARY_MODULOÚ
BINARY_ADDÚBINARY_SUBTRACTÚBINARY_LSHIFTÚBINARY_RSHIFTÚ
BINARY_ANDÚ
BINARY_XORÚ	BINARY_ORc                 ó0   >• [        U R                  T5      $ r+   ©r?   Úop©r#  Úop_types    €r2   r$  r%    ó   ø€ ¤Z°·±°gÔ%>r4   ÚUNARY_)ÚUNARY_POSITIVEÚUNARY_NEGATIVEÚ	UNARY_NOTÚUNARY_INVERTc                 ó0   >• [        U R                  T5      $ r+   r8  r:  s    €r2   r$  r%    r<  r4   )Ú	LOAD_ATTRÚLOAD_METHODÚLOOKUP_METHODc                 ó4   >• [        U 5      TR                  :H  $ r+   ©r   r  ©r#  Úinstructions    €r2   r$  r%     ó   ø€ ¤L°£O°{×7IÑ7IÒ$Ir4   )Ú	LOAD_NAMEÚLOAD_GLOBALÚ	LOAD_FASTÚ
LOAD_DEREFÚLOAD_CLASSDEREFc                 ó4   >• [        U 5      TR                  :H  $ r+   rG  rH  s    €r2   r$  r%  $  rJ  r4   )Ú
COMPARE_OPÚIS_OPÚCONTAINS_OPc                 ó2   • [        U R                  5      S:H  $ )Nr   )r@   Úopsr"  s    r2   r$  r%  '  s   € ¤S¨¯©£Z°1¢_r4   )ÚSTORE_SLICEÚSTORE_SUBSCRÚ
STORE_ATTRc                 ó4   >• [        U 5      TR                  :H  $ r+   rG  rH  s    €r2   r$  r%  .  rJ  r4   Úctx)8r   rn   rR   rj   r    r  Ú	is_pytestÚ	frozensetÚassert_linenosÚignore_linenosr˜   Úget_actual_current_instructionrI  r  Útyper  rV   ÚCallÚ	SubscriptÚLoadÚBinOpÚdictÚPowÚMultrè   ÚFloorDivÚDivÚModÚAddÚSubÚLShiftÚRShiftÚBitAndÚBitXorÚBitOrÚUnaryOpÚUAddÚUSubÚNotÚInvertÚ	AttributeÚNameÚCompareÚStoreÚRuntimeErrorÚlockrX   r?   r™   r   r   rE   r…   rA   Úmatching_nodesÚfind_decorator)r/   rn   r¤   rR   rŸ   r¥   r    Úop_nameÚextra_filterrZ  ÚtypÚstmtrc   ÚexprsÚmatchingrI  r;  s                  @@r2   r.   ÚSentinelNodeFinder.__init__è  sf  ù€ ä�ŒØŒ
ØŒ	Ø Ÿ<™<Ð'ˆŒ	�DÜ/°Ó5ˆŒà�>�>Ü"+¬N¸4Ó,@Ó"AˆDÕä"+£+ˆDÔàˆŒà)-×)LÑ)LÈUÓ)SÐSˆÔ˜;Ø×$Ñ$ˆÙ%ˆÜ�4‹jˆä�4‹jˆØ×Ñ˜g×&Ñ&Ü—(‘(ŠCØ×ÑÐ ;×<Ñ<Ü—-‘-ˆCÜ—(‘(ŠCØ×Ñ 	×*Ñ*Ü—)‘)ˆCÜÜ ŸW™WÜ #§¡Ü'.¬s°I¸rÓ'BÜ$'§L¡LÜ#&§7¡7Ü!Ÿg™gÜŸ7™7Ü #§¡Ü!Ÿj™jÜ!Ÿj™jÜŸ:™:ÜŸ:™:ÜŸ)™)ñð ñˆGô ?ŠLØ×Ñ ×)Ñ)Ü—+‘+ˆCÜÜ"Ÿx™xÜ"Ÿx™xÜŸ'™'Ü ŸZ™Zñ	ð
 ñˆGô ?‰LØÐEÓEÜ—-‘-ˆCÜ—(‘(ˆCÜI‰LØÐbÓbÜ—(‘(ˆCÜ—(‘(ˆCÜI‰LØÐ>Ó>Ü—+‘+ˆCÙ4‰LØ×ÑÐ ?×@Ñ@Ü—)‘)ˆCÜ—-‘-‰CØ×Ñ ×-Ñ-Ü—)‘)ˆCÜ—-‘-ˆCÜI‰Lä˜wÓ'Ð'ö ñ "ôâ!�DÜŸHšH TŸN�DÜ˜d×(ó (ô œg d¨E°4Ó8¸#×>ó	 (ñ
   ×%ó (ô -¨TÓ2°dÑ:ó (””[ $Ö'á*ñ (Ù!ð ñ ð ”c—i‘iÓô # 5›k�”Ø÷! ˆTô$ ˜D×/Ñ/°Ó6Ó7ˆHÞ ¤s§x¡x£Ø×#Ñ# EÕ*ä" 8›n�”÷- ˆTùó÷ �Tús=   ÎR*Î.R$Î=R$ÏR$Ï*R$Ï;R$Ð(R*ÑAR*Ò$R*Ò*
R8c                 óü  • [        U5      n[        [        U[        R                  [
        45      5        UR                  n[        U5        U R                  U R                  5       Vs/ s H+  nUR                  U R                  R                  :X  d  M)  UPM-     nn[        U5       VVs/ s H  u  pdUR                  S:X  d  M  UPM     snnS   n[        XWS-      R                  R                  S5      5        UU[        U5      -
  S-   US-    n[        U Vs1 s H  oDR                  iM     snS1:H  5        UR!                  U R"                  5      n	US S S2   U	   n
X l        X l        g s  snf s  snnf s  snf )NÚCALL_FUNCTIONéÿÿÿÿr   ÚSTORE_)rE   r   r?   rV   rþ   Úfunction_node_typesræ   Úclean_instructionsr    re   rn   r‘   Ú	enumerater  r  r@   ÚindexrI  r˜   r…   )r/   r¤   r‚  Ú
decoratorsÚinstÚline_instructionsÚiÚ last_decorator_instruction_indexÚdecorator_instructionsÚdecorator_indexr˜   s              r2   r~  Ú!SentinelNodeFinder.find_decoratorK  s}  € ä�E‹{ˆÜ”
˜4¤#§,¡,Ô0CÐ!DÓEÔFØ×(Ñ(ˆ
Ü�
Ôð ×/Ñ/°·	±	Ô:ó
â:�Ø�{‰{˜dŸj™j×1Ñ1Ñ1÷ Ù:ð 	ð 
ô %Ð%6Ô7ô,
â7‘�Ø�{‰{˜oÑ-÷ Ù7ò,
ð ñ	,Ð(ô
 	ØÀÑBÑC×JÑJ×UÑUØóô	
ð
 "3Ø,Ü�*‹oñàñà2Øñð"
Ðô 	Ñ)?Ó@Ò)? —”Ñ)?Ñ@À_ÐDUÑUÔVØ0×6Ñ6°t×7GÑ7GÓHˆØ™t ˜tÑ$ _Ñ5ˆ	Ø"ŒØ�ùò3
ùó
,
ùò  As   Á)(E.ÂE.Â+E3ÃE3ÄE9c                 ó    • [        U5       Vs/ s H3  nUR                  S;  d  M  UR                  U R                  ;  d  M1  UPM5     sn$ s  snf )N)ÚEXTENDED_ARGÚNOP)r"   r  re   r^  )r/   r    r�  s      r2   r‹  Ú%SentinelNodeFinder.clean_instructionsl  sT   € ô )¨Ô.ó
â.�Ø�{‰{Ð"9Ñ9ó ð �{‰{ $×"5Ñ"5Ñ5÷ Ù.ñ
ð 	
ùò 
s   ŽA¦AÁAc                 óØ   • U R                  U R                  5      n[        S U R                  5        5       5      (       d$  U Vs/ s H  nUR                  S:w  d  M  UPM     nnU$ s  snf )Nc              3   ó@   #   • U  H  nUR                   S :H  v •  M     g7f)ÚJUMP_IF_NOT_DEBUGN©r  )r  r�  s     r2   r  ÚESentinelNodeFinder.get_original_clean_instructions.<locals>.<genexpr>}  s!   é € ð 
â7�Dð —‘Ð2Ö2Ú7ùs   ‚rœ  )r‹  r    r  Úcompile_instructionsr  )r/   r…   r�  s      r2   Úget_original_clean_instructionsÚ2SentinelNodeFinder.get_original_clean_instructionsu  su   € à×(Ñ(¨¯©Ó3ˆô ñ 
à ×5Ñ5Ô7ó
÷ 
ñ 
ñ
 "(óÚ!'˜Ø—;‘;Ð"5Ñ5÷ ¡ð ð ð
 ˆùòs   ÁA'ÁA'c           	   #   óª  ^ #   • T R                  5       n[        U 4S j[        U5       5       5      n[        U5       GHM  u  pE[        U5      nUc   e[        R
                  " U[        R                  " 5       [        R                  " [        S9S9n[        R                  " U5        U" U5         T R                  5       nU" U5        [        R                  S:¼  a   [        X‚5        [        U5       V	V
s/ s H  u  pšU
R"                  [        :X  d  M  U	PM     nn	n
[        U5       HZ  u  pÍXÜS-  -  n[%        UR'                  U5      R(                  S:H  5        [%        UR'                  U5      R(                  S:H  5        M\     [        U5       Hô  u  pÍXÜS-  -  nUS-
  nXã:w  a  M  X#   nXŽ   nUR(                  UR(                  s=:X  a  S	;   a_  O  O\UR*                  UR*                  :w  aB  X#S-      R(                  XŽS-      R(                  s=:w  a  S
:X  a  O  OUR'                  US-   5        [        R                  S:  a<  [-        X(5       H-  u  nn[%        U=(       a    U=(       a    [/        UU5      5        M/     Uv •  Mö     GMP     g ! U" U5        f = f! [         a#    [        (       d  U[!        U5      S-
  :  a   GM‹  e f = fs  sn
n	f 7f)Nc              3   óP   >#   • U  H  u  pUTR                   :X  d  M  Uv •  M     g 7fr+   )rI  )r  r‘  r�  r/   s      €r2   r  Ú4SentinelNodeFinder.matching_nodes.<locals>.<genexpr>‹  s*   øé € ð 
â;‘�Ø�t×'Ñ'Ñ'÷ ‰AÚ;ùó   ƒ&�	&)Ús)Úleftr9  Úright)é   é
   r   r>   r  r*  ©rS  rR  r@  )r   rE   rŒ  Ú
get_setterrV   rd  rf  ÚStrÚsentinelÚfix_missing_locationsrŸ  ÚsysÚversion_infoÚhandle_jumpsrš   r›   r@   r  r   rñ   r  Úargr   Úopnames_match)r/   rƒ  Úoriginal_instructionsÚoriginal_indexÚ
expr_indexÚexprÚsetterÚreplacementÚinstructionsr‘  rI  ÚindicesÚ	index_numÚsentinel_indexÚ	new_indexÚoriginal_instÚnew_instÚinst1Úinst2s   `                  r2   r}  Ú!SentinelNodeFinder.matching_nodesˆ  s›  øé € à $× DÑ DÓ FÐÜô 
ä$Ð%:Ô;ó
ó 
ˆô
 !*¨%× 0ÑˆJÜ Ó%ˆFØÑ%Ð%Ð%äŸ)š)ØÜ—7’7“9Ü—g’g¤Ñ)ñˆKô
 ×%Ò% kÔ2Ù�;ÔðØ#×8Ñ8Ó:�á�t”ä×Ñ 7Ó*ðÜ  ÔEô '0°Ô&=ôâ&=‘N�AØ×%Ñ%¬Ñ1÷ Ù&=ð ñ ô .7°wÖ-?Ñ)�	ð ¨a¡-Ñ/�ä˜×(Ñ(¨Ó8×?Ñ?À<ÑOÔPÜ˜×(Ñ(¨Ó8×?Ñ?À>ÑQÖRñ .@ô .7°wÖ-?Ñ)�	Ø¨a¡-Ñ/�Ø*¨QÑ.�	àÓ.Ùà 5Ñ E�Ø'Ñ2�ð
 &×,Ñ,°·±Õ[ÐC[Ö[Ø)×-Ñ-°·±Ó=à-¸qÑ.@ÑA×HÑHØ'°A©Ñ6×=Ñ=õMØALöMð !×$Ñ$ Y°¡]Ô3ô ×#Ñ# gÓ-Ü(3Ø-ö)™˜˜uô   × O¨%× O´MÀ%ÈÓ4OÖPñ)ð
 ”
ô= .@òW !1øñ �t•ûô
 !ó ç’w *¬s°5«z¸A©~Ó"=Û Øð	üóùsU   ƒB-KÂ1JÃKÃJÃ)KÃ7KÄKÄE5KÊ
JÊKÊ'K
ËKËK
Ë
	Kc                 ó˜   • [        U R                  U R                  5      n[        U R	                  U5      5      nU R                  U5      $ r+   )r  rR   r    rE   Ú
find_codesr‹  )r/   Úmodule_coder    s      r2   rŸ  Ú'SentinelNodeFinder.compile_instructionsÛ  s:   € ä(¨¯©°D·I±IÓ>ˆÜ�D—O‘O KÓ0Ó1ˆØ×&Ñ& tÓ,Ð,r4   c                 ó  ^ ^^^^• [        S5      [        S5      [        S5      S /mT R                  (       d  T[        S5      [        S5      /-  mUU 4S jm/ mT" U5      (       a  TR                  U5        UUU4S jmT" U5        T$ )	NrË   Úco_freevarsÚco_cellvarsc                 óR   • [        U R                  5      =(       d    U R                  $ r+   )Úis_ipython_cell_code_namerÊ   )Úcs    r2   r$  Ú/SentinelNodeFinder.find_codes.<locals>.<lambda>ç  s   € Ô/°·	±	Ó:×G¸a¿i¹iÐGr4   Úco_namesÚco_varnamesc                 ó2   >^ • [        U U4S jT 5       5      $ )Nc              3   óZ   >#   • U  H   nU" T5      U" TR                   5      :H  v •  M"     g 7fr+   r  )r  ÚfrÎ  r/   s     €€r2   r  ÚASentinelNodeFinder.find_codes.<locals>.matches.<locals>.<genexpr>ñ  s)   øé € ð â�Añ �!“™˜$Ÿ)™)›Ö$Úùs   ƒ(+)Úall)rÎ  Úchecksr/   s   `€€r2   ÚmatchesÚ.SentinelNodeFinder.find_codes.<locals>.matchesï  s   ù€ äõ áóó ð r4   c                 ó²   >• U R                    HF  n[        R                  " U5      (       d  M   T" U5      (       a  TR                  U5        T" U5        MH     g r+   )Ú	co_constsÚinspectÚiscoder\   )r    ÚconstÚcode_optionsÚfinderrØ  s     €€€r2   rà  Ú-SentinelNodeFinder.find_codes.<locals>.finderú  sA   ø€ àŸœ�Ü—~’~ e×,Ñ,Ùá˜5—>‘>Ø ×'Ñ'¨Ô.Ù�u–ò (r4   )r   r[  r\   )r/   Ú	root_coder×  rß  rà  rØ  s   ` @@@@r2   rÆ  ÚSentinelNodeFinder.find_codesá  sŠ   ü€ ô Ð'Ó(Ü�}Ó%Ü�}Ó%ÙGð	
ˆð �~�~ØÜ˜:Ó&Ü˜=Ó)ðñ ˆFö
	ð ˆÙ�9×ÑØ×Ñ 	Ô*÷	ñ 	ˆyÔØÐr4   c                 ó¸   ^• [        [        U R                  5      5      n[        U4S j[	        U5       5       5      n X#   nUR
                  S:w  a  U$ US-  nM  )zc
Get the instruction corresponding to the current
frame offset, skipping EXTENDED_ARG instructions
c              3   óP   >#   • U  H  u  pUR                   T:X  d  M  Uv •  M     g 7fr+   )Úoffset)r  r‘  r�  rŸ   s      €r2   r  ÚDSentinelNodeFinder.get_actual_current_instruction.<locals>.<genexpr>  s(   øé € ð 
â2‘�Ø�{‰{˜eÑ#÷ ‰AÚ2ùr¥  r—  r   )rA   r"   r    rE   rŒ  r  )r/   rŸ   r»  r�  rI  s    `   r2   r_  Ú1SentinelNodeFinder.get_actual_current_instruction  sd   ø€ ô Ô,¨T¯Y©YÓ7Ó8ˆÜô 
ä$ \Ô2ó
ó 
ˆð Ø&Ñ-ˆKØ×!Ñ! ^Ó3Ø"Ð"Ø�Q‰JˆEñ	 r4   )r    r˜   rn   r^  rI  r[  r…   rR   )r5   r6   r7   r8   r…   r.   r~  r‹  r   r}  rŸ  rÆ  r_  r9   rÒ   r4   r2   r  r  å  s5   † Ø€Fòa-òFòB
òò&Qòf-ò$õLr4   r  c              #   óþ   #   • Sn[        [        U 5      US5       H]  u  p4UR                  [        :X  a  [	        UR
                  S:H  5        SnM5  U(       a  [	        UR
                  S:H  5        SnMX  X44v •  M_     g7f)zn
Yields (index, instruction) pairs excluding the basic
instructions introduced by the sentinel transformation
FNr  Tr*  )r   rŒ  r  r®  r   r  )r»  ÚstartÚ
skip_powerr‘  r�  s        r2   Únon_sentinel_instructionsrì    so   é € ð €JÜœ) LÓ1°5¸$Ö?‰ˆØ�;‰;œ(Ó"Ü�D—K‘K <Ñ/Ô0ØˆJÙÞÜ�D—K‘K >Ñ1Ô2ØˆJÙØˆgŒò @ùs   ‚A;A=c              #   óº  #   • [        [        U 5      US5      n[        X#5      nSn  [        U5      u  px[        U5      u  pšU(       a1  UR
                  U
R
                  s=:w  a  S:X  a  O  O[        U5      u  pšUR
                  U
R
                  s=:H  =(       a    S;   Os  =(       a    UR                  U
R                  :g  nXxXš4v •  M¤  ! [         a     gf = f7f)z‹
Yields matching indices and instructions from the new and original instructions,
leaving out changes made by the sentinel transformation.
NFr@  r«  )r   rŒ  rì  ÚnextÚStopIterationr  r³  )rµ  Úoriginal_startr»  rê  Úoriginal_iterÚnew_iterÚinverted_comparisonÚ
original_irÀ  Únew_irÁ  s              r2   Úwalk_both_instructionsrö  2  sÎ   é € ô œ9Ð%:Ó;¸^ÈTÓR€MÜ(¨Ó=€HØÐØ
ð	Ü(,¨]Ó(;Ñ%ˆJÜ" 8›n‰OˆEö  Ø×$Ñ$¨¯©ÕF¸;ÖFä" 8›n‰OˆEà× Ñ  H§O¡O×OÓOÐ7OÔO÷ 2Ø×!Ñ! X§\¡\Ñ1ð 	ð ¨Ð8Ò8ñ øô ó 	Ùð	üs)   ‚%C¨C ÁB	CÃ
CÃCÃCÃCc                 ó¨  ^	•  [        USU S5       H¼  u  p#nm	[        UT	5      (       a  M  ST	R                  ;   aF  SUR                  ;  a6  [        U	4S j[	        U 5       5       5      n[        XX5      nUc   eX`XDS-   & OL/ nXS  H&  nUR                  U5        UR                  S;   d  M&    O   [        e[        [        Xp5      5      XU&   O   gMÑ  )a¯  
Transforms instructions in place until it looks more like original_instructions.
This is only needed in 3.10+ where optimisations lead to more drastic changes
after the sentinel transformation.
Replaces JUMP instructions that aren't also present in original_instructions
with the sections that they jump to until a raise or return.
In some other cases duplication found in `original_instructions`
is replicated in `instructions`.
r   ÚJUMPc              3   óŒ   >#   • U  H9  u  pUR                   TR                  :X  d  M!  [        US S5      (       a  M5  Uv •  M;     g7f)Ú_copiedFN)ræ  r  rè   )r  r‘  r�  rÁ  s      €r2   r  Úhandle_jumps.<locals>.<genexpr>b  s?   øé € ð â#:™˜Ø—{‘{ h§o¡oÑ5ó ô $ D¨)°U×;÷ ‘AÚ#:ùs   ƒ A§A»	ANr   ©ÚRETURN_VALUEÚRAISE_VARARGS)	rö  r´  r  rE   rŒ  Úhandle_jumpr\   ÚAssertionErrorÚfind_new_matching)
r»  rµ  rô  rÀ  rõ  rê  Únew_instructionsÚorig_sectionÚsection_instrÁ  s
            @r2   r²  r²  M  s  ø€ ð Ü:PØ! 1 l°Aö;
Ñ6ˆJ u¨hô ˜]¨H×5Ñ5Ùà˜Ÿ™Ó(¨V¸=×;OÑ;OÓ-Oô ô ä#,¨\Ô#:óó �ô $/Ø)°|ó$Ð ð (Ñ3Ð3Ð3Ø2B˜U¨Q¡YÑ/ð  "�Ø$9¸+Ó$F�LØ ×'Ñ'¨Ô5Ø#×*Ñ*Ð.OÕOÙñ %Gô )Ð(ä,0Ô1BÀ<Ó1^Ó,_� 5Ð)ñ ñM;
ðR ñU r4   c           	   #   ó  #   • [        [        U5      [        U 5      -
  5       Ha  n[        [        [	        X5      [        U 5      5      6 u  p4[        U5      [        U 5      :  a    g[        X5      (       d  MU  XUS   S-    v •  Mc     g7f)z¤
Yields sections of `instructions` which match `orig_section`.
The yielded sections include sentinel instructions, but these
are ignored when checking for matches.
Nrˆ  r   )Úranger@   Úzipr   rì  Úsections_match)r  r»  rê  r¼  Údup_sections        r2   r  r  …  s   é € ô ”s˜<Ó(¬3¨|Ó+<Ñ<Ö=ˆÜ"ÜÜ)¨,Ó>Ü�LÓ!óð 
Ñˆô ˆ{Óœc ,Ó/Ó/ÙÜ˜,×4Ó4Ø W¨R¡[°1¡_Ð5Ô5ò >ùs   ‚A2B	Á8B	c                 óþ   • [        XX#5       Hm  u  pEpg[        [        XW5      5        UR                  S;   d  M,  [	        X#US-    5      nU H
  n	SU	l        M     XUS-    n
[        XU 5      (       d  / X#US-   & Us  $    g)aH  
Returns the section of instructions starting at `start` and ending
with a RETURN_VALUE or RAISE_VARARGS instruction.
There should be a matching section in original_instructions starting at original_start.
If that section doesn't appear elsewhere in original_instructions,
then also delete the returned section of instructions.
rü  r   TN)rö  r   r´  r  r   rú  Úcheck_duplicates)rµ  rð  r»  rê  Ú
original_jrÀ  Únew_jrÁ  ÚinlinedÚinlr  s              r2   rÿ  rÿ  ™  s›   € ô 7MØ¨|ö7Ñ2ˆ
 5ô 	”˜mÓ6Ô7Ø×ÑÐ#DÕDÜ˜|°E¸A±IÐ>Ó?ˆGÛ�Ø"�–ñ à0À*ÈqÁ.ÐQˆLÜ#ØÐ.C÷ñ ð 35� U¨Q¡YÐ/ØŠNñ7ð r4   c                 óÀ   • [        [        U5      5       HF  nX0:X  a  M
  X#U[        U5      -    n[        U5      [        U5      :  a    g[        X5      (       d  MF    g   g)z¢
Returns True if a section of original_instructions starting somewhere other
than original_i and matching orig_section is found, i.e. orig_section is duplicated.
FT)r  r@   r  )rô  r  rµ  Ú	dup_startr	  s        r2   r  r  ´  s^   € ô œ3Ð4Ó5Ö6ˆ	ØÓ"ÙØ+¸	ÄCÈÓDUÑ8UÐVˆÜˆ{Óœc ,Ó/Ó/ÙÜ˜,×4Ó4Ùñ 7ð r4   c                 ó8   • [        S [        X5       5       5      $ )zT
Returns True if the given lists of instructions have matching linenos and opnames.
c              3   óÜ   #   • U  Hb  u  pUR                   UR                   :H  =(       d)    S UR                  s=:H  =(       a    UR                  :H  Os  =(       a    [        X5      v •  Md     g7f)Ú	POP_BLOCKN)re   r  r´  )r  Ú	orig_instÚdup_insts      r2   r  Ú!sections_match.<locals>.<genexpr>Ê  sc   é € ð ò $BÑˆIð ×Ñ §¡Ñ/÷ Bà˜i×.Ñ.×AÓA°(·/±/ÔA÷	/ô
 ˜)Ó.ô	/ò $Bùs   ‚A*A,)rÖ  r  )r  r	  s     r2   r  r  Å  s%   € ô
 ñ ô $' |Ô#Aóó ð r4   c                 ó”  • U R                   UR                   :H  =(       d©    SU R                   ;   =(       a    SUR                   ;   =(       d}    U R                   S:H  =(       a    UR                   S:H  =(       dQ    U R                   S;   =(       a    UR                   S:H  =(       d%    U R                   S:H  =(       a    UR                   S:H  $ )Nrø  Ú
PRINT_EXPRÚPOP_TOP)rD  rE  rC  ÚCALL_METHODr‡  r�  )rÂ  rÃ  s     r2   r´  r´  Õ  s¦   € ð 	�‰˜Ÿ™Ñ$÷ 	OØ�U—\‘\Ñ!÷ #Ø�e—l‘lÑ"÷	Oð �L‰L˜LÑ(×F¨U¯\©\¸YÑ-F÷	Oð
 �L‰LÐ<Ñ<÷ ,Ø—‘ Ñ+÷	Oð �L‰L˜MÑ)×M¨e¯l©l¸oÑ.Mð
r4   c                 óþ   ^^^^• U R                   m[        R                  " T5       HS  u  mmTU L a  UU4S jnUs  $ [        T[        5      (       d  M-  [        T5       H  u  mnX L d  M  UU4S jnUs  s  $    MU     g )Nc                 ó   >• [        TTU 5      $ r+   )r¬   )Únew_noder­   rZ   s    €€r2   r¹  Úget_setter.<locals>.setteré  s   ø€ ä˜v t¨XÓ6Ð6r4   c                 ó   >• U TT'   g r+   rÒ   )r  rõ   r‘  s    €€r2   r¹  r  ð  s   ø€ à#+˜˜ašr4   )rZ   rV   rò   r?   rA   rŒ  )rc   r¹  Úitemrõ   r‘  r­   rZ   s      @@@@r2   r¬  r¬  ä  sl   û€ à�[‰[€FÜ—’ vÖ.‰ˆˆeØ�DŠ=ö7ð ŠMÜ˜œt×$Ó$Ü$ UÖ+‘��4Ø”<ö,ð "”Mó ,ñ /ð r4   c                 óÖ   • [        U [        R                  5      (       d;  [        [        U 5      R
                  n [        U [        R                  5      (       d  M;  [        [        U 5      $ r+   )r?   rV   r‚  r   r   rZ   )rc   s    r2   r™   r™   ú  sG   € ô ˜œsŸx™x×(Ñ(Ü”K Ó&×-Ñ-ˆô ˜œsŸx™x×(Ó(ä”˜TÓ"Ð"r4   c              #   óì   #   • [         R                  " U 5       HV  n[        US5      (       d  M  [        [	        U5      [         R
                  5      (       d  M@  [        U5       H  nUv •  M	     MX     g 7f)NrZ   )rV   rX   r¸   r?   r™   ÚAssertr[   )rR   rc   re   s      r2   r]  r]    sO   é € ä—’˜–ˆä˜˜h×'Ó'ÜÔ4°TÓ:¼C¿J¹J×GÓGä& tÖ,�Ø”ó -ò ùs   ‚)A4¯&A4ÁA4c                 ó^  • [        U R                  [        R                  5      (       d7  U R                  n [        U R                  [        R                  5      (       d  M7  [        R                  " S5      n[        [        R                  U 5      /Ul        [        R                  " X5        U$ )NrJ   )	r?   rZ   rV   ÚModulerW   r   r‚  rí   Úcopy_location)r‚  rR   s     r2   Ú_extract_ipython_statementr(    sp   € ô
 ˜Ÿ™¤c§j¡j×1Ñ1Ø�{‰{ˆô ˜Ÿ™¤c§j¡j×1Ó1ô
 �9Š9�R‹=€DÜ”c—h‘h Ó%Ð&€D„IÜ×Ò�dÔ!Ø€Kr4   c                 óB   • [        [        R                  " SU 5      5      $ )Nz(<module>|<cell line: \d+>)$)ÚboolÚreÚmatch)Ú	code_names    r2   rÍ  rÍ    s   € ä”—’Ð8¸)ÓDÓEÐEr4   c                 óB   • [        [        R                  " SU 5      5      $ )Nz'<ipython-input-|[/\\]ipykernel_\d+[/\\])r*  r+  ÚsearchrK   s    r2   Úis_ipython_cell_filenamer0  "  s   € ä”—	’	ÐDÀhÓOÓPÐPr4   c                 ód   • [        U R                  5      =(       a    [        U R                  5      $ r+   )r0  rk   rÍ  rÊ   )Úcode_objs    r2   r•   r•   '  s*   € ô 	! ×!5Ñ!5Ó6÷ 	4Ü! (×"2Ñ"2Ó3ðr4   c                 ó  • S =pEU Hf  n[        U5      n [        XXqU5      nU(       d  U(       a$  UR                  (       d  UR                  (       a    gUR                  nUR                  nMh     XT4$ ! [         a     Mz  f = f)N)NN)r(  r—   r…   r˜   rš   )	rn   rŸ   r¤   r¥   rc   r˜   r‚  rR   r¦   s	            r2   r–   r–   /  s   € àÐ€DÛˆÜ)¨$Ó/ˆð
	Ü$ U°4ÀÓGˆKÞž	¨×(:×(:¸k×>S×>Sñ "à×%Ñ%ˆDØ#×-Ñ-ŠIñ ð ˆ?Ðøô ó 	Úð	ús   •=A3ÁA3Á3
BÂ Bc              #   ó.  #   • [        U S5      (       a€  / n[        U S5      (       aR  [        U [        R                  5      (       a3  U R                  c   e[        U R                  U R                  S-   5      nOU R                  /nU H  nUv •  M	     g g 7f)Nre   Ú
end_linenor   )r¸   r?   rV   r¸  r5  r  re   )rc   Úlinenosre   s      r2   r[   r[   C  s|   é € äˆt�X×ÑØˆÜ�4˜×&Ñ&¬:°d¼C¿H¹H×+EÑ+EØ—?‘?Ñ.Ð.Ð.Ü˜DŸK™K¨¯©¸1Ñ)<Ó=‰Gà—{‘{�mˆGÛˆFØŒLò ð ùs   ‚BB)r©  é   )ÚPositionNodeFinder)crÏ   r  rV   ÚdisrÜ  rÅ   rt   r+  r°  rŒ   Úcollectionsr   Úcopyr   Ú	functoolsr   Ú	itertoolsr   r   Úoperatorr   Úpathlibr	   Ú	threadingr
   Útokenizer   Útypingr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Ú_utilsr   r   r   r    r!   r"   r´   r#   r$   Úasttokens.asttokensr%   rî   rï   rŠ  rz   r›   rš   r(   r<   rE   ÚobjectrG   rœ   ÚNodeVisitorr]   ÚsumÚall_feature_namesr  r  r®  r  r  rì  rö  r²  r  rÿ  r  r  r´  r¬  r|  r™   r]  r(  rÍ  r0  r•   r–   r[   r±  Ú_position_node_finderr8  r—   rÒ   r4   r2   Ú<module>rJ     sª  ðñó0 Û 
Û 
Û Û 	Û Û 	Û 
Û Ý #Ý Ý Ý Ý !Ý Ý Ý Ý $÷ S÷  S÷  S÷  Só  Sß f× fæß,Ý/ð —‘¨×(<Ñ(<Ð=Ð á˜$Ñ€à
€ô3�yô 3ñ ˆCƒL€òô UVˆVô UVôpE�ô EôD9�c—o‘oô 9ñ~ ñ Ø:D×:VÒ:Vóó €ò
ð F€òôv˜ô vòt	ò&9ò65òp6ò(ò6ò"ò òñ& ƒw€ð ñ#ó ð#òòò Fò
Qò
òò(
ð ×Ñ�wÓÞGà#�Jr4   