
    j6                    J   d Z ddlmZ ddlZddlmZ ddlm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mZmZmZ ddlmZ ddlmZ ddlZ ej                    Z ej                    ZdZdZh dZh dZh dZ h dZ!h dZ"eez  e z  e!z  e"z  Z#dZ$de$ dZ%dZ&de% de& dZ'de% dZ(de% de$ dZ)de( de( d Z*d!e' d"e' d#Z+d$e$ d%e$ d&e* dZ,de' d'e' d(e, d)e' d*e' d+Z-d,e* Z.d-e* Z/d.e* d/e* d0Z0d1e' d2e* d3e* de- d4	Z1d5e* d6e' d7Z2d5e* d6e' d8Z3d9e* dZ4d:Z5e' d;Z6d<e2 Z7d=e* Z8d>e3 d?e+ d@e' dAe& d+e% e' dBe& d+e% e' dCZ9dDe3 dEe+ dFe' dGZ:e3 dHe, de' dIe' d+e, dJe' d;Z;e3 dKe' d;Z<e' dLe% dMe' d+Z=e3 dHe, de' dIe' d+e, dJe' d;Z> ej?        dNe' dOej@                  ZA ej?        dNe% dPe$ dej@                  ZB ej?        dQe' dRe' dSej@                  ZC ej?        dTe, dUe' dIe' dVejD                  ZE ej?        e%          ZF ej?        dWe' d+          ZG ej?        dXe& dY          ZH ej?        dWe4 dZejD                  ZI ej?        e3ej@        ejD        z  ejJ        z            ZKd[ZLd\ZMd]ZNdZOd^ZPd_ZQd`ZRdaZSdbZTdcZUddZVdeZWdfZXdgZYdhZZ eeZi          ddt            Z[ddvZ\ddxZ]ddzZ^dd|Z_ G d} d~          Z` G d de`          Za G d d          Zbe G d d                      Zc G d deedeceje        z  f                   Zf ecdeOeSz            Zg ecdeOeSz            Zh ecdeOeSz  eRz            Zi ecdeOeSz  eTz            Zj ecdeOeSz            Zk ecdeOeSz            Zl ecdeOeSz            Zm ecdeOeSz            Zn ecdeOeSz  eXz            Zo ecdeOeSz            Zp ecdeOeSz            Zq ecdeOeSz  eVz            Zr ecdeOeSz  eWz            Zs ecdeOeSz            Zt ecdeOeSz            Zu ecdeO          Zv G d d          ZwdS )zCSS selector parser.    )annotationsN)	lru_cache   )util)	css_match)	css_types)SelectorSyntaxError)MatchAnyIteratorcast)	dataclass)UserDicti  i    >   :link:open:root:empty:muted:scope:checked:default:defined:enabled	:any-link	:disabled	:in-range	:optional	:required
:read-only:last-child:only-child:read-write:first-child:last-of-type:only-of-type:out-of-range:first-of-type:indeterminate:placeholder-shown>   :past:focus:hover:active:future:paused:target:playing:seeking:stalled:visited	:autofill
:buffering:fullscreen:local-link:focus-within:popover-open:user-invalid:focus-visible:target-within:volume-locked:picture-in-picture:host:current>   :matches:is:has:not:where	:contains:-soup-contains:-soup-contains-own>   :host-contextr@   rA   >   :dir:lang
:nth-child:nth-of-type:nth-last-child:nth-last-of-typez(?:\r\n|(?!\r\n)[\n\f\r])z	(?:[ \t]|)z(?:/\*(?:[^*]|\*(?!/))*\*/)z(?:|z(?:\\(?:[a-f0-9]{1,6}z?|[^\r\n\f]|$))z?|[^\r\n\f]|$|z))z;
(?:(?:--|-?(?:[^\x00-\x2f\x30-\x40\x5B-\x5E\x60\x7B-\x9f]|z:))
(?:[^\x00-\x2c\x2e\x2f\x3A-\x40\x5B-\x5E\x60\x7B-\x9f]|z)*)
z (?:[-+])?(?:[0-9]+n?|n)(?:(?<=n)z	*(?:[-+])z*(?:[0-9]+))?z(?:"(?:\\(?:.|z)|[^\\"\r\n\f])*?"|'(?:\\(?:.|z)|[^\\'\r\n\f])*?'|z*(?P<cmp>[!~^|*$]?=)z*(?P<value>z)(?:z*(?P<case>[is]))?)?*z\#z\.z(?P<tag_ns>(?:z|\*)?\|)?(?P<tag_name>z|\*)z\[z*(?P<attr_ns>(?:z|\*)?\|)?(?P<attr_name>z\]z
(?P<name>:z)(?P<open>\(z*)?z*)z(?P<name>:(?=--)&z*\):z@Pz
(?P<pseudo_nth_child>z
(?P<nth_child>z|even|odd))(?:z*\)|(?P<of>z*ofz*))
z
(?P<pseudo_nth_type>z
(?P<nth_type>z|even|odd))z*\)
z(?P<values>z*,z)*)z(?P<dir>ltr|rtl)z*?(?P<relation>[,+>~]|z(?![,+>~]))z(?:(\\[a-f0-9]{1,6}z?)|(\\[^\r\n\f])|(\\$))z?)|(\\[^\r\n\f])|(\\$)|(\\z'(?P<s1>[-+])?(?P<a>[0-9]+n?|n)(?:(?<=n)z*(?P<s2>[-+])z*(?P<b>[0-9]+))?z(?:(?P<value>z)|(?P<split>z*))^z$^(?:[ \t]|(?:\n\r|(?!\n\r)[\n\f\r])|z)*$)'",                 @         i   i   i  )maxsizepatternstr
namespacesct.Namespaces | Nonecustomct.CustomSelectors | Noneflagsintreturncm.SoupSievec                    t          |          }t          j        | t          | ||                                          |||          S )zCached CSS compile.ri   rk   )process_customcm	SoupSieve	CSSParserprocess_selectors)re   rg   ri   rk   custom_selectorss        ^/workspace/show-city-briefing-agent/.venv/lib/python3.11/site-packages/soupsieve/css_parser.py_cached_css_compilerx      s[     &f--<#	
 	
 	
 



 
 
    Nonec                 8    t                                            dS )zPurge the cache.N)rx   cache_clear ry   rw   _purge_cacher~      s     ##%%%%%ry    dict[str, str | ct.SelectorList]c                   i }| |                                  D ]o\  }}t          j        |          }t                              |          t          d| d          ||v rt          d| d          ||t          |          <   p|S )zProcess custom.Nz
