Ë
    Eêñiv€  ã                  óP  — U 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	m
Z
 d dlmZmZmZmZmZ d dlmZmZmZmZ d dlmZ d dlmZmZ d d	lmZ d d
lmZ erd dlmZ e ee    z  Z!ee e!f   ee"e e!f      z  Z#dZ$de%d<   dZ&de%d<   e$e&gZ'de%d<    e(e$e&g«      Z)de%d<   e	 G d„ d«      «       Z*d,d„Z+d-d„Z, edddejZ                  ¬«      Z.de%d<   dZ/de%d<   d e/z  Z0de%d!<    ed"dd«      Z1de%d#<   d.d$„Z2d/d%„Z3d0d&„Z4e	 G d'„ d(ee e f   «      «       Z5d1d)„Z6	 	 	 	 	 	 	 	 d2d*„Z7	 	 	 	 d3d+„Z8y)4é    )ÚannotationsN)ÚIterableÚIteratorÚMappingÚMutableMapping)Ú	dataclassÚfield)ÚdateÚdatetimeÚtimeÚ	timedeltaÚtimezone)ÚTYPE_CHECKINGÚAnyÚFinalÚcast)Úparse)ÚStreamlitAPIExceptionÚ!StreamlitQueryParamDictValueError)Ú
ForwardMsg)Úget_script_run_ctx)ÚSupportsKeysAndGetItemÚembedz
Final[str]ÚEMBED_QUERY_PARAMÚembed_optionsÚEMBED_OPTIONS_QUERY_PARAMzFinal[list[str]]ÚEMBED_QUERY_PARAMS_KEYSzFinal[frozenset[str]]ÚPROTECTED_QUERY_PARAMSc                  ó:   — e Zd ZU dZded<   ded<   ded<   ded<   y)ÚWidgetBindingz<Represents a binding between a widget and a query parameter.ÚstrÚ	widget_idÚ	param_keyÚ
value_typeÚscript_hashN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__© ó    úf/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/streamlit/runtime/state/query_params.pyr    r    0   s   … áFàƒNØƒNØƒOØÔr,   r    c                ót   — t        | t        «      rt        | «      n| g}|D �cg c]
  }|dk7  sŒ	|‘Œ c}S c c}w )z¾Convert URL param value to list, filtering out empty strings.

    Empty strings are reserved to represent "cleared/empty" state, so they
    are not valid as individual array elements.
    Ú )Ú
isinstanceÚlist)ÚvalueÚpartsÚps      r-   Ú_to_non_empty_listr5   :   s4   € ô & e¬TÔ2ŒD�ŒK¸¸€EØÖ(�!  R£ŠAÒ(Ð(ùÒ(s   £
5®5c                óp   — t        | t        «      r"t        | «      dkD  xr t        d„ | D «       «      S | dk(  S )ap  Check if URL value represents an empty parameter (e.g., ?foo= with no value).

    Parameters
    ----------
    value : str | list[str]
        The URL parameter value(s).

    Returns
    -------
    bool
        True if all values are empty strings ("" or [""] or ["", ""], etc.).
        Returns False for mixed values like ["a", ""] which contain valid data.
    r   c              3  ó&   K  — | ]	  }|d k(  –— Œ y­w)r/   Nr+   )Ú.0Úvs     r-   ú	<genexpr>z%is_empty_url_value.<locals>.<genexpr>S   s   è ø€ Ò%=°! a¨2¥gÑ%=ùs   ‚r/   )r0   r1   ÚlenÚall)r2   s    r-   Úis_empty_url_valuer=   D   s6   € ô �%œÔÜ�5‹z˜A‰~Ò=¤#Ñ%=°uÔ%=Ó"=Ð=Ø�B‰;Ðr,   i²  é   ©Útzinfor   Ú
_UTC_EPOCHi@B Ú_SECONDS_TO_MICROSi€Q Ú_DAYS_TO_MICROSiÐ  Ú_TIME_BASE_DATEc                ój   — | j                   | j                  t        z  z   | j                  t        z  z   S ©N)ÚmicrosecondsÚsecondsrB   ÚdaysrC   )Údeltas    r-   Ú_delta_to_microsrK   _   s5   € ð 	×ÑØ
�-‰-Ô,Ñ
,ñ	-à
�*‰*”Ñ
&ñ	'ðr,   c                ó¼  — d| v r\	 t        j                  | «      }|j                  �yt        t	        |j                  t        j                  ¬«      t        z
  «      «      S d| v r_	 t        j                  | «      }t        j                  |t        «       t        j                  ¬«      }t        t	        |t        z
  «      «      S d| v rh	 t        j                  | «      }|j                  �yt        j                  t        |t        j                  ¬«      }t        t	        |t        z
  «      «      S y# t        $ r Y yw xY w# t        $ r Y yw xY w# t        $ r Y yw xY w)a”  Try to parse an ISO date/time/datetime string to microsecond timestamp.

    Supports the same ISO formats used by date/time slider URL parameters:
    - DATE: ``YYYY-MM-DD``
    - TIME: ``HH:MM`` or ``HH:MM:SS``
    - DATETIME: ``YYYY-MM-DDTHH:MM`` or ``YYYY-MM-DDTHH:MM:SS``

    Returns the microsecond float if parsing succeeds, or ``None`` if the
    string doesn't match any recognized format.
    ÚTNr?   ú-ú:)r   Úfromisoformatr@   ÚfloatrK   Úreplacer   ÚutcrA   Ú
