
    ,hz                    4   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jD                  ejF                  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jp                        Z9 ejt                  e9       y).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y)_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.
    c                    |g| _         y)Initialize.N)contents)selfelements     U/var/www/html/Resume-Scraper/venv/lib/python3.12/site-packages/soupsieve/css_match.py__init__z_FakeParent.__init__D   s     !	    c                ,    t        | j                        S )zLength.)lenr#   r$   s    r&   __len__z_FakeParent.__len__I   s     4==!!r(   N)r%   bs4.TagreturnNone)r.   int)__name__
__module____qualname____doc__r'   r,    r(   r&   r    r    ;   s    "
"r(   r    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ed&d	       Zed&d
       Zed'd       Zed(d       Zd(dZd)dZd*d+dZ	 	 	 d,	 	 	 	 	 	 	 	 	 d-dZ	 	 	 	 d.	 	 	 	 	 	 	 	 	 	 	 d/dZ	 d*	 	 	 	 	 d0dZ	 	 d1	 	 	 	 	 	 	 d2dZd*d3dZed4d       Zed5d       Zed4d       Zed6d       Zed*d7d       Zed8d9d       Zed*d7d       Zed(d       Z ed:d       Z!ed;d       Z"e	 d<	 	 	 	 	 	 	 d=d        Z#ed>d!       Z$ed?d"       Z%d*d@d#Z&d*dAd$Z'y)B_DocumentNavz#Navigate a Beautiful Soup document.c                T    | j                  |      st        dt        |             y)z%Check if valid input tag or document.z:Expected a BeautifulSoup 'Tag', but instead received type N)is_tag	TypeErrortype)clstags     r&   assert_valid_inputz_DocumentNav.assert_valid_inputR   s/    
 zz#XY]^aYbXcdee r(   c                6    t        | t        j                        S )zIs `BeautifulSoup` object.)
isinstancebs4BeautifulSoupobjs    r&   is_docz_DocumentNav.is_docZ   s     #s0011r(   c                6    t        | t        j                        S )zIs tag.)r@   rA   TagrC   s    r&   r9   z_DocumentNav.is_tag_   s     #sww''r(   c                6    t        | t        j                        S )zIs declaration.)r@   rA   DeclarationrC   s    r&   is_declarationz_DocumentNav.is_declarationd   s     #s//r(   c                6    t        | t        j                        S )z	Is CDATA.)r@   rA   CDatarC   s    r&   is_cdataz_DocumentNav.is_cdatai   s     #syy))r(   c                6    t        | t        j                        S )zIs processing instruction.)r@   rA   ProcessingInstructionrC   s    r&   is_processing_instructionz&_DocumentNav.is_processing_instructionn   s     #s8899r(   c                J    t        | t        j                  j                        S )zIs navigable string.)r@   rA   r%   NavigableStringrC   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.)r@   rA   CommentrI   rL   rO   DoctyperC   s    r&   is_special_stringz_DocumentNav.is_special_stringx   s5     #S__ciiIbIbdgdodopqqr(   c                L    | j                  |      xr | j                  |       S )z Check if node is content string.)rS   rW   )r<   rD   s     r&   is_content_stringz_DocumentNav.is_content_string}   s(     &&s+NC4I4I#4N0NNr(   c                    t        |       S )z'Create fake parent for a given element.)r    els    r&   create_fake_parentz_DocumentNav.create_fake_parent   s     2r(   c                8    | duxr t        | j                        S )z2Check if element (or document) is from a XML tree.N)bool_is_xmlr[   s    r&   is_xml_treez_DocumentNav.is_xml_tree   s     ~2$rzz"22r(   c                    |yt        | j                  |      r|j                  nt        j                  |j                        dk(  xr | j                  |            S )z Check if element is an `iframe`.Fiframe)r_   ra   namer   loweris_html_tagr$   r\   s     r&   	is_iframez_DocumentNav.is_iframe   sT     :))"-bgg4::bgg3F8S !R 
 	
r(   c                    | j                   xr | j                   |u }|s6| j                  |      }|duxr | j                  xr | j                  |      }|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_htmlrh   )r$   r\   rj   parents       r&   is_rootz_DocumentNav.is_root   sQ     yy,TYY"___R(F%Q$,,Q4>>&;QDr(   c              #  f   K   |)|r| j                  |      s|j                  E d{    yyy7 w)z$Get contents or contents in reverse.N)rh   r#   r$   r\   	no_iframes      r&   get_contentsz_DocumentNav.get_contents   s5      >DNN2$6;;&& %7 &s   %1/1Nc                ,    | j                  |||d|      S )zGet tag children.T)get_children)r$   r\   startreverserq   s        r&   get_tag_childrenz_DocumentNav.get_tag_children   s       UGT9EEr(   c              #  *  K   ||r| j                  |      syt        |j                        dz
  }||r|nd}n|}|rdn|dz   }|rdnd}	d|cxk  r|k  r;n y||k7  r2|j                  |   }
||	z  }|r| j                  |
      r|
 ||k7  r1yyyyyw)zGet children.Nr   r   )rh   r*   r#   r9   )r$   r\   ru   rv   tagsrq   lastindexendincrnodes              r&   rt   z_DocumentNav.get_children   s      >9DNN24Fr{{#a'D} 'Q"TAXC 2aDE!T!sl;;u-DTME4;;t#4"
	 sl " 5G>s   BBBc              #  H   K   | j                  |d|      E d{    y7 w)z!Specifically get tag descendants.T)rz   rq   N)get_descendantsrp   s      r&   get_tag_descendantsz _DocumentNav.get_tag_descendants   s#      '''KKKs   " "c              #    K   ||r| j                  |      sd}|j                  D ]  }|||ur
d}t        |t        j                        r|r| j                  |      r|j
                  |j
                  }nj|}t        |t        j                        rB|j                  r6|j                  d   }t        |t        j                        r|j                  r6|j                  }| | y| |r|  yyyw)zGet descendants.Nry   )rh   descendantsr@   rA   rG   next_siblingr#   next_element)r$   r\   rz   rq   	next_goodchild
