
    Mhz                       d Z ddlmZ ddlmZ ddlmZ ddlZddlmZ ddl	Z	ddl
Z
ddlmZmZmZmZmZmZmZ  ej        d	          Z ej        d
          ZdZdZdZdZdZdZdZdZdZdZej        ej         z  Z!ej"        ej#        z  Z$ej        ej         ddZ% ej        d          Z& ej        d          Z' ej        d          Z( ej        d          Z) ej        d          Z* ej        d          Z+ ej        d          Z,dZ-dZ.dZ/d Z0d!Z1d"Z2d#Z3 G d$ d%          Z4 G d& d'          Z5 G d( d)          Z6 G d* d+e5          Z7 G d, d-ej8                  Z9 ej:        e9           dS ).zCSS matcher.    )annotations)datetime   )utilN)	css_types)IteratorIterableAnyCallableSequencer
   castz[^ 	
]z	[^ 	
]+ >~+z: z:>z:~z:+zhttp://www.w3.org/1999/xhtmlz$http://www.w3.org/XML/1998/namespace)ltrrtlautoz0^(?P<value>-?(?:[0-9]{1,}(\.[0-9]+)?|\.[0-9]+))$z*^(?P<hour>[0-9]{2}):(?P<minutes>[0-9]{2})$z)^(?P<year>[0-9]{4,})-(?P<month>[0-9]{2})$z)^(?P<year>[0-9]{4,})-W(?P<week>[0-9]{2})$z;^(?P<year>[0-9]{4,})-(?P<month>[0-9]{2})-(?P<day>[0-9]{2})$zd^(?P<year>[0-9]{4,})-(?P<month>[0-9]{2})-(?P<day>[0-9]{2})T(?P<hour>[0-9]{2}):(?P<minutes>[0-9]{2})$z(?:(?:-\*-)(?:\*(?:-|$))*|-\*$))      	                        c                  "    e Zd ZdZd
dZddZd	S )_FakeParentz
    Fake parent class.

    When we have a fragment with no `BeautifulSoup` document object,
    we can't evaluate `nth` selectors properly.  Create a temporary
    fake parent so we can traverse the root element as a child.
    elementbs4.TagreturnNonec                    |g| _         dS )Initialize.N)contents)selfr!   s     S/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/soupsieve/css_match.py__init__z_FakeParent.__init__D   s     !	    intc                *    t          | j                  S )zLength.)lenr'   r(   s    r)   __len__z_FakeParent.__len__I   s     4=!!!r+   N)r!   r"   r#   r$   )r#   r,   )__name__
__module____qualname____doc__r*   r0    r+   r)   r    r    ;   sF         " " " "
" " " " " "r+   r    c                     e Zd ZdZedEd            ZedFd
            ZedFd            ZedFd            Z	edFd            Z
edFd            ZedFd            ZedFd            ZedFd            ZedGd            ZedHd            ZdHdZdIdZdJdKdZ	 	 	 dLdMd#Z	 	 	 	 dNdOd%Z	 dJdPd&Z	 	 dQdRd'ZdJdSd(ZedTd*            ZedUd+            ZedTd,            ZedVd-            ZedJdWd.            ZedXdYd0            ZedJdWd1            ZedHd2            Z edZd6            Z!ed[d9            Z"e	 d\d]d=            Z#ed^d?            Z$ed_dA            Z%dJd`dBZ&dJdadDZ'dS )b_DocumentNavz#Navigate a Beautiful Soup document.tagr
   r#   r$   c                n    |                      |          st          dt          |                     dS )z%Check if valid input tag or document.z:Expected a BeautifulSoup 'Tag', but instead received type N)is_tag	TypeErrortype)clsr8   s     r)   assert_valid_inputz_DocumentNav.assert_valid_inputR   sD    
 zz# 	fdY]^aYbYbddeee	f 	fr+   objbs4.element.PageElement | Noneboolc                6    t          | t          j                  S )zIs `BeautifulSoup` object.)
isinstancebs4BeautifulSoupr?   s    r)   is_docz_DocumentNav.is_docZ   s     #s0111r+   c                6    t          | t          j                  S )zIs tag.)rC   rD   TagrF   s    r)   r:   z_DocumentNav.is_tag_   s     #sw'''r+   c                6    t          | t          j                  S )zIs declaration.)rC   rD   DeclarationrF   s    r)   is_declarationz_DocumentNav.is_declarationd   s     #s///r+   c                6    t          | t          j                  S )z	Is CDATA.)rC   rD   CDatarF   s    r)   is_cdataz_DocumentNav.is_cdatai   s     #sy)))r+   c                6    t          | t          j                  S )zIs processing instruction.)rC   rD   ProcessingInstructionrF   s    r)   is_processing_instructionz&_DocumentNav.is_processing_instructionn   s     #s8999r+   c                @    t          | t          j        j                  S )zIs navigable string.)rC   rD   r!   NavigableStringrF   s    r)   is_navigable_stringz _DocumentNav.is_navigable_strings   s     #s{:;;;r+   c                    t          | t          j        t          j        t          j        t          j        t          j        f          S )zIs special string.)rC   rD   CommentrK   rN   rQ   DoctyperF   s    r)   is_special_stringz_DocumentNav.is_special_stringx   s,     #S_ciIbdgdopqqqr+   c                X    |                      |          o|                     |           S )z Check if node is content string.)rU   rY   )r=   r?   s     r)   is_content_stringz_DocumentNav.is_content_string}   s.     &&s++NC4I4I#4N4N0NNr+   elr"   r    c                     t          |           S )z'Create fake parent for a given element.)r    r\   s    r)   create_fake_parentz_DocumentNav.create_fake_parent   s     2r+   bs4.Tag | Nonec                2    | duot          | j                  S )z2Check if element (or document) is from a XML tree.N)rA   _is_xmlr^   s    r)   is_xml_treez_DocumentNav.is_xml_tree   s     ~2$rz"2"22r+   c                    |dS t          |                     |          r|j        nt          j        |j                  dk    o|                     |                    S )z Check if element is an `iframe`.NFiframe)rA   rc   namer   loweris_html_tagr(   r\   s     r)   	is_iframez_DocumentNav.is_iframe   sc     :5))"--Fbgg4:bg3F3F8S !R  
 
 	
r+   c                    | j         o| j         |u }|s5|                     |          }|duo| j        o|                     |          }|S )z
        Return whether element is a root element.

        We check that the element is the root of the tree (which we have already pre-calculated),
        and we check if it is the root element under an `iframe`.
        N)root
