Ë
    £èhì`  ã                  óÀ  — d dl mZ d dlmZmZmZmZ d dlZ G d„ de«      Z G d„ d«      Z	 ede¬	«      Z
d'd
„Zd(d„Zd)d„Zd*d„Zd+d„Zd,d„Zd-d„Zd.d„Zd/d„Zd0d„Zd1d„Z	 	 	 	 	 	 	 	 d2d„Zd3d„Zd4d5d„Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 d6d„Zd7d„Zd8d„Zd9d„Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d:d„Zd;d„Zd<d„Zd=d„Z d>d „Z!d?d!„Z"d@d"„Z#	 	 	 	 	 	 	 	 	 	 	 	 dAd#„Z$d3d$„Z%d,d%„Z&d,d&„Z'y)Bé    )Úannotations)ÚSequenceÚOptionalÚProtocolÚTypeVarNc                  ó"   — e Zd ZU ded<   ded<   y)ÚPointÚfloatÚxÚyN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© ó    ú9lib/python3.12/site-packages/ezdxf/math/_mapbox_earcut.pyr	   r	   8   s   … ØƒHØ„Hr   r	   c                  ó   — e Zd Zdd„Zd„ Zy)ÚNodec                ó¸   — || _         || _        |j                  | _        |j                  | _        d | _        d | _        d| _        d | _        d | _        d| _	        y )Nr   F)
ÚiÚpointr   r   ÚprevÚnextÚzÚprev_zÚnext_zÚsteiner)Úselfr   r   s      r   Ú__init__zNode.__init__>   s\   € ØˆŒð ˆŒ
ð Ÿ™ˆŒØŸ™ˆŒð ˆŒ	ØˆŒ	ð ˆŒð !ˆŒØ ˆŒð #ˆ�r   c                ój   — | j                   |j                   k(  xr | j                  |j                  k(  S ©N©r   r   )r   Úothers     r   Ú__eq__zNode.__eq__V   s'   € Ø�v‰v˜Ÿ™Ñ Ò6 T§V¡V¨u¯w©wÑ%6Ð6r   N)r   Úintr   r	   ÚreturnÚNone)r   r   r   r    r%   r   r   r   r   r   =   s   „ ó#ó07r   r   ÚT)Úboundc                ó  — t        | dd¬«      }g }|�|j                  |j                  u r|S t        |«      dkD  rt	        |t        | «      |«      }d}d}d}t        | «      dkD  r�| d   j
                  x}}| d   j                  x}}| D ]J  }	|	j
                  }
|	j                  }t        ||
«      }t        ||«      }t        ||
«      }t        ||«      }ŒL t        ||z
  ||z
  «      }|dk7  rd|z  nd}t        |||||d«       |S )aü  Implements a modified ear slicing algorithm, optimized by z-order
    curve hashing and extended to handle holes, twisted polygons, degeneracies
    and self-intersections in a way that doesn't guarantee correctness of
    triangulation, but attempts to always produce acceptable results for
    practical data.

    Source: https://github.com/mapbox/earcut

    Args:
        exterior: outer path as list of points as objects which provide a
            `x`- and a `y`-attribute
        holes: list of holes, each hole is list of points, a hole with
            a single points is a Steiner point

    Returns:
        Returns a list of triangles, each triangle is a tuple of three points,
        the output points are the same objects as the input points.

    r   T©Úccwç        éP   iÿ  )
Úlinked_listr   r   ÚlenÚeliminate_holesr   r   ÚminÚmaxÚearcut_linked)ÚexteriorÚholesÚ
outer_nodeÚ	trianglesÚmin_xÚmin_yÚinv_sizeÚmax_xÚmax_yr   r   r   s               r   Úearcutr?   ]   s  € ô* # 8¨Q°DÔ9€JØ#%€IàÐ˜ZŸ_™_°
·±Ñ?ØÐä
ˆ5ƒz�A‚~Ü$ U¬C°«M¸:ÓFˆ
à€EØ€EØ€Hô ˆ8ƒ}�rÒØ  ™Ÿ™Ð%ˆ�Ø  ™Ÿ™Ð%ˆ�ÛˆEØ—‘ˆAØ—‘ˆAÜ˜˜q“MˆEÜ˜˜q“MˆEÜ˜˜q“MˆEÜ˜˜q“M‰Eð ô �u˜u‘} e¨e¡mÓ4ˆØ'/°1¢}�5˜8Ò#¸!ˆä�*˜i¨°°xÀÔCØÐr   c                ó  — d}|t        | «      dk  u r| D ]  }t        |||«      }|dz  }Œ n0|t        | «      z   }t        | «      D ]  }t        |||«      }|dz  }Œ |r&||j                  k(  rt        |«       |j                  }|S )z`Create a circular doubly linked list from polygon points in the specified
    winding order
    Nr   é   )Úsigned_areaÚinsert_noder1   Úreversedr   Úremove_node)ÚpointsÚstartr-   Úlastr   Úends         r   r0   r0   •   s˜   € ð €DØ