last_childs          r&   r   z_DocumentNav.get_descendants   s      >9DNN24FI  (I-  $IeSWW- T^^E%: --9(-(:(:I).J",Z"AjFYFY-7-@-@-D
 #-Z"AjFYFY(2(?(?I#$,! KK1  5G>s   CC<C<3	C<c                T    ||j                   nd}|r|| j                  |      rd}|S )zGet parent.N)rm   rh   )r$   r\   rq   rm   s       r&   rk   z_DocumentNav.get_parent  s0     !n$+v0FFr(   c                "    | | j                   S dS )Get tag.N)rd   r[   s    r&   get_tag_namez_DocumentNav.get_tag_name	  s     .rww2d2r(   c                    | j                   S zGet prefix.)prefixr[   s    r&   get_prefix_namez_DocumentNav.get_prefix_name  s     yyr(   c                "    | | j                   S dS )zGet namespace `URI`.N)	namespacer[   s    r&   get_uriz_DocumentNav.get_uri  s      "~r||747r(   c                (    | j                  |d      S )Get next sibling tag.T)rz   )get_next)r<   r\   s     r&   get_next_tagz_DocumentNav.get_next_tag  s     ||BT|**r(   c                    |j                   }|rGt        |t        j                        s-|+|j                   }|rt        |t        j                        s|+|rt        |t        j                        sd}|S )r   N)r   r@   rA   rG   r<   r\   rz   siblings       r&   r   z_DocumentNav.get_next!  s`     //:gsww7G<O**G :gsww7G<O 
7CGG4Gr(   c                &    | j                  |d      S )Get previous sibling tag.T)get_previous)r<   r\   rz   s      r&   get_previous_tagz_DocumentNav.get_previous_tag.  s     D))r(   c                    |j                   }|rGt        |t        j                        s-|+|j                   }|rt        |t        j                        s|+|rt        |t        j                        sd}|S )r   N)previous_siblingr@   rA   rG   r   s       r&   r   z_DocumentNav.get_previous4  sb     %%:gsww7G<O..G :gsww7G<O 
7CGG4Gr(   c                N    | t        | d      nd}t        |xr	 |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   )getattrr_   NS_XHTML)r\   nss     r&   has_html_nsz_DocumentNav.has_html_nsA  s*     *,WR%TB)2>**r(   c                <    | yt        |dd      t        |dd      fS )z7Return namespace and attribute name without the prefix.N)NNr   rd   )r   )r\   	attr_names     r&   split_namespacez_DocumentNav.split_namespaceM  s*     :y+t4giQU6VVVr(   c           	        |yt        |t              r|S t        |t              r|j                  d      S t        |t              rzg }|D ]q  }t        |t        t        f      s+t        |t              r|j                  t        |             D|j                  t        t        | j                  |                   s |S t        |      S )z6Normalize the value to be a string or list of strings. utf8)r@   strbytesdecoder   appendr   normalize_value)r<   value	new_valuevs       r&   r   z_DocumentNav.normalize_valueV  s    
 = uc"L eU#<<'' eX&I H!!c5\2z!X7N $$SV, $$T#s/B/B1/E%FGH  5zr(   c                    |}|j                   r!	 | j                  |j                  |         }|S |j                  j	                         D ]1  \  }}t        j                  |      |k(  s| j                  |      } |S  |S # t        $ r Y |S w xY w)zGet attribute by name.)r`   r   attrsKeyErroritemsr   re   )r<   r\   rd   defaultr   kr   s          r&   get_attribute_by_namez"_DocumentNav.get_attribute_by_namew  s     ::++BHHTN; 	 ( 1::a=D(//2E	    s   B   	BBc              #     K   |8|j                   j                         D ]  \  }}|| j                  |      f  yyw)zIterate attributes.N)r   r   r   )r<   r\   r   r   s       r&   iter_attributesz_DocumentNav.iter_attributes  sF      >( 01,,Q///0 s   <>c                    | j                  |dg       }t        |t              rt        j	                  |      }t        t        t           |      S )zGet classes.class)r   r@   r   	RE_NOT_WSfindallr   r   )r<   r\   classess      r&   get_classesz_DocumentNav.get_classes  sC     ++B<gs#''0GHSM7++r(   c                    dj                  | j                  ||      D cg c]  }| j                  |      r| c}      S c c}w )z	Get text.r   rq   )joinr   rY   r$   r\   rq   r   s       r&   get_textz_DocumentNav.get_text  sN     ww!%!5!5bI!5!N))$/ 
 	
s   Ac                r    | j                  ||      D cg c]  }| j                  |      s| c}S c c}w )zGet Own Text.r   )rr   rY   r   s       r&   get_own_textz_DocumentNav.get_own_text  s?     "..rY.G
4KaKabfKgD
 	
 
s   44)r=   r
   r.   r/   )rD   bs4.element.PageElement | Noner.   r_   )r\   r-   r.   r    r\   bs4.Tag | Noner.   r_   r\   r-   r.   r_   F)r\   r   rq   r_   r.   !Iterator[bs4.element.PageElement])NFF)