get_parentis_htmlrj   )r(   r\   rl   parents       r)   is_rootz_DocumentNav.is_root   sW     y,TY"_ 	R__R((F%Q$,Q4>>&;Q;QDr+   F	no_iframe!Iterator[bs4.element.PageElement]c              #  ^   K   |&|r|                      |          s|j        E d{V  dS dS dS )z$Get contents or contents in reverse.N)rj   r'   r(   r\   rq   s      r)   get_contentsz_DocumentNav.get_contents   sY       > 'DNN2$6$6 ';&&&&&&&&& >' 'r+   Nstart
int | NonereverseIterator[bs4.Tag]c                4    |                      |||d|          S )zGet tag children.T)get_children)r(   r\   rv   rx   rq   s        r)   get_tag_childrenz_DocumentNav.get_tag_children   s        UGT9EEEr+   tagsc              #  B  K   ||r|                      |          st          |j                  dz
  }||r|nd}n|}|rdn|dz   }|rdnd}	d|cxk    r|k    rCn dS ||k    r;|j        |         }
||	z  }|r|                     |
          r|
V  ||k    3dS dS dS dS dS )zGet children.Nr   r   )rj   r.   r'   r:   )r(   r\   rv   rx   r}   rq   lastindexendincrnodes              r)   r{   z_DocumentNav.get_children   s       >9>DNN24F4F>r{##a'D} '.Q-""TAXC '22aDE!!!!T!!!!!!sll;u-DTME #4;;t#4#4 #"


	 sllll >>> "!"lr+   c              #  F   K   |                      |d|          E d{V  dS )z!Specifically get tag descendants.T)r}   rq   N)get_descendantsrt   s      r)   get_tag_descendantsz _DocumentNav.get_tag_descendants   s;       '''KKKKKKKKKKKr+   c              #    K   ||r|                      |          sd}|j        D ]}|||ur	d}t          |t          j                  r|r|                      |          rq|j        |j        }nX|}t          |t          j                  r5|j        r.|j        d         }t          |t          j                  r|j        .|j        }|V  | dS |V  |s|V  dS dS dS )zGet descendants.Nr   )rj   descendantsrC   rD   rI   next_siblingr'   next_element)r(   r\   r}   rq   	next_goodchild
last_childs          r)   r   z_DocumentNav.get_descendants   s9      >9>DNN24F4F>I    (I--  $IeSW--    !T^^E%:%: ! -9(-(:II).J",Z"A"A EjFY E-7-@-D
 #-Z"A"A EjFY E(2(?I#$,!EE KKKK  KKK5 >>>   r+   c                R    ||j         nd}|r||                     |          rd}|S )zGet parent.N)ro   rj   )r(   r\   rq   ro   s       r)   rm   z_DocumentNav.get_parent  s;     !n$ 	+v0F0F+Fr+   
str | Nonec                    | | j         ndS )Get tag.N)rf   r^   s    r)   get_tag_namez_DocumentNav.get_tag_name	  s     .rwwd2r+   c                    | j         S zGet prefix.)prefixr^   s    r)   get_prefix_namez_DocumentNav.get_prefix_name  s     yr+   c                    | | j         ndS )zGet namespace `URI`.N)	namespacer^   s    r)   get_uriz_DocumentNav.get_uri  s      "~r||47r+   c                0    |                      |d          S )Get next sibling tag.T)r}   )get_next)r=   r\   s     r)   get_next_tagz_DocumentNav.get_next_tag  s     ||BT|***r+   c                    |j         }|rAt          |t          j                  s'|%|j         }|rt          |t          j                  s|%|rt          |t          j                  sd}|S )r   N)r   rC   rD   rI   r=   r\   r}   siblings       r)   r   z_DocumentNav.get_next!  s|     / 	+:gsw77 	+G<O*G  	+:gsw77 	+G<O  	
7CG44 	Gr+   Tc                .    |                      |d          S )Get previous sibling tag.T)get_previous)r=   r\   r}   s      r)   get_previous_tagz_DocumentNav.get_previous_tag.  s     D)))r+   c                    |j         }|rAt          |t          j                  s'|%|j         }|rt          |t          j                  s|%|rt          |t          j                  sd}|S )r   N)previous_siblingrC   rD   rI   r   s       r)   r   z_DocumentNav.get_previous4  s}     % 	/:gsw77 	/G<O.G  	/:gsw77 	/G<O  	
7CG44 	Gr+   c                ^    | t          | d          nd}t          |o
|t          k              S )z
        Check if element has an HTML namespace.

        This is a bit different than whether a element is treated as having an HTML namespace,
        like we do in the case of `is_html_tag`.
        Nr   )getattrrA   NS_XHTML)r\   nss     r)   has_html_nsz_DocumentNav.has_html_nsA  s3     *,WR%%%TB)2>***r+   	attr_namestrtuple[str | None, str | None]c                N    | dS t          |dd          t          |dd          fS )z7Return namespace and attribute name without the prefix.N)NNr   rf   )r   )r\   r   s     r)   split_namespacez_DocumentNav.split_namespaceM  s2     ::y+t44giQU6V6VVVr+   valuestr | Sequence[str]c           	        |dS t          |t                    r|S t          |t                    r|                    d          S t          |t                    rg }|D ]}t          |t          t          f          s8t          |t                    r#|                    t          |                     V|                    t          t          |                     |                               |S t          |          S )z6Normalize the value to be a string or list of strings.N utf8)rC   r   bytesdecoder   appendr   normalize_value)r=   r   	new_valuevs       r)   r   z_DocumentNav.normalize_valueV  s   
 =2 uc"" 	L eU## 	(<<''' eX&& 	I H H!!c5\22 Hz!X7N7N H $$SVV,,,, $$T#s/B/B1/E/E%F%FGGGG 5zzr+   rf   defaultstr | Sequence[str] | Nonec                   |}|j         r2	 |                     |j        |                   }n^# t          $ r Y nRw xY w|j                                        D ]4\  }}t          j        |          |k    r|                     |          } n5|S )zGet attribute by name.)rb   r   attrsKeyErroritemsr   rg   )r=   r\   rf   r   r   kr   s          r)   get_attribute_by_namez"_DocumentNav.get_attribute_by_namew  s     : 		++BHTN;;    ((  1:a==D((//22EE ) s    , 
990Iterator[tuple[str, str | Sequence[str] | None]]c              #     K   |8|j                                         D ] \  }}||                     |          fV  dS dS )zIterate attributes.N)r   r   r   )r=   r\   r   r   s       r)   iter_attributesz_DocumentNav.iter_attributes  s_       >(( 0 01,,Q/////// >0 0r+   Sequence[str]c                    |                      |dg           }t          |t                    rt                              |          }t          t          t                   |          S )zGet classes.class)r   rC   r   	RE_NOT_WSfindallr   r   )r=   r\   classess      r)   get_classesz_DocumentNav.get_classes  sT     ++B<<gs## 	1''00GHSM7+++r+   c                p     d                      fd                     ||          D                       S )z	Get text.r   c                >    g | ]}                     |          |S r5   r[   .0r   r(   s     r)   
<listcomp>z)_DocumentNav.get_text.<locals>.<listcomp>  s=       ))$//  r+   rq   )joinr   rt   s   `  r)   get_textz_DocumentNav.get_text  sT     ww   !%!5!5bI!5!N!N  
 
 	
r+   	list[str]c                J      fd                      ||          D             S )zGet Own Text.c                >    g | ]}                     |          |S r5   r   r   s     r)   r   z-_DocumentNav.get_own_text.<locals>.<listcomp>  s=     
 
 
4KaKabfKgKg

 
 