The name 'z)' is not a valid custom pseudo-class namezThe custom selector 'z' has already been registered)itemsr   lower	RE_CUSTOMmatchr	   KeyErrorcss_unescape)ri   rv   keyvaluenames        rw   rq   rq      s      ,,.. 	9 	9JC:c??Dt$$,)*ft*f*f*fggg'''ZtZZZ[[[38\$//00ry   contentc                    dd}|                      t                    }|rt          nt                              ||r
| dd         n|           S )	zs
    Unescape CSS value.

    Strings allow for spanning the value on multiple strings by escaping a new line.
    m
Match[str]rm   rf   c                Z   |                      d          rHt          |                      d          dd         d          }|dk    rt          }t          |          }nM|                      d          r|                      d          dd         }n|                      d          rd}nd}|S )	z(Replace with the appropriate substitute.r   Nr_   r   r\         � )grouprl   UNICODE_REPLACEMENT_CHARchr)r   	codepointr   s      rw   replacezcss_unescape.<locals>.replace
  s     771:: 
	AGGAJJqrrNB//IA~~4		NNEEWWQZZ 	GGAJJqrrNEEWWQZZ 	EEEry   r   )r   r   rm   rf   )
startswithQUOTEDRE_CSS_STR_ESC
RE_CSS_ESCsub)r   r   quoteds      rw   r   r     sc       " ''F$4NN*99,"W  ry   identc                   g }t          |           }|dk    o| d         dk    }|dk    r|r|                    d|             n t          |           D ]\  }}t          |          }|dk    r|                    d           1d|cxk    rdk    sn |dk    r|                    d|dd	           a|dk    s|r1|dk    r+d
|cxk    rdk    rn n|                    d|dd	           |dv sC|dk    s=d
|cxk    rdk    s0n d
|cxk    rdk    s!n d|cxk    rdk    sn d|cxk    rdk    rn n|                    |           |                    d|            d                    |          S )zEscape identifier.r   -r   \r         xr[   0   9   )-   _   rb   A   Z   a   z   r   )lenappend	enumerateordjoin)r   stringlength
start_dashindexcr   s          rw   escaper   "  s    FZZF!/aCJ{{z{l5ll####!%(( 	( 	(HE1AID  h'''')++++t++++	T0A0A19111122221***

