
    Bh[                        S r SSKJr  SSKJrJrJr   " S S5      r " S S\5      r " S	 S
\5      r	 " S S\5      r
 " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S \5      r " S! S"\5      r " S# S$\5      r " S% S&\5      r " S' S(\5      r " S) S*\5      r " S+ S,\5      r " S- S.\5      rg/)0z5

Data structures for the CSS abstract syntax tree.

    )ascii_lower   )_serialize_toserialize_identifierserialize_namec                   8    \ rS rSrSrSS/rS rS rS rS r	S	r
g
)Node   aL  Every node type inherits from this class,
which is never instantiated directly.

.. attribute:: type

    Each child class has a :attr:`type` class attribute
    with a unique string value.
    This allows checking for the node type with code like:

    .. code-block:: python

        if node.type == 'whitespace':

    instead of the more verbose:

    .. code-block:: python

        from tinycss2.ast import WhitespaceToken
        if isinstance(node, WhitespaceToken):

Every node also has these attributes and methods,
which are not repeated for brevity:

.. attribute:: source_line

    The line number of the start of the node in the CSS source.
    Starts at 1.

.. attribute:: source_column

    The column number within :attr:`source_line` of the start of the node
    in the CSS source.
    Starts at 1.

.. automethod:: serialize

source_linesource_columnc                     Xl         X l        g N)r   r   )selfr   r   s      >/var/www/html/env/lib/python3.13/site-packages/tinycss2/ast.py__init__Node.__init__5   s    &*    c                 4    U R                   R                  U S9$ )Nr   )repr_formatformatr   s    r   __repr__Node.__repr__9   s    &&D&11r   c                 ^    / nU R                  UR                  5        SR                  U5      $ )z>Serialize this node to CSS syntax and return a Unicode string. )r   appendjoin)r   chunkss     r   	serializeNode.serialize<   s'    6==)wwvr   c                     [         e)ztSerialize this node to CSS syntax, writing chunks as Unicode string
by calling the provided :obj:`write` callback.

)NotImplementedErrorr   writes     r   r   Node._serialize_toB   s
    
 "!r   )r   r   N)__name__
__module____qualname____firstlineno____doc__	__slots__r   r   r   r   __static_attributes__ r   r   r	   r	      s(    $J 0I+2"r   r	   c                   4    \ rS rSrSrSS/rSrSrS rS r	S	r
g
)
ParseErrorJ   aQ  A syntax error of some sort. May occur anywhere in the tree.

Syntax errors are not fatal in the parser
to allow for different error handling behaviors.
For example, an error in a Selector list makes the whole rule invalid,
but an error in a Media Query list only replaces one comma-separated query
with ``not all``.

.. autoattribute:: type

.. attribute:: kind

    Machine-readable string indicating the type of error.
    Example: ``'bad-url'``.

.. attribute:: message

    Human-readable explanation of the error, as a string.
    Could be translated, expanded to include details, etc.

kindmessageerrorz'<{self.__class__.__name__} {self.kind}>c                 H    [         R                  XU5        X0l        X@l        g r   )r	   r   r1   r2   )r   linecolumnr1   r2   s        r   r   ParseError.__init__d   s    d&)	r   c                     U R                   S:X  a	  U" S5        g U R                   S:X  a	  U" S5        g U R                   S;   a  U" U R                   5        g U R                   S;   a  g [        SU -  5      e)Nz
bad-stringz"[bad string]
zbad-urlzurl([bad url])z)]})eof-in-stringz
eof-in-urlzCan not serialize %r)r1   	TypeErrorr#   s     r   r   ParseError._serialize_toi   se    99$#$YY)#"#YY%$))YY992T9::r   )r1   r2   Nr&   r'   r(   r)   r*   r+   typer   r   r   r,   r-   r   r   r/   r/   J   s'    * #ID;K

;r   r/   c                   2    \ rS rSrSrS/rSrSrS rS r	Sr
g	)
Commentv   a  A CSS comment.

Comments can be ignored by passing ``skip_comments=True``
to functions such as :func:`~tinycss2.parse_component_value_list`.

.. autoattribute:: type

.. attribute:: value

    The content of the comment, between ``/*`` and ``*/``, as a string.

