Ë
    äU.j»;  ã                  ój  — d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	m
Z
mZmZ ddg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mZmZ e
rddlm Z  ejB                  dk\  xr	  e"ed«      Z#dZ$ G d„ de«      Z% ed¬«      d"d„«       Z& ed¬«      d#d„«       Z' ed¬«      d#d„«       Z( ed¬«      d#d„«       Z) ed¬«      d#d„«       Z* G d„ de«      Z+ ed¬«      d$d„«       Z,	 	 	 	 	 	 	 	 	 	 	 	 d%d„Z-	 	 d&	 	 	 	 	 	 	 d'd„Z.	 	 d&	 	 	 	 	 	 	 d(d„Z/d)d„Z0d*d „Z1	 	 d&	 	 	 	 	 	 	 d'd!„Z2e#re.Z3ye/Z3y)+zú
Grapheme cluster segmentation following Unicode Standard Annex #29.

This module provides pure-Python implementation of the grapheme cluster boundary algorithm as
defined in UAX #29: Unicode Text Segmentation.

https://www.unicode.org/reports/tr29/
é    )ÚannotationsN)ÚIntEnum)Ú	lru_cache)ÚTYPE_CHECKINGÚOptionalÚ
NamedTuplezwcwidth.bisearchzwcwidth.table_graphemeé   )Úbisearch)Ú
GRAPHEME_LÚ
GRAPHEME_TÚ
GRAPHEME_VÚGRAPHEME_LVÚINCB_EXTENDÚINCB_LINKERÚGRAPHEME_LVTÚINCB_CONSONANTÚGRAPHEME_EXTENDÚGRAPHEME_CONTROLÚGRAPHEME_PREPENDÚGRAPHEME_SPACINGMARKÚEXTENDED_PICTOGRAPHICÚGRAPHEME_REGIONAL_INDICATOR)ÚIterator)é   é   Úiter_graphemesé    c                  óH   — e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZy)ÚGCBz'Grapheme Cluster Break property values.r   r	   é   r   é   é   é   é   é   é	   é
   é   é   é   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚOTHERÚCRÚLFÚCONTROLÚEXTENDÚZWJÚREGIONAL_INDICATORÚPREPENDÚSPACING_MARKÚLÚVÚTÚLVÚLVT© ó    úRC:\xampp\htdocs\tradingbinance\backend\.venv\Lib\site-packages\wcwidth/grapheme.pyr   r   8   sL   „ Ù1à€EØ	
