§
    ŒŸjÔC  ã                   óT  — U d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dl mZm	Z	m
Z
 d dlmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZ er%ddlmZ  G d„ d	e
¦  «        Zeeef         Zej        Zd
„ Z G d„ d ej         dd¦  «        ¦  «        Z!d2d„Z"d2d„Z#d„ Z$d„ Z%d„ Z&d3d„Z'd„ e j(         )                    ¦   «         D ¦   «         Z*d3d„Z+d„ e j(         )                    ¦   «         D ¦   «         Z,d„ e j(         )                    ¦   «         D ¦   «         h d£z  Z-d„ Z.d„ Z/d„ Z0d„ Z1d„ Z2e j3        fZ4eedf         e5d <   	 d d!l6m7Z7 e4e7fz  Z4n# e8$ r Y nw xY wd"„ Z9d#„ Z:d$„ Z;d%„ Z<d&„ Z= e>¦   «         Z?d'„ Z@d3d(„ZAd)„ ZB G d*„ d+¦  «        ZCd,„ ZDd-„ ZEd.„ ZF ed¬/¦  «        d0„ ¦   «         ZGd1„ ZHdS )4é    N)ÚABCMeta)ÚModuleÚexprÚAST)Ú	lru_cache)ÚCallableÚDictÚIterableÚIteratorÚListÚOptionalÚTupleÚUnionÚcastÚAnyÚTYPE_CHECKINGÚTypeé   )ÚNodeNGc                   ó"   — e Zd ZdZdZdZdZdZdS )ÚEnhancedASTNr   )Ú__name__Ú
__module__Ú__qualname__Úfirst_tokenÚ
last_tokenÚlinenoÚ
end_linenoÚend_col_offset© ó    ú[/var/www/finuniver-perm.ru/html/student/venv/lib/python3.11/site-packages/asttokens/util.pyr   r   ,   s'   € € € € € à€KØ€JØ€FØ€JØ€N€N€Nr!   r   c                 óp   — t           j        |          ›dt          |¦  «                             d¦  «        ›�S )zRReturns a human-friendly representation of a token with the given type and string.ú:Úu)ÚtokenÚtok_nameÚreprÚlstrip)Útok_typeÚstrings     r"   Ú
token_reprr,   9   s3   € õ ”N 8Ô,Ð,Ð,­d°6©l¬l×.AÒ.AÀ#Ñ.FÔ.FÐ.FÐ	GÐGr!   c                   ó   — e Zd ZdZd„ ZdS )ÚTokenaƒ  
  TokenInfo is an 8-tuple containing the same 5 fields as the tokens produced by the tokenize
  module, and 3 additional ones useful for this module:

  - [0] .type     Token type (see token.py)
  - [1] .string   Token (a string)
  - [2] .start    Starting (row, column) indices of the token (a 2-tuple of ints)
  - [3] .end      Ending (row, column) indices of the token (a 2-tuple of ints)
  - [4] .line     Original line (string)
  - [5] .index    Index of the token in the list of tokens that it belongs to.
  - [6] .startpos Starting character offset into the input text.
  - [7] .endpos   Ending character offset into the input text.
  c                 ó6   — t          | j        | j        ¦  «        S ©N)r,   Útyper+   ©Úselfs    r"   Ú__str__zToken.__str__N   s   € å�d”i ¤Ñ-Ô-Ð-r!   N)r   r   r   Ú__doc__r4   r    r!   r"   r.   r.   @   s-   € € € € € ðð ð.ð .ð .ð .ð .r!   r.   z0type string start end line index startpos endposc                 ó6   — | j         |k    o|du p
| j        |k    S )zVReturns true if token is of the given type and, if a string is given, has that string.N)r1   r+   ©r&   r*   Útok_strs      r"   Úmatch_tokenr9   S   s&   € ð 
Œ�xÒ	Ð	P W° _Ð%O¸¼ÈÒ8OÐPr!   c                 óÆ   — t          | ||¦  «        sOt          dt          ||¦  «        ›dt          | ¦  «        ›d| j        d         ›d| j        d         dz   ›�¦  «        ‚dS )z³
  Verifies that the given token is of the expected type. If tok_str is given, the token string
  is verified too. If the token doesn't match, raises an informative ValueError.
  zExpected token z, got z	 on line r   z col r   N)r9   Ú