Œ{˜6Ó" QÑ&Ñ'ÛˆEÜ˜u e¨TÓ2ˆDØ�Q‰J‰Eñ ð ”c˜&“kÑ!ˆÜ˜fÖ%ˆEÜ˜s E¨4Ó0ˆDØ�1‰H‰Cð &ñ
 �˜Ÿ	™	Ò!Ü�DÔØ�y‰yˆØ€Kr   c                ó¬   — d}t        | «      s|S | d   }| D ]:  }||j                  |j                  z
  |j                  |j                  z   z  z  }|}Œ< |S )Nr.   éÿÿÿÿ)r1   r   r   )rF   Úsr   r   s       r   rB   rB   «   s[   € Ø€AÜˆvŒ;ØˆØ�"‰:€DÛˆØ	ˆe�g‰g˜Ÿ™Ñ 5§7¡7¨T¯V©VÑ#3Ñ4Ñ4ˆØ‰ð ð
 €Hr   c                óÐ   — |j                   | j                   z
  |j                  |j                  z
  z  |j                  | j                  z
  |j                   |j                   z
  z  z
  S )z!Returns signed area of a triangle)r   r   ©ÚpÚqÚrs      r   ÚarearR   ¸   sG   € à�C‰C�!—#‘#‰I˜!Ÿ#™# §¡™)Ñ$¨¯©¨a¯c©c©	°a·c±c¸A¿C¹C±iÑ'@Ñ@Ð@r   c                ó"  — | j                   j                  |j                  k7  xrë | j                  j                  |j                  k7  xrÆ t        | |«       xr· t	        | |«      xrV t	        || «      xrH t        | |«      xr: t        | j                  | |j                  «      xs t        | |j                  |«      xsQ | |k(  xrJ t        | j                  | | j                   «      dkD  xr$ t        |j                  ||j                   «      dkD  S )zZCheck if a diagonal between two polygon nodes is valid (lies in polygon
    interior)
    r   )r   r   r   Úintersects_polygonÚlocally_insideÚmiddle_insiderR   ©ÚaÚbs     r   Úis_valid_diagonalrZ   ½   sì   € ð
 	