€BØ	
€BØ€GØ€FØ
€CØÐØ€GØ€LØ	€AØ
€AØ
€AØ	€BØ
�Cr>   r   i   )Úmaxsizec                ó   — | dk(  rt         j                  S | dk(  rt         j                  S | dk(  rt         j                  S t	        | t
        «      rt         j                  S t	        | t        «      rt         j                  S t	        | t        «      rt         j                  S t	        | t        «      rt         j                  S t	        | t        «      rt         j                  S t	        | t        «      rt         j                   S t	        | t"        «      rt         j$                  S t	        | t&        «      rt         j(                  S t	        | t*        «      rt         j,                  S t	        | t.        «      rt         j0                  S t         j2                  S )z;Return the Grapheme_Cluster_Break property for a codepoint.r*   r'   i   )r   r0   r1   r4   Ú	_bisearchr   r2   r   r3   r   r5   r   r6   r   r7   r   r8   r   r9   r   r:   r   r;   r   r<   r/   ©Úucss    r?   Ú_grapheme_cluster_breakrE   N   s	  € ð
 ˆf‚}Ü�v‰vˆØ
ˆf‚}Ü�v‰vˆØ
ˆf‚}Ü�w‰wˆä�Ô&Ô'Ü�{‰{ÐÜ�”oÔ&Ü�z‰zÐÜ�Ô1Ô2Ü×%Ñ%Ð%Ü�Ô&Ô'Ü�{‰{ÐÜ�Ô*Ô+Ü×ÑÐÜ�”jÔ!Ü�u‰uˆÜ�”jÔ!Ü�u‰uˆÜ�”jÔ!Ü�u‰uˆÜ�”kÔ"Ü�v‰vˆÜ�”lÔ#Ü�w‰wˆÜ�9‰9Ðr>   c                ó4   — t        t        | t        «      «      S )z6Check if codepoint has Extended_Pictographic property.)ÚboolrB   r   rC   s    r?   Ú_is_extended_pictographicrH   q   s   € ô ”	˜#Ô4Ó5Ó6Ð6r>   c                ó4   — t        t        | t        «      «      S )z,Check if codepoint has InCB=Linker property.)rG   rB   r   rC   s    r?   Ú_is_incb_linkerrJ   w   ó   € ô ”	˜#œ{Ó+Ó,Ð,r>   c                ó4   — t        t        | t        «      «      S )z/Check if codepoint has InCB=Consonant property.)rG   rB   r   rC   s    r?   Ú_is_incb_consonantrM   }   s   € ô ”	˜#œ~Ó.Ó/Ð/r>   c                ó4   — t        t        | t        «      «      S )z,Check if codepoint has InCB=Extend property.)rG   rB   r   rC   s    r?   Ú_is_incb_extendrO   ƒ   rK   r>   c                  ó&   — e Zd ZU dZded<   ded<   y)ÚBreakResultz*Result of grapheme cluster break decision.rG   Úshould_breakÚintÚri_countN)r+   r,   r-   r.   Ú__annotations__r=   r>   r?   rQ   rQ   ‰   s   … Ù4àÓØ„Mr>   rQ   c                ó  — | t         j                  k(  r |t         j                  k(  rt        dd¬«      S | t         j                  t         j                  t         j                  fv rt        dd¬«      S |t         j                  t         j                  t         j                  fv rt        dd¬«      S | t         j
                  k(  rM|t         j
                  t         j                  t         j                  t         j                  fv rt        dd¬«      S | t         j                  t         j                  fv r/|t         j                  t         j                  fv rt        dd¬«      S | t         j                  t         j                  fv r |t         j                  k(  rt        dd¬«      S |t         j                  k(  rt        dd¬«      S |t         j                  k(  rt        dd¬«      S | t         j                  k(  rt        dd¬«      S y)zÚ
    Check simple GCB-pair-based break rules (cacheable).

    Returns BreakResult for rules that can be determined from GCB properties alone, or None if
    complex lookback rules (GB9c, GB11) need to be checked.
    Fr   ©rR   rT   TN)r   r0   r1   rQ   r2   r8   r9   r;   r<   r:   r3   r7   r6   )Úprev_gcbÚcurr_gcbs     r?   Ú_simple_break_checkrZ   �   st  € ð ”3—6‘6Ò˜h¬#¯&©&Ò0Ü¨¸Ô:Ð:ð ”C—K‘K¤§¡¬¯©Ð0Ñ0Ü¨°qÔ9Ð9ð ”C—K‘K¤§¡¬¯©Ð0Ñ0Ü¨°qÔ9Ð9ð ”3—5‘5Ò˜X¬#¯%©%´·±¼¿¹ÄÇÁÐ)HÑHÜ¨¸Ô:Ð:ð ”C—F‘FœCŸE™E�?Ñ" x´C·E±E¼3¿5¹5°>Ñ'AÜ¨¸Ô:Ð:ð ”C—G‘GœSŸU™UÐ#Ñ#¨´C·E±EÒ(9Ü¨¸Ô:Ð:ð ”3—:‘:ÒÜ¨¸Ô:Ð:ð ”3×#Ñ#Ò#Ü¨¸Ô:Ð:ð ”3—;‘;ÒÜ¨¸Ô:Ð:ð r>   c                ó$  — t        | |«      }|�|S |t        j                  k(  rt        dd¬«      S t	        ||   «      }t        |«      r`d}|dz
  }|dk\  rTt	        ||   «      }	t        |	«      rd}|dz  }n-t        |	«      r|dz  }nt        |	«      r|rt        dd¬«      S nn|dk\  rŒT| t        j                  k(  rft        |«      r[|dz
  }|dk\  rQt	        ||   «      }	t        |	«      }