valuecomment(<{self.__class__.__name__} {self.value}>c                 <    [         R                  XU5        X0l        g r   r	   r   rA   r   r5   r6   rA   s       r   r   Comment.__init__       d&)
r   c                 H    U" S5        U" U R                   5        U" S5        g )Nz/*z*/rA   r#   s     r   r   Comment._serialize_to   s    ddjjdr   rJ   Nr<   r-   r   r   r?   r?   v   s$     	ID<Kr   r?   c                   2    \ rS rSrSrS/rSrSrS rS r	Sr
g	)
WhitespaceToken   zA :diagram:`whitespace-token`.

.. autoattribute:: type

.. attribute:: value

    The whitespace sequence, as a string, as in the original CSS source.


rA   
whitespacez<{self.__class__.__name__}>c                 <    [         R                  XU5        X0l        g r   rE   rF   s       r   r   WhitespaceToken.__init__   rH   r   c                 (    U" U R                   5        g r   rJ   r#   s     r   r   WhitespaceToken._serialize_to       djjr   rJ   Nr<   r-   r   r   rM   rM      s$    	 	ID/Kr   rM   c                   >    \ rS rSrSrS/rSrSrS rS r	S r
S	 rS
rg)LiteralToken   a[  Token that represents one or more characters as in the CSS source.

.. autoattribute:: type

.. attribute:: value

    A string of one to four characters.

Instances compare equal to their :attr:`value`,
so that these are equivalent:

.. code-block:: python

    if node == ';':
    if node.type == 'literal' and node.value == ';':

This regroups what `the specification`_ defines as separate token types:

.. _the specification: https://drafts.csswg.org/css-syntax-3/

* *<colon-token>* ``:``
* *<semicolon-token>* ``;``
* *<comma-token>* ``,``
* *<cdc-token>* ``-->``
* *<cdo-token>* ``<!--``
* *<include-match-token>* ``~=``
* *<dash-match-token>* ``|=``
* *<prefix-match-token>* ``^=``
* *<suffix-match-token>* ``$=``
* *<substring-match-token>* ``*=``
* *<column-token>* ``||``
* *<delim-token>* (a single ASCII character not part of any another token)

rA   literalrC   c                 <    [         R                  XU5        X0l        g r   rE   rF   s       r   r   LiteralToken.__init__   rH   r   c                 4    U R                   U:H  =(       d    XL $ r   rJ   r   others     r   __eq__LiteralToken.__eq__   s    zzU"3dm3r   c                     X:X  + $ r   r-   r\   s     r   __ne__LiteralToken.__ne__   s      r   c                 (    U" U R                   5        g r   rJ   r#   s     r   r   LiteralToken._serialize_to   rT   r   rJ   N)r&   r'   r(   r)   r*   r+   r=   r   r   r^   ra   r   r,   r-   r   r   rV   rV      s/    !D 	ID<K4!r   rV   c                   4    \ rS rSrSrSS/rSrSrS rS r	S	r
g
)
IdentToken   a@  An :diagram:`ident-token`.

.. autoattribute:: type

.. attribute:: value

    The unescaped value, as a Unicode string.

.. attribute:: lower_value

    Same as :attr:`value` but normalized to *ASCII lower case*,
    see :func:`~webencodings.ascii_lower`.
    This is the value to use when comparing to a CSS keyword.

rA   lower_valueidentrC   c                     [         R                  XU5        X0l         [        U5      U l        g ! [
         a	    X0l         g f = fr   r	   r   rA   r   rh   UnicodeEncodeErrorrF   s       r   r   IdentToken.__init__   <    d&)
	%*51D! 	%$	%   / AAc                 :    U" [        U R                  5      5        g r   r   rA   r#   s     r   r   IdentToken._serialize_to   s    "4::./r   rh   rA   Nr<   r-   r   r   rf   rf      s'     -(ID<K%0r   rf   c                   4    \ rS rSrSrSS/rSrSrS rS r	S	r
g
)AtKeywordToken   a  An :diagram:`at-keyword-token`.

.. code-block:: text

    '@' <value>

.. autoattribute:: type

.. attribute:: value

    The unescaped value, as a Unicode string, without the preceding ``@``.

.. attribute:: lower_value

    Same as :attr:`value` but normalized to *ASCII lower case*,
    see :func:`~webencodings.ascii_lower`.
    This is the value to use when comparing to a CSS at-keyword.

    .. code-block:: python

        if node.type == 'at-keyword' and node.lower_value == 'import':

rA   rh   z
at-keywordz)<{self.__class__.__name__} @{self.value}>c                     [         R                  XU5        X0l         [        U5      U l        g ! [
         a	    X0l         g f = fr   rk   rF   s       r   r   AtKeywordToken.__init__  rn   ro   c                 J    U" S5        U" [        U R                  5      5        g )N@rq   r#   s     r   r   AtKeywordToken._serialize_to!  s    c
"4::./r   rs   Nr<   r-   r   r   ru   ru      s'    . -(ID=K%0r   ru   c                   4    \ rS rSrSrSS/rSrSrS rS r	S	r
g
)	HashTokeni&  ar  A :diagram:`hash-token`.

.. code-block:: text

    '#' <value>

.. autoattribute:: type

.. attribute:: value

    The unescaped value, as a Unicode string, without the preceding ``#``.

.. attribute:: is_identifier

    A boolean, true if the CSS source for this token
    was ``#`` followed by a valid identifier.
    (Only such hash tokens are valid ID selectors.)

rA   is_identifierhashz)<{self.__class__.__name__} #{self.value}>c                 H    [         R                  XU5        X0l        X@l        g r   )r	   r   rA   r~   )r   r5   r6   rA   r~   s        r   r   HashToken.__init__>  s    d&)
*r   c                     U" S5        U R                   (       a  U" [        U R                  5      5        g U" [        U R                  5      5        g )N#)r~   r   rA   r   r#   s     r   r   HashToken._serialize_toC  s5    c
&tzz23.,-r   )r~   rA   Nr<   r-   r   r   r}   r}   &  s'    & /*ID=K+
.r   r}   c                   4    \ rS rSrSrSS/rSrSrS rS r	S	r
g
)StringTokeniK  zA :diagram:`string-token`.