�‰�‰�A—C‘C‰ò 	
Ø�F‰F�H‰H˜Ÿ™‰Oò	
ä" 1 aÓ(Ð(ò	
ô ˜1˜aÓ ò Ü˜q !Ó$òä˜a Ó#òô �Q—V‘V˜Q §¡Ó'Ò=¬4°°1·6±6¸1Ó+=ò	,ð �A‰vò ,Ü�Q—V‘V˜Q §¡Ó'¨!Ñ+ò,ä�Q—V‘V˜Q §¡Ó'¨!Ñ+ðr   c                óP  — | }	 |j                   | j                   k7  rx|j                  j                   | j                   k7  rU|j                   |j                   k7  r<|j                  j                   |j                   k7  rt        ||j                  | |«      ry|j                  }|| u r	 yŒ¤)z;Check if a polygon diagonal intersects any polygon segmentsTF)r   r   Ú
intersects)rX   rY   rO   s      r   rT   rT   Ó   s~   € à	€AØ
à�C‰C�1—3‘3ŠJØ—‘—‘˜AŸC™C’Ø—‘�q—s‘s’
Ø—‘—‘˜AŸC™C’Ü˜1˜aŸf™f a¨Ô+àØ�F‰FˆØ�‰6ØØð r   c                ó   — | dk  ry| dkD  ryy)Nr.   rK   rA   r   r   )Únums    r   Úsignr_   å   s   € Ø
ˆS‚yØØ
ˆS‚yØØr   c                ó^  — t        | j                  |j                  «      |j                  cxk\  xr# t        | j                  |j                  «      k\  nc xrV t        | j                  |j                  «      |j                  cxk\  xr# t        | j                  |j                  «      k\  S c S r"   )r4   r   r3   r   rN   s      r   Ú
on_segmentra   í   sx   € Üˆq�s‰s�A—C‘C‹=˜AŸC™CÖ0¤3 q§s¡s¨A¯C©C£=Ô0ò ´S¸¿¹¸a¿c¹c³]ÀaÇcÁcö 6ÌSØ	�‰ˆQ�S‰SóNñ 6ð ñ 6ð r   c                ób  — t        t        | ||«      «      }t        t        | ||«      «      }t        t        ||| «      «      }t        t        |||«      «      }||k7  r||k7  ry|dk(  rt        | ||«      ry|dk(  rt        | ||«      ry|dk(  rt        || |«      ry|dk(  rt        |||«      ryy)zcheck if two segments intersectTr   F)r_   rR   ra   )Úp1Úq1Úp2Úq2Úo1Úo2Úo3Úo4s           r   r\   r\   ó   sµ   € ä	Œd�2�r˜2ÓÓ	€BÜ	Œd�2�r˜2ÓÓ	€BÜ	Œd�2�r˜2ÓÓ	€BÜ	Œd�2�r˜2ÓÓ	€Bà	ˆR‚x�B˜"’HØà	ˆQ‚w”:˜b " bÔ)ØØ	ˆQ‚w”:˜b " bÔ)ØØ	ˆQ‚w”:˜b " bÔ)ØØ	ˆQ‚w”:˜b " bÔ)ØØr   c                ó¢   — t        | |«      }|€||_        ||_        |S |j                  |_        ||_        ||j                  _        ||_        |S )zbcreate a node and optionally link it with previous one (in a circular
    doubly linked list)
    )r   r   r   )r   r   rH   rO   s       r   rC   rC     sT   € ô 	ˆQ�‹€Aà€|ØˆŒØˆŒð €Hð	 —‘ˆŒØˆŒØˆ�	‰	ŒØˆŒ	Ø€Hr   c                ó  — | j                   | j                  _         | j                  | j                   _        | j                  r| j                  | j                  _        | j                  r| j                  | j                  _        y y r"   )r   r   r   r   )rO   s    r   rE   rE     sQ   € Ø—&‘&€A‡F�F„KØ—&‘&€A‡F�F„Kà‡x‚xØŸ(™(ˆ�‰ŒØ‡x‚xØŸ(™(ˆ�‰�ð r   c                ó  — g }| D ]\  }t        |«      dk  rŒt        ||d¬«      }||j                  u rd|_        |t        |«      z  }|j	                  t        |«      «       Œ^ |j                  d„ ¬«       |D ]  }t        ||«      }Œ |S )z[link every hole into the outer loop, producing a single-ring polygon
    without holes
    rA   Fr,   Tc                ó2   — | j                   | j                  fS r"   r#   )Únodes    r   Ú<lambda>z!eliminate_holes.<locals>.<lambda>3  s   €  §¡¨¯©Ñ 0r   )Úkey)r1   r0   r   r   ÚappendÚget_leftmostÚsortÚeliminate_hole)r7   rG   r8   ÚqueueÚholeÚ_listÚhole_s          r   r2   r2   #  s�   € ð €EÛˆÜˆt‹9�qŠ=Øä˜D %¨UÔ3ˆØ�E—J‘JÑØ ˆEŒMØ”�T“ÑˆØ�‰”\ %Ó(Õ)ð ð 
‡J�JÑ0€JÔ1ó ˆÜ# E¨:Ó6‰
ð àÐr   c                ó’   — t        | |«      }|€|S t        || «      }t        ||j                  «       t        ||j                  «      S )zYFind a bridge between vertices that connects hole with an outer ring and
    link it
    )Úfind_hole_bridgeÚsplit_polygonÚfilter_pointsr   )rw   r8   ÚbridgeÚbridge_reverses       r   ru   ru   ;  sJ   € ô ˜d JÓ/€FØ€~ØÐä" 6¨4Ó0€Nô �. .×"5Ñ"5Ô6Ü˜ §¡Ó-Ð-r   c                ó   — | €| S |€| }| }	 d}|j                   s`||j                  k(  s$t        |j                  ||j                  «      dk(  r-t	        |«       |j                  x}}||j                  u r	 |S d}n|j                  }|s||us	 |S Œ„)z&eliminate colinear or duplicate pointsTFr   )r   r   rR   r   rE   )rG   rI   rO   Úagains       r   r}   r}   J  s�   € à€}ØˆØ