|
t        j                  k(  r|dz  }nt        |	«      rt        dd¬«      S n|dk\  rŒQ| t        j                  k(  r8|t        j                  k(  r%|dz  dk(  rt        d|dz   ¬«      S t        dd¬«      S |t        j                  k(  rdnd}t        d|¬«      S )z�
    Determine if there should be a grapheme cluster break between prev and curr.

    Implements UAX #29 grapheme cluster boundary rules.
    Fr   rW   r	   Tr    )rZ   r   r4   rQ   ÚordrM   rJ   rO   rH   rE   r3   r5   )rX   rY   ÚtextÚcurr_idxrT   ÚresultÚcurr_ucsÚ
has_linkerÚiÚprev_ucsÚ	prev_props              r?   Ú_should_breakre   Á   s›  € ô ! ¨8Ó4€FØÐØˆð ”3—7‘7ÒÜ¨¸Ô:Ð:ô
 �4˜‘>Ó"€HÜ˜(Ô#Øˆ
Ø�q‰LˆØ�1ŠfÜ˜4 ™7“|ˆHÜ˜xÔ(Ø!�
Ø�Q‘‘Ü  Ô*Ø�Q‘‘Ü# HÔ-ÙÜ&°EÀAÔFÐFØàð �1‹fð ”3—7‘7ÒÔ8¸ÔBØ�q‰LˆØ�1ŠfÜ˜4 ™7“|ˆHÜ/°Ó9ˆIØœCŸJ™JÒ&Ø�Q‘‘Ü*¨8Ô4Ü"°ÀÔBÐBàð �1‹fð ”3×)Ñ)Ò)¨h¼#×:PÑ:PÒ.PØ�a‰<˜1ÒÜ¨E¸HÀq¹LÔIÐIÜ¨°qÔ9Ð9ð ¤× 6Ñ 6Ò6‰q¸A€HÜ D°8Ô<Ð<r>   c              #  óÒ   K  — | syt        | «      }|€|}||k\  s||k\  ryt        ||«      }| || }t        j                  |«      D ]  }||j                  |j
                   –— Œ y­w)ái  
    Iterate over grapheme clusters using :func:`unicodedata.iter_graphemes`.

    Grapheme clusters are "user-perceived characters" - what a user would
    consider a single character, which may consist of multiple Unicode
    codepoints (e.g., a base character with combining marks, emoji sequences).

    :param unistr: The Unicode string to segment.
    :param start: Starting index (default 0).
    :param end: Ending index (default len(unistr)).
    :yields: Grapheme cluster substrings.

    Example::

        >>> list(iter_graphemes('cafe\u0301'))
        ['c', 'a', 'f', 'e\u0301']
        >>> list(iter_graphemes('ok\U0001F468\u200D\U0001F469\u200D\U0001F467'))
        ['o', 'k', '\U0001F468\u200D\U0001F469\u200D\U0001F467']
        >>> list(iter_graphemes('ok\U0001F1FA\U0001F1F8'))
        ['o', 'k', '\U0001F1FA\U0001F1F8']

    .. versionadded:: 0.3.0
    N)ÚlenÚminÚunicodedatar   ÚstartÚend)Úunistrrk   rl   ÚlengthÚfull_segmentÚsegs         r?   Ú_iter_graphemes_stdlibrq     ss   è ø€ ñ8 Øä�‹[€Fà
€{Øˆà�‚|�u ’Øä
ˆc�6Ó
€Cà˜% Ð$€LÜ×)Ñ)¨,Ö7ˆØ˜3Ÿ9™9 S§W¡WÐ-Ó-ñ 8ùs   ‚A%A'c              #  ó†  K  — | syt        | «      }|€|}||k\  s||k\  ryt        ||«      }|}d}t        t        | |   «      «      }|t        j
                  k(  rd}t        |dz   |«      D ]K  }t        t        | |   «      «      }t        ||| ||«      }	|	j                  }|	j                  r	| || –— |}|}ŒM | || –— y­w)rg   Nr   r	   )