$)B[B[B[B[W[B[B[B[B[B[1911112222\))Y$->->49C\C\C\C\X\C\C\C\C\****d****	0I0I0I0IT0I0I0I0ItW`OhOhOhOhdhOhOhOhOhOha    h1hh''''776??ry   c                  B    e Zd ZdZddZedd	            Zdd
ZddZdS )SelectorPatternSelector pattern.r   rf   re   rm   rz   c                0    || _         || _        d| _        dS )Initialize.N)r   re   _re_pattern)selfr   re   s      rw   __init__zSelectorPattern.__init__A  s      	37ry   re.Pattern[str]c                    t           5  | j        Ct          j        | j        t          j        t          j        z  t          j        z            | _        ddd           n# 1 swxY w Y   | j        S )z1Retrieve the compiled regular expression pattern.N)RE_LOCKr   recompilere   IXUr   s    rw   
re_patternzSelectorPattern.re_patternH  s      	P 	P'#%:dlBD24K"$<N#O#O 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P s   AAA#&A#c                    | j         S )	Get name.)r   r   s    rw   get_namezSelectorPattern.get_nameQ  s     yry   selectorr   rl   rk   Match[str] | Nonec                8    | j                             ||          S )Match the selector.)r   r   )r   r   r   rk   s       rw   r   zSelectorPattern.matchV  s     $$Xu555ry   N)r   rf   re   rf   rm   rz   )rm   r   rm   rf   r   rf   r   rl   rk   rl   rm   r   )	__name__
__module____qualname____doc__r   propertyr   r   r   r}   ry   rw   r   r   >  sv        8 8 8 8       X    
6 6 6 6 6 6ry   r   c                  *    e Zd ZdZddZddZddZdS )SpecialPseudoPatternr   patternsCtuple[tuple[str, tuple[str, ...], str, type[SelectorPattern]], ...]rm   rz   c                    i | _         |D ]7}|d         } |d         ||d                   }|d         D ]}|| j         |<   8d| _        dS )r   r   r   r\   r   N)r   matched_name)r   r   pr   re   pseudos         rw   r   zSpecialPseudoPattern.__init___  ss      	0 	0AQ4Dad41&&GA$ 0 0(/f%%0 !ry   rf   c                F    | j         dn| j                                         S )r   Nr   )r   r   r   s    rw   r   zSpecialPseudoPattern.get_namek  s%     &.rrD4E4N4N4P4PPry   r   r   rl   rk   r   c                $   d}t                               ||          }|rpt          j        t	          |                    d                              }| j                            |          }|r |                    |||          }|r|| _        |S )r   Nr   )	RE_PSEUDO_CLASS_SPECIALr   r   r   r   r   r   getr   )r   r   r   rk   r   r   r   re   s           rw   r   zSpecialPseudoPattern.matchp  s     #))(E:: 	0:l1776??;;<<Dm''--G 0 x>> 0(/D%ry   N)r   r   rm   rz   r   r   )r   r   r   r   r   r   r   r}   ry   rw   r   r   \  sZ        
! 
! 
! 
!Q Q Q Q
     ry   r   c                  6    e Zd ZdZddZdd
ZddZddZeZdS )	_Selectorz
    Intermediate selector class.

    This stores selector data for a compound selector as we are acquiring them.
    Once we are done collecting the data for a compound selector, we freeze
    the data in an object that can be pickled and hashed.
    kwargsr   rm   rz   c                   |                     dd          | _        |                     dg           | _        |                     dg           | _        |                     dg           | _        |                     dg           | _        |                     dg           | _        |                     dg           | _        |                     d	d          | _        |                     d
g           | _	        |                     dg           | _
        |                     dd          | _        |                     dd          | _        dS )r   tagNidsclasses
attributesnth	selectors	relationsrel_typecontainslangrk   r   no_matchF)r   r   r   r   r   r   r   r   r   r   r   rk   r   )r   r   s     rw   r   z_Selector.__init__  s    ::eT**::eR((zz)R00 **\266::eR((K44K44

:t44

:r22JJvr**	ZZ++


:u55ry   r   list[_Selector]ct.SelectorListc                    |rQ|d         }|j                             |dd                    t          j        |                                g          S t          j                    S )zFreeze relation.r   r   N)r   extendctSelectorListfreeze)r   r   sels      rw   _freeze_relationsz_Selector._freeze_relations  s[      	%A,CM  122///?CJJLL>222?$$$ry   ct.Selector | ct.SelectorNullc                   | j         rt          j                    S t          j        | j        t          | j                  t          | j                  t          | j                  t          | j	                  t          | j
                  |                     | j                  | j        t          | j                  t          | j                  | j                  S )zFreeze self.)r   r   SelectorNullSelectorr   tupler   r   r   r   r   r   r   r   r   r   rk   r   s    rw   r   z_Selector.freeze  s     = 	?$$$;dhdl##do&&dhdn%%&&t~66dm$$di  
  ry   rf   c                    d| j         d| j        d| j        d| j        d| j        d| j        d| j        d| j        d	| j        d
| j	        d| j
        d| j        dS )zString representation.z_Selector(tag=z, ids=z
, classes=z, attributes=z, nth=z, selectors=z, relations=z, rel_type=z, contains=z, lang=z, flags=z, no_match=rQ   )r   r   r   r   r   r   r   r   r   r   rk   r   r   s    rw   __str__z_Selector.__str__  s    +TX + +tx + +T\ + +bfbq + +8+ ++/>+ +IM+ ++ +48M+ +LPI+ +aeak+ + + + +	
ry   N)r   r   rm   rz   )r   r   rm   r   )rm   r   r   )	r   r   r   r   r   r   r   r  __repr__r}   ry   rw   r   r     so         6 6 6 6 % % % %   (
 
 
 
 HHHry   r   c                  (    e Zd ZU dZded<   ded<   dS )
CSSPatternz<A CSS pattern that hasn't been processed by `CSSParser` yet.rf   r   rl   rk   N)r   r   r   r   __annotations__r}   ry   rw   r  r    s(         FFMMMJJJJJry   r  c                  "    e Zd ZdZddZdd
ZdS )PseudoSelectorMapzPseudo selector map.r   rf   r   CSSPattern | ct.SelectorListrm   rz   c                    || j         |<   dS )z	Set item.N)datar   r   r   s      rw   __setitem__zPseudoSelectorMap.__setitem__  s     	#ry   r   c                    t           5  | j        |         }t          |t                    r7t	          |j                                      |j                  }|| j        |<   ddd           n# 1 swxY w Y   |S )z	Get item.rk   N)SEL_LOCKr  
isinstancer  rt   r   ru   rk   r  s      rw   __getitem__zPseudoSelectorMap.__getitem__  s      	' 	'IcNE%,, '!%.11CC%+CVV!&	#		' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' s   AA..A25A2N)r   rf   r   r	  rm   rz   )r   rf   rm   r   )r   r   r   r   r  r  r}   ry   rw   r  r    sB           
	 	 	 	 	 	ry   r  zhtml|*:is(a, area)[href]z\
    html|*:is(input[type=checkbox], input[type=radio])[checked], html|option[selected]
    z
    :checked,

    /*
    This pattern must be at the end.
    Special logic is applied to the last selector.
    */
    html|form html|*:is(button, input)[type="submit"]
    aF  
    html|input[type="checkbox"][indeterminate],
    html|input[type="radio"]:is(:not([name]), [name=""]):not([checked]),
    html|progress:not([value]),

    /*
    This pattern must be at the end.
    Special logic is applied to the last selector.
    */
    html|input[type="radio"][name]:not([name='']):not([checked])
    a  
    html|*:is(input:not([type=hidden]), button, select, textarea, fieldset, optgroup, option, fieldset)[disabled],
    html|optgroup[disabled] > html|option,
    html|fieldset[disabled] > html|*:is(input:not([type=hidden]), button, select, textarea, fieldset),
    html|fieldset[disabled] >
        html|*:not(legend:nth-of-type(1)) html|*:is(input:not([type=hidden]), button, select, textarea, fieldset)
    z|
    html|*:is(input:not([type=hidden]), button, select, textarea, fieldset, optgroup, option, fieldset):not(:disabled)
    z,html|*:is(input, textarea, select)[required]z2html|*:is(input, textarea, select):not([required])aW  
    html|input:is(
        :not([type]),
        [type=""],
        [type=text],
        [type=search],
        [type=url],
        [type=tel],
        [type=email],
        [type=password],
        [type=number]
    )[placeholder]:not([placeholder='']):is(:not([value]), [value=""]),
    html|textarea[placeholder]:not([placeholder=''])
    a  
    html|*:is(
        textarea,
        input:is(
            :not([type]),
            [type=""],
            [type=text],
            [type=search],
            [type=url],
            [type=tel],
            [type=email],
            [type=number],
            [type=password],
            [type=date],
            [type=datetime-local],
            [type=month],
            [type=time],
            [type=week]
        )
    ):not([readonly], :disabled),
    html|*:is([contenteditable=""], [contenteditable="true" i])
    zhtml|*:not(:read-write)z
    html|input:is(
        [type="date"],
        [type="month"],
        [type="week"],
        [type="time"],
        [type="datetime-local"],
        [type="number"],
        [type="range"]
    ):is(
        [min],
        [max]
    )
    z html|*:is(details, dialog)[open]zhtml|*:is(video, audio)[muted]z*|*c                  b   e Zd ZdZ ede           eddeefddeefdde	efd	d
e
efddeeff           ede           ede           ede           ede           ede           ede           ede           ede           ede           ede          fZ ei dededededededededed e d!e!d"e"d#e#d$e$d%e%d&e&d'e'          Z(	 	 d[d\d2Z)d]d^d5Z*d_d<Z+d_d=Z,d_d>Z-d`dCZ.dadDZ/dbdGZ0dcdLZ1dddQZ2d_dRZ3d_dSZ4d_dTZ5d_dUZ6	 	 dedfdWZ7dgdYZ8dedhdZZ9d(S )irt   zParse CSS selectors.pseudo_closepseudo_contains)rG   rH   rI   pseudo_nth_child)rM   rO   pseudo_nth_type)rN   rP   pseudo_lang)rL   
pseudo_dir)rK   pseudo_class_custompseudo_classpseudo_elementampat_ruleidclassr   	attributecombiner   r   r   r   r(   r   r   r   r   r   r   r   r"   r   r&   r)   
<nth-of-s>Nr   r   rf   ri   'dict[str, str | ct.SelectorList] | Nonerk   rl   rm   rz   c                    |                     dd          | _        || _        | j        t          j        z  | _        |i n|| _        d| _        dS )r    r   Nr   )r   re   rk   r   DEBUGdebugri   count)r   r   ri   rk   s       rw   r   zCSSParser.__init__  sL      ''99
Z$*,
"Nbb


ry   r   	incrementc                t    | xj         |z  c_         | j         t          k    rt          dt                     dS )z!Check the current selector count.z/Selector exceeds pseudo-class nesting limit of N)r)  SELECTOR_LIMIT
ValueError)r   r*  s     rw   increment_countzCSSParser.increment_count  s@     	