€{Øˆà€Aà
ØˆØ�yŠyØ�—‘ŠKœ4 §¡¨¨1¯6©6Ó2°aÒ7ä˜ŒNØ—f‘fÐˆA�Ø�A—F‘F‰{Øð €Jð ‰Eà—‘ˆAÙ˜ #™ØØ€Jð r   c                ót  — | €y |s|rt        | |||«       | }| j                  | j                  u�r| j                  }| j                  }|rt        | |||«      n
t	        | «      }	|	rV|j                  |j                  | j                  |j                  f«       t        | «       |j                  } |j                  }Œ¤|} | |u r\|st        t        | «      ||||d«       y |dk(  r&t        t        | «      |«      } t        | ||||d«       y |dk(  rt        | ||||«       y | j                  | j                  ur�Œy y )NrA   é   )Úindex_curver   r   Úis_ear_hashedÚis_earrr   r   rE   r5   r}   Úcure_local_intersectionsÚsplit_ear_cut)
Úearr9   r:   r;   r<   Úpass_Ústopr   r   Ú_is_ears
             r   r5   r5   e  sB  € ð €{Øñ ‘XÜ�C˜  xÔ0à€Dð �(‰(˜#Ÿ(™(Ò
"Ø�x‰xˆØ�x‰xˆñ ;CŒM˜#˜u e¨XÔ6ÌÈsËð 	ñ à×Ñ˜dŸj™j¨#¯)©)°T·Z±ZÐ@ÔAÜ˜Ôð —)‘)ˆCØ—9‘9ˆDØàˆð �$‰;áÜÜ! #Ó&ØØØØØôð" ð ˜!’Ü.¬}¸SÓ/AÀ9ÓM�Ü˜c 9¨e°U¸HÀaÔHð
 ð ˜!’Ü˜c 9¨e°U¸HÔEØðQ �(‰(˜#Ÿ(™(Õ
"r   c           
     óŠ  — | j                   }| }| j                  }t        |||«      dk\  ry|j                  }|j                  }|j                  }|j                  }|j                  }|j                  }	t        |||«      }
t        |||«      }t        |||	«      }t        |||	«      }|j                  }||urŒ|
|j                  cxk  r|k  rfn nc||j                  cxk  r|k  rNn nKt        ||||||	|j                  |j                  «      r%t        |j                   ||j                  «      dk\  ry|j                  }||urŒŒy)zBcheck whether a polygon node forms a valid ear with adjacent nodesr   FT)r   r   rR   r   r   r3   r4   Úpoint_in_triangle)r‰   rX   rY   ÚcÚaxÚbxÚcxÚayÚbyÚcyÚx0Úx1Úy0Úy1rO   s                  r   r†   r†   ¢  s  € à�h‰h€AØ€AØ�h‰h€AäˆAˆq�!ƒ}˜ÒØð 
�‰€BØ	
�‰€BØ	
�‰€BØ	
�‰€BØ	
�‰€BØ	
�‰€Bô 
ˆR��R‹€BÜ	ˆR��R‹€BÜ	ˆR��R‹€BÜ	ˆR��R‹€BØ�f‰f€Aà
�1‰*à�!—#‘#ŒO˜�OØ�a—c‘c”˜R•Ü! " b¨"¨b°"°b¸!¿#¹#¸q¿s¹sÔCÜ�Q—V‘V˜Q §¡Ó'¨1Ò,àØ�F‰Fˆð �1Š*ð r   c           
     óV  — | j                   }| }| j                  }t        |||«      dk\  ry|j                  }|j                  }|j                  }	|j                  }