r\   r   ru   
int | Nonerv   r_   rq   r_   r.   Iterator[bs4.Tag])NFFF)r\   r   ru   r   rv   r_   rz   r_   rq   r_   r.   r   )r\   r   rq   r_   r.   r   )FF)r\   r   rz   r_   rq   r_   r.   r   )r\   r   rq   r_   r.   r   r\   r   r.   
str | Noner\   r-   r.   r   r\   r-   r.   r   )r\   r-   rz   r_   r.   r   )T)r\   r-   rz   r_   r.   r   )r\   r   r   r   r.   ztuple[str | None, str | None])r   r
   r.   zstr | Sequence[str]N)r\   r-   rd   r   r   str | Sequence[str] | Noner.   r   )r\   r   r.   z0Iterator[tuple[str, str | Sequence[str] | None]])r\   r-   r.   zSequence[str])r\   r-   rq   r_   r.   r   )r\   r-   rq   r_   r.   z	list[str])(r1   r2   r3   r4   classmethodr>   staticmethodrE   r9   rJ   rM   rP   rS   rW   rY   r]   ra   rh   rn   rr   rw   rt   r   r   rk   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r5   r(   r&   r7   r7   O   s&   -f f 2 2 ( ( 0 0 * * : : < < r r O O
  
 3 3
	
' !	F	F 	F 		F
 	F 
	F !## # 	#
 # # 
+#:  LL L 
	L 	" "  "  	" 
 
+" H 3 3
  
 8 8
 + +
 
 
 * *
 
 
 	+ 	+ W W  @ 
 /3	  ,	
 
$ * 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y	)Inputsz-Class for parsing and validating input items.c                    t         }|t        k(  r%| dz  dk(  r| dz  dk7  s| dz  dk(  rt        nt        }n|t        v rt
        }d|cxk  xr |k  S c S )zValidate day.r   r   d   i  r   )
LONG_MONTHFEBFEB_LEAP_MONTH	FEB_MONTH	MONTHS_30SHORT_MONTH)yearmonthdaymax_dayss       r&   validate_dayzInputs.validate_day  s^     C<+/!8q=tczQUY\_U_cdUd~ktHi"HC#8####r(   c                    t        j                  d dd d|  d      j                         d   }|dk(  rd}d|cxk  xr |k  S c S )zValidate week.   -r   z%m-%d-%Yr   5   )r   strptimeisocalendar)r   weekmax_weeks      r&   validate_weekzInputs.validate_week  sX     $$t1RD$%8*EQQSTUVq=HD$H$$$$r(   c                "    d| cxk  xr dk  S 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(   c                "    d| cxk  xr dk  S c S )zValidate hour.r      r5   )hours    r&   validate_hourzInputs.validate_hour  s     DBr(   c                "    d| cxk  xr dk  S c S )zValidate minutes.r   ;   r5   )minutess    r&   validate_minuteszInputs.validate_minutes  s     G!r!!!!r(   c                   d}||S |dk(  rt         j                  |      }|rt        |j                  d      d      }t        |j                  d      d      }t        |j                  d      d      }| j	                  |      r)| j                  |      r| j                  |||      r|||f}|S |dk(  rut        j                  |      }|r\t        |j                  d      d      }t        |j                  d      d      }| j	                  |      r| j                  |      r||f}|S |dk(  rvt        j                  |      }|r]t        |j                  d      d      }t        |j                  d      d      }| j	                  |      r| j                  ||      r||f}|S |dk(  rut        j                  |      }|r\t        |j                  d	      d      }	t        |j                  d
      d      }
| j                  |	      r| j                  |
      r|	|
f}|S |dk(  rt        j                  |      }|rt        |j                  d      d      }t        |j                  d      d      }t        |j                  d      d      }t        |j                  d	      d      }	t        |j                  d
      d      }
| j	                  |      rM| j                  |      r<| j                  |||      r)| j                  |	      r| j                  |
      r||||	|
f}|S |dv r2t        j                  |      }|rt        |j                  d            f}|S )zParse the input value.Ndater   
   r   r   r   timer   r   datetime-local)numberranger   )RE_DATEmatchr0   groupr   r   r   RE_MONTHRE_WEEKr   RE_TIMEr   r   RE_DATETIMERE_NUMfloat)r<   ityper   parsedmr   r   r   r   r   r   s              r&   parse_valuezInputs.parse_value  s    =LF?e$A1776?B/AGGG,b1!''%."-$$T*s/A/A%/HSM]M]^bdiknMo"E3/FN M gu%A1776?B/AGGG,b1$$T*s/A/A%/H"E]F@ ? f_e$A1776?B/1776?B/$$T*s/@/@t/L"D\F2 1 f_e$A1776?B/aggi0"5$$T*s/C/CG/L"G_F$ # &&!!%(A1776?B/AGGG,b1!''%."-1776?B/aggi0"5%%d+0B0B50IcN^N^_cejloNp%%d+0D0DW0M"E3g>F
 	 ))U#A 013r(   N)r   r0   r   r0   r   r0   r.   r_   )r   r0   r   r0   r.   r_   )r   r0   r.   r_   )r   r0   r.   r_   )r   r0   r.   r_   )r   r0   r.   r_   )r  r   r   r   r.   ztuple[float, ...] | None)r1   r2   r3   r4   r   r   r   r   r   r   r   r   r  r5   r(   r&   r   r     s    7$ $ % %    
  
  
 " "
 4 4r(   r   c                  h   e Zd Z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d2dZd4dZd5dZd6d7dZd5dZd5d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d:dZd:dZd?dZ d@dZ!dAd Z"d:d!Z#d:d"Z$dBd#Z%dCdDd$Z&dEd%Z'dFd&Z(d:d'Z)y()GCSSMatchzPerform CSS matching.c                   | j                  |       || _        g | _        g | _        g | _        || _        |i n|| _        || _        d| _        |}| j                  |      }|r|}| j                  |      }|rd}| j                  |      s|}n| j                  |      D ]  }|} n || _        ||ur|n|| _        | j                  |      | _        | j!                  |      | _        | j"                   xs | j                  | _        y)r"   NF)r>   r=   cached_meta_langcached_default_formscached_indeterminate_forms	selectors
namespacesflagsiframe_restrictrk   rE   rw   rj   scoper   has_html_namespacera   is_xmlrl   )	r$   r  r  r  r  docrm   rj   r   s	            r&   r'   zCSSMatch.__init__  s    	& "$&!*,'" * 2"