ValueErrorr,   ÚstrÚstartr7   s      r"   Úexpect_tokenr>   Y   sw   € õ 
�U˜H gÑ	.Ô	.ð +Ý
ˆ*Ý�˜7Ñ#Ô#Ð#Ð#¥S¨¡Z¤Z Z ZØ„k�!„n€n€n�e”k !”n qÑ(Ð(ð*ñ +ô +ð +ð+ð +r!   c                 óL   — | t           j        t           j        t           j        fv S )zS
  These are considered non-coding tokens, as they don't affect the syntax tree.
  )r&   ÚNLÚCOMMENTÚENCODING)Ú
token_types    r"   Úis_non_coding_tokenrD   e   s   € ð
 
�œ¥%¤-µ´Ð@Ð	@Ð@r!   c                 ó˜   — t          j        t          t          g t          f         t          j        | ¦  «        j        ¦  «        ¦  «        S )z;
  Generates standard library tokens for the given code.
  )ÚtokenizeÚgenerate_tokensr   r   r<   ÚioÚStringIOÚreadline)Útexts    r"   rG   rG   m   s5   € õ 
Ô	!¥$¥x°µC°Ô'8½"¼+ÀdÑ:KÔ:KÔ:TÑ"UÔ"UÑ	VÔ	VÐVr!   c                 ó>   — t          | d¦  «        rt          nt          S )zÑ
  Returns a function which yields all direct children of a AST node,
  skipping children that are singleton nodes.
  The function depends on whether ``node`` is from ``ast`` or from the ``astroid`` module.
  Úget_children)ÚhasattrÚiter_children_astroidÚiter_children_ast©Únodes    r"   Úiter_children_funcrS   x   s    € õ #*¨$°Ñ"?Ô"?Ð	VÕ	Ð	ÕEVÐVr!   Fc                 óP   — |st          | ¦  «        rg S |                      ¦   «         S r0   )Úis_joined_strrM   )rR   Úinclude_joined_strs     r"   rO   rO   ‚   s0   € à	ð ¥¨dÑ 3Ô 3ð Ø€Ià	×	Ò	Ñ	Ô	Ðr!   c           
      óÐ   — h | ]c\  }}t          |t          ¦  «        ¯t          |t          j        t          j        t          j        t          j        t          j        f¦  «        ¯a|’ŒdS r    )	Ú
isinstancer1   Ú
issubclassÚastÚexpr_contextÚboolopÚoperatorÚunaryopÚcmpop©Ú.0ÚnÚcs      r"   ú	<setcomp>rd   Š   sk   € ð cð cð c‘D�A�qµJ¸qÅ$Ñ4GÔ4Gð cÝ˜�SÔ-­s¬z½3¼<ÍÌÕVYÔV_Ð`ÑaÔaðcˆað cð cð cr!   c              #   ó  K  — |st          | ¦  «        rd S t          | t          j        ¦  «        r,t	          | j        | j        ¦  «        D ]\  }}|�|V — |V — Œd S t          j        | ¦  «        D ]}|j        t          vr|V — Œd S r0   )
rU   rX   rZ   r	   ÚzipÚkeysÚvaluesÚiter_child_nodesÚ	__class__Ú
SINGLETONS)rR   rV   ÚkeyÚvalueÚchilds        r"   rP   rP   Ž   s´   è è € à	ð ¥¨dÑ 3Ô 3ð Ø
€Få�•c”hÑÔð õ ˜DœI t¤{Ñ3Ô3ð ð ‰ˆˆeØ	ˆØˆ	ˆ	ˆ	Ø€k€k€k€kØ
€FåÔ# DÑ)Ô)ð ð €eð „�jÐ(Ð(Ø€k€k€køðð r!   c                 óv   — h | ]6\  }}t          |t          ¦  «        ¯t          |t          j        ¦  «        ¯4|’Œ7S r    )rX   r1   rY   rZ   Ústmtr`   s      r"   rd   rd   ¤   sV   € ð Hð Hð H™$˜!˜QÝ! !¥TÑ*Ô*ðHÝ/9¸!½S¼XÑ/FÔ/FðH�Að Hð Hð Hr!   c                 óv   — h | ]6\  }}t          |t          ¦  «        ¯t          |t          j        ¦  «        ¯4|’Œ7S r    )rX   r1   rY   rZ   r   r`   s      r"   rd   rd   ¦   sV   € ð Hð Hð H™4˜1˜aÝ! !¥TÑ*Ô*ðHÝ/9¸!½S¼XÑ/FÔ/FðH�Qð Hð Hð Hr!   >   ÚConstÚDelAttrÚDelNameÚ
AssignAttrÚ
AssignNamec                 ó(   — | j         j        t          v S )z+Returns whether node is an expression node.)rj   r   Úexpr_class_namesrQ   s    r"   Úis_exprry   ¬   ó   € ð 
ŒÔ	 Õ$4Ð	4Ð4r!   c                 ó(   — | j         j        t          v S )z)Returns whether node is a statement node.)rj   r   Ústmt_class_namesrQ   s    r"   Úis_stmtr}   ±   rz   r!   c                 ó"   — | j         j        dk    S )z&Returns whether node is a module node.r   ©rj   r   rQ   s    r"   Ú	is_moduler€   ¶   s   € ð 
ŒÔ	  HÒ	,Ð,r!   c                 ó"   — | j         j        dk    S )zFReturns whether node is a JoinedStr node, used to represent f-strings.Ú	JoinedStrr   rQ   s    r"   rU   rU   »   s   € ð
 