i

:&&_~__``` '&ry   r   r   r   r   has_selectorboolc                   d}|                     d          }|                     d          r't          j        |                     d                    nd}|                     d          r*t          |                     d          dd                   nd}t          |                     d                    }d}	d}
d}|r"|d	k    rt          j        nd
t          j        z  }n@t          j        |          dk    rt          j        t          j        z  }d}	nt          j        }|r"t          |                     d                    }|sd}n|                    d          r2|sdnt	          j        |          }t	          j	        d|z  |          }nn|                    d          r2|sdnt	          j        |          }t	          j	        d|z  |          }n'|                    d          r1|sdnt	          j        |          }t	          j	        d|z  |          }n|                    d          rK|rt                              |          rdnt	          j        |          }t	          j	        d|z  |          }n|                    d          r+t	          j	        dt	          j        |          z  |          }nAt	          j	        dt	          j        |          z  |          }|                    d          rd}|	r|rt	          j	        |j                  }
t          j        ||||
          }|rlt                      }|j                            |           t          j        |                                gdd          }|j                            |           n|j                            |           d}|S )z8Create attribute selector from the returned regex match.FcmpcaseNattr_nsr   r   	attr_nameir   typeTr   rV   z(?!)z^%s.*rW   z.*?%s$rS   z.*?%s.*~z7.*?(?:(?<=^)|(?<=[ \t\r\n\f]))%s(?=(?:[ \t\r\n\f]|$)).*rR   z^%s(?:-.*)?$z^%s$!)r   r   r   r   r   r   DOTALLr   r   r   RE_WSsearchre   r   SelectorAttributer   r   r   r   r   r   )r   r   r   r/  inverseopr3  nsattris_typepattern2r   rk   re   sel_attrsub_selnot_lists                    rw   parse_attribute_selectorz"CSSParser.parse_attribute_selector  s    WWU^^./ggfooGtz!''&//***467ggi6H6HP\!''),,SbS1222bAGGK0011 	!S[[RTTa29<EEZ''D29$EGGIE 	3 !1!122E 	GG]]3 	 $)>GGbi.>.>EjE!1599GG]]3 	 $)>GGbi.>.>EjU!2E::GG]]3 	 $)>GGbi.>.>Eje!3U;;GG]]3 	 $)UELL,?,?UGGRYuEUEUEj![^c!cejkkGG]]3 	j29U3C3C!CUKKGG j29U+;+;!;UCCG}}S!!  	3w 	3z'/22H 'b'8DD 	,kkG%%h///(8(8'94GGHM  ****N!!(+++ry   c                   |                     d          r*t          |                     d          dd                   nd}t          |                     d                    }t          j        ||          |_        d}|S )z#Parse tag pattern from regex match.tag_nsNr   tag_nameT)r   r   r   SelectorTagr   )r   r   r   r/  prefixr   s         rw   parse_tag_patternzCSSParser.parse_tag_pattern  st     :;9J9JTaggh//4555PT177:..//.f--ry   c                X   t          j        t          |                    d                              }| j                            |          }|Bt          d| d|                    d           | j        |                    d                    t          |t          j                  sG| j        |= t          || j        | j                                      t                    }|| j        |<   |                     |j                   |j                            |           d}|S )	z
        Parse custom pseudo class alias.

        Compile custom selectors as we need them. When compiling a custom selector,
        set it to `None` in the dictionary so we can avoid an infinite loop.
        r   NzUndefined custom selector 'z' found at position r   rp   r  T)r   r   r   r   ri   r   r	   endre   r  r   r   rt   rk   ru   
FLG_PSEUDOr.  r)  r   r   )r   r   r   r/  r   r   s         rw   parse_pseudo_class_customz#CSSParser.parse_pseudo_class_custom  s    L99::;??6**%TfTT!%%PQ((TTa   (BO44 	+F# DJ  j11  #+DKX^,,,X&&&ry   	iselector Iterator[tuple[str, Match[str]]]is_htmltuple[bool, bool]c                   d}t          j        t          |                    d                              }|                    d          rd}|r7|t          v r.|                     |||||                    d                    }n|s|t          v r|dk    r|xj        t          j
        z  c_        n|dk    r|xj        t          j        z  c_        d}n|dk    r|xj        t          j        z  c_        nz|d	k    r|xj        t          j        z  c_        nX|| j        v rC| j        |         }|                     |j                   |j                            |           n|d
k    rD|j                            t          j        dddddt          j                                         n|dk    rD|j                            t          j        dddddt          j                                         nx|dk    rD|j                            t          j        dddddt          j                                         n.|dk    rC|j                            t          j        dddddt          j                                         n|dk    rm|j                            t          j        dddddt          j                              t          j        dddddt          j                              g           nr|dk    rl|j                            t          j        dddddt          j                              t          j        dddddt          j                              g           d}n|rJ|t.          v rA|                     ||                    d          t2          t4          z             d|_        d}nx|s|t8          v r
d|_        d}nc|t:          v r-t=          d| d| j        |                     d                    t=          d| d| j        |                     d                    ||fS )zParse pseudo class.Fr   openTr   r   r   r   r   r#   r   r    r'   r$   r!   r%   z!Invalid syntax for pseudo class 'rX   z' was detected as a pseudo-class and is either unsupported or invalid. If the syntax was not intended to be recognized as a pseudo-class, please escape the colon.)!r   r   r   r   PSEUDO_COMPLEXparse_pseudo_openrO  PSEUDO_SIMPLErk   r   SEL_ROOTSEL_DEFINED	SEL_SCOPE	SEL_EMPTYPSEUDO_SELECTORSr.  r)  r   r   r   SelectorNthr   r   PSEUDO_COMPLEX_NO_MATCHparse_selectorsrP  FLG_OPENr   PSEUDO_SIMPLE_NO_MATCHPSEUDO_SUPPORTEDr	   re   start)	r   r   r   r/  rR  rT  complex_pseudor   pseudo_selectors	            rw   parse_pseudo_classzCSSParser.parse_pseudo_class.  s'    L99::776?? 	"!N :	f6611#v|YXYX]X]^_X`X`aaLL 8	Fm$;$;  		R[(			:%%		R^+		8##		R\)			8##		R\)			4000"&"7"?$$_%:;;;$$_5555>))r~a5%IZIZ[[\\\\=((r~a5$HYHYZZ[[[[+++r~a4HYHYZZ[[[[?**r~a4rGXGXYYZZZZ=((q%E5"/BSBSTTq%E4ARARSS    ?**q%D%ARARSSq%D$@Q@QRR    LL 	*A A A  AEE!HHj86KLLLCLLL 	F.D$D$DCLLL'''%=F===

   &nF n n n

	   W$$ry   c                   |                                 }|                    d          rd}nd}t          j        t	          |d                             |d<   t          j        |                    d|z                       }|dk    rd}d}	d	}
nT|d
k    rd}d}	d	}
nFt          t          t                   t          	                    |                    }|
                    d          r|
                    d          dk    rdnd}|
                    d          }|                    d          }
|                    d          r|dz  }n|
r||dd         z  }n||z  }|
                    d          r|
                    d          dk    rdnd}|
                    d          r||
                    d          z  }nd}t          |d          }t          |d          }	|d         }|dk    r|
                    d          r8|                     ||                    d          t           t"          z            }n'| j        d         }|                     |j                   |dk    r2|j                            t/          j        ||
|	dd|                     n|dk    r1|j                            t/          j        ||
|	dd	|                     n|dk    rC|j                            t/          j        ||
|	d	dt/          j                                         nH|dk    rB|j                            t/          j        ||
|	d	d	t/          j                                         d	}|S )zParse `nth` pseudo.r  _child_typer   r   evenr\   r   Toddr   s1r   r   an1Nr   s2b0
   ofr#  rM   FrO   rN   rP   )	groupdictr   r   r   r   r   r
   rf   RE_NTHr   r   endswithr   rl   rb  rO  rP  rc  r_  r.  r)  r   r   r   r`  r   )r   r   r   r/  rR  mdictpostfixr   ro  rs  var	nth_parts_s1rp  _s2