.. code-block:: text

    '"' <value> '"'

.. autoattribute:: type

.. attribute:: value

    The unescaped value, as a Unicode string, without the quotes.

rA   representationstring1<{self.__class__.__name__} {self.representation}>c                 H    [         R                  XU5        X0l        X@l        g r   r	   r   rA   r   r   r5   r6   rA   r   s        r   r   StringToken.__init__]      d&)
,r   c                 (    U" U R                   5        g r   r   r#   s     r   r   StringToken._serialize_tob      d!!"r   r   rA   Nr<   r-   r   r   r   r   K  s(     *+IDEK-
#r   r   c                   4    \ rS rSrSrSS/rSrSrS rS r	S	r
g
)URLTokenif  zAn :diagram:`url-token`.

.. code-block:: text

    'url(' <value> ')'

.. autoattribute:: type

.. attribute:: value

    The unescaped URL, as a Unicode string, without the ``url(`` and ``)``
    markers.

rA   r   urlr   c                 H    [         R                  XU5        X0l        X@l        g r   r   r   s        r   r   URLToken.__init__y  r   r   c                 (    U" U R                   5        g r   r   r#   s     r   r   URLToken._serialize_to~  r   r   r   Nr<   r-   r   r   r   r   f  s(     *+IDEK-
#r   r   c                   4    \ rS rSrSrSS/rSrSrS rS r	S	r
g
)UnicodeRangeTokeni  a*  A :diagram:`unicode-range-token`.

.. autoattribute:: type

.. attribute:: start

    The start of the range, as an integer between 0 and 1114111.

.. attribute:: end

    The end of the range, as an integer between 0 and 1114111.
    Same as :attr:`start` if the source only specified one value.

startendzunicode-rangez3<{self.__class__.__name__} {self.start} {self.end}>c                 H    [         R                  XU5        X0l        X@l        g r   )r	   r   r   r   )r   r5   r6   r   r   s        r   r   UnicodeRangeToken.__init__  s    d&)
r   c                     U R                   U R                  :X  a  U" SU R                  -  5        g U" SU R                  U R                   4-  5        g )NzU+%XzU+%X-%Xr   r   r#   s     r   r   UnicodeRangeToken._serialize_to  s=    88tzz!&4::%&)tzz488445r   r   Nr<   r-   r   r   r   r     s'     % IDGK
6r   r   c                   4    \ rS rSrSr/ SQrSrSrS rS r	Sr
g	)
NumberTokeni  a  A :diagram:`number-token`.

.. autoattribute:: type

.. attribute:: value

    The numeric value as a :class:`float`.

.. attribute:: int_value

    The numeric value as an :class:`int`
    if :attr:`is_integer` is true, :obj:`None` otherwise.

.. attribute:: is_integer

    Whether the token was syntactically an integer, as a boolean.