ŒÔ	  KÒ	/Ð/r!   c                 ó"   — | j         j        dk    S )zSReturns whether node is an `Expr` node, which is a statement that is an expression.ÚExprr   rQ   s    r"   Úis_expr_stmtr…   Ã   s   € ð 
ŒÔ	  FÒ	*Ð*r!   .ÚCONSTANT_CLASSES)rr   c                 ó,   — t          | t          ¦  «        S )z(Returns whether node is a Constant node.)rX   r†   rQ   s    r"   Úis_constantrˆ   Ò   s   € õ 
�DÕ*Ñ	+Ô	+Ð+r!   c                 ó<   — t          | ¦  «        o| j        t          u S )z)Returns whether node is an Ellipsis node.)rˆ   rm   ÚEllipsisrQ   s    r"   Úis_ellipsisr‹   Ø   s   € õ 
�TÑ	Ô	Ð	5˜tœz­XÐ5Ð5r!   c                 ó"   — | j         j        dk    S )z2Returns whether node is a starred expression node.ÚStarredr   rQ   s    r"   Ú
is_starredrŽ   Þ   s   € ð 
ŒÔ	  IÒ	-Ð-r!   c           	      ó¼   — | j         j        dv pN| j         j        dk    o>t          t          t          t          t          j        | ¦  «        j        ¦  «        ¦  «        S )z?Returns whether node represents a slice, e.g. `1:2` in `x[1:2]`)ÚSliceÚExtSlicer   )	rj   r   ÚanyÚmapÚis_slicer   rZ   r   ÚeltsrQ   s    r"   r”   r”   ä   sR   € ð „nÔÐ!6Ð6ð à
Œ.Ô
! WÒ
,ð =Ý•#•h¥¥S¤Y°Ñ 5Ô 5Ô :Ñ;Ô;Ñ<Ô<ð	r!   c                 ó˜   — | j         j        dk    o:t          | t          j        ¦  «         o| j        | j        cxu o| j        cxu od u nc S )Nr�   )rj   r   rX   rZ   r   ÚlowerÚupperÚsteprQ   s    r"   Úis_empty_astroid_slicerš   ò   se   € ð „nÔ Ò(ð 8Ý˜�sœwÑ'Ô'Ð
'ð8à
Œ*˜œ
Ð
7Ð
7Ð
7Ð
7 d¤iÐ
7Ð
7Ð
7Ð
7°4Ð
7Ð
7Ð
7Ð
7ðr!   c                 ó   — |sd„ }t          | ¦  «        }t          ¦   «         }d}| dt          fg}|rÌ|                     ¦   «         \  }}}	|	t          u r~||vsJ ‚|                     |¦  «          |||¦  «        \  }
}|                     |||f¦  «         t          |¦  «        } ||¦  «        D ] }|                     |||
t          f¦  «         Œ!n+ |||t          t          t                   |	¦  «        ¦  «        }|°Ì|S )a5  
  Scans the tree under the node depth-first using an explicit stack. It avoids implicit recursion
  via the function call stack to avoid hitting 'maximum recursion depth exceeded' error.

  It calls ``previsit()`` and ``postvisit()`` as follows:

  * ``previsit(node, par_value)`` - should return ``(par_value, value)``
        ``par_value`` is as returned from ``previsit()`` of the parent.

  * ``postvisit(node, par_value, value)`` - should return ``value``
        ``par_value`` is as returned from ``previsit()`` of the parent, and ``value`` is as
        returned from ``previsit()`` of this node itself. The return ``value`` is ignored except
        the one for the root node, which is returned from the overall ``visit_tree()`` call.

  For the initial node, ``par_value`` is None. ``postvisit`` may be None.
  c                 ó   — d S r0   r    )rR   Úpvaluerm   s      r"   ú<lambda>zvisit_tree.<locals>.<lambda>  s   € ¨D€ r!   N)rS   ÚsetÚ	_PREVISITÚpopÚaddÚappendÚlenÚinsertr   r   r.   )rR   ÚprevisitÚ	postvisitÚiter_childrenÚdoneÚretÚstackÚcurrentÚ	par_valuerm   r�   Ú