$ %C__S)F  {{3D..s3  	#3.UD
"&"2"24"8 &&s+;;A$*A*Ar(   c                6    | j                   xs | j                  S )z3Check if namespaces are supported in the HTML type.)r  r  r+   s    r&   supports_namespaceszCSSMatch.supports_namespacesC  s     {{5d555r(   c                l    d}||S | j                         r| j                  |      }|r|}|S t        }|S )zGet tag namespace.r   )r"  r   r   )r$   r\   r   r   s       r&   
get_tag_nszCSSMatch.get_tag_nsH  sK     	:##%b!B	  !Ir(   c                2    | j                  |      t        k(  S )z"Check if tag is in HTML namespace.)r$  r   rg   s     r&   rf   zCSSMatch.is_html_tagW  s     r"h..r(   c                n    | j                  |      }|!| j                  st        j                  |      S |S )r   )r   r  r   re   r$   r\   rd   s      r&   get_tagzCSSMatch.get_tag\  s3       $#'#3DKKtzz$QTQr(   c                n    | j                  |      }|!| j                  st        j                  |      S |S r   )r   r  r   re   )r$   r\   r   s      r&   
get_prefixzCSSMatch.get_prefixb  s4     %%b)%+%7tzz&!WQWWr(   c           
        | j                  |      D ]  }| j                  |      r}t        j                  t	        j
                  | j                  |dd            d      }| j                  |      }|r|dv s| j                  |      r|y| j                  |      }||c S | j                  |      r|D ]D  }t        j                  |      }|dv s|dk(  rt        j                  nt        j                  c c S   y)z%Get directionality from element text.dirr   N)bdiscriptstyletextarearc   ALRLr4  )rt   r9   DIR_MAPgetr   re   r   r(  rf   	find_bidirW   unicodedatabidirectionalctSEL_DIR_LTRSEL_DIR_RTL)r$   r\   r   	directionrd   r   cbidis           r&   r7  zCSSMatch.find_bidih  s    %%b) 	MD {{4  $KK

43M3MdTY[]3^(_aef	||D)d&VV((.) t,$ L  %%d+  M"003++-1S[2>>bnnLM9	M@ r(   c                   d}t         j                  d|      j                         }|j                  d      }|j                         j                  d      }t	        |      }t	        |      }d}d}	||   }
||	   }|dk(  r|dk(  r|
s|
|k(  ry|
dk7  r|
|k7  s|
dk(  r	|dk(  r|sd}|dz  }|	dz  }	|r>||k  r9||   }
	 ||	   }|
sd}||
k(  r|dz  }nt	        |      dk(  rd}3|	dz  }	|r||k  r9|S # t
        $ r d}Y Ow xY w)zFilter the language tags.Tr   r   r   *F)RE_WILD_STRIPsubre   splitr*   
IndexError)r$   
lang_rangelang_tagr  rangessubtagslengthslengthrindexsindexrss               r&   extended_language_filterz!CSSMatch.extended_language_filter  sU    "&&sJ7==?
!!#&.."((-Vg,6NFO Q;7a<a1f HaQ#X'Q,qE!! vAFO  a! Q1 aKF5 8 1   	s   <C1 1C?>C?c                   d}| j                         rd}|r#| j                  j                  |      }||dk7  ryd}| j                  |      D ]  \  }}| j	                  ||      \  }}	|N| j
                  r||k(  s7| j
                  s0t        j                  |      t        j                  |      k(  r|} |S k|
||k7  r|dk7  rx| j
                  s,t        j                  |      t        j                  |	      k7  rn||	k7  r|} |S  |S | j                  |      D ]5  \  }}t        j                  |      t        j                  |      k7  r2|} |S  |S )z3Match attribute name and return value if it exists.NrA  )r"  r  r6  r   r   r  r   re   )
r$   r\   attrr   r   r   r   r   r   rd   s
             r&   match_attribute_namezCSSMatch.match_attribute_name  su    ##%E__((0:&C-,,R0 1 #'"6"6r1"=	4 :	4;;4::VZK[_c_i_ijk_lKl !, %  $yVs] BFDJJt$

4(88SW[_S_ A@  ,,R0 1::d#tzz!}4
 r(   c                   d}| j                  |      }| j                  j                  d      }|j                  dn$| j                  j                  |j                        }|j                  |	||k7  rd}|S |j                  |j                  dk(  r|rd}|S |j                  r|j                  dk7  r	|||k7  rd}|S )z#Match the namespace of the element.Tr   FrA  )r$  r  r6  r   )r$   r\   r=   r  r   default_namespacetag_nss          r&   match_namespacezCSSMatch.match_namespace  s     OOB'	 OO//3zz)t/B/B3::/N::#4#@YRcEcE  jj$r)9iE 	 JJJJ#6>Y&5HEr(   c                P   d}|r|D ]  }| j                  ||j                  |j                        }| j                  r|j                  r|j                  n|j
                  }|d} |S t        |t              r|ndj                  |      }||j                  |      d} |S  |S )zMatch attributes.TFr   )
rS  	attributer   r  xml_type_patternpatternr@   r   r   r  )r$   r\   
attributesr  atempr[  r   s           r&   match_attributeszCSSMatch.match_attributes  s      00Q[[!((K04@R@R!,,XYXaXa<!E  !+4 5388D>?]]5)1!E r(   c                    | j                   s+|j                  t        j                  |j                        n|j                  }|duxr || j	                  |      dfv S )zMatch tag name.NrA  )r  rd   r   re   r(  )r$   r\   r=   rd   s       r&   match_tagnamezCSSMatch.match_tagname"  s[     -1KKCHH<P

388$VYV^V^ 0b)3//
 	