ValueErrorr
   Úcombiner   rD   )ÚsÚdtÚdÚts       r-   Ú_try_parse_iso_to_microsrZ   i   s6  € ð ˆa�xð	Ü×'Ñ'¨Ó*ˆBØ�y‰yÐ$ØÜÔ)¨"¯*©*¼H¿L¹L¨*Ó*IÌJÑ*VÓWÓXÐXð
 ˆa�xð	Ü×"Ñ" 1Ó%ˆAÜ×!Ñ! !¤T£V´H·L±LÔAˆBÜÔ)¨"¬z©/Ó:Ó;Ð;ð
 ˆa�xð	Ü×"Ñ" 1Ó%ˆAØ�x‰xÐ#ØÜ×!Ñ!¤/°1¼X¿\¹\ÔJˆBÜÔ)¨"¬z©/Ó:Ó;Ð;ð øô/ ò 	Ùð	ûô ò 	Ùð	ûô ò 	Ùð	úsB   †!D1 ¨8D1 Á&AE  Ã	!E Ã+AE Ä1	D=Ä<D=Å 	EÅEÅ	EÅEc                ó   — t        | t        «      r| d   n| }t        | «      r%|xxdk(  r  g S xdk(  r  g S xdk(  r  g S  dk(  ry	 y|xdk(  r+ |j                  «       }|d	k(  ry
|dk(  ryt	        d|› �«      ‚xdk(  r 	 t        |«      S xdk(  r t        |«      S xdk(  r |S xdk(  r t        | «      S xdk(  r0 g }t        | «      D ]  }	 |j                  t        |«      «       Œ |S dk(  r/g }t        | «      D ]  }	 |j                  t        |«      «       Œ |S 	 |S # t        $ r |cY S w xY w# t        $ r3 t        |«      }|�|j                  |«       n|j                  |«       Y Œ¤w xY w# t        $ r |j                  |«       Y Œ‘w xY w)aŠ  Convert URL param to Python value based on WidgetState value type.

    Parameters
    ----------
    value : str | list[str]
        The URL parameter value(s).
    value_type : str
        The WidgetState value type (e.g., "bool_value", "string_value").

    Returns
    -------
    Any
        The parsed Python value appropriate for the widget type.
        For empty URL params (e.g., ?foo=):
        - Array types return []
        - string_value returns "" (empty string is valid)
        - Other types return None (signaling "cleared" state)

    Raises
    ------
    ValueError
        If the value cannot be parsed for the given type.
    éÿÿÿÿÚstring_array_valueÚint_array_valueÚdouble_array_valueÚstring_valuer/   NÚ
bool_valueÚtrueTÚfalseFzInvalid boolean value: Ú	int_valueÚdouble_value)
r0   r1   r=   ÚlowerrT   ÚintrQ   r5   ÚappendrZ   )r2   r$   ÚvalÚ	lower_valÚresult_doubleÚpartÚmicrosÚ
result_ints           r-   Úparse_url_paramro   •   sÈ  € ô2 " %¬Ô.ˆ%�Š)°E€Cô ˜%Ô ØØPÔ%ÑPØ�	ô ):ÑPØ�	ô =QÑPØ�	ð QãØØàà
ÝØŸ	™	›ˆIØ˜FÒ"ØØ˜GÒ#ØÜÐ6°s°eÐ<Ó=Ð=ÝðÜ˜3“x�õ Ü˜“:ÐÝØˆJÝ!ô & eÓ,Ð,Ý!ð 02ˆMÜ*¨5Ó1ò 
3�ð	3Ø!×(Ñ(¬¨t«Õ5ð
3ð !Ð Ûð +-ˆJÜ*¨5Ó1ò ,�ð,Ø×%Ñ%¤c¨$£iÕ0ð,ð
 ÐØàˆJøôM ò Ø’
ðûô" "ò 3ô 6°dÓ;�FØÐ)Ø%×,Ñ,¨VÕ4à%×,Ñ,¨TÔ2ùð3ûô  "ò ,Ø×%Ñ% dÖ+ð,ús6   Â 
D  ÃD1Ã?E0Ä D.Ä-D.Ä19E-Å,E-Å0FÆFc                  óÈ  — e Zd ZU dZ ee¬«      Zded<    ee¬«      Zded<    ee¬«      Z	ded<    ee¬«      Z
ded	<   d*d
„Zd+d„Zd,d„Zd,d„Zd-d„Z	 d.	 	 	 	 	 d/d„Zd0d„Zd1d„Zd2d„Zd3d„Zd3d„Zd4d„Z	 	 	 	 d5d„Zd6d„Zd7d8d„Z	 	 	 	 	 	 	 	 	 	 d9d„Zd:d„Zd:d„Zd;d„Zd<d„Zd=d„Zd;d„Z d;d „Z!d;d!„Z"d>d"„Z#d3d#„Z$d?d$„Z%d@d%„Z&d@d&„Z'	 dA	 	 	 	 	 dBd(„Z(	 	 dC	 	 	 	 	 	 	 dDd)„Z)y')EÚQueryParamszàA lightweight wrapper of a dict that sends forwardMsgs when state changes.
    It stores str keys with str and List[str] values.

    Also manages widget bindings to query parameters for the bind="query-params" feature.
    )Údefault_factoryúdict[str, list[str] | str]Ú_query_paramszdict[str, WidgetBinding]Ú_bindings_by_paramÚ_bindings_by_widgetzdict[str, list[str]]Ú_initial_query_paramsc                ó:   — t        d„ | j                  D «       «      S )Nc              3  óL   K  — | ]  }|j                  «       t        vr|–— Œ y ­wrF   )rf   r   )r8   Úkeys     r-   r:   z'QueryParams.__iter__.<locals>.<genexpr>  s'   è ø€ ò 