post_valueÚinsrb   s                 r"   Ú
visit_treer°   þ   s6  € ð$ 
ð 1Ø0Ð0€Iå$ TÑ*Ô*€-Ý	‰Œ€$Ø€#Ø�$�	Ð"Ð
#€%Øð HØ %§	¢	¡¤Ñ€GˆY˜Ø•	ÐÐØ˜DÐ Ð Ð Ð Ø
‡h‚hˆwÑÔÐà#˜8 G¨YÑ7Ô7Ñ€fˆjØ‡l‚l�G˜Y¨
Ð3Ñ4Ô4Ð4õ �‰JŒJ€cØˆ}˜WÑ%Ô%ð 2ð 2ˆ!Ø�Š�S˜1˜f¥iÐ0Ñ1Ô1Ð1Ð1ð2ð ˆI�g˜y­$­x½¬ÀÑ*FÔ*FÑGÔG€cð 	ð Hð 
€*r!   c              #   ó$  K  — t          | ¦  «        }t          ¦   «         }| g}|rk|                     ¦   «         }||vsJ ‚|                     |¦  «         |V — t	          |¦  «        } |||¦  «        D ]}|                     ||¦  «         Œ|°idS dS )a1  
  Recursively yield all descendant nodes in the tree starting at ``node`` (including ``node``
  itself), using depth-first pre-order traversal (yieling parents before their children).

  This is similar to ``ast.walk()``, but with a different order, and it works for both ``ast`` and
  ``astroid`` trees. Also, as ``iter_children()``, it skips singleton nodes generated by ``ast``.

  By default, ``JoinedStr`` (f-string) nodes and their contents are skipped
  because they previously couldn't be handled. Set ``include_joined_str`` to True to include them.
  N)rS   rŸ   r¡   r¢   r¤   r¥   )rR   rV   r¨   r©   r«   r¬   r¯   rc   s           r"   Úwalkr²   )  sÄ   è è € õ % TÑ*Ô*€-Ý	‰Œ€$Øˆ&€%Øð Ø�iŠi‰kŒk€GØ˜$ÐÐÐÐØ‡H‚HˆWÑÔÐà
€M€M€Mõ ˆe‰*Œ*€CØˆ]˜7Ð$6Ñ7Ô7ð ð ˆØ‡l‚l�3˜ÑÔÐÐð 	ð ð ð ð ð r!   c                 ó  — d}g }t          |¦  «        D ]:\  }}}|                     | ||…         ¦  «         |                     |¦  «         |}Œ;|                     | |d…         ¦  «         d                     |¦  «        S )ah  
  Replaces multiple slices of text with new values. This is a convenience method for making code
  modifications of ranges e.g. as identified by ``ASTTokens.get_text_range(node)``. Replacements is
  an iterable of ``(start, end, new_text)`` tuples.

  For example, ``replace("this is a test", [(0, 4, "X"), (8, 9, "THE")])`` produces
  ``"X is THE test"``.
  r   NÚ )Úsortedr£   Újoin)rK   ÚreplacementsÚpÚpartsr=   ÚendÚnew_texts          r"   Úreplacer¼   F  s‰   € ð €!Ø