.. attribute:: representation

    The CSS representation of the value, as a Unicode string.

rA   	int_value
is_integerr   numberr   c                 f    [         R                  XU5        X0l        X@l        US LU l        XPl        g r   r	   r   rA   r   r   r   r   r5   r6   rA   r   r   s         r   r   NumberToken.__init__  ,    d&)
"#4/,r   c                 (    U" U R                   5        g r   r   r#   s     r   r   NumberToken._serialize_to  r   r   r   r   r   rA   Nr<   r-   r   r   r   r     s#    , GIDEK-#r   r   c                   4    \ rS rSrSr/ SQrSrSrS rS r	Sr
g	)
PercentageTokeni  u  A :diagram:`percentage-token`.

.. code-block:: text

    <representation> '%'

.. autoattribute:: type

.. attribute:: value

    The value numeric as a :class:`float`.

.. attribute:: int_value

    The numeric value as an :class:`int`
    if the token was syntactically an integer,
    or :obj:`None`.

.. attribute:: is_integer

    Whether the token’s value was syntactically an integer, as a boolean.

.. attribute:: representation

    The CSS representation of the value without the unit,
    as a Unicode string.

r   
percentagez2<{self.__class__.__name__} {self.representation}%>c                 f    [         R                  XU5        X0l        X@l        US LU l        XPl        g r   r   r   s         r   r   PercentageToken.__init__  r   r   c                 8    U" U R                   5        U" S5        g )N%r   r#   s     r   r   PercentageToken._serialize_to  s    d!!"c
r   r   Nr<   r-   r   r   r   r     s#    8 GIDFK-r   r   c                   4    \ rS rSrSr/ SQrSrSrS rS r	Sr
g	)
DimensionTokeni  uq  A :diagram:`dimension-token`.

.. code-block:: text

    <representation> <unit>

.. autoattribute:: type

.. attribute:: value

    The value numeric as a :class:`float`.

.. attribute:: int_value

    The numeric value as an :class:`int`
    if the token was syntactically an integer,
    or :obj:`None`.

.. attribute:: is_integer

    Whether the token’s value was syntactically an integer, as a boolean.

.. attribute:: representation

    The CSS representation of the value without the unit,
    as a Unicode string.

.. attribute:: unit

    The unescaped unit, as a Unicode string.