|j                  }|j                  }t        |||	«      }t        |||	«      }t        |
||«      }t        |
||«      }t        |||||«      }t        |||||«      }| j                  }| j                  }|�re|j                  |k\  �rU|�rR|j                  |k  �rB||j                  cxk  r|k  rnn nk||j                  cxk  r|k  rVn nS||urO||urKt        ||
|||	||j                  |j                  «      r%t        |j                   ||j                  «      dk\  ry|j                  }||j                  cxk  r|k  rnn nk||j                  cxk  r|k  rVn nS||urO||urKt        ||
|||	||j                  |j                  «      r%t        |j                   ||j                  «      dk\  ry|j                  }|r"|j                  |k\  r|r|j                  |k  r�ŒB|r°|j                  |k\  r¡||j                  cxk  r|k  rnn nk||j                  cxk  r|k  rVn nS||urO||urKt        ||
|||	||j                  |j                  «      r%t        |j                   ||j                  «      dk\  ry|j                  }|r|j                  |k\  rŒ¡|r°|j                  |k  r¡||j                  cxk  r|k  rnn nk||j                  cxk  r|k  rVn nS||urO||urKt        ||
|||	||j                  |j                  «      r%t        |j                   ||j                  «      dk\  ry|j                  }|r|j                  |k  rŒ¡y)Nr   FT)r   r   rR   r   r   r3   r4   Úz_orderr   r   r   rŽ   )r‰   r:   r;   r<   rX   rY   r�   r�   r‘   r’   r“   r”   r•   r–   r—   r˜   r™   Úmin_zÚmax_zrO   Úns                        r   r…   r…   Ç  s  € Ø�h‰h€AØ€AØ�h‰h€AäˆAˆq�!ƒ}˜ÒØà	
�‰€BØ	
�‰€BØ	
�‰€BØ	
�‰€BØ	
�‰€BØ	
�‰€Bô 
ˆR��R‹€BÜ	ˆR��R‹€BÜ	ˆR��R‹€BÜ	ˆR��R‹€Bô �B˜˜E 5¨(Ó3€EÜ�B˜˜E 5¨(Ó3€Eà�j‰j€AØ�j‰j€Aò �—‘�u“¢ q§s¡s¨e£|à�!—#‘#ŒO˜�OØ�a—c‘c”˜R•Ø˜‘
Ø˜‘
Ü! " b¨"¨b°"°b¸!¿#¹#¸q¿s¹sÔCÜ�Q—V‘V˜Q §¡Ó'¨1Ò,àØ�H‰Hˆð �!—#‘#ŒO˜�OØ�a—c‘c”˜R•Ø˜‘
Ø˜‘
Ü! " b¨"¨b°"°b¸!¿#¹#¸q¿s¹sÔCÜ�Q—V‘V˜Q §¡Ó'¨1Ò,àØ�H‰Hˆñ+ �—‘�u’¡ q§s¡s¨e¤|ñ0 �—‘�u’à�!—#‘#ŒO˜�OØ�a—c‘c”˜R•Ø˜‘
Ø˜‘
Ü! " b¨"¨b°"°b¸!¿#¹#¸q¿s¹sÔCÜ�Q—V‘V˜Q §¡Ó'¨1Ò,àØ�H‰Hˆñ �—‘�u“ñ �—‘�u’à�!—#‘#ŒO˜�OØ�a—c‘c”˜R•Ø˜‘
Ø˜‘
Ü! " b¨"¨b°"°b¸!¿#¹#¸q¿s¹sÔCÜ�Q—V‘V˜Q §¡Ó'¨1Ò,àØ�H‰Hˆñ �—‘�u“ð r   c                óÎ   — | }| }	 |j                   |j                   k  s2|j                   |j                   k(  r|j                  |j                  k  r|}|j                  }|| u r	 |S Œa)z(Find the leftmost node of a polygon ring©r   r   r   )rG   rO   Úleftmosts      r   rs   rs     s_   € à€AØ€HØ
Ø�3‰3�—‘Ò §¡ x§z¡zÒ 1°a·c±c¸H¿J¹JÒ6FØˆHØ�F‰FˆØ�‰:ØØ€Oð r   c                ó”   — ||z
  ||z
  z  | |z
  ||z
  z  k\  xr0 | |z
  ||z
  z  ||z
  ||z
  z  k\  xr ||z
  ||z
  z  ||z
  ||z
  z  k\  S )z.Check if a point lies within a convex triangler   )r�   r“   r‘   r”   r’   r•   ÚpxÚpys           r   rŽ   rŽ   $  sy   € ð 