àØ�y‰y‹{Ô"9Ñ9ô ñ
ùs   ‚"$)Úiterrt   ©Úselfs    r-   Ú__iter__zQueryParams.__iter__  s"   € Üñ 
à×)Ñ)ô
ó 
ð 	
r,   c                ó  — |j                  «       t        v rt        t        |«      «      ‚	 | j                  |   }t        |t        «      rt        |«      dk(  ry|d   S |S # t        $ r t        t        |«      «      ‚w xY w)z·Retrieves a value for a given key in query parameters.
        Returns the last item in a list or an empty string if empty.
        If the key is not present, raise KeyError.
        r   r/   r\   )rf   r   ÚKeyErrorÚmissing_key_error_messagert   r0   r1   r;   ©r}   rz   r2   s      r-   Ú__getitem__zQueryParams.__getitem__  s€   € ð
 �9‰9‹;Ô1Ñ1ÜÔ4°SÓ9Ó:Ð:ð		;Ø×&Ñ& sÑ+ˆEÜ˜%¤Ô&Ü�u“: ’?Øà˜R‘yÐ ØˆLøÜò 	;ÜÔ4°SÓ9Ó:Ð:ð	;ús   ¬-A! ÁA! ÁA! Á!A?c                óˆ   — | j                  |«      rt        d|› d�«      ‚| j                  ||«       | j                  «        y )Nú%Cannot directly set query parameter 'ú=' - it is bound to a widget. Modify the widget value instead.)Úis_boundr   Ú_set_item_internalÚ_send_query_param_msgr‚   s      r-   Ú__setitem__zQueryParams.__setitem__  sL   € à�=‰=˜ÔÜ'Ø7¸°uð =Lð Móð ð 	×Ñ  UÔ+Ø×"Ñ"Õ$r,   c                ó2   — t        | j                  ||«       y rF   )Ú_set_item_in_dictrt   r‚   s      r-   rˆ   zQueryParams._set_item_internal)  s   € Ü˜$×,Ñ,¨c°5Õ9r,   c                ó  — |j                  «       t        v rt        t        |«      «      ‚| j	                  |«      rt        d|› d�«      ‚	 | j                  |= | j                  «        y # t        $ r t        t        |«      «      ‚w xY w)Nz(Cannot directly delete query parameter 'r†   )rf   r   r€   r�   r‡   r   rt   r‰   ©r}   rz   s     r-   Ú__delitem__zQueryParams.__delitem__,  sŽ   € Ø�9‰9‹;Ô1Ñ1ÜÔ4°SÓ9Ó:Ð:à�=‰=˜ÔÜ'Ø:¸3¸%ð @Lð Móð ð	;Ø×"Ñ" 3Ð'Ø×&Ñ&Õ(øÜò 	;ÜÔ4°SÓ9Ó:Ð:ð	;ús   ÁA* Á*Bc               ó4  — t        |d«      rFt        |d«      r:t        d|«      }t        |j                  «       «      }|D �cg c]	  }|||   f‘Œ }}nt        |«      }|D ��cg c]  \  }}|‘Œ	 }	}}|	j	                  |j                  «       «       |	D ]"  }| j                  |«      sŒt        d|› d�«      ‚ |D ]  \  }}