r(   c                ^    d}|(| j                  ||      sd}| j                  ||      sd}|S )zMatch the tag.TF)rW  ra  )r$   r\   r=   r  s       r&   	match_tagzCSSMatch.match_tag+  s=     ?''C0%%b#.r(   c                   d}t        |d   t        j                        r|S |d   j                  t        k(  rW| j                  || j                        }|s6|r4| j                  ||      }| j                  || j                        }|s|r4|S |d   j                  t        k(  r3| j                  || j                        }|r| j                  ||      }|S |d   j                  t        k(  r?| j                  |      }|s*|r(| j                  ||      }| j                  |      }|s|r(|S |d   j                  t        k(  r6| j                  |      }|r#| j                  |      r| j                  ||      }|S )zMatch past relationship.Fr   r   )r@   r:  SelectorNullrel_type
REL_PARENTrk   r  match_selectorsREL_CLOSE_PARENTREL_SIBLINGr   REL_CLOSE_SIBLINGr9   )r$   r\   relationfoundrm   r   s         r&   match_past_relationszCSSMatch.match_past_relations7  ss    hqk2??3LA;:-__R43G3G_HF,,VX>4;O;OP    a[!!%55__R43G3G_HF,,VX>  a[!![0++B/G,,Wh?//8  	 a[!!%66++B/G4;;w/,,Wh?r(   c                    d}|r| j                   }n| j                  } ||| j                        D ]  }| j                  ||      }|s |S  |S )zMatch future child.Fr   )r   rw   r  rh  )r$   rm   rl  	recursiver  childrenr   s          r&   match_future_childzCSSMatch.match_future_childS  sb     //H,,Hf0D0DE 	E((9E		 r(   c                4   d}t        |d   t        j                        r|S |d   j                  t        k(  r| j                  ||d      }|S |d   j                  t        k(  r| j                  ||      }|S |d   j                  t        k(  r?| j                  |      }|s*|r(| j                  ||      }| j                  |      }|s|r(|S |d   j                  t        k(  r6| j                  |      }|r#| j                  |      r| j                  ||      }|S )zMatch future relationship.Fr   T)r@   r:  re  rf  REL_HAS_PARENTrr  REL_HAS_CLOSE_PARENTREL_HAS_SIBLINGr   rh  REL_HAS_CLOSE_SIBLINGr9   )r$   r\   rl  rm  r   s        r&   match_future_relationszCSSMatch.match_future_relationsa  s    hqk2??3LA;>1++B$?E  a[!!%99++B9E  a[!!_4''+G,,Wh?++G4  	 a[!!%::''+G4;;w/,,Wh?r(   c                    d}t        |d   t        j                        s|d   j                  |S |d   j                  j	                  d      r| j                  ||      }|S | j                  ||      }|S )z%Match relationship to other elements.Fr   :)r@   r:  re  rf  
startswithrx  rn  )r$   r\   rl  rm  s       r&   match_relationszCSSMatch.match_relationsx  sy     hqk2??3x{7K7K7SLA;**3///H=E  --b(;Er(   c                N    d}|D ]  }|| j                  |dd      k7  sd} |S  |S )zMatch element's ID.Tidr   F)r   )r$   r\   idsrm  is        r&   match_idzCSSMatch.match_id  sC      	AD..r4<<		 r(   c                L    | j                  |      }d}|D ]  }||vsd} |S  |S )zMatch element's classes.TF)r   )r$   r\   r   current_classesrm  r>  s         r&   match_classeszCSSMatch.match_classes  sD     **2. 	A'		 r(   c                   | j                  |      }|rq| j                  |      }|r^|\| j                  |      s2| j                  |      r|j	                         s| j                  |      rd}n| j                  |      }|r|\|rq| j                  |      }|r^|\| j                  |      s2| j                  |      r|j	                         s| j                  |      rd}n| j                  |      }|r|\|S )zMatch element as root.F)rn   r   r9   rY   striprM   r   )r$   r\   rn   r   s       r&   
match_rootzCSSMatch.match_root  s     ,,r"''+Gg1KK(T-C-CG-LQXQ^Q^Q`MM'*#G"//8G g1 mmB'Gg1KK(T-C-CG-LQXQ^Q^Q`MM'*#G"mmG4G g1 r(   c                    | j                   |u S )zMatch element as scope.)r  rg   s     r&   match_scopezCSSMatch.match_scope  s     zzRr(   c                    | j                  |      | j                  |      k(  xr# | j                  |      | j                  |      k(  S )z!Match tag type for `nth` matches.)r(  r$  )r$   r\   r   s      r&   match_nth_tag_typezCSSMatch.match_nth_tag_type  sB     \\% DLL$44 <__U#tr'::	
r(   c                   d}|D ]Z  }d}|j                   r| j                  ||j                         s |S | j                  |      }|t        d| j	                  |            }|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||kD  rm|dk  r-d|z
  }||dk(  rn[d}||z  }|r|
|z  |z   n|
x}}d|z
  }||k\  r0n;||z
  }||dk(  rn.d}||z  }|r|
|z  |z   n|
x}}||z
  }||k\  rn|}|dk  rg||kD  rm|}|
dk  r"|dk\  r|}||z  }|r|
|z  |z   n|
x}}|dk\  rd}|}|r|
|z  |z   n|
x}}d|cxk  r|dz   k  rn nd}| j                  |||dk        D ]  }||z  }t        |t        j                        s#|j                   r| j                  ||j                         sL|j                  r| j                  ||      sk|	dz  }	|	|k(  r	||u rd}n n||u s n ||u rn0|}||z  }|dk  rn#|r|
|z  |z   n|
}||k(  rnd|cxk  r	|dz   k  rn |rZ |S  |S )	zMatch `nth` elements.TFNr-   r   r   ry   )ru   rv   )r  rh  rk   r   r]   r{   r*   r]  bnrt   r@   rA   rG   of_typer  )r$   r\   nthmatchedr  rm   r{   
last_indexr|   relative_indexr]  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AKK#Hv u __R(F~i)@)@)DE66DVqJ"&JAENAA##CEJRQF.1QY]q8C(  Agz!1Qw#$s7!-&A+!!#+:=UQ1Dh 3w8+!$'*$4	!-&B,!!"+:=UQ1Dh"Z/9,!$(	+ Agz!14 q5(!&+:=UQ1Dh ( "$J25UQ1<h s,j1n,!..vUFUVJ.W EVOE%eSWW5 {{4+?+?q{{+S yy)@)@U)K "a'N%, B;&*G!{#$ B;#19'*a%i!ms?= s,j1n,> }]	| r(   c                    d}| j                  |      D ]D  }| j                  |      rd} |S | j                  |      s+t        j	                  |      sAd} |S  |S )z)Check if element is empty (if requested).TF)rt   r9   rY   RE_NOT_EMPTYsearch)r$   r\   is_emptyr   s       r&   match_emptyzCSSMatch.match_empty(  so     &&r* 	E{{5!   ''.<3F3Fu3M 	 r(   c                B    d}|D ]  }| j                  ||      rd} |S )zMatch selectors.TF)rh  )r$   r\   r  r  sels        r&   match_subselectorszCSSMatch.match_subselectors5  s4      	C''C0	 r(   c                .   d}d}|D ]  }|G|j                   r| j                  || j                        }n| j                  || j                        }d}|j                  D ]*  }|j                   r|D ]
  }||v sd} n |s! n