ˆb‰�R˜"‘WÑ " r¡'¨b°2©gÑ!6Ñ6ò 	;Ø�"‰W˜˜b™Ñ! b¨2¡g°"°r±'Ñ%:Ñ:ò	;à�"‰W˜˜b™Ñ! b¨2¡g°"°r±'Ñ%:Ñ:ðr   c                ó–   — t        | j                  | |j                  «      dk  xr$ t        |j                  | | j                  «      dk  S )zXWhether sector in vertex m contains sector in vertex p in the same
    coordinates.
    r   ©rR   r   r   )ÚmrO   s     r   Úsector_contains_sectorr¨   6  s;   € ô �—‘˜˜1Ÿ6™6Ó" QÑ&ÒF¬4°·±¸¸1¿6¹6Ó+BÀQÑ+FÐFr   c                ó&  — | }	 |j                   dk(  r(t        |j                  |j                  |||«      |_         |j                  |_        |j                  |_        |j                  }|| u rnŒkd|j
                  _        d|_        t        |«       y)z"Interlink polygon nodes in z-orderr   N)	r   r›   r   r   r   r   r   r   Úsort_linked)rG   r:   r;   r<   rO   s        r   r„   r„   =  sz   € à€AØ
Ø�3‰3�!Š8Ü˜!Ÿ#™#˜qŸs™s E¨5°(Ó;ˆAŒCØ—6‘6ˆŒØ—6‘6ˆŒØ�F‰FˆØ�‰:Øð ð €A‡H�H„OØ€A„Hä�…Nr   c                ó  — t        | |z
  |z  «      }t        ||z
  |z  «      }||dz  z  dz  }||dz  z  dz  }||dz  z  dz  }||dz  z  dz  }||dz  z  dz  }||dz  z  dz  }||dz  z  dz  }||dz  z  dz  }||dz  z  S )	zUZ-order of a point given coords and inverse of the longer side of data
    bbox.
    é   iÿ ÿ é   irƒ   i3333rA   iUUUU)r&   )r–   r˜   r:   r;   r<   r   r   s          r   r›   r›   O  sÈ   € ô
 	ˆR�%‰Z˜8Ñ#Ó$€AÜˆR�%‰Z˜8Ñ#Ó$€Aà	
ˆa�1‰f‰˜Ñ#€AØ	
ˆa�1‰f‰˜Ñ#€AØ	
ˆa�1‰f‰˜Ñ#€AØ	
ˆa�1‰f‰˜Ñ#€Aà	
ˆa�1‰f‰˜Ñ#€AØ	
ˆa�1‰f‰˜Ñ#€AØ	
ˆa�1‰f‰˜Ñ#€AØ	
ˆa�1‰f‰˜Ñ#€Aà��Q‘‰<Ðr   c                ó¦  — d}	 | }d } d }d}|r°|dz  }|}d}t        |«      D ]  }|dz  }|j                  }|rŒ n |}|dkD  s|dkD  rq|ro|dk7  r4|dk(  s|r|j                  |j                  k  r|}	|j                  }|dz  }n|}	|j                  }|dz  }|r|	|_        n|	} ||	_        |	}|dkD  rŒg|dkD  r|rŒo|}|rŒ°d |_        |dz  }|dk  r	 | S ŒÏ)NrA   r   rƒ   )Úranger   r   r   )
ÚheadÚin_sizerO   ÚtailÚ
num_mergesrP   Úp_sizer   Úq_sizeÚes
             r   rª   rª   f  s  € Ø€Gà
ØˆØˆØˆØˆ
ÙØ˜!‰OˆJØˆAØˆFÜ˜7–^�Ø˜!‘�Ø—H‘H�ÚÙð	 $ð
 ˆFØ˜1’* ¨!¢±Ø˜Q’; F¨a¢K±q¸A¿C¹CÀ1Ç3Á3ºJØ�AØŸ™�AØ˜a‘K‘Fà�AØŸ™�AØ˜a‘K�FáØ"#�D•Kà�DØ�”Ø�ð ˜1“* ¨!¢²ð  ˆAò5 ð6 ˆŒØ�1‰ˆØ˜Š?ØØ€KðI r   c                ó&  — t        | j                  | j                  «      }t        |j                  |j                  «      }| j                  }|j                  }|| _        | |_        ||_        ||_        ||_        ||_        ||_        ||_        |S )zØLink two polygon vertices with a bridge.

    If the vertices belong to the same ring, it splits polygon into two.
    If one belongs to the outer ring and another to a hole, it merges it into a
    single ring.
    )r   r   r   r   r   )rX   rY   Úa2Úb2ÚanÚbps         r   r|   r|   �  s{   € ô 
ˆa�c‰c�1—7‘7Ó	€BÜ	ˆa�c‰c�1—7‘7Ó	€BØ	
�‰€BØ	
�‰€Bà€A„FØ€A„Fà€B„GØ€B„Gà€B„GØ€B„Gà€B„GØ€B„Gà€Ir   c                óœ  — | }	 |j                   }|j                  j                  }||k(  s†t        |||j                  |«      rnt        ||«      rbt        ||«      rV|j	                  |j
                  |j
                  |j
                  f«       t        |«       t        |j                  «       |x}} |j                  }|| u r	 t        |«      S ŒÊr"   )r   r   r\   rU   rr   r   rE   r}   )rG   r9   rO   rX   rY   s        r   r‡   r‡   ¬  s¯   € Ø€AØ