pseudo_selnth_sels                    rw   parse_pseudo_nthzCSSParser.parse_pseudo_nthz  s;    99'(( 	GGG
<f#>#>??f*UYYuw7788fBBCCBBCCU3Zg)>)>??I"..W9??43H3HC3O3O##UWC$$A**S//C||C   s
 q"vq"..W9??43H3HC3O3O##UWCs## ys+++S"BS"B6]
hwwt}} 4..y!%%((JQYDYZZ /=$$W]333\))r~b#r5%QQRRRR000r~b#r5$PPQQQ^++r~b#r4HYHYZZ[[[[222r~b#r4rGXGXYYZZZry   r   r   c                    t           t          z  }|dk    r|t          z  }n|dk    r|t          z  }n|dv r
|t          z  }|j                            |                     |||                     d}|S )z"Parse pseudo with opening bracket.rE   rD   )rF   rC   T)rP  rc  FLG_NOTFLG_RELATIVEFLG_FORGIVEr   r   rb  )r   r   r   r/  rR  r   rk   s          rw   rY  zCSSParser.parse_pseudo_open  s     X%6>>WEEV^^\!EE&&&[ ET11)UEJJKKKry   r   r   r   tuple[bool, _Selector, str]c                <   |                     d                                          }|st          }|t          k    rr|st	          d| d| d| j        |          ||_        |d         j                            |           dt          z   }|                    t                                 n[|r(||_        |d         j                            |           n,|dd         t          k    rt	          d	| | j        |          d|z   }t                      }d
}|||fS )Parse combinator tokens.relationThe combinator '' at position  , must have a selector before itr   rU   r   Nz%The multiple combinators at position F)
r   stripWS_COMBINATORCOMMA_COMBINATORr	   re   r   r   r   r   )r   r   r   r/  r   r   r   
combinators           rw   parse_has_combinatorzCSSParser.parse_has_combinator  sI    WWZ((..00
 	'&J))) )hzhhhhhL  
 $CLbM#**3///]*HY[[)))) '"'..s3333!"".. *CECCL   Z'HkkS(**ry   r   	is_pseudo
is_forgivetuple[bool, _Selector]c	                h   |                     d                                          }	|	st          }	|sO|r|	t          k    rt	          d|	 d| d| j        |          |	t          k    r|                                  |dd= n|	t          k    rX|j        s|st          j	        dd          |_        |j
                            |           |                    |           |dd= n;|j
                            |           |	|_        |dd= |                    |           t                      }d}||fS )r  r  r  r  r  NrS   F)r   r  r  r  r	   re   r.  r   r   rK  r   r   r   r   r   )