rh   ri   rE   r\   r   r5   Úrangere   rT   rR   )
rm   rk   rl   rn   Úcluster_startrT   rX   ÚidxrY   r_   s
             r?   Ú_iter_graphemes_pythonrv   2  så   è ø€ ñ8 Øä�‹[€Fà
€{Øˆà�‚|�u ’Øä
ˆc�6Ó
€Cð €MØ€Hô '¤s¨6°%©=Ó'9Ó:€Hð ”3×)Ñ)Ò)Øˆä�U˜Q‘Y Ö$ˆÜ*¬3¨v°c©{Ó+;Ó<ˆä˜x¨°6¸3ÀÓIˆØ—?‘?ˆà×ÒØ˜ sÐ+Ò+ØˆMà‰ð %ð �˜sÐ
#Ó#ùs   ‚B?Cc                óà  — t        | |dz
     «      }|dk(  r|dk\  r| |dz
     dk(  r|dz
  S |dk  rP|dk\  rF|dk\  rAt        | |dz
     «      }|dk\  r+t        |«      t        j                  k(  rt	        | |dz
  «      S |dz
  S |dz
  }|dkD  r]||z
  t
        k  rQt        | |   «      }d|cxk  rdk  rn nn4t        |«      t        j                  k(  rn|dz  }|dkD  r||z
  t
        k  rŒQ|}t        t        | |   «      «      }|t        j                  k(  rdnd}t        |dz   |«      D ]D  }	t        t        | |	   «      «      }
t        ||
| |	|«      }|j                  }|j                  r|	}|
}ŒF |S )a  
    Find the start of the grapheme cluster containing the character before pos.

    Scans backwards from pos to find a safe starting point, then iterates forward using standard
    break rules to find the actual cluster boundary.

    :param text: The Unicode string.
    :param pos: Position to search before (exclusive).
    :returns: Start position of the grapheme cluster.
    r	   r'   r    Úé€   r   r   )r\   rE   r   r6   Ú_find_cluster_startÚMAX_GRAPHEME_SCANr2   r5   rs   re   rT   rR   )r]   ÚposÚ	target_cpÚprev_cpÚ