Ø�F‰FˆØ�F‰F�K‰Kˆð �Q’Ü˜1˜a §¡¨Ô+Ü˜q !Ô$Ü˜q !Ô$à×Ñ˜aŸg™g q§w¡w°·±Ð8Ô9ä˜ŒNÜ˜Ÿ™ÔØˆMˆA�à�F‰FˆØ�‰:ØÜ˜ÓÐð' r   c                ó¦  — | }	 |j                   j                   }||j                  ur™|j                  |j                  k7  ret        ||«      rYt	        ||«      }t        ||j                   «      }t        ||j                   «      }t        |||||d«       t        |||||d«       y|j                   }||j                  urŒ™|j                   }|| u ryŒÏ)zATry splitting polygon into two and triangulate them independentlyr   N)r   r   r   rZ   r|   r}   r5   )rG   r9   r:   r;   r<   rX   rY   r�   s           r   rˆ   rˆ   Ä  sÄ   € ð 	€AØ
Ø�F‰F�K‰KˆØ�q—v‘v‰oØ�s‰s�a—c‘cŠzÔ/°°1Ô5ä! ! QÓ'�ô " ! Q§V¡VÓ,�Ü! ! Q§V¡VÓ,�ô ˜a ¨E°5¸(ÀAÔFÜ˜a ¨E°5¸(ÀAÔFØØ—‘ˆAð �q—v‘vŠoð �F‰FˆØ�‰:Øð% r   c           
     ó�  — |}| j                   }| j                  }t        j                   }d }	 |j                  |cxk\  r)|j                  j                  cxk\  r|j                  k7  r¯n n¬|j                   ||j                  z
  |j                  j                   |j                   z
  z  |j                  j                  |j                  z
  z  z   }||cxk\  r|kD  r=n n:|}|j                   |j                  j                   k  r|n|j                  }||k(  r|S |j                  }||u rnŒú|€y |}|j                   }	|j                  }
t        j                  }|}	 ||j                   cxk\  r|	k\  rÆn nÃ||j                   k7  r´t        ||
k  r|n|||	|
||
k  r|n|||j                   |j                  «      r€t        ||j                  z
  «      ||j                   z
  z  }t        || «      rL||k  sC||k(  rB|j                   |j                   kD  s%|j                   |j                   k(  rt        ||«      r|}|}|j                  }||u r	 |S Œïr"   )	r   r   ÚmathÚinfr   rŽ   ÚabsrU   r¨   )rw   r8   rO   ÚhxÚhyÚqxr§   r   r‹   ÚmxÚmyÚtan_minÚtans                r   r{   r{   ä  sð  € Ø€AØ	�‰€BØ	�‰€BÜ