r   r   r   r/  r   r   r  r  r   r  s
             rw   parse_combinatorzCSSParser.parse_combinator  sa    WWZ((..00
 	'&J 	& /?!?!?)hzhhhhhL   ---$$&&&aaaL---w 8y 8 nS$77CG$$Y///  %%%aaaLL$$Y///)aaaL  %%%kkS  ry   c                   |                     d          }|                    d          r0|j                            t	          |dd                              n/|j                            t	          |dd                              d}|S )zParse HTML classes and ids.r   .r   NT)r   r   r   r   r   r   )r   r   r   r/  r   s        rw   parse_class_idzCSSParser.parse_class_id3  s     771::s## 	7K|HQRRL99::::GNN<55666ry   c                   t          j        t          |                    d                              }|dk    rt	          j        dt                     |dk    }d t                              |                    d                    D             }|j	        
                    t          j        ||                     d}|S )zParse contains.r   rG   z\The pseudo class ':contains' is deprecated, ':-soup-contains' should be used moving forward.rI   c                |    g | ]9}|                     d           t          |                     d                    :S splitr   r   r   .0tokens     rw   
<listcomp>z3CSSParser.parse_pseudo_contains.<locals>.<listcomp>H  N     
 
 
;;w''
W--..
 
 
ry   valuesT)r   r   r   r   warningswarnFutureWarning	RE_VALUESfinditerr   r   r   SelectorContains)r   r   r   r/  r   contains_ownr   s          rw   parse_pseudo_containszCSSParser.parse_pseudo_contains>  s     L99::[  Mn   !66
 
"++AGGH,=,=>>
 
 

 	B/,GGHHHry   c                    d t                               |                    d                    D             }|j                            t          j        |                     d}|S )zParse pseudo language.c                |    g | ]9}|                     d           t          |                     d                    :S r  r  r  s     rw   r  z/CSSParser.parse_pseudo_lang.<locals>.<listcomp>T  r  ry   r  T)r  r  r   r   r   r   SelectorLang)r   r   r   r/  r   s        rw   parse_pseudo_langzCSSParser.parse_pseudo_langQ  se    
 
"++AGGH,=,=>>
 
 

 	11222ry   c                    t          j        |                    d                    dk    rt          j        nt          j        }|xj        |z  c_        d}|S )zParse pseudo direction.dirltrT)r   r   r   r   SEL_DIR_LTRSEL_DIR_RTLrk   )r   r   r   r/  r   s        rw   parse_pseudo_dirzCSSParser.parse_pseudo_dir^  sJ     #'*QWWU^^"<"<"E"E2>		U		ry   r   c           
     X   t                      }g }d}d}g }dt          z   }	| j        }