r+   r   )ru   rt   s   `  r)   get_own_textz_DocumentNav.get_own_text  sA    
 
 
 
!..rY.GG
 
 
 	
r+   )r8   r
   r#   r$   )r?   r@   r#   rA   )r\   r"   r#   r    r\   r`   r#   rA   r\   r"   r#   rA   F)r\   r`   rq   rA   r#   rr   )NFF)
r\   r`   rv   rw   rx   rA   rq   rA   r#   ry   )NFFF)r\   r`   rv   rw   rx   rA   r}   rA   rq   rA   r#   rr   )r\   r`   rq   rA   r#   ry   )FF)r\   r`   r}   rA   rq   rA   r#   rr   )r\   r`   rq   rA   r#   r`   r\   r`   r#   r   r\   r"   r#   r   r\   r"   r#   r`   )r\   r"   r}   rA   r#   r@   )T)r\   r"   r}   rA   r#   r`   )r\   r`   r   r   r#   r   )r   r
   r#   r   N)r\   r"   rf   r   r   r   r#   r   )r\   r`   r#   r   )r\   r"   r#   r   )r\   r"   rq   rA   r#   r   )r\   r"   rq   rA   r#   r   )(r1   r2   r3   r4   classmethodr>   staticmethodrG   r:   rL   rO   rR   rU   rY   r[   r_   rc   rj   rp   ru   r|   r{   r   r   rm   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r5   r+   r)   r7   r7   O   sc       --f f f [f 2 2 2 \2 ( ( ( \( 0 0 0 \0 * * * \* : : : \: < < < \< r r r \r O O O [O
    \
 3 3 3 \3
	
 	
 	
 	
   ' ' ' ' ' !	F 	F 	F 	F 	F !# # # # #:  L L L L L 	"  "  "  "  " H     3 3 3 \3
    \
 8 8 8 \8
 + + + [+
 
 
 
 
 [
 * * * * [*
 
 
 
 
 [
 	+ 	+ 	+ \	+ W W W \W    [@ 
 /3	    [* 0 0 0 [0 , , , [,
 
 
 
 

 
 
 
 
 
 
r+   r7   c                      e Zd ZdZedd            Zedd
            Zedd            Zedd            Zedd            Z	edd            Z
edd            ZdS )Inputsz-Class for parsing and validating input items.yearr,   monthdayr#   rA   c                    t           }|t          k    r*| dz  dk    r	| dz  dk    s	| dz  dk    rt          nt          }n|t          v rt
          }d|cxk    o|k    nc S )zValidate day.r   r   d   i  r   )
LONG_MONTHFEBFEB_LEAP_MONTH	FEB_MONTH	MONTHS_30SHORT_MONTH)r   r   r   max_dayss       r)   validate_dayzInputs.validate_day  sz     C<<+/!8q==tczQUY\_U_cdUdUd~~ktHHi"HC####8#####r+   weekc                    t          j        d dd d|  d                                          d         }|dk    rd}d|cxk    o|k    nc S )zValidate week.   -r   z%m-%d-%Yr   5   )r   strptimeisocalendar)r   r   max_weeks      r)   validate_weekzInputs.validate_week  sn     $%8%8R%8%8$%8%8*EEQQSSTUVq==HD$$$$H$$$$$r+   c                "    d| cxk    odk    nc S )zValidate month.r   r   r5   )r   s    r)   validate_monthzInputs.validate_month  s&     ERr+   c                    d| k    S )zValidate year.r   r5   )r   s    r)   validate_yearzInputs.validate_year  s     Dyr+   hourc                "    d| cxk    odk    nc S )zValidate hour.r      r5   )r  s    r)   validate_hourzInputs.validate_hour  s     DBr+   minutesc                "    d| cxk    odk    nc S )zValidate minutes.r   ;   r5   )r  s    r)   validate_minuteszInputs.validate_minutes  s&     G!!!!r!!!!!r+   ityper   r   r   tuple[float, ...] | Nonec                \   d}||S |dk    rt                               |          }|rt          |                    d          d          }t          |                    d          d          }t          |                    d          d          }|                     |          r1|                     |          r|                     |||          r|||f}nR|dk    rt                              |          }|rtt          |                    d          d          }t          |                    d          d          }|                     |          r|                     |          r||f}n|dk    rt                              |          }|rut          |                    d          d          }t          |                    d          d          }|                     |          r| 	                    ||          r||f}n!|dk    rt                              |          }|rtt          |                    d	          d          }	t          |                    d
          d          }
|                     |	          r|                     |
          r|	|
f}n|dk    r?t                              |          }|r!t          |                    d          d          }t          |                    d          d          }t          |                    d          d          }t          |                    d	          d          }	t          |                    d
          d          }
|                     |          r]|                     |          rH|                     |||          r1|                     |	          r|                     |
          r||||	|
f}nC|dv r?t                              |          }|r#t          |                    d                    f}|S )zParse the input value.Ndater   
   r   r   r   timer  r  datetime-local)numberranger   )RE_DATEmatchr,   groupr   r   r   RE_MONTHRE_WEEKr   RE_TIMEr  r  RE_DATETIMERE_NUMfloat)r=   r	  r   parsedmr   r   r   r   r  r  s              r)   parse_valuezInputs.parse_value  s    =LF??e$$A 01776??B//AGGG,,b11!''%.."--$$T** 0s/A/A%/H/H 0SM]M]^bdiknMoMo 0"E3/Fgu%%A +1776??B//AGGG,,b11$$T** +s/A/A%/H/H +"E]Ff__e$$A *1776??B//1776??B//$$T** *s/@/@t/L/L *"D\Ff__e$$A -1776??B//aggi00"55$$T** -s/C/CG/L/L -"G_F&&&!!%((A 
