
    g              
       n   d Z ddlZddlZddlmZmZmZmZmZ ddl	m
Z
 deeeeeeef   eeeef   eeef   f      deee
      fdZ	 dd	ee
   d
ee   ddfdZdeeeef   eeeeef   f   deeej                  ef   eej                   eeef   f   fdZd	ee
   deeeef   eeeeef   f   ddfdZy)z'Utility functions for aiohappyeyeballs.    N)DictListOptionalTupleUnion   )AddrInfoTypeaddrreturnc                    | y| d   }| d   }d|v }|r:d}d}t        |       }|dk\  r| d   }|dk\  r| d   }||||f} t        j                  }n||f} t        j                  }|t        j                  t        j
                  d| fgS )	z7Convert an address tuple to a list of addr_info tuples.Nr   r   :          )lensocketAF_INET6AF_INETSOCK_STREAMIPPROTO_TCP)r
   hostportis_ipv6flowinfoscopeidaddr_lenfamilys           K/var/www/openai/venv/lib/python3.12/site-packages/aiohappyeyeballs/utils.pyaddr_to_addr_infosr    
   s     |7D7DTkGt9q=1gGq=AwHdHg.d|V''););RFGG    
addr_infos
interleavec                     i }|d}g }| D ]6  }|d   }||vrd||<   ||   |k  r|j                  |       ||xx   dz  cc<   8 |D ]  }| j                  |        y)z
    Pop addr_info from the list of addr_infos by family up to interleave times.

    The interleave parameter is used to know how many addr_infos for
    each family should be popped of the top of the list.
    Nr   r   )appendremove)r"   r#   seen	to_remove	addr_infor   s         r   pop_addr_infos_interleaver*   %   s     D
$&I	1DL<*$Y'V   	)$ r!   c                 @    t        j                  | d         g| dd S )z+Convert an address tuple to an IPv4Address.r   r   N)	ipaddress
ip_address)r
   s    r   _addr_tuple_to_ip_addressr.   =   s'       a)5DH55r!   c                 <   g }| D ]  }|d   |k(  s|j                  |        |r|D ]  }| j                  |        yt        |      }| D ]%  }|t        |d         k(  s|j                  |       ' |r|D ]  }| j                  |        yt        d| d      )z
    Remove an address from the list of addr_infos.

    The addr value is typically the return value of
    sock.getpeername().
    NzAddress z not found in addr_infos)r%   r&   r.   
ValueError)r"   r
   bad_addrs_infosr)   bad_addr_info
match_addrs         r   remove_addr_infosr5   F   s     +-O	R=D ""9-   ,Mm, -*40J	29R=AA""9-   ,Mm, -
xv%=>
??r!   )N)__doc__r,   r   typingr   r   r   r   r   typesr	   strintr    r*   IPv4AddressIPv6Addressr.   r5    r!   r   <module>r>      sK   -   5 5 H
eCc3&'sC})=uS#XNOH d< !	H8 AE%\"%08%	%06
c3hsCc'9!::
;6
	)


$%uY-B-BCc-Q'RR6@\"@
c3hsCc'9!::
;@ 
@r!   