||v s(d} n |rd} |S )z"Match element if it contains text.TNr   F)ownr   rl   r   text)	r$   r\   containsr  contentcontain_listrm  r  r>  s	            r&   match_containszCSSMatch.match_contains>  s     $ 	L##"//dll/KG"mmB$,,mGGE$)) ##$ "19$(E!" w $ )	* r(   c                    d}d}| j                  |d      }|rB|@| j                  |      dk(  r| j                  |      r|}n| j                  |d      }|r|@|d}| j                  D ]  \  }}||u sd}||u rd} n |s| j	                  |d      D ]t  }| j                  |      }	|	dk(  r |S |	dv s!| j                  |dd      }
|
s7t        j                  |
      d	k(  sP| j                  j                  ||f       ||u rd} |S  |S )
Match default.FNTr   form)inputbuttonr;   r   submit)	rk   r(  rf   r  r   r   r   re   r   )r$   r\   r  r  rm   
found_formftr   rd   r   s              r&   match_defaultzCSSMatch.match_defaultZ  sO     t4||F#v-$2B2B62J4@	  J11 19!%JBw $ !55dd5K "E<<.Dv~  22 66ufbIA(!: 55<<dE]K!U{(,!" r(   c                    d}t        t         j                  |d            }d
 fd} ||      }|+d} j                  D ]  \  }}}	||u s||k(  sd}|	du rd} n |sd}
 j	                  |d      D ]  }||u r j                  |      }|dk(  rd}d}d} j                  |      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}|sv|sy|s| ||      |u sd}
 n |