?1776??B//AGGG,,b11!''%.."--1776??B//aggi00"55%%d++?030B0B50I0I?NQN^N^_cejloNpNp?%%d++?030D0DW0M0M? #E3g>F)))U##A 4 0 0113r+   N)r   r,   r   r,   r   r,   r#   rA   )r   r,   r   r,   r#   rA   )r   r,   r#   rA   )r   r,   r#   rA   )r  r,   r#   rA   )r  r,   r#   rA   )r	  r   r   r   r#   r
  )r1   r2   r3   r4   r   r   r   r   r   r  r  r   r  r5   r+   r)   r   r     s        77$ $ $ \$ % % % \%       \ 
    \
    \
 " " " \"
 4 4 4 [4 4 4r+   r   c                  F   e Zd ZdZdXdZdYdZdZdZd[dZd\dZd]dZ	d^dZ
d_dZd`dZdad"Zdbd%Zdad&Zdcd(Zddd*Zdedfd.Zddd/Zddd0Zdgd3Zdhd5Zdid6Zdid7Zdjd9Zdkd<Zdid=Zdld?ZdmdBZdidCZdidDZdndGZ dodIZ!dpdKZ"didLZ#didMZ$dqdNZ%drdsdRZ&dtdSZ'dudUZ(didVZ)dWS )vCSSMatchzPerform CSS matching.	selectorsct.SelectorListscoper`   
namespacesct.Namespaces | Noneflagsr,   r#   r$   c                ,   |                      |           || _        g | _        g | _        g | _        || _        |i n|| _        || _        d| _        |}| 	                    |          }|r|}| 	                    |          }|d}| 
                    |          s|}n|                     |          D ]}|} || _        ||ur|n|| _        |                     |          | _        |                     |          | _        | j         p| j        | _        dS )r&   NF)r>   r8   cached_meta_langcached_default_formscached_indeterminate_formsr   r#  r%  iframe_restrictrm   rG   r|   rl   r"  r   has_html_namespacerc   is_xmlrn   )	r(   r   r"  r#  r%  docro   rl   r   s	            r)   r*   zCSSMatch.__init__  sD    	&&& "$&!*,'" * 2""

$ %% 	*C__S))F  	* {{3 	DD..s33  	#3..UUD
"&"2"24"8"8 &&s++;A$*Ar+   rA   c                    | j         p| j        S )z3Check if namespaces are supported in the HTML type.)r,  r+  r/   s    r)   supports_namespaceszCSSMatch.supports_namespacesC  s     {5d55r+   r\   r   c                |    d}||S |                                  r|                     |          }|r|}nt          }|S )zGet tag namespace.r   )r/  r   r   )r(   r\   r   r   s       r)   
get_tag_nszCSSMatch.get_tag_nsH  sR     	:##%% 	!b!!B 	 Ir+   c                >    |                      |          t          k    S )z"Check if tag is in HTML namespace.)r1  r   ri   s     r)   rh   zCSSMatch.is_html_tagW  s     r""h..r+   r   c                j    |                      |          }|| j        st          j        |          n|S )r   )r   r,  r   rg   r(   r\   rf   s      r)   get_tagzCSSMatch.get_tag\  s8       $$#'#3DK#3tz$TQr+   r"   c                j    |                      |          }|| j        st          j        |          n|S r   )r   r,  r   rg   )r(   r\   r   s      r)   
get_prefixzCSSMatch.get_prefixb  s9     %%b))%+%7%7tz&!!!QWWr+   rw   c           
     ,   |                      |          D ]}|                     |          rt                              t	          j        |                     |dd                    d          }|                     |          }|r|dv s|                     |          r|| 	                    |          }||c S | 
                    |          r|D ]<}t          j        |          }|dv r"|dk    rt          j        nt          j        c c S =dS )z%Get directionality from element text.dirr   N)bdiscriptstyletextareare   ALRLrA  )r{   r:   DIR_MAPgetr   rg   r   r5  rh   	find_bidirY   unicodedatabidirectionalctSEL_DIR_LTRSEL_DIR_RTL)r(   r\   r   	directionrf   r   cbidis           r)   rD  zCSSMatch.find_bidih  sW    %%b)) 	M 	MD {{4    $KK
43M3MdTY[]3^3^(_(_aeff	||D))"&VVV((.. W) t,,$ LLL  %%d++   M M"033+++-1S[[2>>bnLLLLL ,M tr+   
lang_rangelang_tagc                x   d}t                               d|                                          }|                    d          }|                                                    d          }t	          |          }t	          |          }d}d}	||         }
||	         }|dk    r|dk    r
|
s|
|k    rdS |
dk    r|
|k    s|
dk    r
|dk    r|sd}|dz  }|	dz  }	|r^||k     rX||         }
	 ||	         }n# t
          $ r d}Y (w xY w|
sd}1||
k    r|dz  }nt	          |          dk    rd}S|	dz  }	|r||k     X|S )zFilter the language tags.Tr   r   r   *F)RE_WILD_STRIPsubrg   splitr.   
IndexError)r(   rM  rN  r  rangessubtagslengthslengthrindexsindexrss               r)   extended_language_filterz!CSSMatch.extended_language_filter  s    "&&sJ77==??
!!#&&..""((--Vg,,6NFO Q;;7a<<<a1ff4 HHaQ#XX'Q,,q,E!!  	vAFO    	   a! Q1 aKF5  	8 s   +C4 4DDattrr   r   c                   d}|                                  rd}|r%| j                            |          }||dk    rdS nd}|                     |          D ]\  }}|                     ||          \  }}	|C| j        r||k    s1| j        s.t          j        |          t          j        |          k    r|} nLc|||k    r|dk    rr| j        s+t          j        |          t          j        |	          k    rn||	k    r|} nH|                     |          D ]2\  }}t          j        |          t          j        |          k    r0|} |S )z3Match attribute name and return value if it exists.NrP  )r/  r#  rC  r   r   r,  r   rg   )
r(   r\   r^  r   r   r   r   r   r   rf   s
             r)   match_attribute_namezCSSMatch.match_attribute_name  s    ##%% )	E _((00:&C--4,,R00  1 #'"6"6r1"="=	4 : 		4;	4:VZK[K[_c_ijk_l_lKlKl !  $yVs]] BF DJt$$