€%Ý & |Ñ 4Ô 4ð ð Ñ€uˆc�8Ø	‡L‚L��a˜�g”ÑÔÐØ	‡L‚L�ÑÔÐØ€A€AØ‡,‚,ˆt�A�B�BŒxÑÔÐØ	�Š�‰ŒÐr!   c                   ó   — e Zd ZdZd„ Zd„ ZdS )ÚNodeMethodsz[
  Helper to get `visit_{node_type}` methods given a node's class and cache the results.
  c                 ó   — i | _         d S r0   )Ú_cacher2   s    r"   Ú__init__zNodeMethods.__init__^  s   € à€D„K€K€Kr!   c                 ó¶   — | j                              |¦  «        }|s<d|j                             ¦   «         z   }t	          |||j        ¦  «        }|| j         |<   |S )z£
    Using the lowercase name of the class as node_type, returns `obj.visit_{node_type}`,
    or `obj.visit_default` if the type-specific method is not found.
    Úvisit_)rÀ   Úgetr   r—   ÚgetattrÚvisit_default)r3   ÚobjÚclsÚmethodÚnames        r"   rÄ   zNodeMethods.getb  s\   € ð Œ[�_Š_˜SÑ!Ô!€FØð  Ø˜œ×*Ò*Ñ,Ô,Ñ,€dÝ�s˜D #Ô"3Ñ4Ô4€fØ€d„k�#ÑØ€Mr!   N)r   r   r   r5   rÁ   rÄ   r    r!   r"   r¾   r¾   Z  s<   € € € € € ðð ðð ð ðð ð ð ð r!   r¾   c              #   ó,  K  — g }| D ]v}|j         t          j        t          j        t          j        fv r.|r|d         j        |j        k    r|                     |¦  «         ŒZt          |¦  «        D ]}|V — Œg }|V — Œwt          |¦  «        D ]}|V — ŒdS )a¬  
    Fixes tokens yielded by `tokenize.generate_tokens` to handle more non-ASCII characters in identifiers.
    Workaround for https://github.com/python/cpython/issues/68382.
    Should only be used when tokenizing a string that is known to be valid syntax,
    because it assumes that error tokens are not actually errors.
    Combines groups of consecutive NAME, NUMBER, and/or ERRORTOKEN tokens into a single NAME token.
    éÿÿÿÿN)	r1   rF   ÚNAMEÚ
ERRORTOKENÚNUMBERrº   r=   r£   Úcombine_tokens)Úoriginal_tokensÚgroupÚtokÚcombined_tokens       r"   Úpatched_generate_tokensrÕ   p  sÎ   è è € ð €EØð ð ˆà
Œ(•x”}¥hÔ&9½8¼?ÐKÐ
KÐ
Kàð Là! "œIœM¨S¬YÒ6Ð6à�Š�SÑÔÐÐå,¨UÑ3Ô3ð 	ð 	ˆNØÐ
Ð
Ð
Ð
ØˆØˆ	ˆ	ˆ	ˆ	Ý(¨Ñ/Ô/ð ð ˆØÐÐÐÐðð r!   c                 ó6  — t          d„ | D ¦   «         ¦  «        rt          d„ | D ¦   «         ¦  «        dk    r| S t          j        t          j        d                     d„ | D ¦   «         ¦  «        | d         j        | d         j        | d         j        ¬¦  «        gS )	Nc              3   ó@   K  — | ]}|j         t          j        k    V — Œd S r0   )r1   rF   rÎ   ©ra   rÓ   s     r"   ú	<genexpr>z!combine_tokens.<locals>.<genexpr>‹  s,   è è € Ð@Ð@°3ˆsŒx�8Ô.Ò.Ð@Ð@Ð@Ð@Ð@Ð@r!   c                 ó   — h | ]	}|j         ’Œ
S r    )ÚlinerØ   s     r"   rd   z!combine_tokens.<locals>.<setcomp>‹  s   € ÐHcÐHcÐHcÐVYÈÌÐHcÐHcÐHcr!   r   r´   c              3   ó$   K  — | ]}|j         V — Œd S r0   )r+   )ra   Úts     r"   rÙ   z!combine_tokens.<locals>.<genexpr>�  s$   è è € Ð/Ð/ A�q”xÐ/Ð/Ð/Ð/Ð/Ð/r!   r   rÌ   )r1   r+   r=   rº   rÛ   )	r’   r¤   rF   Ú	TokenInforÍ   r¶   r=   rº   rÛ   )rÒ   s    r"   rÐ   rÐ   ‰  s¦   € åÐ@Ð@¸%Ð@Ñ@Ô@Ñ@Ô@ð ÅCÐHcÐHcÐ]bÐHcÑHcÔHcÑDdÔDdÐhiÒDiÐDiØ€låÔÝŒ]Ø�wŠwÐ/Ð/¨Ð/Ñ/Ô/Ñ/Ô/Ø�AŒhŒnØ�"ŒIŒMØ�1ŒXŒ]ðñ ô ðð r!   c                 óx   — d„  t          | ¦  «        | ¦  «        D ¦   «         }|rt          |d         ¦  «        S | S )zq
  If the given AST node contains multiple statements, return the last one.
  Otherwise, just return the node.
  c                 ó\   — g | ])}t          |¦  «        st          |¦  «        j        d v ¯'|‘Œ*S ))ÚexcepthandlerÚExceptHandlerÚ