s n |
sd} j                  j                  |||f       |S )r  Frd   c                    d}j                  | d      }|Ij                  |      dk(  rj                  |      r|}	 |S |}j                  |d      }||}	 |S |I|S )zFind this input's form.NTr   r  )rk   r(  rf   )r\   r  rm   last_parentr$   s       r&   get_parent_formz5CSSMatch.match_indeterminate.<locals>.get_parent_form  s    D__R4_8F,<<'61d6F6Fv6N!D K %4@>&DK , Kr(   Tr   r  r;   radiocheckedr   )
r   r   r   r  r   r(  r   r   re   r   )r$   r\   r  rd   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9d!%JDy $ !55dd5K E{ #||E2H7*#( %#($($8$8$? 	&DAq#zz!}64::a=G;S+/!%A&!8Q$Y+/!%A)!;(,'Eh?SXCY]aCa*. %	& '(  E//66dE7JKr(   c           	     H   d}| j                         }| j                  }| j                  }|}d}d}	|s| j                  |      }
| j	                  |      D ]  \  }}| j                  ||      \  }}|r|
r&| j                  st        j                  |      n|dk(  s9|sH|
rK|t        k(  sU| j                  s|t        j                  |      n|dk(  s~|} n |}	| j                  || j                        }||	}| j                  |      }|	}n|s|*| j                  r| j                  D ]  }||d   u s|d   } || j                  r|r|r|j                  dk(  rd}dD ]V  }d}| j                  || j                        D ].  }| j                  |      |k(  s| j!                  |      s*d	}|} n |rV n |r%|"|D ]  }t#        |t$        j&                        r| j                  |      d
k(  r| j!                  |      rd}d}| j	                  |      D ]  \  }}t        j                  |      dk(  rt        j                  |      dk(  rd	}t        j                  |      dk(  r|}|sU|sX|}| j                  j)                  t+        t,        |      t+        t,        |      f        n | n |+| j                  j)                  t+        t,        |      df       |8|D ]3  }d}|D ]%  }| j/                  |t+        t,        |            s$d	}' |r2 |S  |S )zMatch languages.FNlangr   r   r   html)r  headTmetaz
http-equivzcontent-languager  r   )r"  rj   r  r   r   r   r  r   re   NS_XMLrk   rl   r  rd   rw   r(  rf   r@   rA   rG   r   r   r   rP  )r$   r\   langsr  has_nsrj   r  rm   
found_langr{   r   r   r   attr_nsrR  cacherm  r=   r   child2c_langr  patternsr[  s                           r&   
match_langzCSSMatch.match_lang  sR    ))+yy!44 
**62K,,V4 
1 $ 4 4VQ ? K4;;djjm\]bh5h{w&7H15AQD)W[`ff "#J
 D__Vt||_DF~%)%5%5d%;") . $"7"7.. *58#!&qJ*
 t{{7IdW[W`W`djWjE' !226T\\2R E||E*c1d6F6Fu6M $!&	
  +$ F!&#''2t||F7Kv7UZ^ZjZjkqZr!&"&$($8$8$@ &DAq#zz!}<ARdAd)-#zz!}	9*+%'-4
 $ 5 5 < <d3otTWYcOd=e f %& "- %))00$sD/21FG !! ' %G44Wd3
>ST $%  r(   c           	         |t         j                  z  r|t         j                  z  ry| j                  |      syt        j                  t        j                   j                  |dd            d      }|dvr||k(  S  j                  |      }|r|t         j                  |k(  S  j                  |      }|dk(  }|dk(  }|dk(  }|r&t        j                   j                  |d	d            nd}	|r|	d
k(  r|t         j                  |k(  S |r|	dv s|r|dk(  r|r,dj                   fd j                  |d      D              }
n!t        t         j                  |dd            }
|
r_|
D ]G  }t        j                   |      }|dv s|dk(  rt         j                  nt         j                  }||k(  c S  t         j                  |k(  S |rt         j                  |k(  S  j#                   j%                  |d      |      S |r||dk(  rP j'                  |      }|||k(  S |rt         j                  |k(  S  j#                   j%                  |d      |      S  j#                   j%                  |d      |      S )zCheck directionality.FNr,  r   )Nr   r  r0  r-  r;   tel)r  r  r  urlemailr   c              3  F   K   | ]  }j                  |      s|  y wr   )rY   ).0r   r$   s     r&   	<genexpr>z%CSSMatch.match_dir.<locals>.<genexpr>6  s      wZ^ZpZpquZvws   !!Tr   r   r1  r4  )r:  r;  r<  rf   r5  r6  r   re   r   rn   r(  r   rr   r   r   r8  r9  	match_dirrk   r7  )r$   r\   directionalityr=  rn   rd   is_inputis_textareais_bdir  r   r>  r?  s   `            r&   r  zCSSMatch.match_dir  sl    BNN*~/N:T--b1 KK

4+E+Eb%QS+T UW[\	I%.. ,,r"y(>>^33 ||B7?j(JR

455b&"EFXZ9+<>>^33 %#LLQ\bkopbpw1B1B2QU1B1VwwS$"<"<R""MN ;A&44Q7D//6:ckBNNr~~	(N::	; ~~77~~77>>$//"/"E~VV y(Y!^r*I$ N22~~77>>$//"/"E~VV ~~doobDoA>RRr(   c                \   d}t        j                  | j                  |d            }t        j	                  |t        t        | j                  |dd                  }t        j	                  |t        t        | j                  |dd                  }||yt        j	                  |t        t        | j                  |dd                  }|H|dv r|||k  rd}|s9|7||kD  r2d}n/|d	k(  r*||||kD  r||k  r||kD  rd}n|||k  rd}|s	|||kD  rd}|t        j                  z  r| S |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   re   r   r   r  r   r   r:  SEL_IN_RANGE)r$   r\   	conditionout_of_ranger  mnmxr   s           r&   match_rangezCSSMatch.match_rangeQ  sD    

455b&ABtC1K1KBPUW[1\']^tC1K1KBPUW[1\']^ :"*""5$sD4N4NrSZ\`4a*bcVV>ebj#'L#52:#'L&>bnbrzebj'+~%"*'+'BNurz'+#,r#><PLPr(   c                    | j                  |      }|duxr? |j                  d      dk(  xs) |j                  d      dk7  xs | j                  |      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   ry   rz  )r(  findr*  r'  s      r&   match_definedzCSSMatch.match_definedy  s_     ||B 		#"$ 0		#"$0#4/		
r(   c                8    d}| j                  |      }|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                H   d}|j                   }|j                  }|r,| j                  }| j                  }dt        i| _        d| _        |r| j                  r:|D ]4  }|}t        |t        j                        r!| j                  ||j                        s>|j                  t        j                  z  r| j                  |      sm|j                  t        j                  z  r| j                  |      s|j                  t        j                  z  r| j!                  |      s|j                  t        j"                  z  r| j%                  |      s| j'                  ||j(                        s|j                  t        j*                  z  r| j-                  |      sH|j.                  r| j1                  ||j.                        sr|j2                  r| j5                  ||j2                        s| j7                  ||j8                        s|j                  t:        z  r%| j=                  ||j                  t:        z        s|j>                  r| jA                  ||j>                        s|jB                  r| jE                  ||jB                        sF|jF                  r| jI                  ||jF                        sp|j                  t        jJ                  z  r| jM                  |      s|j                  t        jN                  z  r| jQ                  |      s|j                  tR        z  r%| jU                  ||j                  tR        z        s|jV                  r| jY                  ||jV                        s2| } n |r| _        | _        |S )z.Check if element matches one of the selectors.Fr  T)-is_notrl   r  r  r   r@   r:  re  rc  r=   r  SEL_DEFINEDr  SEL_ROOTr  	SEL_SCOPEr  SEL_PLACEHOLDER_SHOWNr  r  r  	SEL_EMPTYr  r  r  r   r  r_  r\  RANGESr  r  r  r  r  rl  r|  SEL_DEFAULTr  SEL_INDETERMINATEr  	DIR_FLAGSr  r  r  )	r$   r\   r  r  r  rl   r  r  selectors	            r&   rh  zCSSMatch.match_selectors  s    !!## J"22O%x0DO#'D $,,% <h8~~b(,,7>>BNN24;M;Mb;Q>>BKK/8K>>BLL09I9I"9M>>B$<$<<TEaEabdEe~~b(,,7>>BLL09I9I"9M<<b(,,(G##D,>,>r8CSCS,T,,R1D1DE>>F*43C3CBY_H_3`==X]])K%%d.E.Eb(J\J\.]$$T-A-A"hFWFW-X>>BNN24;M;Mb;Q >>B$8$88AYAYZ\A]>>I-dnnRZcIc6d$$T-@-@XEVEV-W"
y<~ (DO#2D r(   c              #     K   |dk  rdn|}| j                  | j                        D ]'  }| j                  |      s| ||dz  }|dk  s' y yw)z&Match all tags under the targeted tag.r   N)r   r=   r  )r$   limitlimr   s       r&   selectzCSSMatch.select  s\      aidU--dhh7 	Ezz% ?1HCQw	s   9AA
AAc                ~    | j                   }d}|,|*| j                  |      r|}n| j                  |      }||*|S )Match closest ancestor.N)r=   r  rk   )r$   currentclosests      r&   r  zCSSMatch.closest   sN     ((o'"5zz'"!//'2	 o'"5
 r(   c                    | j                  | j                        D cg c]/  }t        |t        j                        r| j                  |      r|1 c}S c c}w )zFilter tag's children.)rr   r=   r@   rA   rG   r  r$   r=   s     r&   filterzCSSMatch.filter  sK      ,,TXX6