t          |t          z            }t          |t
          z            }t          |t          z            }t          |t          z            }t          |t          z            }t          |t          z            }t          |t          z            }t          |t          z            }t          |t          z            }t          |t          z            }t          |t          z            }| j        r|rt!          d           |rt!          d           |rt!          d           |rt!          d           |rt!          d           |rt!          d           |rt!          d	           |rt!          d
           |rt!          d           |rt!          d           |rt!          d           |r!|                    t                                 	 	 t%          |          \  }}|dvr|                                  |dk    r%t)          d|                    d                     |dk    r|xj        t.          j        z  c_        d}n`|dk    r|                     |||          }nA|dk    r|                     |||||          \  }}n|dk    r%t)          d|                    d                     |dk    r|                     |||          }n|dv r|                     ||||          }n|dk    r|                     |||          }n|dk    r|                     |||          }d}nu|dk    r|sH|s?t?          d|                    d           | j         |                    d                    d|_!        |rd}n6t?          d|                    d           | j         |                    d                    |dk    rA|r| "                    |||||	|          \  }}}	n| #                    ||||||||          \  }}n|d k    r| $                    |||          }n{|d!k    rZ|r@t?          d"|                    d           d#| j         |                    d                    | %                    |||          }n|d$v r| &                    |||          }|'                    d          }n# tP          $ r Y nw xY w|r|st?          d%| | j         |          |r|j)        s|st/          j*        d&d'          |_)        |r(|	|_+        |d(         j,                            |           nr|j,        -                    |           |d'd'= |                    |           n=|r;|r|s7|                                  d|_!        |d'd'= |                    |           d}|st?          d| | j         |          |rt.          j.        |d(         _        |rt.          j/        |d(         _        |rt.          j0        |d(         _        |rt.          j1        |d(         _        |rt.          j2        |d(         _        t/          j3        d) |D             ||| j        |
z
            S )*zParse selectors.FrU   z    is_pseudo: Truez    is_open: Truez    is_relative: Truez    is_not: Truez    is_html: Truez    is_default: Truez    is_indeterminate: Truez    is_in_range: Truez    is_out_of_range: Truez    is_placeholder_shown: Truez    is_forgive: TrueT)r"  r  r  zAt-rules found at position r   r  r  r  r  z!Pseudo-element found at position r  )r  r  r  r  r  z Expected a selector at position z)Unmatched pseudo-class close at position r"  r!  r   zTag name found at position z instead of at the start)r   r  z"Unclosed pseudo-class at position rS   Nr   c                6    g | ]}|                                 S r}   )r   )r  ss     rw   r  z-CSSParser.parse_selectors.<locals>.<listcomp>   s     >>>q

>>>ry   )4r   r  r)  r0  rc  rP  r  r  FLG_HTMLFLG_DEFAULTFLG_INDETERMINATEFLG_IN_RANGEFLG_OUT_OF_RANGEFLG_PLACEHOLDER_SHOWNr  r(  printr   nextr.  NotImplementedErrorrf  rk   r   r]  rQ  ri  r  r  r  r  r	   re   r   r  r  rG  rM  r  rO  StopIterationr   rK  r   r   r   SEL_DEFAULTSEL_INDETERMINATESEL_IN_RANGESEL_OUT_OF_RANGESEL_PLACEHOLDER_SHOWNr   )r   rR  r   rk   r   r   r/  closedr   r   r)  is_openr  is_relativeis_notrT  
is_defaultis_indeterminateis_in_rangeis_out_of_rangeis_placeholder_shownr  r   r   s                           rw   rb  zCSSParser.parse_selectorsf  s    kk		&
 ux'((+,,	5</00ego&&ux'((%+-..
(9 9::5</00u'7788#E,A$ABB%+-..
 : 	. -+,,, +)*** /-... *())) +)*** .,--- 42333 /-... 31222# 86777 .,---  	*Y[[)))G	D!iQ999((*** )##-.XAGGTUJJ.X.XYYYE\\II-II#'LL111#'#A#A#q,#W#WLLN**,0,C,CCLZcel,m,m)L'',,,-.^RSRYRYZ[R\R\.^.^___---#'#=#=c1l#S#SLLCCC#'#8#8ay#Y#YLLM))#'#9#9#q,#O#OLLL((#'#8#8a#N#NL"GGN**' ,) "5 O1771:: O O $ !

# # 
 (, !%1TPQ

TT LGGAJJ  
 I%%" 6:6O6OL)Xu7 73c88 -1,A,AL)Y	S]_d- -)cc K''#'#@#@a#V#VLLE\\# 1^!''!**^^^ LGGAJJ  
 $(#9#9#q,#O#OLLO++#'#6#6sA|#L#LLaID!N <  	 	 	D	  	6 	%<U<<    	 7 49 4.d33 &'"'..s3333$$Y///aaaL  %%%%  	  	 ) 	   """CL!!!S!!!L 	 &:5::    	1"$.IbM 	7"$"6IbM 	2"$/IbM 	6"$"5IbM 	;"$":IbM >>I>>>QUQ[^cQcddds   K1S= =
T
	T
re   c              #  |  K   t                               |          }|r|                    d          nd}t                              |ddd                   }|r|                    d          nd}t	          |          d|z   z
  }| j        rt          d|           ||k    rd}| j        D ]}|                    ||| j	                  }|rv|
                                }| j        r>t          d| d|                    d          d|                    d                      |                    d          }||fV   n|V||         }|d	k    rd
| }	n,|dk    rd| }	n |dk    rd| }	n|dk    rd| }	nd|d| }	t          |	| j        |          ||k    | j        rt          d           dS dS )zIterate selector tokens.r   Nr   r   z## PARSING: zTOKEN: 'z' --> z at position [z)Malformed attribute selector at position r  z%Malformed class selector at position #z"Malformed id selector at position rU   z,Malformed pseudo-class selector at position zInvalid character z
 position z## END PARSING)RE_WS_BEGINr<  rO  	RE_WS_ENDr   r(  r  
CSS_TOKENSr   rk   r   r   rf  r	   re   )
r   re   r   r   offsetrO  vr   r   msgs
             rw   selector_iterzCSSParser.selector_iter"  s+      w''$a1WTTrT]++%qA'lla&j): 	.,,,---sllA_  GGGUDJ77 ::<<Dz ^\\\QWWQZZ\\PQPWPWXYPZPZ\\]]]EE!HHE'MMME yEN 88MeMMCC#XXI%IICC#XXFuFFCC#XXPPPCCEqEEeEEC)#t|UCCC5 sll6 : 	$"#####	$ 	$ry   c                `    |                      |                     | j                  ||          S )zProcess selectors.)rb  r  re   )r   r   rk   s      rw   ru   zCSSParser.process_selectorsL  s,     ##D$6$6t|$D$DeUSSSry   )Nr   )r   rf   ri   r$  rk   rl   rm   rz   )r   )r*  rl   rm   rz   )r   r   r   r   r/  r0  rm   r0  )r   r   r   r   r/  r0  rR  rS  rT  r0  rm   rU  )