| j                  ||
«       Œ |j                  «       D ]  \  }}
| j                  ||
«       Œ | j                  «        y c c}w c c}}w )NÚkeysrƒ   ú0SupportsKeysAndGetItem[str, str | Iterable[str]]r…   r†   )
Úhasattrr   r1   r‘   Úextendr‡   r   rˆ   Úitemsr‰   )r}   ÚotherÚkwdsÚ
other_dictr‘   ÚkÚother_as_listrz   Ú_Úkeys_to_updater2   s              r-   ÚupdatezQueryParams.update;  s,  € ô �5˜&Ô!¤g¨e°]Ô&CÜÐPÐRWÓXˆJÜ˜
Ÿ™Ó)Ó*ˆDØ9=Ö>°A˜a ¨A¡Ò/Ð>ˆMÑ>ô ! ›KˆMð -:×:¡& # qš#Ð:ˆÑ:Ø×Ñ˜dŸi™i›kÔ*ð "ò 	ˆCØ�}‰}˜SÕ!Ü+Ø;¸C¸5ð APð Qóð ð	ð (ò 	0‰JˆC�Ø×#Ñ# C¨Õ/ð	0àŸ*™*›,ò 	0‰JˆC�Ø×#Ñ# C¨Õ/ð	0à×"Ñ"Õ$ùò- ?ùó ;s   ÁDÁ#Dc                ó–   — || j                   vs|j                  «       t        v rg S | j                   |   }t        |t        «      r|S |gS rF   )rt   rf   r   r0   r1   r‚   s      r-   Úget_allzQueryParams.get_alld  sI   € Ø�d×(Ñ(Ñ(¨C¯I©I«KÔ;RÑ,RØˆIØ×"Ñ" 3Ñ'ˆÜ" 5¬$Ô/ˆuÐ<°e°WÐ<r,   c                ó~   — t        | j                  D �ch c]  }|j                  «       t        vr|’Œ c}«      S c c}w rF   )r;   rt   rf   r   rŽ   s     r-   Ú__len__zQueryParams.__len__j  sA   € Üð  ×-Ñ-öàØ—9‘9“;Ô&=Ñ=ò òó
ð 	
ùòs   ”:c                ó,   — t        | j                  «      S rF   )r!   rt   r|   s    r-   Ú__str__zQueryParams.__str__s  s   € Ü�4×%Ñ%Ó&Ð&r,   c                óê   — t        «       }|€y t        «       }t        j                  | j                  d¬«      |j
                  _        |j
                  j                  |_        |j                  |«       y )NT©Údoseq)r   r   r   Ú	urlencodert   Úpage_info_changedÚquery_stringÚenqueue)r}   ÚctxÚmsgs      r-   r‰   z!QueryParams._send_query_param_msgv  s]   € Ü Ó"ˆØˆ;Øä‹lˆÜ-2¯_©_Ø×Ñ dô.
ˆ×ÑÔ*ð ×0Ñ0×=Ñ=ˆÔØ�‰�CÕr,   c                óö   — | j                   D �cg c]  }| j                  |«      sŒ|‘Œ }}|r%t        ddj                  d„ |D «       «      › d�«      ‚| j	                  d¬«       | j                  «        y c c}w )NzDCannot clear query parameters - the following are bound to widgets: z, c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrF   )Úrepr)r8   r™   s     r-   r:   z$QueryParams.clear.<locals>.<genexpr>ˆ  s   è ø€ Ò;¨œT !ŸWÑ;ùs   ‚zA. Modify the widget values instead, or remove the bind parameter.T©Úpreserve_embed)rt   r‡   r   ÚjoinÚclear_with_no_forward_msgr‰   )r}   rz   Úbound_paramss      r-   ÚclearzQueryParams.clear‚  s   € à'+×'9Ñ'9ÖP ¸T¿]¹]È3Õ=OšÐPˆÐPÙÜ'ØVØ—9‘9Ñ;¨lÔ;Ó;Ð<ð =RðSóð ð
 	×&Ñ&°dÐ&Ô;Ø×"Ñ"Õ$ùò Qs
   �A6¦A6c                ót   — | j                   D �ci c]  }|j                  «       t        vr|| |   “Œ  c}S c c}w rF   )rt   rf   r   rŽ   s     r-   Úto_dictzQueryParams.to_dictŽ  sA   € ð ×)Ñ)ö
àØ�y‰y‹{Ô"9Ñ9ð ��c‘‰Nò
ð 	
ùò 
s   �#5c                óª   — | j                   j                  «       }| j                  d¬«       	 | j                  |«       y # t        $ r	 || _         ‚ w xY w)NTr°   )rt   Úcopyr³   r�   r   )r}   Ú_dictÚ	old_values      r-   Ú	from_dictzQueryParams.from_dict–  sT   € ð
 ×&Ñ&×+Ñ+Ó-ˆ	Ø×&Ñ&°dÐ&Ô;ð	Ø�K‰K˜ÕøÜ$ò 	à!*ˆDÔØð	ús   ®A  Á Ac                ó"   — || j                   |<   y rF   ©rt   )r}   rz   ri   s      r-   Úset_with_no_forward_msgz#QueryParams.set_with_no_forward_msg¤  s   € Ø"%ˆ×Ñ˜3Òr,   c                ó¦   — | j                   j                  «       D ��ci c]   \  }}|j                  «       t        v r|r||“Œ" c}}| _         y c c}}w rF   )rt   r•   rf   r   )r}   r±   rz   r2   s       r-   r³   z%QueryParams.clear_with_no_forward_msg§  sL   € ð #×0Ñ0×6Ñ6Ó8÷