4(8(8888SW[_S_S_,,R00  1:d##tz!}}44r+   r8   ct.SelectorTagc                B   d}|                      |          }| j                            d          }|j        dn| j                            |j                  }|j        |	||k    rd}n3|j        |j        dk    r|rd}n|j        r|j        dk    r
|||k    rd}|S )z#Match the namespace of the element.Tr   NFrP  )r1  r#  rC  r   )r(   r\   r8   r  r   default_namespacetag_nss          r)   match_namespacezCSSMatch.match_namespace  s     OOB''	 O//33z)t/B/B3:/N/N:#4#@YRcEcEcEEj$r)9)9i)9EE J	J#6>Y&5H5HEr+   
attributes tuple[ct.SelectorAttribute, ...]c                .   d}|r|D ]}|                      ||j        |j                  }| j        r|j        r|j        n|j        }|d} nIt          |t                    r|nd                    |          }|t|	                    |          d} n|S )zMatch attributes.TNFr   )
r`  	attributer   r,  xml_type_patternpatternrC   r   r   r  )r(   r\   rf  r  atemprk  r   s           r)   match_attributeszCSSMatch.match_attributes  s      	  00Q[!(KK04a@Ra!,,XYXa<!EE *4 5 5I388D>>?]]5))1!EE 2 r+   c                    | j         s |j        t          j        |j                  n|j        }|duo||                     |          dfv S )zMatch tag name.NrP  )r,  rf   r   rg   r5  )r(   r\   r8   rf   s       r)   match_tagnamezCSSMatch.match_tagname"  s\     -1K^CH<P
38$$$VYV^ 0b))3//
 	
r+   ct.SelectorTag | Nonec                n    d}|0|                      ||          sd}|                     ||          sd}|S )zMatch the tag.TNF)re  rp  )r(   r\   r8   r  s       r)   	match_tagzCSSMatch.match_tag+  sM     ?''C00 %%b#.. r+   relationc                .   d}t          |d         t          j                  r|S |d         j        t          k    rX|                     || j                  }|s8|r6|                     ||          }|                     || j                  }|s|6n|d         j        t          k    r5|                     || j                  }|r|                     ||          }n|d         j        t          k    rI| 
                    |          }|s1|r/|                     ||          }| 
                    |          }|s|/nX|d         j        t          k    rB| 
                    |          }|r+|                     |          r|                     ||          }|S )zMatch past relationship.Fr   r   )rC   rG  SelectorNullrel_type
REL_PARENTrm   r*  match_selectorsREL_CLOSE_PARENTREL_SIBLINGr   REL_CLOSE_SIBLINGr:   )r(   r\   rt  foundro   r   s         r)   match_past_relationszCSSMatch.match_past_relations7  s    hqk2?33 	LA;:--__R43G_HHF Q Q,,VX>>4;OPP  Q Q a[!%555__R43G_HHF ?,,VX>>a[![00++B//G 9 9,,Wh??//88  9 9 a[!%666++B//G @4;;w// @,,Wh??r+   Fro   	recursivec                    d}|r| j         }n| j        } ||| j                  D ]}|                     ||          }|r n|S )zMatch future child.Fr   )r   r|   r*  ry  )r(   ro   rt  r  r  childrenr   s          r)   match_future_childzCSSMatch.match_future_childS  sp      	-/HH,HXf0DEEE 	 	E((99E r+   c                r   d}t          |d         t          j                  r|S |d         j        t          k    r|                     ||d          }n|d         j        t          k    r|                     ||          }n|d         j        t          k    rI|                     |          }|s1|r/| 	                    ||          }|                     |          }|s|/nX|d         j        t          k    rB|                     |          }|r+|                     |          r| 	                    ||          }|S )zMatch future relationship.Fr   T)rC   rG  rv  rw  REL_HAS_PARENTr  REL_HAS_CLOSE_PARENTREL_HAS_SIBLINGr   ry  REL_HAS_CLOSE_SIBLINGr:   )r(   r\   rt  r}  r   s        r)   match_future_relationszCSSMatch.match_future_relationsa  sH    hqk2?33 	LA;>11++B$??EEa[!%999++B99EEa[!_44''++G 5 5,,Wh??++G44  5 5 a[!%:::''++G @4;;w// @,,Wh??r+   c                   d}t          |d         t          j                  s|d         j        |S |d         j                            d          r|                     ||          }n|                     ||          }|S )z%Match relationship to other elements.Fr   N:)rC   rG  rv  rw  
startswithr  r~  )r(   r\   rt  r}  s       r)   match_relationszCSSMatch.match_relationsx  s     hqk2?33 	x{7K7SLA;**3// 	<//H==EE--b(;;Er+   idstuple[str, ...]c                R    d}|D ]!}||                      |dd          k    rd} n"|S )zMatch element's ID.Tidr   F)r   )r(   r\   r  r}  is        r)   match_idzCSSMatch.match_id  sK      	 	AD..r4<<<< = r+   r   c                N    |                      |          }d}|D ]
}||vrd} n|S )zMatch element's classes.TF)r   )r(   r\   r   current_classesr}  rK  s         r)   match_classeszCSSMatch.match_classes  sL     **2.. 	 	A'' ( r+   c                X   |                      |          }|r|                     |          }|rq|o|                     |          s>|                     |          r|                                s|                     |          rd}n|                     |          }|r|o|r|                     |          }|rq|o|                     |          s>|                     |          r|                                s|                     |          rd}n|                     |          }|r|o|S )zMatch element as root.NF)rp   r   r:   r[   striprO   r   )r(   r\   rp   r   s       r)   
match_rootzCSSMatch.match_root  sd    ,,r"" 		9''++G 9g1KK((9-1-C-CG-L-L9QXQ^Q^Q`Q`9MM'**9 $GG"//88G  9g1  		5mmB''G 5g1KK((5-1-C-CG-L-L5QXQ^Q^Q`Q`5MM'**5 $GG"mmG44G  5g1 r+   c                    | j         |u S )zMatch element as scope.)r"  ri   s     r)   match_scopezCSSMatch.match_scope  s     zRr+   r   c                    |                      |          |                      |          k    o+|                     |          |                     |          k    S )z!Match tag type for `nth` matches.)r5  r1  )r(   r\   r   s      r)   match_nth_tag_typezCSSMatch.match_nth_tag_type  sN     \\%  DLL$4$44 <__U##tr':'::	
r+   nthtuple[ct.SelectorNth, ...]c                   d}|D ][}d}|j         r|                     ||j                   s n3|                     |          }|#t          d|                     |                    }|j        }t          |          dz
  }|r|nd}d}	|j        }
|j        }|j	        }d}d}|rdnd}|r|
|z  |z   n|
x}}|rd}|dk     s||k    rs|dk     r0d|z
  }||dk    rn_d}||z  }|r|
|z  |z   n|
x}}d|z
  }||k    rn>n1||z
  }||dk    rn/d}||z  }|r|
|z  |z   n|
x}}||z
  }||k    rn|}|dk     m||k    s|}|
dk     r#|dk    r|}||z  }|r|
|z  |z   n|
x}}|dk    d}|}|r|
|z  |z   n|
x}}d|cxk    r	|dz   k    rn nd}| 
                    |||dk               D ]}}||z  }t          |t          j                  s"|j         r|                     ||j                   sE|j        r|                     ||          sc|	dz  }	|	|k    r	||u rd}n n||u r n~||u rn3|}||z  }|dk     rn%|r|
|z  |z   n|
}||k    rnd|cxk    r	|dz   k    n |s n]|S )	zMatch `nth` elements.TFNr"   r   r   r   )rv   rx   )r   ry  rm   r   r_   r   r.   rl  bnr{   rC   rD   rI   of_typer  )r(   r\   r  matchedr  ro   r   
last_indexr   relative_indexrl  r  varcount
count_incrfactoridxlast_idxadjustdiff_lowdiff	diff_highlowestr   s                           r)   	match_nthzCSSMatch.match_nth  s     ]	 ]	AG{ 4#7#7AK#H#H __R((F~i)@)@)D)DEE6DVqJ"&-JJAENAA#CEJ&RRQF.18QY]]q8C(  &= Aggz!1!1Qww#$s7!-&A++!!#+:=)DUQ1Dh 3w8++! , %(*$4	!-&B,,!!"+:=)DUQ1Dh"Z/9,,!$(	+ Aggz!1!14 q55((!&+:=)DUQ1Dh (( "$J25!<UQ1<h s,,,,j1n,,,,,!..vUFUVJ.WW  EVOE%eSW55 ! { !4+?+?q{+S+S ! y !)@)@U)K)K ! "a'N%,, B;;&*GG!E{{ #B;;#199'*1a%i!mms??= s,,,,j1n,,,,>  r+   c                    d}|                      |          D ]N}|                     |          rd} n4|                     |          rt                              |          rd} nO|S )z)Check if element is empty (if requested).TF)r{   r:   r[   RE_NOT_EMPTYsearch)r(   r\   is_emptyr   s       r)   match_emptyzCSSMatch.match_empty(  s     &&r** 	 	E{{5!!  ''.. <3F3Fu3M3M  r+   tuple[ct.SelectorList, ...]c                D    d}|D ]}|                      ||          sd}|S )zMatch selectors.TF)ry  )r(   r\   r   r  sels        r)   match_subselectorszCSSMatch.match_subselectors5  s;      	 	C''C00 r+   containstuple[ct.SelectorContains, ...]c                    d}d}|D ]u}|@|j         r|                     || j                  }n|                     || j                  }d}|j        D ]#}|j         r|D ]
}||v rd} n|r n
||v rd} n$|sd}v|S )z"Match element if it contains text.TNr   F)ownr   rn   r   text)	r(   r\   r  r  contentcontain_listr}  r  rK  s	            r)   match_containszCSSMatch.match_contains>  s     $ 	 	L# H"//dl/KKGG"mmB$,mGGGE$)  # 
$ " "199$(E!E %   w $ '  r+   c                >   d}d}|                      |d          }|rN|L|                     |          dk    r|                     |          r|}n|                      |d          }|r|L|d}| j        D ]\  }}||u r
d}||u rd} n|s|                     |d          D ]x}|                     |          }	|	dk    r nZ|	dv rU|                     |dd          }
|
r<t          j        |
          d	k    r$| j                            ||f           ||u rd} ny|S )
Match default.FNTr   form)inputbuttonr<   r   submit)	rm   r5  rh   r(  r   r   r   rg   r   )r(   r\   r  r  ro   
found_formftr   rf   r   s              r)   match_defaultzCSSMatch.match_defaultZ  s     t44 	A||F##v--$2B2B62J2J-4@@	  	A J1  199!%JBww $E	   "!55dd5KK " "E<<..Dv~~222 66ufbII "A(!:!: 5<<dE]KKK!U{{(,!Er+   c                    d}t          t                               |d                    }d fd} ||          }|.d} j        D ]\  }}}	||u r||k    r
d	}|	d	u rd	} n|sd}
                     |d	
          D ]}||u r                     |          }|dk    rd}d}d}                     |          D ]\  }}t          j        |          dk    rt          j        |          dk    rd	}n;t          j        |          dk    r	||k    rd	}nt          j        |          dk    rd	}|r|r|r ||          |u rd	}
 n|
r n|
sd	} j        	                    |||f           |S )r  Frf   r\   r"   r#   r`   c                    d}                     | d          }|Q                    |          dk    r                    |          r|}n |}                     |d          }||}n|Q|S )zFind this input's form.NTr   r  )rm   r5  rh   )r\   r  ro   last_parentr(   s       r)   get_parent_formz5CSSMatch.match_indeterminate.<locals>.get_parent_form  s    D__R4_88F,<<''611d6F6Fv6N6N1!D$4@@>&D , Kr+   NTr   r  r<   radiocheckedr   )
r   r   r   r)  r   r5  r   r   rg   r   )r(   r\   r  rf   r  r  r  r  r  r  r  r   tag_nameis_radiocheckhas_namer   r   s   `                 r)   match_indeterminatezCSSMatch.match_indeterminate  s    C33B??@@	 	 	 	 	 	 r"" J:  1a99d!%JDyy $E  L!55dd5KK  E{{ #||E22H7**#( %#($($8$8$?$? 	& 	&DAq#z!}}664:a==G;S;S+/!%A&!8!8Q$YY+/!%A)!;!;(,' &E &h &??SXCYCY]aCaCa*. %  ! E/66dE7JKKKr+   langstuple[ct.SelectorLang, ...]c           	     X   d}|                                  }| j        }| j        }|}d}d}	|s|                     |          }
|                     |          D ]y\  }}|                     ||          \  }}|r|
r!| j        st          j        |          n|dk    s2|r4|
s2|t          k    r'| j        s|t          j        |          n|dk    r|} nz|}	| 
                    || j                  }||	}|                     |          }|	}n||#| j        r| j        D ]}||d         u r|d         }|| j        r|r|r|j        dk    rd}dD ][}d}|                     || j                  D ]6}|                     |          |k    r|                     |          rd	}|} n7|s n\|r<|9|D ]}t#          |t$          j                  r|                     |          d
k    r|                     |          rd}d}|                     |          D ]\  }}t          j        |          dk    rt          j        |          dk    rd	}t          j        |          dk    r|}|rH|rF|}| j                            t+          t,          |          t+          t,          |          f            n| n|/| j                            t+          t,          |          df           |;|D ]8}d}|D ]-}|                     |t+          t,          |                    rd	}.|s n9|S )zMatch languages.FNlangr   r   r   html)r  headTmetaz
http-equivzcontent-languager  r   )r/  rl   r+  r   r   r   r,  r   rg   NS_XMLrm   rn   r'  rf   r|   r5  rh   rC   rD   rI   r   r   r   r]  )r(   r\   r  r  has_nsrl   r+  ro   
found_langr   r   r   r   attr_nsr^  cacher}  r8   r   child2c_langr  patternsrk  s                           r)   
match_langzCSSMatch.match_lang  s    ))++y!4 
 	**622K,,V44 
 
1 $ 4 4VQ ? ? $/KO;6]djmmm\]bh5h5h 6i'2 6i7>&7H7H15[AQD)))W[`fff "#JED__Vt|_DDF~%)%5%5d%;%;")  	. $"7. * *58##!&qJ t{7IdW[W`djWjWjE'  !226T\2RR  E||E**c11d6F6Fu6M6M1 $!& E  H+$  F!&#'22 &t||F7K7Kv7U7UZ^ZjZjkqZrZr7U!&"&$($8$8$@$@ & &DAq#z!}}<<ARdAdAd)-#z!}}	99*+% &' &-4
 $ 5 < <d3ootTWYcOdOd=e f f f %!- .%)00$sD//21FGGG !!  ' % %G44Wd3