.. attribute:: lower_unit

    Same as :attr:`unit` but normalized to *ASCII lower case*,
    see :func:`~webencodings.ascii_lower`.
    This is the value to use when comparing to a CSS unit.

    .. code-block:: python

        if node.type == 'dimension' and node.lower_unit == 'px':

)rA   r   r   r   unit
lower_unit	dimensionz<<{self.__class__.__name__} {self.representation}{self.unit}>c                     [         R                  XU5        X0l        X@l        US LU l        XPl        X`l        [        U5      U l        g r   )	r	   r   rA   r   r   r   r   r   r   )r   r5   r6   rA   r   r   r   s          r   r   DimensionToken.__init__%  s=    d&)
"#4/,	%d+r   c                     U" U R                   5        U R                  nUS;   d  UR                  S5      (       a  U" S5        U" [        USS  5      5        g U" [	        U5      5        g )N)eE)ze-zE-z\65 r   )r   r   
startswithr   r   )r   r$   r   s      r   r   DimensionToken._serialize_to.  sW    d!!"yy:!>!>'N.ab*+&t,-r   )r   r   r   r   r   rA   Nr<   r-   r   r   r   r     s%    )T'ID7K,.r   r   c                   2    \ rS rSrSrS/rSrSrS rS r	Sr
g	)
ParenthesesBlocki9  a  A :diagram:`()-block`.

.. code-block:: text

    '(' <content> ')'

.. autoattribute:: type

.. attribute:: content

    The content of the block, as list of :term:`component values`.
    The ``(`` and ``)`` markers themselves are not represented in the list.

contentz() blocku#   <{self.__class__.__name__} ( … )>c                 <    [         R                  XU5        X0l        g r   r	   r   r   r   r5   r6   r   s       r   r   ParenthesesBlock.__init__L      d&)r   c                 P    U" S5        [        U R                  U5        U" S5        g )N()r   r   r#   s     r   r   ParenthesesBlock._serialize_toP      c
dllE*c
r   r   Nr<   r-   r   r   r   r   9  $     ID7Kr   r   c                   2    \ rS rSrSrS/rSrSrS rS r	Sr
g	)
SquareBracketsBlockiV  a  A :diagram:`[]-block`.

.. code-block:: text

    '[' <content> ']'

.. autoattribute:: type

.. attribute:: content

    The content of the block, as list of :term:`component values`.
    The ``[`` and ``]`` markers themselves are not represented in the list.

r   z[] blocku#   <{self.__class__.__name__} [ … ]>c                 <    [         R                  XU5        X0l        g r   r   r   s       r   r   SquareBracketsBlock.__init__i  r   r   c                 P    U" S5        [        U R                  U5        U" S5        g )N[]r   r#   s     r   r   !SquareBracketsBlock._serialize_tom  r   r   r   Nr<   r-   r   r   r   r   V  r   r   r   c                   2    \ rS rSrSrS/rSrSrS rS r	Sr
g	)
CurlyBracketsBlockis  a  A :diagram:`{}-block`.

.. code-block:: text

    '{' <content> '}'

.. autoattribute:: type

.. attribute:: content

    The content of the block, as list of :term:`component values`.
    The ``[`` and ``]`` markers themselves are not represented in the list.

r   z{} blocku%   <{self.__class__.__name__} {{ … }}>c                 <    [         R                  XU5        X0l        g r   r   r   s       r   r   CurlyBracketsBlock.__init__  r   r   c                 P    U" S5        [        U R                  U5        U" S5        g N{}r   r#   s     r   r    CurlyBracketsBlock._serialize_to  r   r   r   Nr<   r-   r   r   r   r   s  s$     ID9Kr   r   c                   4    \ rS rSrSr/ SQrSrSrS rS r	Sr
g	)
FunctionBlocki  a  A :diagram:`function-block`.

.. code-block:: text

    <name> '(' <arguments> ')'

.. autoattribute:: type

.. attribute:: name

    The unescaped name of the function, as a Unicode string.

.. attribute:: lower_name

    Same as :attr:`name` but normalized to *ASCII lower case*,
    see :func:`~webencodings.ascii_lower`.
    This is the value to use when comparing to a CSS function name.

.. attribute:: arguments

    The arguments of the function, as list of :term:`component values`.
    The ``(`` and ``)`` markers themselves are not represented in the list.
    Commas are not special, but represented as :obj:`LiteralToken` objects
    in the list.

)name
lower_name	argumentsfunctionu.   <{self.__class__.__name__} {self.name}( … )>c                 h    [         R                  XU5        X0l        [        U5      U l        X@l        g r   )r	   r   r   r   r   r   )r   r5   r6   r   r   s        r   r   FunctionBlock.__init__  s&    d&)	%d+"r   c                    U" [        U R                  5      5        U" S5        [        U R                  U5        U n[	        U[
        5      (       a  UR                  (       a  [	        UR                  S   [        5      =(       a    UR                  S   R                  S:H  nU(       a  g UR                  S   n[	        U[
        5      (       a  UR                  (       a  M  U" S5        g )Nr   r9   r   )r   r   r   r   
isinstancer   r/   r1   )r   r$   r   eof_in_strings       r   r   FunctionBlock._serialize_to  s    "499-.c
dnne,=11h6H6H8--b1:> ?""2&++>  ))"-H =11h6H6H6H 	c
r   )r   r   r   Nr<   r-   r   r   r   r     s"    4 4IDBK#r   r   c                   4    \ rS rSrSr/ SQrSrSrS rS r	Sr
g	)
Declarationi  a  A (property or descriptor) :diagram:`declaration`.

.. code-block:: text

    <name> ':' <value>
    <name> ':' <value> '!important'

.. autoattribute:: type

.. attribute:: name

    The unescaped name, as a Unicode string.

.. attribute:: lower_name

    Same as :attr:`name` but normalized to *ASCII lower case*,
    see :func:`~webencodings.ascii_lower`.
    This is the value to use when comparing to
    a CSS property or descriptor name.

    .. code-block:: python

        if node.type == 'declaration' and node.lower_name == 'color':

.. attribute:: value

    The declaration value as a list of :term:`component values`:
    anything between ``:`` and
    the end of the declaration, or ``!important``.

.. attribute:: important

    A boolean, true if the declaration had an ``!important`` marker.
    It is up to the consumer to reject declarations that do not accept
    this flag, such as non-property descriptor declarations.

)r   r   rA   	importantdeclarationu,   <{self.__class__.__name__} {self.name}: …>c                 `    [         R                  XU5        X0l        X@l        XPl        X`l        g r   )r	   r   r   r   rA   r   )r   r5   r6   r   r   rA   r   s          r   r   Declaration.__init__  s$    d&)	$
"r   c                     U" [        U R                  5      5        U" S5        [        U R                  U5        U R                  (       a	  U" S5        g g )N:z
!important)r   r   r   rA   r   r#   s     r   r   Declaration._serialize_to  s=    "499-.c
djj%(>>, r   )r   r   r   rA   Nr<   r-   r   r   r   r     s#    $J =ID@K# r   r   c                   4    \ rS rSrSrSS/rSrSrS rS r	S	r
g
)QualifiedRulei  uu  A :diagram:`qualified rule`.

.. code-block:: text

    <prelude> '{' <content> '}'

The interpretation of qualified rules depend on their context.
At the top-level of a stylesheet
or in a conditional rule such as ``@media``,
they are **style rules** where the :attr:`prelude` is Selectors list
and the :attr:`content` is a list of property declarations.

.. autoattribute:: type

.. attribute:: prelude

    The rule’s prelude, the part before the {} block,
    as a list of :term:`component values`.

.. attribute:: content

    The rule’s content, the part inside the {} block,
    as a list of :term:`component values`.

preluder   zqualified-ruleu)   <{self.__class__.__name__} … {{ … }}>c                 H    [         R                  XU5        X0l        X@l        g r   )r	   r   r   r   )r   r5   r6   r   r   s        r   r   QualifiedRule.__init__  s    d&)r   c                 |    [        U R                  U5        U" S5        [        U R                  U5        U" S5        g r   )r   r   r   r#   s     r   r   QualifiedRule._serialize_to!  s,    dllE*c
dllE*c
r   )r   r   Nr<   r-   r   r   r   r     s)    2 I&ID$K
r   r   c                   4    \ rS rSrSr/ SQrSrSrS rS r	Sr
g	)
AtRulei(  u  An :diagram:`at-rule`.

.. code-block:: text

    @<at_keyword> <prelude> '{' <content> '}'
    @<at_keyword> <prelude> ';'

The interpretation of at-rules depend on their at-keyword
as well as their context.
Most types of at-rules (ie. at-keyword values)
are only allowed in some context,
and must either end with a {} block or a semicolon.

.. autoattribute:: type

.. attribute:: at_keyword

    The unescaped value of the rule’s at-keyword,
    without the ``@`` symbol, as a Unicode string.

.. attribute:: lower_at_keyword

    Same as :attr:`at_keyword` but normalized to *ASCII lower case*,
    see :func:`~webencodings.ascii_lower`.
    This is the value to use when comparing to a CSS at-keyword.

    .. code-block:: python

        if node.type == 'at-rule' and node.lower_at_keyword == 'import':

.. attribute:: prelude

    The rule’s prelude, the part before the {} block or semicolon,
    as a list of :term:`component values`.

.. attribute:: content

    The rule’s content, if any.
    The block’s content as a list of :term:`component values`
    for at-rules with a {} block,
    or :obj:`None` for at-rules ending with a semicolon.

)
at_keywordlower_at_keywordr   r   zat-ruleu<   <{self.__class__.__name__} @{self.at_keyword} … {{ … }}>c                 `    [         R                  XU5        X0l        X@l        XPl        X`l        g r   )r	   r   r  r  r   r   )r   r5   r6   r  r  r   r   s          r   r   AtRule.__init__Y  s%    d&)$ 0r   c                     U" S5        U" [        U R                  5      5        [        U R                  U5        U R                  c	  U" S5        g U" S5        [        U R                  U5        U" S5        g )Nrz   ;r   r   )r   r  r   r   r   r#   s     r   r   AtRule._serialize_toa  sV    c
"4??34dllE*<<#J#J$,,.#Jr   )r  r   r  r   Nr<   r-   r   r   r  r  (  s&    *V IID7K	r   r  N)r*   webencodingsr   
serializerr   r   r   r	   r/   r?   rM   rV   rf   ru   r}   r   r   r   r   r   r   r   r   r   r   r   r   r  r-   r   r   <module>r     s   % K K:" :"z); );Xd 6d .24 2j0 0@&0T &0R". ".J#$ #6#t #86 6>##$ ##L*d *ZB.T B.Jt :$ : :1D 1h6 $ 6 r(D (VBT Br   