match_caseÚ	MatchCaseÚ	TryExceptÚ
TryFinally)r}   r1   r   )ra   rn   s     r"   ú
<listcomp>zlast_stmt.<locals>.<listcomp>ž  sQ   € ð 
ð 
ð 
ØÝˆu�~„~ð
å˜e™œÔ-ð 2ð ð ð 
ðð ð r!   rÌ   )rS   Ú	last_stmt)rR   Úchild_stmtss     r"   rè   rè   ˜  sT   € ð
ð 
Ø/Õ)¨$Ñ/Ô/°Ñ5Ô5ð
ñ 
ô 
€+ð ð &Ý�[ ”_Ñ%Ô%Ð%Ø	€+r!   )Úmaxsizec                  ó  ‡— dŠt          j        ‰¦  «        } d„ t          j        | ¦  «        D ¦   «         }d„ |D ¦   «         }t          t	          |¦  «        ¦  «        t          |¦  «        k    }t          ˆfd„|D ¦   «         ¦  «        }|o|S )aÜ  
  The positions attached to nodes inside f-string FormattedValues have some bugs
  that were fixed in Python 3.9.7 in https://github.com/python/cpython/pull/27729.
  This checks for those bugs more concretely without relying on the Python version.
  Specifically this checks:
   - Values with a format spec or conversion
   - Repeated (i.e. identical-looking) expressions
   - f-strings implicitly concatenated over multiple lines.
   - Multiline, triple-quoted f-strings.
  zÉ(
    f"a {b}{b} c {d!r} e {f:g} h {i:{j}} k {l:{m:n}}"
    f"a {b}{b} c {d!r} e {f:g} h {i:{j}} k {l:{m:n}}"
    f"{x + y + z} {x} {y} {z} {z} {z!a} {z:z}"
    f'''
    {s} {t}
    {u} {v}
    '''
  )c                 óF   — g | ]}t          |t          j        ¦  «        ¯|‘ŒS r    )rX   rZ   ÚName©ra   rR   s     r"   rç   z*fstring_positions_work.<locals>.<listcomp>Æ  s)   € ÐNÐNÐN˜µ:¸dÅCÄHÑ3MÔ3MÐN�ÐNÐNÐNr!   c                 ó*   — g | ]}|j         |j        f‘ŒS r    )r   Ú