>S>STT % $ E r+   directionalityc           	     `    |t           j        z  r|t           j        z  rdS |                     |          sdS t                              t          j                             |dd                    d          }|dvr||k    S  	                    |          }|r|t           j        |k    S  
                    |          }|dk    }|dk    }|dk    }|r)t          j                             |d	d                    nd}	|r|	d
k    r|t           j        |k    S |r|	dv s|r|dk    r|r7d                     fd                     |d          D                       }
n*t          t                               |dd                    }
|
rS|
D ]@}t          j        |          }|dv r&|dk    rt           j        nt           j        }||k    c S At           j        |k    S |rt           j        |k    S                                           |d          |          S |r||dk    rZ                     |          }|||k    S |rt           j        |k    S                                           |d          |          S                                           |d          |          S )zCheck directionality.FNr9  r   )Nr   r  r=  r:  r<   tel)r  r  r  urlemailr   c              3  F   K   | ]}                     |          |V  d S r   r   r   s     r)   	<genexpr>z%CSSMatch.match_dir.<locals>.<genexpr>6  s8      wwZ^ZpZpquZvZvwwwwwwwr+   Tr   r   r>  rA  )rG  rH  rI  rh   rB  rC  r   rg   r   rp   r5  r   ru   r   r   rE  rF  	match_dirrm   rD  )r(   r\   r  rJ  rp   rf   is_inputis_textareais_bdir	  r   rK  rL  s   `            r)   r  zCSSMatch.match_dir  s    BN* 	~/N 	5:T--b11:5 KK
4+E+Eb%QS+T+T U UW[\\	I%%.. ,,r"" 	4y(>^33 ||B7?j(JRZ
455b&"EEFFFXZ 	49+<>^33  	W%#LLLQ\Lbkopbpbp Owwww1B1B2QU1B1V1VwwwwwS$"<"<R""M"MNN 	8 ; ;A&4Q77D///6:ckkBNNr~	(N:::: 0 ~77 8~77>>$//"/"E"E~VVV  	Wy(Y!^^r**I$ N22 8~77>>$//"/"E"E~VVV ~~doobDoAA>RRRr+   	conditionc                   d}t          j        |                     |d                    }t                              |t          t          |                     |dd                              }t                              |t          t          |                     |dd                              }||dS t                              |t          t          |                     |dd                              }|P|dv r|||k     rd}|s
|||k    rd}n5|d	k    r/||||k    r||k     r||k    rd}n|||k     rd}|s
|||k    rd}|t          j        z  r| n|S )
ac  
        Match range.

        Behavior is modeled after what we see in browsers. Browsers seem to evaluate
        if the value is out of range, and if not, it is in range. So a missing value
        will not evaluate out of range; therefore, value is in range. Personally, I
        feel like this should evaluate as neither in or out of range.
        Fr<   minNmaxr   )r  r  r   r   r  r  Tr  )	r   rg   r   r   r  r   r   rG  SEL_IN_RANGE)r(   r\   r  out_of_ranger	  mnmxr   s           r)   match_rangezCSSMatch.match_rangeQ  s    