safe_startÚcprt   Úleft_gcbrT   rb   Ú	right_gcbr_   s               r?   rz   rz   v  s—  € ô �D˜˜q™‘MÓ"€Ið �DÒ˜S AšX¨$¨s°Q©w©-¸4Ò*?Ø�Q‰wˆð �4Òà�!Š8˜	 TÒ)Ü˜$˜s Q™w™-Ó(ˆGØ˜$ŠÔ#:¸7Ó#CÄsÇ{Á{Ò#RÜ*¨4°°q±Ó9Ð9Ø�Q‰wˆð �q‘€JØ
�qŠ.˜c JÑ.Ô2CÒCÜ��jÑ!Ó"ˆØ�2Ô˜ÕØÜ" 2Ó&¬#¯+©+Ò5ØØ�a‰ˆ
ð �qŠ.˜c JÑ.Ô2CÓCð €MÜ&¤s¨4°
Ñ+;Ó'<Ó=€HØ¤× 6Ñ 6Ò6‰q¸A€Hä�: ‘> 3Ö'ˆÜ+¬C°°Q±«LÓ9ˆ	Ü˜x¨°D¸!¸XÓFˆØ—?‘?ˆØ×ÒØˆMØ‰ð (ð Ðr>   c           	     óL   — |dk  ryt        | t        |t        | «      «      «      S )aÌ  
    Find the grapheme cluster boundary immediately before a position.

    :param unistr: The Unicode string to search.
    :param pos: Position in the string (0 < pos <= len(unistr)).
    :returns: Start index of the grapheme cluster containing the character at pos-1.

    Example::

        >>> grapheme_boundary_before('Hello \U0001F44B\U0001F3FB', 8)
        6
        >>> grapheme_boundary_before('a\r\nb', 3)
        1

    .. versionadded:: 0.3.6
    r   )rz   ri   rh   )rm   r|   s     r?   Úgrapheme_boundary_beforer„   ª  s&   € ð" ˆa‚xØÜ˜v¤s¨3´°F³Ó'<Ó=Ð=r>   c              #  óÈ   K  — | syt        | «      }|€|nt        ||«      }t        |d«      }||k\  s||k\  ry|}||kD  r"t        | |«      }||k  ry| || –— |}||kD  rŒ!yy­w)a¡  
    Iterate over grapheme clusters in reverse order (last to first).

    :param unistr: The Unicode string to segment.
    :param start: Starting index (default 0).
    :param end: Ending index (default len(unistr)).
    :yields: Grapheme cluster substrings in reverse order.

    Example::

        >>> list(iter_graphemes_reverse('cafe\u0301'))
        ['e\u0301', 'f', 'a', 'c']

    .. versionadded:: 0.3.6
    Nr   )rh   ri   Úmaxrz   )rm   rk   rl   rn   r|   rt   s         r?   Úiter_graphemes_reverser‡   À  s‚   è ø€ ñ( Øä�‹[€Fà�K‰&¤S¨¨fÓ%5€CÜ��q‹M€Eà�‚|�u ’Øà
€CØ
�Š+Ü+¨F°CÓ8ˆà˜5Ò ØØ�] 3Ð'Ò'Øˆð ��+ùs   ‚AA"Á A")rD   rS   Úreturnr   )rD   rS   rˆ   rG   )rX   r   rY   r   rˆ   zOptional[BreakResult])rX   r   rY   r   r]   Ústrr^   rS   rT   rS   rˆ   rQ   )r   N)rm   r‰   rk   rS   rl   zOptional[int]rˆ   úIterator[str])rm   r‰   rk   rS   rl   z
int | Nonerˆ   rŠ   )r]   r‰   r|   rS   rˆ   rS   )rm   r‰   r|   rS   rˆ   rS   )4r.   Ú
__future__r   Úsysrj   Úenumr   Ú	functoolsr   Útypingr   r   r   Ú__lazy_modules__r
   rB   Útable_graphemer   r   r   r   r   r   r   r   r   r   r   r   r   r   Úcollections.abcr   Úversion_infoÚhasattrÚ_HAS_PYTHON315_ITER_GRAPHEMESr{   r   rE   rH   rJ   rM   rO   rQ   rZ   re   rq   rv   rz   r„   r‡   r   r=   r>   r?   Ú<module>r–      s1  ðñõ #ó Û Ý Ý ç 6Ñ 6ð ØðÐ õ
 ,÷:÷ :÷ :÷ :ñ å(ð ×Ñ˜Ñò /Ù�Ð-Ó.ð ð Ð ôˆ'ô ñ, �4Ôòó ðñD �4Ôò7ó ð7ñ
 �4Ôò-ó ð-ñ
 �4Ôò0ó ð0ñ
 �4Ôò-ó ð-ô
�*ô ñ �4Ôò-ó ð-ð`@=Øð@=àð@=ð ð@=ð ð	@=ð
 ð@=ð ó@=ðJ Øð+.Øð+.àð+.ð 
ð+.ð ó	+.ð` ØðA$ØðA$àðA$ð 
ðA$ð ó	A$óH1óh>ð0 Øð&Øð&àð&ð 
ð&ð ó	&ñV <Ðñ à	ñ r>   