á��UØ�y‰y‹{Ô5Ñ5¹.ð �‰Jó
ˆÕùó 
s   ž%Ac           	     óh  — |j                  «       t        v rt        d|› dt        › dt        › d�«      ‚| j
                  j                  |«      }|r5|j                  |k7  r&| j                  j                  |j                  d«       t        ||||¬«      }|| j
                  |<   || j                  |<   y)aê  Register a widget binding to a query parameter.

        If another widget was previously bound to this param_key, its binding
        is replaced. The old widget's entry in _bindings_by_widget is cleaned up
        to prevent orphaned references.

        Parameters
        ----------
        param_key : str
            The query parameter key (same as the widget's user key).
        widget_id : str
            The unique widget ID.
        value_type : str
            The WidgetState value type (e.g., "bool_value", "string_value").
        script_hash : str
            The script hash for MPA support.

        Raises
        ------
        StreamlitAPIException
            If the parameter is protected (embed, embed_options).
        z)Cannot bind to reserved query parameter 'z'. 'z' and 'z:' are used internally for Streamlit's embed functionality.N)r"   r#   r$   r%   )rf   r   r   r   r   ru   Úgetr"   rv   Úpopr    )r}   r#   r"   r$   r%   Úold_bindingÚbindings          r-   Úbind_widgetzQueryParams.bind_widget®  sÅ   € ð: �?‰?ÓÔ 6Ñ6Ü'Ø;¸I¸;ð GÜ%Ð& gÔ.GÐ-Hð IGðHóð ð ×-Ñ-×1Ñ1°)Ó<ˆÙ˜;×0Ñ0°IÒ=Ø×$Ñ$×(Ñ(¨×)>Ñ)>ÀÔEäØØØ!Ø#ô	
ˆð .5ˆ×Ñ 	Ñ*Ø.5ˆ× Ñ  Ò+r,   c                óŽ   — | j                   j                  |d«      }|r'| j                  j                  |j                  d«       yy)z‚Remove a widget binding.

        Parameters
        ----------
        widget_id : str
            The unique widget ID.
        N)rv   rÃ   ru   r#   )r}   r"   rÅ   s      r-   Úunbind_widgetzQueryParams.unbind_widgetà  s@   € ð ×*Ñ*×.Ñ.¨y¸$Ó?ˆÙØ×#Ñ#×'Ñ'¨×(9Ñ(9¸4Õ@ð r,   c                óÒ   — | j                   j                  |«      }|€y|j                  }| j                  |«       || j                  v r| j                  |= | j                  «        yy)a·  Remove a widget binding and its associated query param from the URL.

        Unlike ``unbind_widget`` which only removes the internal tracking, this
        method also deletes the query parameter value and sends a forward
        message so the frontend URL is updated. It is a no-op when no binding
        exists for *widget_id*.

        Parameters
        ----------
        widget_id : str
            The unique widget ID.
        N)rv   rÂ   r#   rÈ   rt   r‰   )r}   r"   rÅ   r#   s       r-   Úunbind_and_clear_paramz"QueryParams.unbind_and_clear_paramì  sh   € ð ×*Ñ*×.Ñ.¨yÓ9ˆØˆ?Øà×%Ñ%ˆ	Ø×Ñ˜9Ô%Ø˜×*Ñ*Ñ*Ø×"Ñ" 9Ð-Ø×&Ñ&Õ(ð +r,   c                ó   — || j                   v S )a‡  Check if a query parameter is bound to a widget.

        Note: This check is case-sensitive, meaning "Foo" and "foo" are treated
        as different parameters. This is intentional because Python keys are
        case-sensitive and users explicitly choose their parameter names via
        the widget's `key` argument. This differs from embed parameter checks
        which are case-insensitive for URL compatibility.

        Parameters
        ----------
        param_key : str
            The query parameter key (case-sensitive).

        Returns
        -------
        bool
            True if the parameter is bound to a widget.
        )ru   ©r}   r#   s     r-   r‡   zQueryParams.is_bound  s   € ð& ˜D×3Ñ3Ð3Ð3r,   c                ó8   — | j                   j                  |«      S )a  Get the binding for a query parameter.

        Parameters
        ----------
        param_key : str
            The query parameter key.

        Returns
        -------
        WidgetBinding | None
            The binding if found, None otherwise.
        )ru   rÂ   rÌ   s     r-   Úget_binding_for_paramz!QueryParams.get_binding_for_param  s   € ð ×&Ñ&×*Ñ*¨9Ó5Ð5r,   c                ó8   — | j                   j                  |«      S )z÷Get the binding for a widget.

        Parameters
        ----------
        widget_id : str
            The unique widget ID.

        Returns
        -------
        WidgetBinding | None
            The binding if found, None otherwise.
        )rv   rÂ   )r}   r"   s     r-   Úget_binding_for_widgetz"QueryParams.get_binding_for_widget'  s   € ð ×'Ñ'×+Ñ+¨IÓ6Ð6r,   c                ó   — || j                   v S )z2Return whether a query parameter currently exists.r¾   rÌ   s     r-   Ú	has_paramzQueryParams.has_param6  s   € à˜D×.Ñ.Ð.Ð.r,   c                ó\   — || j                   v r| j                   |= | j                  «        yy)aö  Remove a query parameter without protection checks.

        This is an internal method for use by SessionState when clearing
        invalid URL-seeded values. It bypasses the bound param protection
        since the binding system itself needs to clear these values.

        Parameters
        ----------
        param_key : str
            The query parameter key to remove.

        Returns
        -------
        bool
            True if the param was removed, False if it didn't exist.
        TF)rt   r‰   rÌ   s     r-   Úremove_paramzQueryParams.remove_param:  s2   € ð" ˜×*Ñ*Ñ*Ø×"Ñ" 9Ð-Ø×&Ñ&Ô(ØØr,   c                ó<   — || j                   v r| j                   |= yy)zýRemove a query parameter without sending a forward message.

        This is used for backend-only cache cleanup when the frontend URL has
        already removed the parameter (for example, default-value collapse on a
        same-page rerun).
        TFr¾   rÌ   s     r-   Údiscard_param_no_forward_msgz(QueryParams.discard_param_no_forward_msgQ  s&   € ð ˜×*Ñ*Ñ*Ø×"Ñ" 9Ð-ØØr,   c                ó@   — t        j                  |d¬«      }|| _        y)zÍStore the initial query params from the URL for session state seeding.

        Parameters
        ----------
        query_string : str
            The URL query string (without the leading '?').
        T©Úkeep_blank_valuesN)r   Úparse_qsrw   )r}   r©   Úparseds      r-   Úset_initial_query_paramsz$QueryParams.set_initial_query_params]  s   € ô —‘ ÀÔEˆØ%+ˆÕ"r,   c           	     óœ   — | j                   j                  «       D ��ci c]  \  }}|t        |t        «      r|n|g“Œ c}}| _        yc c}}w )aŒ  Set _initial_query_params from the current filtered _query_params.

        This is called after MPA page transitions where populate_from_query_string()
        has filtered out params bound to widgets on other pages. Using this ensures
        widget seeding only uses params that are valid for the current page, preventing
        stale values from previous pages from leaking through.
        N)rt   r•   r0   r1   rw   )r}   r™   r9   s      r-   Ú%set_initial_query_params_from_currentz1QueryParams.set_initial_query_params_from_currenth  sG   € ð >B×=OÑ=O×=UÑ=UÓ=W÷&
