o
    #iJ                     @   s*  d dl Z d dlZd dlmZ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 d dlmZmZmZ d dlmZ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#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) d dl*m+Z+ d dl,m-Z- d d	l.m/Z/m0Z0 ed
Z1e2Z3e2Z4ee/e0f Z5eG dd dZ6eG dd dZ7eG dd dZ8eG dd dZ9dee1 deee3e1f  fddZ:	d3de6de6de	e/ de;ddf
ddZ<ddd e6d!ed"e=de;fd#d$Z>d e6de;fd%d&Z?d'e7d(e2de;fd)d*Z@d e6d+e/d(e2de;fd,d-ZAd e6d.e/d(e2de;fd/d0ZBd e6de=fd1d2ZCdS )4    N)	dataclassfield)
CallableDictIteratorListOptionalSequenceTupleTypeVarUnioncast)COMMA_PRIORITYDOT_PRIORITYBracketTracker)ModePreview)BRACKETSCLOSING_BRACKETSOPENING_BRACKETSSTANDALONE_COMMENTTEST_DESCENDANTSchild_towardsis_docstring
is_funcdef	is_importis_multiline_stringis_one_sequence_betweenis_type_commentis_type_ignore_commentis_with_or_async_with_stmtmake_simple_prefixreplace_childsyms
whitespace)	str_width)token)LeafNodeTc                	   @   s  e Zd ZU dZeddZeed< dZe	ed< ee
dZee ed< eedZeeee f ed	< eedZeed
< dZeed< dZeed< dZee ed< 	dSdedededdfddZdTdededdfddZedefddZedefddZedefddZedefddZedefdd Z edefd!d"Z!edefd#d$Z"edefd%d&Z#edefd'd(Z$edefd)d*Z%edefd+d,Z&edefd-d.Z'dd/d0ee(egef  defd1d2Z)defd3d4Z*defd5d6Z+defd7d8Z,defd9d:Z-defd;d<Z.	dTd=ed>edefd?d@Z/dAedefdBdCZ0dedee fdDdEZ1dUdFdGZ2dedefdHdIZ3	dTdJede4e5e6ee	f  fdKdLZ7dVdMdNZ8de9fdOdPZ:defdQdRZ;dS )WLinez;Holds leaves and comments. Can be printed with `str(line)`.F)reprmoder   depthdefault_factoryleavescommentsbracket_trackerinside_bracketsshould_split_rhsNmagic_trailing_commaleafpreformattedtrack_bracketreturnc                 C   s   |j tv pt|j }|sdS tj|j kr| jr| jdd= | jr4|s4| j	t
|| || jd7  _	| js;|r;|rY| j| | jjrN| |rM|| _n| j|ddrY|   | |sf| j| dS dS )ag  Add a new `leaf` to the end of the line.

        Unless `preformatted` is True, the `leaf` will receive a new consistent
        whitespace prefix and metadata applied by :class:`BracketTracker`.
        Trailing commas are maybe removed, unpacked for loop variables are
        demoted from being delimiters.

        Inline comments are put aside.
        N)complex_subscriptr,   T)ensure_removable)typer   boolvaluestripr&   COLONis_class_paren_emptyr0   prefixr$   is_complex_subscriptr,   r3   r2   markr5   has_magic_trailing_commaremove_trailing_commaappend_commentappend)selfr6   r7   r8   	has_value rL   R/var/www/GraceOrthoHospital/venv_grace/lib/python3.10/site-packages/black/lines.pyrI   @   s,   



zLine.appendc                 C   sN   | j jdks| j  r| jrtd| jr|jtkrtd| j||d dS )zLike :func:`append()` but disallow invalid standalone comment structure.

        Raises ValueError when any `leaf` is appended after a standalone comment
        or when a standalone comment is not the first leaf on the line.
        r   z$cannot append to standalone commentsz5cannot append standalone comments to a populated liner7   N)	r2   r-   any_open_for_or_lambda