455b&AABBtC1K1KBPUW[1\1\']']^^tC1K1KBPUW[1\1\']']^^ :"*5""5$sD4N4NrSZ\`4a4a*b*bccVVV>ebjj#'L# (52::#'L&>bnbrzzebjj'+~%"**'+' ,BNurzz'+#,r#>P<LPr+   c                    |                      |          }|duoH|                    d          dk    p/|                    d          dk    p|                     |          duS )a  
        Match defined.

        `:defined` is related to custom elements in a browser.

        - If the document is XML (not XHTML), all tags will match.
        - Tags that are not custom (don't have a hyphen) are marked defined.
        - If the tag has a prefix (without or without a namespace), it will not match.

        This is of course requires the parser to provide us with the proper prefix and namespace info,
        if it doesn't, there is nothing we can do.
        Nr   r   r  )r5  findr7  r4  s      r)   match_definedzCSSMatch.match_definedy  si     ||B 		#"$ 0		#"$0##4/		
r+   c                @    d}|                      |          }|dv rd}|S )z
        Match placeholder shown according to HTML spec.

        - text area should be checked if they have content. A single newline does not count as content.

        F)r   
T)r   )r(   r\   r  r  s       r)   match_placeholder_shownz CSSMatch.match_placeholder_shown  s/     --##j  Er+   c                n   d}|j         }|j        }|r#| j        }| j        }dt          i| _        d| _        |r| j        r|D ]}|}t          |t          j                  r |                     ||j	                  s<|j
        t          j        z  r|                     |          sf|j
        t          j        z  r|                     |          s|j
        t          j        z  r|                     |          s|j
        t          j        z  r|                     |          s|                     ||j                  s|j
        t          j        z  r|                     |          s,|j        r|                     ||j                  sP|j        r|                     ||j                  st|                     ||j                  s|j
        t:          z  r%|                     ||j
        t:          z            s|j        r|                      ||j                  s|j!        r| "                    ||j!                  s|j#        r| $                    ||j#                  s1|j
        t          j%        z  r| &                    |          s\|j
        t          j'        z  r| (                    |          s|j
        tR          z  r%| *                    ||j
        tR          z            s|j+        r| ,                    ||j+                  s| } |r|| _        || _        |S )z.Check if element matches one of the selectors.Fr  T)-is_notrn   r#  r*  r   rC   rG  rv  rs  r8   r%  SEL_DEFINEDr  SEL_ROOTr  	SEL_SCOPEr  SEL_PLACEHOLDER_SHOWNr  r  r  	SEL_EMPTYr  r  r  r   r  rn  rf  RANGESr  r  r  r   r  rt  r  SEL_DEFAULTr  SEL_INDETERMINATEr  	DIR_FLAGSr  r  r  )	r(   r\   r   r  r  rn   r#  r*  selectors	            r)   ry  zCSSMatch.match_selectors  si    !#  	(J"2O%x0DO#'D  =	$, =	% < <h88 ~~b(,77 >BN2 4;M;Mb;Q;Q >BK/ 8K8K >BL0 9I9I"9M9M >B$<< TEaEabdEeEe ~~b(,77 >BL0 9I9I"9M9M < b(,(G(G # D,>,>r8CS,T,T ,,R1DEE >F* 43C3CBY_H_3`3` = X])K)K % d.E.Eb(J\.].] $ T-A-A"hFW-X-X >BN2 4;M;Mb;Q;Q  >B$88 AYAYZ\A]A] >I- dnnRZcIc6d6d $ T-@-@XEV-W-W "
  	3(DO#2D r+   r   limitry   c              #     K   |dk     rdn|}|                      | j                  D ]+}|                     |          r|V  ||dz  }|dk     r dS ,dS )z&Match all tags under the targeted tag.r   N)r   r8   r  )r(   r  limr   s       r)   selectzCSSMatch.select  s~       aiiddU--dh77 	 	Ezz%   ?1HCQww	 	r+   c                    | j         }d}|3|1|                     |          r|}n|                     |          }||1|S )Match closest ancestor.N)r8   r  rm   )r(   currentclosests      r)   r  zCSSMatch.closest   sY     (o'"5zz'"" 3!//'22	 o'"5
 r+   list[bs4.Tag]c                P      fd                       j                  D             S )zFilter tag's children.c                r    g | ]3}t          |t          j                                      |          1|4S r5   )rC   rD   rI   r  )r   r8   r(   s     r)   r   z#CSSMatch.filter.<locals>.<listcomp>  sM     
 
 