Ù59°Q¸ˆA”J˜q¤$Ô'‰q¨a¨SÑ0ó&
ˆÕ"ùó &
s   ž Ac                óh   — | j                   j                  |«      }|€yt        |«      dk(  r|d   S |S )a`  Get the initial URL value for a query parameter.

        This is used for seeding session state on initial page load.

        Parameters
        ----------
        param_key : str
            The query parameter key.

        Returns
        -------
        str | list[str] | None
            The initial value(s) if present, None otherwise.
        Nr>   r   )rw   rÂ   r;   )r}   r#   Úvaluess      r-   Úget_initial_valuezQueryParams.get_initial_valuev  s=   € ð ×+Ñ+×/Ñ/°	Ó:ˆØˆ>ØÜˆv‹;˜!ÒØ˜!‘9ÐØˆr,   c                ó¶  — dd„}|dv rst        |t        t        f«      rD|D �cg c]  }|dk(  r ||«      n
t        |«      ‘Œ c}| j                  |<   | j                  «        y|dk(  r ||«      n
t        |«      }n:|dk(  r*t        |t        «      rt        |«      j                  «       }nt        |«      }|| j                  |<   | j                  «        yc c}w )a  Set a corrected value for a query parameter.

        This is called when URL auto-correction is needed (e.g., after clamping
        a value to min/max bounds). It updates both the internal query params
        and sends a forward message to update the frontend URL.

        Parameters
        ----------
        param_key : str
            The query parameter key.
        value : Any
            The corrected value to set.
        value_type : str
            The WidgetState value type (e.g., "double_value", "int_value").
        c                ó¦   — t        | t        «      r7t        j                  | «      r"| t	        | «      k(  rt        t	        | «      «      S t        | «      S )zÕFormat a number, using integer format if value is a whole number.

            Examples: 5.0 -> "5", 5.5 -> "5.5", 5 -> "5"
            Handles special float values (NaN, Inf) by returning them as-is.
            )r0   rQ   ÚmathÚisfiniterg   r!   )r9   s    r-   Úformat_numberz6QueryParams.set_corrected_value.<locals>.format_number�  s:   € ô ˜!œUÔ#¬¯©°aÔ(8¸QÄ#ÀaÃ&º[Üœ3˜q›6“{Ð"Ü�q“6ˆMr,   >   r^   r_   r]   r_   Nra   )r9   r   Úreturnr!   )r0   r1   Útupler!   rt   r‰   Úboolrf   )r}   r#   r2   r$   ræ   r9   Ú	str_values          r-   Úset_corrected_valuezQueryParams.set_corrected_valueŒ  så   € ó"
	ð ð 
ñ 
ô
 ˜%¤$¬ Ô/ð #ö1àð )3Ð6JÒ(J‘M !Ô$ÔPSÐTUÓPVÑVò1�×"Ñ" 9Ñ-ð ×*Ñ*Ô,Øð Ð!5Ò5ñ ˜eÔ$ä˜“Zñ ð
 ˜<Ò'¬J°u¼dÔ,CÜ˜E›
×(Ñ(Ó*‰Iä˜E›
ˆIà(1ˆ×Ñ˜9Ñ%Ø×"Ñ"Õ$ùò#1s   £Cc                ó*   — | j                  |||«       y rF   )rë   )r}   r#   r2   r$   s       r-   Ú_set_corrected_valuez QueryParams._set_corrected_valueÆ  s   € Ø× Ñ  ¨E°:Õ>r,   Nc                ó,  — t        j                  |d¬«      }| j                  «        g }|j                  «       D ]­  \  }}| j                  j                  |«      }d}|�-|�+|j                  |vr|j                  |j                  «       d}|sŒUt        |«      dk(  r| j                  |d¬«       Œwt        |«      dk(  r| j                  ||d	   ¬«       Œœ| j                  ||«       Œ¯ |D ]  }	| j                  |	«       Œ |r| j                  «        yy)
a­  Populate query params from a URL query string.

        Clears current params and repopulates from the URL. When valid_script_hashes
        is provided (for MPA page transitions), filters out params bound to other pages.

        Parameters
        ----------
        query_string : str
            The raw query string from the URL (e.g., "foo=bar&baz=qux").
        valid_script_hashes : set[str] | None
            If provided, only keep params that are:
            - Unbound (no widget binding)
            - Bound to a widget with script_hash in this set
            Params bound to other pages are filtered out.
            If None, all params are kept (no filtering).
        TrØ   NFr   r/   )ri   r>   r\   )r   rÚ   r³   r•   ru   rÂ   r%   rh   r"   r;   r¿   rÈ   r‰   )
r}   r©   Úvalid_script_hashesÚparsed_query_paramsÚstale_widget_idsrz   ri   rÅ   Úshould_keepr"   s
             r-   Úpopulate_from_query_stringz&QueryParams.populate_from_query_stringÉ  s  € ô* $Ÿn™n¨\ÈTÔRÐà×&Ñ&Ô(Ø&(Ðà+×1Ñ1Ó3ò 	;‰HˆC�Ø×-Ñ-×1Ñ1°#Ó6ˆGØˆKð $Ð/ØÐ'Ø×'Ñ'Ð/BÑBð !×'Ñ'¨×(9Ñ(9Ô:Ø#�âÜ�s“8˜q’=Ø×0Ñ0°¸"Ð0Õ=Ü˜“X ’]Ø×0Ñ0°¸#¸b¹'Ð0ÕBà×0Ñ0°°cÕ:ð)	;ð. *ò 	*ˆIØ×Ñ˜yÕ)ð	*ñ Ø×&Ñ&Õ(ð r,   c                óˆ  — g }| j                   D ]>  }||v rŒ|r$|r"|j                  |«      }|r|j                  |vrŒ.|j                  |«       Œ@ d}|D ]Y  }| j                   j                  |«      }|r)|j                  }	|	| j
                  v r| j
                  |	= d}| j                  |«       Œ[ |r| j                  «        yy)a  Remove bindings and URL params for widgets that are no longer active.

        This cleans up query params for conditional widgets that have been unmounted.
        For fragment runs, widgets outside the running fragment(s) are preserved.

        Note: Page-based cleanup for MPA navigation is handled separately via
        populate_from_query_string() which is called before the script runs.

        Parameters
        ----------
        active_widget_ids : set[str]
            Set of widget IDs that are currently active/rendered.
        fragment_ids_this_run : list[str] | None
            List of fragment IDs being run, or None for full script runs.
        widget_metadata : dict[str, Any] | None
            Widget metadata dict to check fragment IDs.
        FTN)rv   rÂ   Úfragment_idrh   r#   rt   rÈ   r‰   )
r}   Úactive_widget_idsÚfragment_ids_this_runÚwidget_metadatarñ   r"   ÚmetadataÚparams_removedrÅ   r#   s
             r-   Úremove_stale_bindingsz!QueryParams.remove_stale_bindings  sã   € ð. ÐØ×1Ñ1ò 	/ˆIØÐ-Ñ-àñ %©Ø*×.Ñ.¨yÓ9�Ù × 4Ñ 4Ð<QÑ Qàà×#Ñ# IÕ.ð	/ð ˆØ)ò 	*ˆIØ×.Ñ.×2Ñ2°9Ó=ˆGÙØ#×-Ñ-�	à × 2Ñ 2Ñ2Ø×*Ñ*¨9Ð5Ø%)�NØ×Ñ˜yÕ)ð	*ñ Ø×&Ñ&Õ(ð r,   )rç   zIterator[str]©rz   r!   rç   r!   )rz   r!   r2   ústr | Iterable[str]rç   ÚNone)rz   r!   rç   rþ   )r+   )r–   ú\Iterable[tuple[str, str | Iterable[str]]] | SupportsKeysAndGetItem[str, str | Iterable[str]]r—   r!   rç   rþ   )rz   r!   rç   ú	list[str])rç   rg   )rç   r!   )rç   rþ   )rç   zdict[str, str])rº   rÿ   rç   rþ   )rz   r!   ri   zlist[str] | strrç   rþ   )F)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ç   úWidgetBinding | None)r"   r!   rç   r  )r©   r!   rç   rþ   )r#   r!   rç   zstr | list[str] | None)r#   r!   r2   r   r$   r!   rç   rþ   rF   )r©   r!   rï   zset[str] | Nonerç   rþ   )NN)rö   zset[str]r÷   zlist[str] | Nonerø   zdict[str, Any] | Nonerç   rþ   )*r&   r'   r(   r)   r	   Údictrt   r*   ru   rv   rw   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-   rq   rq   ô   s§  … ññ 16ÀdÔ0K€MÐ-ÓKñ 49ÈÔ3NÐÐ0ÓNÙ49È$Ô4OÐÐ1ÓOñ 38ÈÔ2MÐÐ/ÓMó
ó;ó&%ó:ó;ð$ >@ð'%ð;ð'%ð
 ð'%ð 
ó'%óR=ó
ó'ó
ó
%ó
ðð;ðð 
ó	ó&ô
ð06àð06ð ð06ð ð	06ð
 ð06ð 
ó06ód
Aó)ó.4ó*6ó7ó/óó.
ó	,ó
óó,7%ót?ð 04ð6)àð6)ð -ð6)ð 
ó	6)ðv 37Ø15ð	3)à#ð3)ð  0ð3)ð /ð	3)ð
 
ô3)r,   rq   c                ó   — d| › d�S )Nzst.query_params has no key "z".r+   )rz   s    r-   r�   r�   7  s   € Ø)¨#¨¨bÐ1Ð1r,   c                ó  — t        |t        «      rt        |«      ‚|j                  «       t        v rt        d«      ‚t        |t        «      r-t        |t        «      s|D �cg c]  }t        |«      ‘Œ c}| |<   yt        |«      | |<   yc c}w )zSet an item in a dictionary.zVQuery param embed and embed_options (case-insensitive) cannot be set programmatically.N)r0   r  r   rf   r   r   r   r!   )Útarget_dictrz   r2   Úitems       r-   rŒ   rŒ   ;  sy   € ô �%œÔÜ/°Ó4Ð4à
‡y�yƒ{Ô-Ñ-Ü#Ødó
ð 	
ô
 �%œÔ"¬:°e¼SÔ+AØ27Ö8¨$œC �IÒ8ˆ�CÒä˜u›:ˆ�CÒùò 9s   Á!B	c           	     óD  — i }t        | d«      r@t        | d«      r4t        d| «      } | j                  «       D ]  }| |   }t        |||«       Œ n·| D ]²  \  }}||v rœt	        |t
        «      rt        |«      ‚||   }t	        |t        «      s|g}t	        |t        «      r9t	        |t        «      s)|j                  |D �cg c]  }t        |«      ‘Œ c}«       n|j                  t        |«      «       |||<   Œ¦t        |||«       Œ´ t        j                  |d¬«      S c c}w )z5Convert query params into a URL-encoded query string.r‘   rƒ   r’   Tr¥   )r“   r   r‘   rŒ   r0   r  r   r1   r   r!   r”   rh   r   r§   )Úquery_paramsÚprocessed_paramsrz   r2   Úcurrent_valr  s         r-   Úprocess_query_paramsr  N  s!  € ð
 46Ðäˆ|˜VÔ$¬°¸}Ô)MÜØ>Àó
ˆð  ×$Ñ$Ó&ò 	<ˆCØ  Ñ%ˆEÜÐ.°°UÕ;ñ	<ð 'ò 	@‰JˆC�ØÐ&Ñ&ä˜e¤TÔ*Ü;¸CÓ@Ð@à.¨sÑ3�Ü! +¬tÔ4Ø#. -�Kä˜e¤XÔ.´zÀ%ÌÔ7MØ×&Ñ&¸eÖ'D°d¬¨D­	Ò'DÕEà×&Ñ&¤s¨5£zÔ2à(3Ð  Ò%ä!Ð"2°C¸Õ?ð#	@ô& �?‰?Ð+°4Ô8Ð8ùò (Es   Â=D
)r2   ústr | list[str]rç   r   )r2   r  rç   ré   )rJ   r   rç   rg   )rV   r!   rç   zfloat | None)r2   r  r$   r!   rç   r   rü   )r  rs   rz   r!   r2   rý   rç   rþ   )r  rÿ   rç   r!   )9Ú
__future__r   rä   Úcollections.abcr   r   r   r   Údataclassesr   r	   r   r
   r   r   r   Útypingr   r   r   r   Úurllibr   Ústreamlit.errorsr   r   Ústreamlit.proto.ForwardMsg_pb2r   Ú7streamlit.runtime.scriptrunner_utils.script_run_contextr   Ú	_typeshedr   r!   ÚQueryParamValuerè   ÚQueryParamsInputr   r*   r   r   Ú	frozensetr   r    r5   r=   rS   rA   rB   rC   rD   rK   rZ   ro   rq   r�   rŒ   r  r+   r,   r-   ú<module>r     s�  ðö #ã ß GÓ Gß (ß >Õ >ß 2Ó 2Ý ç UÝ 5Ý VáÝ0à˜ ™Ñ%€Ø˜3 Ð/Ñ0°8¸EÀ#ÀÐBVÑ<WÑ3XÑXÐ ð !(Ð �:Ó 'Ø(7Ð ˜:Ó 7àØð-Ð Ð)ó ñ 1:ØÐ1Ð2ó1Ð Ð-ó ð
 ÷ð ó ðó)óñ& ˜T 1 a°·±Ô=€
ˆEÓ =Ø'Ð �EÓ 'Ø%Ð(:Ñ:€�Ó :ñ ˜d A qÓ)€�Ó )óó)óX\ð~ ô)�.  c Ñ*ó )ó ð)óD2ð&Ø+ð&Ø25ð&Ø>Qð&à	ó&ð&"9ð7ð"9ð 	ô"9r,   