r   r   r   r   r/  r0  rR  rS  rm   r0  )r   r   r   rf   r/  r0  rR  rS  r   rl   rm   r0  )r   r   r   r   r/  r0  r   r   r   rf   r   rl   rm   r  )r   r   r   r   r/  r0  r   r   r   r   r  r0  r  r0  r   rl   rm   r  )r   r   )rR  rS  r   rl   rk   rl   rm   r   )re   rf   rm   rS  )r   rl   rk   rl   rm   r   ):r   r   r   r   r   PAT_PSEUDO_CLOSEr   PAT_PSEUDO_CONTAINSPAT_PSEUDO_NTH_CHILDPAT_PSEUDO_NTH_TYPEPAT_PSEUDO_LANGPAT_PSEUDO_DIRPAT_PSEUDO_CLASS_CUSTOMPAT_PSEUDO_CLASSPAT_PSEUDO_ELEMENTPAT_AMPPAT_AT_RULEPAT_ID	PAT_CLASSPAT_TAGPAT_ATTRPAT_COMBINEr  r  CSS_LINKCSS_CHECKEDCSS_DEFAULTCSS_INDETERMINATECSS_DISABLEDCSS_ENABLEDCSS_REQUIRED	CSS_MUTEDCSS_OPENCSS_OPTIONALCSS_READ_ONLYCSS_READ_WRITECSS_IN_RANGECSS_OUT_OF_RANGECSS_PLACEHOLDER_SHOWNCSS_NTH_OF_S_DEFAULTr_  r   r.  rG  rM  rQ  ri  r  rY  r  r  r  r  r  r  rb  r  ru   r}   ry   rw   rt   rt   u  s        	(899 &K'#	 $%FH\^mn"$IK^`op
O_My./J	
 	
 	-/FGG(899(*<==w''	;//f%%++w''X..	;//3J: )(	
X	
	
 	
 		

 /	
 	
 	
 	
 i	
 X	
 	
 -	
 >	
 	
 -	
  !"7!	
" .#	
 2 ;?	    a a a a aF F F FP      :J% J% J% J%X@ @ @ @D   ./+ /+ /+ /+b-! -! -! -!^	 	 	 	   &       	ze ze ze ze zex($ ($ ($ ($TT T T T T T Try   rt   )
re   rf   rg   rh   ri   rj   rk   rl   rm   rn   )rm   rz   )ri   rj   rm   r   )r   rf   rm   rf   )r   rf   rm   rf   )xr   
__future__r   r   	functoolsr   r   r   r   rr   r   r   r	   r  typingr
   r   r   r   dataclassesr   collectionsr   	threadingLockr   RLockr  r   r,  rZ  rd  rX  ra  PSEUDO_SPECIALre  NEWLINEWSCOMMENTSWSCCSS_ESCAPESCSS_STRING_ESCAPES
IDENTIFIERNTHVALUEATTRr  r  r  r  r  PAT_PSEUDO_CLASS_SPECIALr  r  r  r  r  r  r  r  r  r  r  r   r   r   r   ry  r   r  r;  r  r  r   r   r   r   r  r  rP  r  r  r  r  r  rc  r  r  r  r  	_MAXCACHErx   r~   rq   r   r   r   r   r   r  rf   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rt   r}   ry   rw   <module>r     s	     " " " " " " 				                         % % % % % %  - - - - - - - - - - - - ! ! ! ! ! !                
).

9?!   <   8	 	 	      !#99NJMddguu  '')R(<<<<MMM'MMM ;F 8C  

 K#JJJJJnGnn7nn_innn`c``s``u``#``Z]``` 
z		*	
NJ
N
Nj
N
N
N^^^j^^^^VZ^^^AAAAAA HHHHHH ;j;;; 
<<< ,*,,  J  .  "% 2: =?AD IQ TVX[   
-  !   
 /dd5ddSddCddRWdd\_ddd-GGsGGGBBRBBCBBB2hhuhhhhPShhV[hh`chhh  RZMMMMrtTT
^R^^SZ^^^`b`dee	fsffQTfffhjhl	m	mBJJJJ3JJ#JJJBDQQ	
2bjc%%BJKxKKKLL	BJ63666==	$"*%=rtbd{RT?QRR 	   

    	 9   ,& & & &      >   86 6 6 6 6 6 6 6<! ! ! ! !? ! ! !HA A A A A A A AH            j2?&B!BC   * :0*x2GHHj 	  j K'  J
 --   z 	 	 j 	  zH*W_J_``zNPZ]ePeff"
 11  $ , / 4 
4j86KLLz L( $ : ,,  $ :8*x:OPPJ7h9NOO	!z%44 ZT ZT ZT ZT ZT ZT ZT ZT ZT ZTry   