col_offsetrî   s     r"   rç   z*fstring_positions_work.<locals>.<listcomp>Ç  s!   € ÐJÐJÐJ°t�T”[ $¤/Ð2ÐJÐJÐJr!   c              3   óT   •K  — | ]"}t          j        ‰|¦  «        |j        k    V — Œ#d S r0   )rZ   Úget_source_segmentÚid)ra   rR   Úsources     €r"   rÙ   z)fstring_positions_work.<locals>.<genexpr>É  sK   øè è € ð  ð  àõ Ô˜6 4Ñ(Ô(¨D¬GÒ3ð ð  ð  ð  ð  ð  r!   )rZ   Úparser²   r¤   rŸ   Úall)ÚtreeÚ
name_nodesÚname_positionsÚpositions_are_uniqueÚcorrect_source_segmentsrô   s        @r"   Úfstring_positions_workrü   ¯  s°   ø€ ð€&õ 
Œ�6Ñ	Ô	€$ØNÐN¥¤¨$¡¤ÐNÑNÔN€*ØJÐJ¸zÐJÑJÔJ€.Ý�S Ñ0Ô0Ñ1Ô1µS¸Ñ5HÔ5HÒHÐÝð  ð  ð  ð  àð ñ  ô  ñ ô Ðð 
Ð	9Ð"9Ð9r!   c                 ó˜  — t           j        dk    rdS t          | d¬¦  «        D ]¥}t          |t          j        ¦  «        sŒ|j        D ]€}t          |dd¦  «         t          |t          j        ¦  «        rSt          ¦   «         s(t          |j
        ¦  «        D ]}t          |dd¦  «         Œ|j        rt          |j        dd¦  «         Œ�Œ¦dS )zy
  Add a special attribute `_broken_positions` to nodes inside f-strings
  if the lineno/col_offset cannot be trusted.
  )é   é   NT)rV   Ú_broken_positions)ÚsysÚversion_infor²   rX   rZ   r‚   rh   ÚsetattrÚFormattedValuerü   rm   Úformat_spec)r÷   Ú	joinedstrÚpartrn   s       r"   Úannotate_fstring_nodesr  Ï  sô   € õ 	Ô˜Ò Ð ð €FÝ˜°Ð6Ñ6Ô6ð ?ð ?€iÝ�i¥¤Ñ/Ô/ð ØØÔ ð ?ð ?ˆåˆdÐ'¨Ñ.Ô.Ð.å	�D�#Ô,Ñ	-Ô	-ð ?Ý%Ñ'Ô'ð 	6Ý˜DœJÑ'Ô'ð 6ð 6ˆeÝ�EÐ.°Ñ5Ô5Ð5Ð5àÔð 	?å
�$Ô"Ð$7¸Ñ
>Ô
>Ð
>øð?ð?ð ?r!   r0   )F)IrZ   ÚcollectionsrH   r  r&   rF   Úabcr   r   r   r   Ú	functoolsr   Útypingr   r	   r
   r   r   r   r   r   r   r   r   r   Úastroid_compatr   r   ÚAstNoderÞ   r,   Ú
namedtupler.   r9   r>   rD   rG   rS   rO   Ú__dict__Úitemsrk   rP   r|   rx   ry   r}   r€   rU   r…   ÚConstantr†   Ú__annotations__Úastroid.nodesrr   ÚImportErrorrˆ   r‹   rŽ   r”   rš   Úobjectr    r°   r²   r¼   r¾   rÕ   rÐ   rè   rü   r  r    r!   r"   ú<module>r     s»  ðð €
€
€
€
Ø Ð Ð Ð Ø 	€	€	€	Ø 
€
€
€
Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð !Ø$Ð$Ð$Ð$Ð$Ð$ðð ð ð ð �Cñ ô ð ð �+˜vÐ%Ô&€'àÔ €)ðHð Hð Hð.ð .ð .ð .ð .Ð"ˆKÔ" 7Ð,^Ñ_Ô_ñ .ô .ð .ð&Qð Qð Qð Qð	+ð 	+ð 	+ð 	+ðAð Að AðWð Wð WðWð Wð Wðð ð ð ðcð c˜CœL×.Ò.Ñ0Ô0ð cñ cô c€
ðð ð ð ð,Hð H #¤,×"4Ò"4Ñ"6Ô"6ð Hñ Hô HÐ ðHð H 3¤<×#5Ò#5Ñ#7Ô#7ð Hñ Hô HàOÐOÐOñPÐ ð5ð 5ð 5ð
5ð 5ð 5ð
-ð -ð -ð
0ð 0ð 0ð+ð +ð +ð '*¤l _Ð �%˜˜c˜	Ô"Ð 4Ð 4Ñ 4ðØ!Ð!Ð!Ð!Ð!Ð!Ø�u�hÑÐÐøØð ð ð à€$ðøøøð,ð ,ð ,ð6ð 6ð 6ð.ð .ð .ðð ð ðð ð ð ˆF‰HŒH€	ð(ð (ð (ðVð ð ð ð:ð ð ð(ð ð ð ð ñ ô ð ð,ð ð ð2ð ð ðð ð ð. €�4ÐÑÔð:ð :ñ Ôð:ð>?ð ?ð ?ð ?ð ?s   Ä?E ÅEÅE