�(‰(ˆ€BØ€Að Ø�3‰3�"Ô'˜Ÿ™Ÿ™Ô' A§C¡CÕ'Ø—‘�r˜AŸC™C‘x A§F¡F§H¡H¨q¯s©s¡NÑ3°q·v±v·x±xÀ!Ç#Á#±~ÑFÑFˆAØ�QŒ|˜�|Ø�ØŸ™˜qŸv™vŸx™xš‘A¨Q¯V©V�Ø˜’7à�HØ�F‰FˆØ�
‰?Øð ð 	€yØð
 €DØ	
�‰€BØ	
�‰€BÜ�h‰h€GØ	€Aà
à�!—#‘#ŒO˜�OØ�a—c‘c’	Ü!Ø˜2’g‘ 2ØØØØ˜2’g‘ 2ØØ—‘Ø—‘ô	ô �b˜1Ÿ3™3‘h“- 2¨¯©¡8Ñ,ˆCä˜a Ô&Ø�g’à˜7’NØŸ™˜qŸs™sš q§s¡s¨a¯c©c¢zÔ6LÈQÐPQÔ6Rð �Ø�à�F‰FˆØ�‰9ØØ€Hð= r   c                ó"  — t        | j                  | | j                  «      dk  r6t        | || j                  «      dk\  xr t        | | j                  |«      dk\  S t        | || j                  «      dk  xs t        | | j                  |«      dk  S )z9Check if a polygon diagonal is locally inside the polygonr   r¦   rW   s     r   rU   rU   &  sƒ   € ô �—‘˜˜1Ÿ6™6Ó" QÒ&ô 	ˆQ��1—6‘6Ó˜aÑÒ;¤D¨¨A¯F©F°AÓ$6¸!Ñ$;ðô �!�Q˜Ÿ™Ó !Ñ#Ò=¤t¨A¨q¯v©v°qÓ'9¸AÑ'=ðr   c                ó  — | }d}| j                   |j                   z   dz  }| j                  |j                  z   dz  }	 |j                  |kD  |j                  j                  |kD  k7  r�|j                  j                  |j                  k7  rj||j                  j                   |j                   z
  ||j                  z
  z  |j                  j                  |j                  z
  z  |j                   z   k  r| }|j                  }|| u r	 |S ŒÊ)zECheck if the middle point of a polygon diagonal is inside the polygonFrƒ   r    )rX   rY   rO   Úinsider£   r¤   s         r   rV   rV   /  sÏ   € à	€AØ€FØ
�#‰#�—‘‰)�q‰€BØ
�#‰#�—‘‰)�q‰€BØ
à�c‰c�B‰h˜AŸF™FŸH™H r™MÒ*Ø—‘—‘˜AŸC™C’Ø�q—v‘v—x‘x !§#¡#‘~¨"¨q¯s©s©(Ñ3°q·v±v·x±xÀ!Ç#Á#±~ÑFÈÏÉÑLÒLà�ZˆFØ�F‰FˆØ�‰6ØØ€Mð r   )r6   zlist[T]r7   zlist[list[T]]r'   zlist[Sequence[T]])rF   úSequence[Point]rG   r&   r-   Úboolr'   r   )rF   rÌ   r'   r
   )rO   r   rP   r   rQ   r   r'   r
   )rX   r   rY   r   )rX   r   rY   r   r'   rÍ   )r^   r
   r'   r&   )rO   r   rP   r   rQ   r   r'   rÍ   )
rc   r   rd   r   re   r   rf   r   r'   rÍ   )r   r&   r   r	   rH   r   r'   r   )rO   r   r'   r(   )r7   zSequence[Sequence[Point]]rG   r&   r8   r   r'   r   )rw   r   r8   r   r'   r   r"   )rG   r   rI   zOptional[Node]r'   r   )r‰   r   r9   úlist[Sequence[Point]]r:   r
   r;   r
   r<   r
   rŠ   r&   r'   r(   )r‰   r   r'   rÍ   )r‰   r   r:   r
   r;   r
   r<   r
   )rG   r   r'   r   )r�   r
   r“   r
   r‘   r
   r”   r
   r’   r
   r•   r
   r£   r
   r¤   r
   r'   rÍ   )r§   r   rO   r   )rG   r   r:   r
   r;   r
   r<   r
   )r–   r
   r˜   r
   r:   r
   r;   r
   r<   r
   r'   r&   )r°   r   r'   r   )rX   r   rY   r   r'   r   )rG   r   r9   rÎ   r'   r   )rG   r   r9   rÎ   r:   r
   r;   r
   r<   r
   r'   r(   )(Ú
__future__r   Útypingr   r   r   r   r¿   r	   r   r)   r?   r0   rB   rR   rZ   rT   r_   ra   r\   rC   rE   r2   ru   r}   r5   r†   r…   rs   rŽ   r¨   r„   r›   rª   r|   r‡   rˆ   r{   rU   rV   r   r   r   Ú<module>rÑ      sÃ  ðõd #ß 8Ó 8ã ôˆHô ÷
7ñ 7ñ: ˆC�uÔ€ó5ópó,
óAó
ó,ó$óóó*ó"#ðØ$ðØ-0ðØ>Bðà	óó0.ôð6:Ø	ð:à$ð:ð ð:ð ð	:ð
 ð:ð ð:ð 
ó:óz"óJMó`
ðØðàðð 	ðð 	ð	ð
 	ðð 	ðð 	ðð 	ðð 
óó$Góó$ó.'óTó8ð0Øðà$ðð ðð ð	ð
 ðð 
óó@?óDôr   