#sww'DJJsO 
 	
 
s   4Ac                    | j                  |       xr/ | j                  |      xr | j                  || j                        S zMatch.)rE   r9   rh  r  rg   s     r&   r  zCSSMatch.match  s<     ;;r?"ct{{2c4;O;OPRTXTbTb;ccr(   N)
r  ct.SelectorListr  r   r  ct.Namespaces | Noner  r0   r.   r/   )r.   r_   )r\   r   r.   r   r   r   r   )r\   r-   r.   r   )rF  r   rG  r   r.   r_   )r\   r-   rR  r   r   r   r.   r   )r\   r-   r=   zct.SelectorTagr.   r_   )r\   r-   r\  z tuple[ct.SelectorAttribute, ...]r.   r_   )r\   r-   r=   zct.SelectorTag | Noner.   r_   )r\   r-   rl  r  r.   r_   r   )rm   r-   rl  r  rp  r_   r.   r_   )r\   r-   r  tuple[str, ...]r.   r_   )r\   r-   r   r	  r.   r_   r   )r\   r-   r   r-   r.   r_   )r\   r-   r  ztuple[ct.SelectorNth, ...]r.   r_   )r\   r-   r  ztuple[ct.SelectorList, ...]r.   r_   )r\   r-   r  ztuple[ct.SelectorContains, ...]r.   r_   )r\   r-   r  ztuple[ct.SelectorLang, ...]r.   r_   )r\   r   r  r0   r.   r_   )r\   r-   r  r0   r.   r_   )r\   r-   r  r  r.   r_   r   )r  r0   r.   r   )r.   r   )r.   list[bs4.Tag])*r1   r2   r3   r4   r'   r"  r$  rf   r(  r*  r7  rP  rS  rW  r_  ra  rc  rn  rr  rx  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rh  r  r  r  r  r5   r(   r&   r  r    s2   'B"'B 'B )	'B
 'B 
'BR6
/
RX#J6p33 3 	3
 
$3j*&

8.	4 

cJ8&P<|Tl9Sv&QP
.Rh

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   r[  r  r  r  r  zdict[str, str]customr0   r  )r[  r  r  r  r  _hashc                .    t         |   |||||       y)r"   )r[  r  r  r  r  N)superr'   )r$   r[  r  r  r  r  	__class__s         r&   r'   zSoupSieve.__init__%  s&     	! 	 	
r(   c                x    t        | j                  || j                  | j                        j	                  |      S r  )r  r  r  r  r  r  s     r&   r  zSoupSieve.match7  s-     T__djjIOOPSTTr(   c                v    t        | j                  || j                  | j                        j	                         S )r  )r  r  r  r  r  r  s     r&   r  zSoupSieve.closest<  s*     T__djjIQQSSr(   c                $   t        |t        j                        r:t        | j                  || j
                  | j                        j                         S |D cg c],  }t        j                  |      r| j                  |      s+|. c}S c c}w )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.
        )
r@   rA   rG   r  r  r  r  r  rS   r  )r$   iterabler   s      r&   r  zSoupSieve.filterA  si     h(DNNHdootzzRYY[[%-mTX5Q5QRV5W\`\f\fgk\lDmmms   B4BBc                :    | j                  |d      }|r|d   S dS )zSelect a single tag.r   )r  r   N)r  )r$   r=   rz   s      r&   
select_onezSoupSieve.select_oneR  s'     {{3a{(tAw(D(r(   c                8    t        | j                  ||            S )zSelect the specified tags.)listiselectr$   r=   r  s      r&   r  zSoupSieve.selectX  s     DLLe,--r(   c              #     K   t        | j                  || j                  | j                        j	                  |      E d{    y7 w)zIterate the specified tags.N)r  r  r  r  r  r  s      r&   r  zSoupSieve.iselect]  s4      DNNC$**MTTUZ[[[s   ?A	AA	c           	     p    d| j                   d| j                  d| j                  d| j                  d	S )zRepresentation.zSoupSieve(pattern=z, namespaces=z	, custom=z, flags=))r[  r  r  r  r+   s    r&   __repr__zSoupSieve.__repr__b  s@     ! 0doo=P Qkk_HTZZN!=	
r(   )
r[  r   r  r  r  r  r  zct.CustomSelectors | Noner  r0   )r=   r-   r.   r_   )r=   r-   r.   r   )r  zIterable[bs4.Tag]r.   r  r
  )r=   r-   r  r0   r.   r  )r=   r-   r  r0   r.   r   )r.   r   )r1   r2   r3   r4   __annotations__	__slots__r'   r  r  r  r  r  r  r   __str____classcell__)r  s   @r&   r  r    s    7L$$JRI

 #
 )	

 *
 
$U
T
n").
\

 Gr(   r  );r4   
__future__r   r   r   r   rer   r:  r8  rA   typingr   r	   r
   r   r   r   compiler  r   rg  ri  rj  rk  rt  ru  rv  rw  r   r  r;  r<  r  r  SEL_OUT_OF_RANGEr  r5  r  r  r	  r
  r  r  rB  r   r   r   r   r   r   DAYS_IN_WEEKr    r7   r   r  	Immutabler  pickle_registerr5   r(   r&   <module>r-     s    "   	   
 I I I rzz.)BJJ'	 
     )	/NNR^^+		2..	. >>>> 
G	H
"**B
C2::BC
"**A
B
"**S
Tbjjk 

=>	
	" "(^
 ^
Bd dN@d| @dF P Pf   9 r(   