is_comment
ValueErrorr0   r=   r   rI   )rJ   r6   r7   rL   rL   rM   append_safed   s   zLine.append_safec                 C   s   t | jdko| jd jtkS )z"Is this line a standalone comment?   r   )lenr0   r=   r   rJ   rL   rL   rM   rP   x   s   zLine.is_commentc                 C   s   t | o| jd jtjkS )zIs this line a decorator?r   )r>   r0   r=   r&   ATrU   rL   rL   rM   is_decorator}   s   zLine.is_decoratorc                 C      t | o
t| jd S )zIs this an import line?r   )r>   r   r0   rU   rL   rL   rM   r         zLine.is_importc                 C   rX   )zIs this a with_stmt line?r   )r>   r    r0   rU   rL   rL   rM   r       rY   zLine.is_with_or_async_with_stmtc                 C   s*   t | o| jd jtjko| jd jdkS )z Is this line a class definition?r   class)r>   r0   r=   r&   NAMEr?   rU   rL   rL   rM   is_class   s
   zLine.is_classc                 C   s&   | j o| jdd dd tdD kS )zEIs this line a class definition with a body consisting only of "..."?Nc                 S      g | ]}t tjd qS .r'   r&   DOT.0_rL   rL   rM   
<listcomp>       z&Line.is_stub_class.<locals>.<listcomp>   )r\   r0   rangerU   rL   rL   rM   is_stub_class   s   zLine.is_stub_classc                 C   s   z| j d }W n
 ty   Y dS w z| j d }W n ty$   d}Y nw |jtjkr0|jdkpD|jtjkoD|duoD|jtjkoD|jdkS )zBIs this a function definition? (Also returns True for async defs.)r   FrS   Ndef)r0   