#sw''
,0JJsOO

 
 
r+   )ru   r8   r/   s   `r)   filterzCSSMatch.filter  s>    
 
 
 
,,TX66
 
 
 	
r+   c                    |                      |           o/|                     |          o|                     || j                  S zMatch.)rG   r:   ry  r   ri   s     r)   r  zCSSMatch.match  s@     ;;r??"ct{{2c4;O;OPRTXTb;c;ccr+   N)
r   r!  r"  r`   r#  r$  r%  r,   r#   r$   )r#   rA   )r\   r`   r#   r   r   r   r   )r\   r"   r#   rw   )rM  r   rN  r   r#   rA   )r\   r"   r^  r   r   r   r#   r   )r\   r"   r8   ra  r#   rA   )r\   r"   rf  rg  r#   rA   )r\   r"   r8   rq  r#   rA   )r\   r"   rt  r!  r#   rA   r   )ro   r"   rt  r!  r  rA   r#   rA   )r\   r"   r  r  r#   rA   )r\   r"   r   r  r#   rA   r   )r\   r"   r   r"   r#   rA   )r\   r"   r  r  r#   rA   )r\   r"   r   r  r#   rA   )r\   r"   r  r  r#   rA   )r\   r"   r  r  r#   rA   )r\   r`   r  r,   r#   rA   )r\   r"   r  r,   r#   rA   )r\   r"   r   r!  r#   rA   r   )r  r,   r#   ry   )r#   r`   )r#   r  )*r1   r2   r3   r4   r*   r/  r1  rh   r5  r7  rD  r]  r`  re  rn  rp  rs  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  ry  r  r  r  r  r5   r+   r)   r  r    sM       'B 'B 'B 'BR6 6 6 6
   / / / /
R R R RX X X X# # # #J6 6 6 6p3 3 3 3j   *   &
 
 
 

 
 
 
   8       .      	 	 	 	   4       

 
 
 
c c c cJ         8& & & &P< < < <|T T T Tl9S 9S 9S 9Sv&Q &Q &Q &QP
 
 
 
.   R R R Rh    
 
 
 

 
 
 
d d d d d dr+   r  c                       e Zd ZU dZded<   ded<   ded<   ded	<   d
ed<   dZd! fdZd"dZd#dZd$dZ	d#dZ
d%d&dZd%d'dZd(d ZeZ xZS ))	SoupSievez-Compiled Soup Sieve selector matching object.r   rk  r!  r   r$  r#  zdict[str, str]customr,   r%  )rk  r   r#  r  r%  _hashct.CustomSelectors | Nonec                T    t                                          |||||           dS )r&   )rk  r   r#  r  r%  N)superr*   )r(   rk  r   r#  r  r%  	__class__s         r)   r*   zSoupSieve.__init__%  s?     	! 	 	
 	
 	
 	
 	
r+   r8   r"   r#   rA   c                j    t          | j        || j        | j                                      |          S r  )r  r   r#  r%  r  r(   r8   s     r)   r  zSoupSieve.match7  s-     T_djIIOOPSTTTr+   r`   c                h    t          | j        || j        | j                                                  S )r  )r  r   r#  r%  r  r&  s     r)   r  zSoupSieve.closest<  s*     T_djIIQQSSSr+   iterableIterable[bs4.Tag]r  c                     t          |t          j                  r3t           j        | j         j                                                  S  fd|D             S )a  
        Filter.

        `CSSMatch` can cache certain searches for tags of the same document,
        so if we are given a tag, all tags are from the same document,
        and we can take advantage of the optimization.

        Any other kind of iterable could have tags from different documents or detached tags,
        so for those, we use a new `CSSMatch` for each item in the iterable.
        c                r    g | ]3}t                               |                              |          1|4S r5   )r  rU   r  r   s     r)   r   z$SoupSieve.filter.<locals>.<listcomp>P  sB    mmmTX5Q5QRV5W5Wm\`\f\fgk\l\lmDmmmr+   )rC   rD   rI   r  r   r#  r%  r  )r(   r(  s   ` r)   r  zSoupSieve.filterA  sZ     h(( 	nDNHdotzRRYY[[[mmmmXmmmmr+   c                H    |                      |d          }|r|d         ndS )zSelect a single tag.r   )r  r   N)r  )r(   r8   r}   s      r)   
select_onezSoupSieve.select_oneR  s,     {{3a{(((tAwwD(r+   r   r  c                H    t          |                     ||                    S )zSelect the specified tags.)listiselectr(   r8   r  s      r)   r  zSoupSieve.selectX  s      DLLe,,---r+   ry   c              #  ~   K   t          | j        || j        | j                                      |          E d{V  dS )zIterate the specified tags.N)r  r   r#  r%  r  r1  s      r)   r0  zSoupSieve.iselect]  sI       DNC$*MMTTUZ[[[[[[[[[[[r+   c           	     H    d| j         d| j        d| j        d| j        d	S )zRepresentation.zSoupSieve(pattern=z, namespaces=z	, custom=z, flags=))rk  r#  r  r%  r/   s    r)   __repr__zSoupSieve.__repr__b  sK    = = =do = =k= =-1Z= = =	
r+   )
rk  r   r   r!  r#  r$  r  r!  r%  r,   )r8   r"   r#   rA   )r8   r"   r#   r`   )r(  r)  r#   r  r  )r8   r"   r  r,   r#   r  )r8   r"   r  r,   r#   ry   )r#   r   )r1   r2   r3   r4   __annotations__	__slots__r*   r  r  r  r-  r  r0  r5  __str____classcell__)r$  s   @r)   r  r    s"        77LLL$$$$JJJRI
 
 
 
 
 
$U U U U
T T T T
n n n n") ) ) ). . . . .
\ \ \ \ \

 
 
 
 GGGGGr+   r  );r4   
__future__r   r   r   r   rer   rG  rE  rD   typingr   r	   r
   r   r   r   compiler  r   rx  rz  r{  r|  r  r  r  r  r   r  rH  rI  r  r  SEL_OUT_OF_RANGEr	  rB  r  r  r  r  r  r  rQ  r   r   r   r   r   r   DAYS_IN_WEEKr    r7   r   r  	Immutabler  pickle_registerr5   r+   r)   <module>rB     s     " " " " " "             				           



 I I I I I I I I I I I I I I I I I I rz.))BJ''	 
     )	/NR^+		2.	. >>  
G	H	H
"*B
C
C2:BCC
"*A
B
B
"*S
T
Tbjk  
=>>	
	" " " " " " " "(^
 ^
 ^
 ^
 ^
 ^
 ^
 ^
Bd d d d d d d dN@d @d @d @d @d| @d @d @dF P P P P P P P Pf  9     r+   