� L�gh�����dZddlmZddlmZddlmZddlZddlmZddl Z ddl Z ddl m Z m Z mZmZmZmZejd ��Zejd ��Zd Zd Zd ZdZdZdZdZdZdZdZejej zZ!ej"ej#zZ$ejej dd�Z%ejd��Z&ejd��Z'ejd��Z(ejd��Z)ejd��Z*ejd��Z+ejd��Z,dZ-dZ.dZ/d Z0d!Z1d"Z2d#Z3Gd$�d%��Z4Gd&�d'��Z5Gd(�d)��Z6Gd*�d+e5��Z7Gd,�d-ej8��Z9ej:e9��dS).z CSS matcher.�)� annotations)�datetime�)�utilN)� css_types)�Iterator�Iterable�Any�Callable�Sequence�castz[^ ]z [^ ]+� �>�~�+z: z:>z:~z:+zhttp://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�"�eZdZdZd d�Zd d�Zd S) � _FakeParentz� Fake parent class. When we have a fragment with no `BeautifulSoup` document object, we can't evaluate `nth` selectors properly. Create a temporary fake parent so we can traverse the root element as a child. �element�bs4.Tag�return�Nonec��|g|_dS)� Initialize.N)�contents)�selfr!s �c/home/asafur/pinokio/api/open-webui.git/app/env/lib/python3.11/site-packages/soupsieve/css_match.py�__init__z_FakeParent.__init__Ds��!� �� � � ��bs4.PageElementc�*�t|j��S)zLength.)�lenr'�r(s r)�__len__z_FakeParent.__len__Is���4�=�!�!�!r+N)r!r"r#r$)r#r,)�__name__� __module__� __qualname__�__doc__r*r0�r+r)r r ;sF��������"�"�"�"� "�"�"�"�"�"r+r c��eZdZdZed?d���Zed@d ���ZedAd ���ZedAd ���Z edAd���Z edAd���Z edAd���Z edAd���Z edAd���ZedBd���ZedCd���ZdCd�ZdCd�ZdDdEd�Z dFdGd#�Z dHdId$�ZdDdJd%�ZedKd'���ZedKd(���ZedKd)���ZedLdMd*���ZedLdMd+���ZedCd,���ZedNd0���ZedOd3���Ze dPdQd7���ZedRd9���Z edSd;���Z!dDdTd<�Z"dDdUd>�Z#dS)V� _DocumentNavz#Navigate a Beautiful Soup document.�tagr r#r$c�n�|�|��stdt|�������dS)z%Check if valid input tag or document.z:Expected a BeautifulSoup 'Tag', but instead received type N)�is_tag� TypeError�type)�clsr8s r)�assert_valid_inputz_DocumentNav.assert_valid_inputRsD�� �z�z�#��� f��d�Y]�^a�Yb�Yb�d�d�e�e� e� f� fr+�objr"�boolc�6�t|tj��S)zIs `BeautifulSoup` object.)� isinstance�bs4� BeautifulSoup�r?s r)�is_docz_DocumentNav.is_docZs���#�s�0�1�1�1r+r,c�6�t|tj��S)zIs tag.)rBrC�TagrEs r)r:z_DocumentNav.is_tag_s���#�s�w�'�'�'r+c�6�t|tj��S)zIs declaration.)rBrC� DeclarationrEs r)�is_declarationz_DocumentNav.is_declarationds���#�s��/�/�/r+c�6�t|tj��S)z Is CDATA.)rBrC�CDatarEs r)�is_cdataz_DocumentNav.is_cdatais���#�s�y�)�)�)r+c�6�t|tj��S)zIs processing instruction.)rBrC�ProcessingInstructionrEs r)�is_processing_instructionz&_DocumentNav.is_processing_instructionns���#�s�8�9�9�9r+c�6�t|tj��S)zIs navigable string.)rBrC�NavigableStringrEs r)�is_navigable_stringz _DocumentNav.is_navigable_stringss���#�s�2�3�3�3r+c��t|tjtjtjtjtjf��S)zIs special string.)rBrC�CommentrJrMrP�DoctyperEs r)�is_special_stringz_DocumentNav.is_special_stringxs,���#�� �S�_�c�i��Ib�dg�do�p�q�q�qr+c�X�|�|��o|�|�� S)z Check if node is content string.)rTrX)r=r?s r)�is_content_stringz_DocumentNav.is_content_string}s.���&�&�s�+�+�N�C�4I�4I�#�4N�4N�0N�Nr+�elr c� �t|��S)z'Create fake parent for a given element.)r �r[s r)�create_fake_parentz_DocumentNav.create_fake_parent�s���2���r+c�*�t|j��S)z2Check if element (or document) is from a XML tree.)r@�_is_xmlr]s r)� is_xml_treez_DocumentNav.is_xml_tree�s���B�J���r+c��t|�|��r|jntj|j��dko|�|����S)z Check if element is an `iframe`.�iframe)r@ra�namer�lower� is_html_tag�r(r[s r)� is_iframez_DocumentNav.is_iframe�sY����)�)�"�-�-�F�b�g�g�4�:�b�g�3F�3F�8� S� !� � � �R� � � � � r+c��|jo|j|u}|s5|�|��}|duo|jo|�|��}|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�sW���y�,�T�Y�"�_��� R��_�_�R�(�(�F���%�Q�$�,�Q�4�>�>�&�;Q�;Q�D�� r+F� no_iframe�Iterator[bs4.PageElement]c#�VK�|r|�|��s|jEd{V��dSdS)z$Get contents or contents in reverse.N)rhr'�r(r[ros r)� get_contentsz_DocumentNav.get_contents�sK����� #����r� 2� 2� #��{� "� "� "� "� "� "� "� "� "� #� #r+NT�start� int | None�reverse�tagsc#�:K�|r|�|��s}t|j��dz }|�|r|nd}n|}|rdn|dz}|rdnd} d|cxkr|krAndS||kr9|j|} || z }|r|�| ��r| V�||k�3dSdSdSdS)z Get children.rNr�����)rhr.r'r:) r(r[rtrvrwro�last�index�end�incr�nodes r)� get_childrenz_DocumentNav.get_children�s������ #����r� 2� 2� #��r�{�#�#�a�'�D��}� '�.���Q������-�"�"�T�A�X�C� �'�2�2�a�D��E�!�!�!�!�T�!�!�!�!�!�!��s�l�l��;�u�-�D��T�M�E��#�4�;�;�t�#4�#4�#�"� � � � �s�l�l�l�l� #� #�"�!�"�lr+c#�K�|r|�|��s�d}|jD]�}|�||ur� d}|�|��}|r~|r||�|��rg|j�|j}nN|}|�|��r0|jr)|jd}|�|��r|j�)|j}|V�|�dS��|r|r|V���dSdS)zGet descendants.Nry)rh� descendantsr:� next_siblingr'� next_element)r(r[rwro� next_good�childr:� last_childs r)�get_descendantsz_DocumentNav.get_descendants�s:����� ����r� 2� 2� ��I��� � ���(��I�-�-� � $�I����U�+�+��� �� �D�N�N�5�,A�,A� ��)�5�$)�$6� � �%*� �"�k�k�*�5�5�A�*�:M�A�)3�)<�R�)@�J�#�k�k�*�5�5�A�*�:M�A�$.�$;� ��K�K�K� �(������ �v� ��K�K�K��5 � � � r+c�J�|j}|r|�|�|��rd}|S)z Get parent.N)rmrh)r(r[rorms r)rkz_DocumentNav.get_parent�s3����� � ��+����v�0F�0F�+��F�� r+� str | Nonec�,�td|j��S)�Get tag.r�)r rdr]s r)� get_tag_namez_DocumentNav.get_tag_name�s���L�"�'�*�*�*r+c�,�td|j��S)� Get prefix.r�)r �prefixr]s r)�get_prefix_namez_DocumentNav.get_prefix_name�s���L�"�)�,�,�,r+c�,�td|j��S)zGet namespace `URI`.r�)r � namespacer]s r)�get_uriz_DocumentNav.get_uri�s���L�"�,�/�/�/r+c��|j}|r7|�|��s"|� |j}|r|�|��s|� |S)zGet next sibling tag.)r�r:�r=r[rw�siblings r)�get_nextz_DocumentNav.get_nextsZ���/��� +�3�:�:�g�.�.� +�7�3F��*�G�� +�3�:�:�g�.�.� +�7�3F��r+c��|j}|r7|�|��s"|� |j}|r|�|��s|� |S)zGet previous sibling tag.)�previous_siblingr:r�s r)� get_previousz_DocumentNav.get_previous s[���%��� /�3�:�:�g�.�.� /�7�3F��.�G�� /�3�:�:�g�.�.� /�7�3F��r+c�^�|rt|d��nd}t|o |tk��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`. r�N)�getattrr@�NS_XHTML)r[�nss r)� has_html_nsz_DocumentNav.has_html_nss4��*,� 5�W�R�� %� %� %����B�)�2��>�*�*�*r+� attr_name�str�tuple[str | None, str | None]c�F�t|dd��t|dd��fS)z7Return namespace and attribute name without the prefix.r�Nrd)r�)r[r�s r)�split_namespacez_DocumentNav.split_namespace s(���y�+�t�4�4�g�i��QU�6V�6V�V�Vr+�value�str | Sequence[str]c ��|�dSt|t��r|St|t��r|�d��St|t��r�g}|D]�}t|ttf��s8t|t��r#|�t|�����V|�t t|�|��������|St|��S)z6Normalize the value to be a string or list of strings.N��utf8)rBr��bytes�decoder �appendr �normalize_value)r=r�� new_value�vs r)r�z_DocumentNav.normalize_value&s�� �=��2� �u�c� "� "� ��L� �e�U� #� #� (��<�<��'�'� '� �e�X� &� &� ��I�� H� H��!�!�c�5�\�2�2�H�z�!�X�7N�7N�H��$�$�S��V�V�,�,�,�,��$�$�T�#�s�/B�/B�1�/E�/E�%F�%F�G�G�G�G�� ��5�z�z�r+rd�default�str | Sequence[str] | Nonec��|}|jr2 |�|j|��}n^#t$rYnRwxYw|j���D]4\}}t j|��|kr|�|��}n�5|S)zGet attribute by name.)r`r��attrs�KeyError�itemsrre)r=r[rdr�r��kr�s r)�get_attribute_by_namez"_DocumentNav.get_attribute_by_nameGs����� �:� � ��+�+�B�H�T�N�;�;����� � � ��� ��������(�(� � ���1��:�a�=�=�D�(�(��/�/��2�2�E��E�)�� s � ,� 9�9�0Iterator[tuple[str, str | Sequence[str] | None]]c#�zK�|j���D]\}}||�|��fV��dS)zIterate attributes.N)r�r�r�)r=r[r�r�s r)�iter_attributesz_DocumentNav.iter_attributes]sS�����H�N�N�$�$� ,� ,�D�A�q��S�(�(��+�+�+� +� +� +� +� ,� ,r+� Sequence[str]c���|�|dg��}t|t��rt�|��}t t t|��S)z Get classes.�class)r�rBr�� RE_NOT_WS�findallr r )r=r[�classess r)� get_classesz_DocumentNav.get_classesdsT���+�+�B���<�<�� �g�s� #� #� 1��'�'��0�0�G��H�S�M�7�+�+�+r+c�r��d��fd���|d|���D����S)z Get text.r�c�>��g|]}��|���|��Sr5�rZ��.0r~r(s �r)� <listcomp>z)_DocumentNav.get_text.<locals>.<listcomp>qs.��� x� x� x�d�[_�[q�[q�rv�[w�[w� x�T� x� x� xr+F)rwro)�joinr�rrs` r)�get_textz_DocumentNav.get_textmsG����w�w� x� x� x� x�d�2�2�2�E�Y�2�W�W� x� x� x� � � r+� list[str]c�J���fd���||���D��S)z Get Own Text.c�>��g|]}��|���|��Sr5r�r�s �r)r�z-_DocumentNav.get_own_text.<locals>.<listcomp>ws-���l�l�l��t�Oe�Oe�fj�Ok�Ok�l��l�l�lr+�ro)rsrrs` r)� get_own_textz_DocumentNav.get_own_textts3���m�l�l�l��!2�!2�2��!2�!K�!K�l�l�l�lr+)r8r r#r$)r?r"r#r@)r?r,r#r@)r[r"r#r �r[r"r#r@�F)r[r"ror@r#rp)NFTF) r[r"rtrurvr@rwr@ror@r#rp)TF)r[r"rwr@ror@r#rp)r[r"ror@r#r"�r[r"r#r�)T)r[r"rwr@r#r,)r[r"r�r�r#r�)r�r r#r��N)r[r"rdr�r�r�r#r�)r[r"r#r�)r[r"r#r�)r[r"ror@r#r�)r[r"ror@r#r�)$r1r2r3r4� classmethodr>� staticmethodrFr:rKrNrQrTrXrZr^rarhrnrsrr�rkr�r�r�r�r�r�r�r�r�r�r�r�r�r5r+r)r7r7Os�������-�-��f�f�f��[�f��2�2�2��\�2��(�(�(��\�(��0�0�0��\�0��*�*�*��\�*��:�:�:��\�:��4�4�4��\�4��r�r�r��\�r��O�O�O��[�O� �����\�� � � � ��\� �  � � � � � � � �#�#�#�#�#�!���� #�#�#�#�#�:�� " �" �" �" �" �H������+�+�+��\�+� �-�-�-��\�-� �0�0�0��\�0� ������[��������[��� +� +� +��\� +��W�W�W��\�W� �����[��@� /3� �����[��*�,�,�,��[�,� �,�,�,��[�,� � � � � �m�m�m�m�m�m�mr+r7c��eZdZdZedd���Zedd ���Zedd ���Zedd ���Zedd���Z edd���Z e dd���Z dS)�Inputsz-Class for parsing and validating input items.�year�int�month�dayr#r@c��t}|tkr*|dzdkr |dzdks |dzdkrtnt}n|tvrt }d|cxko|kncS)z Validate day.rr�di�r)� LONG_MONTH�FEB�FEB_LEAP_MONTH� FEB_MONTH� MONTHS_30� SHORT_MONTH)r�r�r��max_dayss r)� validate_dayzInputs.validate_day}sz���� �C�<�<�+/�!�8�q�=�=�t�c�z�Q���UY�\_�U_�cd�Ud�Ud�~�~�kt�H�H� �i� � �"�H��C�#�#�#�#�8�#�#�#�#�#r+�weekc��tjd�dd�d|��d�����d}|dkrd}d|cxko|kncS)zValidate week.� �-rz%m-%d-%Yr�5)r�strptime� isocalendar)r�r��max_weeks r)� validate_weekzInputs.validate_week�sn���$��%8�%8�R�%8�%8�$�%8�%8�*�E�E�Q�Q�S�S�TU�V�� �q�=�=��H��D�$�$�$�$�H�$�$�$�$�$r+c�"�d|cxkodkncS)zValidate month.rr�r5)r�s r)�validate_monthzInputs.validate_month�s&���E�����R�����r+c��d|kS)zValidate year.rr5)r�s r)� validate_yearzInputs.validate_year�s���D�y�r+�hourc�"�d|cxkodkncS)zValidate hour.r�r5)r�s r)� validate_hourzInputs.validate_hour�s���D�����B�����r+�minutesc�"�d|cxkodkncS)zValidate minutes.r�;r5)r�s r)�validate_minuteszInputs.validate_minutes�s&���G�!�!�!�!�r�!�!�!�!�!r+�ityper�r�r��tuple[float, ...] | Nonec�\�d}|�|S|dkr�t�|��}|r�t|�d��d��}t|�d��d��}t|�d��d��}|�|��r1|�|��r|�|||��r|||f}�nR|dkr�t�|��}|rtt|�d��d��}t|�d��d��}|�|��r|�|��r||f}�n�|dkr�t�|��}|rut|�d��d��}t|�d��d��}|�|��r|� ||��r||f}�n!|dkr�t�|��}|rtt|�d ��d��} t|�d ��d��} |� | ��r|� | ��r| | f}�n�|d k�r?t�|��}|�r!t|�d��d��}t|�d��d��}t|�d��d��}t|�d ��d��} t|�d ��d��} |�|��r]|�|��rH|�|||��r1|� | ��r|� | ��r|||| | f}nC|d vr?t�|��}|r#t|�d ����f}|S)zParse the input value.N�dater�� r�r�r��timer�r��datetime-local)�number�ranger�)�RE_DATE�matchr��groupr�r�r��RE_MONTH�RE_WEEKr��RE_TIMEr�r�� RE_DATETIME�RE_NUM�float) r=r�r��parsed�mr�r�r�r�r�r�s r)� parse_valuezInputs.parse_value�s����� �=��L� �F�?�?�� � �e�$�$�A�� 0��1�7�7�6�?�?�B�/�/���A�G�G�G�,�,�b�1�1���!�'�'�%�.�.�"�-�-���$�$�T�*�*�0�s�/A�/A�%�/H�/H�0�S�M]�M]�^b�di�kn�Mo�Mo�0�"�E�3�/�F�� �g� � ����u�%�%�A�� +��1�7�7�6�?�?�B�/�/���A�G�G�G�,�,�b�1�1���$�$�T�*�*�+�s�/A�/A�%�/H�/H�+�"�E�]�F�� �f�_�_�� � �e�$�$�A�� *��1�7�7�6�?�?�B�/�/���1�7�7�6�?�?�B�/�/���$�$�T�*�*�*�s�/@�/@��t�/L�/L�*�"�D�\�F�� �f�_�_�� � �e�$�$�A�� -��1�7�7�6�?�?�B�/�/���a�g�g�i�0�0�"�5�5���$�$�T�*�*�-�s�/C�/C�G�/L�/L�-�"�G�_�F�� �&� &� &��!�!�%�(�(�A�� ?��1�7�7�6�?�?�B�/�/���A�G�G�G�,�,�b�1�1���!�'�'�%�.�.�"�-�-���1�7�7�6�?�?�B�/�/���a�g�g�i�0�0�"�5�5���%�%�d�+�+�?�03�0B�0B�5�0I�0I�?�NQ�N^�N^�_c�ej�lo�Np�Np�?��%�%�d�+�+�?�03�0D�0D�W�0M�0M�?�#�E�3��g�>�F�� �)� )� )�� � �U�#�#�A�� 4������ 0� 0�1�1�3��� r+N)r�r�r�r�r�r�r#r@)r�r�r�r�r#r@)r�r�r#r@)r�r�r#r@)r�r�r#r@)r�r�r#r@)r�r�r�r�r#r�) r1r2r3r4r�r�r�r�r�r�r�r�rr5r+r)r�r�zs�������7�7��$�$�$��\�$��%�%�%��\�%�� � � ��\� � �����\�� �����\�� �"�"�"��\�"� �4�4�4��[�4�4�4r+r�c�F�eZdZdZdWd �ZdXd�ZdYd�ZdZd�Zd[d�Zd[d�Z d\d�Z d]d�Z d^d�Z d_d!�Z d`d$�Zd_d%�Zdad'�Zdbd)�Zdcddd-�Zdbd.�Zdbd/�Zded2�Zdfd4�ZdZd5�ZdZd6�Zdgd8�Zdhd:�ZdZd;�Zdid=�Zdjd@�ZdZdA�ZdZdB�ZdkdE�Z dldG�Z!dmdI�Z"dZdJ�Z#dZdK�Z$dndL�Z%dodpdP�Z&dqdR�Z'drdT�Z(dZdU�Z)dVS)s�CSSMatchzPerform CSS matching.� selectors�ct.SelectorList�scoper"� namespaces�ct.Namespaces | None�flagsr�r#r$c�,�|�|��||_g|_g|_g|_||_|�in||_||_d|_|}|� |��}|r|}|� |��}|�d}|� |��s|}n|� |��D]}|}||_ ||ur|n||_ |�|��|_|�|��|_|j p|j|_dS)r&NF)r>r8�cached_meta_lang�cached_default_forms�cached_indeterminate_formsrrr�iframe_restrictrkrFrrjrr��has_html_namespacera�is_xmlrl) r(rrrr�docrmrjr�s r)r*zCSSMatch.__init__�sD�� ����&�&�&���� "���$&��!�*,��'�"��� *� 2�"�"� ����� �$���������%�%��� *��C��_�_�S�)�)�F�� *����{�{�3��� ��D�D��*�*�3�/�/� � ������� �#�3�.�.�U�U�D�� �"&�"2�"2�4�"8�"8����&�&�s�+�+�� ��;��A�$�*A�� � � r+r@c��|jp|jS)z3Check if namespaces are supported in the HTML type.)rrr/s r)�supports_namespaceszCSSMatch.supports_namespaces s���{�5�d�5�5r+r[r�c�t�|���rd}|�|��}|r|}nt}|S)zGet tag namespace.r�)r r�r�)r(r[r�r�s r)� get_tag_nszCSSMatch.get_tag_nssG�� � #� #� %� %� !��I����b�!�!�B�� �� �� �I��r+c�>�|�|��tkS)z"Check if tag is in HTML namespace.)r"r�rgs r)rfzCSSMatch.is_html_tags�����r�"�"�h�.�.r+r�c�j�|�|��}|�|jstj|��n|S)r�)r�rrre�r(r[rds r)�get_tagzCSSMatch.get_tag#s8��� � ��$�$��#'�#3�D�K�#3�t�z�$����T�Qr+c�j�|�|��}|�|jstj|��n|S)r�)r�rrre)r(r[r�s r)� get_prefixzCSSMatch.get_prefix)s9���%�%�b�)�)��%+�%7�� �%7�t�z�&�!�!�!�QW�Wr+ruc �(�|�|d���D]�}|�|��r�t�t j|�|dd����d��}|�|��dvs|�|��r|���|� |��}|�|cS��|� |��r��|D]<}tj |��}|dvr"|dkr tjn tjccS�=��dS) z%Get directionality from element text.F�rw�dirr�N)�bdi�script�style�textarearc��AL�R�Lr3)rr:�DIR_MAP�getrrer�r&rf� find_bidirX� unicodedata� bidirectional�ct� SEL_DIR_LTR� SEL_DIR_RTL)r(r[r~� directionr��c�bidis r)r6zCSSMatch.find_bidi/sO���%�%�b�u�%�5�5� M� M�D��{�{�4� � � �$�K�K�� �4�3M�3M�d�TY�[]�3^�3^�(_�(_�ae�f�f� ��L�L��&�&�*Z�Z�Z��(�(��.�.�[��)�����t�,�,���$� �L�L�L���%�%�d�+�+� ��� M� M��"�0��3�3���+�+�+�-1�S�[�[�2�>�>�b�n�L�L�L�L�L�,� M��tr+� lang_range�lang_tagc�x�d}t�d|�����}|�d��}|����d��}t |��}t |��}d}d} ||} || } |dkr|dkr | s| | krdS| dkr| | ks| dkr |dkr| sd}|dz }| dz } |r^||krX||} || } n#t $rd}Y�(wxYw| sd}�1| | kr|dz }nt | ��dkrd}�S| dz } |r||k�X|S)zFilter the language tags.Tr�rr�*F)� RE_WILD_STRIP�subre�splitr.� IndexError) r(r?r@r�ranges�subtags�length�slength�rindex�sindex�r�ss r)�extended_language_filterz!CSSMatch.extended_language_filterSs�����"�&�&�s�J�7�7�=�=�?�?� ��!�!�#�&�&���.�.�"�"�(�(��-�-���V�����g�,�,������ �6�N�� �F�O�� �Q�;�;�7�a�<�<��<�a�1�f�f��4� ��H�H��a���Q�#�X�X�'�Q�,�,�q�,��E��!� ���!� ��� ������v��A� ��F�O����� � � �����  ����� �����a����!� ����Q���1������ �a�K�F�5� �����8� s�+C4�4 D�D�attrr�r�c��d}|���r�d}|r%|j�|��}|�|dkrdSnd}|�|��D]�\}}|�||��\}} |�C|jr||ks1|js.t j|��t j|��kr|}nL�c|� ||kr|dkr�r|js+t j|��t j| ��krn|| kr��|}nH|�|��D]2\}}t j|��t j|��kr�0|}|S)z3Match attribute name and return value if it exists.NrB)r rr5r�r�rrre) r(r[rPr�r�r�r�r�r�rds r)�match_attribute_namezCSSMatch.match_attribute_name�s����� � #� #� %� %�) ��E�� ��_�(�(��0�0���:�&�C�-�-��4�����,�,�R�0�0� � ���1�#'�"6�"6�r�1�"=�"=�� �4��:�� ���� � �4�;� �4�:�VZ�K[�K[�_c�_i�jk�_l�_l�Kl�Kl� !������$��i���F�c�M�M��BF���D�J�t�$�$�� �4�(8�(8�8�8�8�SW�[_�S_�S_�������,�,�R�0�0� � ���1��:�d�#�#�t�z�!�}�}�4�4������ r+r8�ct.SelectorTagc�B�d}|�|��}|j�d��}|j�dn|j�|j��}|j� |� ||krd}n3|j�|jdkr|rd}n|jr|jdkr |�||krd}|S)z#Match the namespace of the element.Tr�NFrB)r"rr5r�)r(r[r8rr��default_namespace�tag_nss r)�match_namespacezCSSMatch.match_namespace�s������O�O�B�'�'� � �O�/�/��3�3���z�)���t��/B�/B�3�:�/N�/N�� �:� �#4�#@�Y�Rc�Ec�Ec��E�E��j�$���r�)9�)9�i�)9��E�E� �J� � �J�#� � �6�>�Y�&�5H�5H��E�� r+� attributes� tuple[ct.SelectorAttribute, ...]c�.�d}|r�|D]�}|�||j|j��}|jr|jr|jn|j}|�d}nIt |t��r|nd�|��}|��t|� |���d}n��|S)zMatch attributes.TNFr) rR� attributer�r�xml_type_pattern�patternrBr�r�r)r(r[rXr�a�tempr]r�s r)�match_attributeszCSSMatch.match_attributes�s����� � �� � ���0�0��Q�[�!�(�K�K��04� �a��@R�a�!�,�,�XY�Xa���<�!�E��E� *�4�� 5� 5�I���3�8�8�D�>�>���?���]�]�5�)�)�1�!�E��E�2�� r+c��|js |j�tj|j��n|j}|duo||�|��dfv S)zMatch tag name.NrB)rrdrrer&)r(r[r8rds r)� match_tagnamezCSSMatch.match_tagname�s\��-1�K�^�C�H�<P�� �3�8�$�$�$�VY�V^�� �� � 0� ����b�)�)�3�/� /� � r+�ct.SelectorTag | Nonec�n�d}|�0|�||��sd}|�||��sd}|S)zMatch the tag.TNF)rWrb)r(r[r8rs r)� match_tagzCSSMatch.match_tag�sM���� �?��'�'��C�0�0� ����%�%�b�#�.�.� ���� r+�relationc�.�d}t|dtj��r|S|djtkrX|�||j���}|s8|r6|�||��}|�||j���}|s|�6�n|djtkr5|�||j���}|r|�||��}n�|djtkrI|� |��}|s1|r/|�||��}|� |��}|s|�/nX|djtkrB|� |��}|r+|� |��r|�||��}|S)zMatch past relationship.Frr�) rBr9� SelectorNull�rel_type� REL_PARENTrkr�match_selectors�REL_CLOSE_PARENT� REL_SIBLINGr��REL_CLOSE_SIBLINGr:)r(r[rf�foundrmr�s r)�match_past_relationszCSSMatch.match_past_relations�s����� �h�q�k�2�?� 3� 3� ��L� �A�;� �:� -� -��_�_�R�4�3G�_�H�H�F�� Q�� Q��,�,�V�X�>�>������4�;O��P�P��� Q�� Q���a�[� !�%5� 5� 5��_�_�R�4�3G�_�H�H�F�� ?��,�,�V�X�>�>��� �a�[� !�[� 0� 0��'�'��+�+�G�� 5�� 5��,�,�W�h�?�?���+�+�G�4�4��� 5�� 5���a�[� !�%6� 6� 6��'�'��+�+�G�� @�4�;�;�w�/�/� @��,�,�W�h�?�?��� r+Frm� recursivec��d}|r|j}n|j}|||j���D]}|�||��}|rn�|S)zMatch future child.Fr�)r�rrrk)r(rmrfrqr�childrenr�s r)�match_future_childzCSSMatch.match_future_childsp���� � )��+�H�H��(�H��X�f��0D�E�E�E� � �E��(�(���9�9�E�� ��� �� r+c�r�d}t|dtj��r|S|djtkr|�||d��}n�|djt kr|�||��}n�|djtkrI|�|��}|s1|r/|� ||��}|�|��}|s|�/nX|djtkrB|�|��}|r+|� |��r|� ||��}|S)zMatch future relationship.FrT) rBr9rhri�REL_HAS_PARENTrt�REL_HAS_CLOSE_PARENT�REL_HAS_SIBLINGr�rk�REL_HAS_CLOSE_SIBLINGr:)r(r[rfror�s r)�match_future_relationszCSSMatch.match_future_relations'sB���� �h�q�k�2�?� 3� 3� ��L� �A�;� �>� 1� 1��+�+�B��$�?�?�E�E� �a�[� !�%9� 9� 9��+�+�B��9�9�E�E� �a�[� !�_� 4� 4��m�m�B�'�'�G�� 1�� 1��,�,�W�h�?�?���-�-��0�0��� 1�� 1���a�[� !�%:� :� :��m�m�B�'�'�G�� @�4�;�;�w�/�/� @��,�,�W�h�?�?��� r+c��d}t|dtj��s |dj�|S|dj�d��r|�||��}n|�||��}|S)z%Match relationship to other elements.FrN�:)rBr9rhri� startswithrzrp)r(r[rfros r)�match_relationszCSSMatch.match_relations>s����� �h�q�k�2�?� 3� 3� �x��{�7K�7S��L� �A�;� � *� *�3� /� /� <��/�/��H�=�=�E�E��-�-�b�(�;�;�E�� r+�ids�tuple[str, ...]c�R�d}|D]!}||�|dd��krd}n�"|S)zMatch element's ID.T�idr�F)r�)r(r[rro�is r)�match_idzCSSMatch.match_idMsK����� � �A��D�.�.�r�4��<�<�<�<�����=�� r+r�c�N�|�|��}d}|D] }||vrd}n� |S)zMatch element's classes.TF)r�)r(r[r��current_classesror=s r)� match_classeszCSSMatch.match_classesWsL���*�*�2�.�.����� � �A���'�'�����(�� r+c�h�|�|��}|r�|�|d���}|rs|�q|�|��s>|�|��r|���s|�|��rd}n|�|d���}|r|�q|r�|�|d���}|rs|�q|�|��s>|�|��r|���s|�|��rd}n|�|d���}|r|�q|S)zMatch element as root.Fr*)rnr�r:rZ�striprNr�)r(r[rnr�s r)� match_rootzCSSMatch.match_rootbs����,�,�r�"�"�� � E��'�'���'�7�7�G�� E�g�1��K�K��(�(�E�-1�-C�-C�G�-L�-L�E�QX�Q^�Q^�Q`�Q`�E��M�M�'�*�*�E�$�G�G�"�/�/��e�/�D�D�G�� E�g�1� � A��m�m�B�U�m�3�3�G�� A�g�1��K�K��(�(�A�-1�-C�-C�G�-L�-L�A�QX�Q^�Q^�Q`�Q`�A��M�M�'�*�*�A�$�G�G�"�m�m�G�%�m�@�@�G�� A�g�1��r+c��|j|uS)zMatch element as scope.)rrgs r)� match_scopezCSSMatch.match_scope|s���z�R��r+r�c��|�|��|�|��ko+|�|��|�|��kS)z!Match tag type for `nth` matches.)r&r")r(r[r�s r)�match_nth_tag_typezCSSMatch.match_nth_tag_type�sN���\�\�%� � �D�L�L��$4�$4� 4� <� �_�_�U� #� #�t���r�':�':� :� r+�nthc��d}|D�]I}d}|jr|�||j��s�n!|�|��}|�|�|��}|j}t |��dz }|r|nd}d} |j} |j} |j} d} d}|rdnd}| r| | z| zn| x}}| r�d}|dks||krs|dkr0d|z }|�|dkrn_d}| |z } | r| | z| zn| x}}d|z }||krn>n1||z }|�|dkrn/d}| |z } | r| | z| zn| x}}||z }||krn|}|dk�m||k�s| }| dkr#|dkr| }| |z } | r| | z| zn| x}}|dk�d}|} | r| | z| zn| x}}d|cxkr |dzkr�nn�d}|� |||dkd���D]x}||z }|� |��s�|jr|�||j��s�@|j r|� ||��s�^| dz } | |kr ||urd}nn||urn�y||urn3|}| |z } | dkrn%| r| | z| zn| }||krnd|cxkr |dzk��n|sn��K|S)zMatch `nth` elements.TFNrrry)rtrvrw) rrkrkr^rzr.r^�b�nrr:�of_typer�)r(r[r��matchedr�rmrz� last_indexr{�relative_indexr^r��var�count� count_incr�factor�idx�last_idx�adjust�diff_low�diff� diff_high�lowestr�s r)� match_nthzCSSMatch.match_nth�s������] �] �A��G��{� �4�#7�#7��A�K�#H�#H� ����_�_�R�(�(�F��~��0�0��4�4���6�D��V���q��J�"&�-�J�J�A�E��N���A���A��#�C��E��J��&�R�R�Q�F�.1�8�Q��Y��]�]�q� 8�C�(��& =����A�g�g��z�!1�!1��Q�w�w�#$�s�7��!�-�&�A�+�+�!�!#����+��:=�)D��U��Q���1�D��h� �3�w���8�+�+�!�,�%(�*�$4� �!�-�&�B�,�,�!�!"����+��:=�)D��U��Q���1�D��h�"�Z�/���9�,�,�!�$(� �+�A�g�g��z�!1�!1�4���q�5�5���(�(�!&����+��:=�)D��U��Q���1�D��h���(�(�"$�J���25�!<��U��Q���1�<��h��s�,�,�,�,�j�1�n�,�,�,�,�,���!�.�.�v�U�F�UV�J�]b�.�c�c���E��V�O�E��;�;�u�-�-�!� ��{�!�4�+?�+?��q�{�+S�+S�!� ��y�!��)@�)@��U�)K�)K�!� �"�a�'�N�%��,�,� �B�;�;�&*�G�G�!�E���{�{���#��B�;�;������#���1�9�9��'*�1�a�%�i�!�m�m����s�?�?��=�s�,�,�,�,�j�1�n�,�,�,�,�>� ��� ��r+c���d}|�|d���D]N}|�|��rd}n4|�|��rt�|��rd}n�O|S)z)Check if element is empty (if requested).TFr*)rr:rZ� RE_NOT_EMPTY�search)r(r[�is_emptyr�s r)� match_emptyzCSSMatch.match_empty�s������&�&�r��&�6�6� � �E��{�{�5�!�!� � �����'�'��.�.� �<�3F�3F�u�3M�3M� � ������r+�tuple[ct.SelectorList, ...]c�D�d}|D]}|�||��sd}�|S)zMatch selectors.TF)rk)r(r[rr�sels r)�match_subselectorszCSSMatch.match_subselectors�s;����� � �C��'�'��C�0�0� ����� r+�contains�tuple[ct.SelectorContains, ...]c���d}d}|D]u}|�@|jr|�||j���}n|�||j���}d}|jD]#}|jr|D] }||vrd}n� |rn �||vrd}n�$|sd}�v|S)z"Match element if it contains text.TNr�F)�ownr�rlr��text) r(r[r�r�content� contain_listror�r=s r)�match_containszCSSMatch.match_containss�������$� � �L����#�H�"�/�/��d�l�/�K�K�G�G�"�m�m�B�$�,�m�G�G�G��E�$�)� � ���#� �$�"�"���1�9�9�$(�E�!�E�%�������w��� $����'�� ����� r+c�:�d}d}|�|d���}|rN|�L|�|��dkr|�|��r|}n|�|d���}|r|�Ld}|jD]\}}||ur d}||urd}n�|s�|�|d���D]x}|�|��} | dkrnZ| dvrU|�|dd��} | r<t j| ��d kr$|j�||f��||urd}n�y|S) �Match default.FNTr��form)�input�buttonr<r��submit) rkr&rfrr�r�rrer�) r(r[rr�rm� found_form�f�tr�rdr�s r)� match_defaultzCSSMatch.match_default s�����������t��4�4��� A����|�|�F�#�#�v�-�-�$�2B�2B�6�2J�2J�-��������4��@�@�� � A���� ��-� � �D�A�q��D�y�y�!� ���7�7� �E��� �� ��-�-�d�d�-�C�C� � ���|�|�E�*�*���6�>�>��E��.�.�.��2�2�5�&�"�E�E�A���T�Z��]�]�h�6�6��1�8�8�$���G�G�G���;�;�$(�E����� r+c����d}tt��|d����}d�fd� }||��}d}�jD]\}}} ||ur||kr d}| durd}n�|�sd} ��|d� ��D]�} | |ur���| ��} | d kr�d} d}d}��| ��D]�\}}tj|��d krtj|��d krd} n;tj|��dkr ||krd}ntj|��d krd}| r|r|r|| ��|urd} n��| rn��| sd}�j� |||f��|S)r�Frdr[r"r#�bs4.Tag | Nonec����d}��|d���}|�Q��|��dkr��|��r|}n |}��|d���}|�|}n|�Q|S)zFind this input's form.NTr�r�)rkr&rf)r[r�rm� last_parentr(s �r)�get_parent_formz5CSSMatch.match_indeterminate.<locals>.get_parent_formMs�����D��_�_�R�4�_�8�8�F��,��<�<��'�'�6�1�1�d�6F�6F�v�6N�6N�1�!�D��$� �����4��@�@���>�&�D���,��Kr+Tr�r�r<�radio�checked)r[r"r#r�) r r�r�rr�r&r�rrer�)r(r[rrdr�r�r�r�r�r�r�r��tag_name�is_radio�check�has_namer�r�s` r)�match_indeterminatezCSSMatch.match_indeterminateGs ������C��3�3�B��?�?�@�@�� � � � � � ���r�"�"��� ��6� � �G�A�q�!��D�y�y�Q�$�Y�Y�!� ���9�9� �E����� H��G��-�-�d�d�-�C�C� � ���B�;�;���<�<��.�.���w�&�&�$�H�!�E�$�H� $� 4� 4�U� ;� ;� "� "���1��:�a�=�=�F�2�2�t�z�!�}�}��7O�7O�'+�H�H�!�Z��]�]�f�4�4��d���'+�H�H�!�Z��]�]�i�7�7�$(�E�#�"��"�(�"���u�?U�?U�Y]�?]�?]�&*�G�!�E�����E��� ��� � +� 2� 2�D�$��3F� G� G� G�� r+�langs�tuple[ct.SelectorLang, ...]c �>�d}|���}|j}|j}|}d}d} |s�|�|��} |�|��D]y\} } |�|| ��\} }|r| r!|jstj| ��n| dks2|r4| s2| tkr'|js|�tj|��n|dkr| }n�z|} |� ||j ���}|�| }|�|��}| }n|��|�#|j r|j D]}||dur|d}�|���|jr|�r�|j dk�r�d}dD][}d}|�||j ���D]6}|�|��|kr|�|��rd }|}n�7|sn�\|�r2|D]�}|�|��r�|�|��d kr�|�|��r�d}d}|�|��D]�\} } tj| ��d krtj| ��d krd }tj| ��d kr| }|rH|rF|}|j �t't(|��t't(|��f��n��|�n��|�/|j �t't(|��df��|�;|D]8}d}|D]-}|�|t't(|����rd }�.|sn�9|S)zMatch languages.FN�langr�rr�html)r��headT�metaz http-equivzcontent-languager�r�)r rjrr�r�r�rrre�NS_XMLrkrlrrdrr&rfr:r�r r�rO)r(r[r�r�has_nsrjrrm� found_langrzr�r�r��attr_nsrP�cacheror8r��c_langr��patternsr]s r)� match_langzCSSMatch.match_lang�s������)�)�+�+���y��!�4����� ���� ��*�*�6�2�2�K��,�,�V�4�4� � ���1� $� 4� 4�V�Q� ?� ?� ��� ��$/��KO�;�6]�d�j��m�m�m�\]�bh�5h�5h��6i�'2�6i�7>�&�7H�7H�15��[��AQ���D�)�)�)�W[�`f�f�f�"#�J��E���D��_�_�V�t�|�_�D�D�F��~���%)�%5�%5�d�%;�%;�"����)� �. � �$�"7� ��.� *� *���5��8�#�#�!&�q��J�� � �t�{� �7I� �d�i�[a�Na�Na��E�'� � ����!�.�.�v���.�N�N���E��|�|�E�*�*�c�1�1�d�6F�6F�u�6M�6M�1� $��!&��������E��� H�#���E��{�{�5�)�)� &�d�l�l�5�.A�.A�V�.K�.K�PT�P`�P`�ag�Ph�Ph�.K�!&��"&��$(�$8�$8��$?�$?�&�&�D�A�q�#�z�!�}�}� �<�<���A���Rd�Ad�Ad�)-��#�z�!�}�}� �9�9�*+��%�&�'�&�-4� � $� 5� <� <�d�3��o�o�t�TW�Yc�Od�Od�=e� f� f� f� %���!�-���.��%��)�0�0�$�s�D�/�/�2�1F�G�G�G� � !�!� � ����'�%�%�G��4�4�W�d�3� �>S�>S�T�T�%� $������E��� r+�directionalityc �`��|tjzr|tjzrdS|���|��sdSt�t j��|dd����d��}|dvr||kS�� |��}|r|�tj|kS�� |��}|dk}|dk}|dk}|r)t j��|d d����nd} |r| d kr|�tj|kS|r| d vs|r�|d kr�|r7d� �fd ��� |d���D����} n*tt��|dd����} | rS| D]@} tj| ��} | dvr&| dkr tjn tj}||kcS�Atj|kS|rtj|kS����|d���|��S|r|�|d krZ��|��}|�||kS|rtj|kS����|d���|��S����|d���|��S)zCheck directionality.FNr+r�)Nrr�r/r,r<�tel)r�r�r��url�emailrc3�F�K�|]}��|���|V��dSr�r�r�s �r)� <genexpr>z%CSSMatch.match_dir.<locals>.<genexpr>�s8�����w�w��Z^�Zp�Zp�qu�Zv�Zv�w��w�w�w�w�w�wr+Tr�r�r0r3)r9r:r;rfr4r5rrer�rnr&r�rsr r�r7r8� match_dirrkr6) r(r[r�r<rnrd�is_input� is_textarea�is_bdir�r�r=r>s ` r)r�zCSSMatch.match_dir�s��� �B�N� *� �~���/N� ��5� �:�T�-�-�b�1�1�:��5��K�K�� �4�+E�+E�b�%�QS�+T�+T� U� U�W[�\�\� � �I� %� %���.� .��,�,�r�"�"�� � 4�y�(��>�^�3� 3��|�|�B�����7�?���j�(� �����JR�Z�� �4�5�5�b�&�"�E�E�F�F�F�XZ�� � 4�����9�+<��>�^�3� 3�� W�%�#L�L�L�Q\�L�bk�op�bp�bp�� O����w�w�w�w��1B�1B�2�QU�1B�1V�1V�w�w�w�w�w����S�$�"<�"<�R��"�"M�"M�N�N��� 8��;�;�A�&�4�Q�7�7�D��/�/�/�6:�c�k�k�B�N�N�r�~� �(�N�:�:�:�:�0��~��7�7�� 8��~��7�7��>�>�$�/�/�"��/�"E�"E�~�V�V� V� � W�y�(�Y�!�^�^����r�*�*�I��$� �N�2�2�� 8��~��7�7��>�>�$�/�/�"��/�"E�"E�~�V�V� V��~�~�d�o�o�b�D�o�A�A�>�R�R�Rr+� conditionc ���d}tj|�|d����}t�|t t |�|dd������}t�|t t |�|dd������}|�|�dSt�|t t |�|dd������}|�P|dvr|�||krd}|s |�||krd}n5|d kr/|�|�||kr||kr||krd}n|�||krd}|s |�||krd}|tjzr| n|S) ac Match range. Behavior is modeled after what we see in browsers. Browsers seem to evaluate if the value is out of range, and if not, it is in range. So a missing value will not evaluate out of range; therefore, value is in range. Personally, I feel like this should evaluate as neither in or out of range. Fr<�minN�maxr�)r�rr�r�rrTr�) rrer�r�rr r�r9� SEL_IN_RANGE)r(r[r�� out_of_ranger��mn�mxr�s r)� match_rangezCSSMatch.match_ranges���� �� �4�5�5�b�&�A�A�B�B�� � � ��t�C��1K�1K�B�PU�W[�1\�1\�']�']� ^� ^�� � � ��t�C��1K�1K�B�PU�W[�1\�1\�']�']� ^� ^�� �:�"�*��5��"�"�5�$�s�D�4N�4N�r�SZ�\`�4a�4a�*b�*b�c�c�� � ��V�V�V��>�e�b�j�j�#'�L�#�(���5�2�:�:�#'�L���&����>�b�n��b����r�z�z�e�b�j�j�'+� ���~�%�"�*�*�'+� �'�,�B�N�u�r�z�z�'+� �#,�r��#>�P�<���L�Pr+c���|�|��}|duoH|�d��dkp/|�d��dkp|�|��duS)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�ryr|)r&�findr(r%s r)� match_definedzCSSMatch.match_defined=si���|�|�B���� �� � �� � �#���"�$�0�� � �#���"�$�0�����#�#�4�/�  r+c�@�d}|�|��}|dvrd}|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[rr�s r)�match_placeholder_shownz CSSMatch.match_placeholder_shownTs/�����-�-��#�#�� �j� � ��E�� r+c�n�d}|j}|j}|r#|j}|j}dti|_d|_|r|j�r�|D�]�}|}t |t j��r� |�||j ��s�<|j t j zr|� |��s�f|j t j zr|�|��s��|j t jzr|�|��s��|j t jzr|�|��s��|�||j��s��|j t jzr|�|��s��,|jr|�||j��s��P|jr|�||j��s��t|�||j��s���|j t:zr%|�||j t:z��s���|jr|� ||j��s���|j!r|�"||j!��s�� |j#r|�$||j#��s��1|j t j%zr|�&|��s��\|j t j'zr|�(|��s���|j tRzr%|�*||j tRz��s���|j+r|�,||j+��s���| }|r||_||_|S)z.Check if element matches one of the selectors.Fr�T)-�is_notrlrrr�rBr9rhrer8r� SEL_DEFINEDr��SEL_ROOTr�� SEL_SCOPEr��SEL_PLACEHOLDER_SHOWNr�r�r�� SEL_EMPTYr�rr�r�r�r`rX�RANGESr�r�r�rr�rfr~� SEL_DEFAULTr��SEL_INDETERMINATEr�� DIR_FLAGSr�r�r�) r(r[rrr�rlrr�selectors r)rkzCSSMatch.match_selectorscsi�����!���#�� � (���J�"�2�O�%�x�0�D�O�#'�D� ��= �$�,�= �%�< �< �����h���8�8����~�~�b�(�,�7�7����>�B�N�2��4�;M�;M�b�;Q�;Q����>�B�K�/������8K�8K����>�B�L�0���9I�9I�"�9M�9M����>�B�$<�<��T�Ea�Ea�bd�Ee�Ee����~�~�b�(�,�7�7����>�B�L�0���9I�9I�"�9M�9M����<��� � �b�(�,�(G�(G����#��D�,>�,>�r�8�CS�,T�,T����,�,�R��1D�E�E����>�F�*��4�3C�3C�B���Y_�H_�3`�3`����=������X�]�)K�)K����%��d�.E�.E�b�(�J\�.]�.]����$��T�-A�-A�"�h�FW�-X�-X����>�B�N�2��4�;M�;M�b�;Q�;Q����>�B�$8�8���AY�AY�Z\�A]�A]����>�I�-��d�n�n�R���Zc�Ic�6d�6d����$��T�-@�-@��X�EV�-W�-W���"� ��� � 3�(�D�O�#2�D� �� r+r�limit�Iterator[bs4.Tag]c#�K�|dkrdn|}|�|j��D]+}|�|��r|V�|�|dz}|dkrdS�,dS)z&Match all tags under the targeted tag.rN)r�r8r)r(r��limr�s r)�selectzCSSMatch.select�s~�����a�i�i�d�d�U���)�)�$�(�3�3� � �E��z�z�%� � � �� � � ��?��1�H�C��Q�w�w�����  � r+r�c��|j}d}|�3|�1|�|��r|}n|�|��}|�|�1|S)�Match closest ancestor.N)r8rrk)r(�current�closests r)rzCSSMatch.closest�sY���(�����o�'�"5��z�z�'�"�"� 3�!����/�/�'�2�2�� �o�'�"5� �r+� list[bs4.Tag]c�P���fd����j��D��S)zFilter tag's children.c�h��g|].}��|�����|���,|��/Sr5)rTr)r�r8r(s �r)r�z#CSSMatch.filter.<locals>.<listcomp>�sB���t�t�t��$�BZ�BZ�[^�B_�B_�t�dh�dn�dn�or�ds�ds�t��t�t�tr+)rsr8r/s`r)�filterzCSSMatch.filter�s0���u�t�t�t�t�0�0���:�:�t�t�t�tr+c��|�|�� o/|�|��o|�||j��S�zMatch.)rFr:rkrrgs r)rzCSSMatch.match�s@���;�;�r�?�?�"�c�t�{�{�2���c�4�;O�;O�PR�TX�Tb�;c�;c�cr+N) rrrr"rrrr�r#r$)r#r@)r[r"r#r�r�r�)r[r"r#ru)r?r�r@r�r#r@)r[r"rPr�r�r�r#r�)r[r"r8rSr#r@)r[r"rXrYr#r@)r[r"r8rcr#r@)r[r"rfrr#r@r�)rmr"rfrrqr@r#r@)r[r"rr�r#r@)r[r"r�r�r#r@)r[r"r�r"r#r@)r[r"r�r"r#r@)r[r"rr�r#r@)r[r"r�r�r#r@)r[r"r�r�r#r@)r[r"r�r�r#r@)r[r"r�r�r#r@)r[r"rrr#r@�r)r�r�r#r)r#r�)r#r)*r1r2r3r4r*r r"rfr&r(r6rOrRrWr`rbrerprtrzr~r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rkrrr rr5r+r)rr�sQ��������'B�'B�'B�'B�R6�6�6�6� � � � �/�/�/�/� R�R�R�R� X�X�X�X� "�"�"�"�H6�6�6�6�p3�3�3�3�j����*����& � � � � � � � �����8 � � � � �����. � � � ����� � � � �����4 � � � �  � � � �c�c�c�c�J � � � ���������8%�%�%�%�N;�;�;�;�zT�T�T�T�l9S�9S�9S�9S�v&Q�&Q�&Q�&Q�P � � � �. � � � �R�R�R�R�h � � � � � � � � �u�u�u�u� d�d�d�d�d�dr+rc���eZdZUdZded<ded<ded<ded <d ed <d Zd �fd� Zd!d�Zd"d�Zd#d�Z d"d�Z d$d%d�Z d$d&d�Z d'd�Z e Z�xZS)(� SoupSievez-Compiled Soup Sieve selector matching object.r�r]rrrrzdict[str, str]�customr�r)r]rrrr�_hash�ct.CustomSelectors | Nonec�T��t���|||||���dS)r&)r]rrrrN)�superr*)r(r]rrrr� __class__s �r)r*zSoupSieve.__init__�s?��� �������!��� � � � � � r+r8r"r#r@c�j�t|j||j|j���|��Sr )rrrrr�r(r8s r)rzSoupSieve.match�s-������T�_�d�j�I�I�O�O�PS�T�T�Tr+c�h�t|j||j|j�����S)r)rrrrrrs r)rzSoupSieve.closest�s*������T�_�d�j�I�I�Q�Q�S�S�Sr+�iterable�Iterable[bs4.Tag]rc���t�|��r3t�j|�j�j�����S�fd�|D��S)a� Filter. `CSSMatch` can cache certain searches for tags of the same document, so if we are given a tag, all tags are from the same document, and we can take advantage of the optimization. Any other kind of iterable could have tags from different documents or detached tags, so for those, we use a new `CSSMatch` for each item in the iterable. c�r��g|]3}t�|�����|���1|��4Sr5)rrTrr�s �r)r�z$SoupSieve.filter.<locals>.<listcomp>sB���m�m�m�T�X�5Q�5Q�RV�5W�5W�m�\`�\f�\f�gk�\l�\l�m�D�m�m�mr+)rr:rrrr )r(rs` r)r zSoupSieve.filtersZ��� �?�?�8� $� $� n��D�N�H�d�o�t�z�R�R�Y�Y�[�[� [�m�m�m�m�X�m�m�m� mr+c�H�|�|d���}|r|dndS)zSelect a single tag.r)r�rN)r)r(r8rws r)� select_onezSoupSieve.select_ones,���{�{�3�a�{�(�(���(�t�A�w�w�D�(r+rr�c�H�t|�||����S)zSelect the specified tags.)�list�iselect�r(r8r�s r)rzSoupSieve.selects ���D�L�L��e�,�,�-�-�-r+rc#�~K�t|j||j|j���|��Ed{V��dS)zIterate the specified tags.N)rrrrrr#s r)r"zSoupSieve.iselectsI�����D�N�C���$�*�M�M�T�T�UZ�[�[�[�[�[�[�[�[�[�[�[r+c �H�d|j�d|j�d|j�d|j�d� S)zRepresentation.zSoupSieve(pattern=z , namespaces=z , custom=z, flags=�))r]rrrr/s r)�__repr__zSoupSieve.__repr__#sK�� =��� =� =�d�o� =� =��k� =� =�-1�Z� =� =� =� r+) r]r�rrrrrrrr�)r8r"r#r@)r8r"r#r")rrr#rr)r8r"r�r�r#r)r8r"r�r�r#r)r#r�)r1r2r3r4�__annotations__� __slots__r*rrr rrr"r'�__str__� __classcell__)rs@r)rr�s"��������7�7��L�L�L�����$�$�$�$������J�J�J�R�I� � � � � � �$U�U�U�U� T�T�T�T� n�n�n�n�")�)�)�)� .�.�.�.�.� \�\�\�\�\�  � � � ��G�G�G�G�Gr+r);r4� __future__rrr�r�rerr9r7rC�typingrr r r r r �compiler�r�rjrlrmrnrvrwrxryr�r�r:r;r�r��SEL_OUT_OF_RANGEr�r4r rrrrr rCr�r�r�r�r�r�� DAYS_IN_WEEKr r7r�r� Immutabler�pickle_registerr5r+r)�<module>r4s�����"�"�"�"�"�"������������� � � � ����������� � � � �D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D��r�z�.�)�)� � �B�J�� '� '� �� ���� ����������� )�� /�� �N�R�^� +� � ��2�.� .�� �>� �>� � � �� ���G� H� H�� �"�*�B� C� C�� �2�:�B� C� C�� �"�*�A� B� B�� �"�*�S� T� T���b�j�k��� ��� �=�>�>� � � ���� � � � � ���� �"�"�"�"�"�"�"�"�(hm�hm�hm�hm�hm�hm�hm�hm�V d�d�d�d�d�d�d�d�Nwd�wd�wd�wd�wd�|�wd�wd�wd�tP�P�P�P�P�� �P�P�P�f���9�����r+
Memory