IndexErrorr=   r&   r[   r?   ASYNC)rJ   
first_leafsecond_leafrL   rL   rM   is_def   s$   
zLine.is_defc                 C   s4   | j o| jdd ttjdgdd tdD  kS )zHIs this line a function definition with a body consisting only of "..."?N:c                 S   r^   r_   ra   rc   rL   rL   rM   rf      rg   z$Line.is_stub_def.<locals>.<listcomp>rh   )rp   r0   r'   r&   rA   ri   rU   rL   rL   rM   is_stub_def   s   $
zLine.is_stub_defc                 C   s`   t | o/t| jdko/| jo/| jd jtjko/| jd jdko/| jd jtjko/| jd jdkS )zzIs this a class with no base classes but using parentheses?

        Those are unnecessary and should be removed.
              (rh   ))	r>   rT   r0   r\   r=   r&   LPARr?   RPARrU   rL   rL   rM   rB      s   zLine.is_class_paren_emptyc                 C   sR   | r| j d jtjkrdS | j d j}|drdS tj| jv r'|dr'dS dS )z#Is the line a triple quoted string?r   F)z"""z'''T)zr'''zr"""zR'''zR""")	r0   r=   r&   STRINGr?   
startswithr   accept_raw_docstringsr,   )rJ   r?   rL   rL   rM   is_triple_quoted_string   s   
zLine.is_triple_quoted_stringc                 C   s   dd | j D tjdkS )z Is the line a chained assignmentc                 S   s   g | ]}|j qS rL   r=   rd   r6   rL   rL   rM   rf      s    z.Line.is_chained_assignment.<locals>.<listcomp>rS   )r0   countr&   EQUALrU   rL   rL   rM   is_chained_assignment   s   zLine.is_chained_assignmentc                 C   s$   t | jdkr	dS | jd jtjkS )z/Does this line open a new level of indentation.r   F)rT   r0   r=   r&   rA   rU   rL   rL   rM   opens_block   s   zLine.opens_blockfirst_leaf_matchesr   c                C   sF   t | jdkr	dS | jd }|jtks|jdu rdS |du p"||jS )zIs this line converted from fmt off/skip code?

        If first_leaf_matches is not None, it only returns True if the first
        leaf of converted code matches.
        rS   Fr   N)rT   r0   r=   r   fmt_pass_converted_first_leaf)rJ   r   r6   rL   rL   rM   is_fmt_pass_converted   s   



zLine.is_fmt_pass_convertedc                 C   s    | j D ]
}|jtkr dS qdS )z)If so, needs to be split before emitting.TF)r0   r=   r   rJ   r6   rL   rL   rM   contains_standalone_comments   s
   

z!Line.contains_standalone_commentsc                 C   s^   t | jdd D ]#\}}|tjkrq	t|}t|dkrq	|D ]}| |r+  dS q q	dS )zFChck if we have an implicit multiline string with comments on the linec                 S   s   | j S Nr~   )r6   rL   rL   rM   <lambda>   s    zGLine.contains_implicit_multiline_string_with_comments.<locals>.<lambda>rS   TF)	itertoolsgroupbyr0   r&   rz   listrT   comments_after)rJ   	leaf_typeleaf_group_iterator	leaf_listr6   rL   rL   rM   0contains_implicit_multiline_string_with_comments   s   


z5Line.contains_implicit_multiline_string_with_commentsc                 C   s   t  }z)| jd }|t| |jtjks|jtjkr+|js+| jd }|t| W n
 t	y6   Y dS w d}| j
 D ]\}}|D ]}t|rX|sTt|sX||vrX  dS d}qDq>dS )Nr   r:   FT)setr0   addidr=   r&   COMMAry   r?   rl   r1   itemsr   r   )rJ   ignored_ids	last_leafcomment_seenleaf_idr1   commentrL   rL   rM   $contains_uncollapsable_type_comments  s0   


z)Line.contains_uncollapsable_type_commentsc                 C   s   | j sdS tdd | j D d}tdd t| j D d}||kr?| j dd  D ]}| jt|g D ]
}t|r=  dS q3q(dS )NFc                 s        | ]}|j d kr|j V  qdS r   Nlinenor   rL   rL   rM   	<genexpr>@      z9Line.contains_unsplittable_type_ignore.<locals>.<genexpr>r   c                 s   r   r   r   r   rL   rL   rM   r   B  r   r:   T)r0   nextreversedr1   getr   r   )rJ   
first_line	last_linenoder   rL   rL   rM   !contains_unsplittable_type_ignore/  s   z&Line.contains_unsplittable_type_ignorec                 C   s   t dd | jD S )Nc                 s   s    | ]}t |V  qd S r   )r   r   rL   rL   rM   r   Q      z2Line.contains_multiline_strings.<locals>.<genexpr>)anyr0   rU   rL   rL   rM   contains_multiline_stringsP  s   zLine.contains_multiline_stringsclosingr<   c                 C   s   |j tv r| jr| jd j tjksdS |j tjkrdS |j tjkrD|jdurB|jj tj	krB|j
durBt|j
|| jtjtjfdrBdS dS | jrIdS |j
durXt|j
|| jsXdS dS )aT  Return True if we have a magic trailing comma, that is when:
        - there's a trailing comma here
        - it's not a one-tuple
        - it's not a single-element subscript
        Additionally, if ensure_removable:
        - it's not from square bracket indexing
        (specifically, single-element square bracket indexing)
        r   FTN)brackets)r=   r   r0   r&   r   RBRACERSQBparentr#   traileropening_bracketr   LSQBr   )rJ   r   r<   rL   rL   rM   rF   S  s6   




zLine.has_magic_trailing_commar   c                 C   s   |j tkr| j rd|_dS |j tjkrdS | js"t|_ d|_dS | jd }|j tjkrV|j	sV|j
rVtt|j
 dkrVt|sVt| jdk rQt|_ d|_dS | jd }| jt|g | dS )z0Add an inline or standalone comment to the line. Fr   rh   ru   r:   T)r=   r   r2   any_open_bracketsrC   r&   COMMENTr0   ry   r?   r   rT   r   r   r1   
setdefaultr   rI   )rJ   r   r   rL   rL   rM   rH     s6   


zLine.append_commentc                 C   s   | j t|g S )z;Generate comments that should appear directly after `leaf`.)r1   r   r   r   rL   rL   rM   r     s   zLine.comments_afterc                 C   s>   | j  }| jt|g }| jt| j d g | dS )z@Remove the trailing comma and moves the comments attached to it.r   N)r0   popr1   r   r   extend)rJ   trailing_commatrailing_comma_commentsrL   rL   rM   rG     s
   
zLine.remove_trailing_commac                 C   sj   | j  }|du rdS |j}t|tr&|jtjkrdS |jtjkr&t	||}|duo4t
dd | D S )zAReturn True iff `leaf` is part of a slice with non-trivial exprs.NFc                 s   s    | ]}|j tv V  qd S r   )r=   r   )rd   nrL   rL   rM   r     s    

z,Line.is_complex_subscript.<locals>.<genexpr>)r2   get_open_lsqbnext_sibling
isinstancer(   r=   r#   	listmakersubscriptlistr   r   	pre_order)rJ   r6   	open_lsqbsubscript_startrL   rL   rM   rD     s   


zLine.is_complex_subscriptr   c                 c   s    t ttt gttttf  f |rtnt}|| j	D ]+\}}t
|jt
|j }d|jv r2 dS | |D ]	}|t
|j7 }q7|||fV  qdS )zReturn an enumeration of leaves with their length.

        Stops prematurely on multiline strings and standalone comments.
        
N)r   r   r	   r'   r   r
   Indexenumerate_reversed	enumerater0   rT   rC   r?   r   )rJ   r   opindexr6   lengthr   rL   rL   rM   enumerate_with_length  s   

zLine.enumerate_with_lengthc                 C   s   t | j| j| j| j| jdS )N)r,   r-   r3   r4   r5   )r*   r,   r-   r3   r4   r5   rU   rL   rL   rM   clone  s   z
Line.clonec                 C   sz   | sdS d| j  }t| j}t|}|j | |j }|D ]}|t|7 }qtj	| j
 D ]}|t|7 }q0|d S )zRender the line.r   z    )r-   iterr0   r   rC   r?   strr   chainfrom_iterabler1   values)rJ   indentr0   firstresr6   r   rL   rL   rM   __str__  s   

zLine.__str__c                 C   s   t | jp| jS )z/Return True if the line has leaves or comments.)r>   r0   r1   rU   rL   rL   rM   __bool__  s   zLine.__bool__)FFF)r9   N)r9   r*   )<__name__
__module____qualname____doc__r   r,   r   __annotations__r-   intr   r0   r   r'   dictr1   r   LeafIDr   r2   r3   r>   r4   r5   r   rI   rR   propertyrP   rW   r   r    r\   rj   rp   rs   rB   r}   r   r   r   r   r   r   r   r   r   rF   rH   r   rG   rD   r   r
   r   r   r   r   r   r   rL   rL   rL   rM   r*   2   s   
 
$
$!
/%


	r*   c                   @   s:   e Zd ZU dZeed< eed< eed< eed< eed< dS )	RHSResultz2Intermediate split result from a right hand split.headbodytailr   closing_bracketN)r   r   r   r   r*   r   r'   rL   rL   rL   rM   r     s   
 r   c                   @   sz   e Zd ZU dZeed< ed  ed< eed< dZe	ed< e
edZee ed< dZe	ed	< d
Zeed< dee fddZdS )
LinesBlockzClass that holds information about a block of formatted lines.

    This is introduced so that the EmptyLineTracker can look behind the standalone
    comments and adjust their empty lines for class or def lines.
    r,   previous_blockoriginal_liner   beforer.   content_linesafterF	form_feedr9   c                 C   s8   t t| jd}t| j| j|}|g| j || j g S )N)r,   )r   r*   r,   r!   r   r   r   r   )rJ   
empty_linerC   rL   rL   rM   	all_lines  s   zLinesBlock.all_linesN)r   r   r   r   r   r   r   r*   r   r   r   r   r   r   r   r   r   r>   r   rL   rL   rL   rM   r     s   
 r   c                
   @   s   e Zd ZU dZeed< dZee ed< dZ	ee
 ed< eedZee ed< dZee
 ed< d	ed
e
fddZd	ed
eeef fddZd	ededed
eeef fddZdS )EmptyLineTrackera{  Provides a stateful method that returns the number of potential extra
    empty lines needed before and after the currently processed line.

    Note: this tracker works on lines that haven't been split yet.  It assumes
    the prefix of the first leaf consists of optional newlines.  Those newlines
    are consumed by `maybe_empty_lines()` and included in the computation.
    r,   Nprevious_liner   r.   previous_defssemantic_leading_commentcurrent_liner9   c                 C   s"  t j| jv o|jdkot|jod|jd jv }| |\}}| jr&| jj	nd}| j
du r/dn|| }t j|jv rX| jrX| jjdu rXt| jjjdkrX| jjjrX|jsX|jsXd}t| j| j||||d}|jr| j
du s}| j
js| j
jrv|r| jdu s}|r|| _n|jr|rd| _|| _
|| _|S )zReturn the number of extra empty lines before and after the `current_line`.

        This is for separating `def`, `async def` and `class` with extra empty
        lines (two on module-level).
        r   z
NrS   )r,   r   r   r   r   r   )r   allow_form_feedsr,   r-   r>   r0   rC   _maybe_empty_linesr   r   r   module_docstring_newlinesrT   r   r}   r\   rp   r   rP   rW   r   )rJ   r   r   r   r   previous_afterblockrL   rL   rM   maybe_empty_lines)  sb   



z"EmptyLineTracker.maybe_empty_linesc           	      C   sF  d}|j dkr| jjrdnd}|jr&|jd }|jd}t||}d|_nd}t|}|j }d }| jrL| jd j |krL| j	 }| jrL| jd j |ks<|d ur| j
d usWJ | jjr|rk|jsk| j
jrk|rhdnd}n7tj| jv rz|jrz|jszd}n(|rd}n#d}n |rd}n|s|j r|jd jtjkr|jd jdvrd}nd}|js|js|jr| |||S | j
r| j
jr|js|jtds|| j
j kr|pddfS | j
r| j
jr|jrtj|jv rd	S |dfS tj|jv ot|jd  p| j
o| j
jd o| j
jd jot| j
jd j }| j
r| j
jr|sd
S |dfS )NrS   r   ru   r   r   r   )withtryforwhileifmatchr   r   rS   r   r   )r-   r,   is_pyir0   rC   r   minr>   r   r   r   rp   r   "blank_line_after_nested_stub_classr\   rj   r=   r&   rA   r?   rW   #_maybe_empty_lines_for_class_or_defr   r   r}   $no_blank_line_before_class_docstringallow_empty_first_line_in_blockr   r   r   r   )	rJ   r   max_allowedrn   r   user_had_newliner-   previous_defis_empty_first_line_okrL   rL   rM   r   b  s   






z#EmptyLineTracker._maybe_empty_linesr   r  c                 C   s  |j s	| j| | jd u rdS | jj r| jjr|jrdS dS | jj|jk r0| jjs.| jj	r0dS d }| jj
ra| jj|jkra|dkra| j}|d ur_|jd ur_|jjjs_|jjjs_|jdkr_|}ndS | jjr|jsl| jjr| jj|jk rvd}n_| jj|jkrd}nU|jr| jjrd}nKd}nHtj|jv r| jj|jkrd}n8|j	s|j r| jj	s|jrtd|}n%d}n"| jj|jkrd}nd}n|jrdnd}tj| jv r| jjr|sd}|d ur|j}|d urt|j||j |_d}|dfS )Nr  r  r   rS   ru   )rW   r   rI   r   r,   r  rj   r-   r\   rp   rP   r   r   r   r   r   r   +blank_line_between_nested_and_def_stub_filer  dummy_implementationsrs   maxr   )rJ   r   r   r  comment_to_add_newlinesslcnewlinesr   rL   rL   rM   r
    s   


z4EmptyLineTracker._maybe_empty_lines_for_class_or_def)r   r   r   r   r   r   r   r   r*   r   r   r   r   r   r   r   r   r
   r   r   r>   r
  rL   rL   rL   rM   r     s$   
 9i
r   sequencer9   c                 c   s2    t | d }t| D ]}||fV  |d8 }qdS )z;Like `reversed(enumerate(sequence))` if that were possible.rS   N)rT   r   )r  r   elementrL   rL   rM   r   +  s   

r   Fnew_lineold_liner0   r7   c                 C   sR   |D ]$}t |j|j}t|| | j||d ||D ]	}| j|dd qqdS )a  
    Append leaves (taken from @old_line) to @new_line, making sure to fix the
    underlying Node structure where appropriate.

    All of the leaves in @leaves are duplicated. The duplicates are then
    appended to @new_line and used to replace their originals in the underlying
    Node structure. Any comments attached to the old leaves are reattached to
    the new leaves.

    Pre-conditions:
        set(@leaves) is a subset of set(@old_line.leaves).
    rN   TN)r'   r=   r?   r"   rI   r   )r  r  r0   r7   old_leafnew_leafcomment_leafrL   rL   rM   append_leaves3  s   
r  r   )line_strliner,   r  c                C   s  |st | }tj|v rtnt}tj|vr$|||jko#d|vo#|   S |  r*dS d|vr5|||jkS |d^}}}|||jksL|||jkrNdS g }d}g }	t	j
}
t| jD ]\}}|
t	j
krd}|jd t|krv|d n|jd t|k r| }|dur|dur|j|jd kr|j}
|dkr dS |j|
kr|jtjkrdg}||	7 }|j|v r|t| jd ks||j  d7  < |
t	j
krt|
|j}
t|rt|	dkr dS |}|}t||v r|	| |jdu rn	|j}t||v sq\t|	dkrdS tdd |D S )	a  For non-multiline strings, return True if `line` is no longer than `line_length`.
    For multiline strings, looks at the context around `line` to determine
    if it should be inlined or split up.
    Uses the provided `line_str` rendering, if any, otherwise computes a new one.
    r   FNrS   r   Tc                 s   s    | ]}|d kV  qdS r   rL   )rd   valrL   rL   rM   r     r   z'is_line_short_enough.<locals>.<genexpr>)line_to_stringr   respect_east_asian_widthr%   rT   multiline_string_handlingline_lengthr   splitmathinfr   r0   bracket_depthrI   r   r=   r&   r   prev_siblingr  r   r   r   all)r   r,   r  widthr   re   lastcommasmultiline_stringmultiline_string_contextsmax_level_to_updateir6   	had_commaignore_ctxsctxrL   rL   rM   is_line_short_enoughK  sn   




r6  c                 C   s   | j }t|dk rdS |d jtjkrr|d jtjkrrd}d}|d }|ddd D ]G}|jtv r>|jtvr9 dS |d7 }n(|jtjkrI|d7 }n|jtjkr^|jtjks]|jtv s] dS n|jtvrf dS |dkrq|dkrq dS q*dS )	zReturn False if the line cannot be split *for sure*.

    This is not an exhaustive search but a cheap heuristic that we can use to
    avoid some unfortunate formattings (mostly around wrapping unsplittable code
    in unnecessary parentheses).
    ru   Fr   rS   r   r:   NT)	r0   rT   r=   r&   rz   rb   r   r   r[   )r   r0   
call_count	dot_countr   r6   rL   rL   rM   can_be_split  s0    




r9  rhsr%  c                 C   s  | j }d}t|jD ]'}|r||ju rd}|jtkr|s dS |s1|jtv r1|j|jv r1|jr1|}q
|j}|j	s:dS |
 }||}|dkrIdS |dkr]tj|jv r]|tkr]| jjr]dS |tkrcdS t|jdksnJ d|jd }|jd }	|jtv r|	jtvrt|||drdS |jd	 }
|jd
 }|jtjks|jtjks|jtjkr|jr|jjtjkr|
jtv rdS t|rdS t|||drdS dS )a  Does `rhs.body` have a shape safe to reformat without optional parens around it?

    Returns True for only a subset of potentially nice looking formattings but
    the point is to not return false positives that end up producing lines that
    are too long.
    NFTrS   ru   zStranded delimiterr   )r   r%  r:   r   )r-  r%  )r   r   r0   r   r=   r   r   r?   r2   
delimitersmax_delimiter_prioritydelimiter_count_with_priorityr   (wrap_multiple_context_managers_in_parensr,   r   r   r    r   rT   r   _can_omit_opening_parenr&   ry   r   r   r   r#   r   r   _can_omit_closing_paren)r:  r%  r   r   r6   btmax_prioritydelimiter_countr   secondpenultimater-  rL   rL   rM   can_omit_invisible_parens  sf   







rF  r   c                C   s   d}d| j  }d}|  D ]%\}}}|jtv r|j|u rd}|r2||7 }||kr+ dS |jtv r2d}qt| j|d kr>dS dS ) See `can_omit_invisible_parens`.Frt   r   TrS   )r-   r   r=   r   r   r   rT   r0   )r   r   r%  	remainderr   _indexr6   leaf_lengthrL   rL   rM   r?  /  s"   

r?  r-  c                C   sZ   d| j  }d}|  D ]\}}}||7 }||ju r#|s||kr" dS q|jtv r*d}qdS )rG  rt   FT)r-   r   r   r=   r   )r   r-  r%  r   seen_other_bracketsrI  r6   rJ  rL   rL   rM   r@  H  s   


r@  c                 C   s   t | dS )zmReturns the string representation of @line.

    WARNING: This is known to be computationally expensive.
    r   )r   r@   )r   rL   rL   rM   r"  Y  s   r"  r   )Dr   r'  dataclassesr   r   typingr   r   r   r   r   r	   r
   r   r   r   black.bracketsr   r   r   
black.moder   r   black.nodesr   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   black.stringsr%   blib2to3.pgen2r&   blib2to3.pytreer'   r(   r)   r   r   r   LNr*   r   r   r   r   r>   r  r   r6  r9  rF  r?  r@  r"  rL   rL   rL   rM   <module>   sz    0P   H
  "	

[$
e