L i UddlmZddlZddlmZmZddlmZmZm Z ddl m Z m Z m Z mZddlmZmZmZmZddlmZmZmZmZmZmZmZddlmZdd lmZmZdd l m!Z!dd l"m#Z#dd l$m%Z%m&Z&dd l'm(Z(m)Z)m*Z*m+Z+ddl,m-Z.ddl/m0Z1ddl2m3Z4ddl5m6Z7ddl8m9Z9m:Z:ddl;mm?Z@ddlAmBZCddlDmEZFddlGmHZIddlJmKZLddlMmNZOddlPmQZRddlSmTZUddlVmWZXddlYmZZ[ddl\m]Z^ddl_m`Z`dd lambZcdd!ldmeZfdd"lgmhZidd#ljmkZldd$lmmnZodd%lpmqZrdd&lsmtZudd'lvmwZxdd(lymzZ{dd)l|m}Z~dd*lmZdd+lmZdd,lmZdd-lmZdd.lmZed/Ze Gd0d1Ze Gd2d3eZZe d45Gd6d7eZZe d45Gd8d9eZeZed:eZd;<ZGd=d>eeZed?ed;<ZGd@dAeeeeZe d45GdBdCeZZe d45GdDdEeZe d45GdFdGeZe d45GdHdIeZe d45GdJdKeZe d45GdLdMeZHe d45GdNdOeZNe d45GdPdQeZ0e d45GdRdSeZZQe d45GdTdUeZTe d45GdVdWeZZeezZdXedY<ee ezdzZdXedZ<e d45Gd[d\eZWe d45Gd]d^eZZ]e d45Gd_d`eZeZe d45GdadbeZe d45GdcddeZe d45GdedfeZe d45GdgdheZZee d45GdidjeZZ3e d45Gdkdle3Ze d45Gdmdne3Ze d45Gdodpe3Ze d45GdqdreZZwe d45GdsdteZZhe d45GdudveeeZKe d45GdwdxeeeZeezZdXedy<e d45Gdzd{eZne d45Gd|d}eeeZqe d45Gd~deeeZte d45GddeeeZedeeeeeZe d45GddeeeZ6e d45GddeZZe d45GddeZZze d45GddeZ}e d45GddeZeezZdXed<e d45GddeZe d45GddeZZe d45GddeZe d45GddZEddZddZe d45GddeEZe d45GddeEZe d45GddeEZe d45GddeEZe d45GddeEZe d45GddeEZeZeEzZdXed<ddZe d45GddeEZddZy)) annotationsN)ABCabstractmethod)CallableIteratorSequence) dataclassfieldfields is_dataclass)datedatetimetime timedelta) TYPE_CHECKINGAnyGeneric TypeAliasTypeVarcastoverload)Self)dataframe_utilutil)HeadingProtoTag)SelectSliderSerde) SliderSerde SliderStep)DateInputSerdeDateWidgetReturnTimeInputSerde_parse_date_value)Alert)Checkbox)Markdown)Slider) WidgetState WidgetStates) TESTING_KEYuser_key_from_element_id) DataFrame)Arrow)Block)Button) ButtonGroup) ChatInput)Code) ColorPicker) DateInput)Element) Exception) ForwardMsg)Heading)Json)Metric) MultiSelect) NumberInput)Radio) Selectbox)Space)Text)TextArea) TextInput) TimeInput)Toast)SafeSessionState)AppTestTceZdZdZy) InitialValuez0Used to represent the initial value of a widget.N)__name__ __module__ __qualname____doc__g/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/streamlit/testing/v1/element_tree.pyrHrHWs:rNrHceZdZUdZedZded<edZded<edZded <d ed <e dd Z dd Z e e ddZ ddZddddZddZy)r4aL Element base class for testing. This class's methods and attributes are universal for all elements implemented in testing. For example, ``Caption``, ``Code``, ``Text``, and ``Title`` inherit from ``Element``. All widget classes also inherit from Element, but have additional methods specific to each widget type. See the ``AppTest`` class for the full list of supported elements. For all element classes, parameters of the original element can be obtained as properties. For example, ``Button.label``, ``Caption.help``, and ``Toast.icon``. Freprstrtyperproto ElementTreeroot str | NonekeycyNrMselfrUrWs rO__init__zElement.__init__~sHKrNc#K|ywr[rMr]s rO__iter__zElement.__iter__s  scy)z%The value or contents of the element.NrMr`s rOvaluez Element.values rNc.t|j|S)z4Fallback attempt to get an attribute from the proto.)getattrrU)r]names rO __getattr__zElement.__getattr__stzz4((rNNtimeoutc:|jj|S)zRun the ``AppTest`` script which contains the element. Parameters ---------- timeout The maximum number of seconds to run the script. None means use the AppTest's default. rhrWrunr]ris rOrlz Element.runyy}}W}--rNc,tj|Sr[rrepr_r`s rO__repr__zElement.__repr__zz$rNrU ElementProtorWrVreturnNone)rvzIterator[Self]rvr)rfrSrvrriz float | NonervrErvrS)rIrJrKrLr rT__annotations__rUrWrr^rapropertyrcrgrlrrrMrNrOr4r4gs~ 5!D#!E"E3"5)D+) OKK  ).2 . rNr4FrQc&eZdZddZeddZy)UnknownElementcz|jd}|Jt|||_||_||_d|_y)NrT) WhichOneofrerUrWrTrYr]rUrWtys rOr^zUnknownElement.__init__s?   f %~~UB'   rNc |jj}|J||jjS#t$r|jj cYSwxYwr[)rW session_staterUid ValueErrorrcr]states rOrczUnknownElement.valuesT $II++E$ $$' ' $::## # $s25AANrtrx)rIrJrKr^r|rcrMrNrOr~r~s$$rNr~cxeZdZUdZedZded<ded<ded <d ed <dd Zdd Ze e ddZ y)WidgetzWidget base class for testing.FrQrSrbooldisabledrXrYr_valuecb||_||_t|j|_d|_yr[)rUrWr*rrYrr\s rOr^zWidget.__init__s'  +DGG4 rNc||_|SzSet the value of the widget.rr]vs rO set_valuezWidget.set_value  rNcyr[rMr`s rO _widget_statezWidget._widget_states,/rNN)rUrrWrVrvrw)rrrvrrvr') rIrJrKrLr rr{r^rr|rrrMrNrOrrsE(BN O K  //rNrEl_coT)bound covariantceZdZd dZddZeddZeddZeddZddZddZ ddZ dd Z dd Z edd Z y ) ElementListc||_yr[_list)r]elss rOr^zElementList.__init__s &) rNc,t|jSr[)lenrr`s rO__len__zElementList.__len__s4::rNct|Sr[)rr`s rOrzElementList.lens 4yrNcyr[rMr]idxs rO __getitem__zElementList.__getitem__s.1rNcyr[rMrs rOrzElementList.__getitem__s=@rNcpt|trt|j|S|j|Sr[) isinstanceslicerrrs rOrzElementList.__getitem__s- c5 !tzz#/ /zz#rNc#8K|jEd{y7wr[rr`s rOrazElementList.__iter__s::s c,tj|Sr[rpr`s rOrrzElementList.__repr__rsrNcrt|tr|j|jk(S|j|k(Sr[)rrr)r]others rO__eq__zElementList.__eq__s. e[ )::, ,zzU""rNc>tt|jSr[)hashtuplerr`s rO__hash__zElementList.__hash__sE$**%&&rNc@|Dcgc]}|jc}Scc}wr[)rc)r]es rOvalueszElementList.valuess!%&A&&&sN)rzSequence[El_co]rvrwrvint)rrrvr)rrrvzElementList[El_co])rz int | slicervzEl_co | ElementList[El_co])rvzIterator[El_co]rz)rzElementList[El_co] | objectrvr)rvz Sequence[Any])rIrJrKr^rr|rrrrarrrrrrMrNrOrrsk*11 @@  # '''rNrW_coceZdZddZy) WidgetListc`|jD]}|j|k(s|cSt|r[)rrYKeyError)r]rYrs rO__call__zWidgetList.__call__s1 Auu| smrNN)rYrSrvr)rIrJrKrrMrNrOrrsrNrcNeZdZUedZded<ded<d dZed dZy ) AlertBaseFrQ AlertProtorUrSiconc.||_d|_||_yr[)rUrYrWr\s rOr^zAlertBase.__init__s  rNc.|jjSr[rUbodyr`s rOrczAlertBase.value zzrNNrUrrWrVrvrwrz rIrJrKr rUr{r^r|rcrMrNrOrrs/5)E:) I rNrc eZdZdfd ZxZS)Errorc4t|||d|_yNerrorsuperr^rTr]rUrW __class__s rOr^zError.__init__ % rNrrIrJrKr^ __classcell__rs@rOrr rNrc eZdZdfd ZxZS)Warningc4t|||d|_yNwarningrrs rOr^zWarning.__init__ % rNrrrs@rOrr rNrc eZdZdfd ZxZS)Infoc4t|||d|_yNinforrs rOr^z Info.__init__"s % rNrrrs@rOrr s rNrc eZdZdfd ZxZS)Successc4t|||d|_yNsuccessrrs rOr^zSuccess.__init__)rrNrrrs@rOrr'rrNrceZdZUdZded<edZded<ded <ded <ded <dfd Zedd Z eddZ ddZ ddZ xZ S)r.z@A representation of ``st.button`` and ``st.form_submit_button``.rrFrQ ButtonProtorUrSlabelhelpform_idcBt|||d|_d|_y)NFbuttonrr^rrTrs rOr^zButton.__init__9s  %  rNc^t}|j|_|j|_|Sr[)r'rr trigger_valuer]wss rOrzButton._widget_state>s% ];; rNc|jr |jS|jj}|sJtd|t|j S)zThe value of the button. (bool)r)rrWrrr)rrs rOrcz Button.valueEsF ;;;;  '' uFE+.tww788rNc||_|S)zSet the value of the button.rrs rOrzButton.set_valueNrrNc$|jdS)z$Set the value of the button to True.Trr`s rOclickz Button.clickS~~d##rN)rUrrWrVrvrwrrvr)rrrvr.)rvr.)rIrJrKrLr{r rUr^r|rrcrrrrs@rOr.r..s`J LE*E;* J I L  99 $rNr.ceZdZUdZded<edZded<ded <dfd Zdd Ze dd Z e dd Z xZ S)r0z&A representation of ``st.chat_input``.rXrFrQChatInputProtorUrS placeholderc4t|||d|_yN chat_inputrrs rOr^zChatInput.__init__`s %  rNc||_|Srrrs rOrzChatInput.set_valuedrrNct}|j|_|j|j|j_|Sr[)r'rrstring_trigger_valuedatars rOrzChatInput._widget_stateis5 ] ;; "+/;;B # # ( rNc|jr |jS|jj}|sJ|t|jS)zThe value of the widget. (str))rrWrr)rrs rOrczChatInput.valueqs? ;;;;  '' u[!$''**rN)rUrrWrVrvrw)rrXrvr0rrvrX rIrJrKrLr{r rUr^rr|rrcrrs@rOr0r0XsS0 !u-E>-! ++rNr0ceZdZUdZded<edZded<ded <ded <ded <dfd Zedd Z eddZ ddZ ddZ ddZ xZS)r$z$A representation of ``st.checkbox``. bool | NonerFrQ CheckboxProtorUrSrrrc4t|||d|_yNcheckboxrrs rOr^zCheckbox.__init__s % rNc^t}|j|_|j|_|Sr[r'rrc bool_valuers rOrzCheckbox._widget_state$ ]   rNc|j |jS|jj}|sJtd||jS)zThe value of the widget. (bool)rrrWrrrrs rOrczCheckbox.valueC ;; ";;  '' uFE$''N++rNc||_|Srrrs rOrzCheckbox.set_valuerrNc$|jdS)z$Set the value of the widget to True.Trr`s rOcheckzCheckbox.checkrrNc$|jdS)z%Set the value of the widget to False.Frr`s rOuncheckzCheckbox.unchecks~~e$$rNrUrrWrVrvrwrr)rrrvr$)rvr$)rIrJrKrLr{r rUr^r|rrcrrrrrs@rOr$r${sf.  e,E=, J I L ,, $%rNr$cfeZdZUdZedZded<ded<ded <d ed <dd Zedd Z y)r1z A representation of ``st.code``.FrQ CodeProtorUrSlanguagershow_line_numbersrwrYc<||_d|_||_d|_yNcoderUrYrWrTr\s rOr^z Code.__init__   rNc.|jjSzThe value of the element. (str))rU code_textr`s rOrcz Code.valueszz###rNN)rUr rWrVrvrwrz) rIrJrKrLr rUr{r^r|rcrMrNrOr1r1s=*%(E9(M I $$rNr1ceZdZUdZded<ded<ded<ded<ed Zd ed <dfd Zedd Z eddZ ddZ ddZ xZ S)r2z(A representation of ``st.color_picker``.rXrrSrrrFrQColorPickerProtorUc4t|||d|_yN color_pickerrrs rOr^zColorPicker.__init__s %" rNc|j |jS|jj}|sJtd||jS)z3The currently selected value as a hex string. (str)rSrrs rOrczColorPicker.valuesC ;; ";;  '' uE5>**rNc^t}|j|_|j|_|SProtobuf message representing the state of the widget, including any interactions that have happened. Should be the same as the frontend would produce for those interactions. r'rrc string_valuers rOrzColorPicker._widget_states& ]** rNc||_|S)z,Set the value of the widget as a hex string.rrs rOrzColorPicker.set_valuerrNcP|jdsd|}|j|S)zESet the value of the widget as a hex string. May omit the "#" prefix.#) startswithrrs rOpickzColorPicker.picks(||C A3A~~a  rN)rUr,rWrVrvrwrzr)rrSrvr2)rIrJrKrLr{r rUr^r|rcrrr:rrs@rOr2r2sb2  J I L#/E /#++ !rNr2cDeZdZUedZded<ddZed dZy) DataframeFrQ ArrowProtorUc<d|_||_||_d|_yNarrow_data_framerYrUrWrTr\s rOr^zDataframe.__init__s  & rNcTtj|jjSr[r convert_arrow_bytes_to_pandas_dfrUrr`s rOrczDataframe.value>>tzzOOrNNrUr=rWrVrvrwrvPandasDataframerrMrNrOr<r<s,5)E:)' PPrNr<rSingleDateValue DateValueceZdZUdZded<edZded<ded <d ed <d ed <d ed<ded<ded<dfd ZddZe ddZ e ddZ xZ S)r3z&A representation of ``st.date_input``.zDateValue | None | InitialValuerFrQDateInputProtorUrSrr minmaxris_rangerrct|||t|_d|_t j |jdj|_t j |jdj|_ y)N date_inputz%Y/%m/%d) rr^rHrrTrstrptimerMr rNrs rOr^zDateInput.__init__ sd %"n   $$UYY ;@@B$$UYY ;@@BrNc||_|Srrrs rOrzDateInput.set_valuerrNct}|j|_td}|j|j|j j dd|Sr[)r'rr serializercstring_array_valuer)r]rserdes rOrzDateInput._widget_statesF ]t$(- (C""1% rNct|jts't|j\}}| t |SdS|j j }|sJ||jS)z0The value of the widget. (date or Tuple of date)N)rrrHr"rrWrr)r]parsed_rs rOrczDateInput.value"s\$++|4)$++6IFA$*$65= @D @ '' uTWW~rN)rUrLrWrVrvrw)rrJrvr3r)rvr r rs@rOr3r3sl0 ++!u-E>- J I IN I LC rNr3cPeZdZUded<ded<ded<ded<d dZed d Zy ) r5rSmessager is_markdown list[str] stack_trace is_warningcd|_||_||_d|_|j|_t |j|_yN exception)rYrWrUrTmessage_is_markdownr]listr_r\s rOr^zException.__init__4s?    44 1 12rNc|jSr[)r\r`s rOrczException.value=s ||rNN)rUExceptionProtorWrVrvrwrzrIrJrKr{r^r|rcrMrNrOr5r5-s2 L3rNr5cleZdZUedZded<ded<ded<d ed <d ed <dd ZeddZy) HeadingBaseFrQ HeadingProtorUrStagrXanchorr hide_anchorrwrYc<||_d|_||_||_yr[r&)r]rUrWtype_s rOr^zHeadingBase.__init__Ks   rNc.|jjSr[rr`s rOrczHeadingBase.valueQrrNN)rUrkrWrVrprSrvrwrzrrMrNrOrjrjBs@U+E<+ H  I rNrjc eZdZdfd ZxZS)Headerc(t|||dyNheaderrr^rs rOr^zHeader.__init__Xs h/rNrUrkrWrVrvrwrrs@rOrsrsVs 00rNrsc eZdZdfd ZxZS) Subheaderc(t|||dyN subheaderrwrs rOr^zSubheader.__init__^s k2rNrxrrs@rOrzrz\s 33rNrzc eZdZdfd ZxZS)Titlec(t|||dyNtitlerwrs rOr^zTitle.__init__ds g.rNrxrrs@rOrrbs //rNrcNeZdZUedZded<ded<d dZed dZy ) r8FrQ JsonProtorUrexpandedc<||_d|_||_d|_yNjsonr&r\s rOr^z Json.__init__nr'rNc.|jjSr[rr`s rOrcz Json.valuetrrNN)rUrrWrVrvrwrzrrMrNrOr8r8hs/%(E9(N rNr8cbeZdZUedZded<ded<ded<ded <d d Zedd Zy )r%FrQ MarkdownProtorUr is_caption allow_htmlrwrYc<||_d|_||_d|_yNmarkdownr&r\s rOr^zMarkdown.__init__s   rNc.|jjSr[rr`s rOrczMarkdown.valuerrNNrUrrWrVrvrwrzrrMrNrOr%r%ys; e,E=, I rNr%c eZdZdfd ZxZS)Captionc4t|||d|_yNcaptionrrs rOr^zCaption.__init__rrNrrrs@rOrrrrNrc eZdZdfd ZxZS)Dividerc4t|||d|_yNdividerrrs rOr^zDivider.__init__rrNrrrs@rOrrrrNrc eZdZdfd ZxZS)Latexc4t|||d|_yNlatexrrs rOr^zLatex.__init__rrNrrrs@rOrrrrNrcDeZdZUdZedZded<dZded<d d Zy) r>z)A representation of st.space for testing.FrQ SpaceProtorUNrwrYc.||_||_d|_y)NspacerUrWrTr\s rOr^zSpace.__init__s   rN)rUrrWrVrvrw) rIrJrKrLr rUr{rYr^rMrNrOr>r>s#35)E:)CrNr>cZeZdZUded<ded<ded<ded<ded<d dZed d Zy ) r9 MetricProtorUrSrdeltacolorrc<||_d|_||_d|_yNmetricr&r\s rOr^zMetric.__init__s   rNc.|jjSr[rr`s rOrcz Metric.valuerrNN)rUrrWrVrvrwrzrhrMrNrOr9r9s5  J J J I rNr9ceZdZUdZded<edZded<ded <d ed <dfd Zedd Z eddZ eddZ eddZ ddZ ddZddZxZS)r/zAA representation of button_group that is used by ``st.feedback``.list[T] | NonerFrQButtonGroupProtorUzlist[ButtonGroupProto.Option]optionsrSrcht|||d|_t|j|_yN button_grouprr^rTrerrs rOr^zButtonGroup.__init__s) %" EMM* rNct}|j|_|j|jjdd|Sr3N)r'rindicesint_array_valuerrs rOrzButtonGroup._widget_states5 ]%)\\" rNc|j |jS|jj}|sJtd||jS6The currently selected values from the options. (list)list[T]rrs rOrczButtonGroup.valueC ;; ";;  '' uIuTWW~..rNc|jDcgc],}|jj|j|.c}Scc}wzEThe indices of the currently selected values from the options. (list)rcrindex format_funcrs rOrzButtonGroup.indices8BFLA ""4#3#3A#67LLL1Acn|jj}td|t|jSzCThe widget's formatting function for displaying options. (callable)Callable[[Any], Any]rWrrr)rr]sss rOrzButtonGroup.format_func.YY $ $*B{ODGG,DEErNc||_|Sz/Set the value of the multiselect widget. (list)rrs rOrzButtonGroup.set_value  rNc|j}||vr|S|j}|j||j||Sz Add a selection to the widget. Do nothing if the value is already selected. If testing a multiselect widget with repeated options, use ``set_value`` instead. rccopyappendrr]rcurrentnews rOselectzButtonGroup.select@ ** <Klln 1  s rNc|j}||vr|S|j}||vr|j|||vr|j||Sz Remove a selection from the widget. Do nothing if the value is not already selected. If a value is selected multiple times, the first instance is removed. rcrremoverrs rOunselectzButtonGroup.unselectQ ** G Klln3h JJqM3h s rN)rUrrWrVrvrwrrvrrvz Sequence[int]rvr)rrrvButtonGroup[T])rrFrvr)rIrJrKrLr{r rUr^r|rrcrrrrrrrs@rOr/r/sK #/E / ** L+ //MMFF   rNr/ceZdZUdZded<edZded<ded <d ed <d ed <ded<ded<dfd ZeddZ eddZ eddZ eddZ eddZ ddZd dZd dZxZS)! Multiselectz'A representation of ``st.multiselect``.rrFrQMultiSelectProtorUrSrr^rrmax_selectionsrrcht|||d|_t|j|_yN multiselectrrs rOr^zMultiselect.__init__!s) %! EMM* rNct}|j|_|j|jjdd|Sr)r'rrrVrrs rOrzMultiselect._widget_state&s5 ](, ""1% rNc|j |jS|jj}|sJtd||jSrrrs rOrczMultiselect.value1rrNc|jDcgc],}|jj|j|.c}Scc}wrrrs rOrzMultiselect.indices:rrc^|jDcgc]}|j|c}Scc}w)r)rcrrs rOrzMultiselect.values?s'.2ZZ8  #888s*cn|jj}td|t|jSrrrs rOrzMultiselect.format_funcDrrNc||_|Srrrs rOrzMultiselect.set_valueJrrNc|j}||vr|S|j}|j||j||Srrrs rOrzMultiselect.selectPrrNc|j}||vr|S|j}||vr|j|||vr|j||Srrrs rOrzMultiselect.unselect^rrN)rUrrWrVrvrwrrr)rvz Sequence[str]r)rrrvMultiselect[T])rrFrvr)rIrJrKrLr{r rUr^r|rrcrrrrrrrrs@rOrrs1 #/E / J  I L+ //MM99FF   rNrNumberceZdZUdZded<edZded<ded <d ed <d ed <d ed<ded<ded<dfd ZddZe ddZ e ddZ ddZ ddZ xZS)r;z(A representation of ``st.number_input``.zNumber | None | InitialValuerFrQNumberInputProtorUrSr Number | NonerMrNrsteprrct|||t|_d|_|j r |j nd|_|jr|j|_yd|_yN number_input) rr^rHrrThas_minrMhas_maxrNrs rOr^zNumberInput.__init__~sL %"n " % 5994 % 5994rNc||_|S)z0Set the value of the ``st.number_input`` widget.rrs rOrzNumberInput.set_valuerrNcvt}|j|_|j|j|_|Sr[)r'rrc double_valuers rOrzNumberInput._widget_state. ] :: !"jjBO rNct|jts |jS|jj}|sJ||j S)z8Get the current value of the ``st.number_input`` widget.rrrHrWrrrs rOrczNumberInput.valuesB$++|4;;  '' uTWW~rNc|j|St|j|jz|jxs t d}|j |S)zDIncrement the ``st.number_input`` widget as if the user clicked "+".inf)rcrMrrNfloatrrs rO incrementzNumberInput.incrementsF :: K  TYY&(@E%L A~~a  rNc|j|St|j|jz |jxs t d}|j |S)zDDecrement the ``st.number_input`` widget as if the user clicked "-".z-inf)rcrNrrMrrrs rO decrementzNumberInput.decrementsF :: K  TYY&(AE&M B~~a  rN)rUrrWrVrvrw)rrrvr;r)rvr)rvr;rIrJrKrLr{r rUr^rr|rrcrr rrs@rOr;r;qsx2 ((#/E / J   L I L8 !!rNr;ceZdZUdZded<edZded<ded <d ed <d ed <ded<ded<dfd ZeddZ eddZ eddZ ddZ eddZ xZS)r<z!A representation of ``st.radio``.T | None | InitialValuerFrQ RadioProtorUrSrr^rr horizontalrrct|||t|_d|_t |j |_yNradiorr^rHrrTrerrs rOr^zRadio.__init__s2 %"n  EMM* rNc|jy|jj|j|jS))The index of the current selection. (int)Nrr`s rOrz Radio.indexs5 :: ||!!$"2"24::">??rNct|jts |jS|jj}|sJt d||j Sz4The currently selected value from the options. (Any)rFrrrHrWrrrrs rOrcz Radio.valueG$++|4;;  '' uCtww((rNcn|jj}td|t|jSrrrs rOrzRadio.format_funcrrNc||_|SzSet the selection by value.rrs rOrzRadio.set_valuerrNcvt}|j|_|j|j|_|Sr2)r'rr int_valuers rOrzRadio._widget_states0 ] :: !::BL rN)rUrrWrVrvrwrv int | NonervT | Noner)rr"rvzRadio[T]r)rIrJrKrLr{r rUr^r|rrcrrrrrs@rOr<r<s+ ##5)E:) J  I L+ @@ ))FF    rNr<ceZdZUdZded<edZded<ded <d ed <ded <ded <dfd ZeddZ eddZ eddZ ddZ ddZ ddZeddZxZS)r=z%A representation of ``st.selectbox``.r rFrQSelectboxProtorUrSrr^rrrct|||t|_d|_t |j |_yN selectboxrrs rOr^zSelectbox.__init__s2 %"n  EMM* rNc|jyt|jdk(ry|jj|j |jS)rNr)rcrrrrr`s rOrzSelectbox.indexsI ::  t||  !||!!$"2"24::">??rNct|jts |jS|jj}|sJt d||j Srrrs rOrczSelectbox.valuerrNcn|jj}td|t|jSrrrs rOrzSelectbox.format_funcrrNc||_|Srrrs rOrzSelectbox.set_valuerrNc$|j|Srrrs rOrzSelectbox.selects~~a  rNcx||jdS|jtd|j|S)zSet the selection by index.NrF)rrr)r]rs rO select_indexzSelectbox.select_indexs5 =>>$' '~~d3 U(;<==rNct}|j|_|j6t|jdkDr|j|j|_|S)r3r)r'rrrrr5rs rOrzSelectbox._widget_state#sI ] :: !c$,,&7!&;"ll4::6BO rN)rUr$rWrVrvrwrr!r)rr"rv Selectbox[T])rr rvr0r)rIrJrKrLr{r rUr^r|rrcrrrr.rrrs@rOr=r=s/ ##!u-E>- J  I L+ @@))FF  !>   rNr=ceZdZUdZded<edZded<ded <d ed <d ed <ded<ded<dfd ZddZe ddZ e ddZ e ddZ ddZ xZS) SelectSliderz)A representation of ``st.select_slider``.zT | Sequence[T] | NonerFrQ SliderProtorUrSrSliderProto.DataType.ValueType data_typer^rrrcht|||d|_t|j|_yN select_sliderrrs rOr^zSelectSlider.__init__=s) %# EMM* rNc||_|S)z$Set the (single) selection by value.rrs rOrzSelectSlider.set_valueBrrNc t|jgd} |j|j|j}t}|j|_||jjdd|S#t t f$r` |j|jDcgc]}|j|ncc}wc}}n#t d|jxYwYwxYw)NFzCould not find index for ) rrrUrrcr TypeErrorr'rdouble_array_valuer)r]rWrvalrs rOrzSelectSlider._widget_stateGs!$,,E: K 0 0 <=A]()""1% I& K KOOdjj$QsT%5%5c%:$Q$QR K #>c!ft~~5K~~a  rN)rUrdrWrVrvrw)rrXrvr@rr )rrSrvr@rIrJrKrLr{r rUr^rr|rrcrrrrs@rOr@r@sl/ %% e,E=, JN I L  !rNr@ceZdZUdZded<edZded<ded <d ed <ded <ded <ded<ded<dfd ZddZe ddZ e ddZ ddZ xZ S)rAz&A representation of ``st.text_input``.rcrFrQTextInputProtorUrSrrre autocompleterrrcRt|||t|_d|_yN text_inputrirs rOr^zTextInput.__init__" %"n   rNc||_|Srrrs rOrzTextInput.set_value rrNcvt}|j|_|j|j|_|Sr[r4rs rOrzTextInput._widget_staterrNct|jts |jS|jj}|sJ||j Srmrrs rOrczTextInput.valuernrNcp|jrt||jkDr|S|j|Srprqrs rOrrzTextInput.input"rsrN)rUrvrWrVrvrw)rrXrvrArr )rrSrvrArtrs@rOrArAsr0 %%!u-E>- JN I L!  !rNrA TimeValueceZdZUdZded<edZded<ded <d ed <ded <ded <dfd ZddZe ddZ e ddZ ddZ ddZ xZS)rBz&A representation of ``st.time_input``.zTimeValue | None | InitialValuerFrQTimeInputProtorUrSrrrrrcRt|||t|_d|_yN time_inputrirs rOr^zTimeInput.__init__;r{rNc||_|Srrrs rOrzTimeInput.set_value@rrNct}|j|_td}|j|j}|||_|Sr[)r'rr!rUrcr5)r]rrWserialized_values rOrzTimeInput._widget_stateEsC ]t$ ??4::6  '.BO rNct|jts.|j}t|tr|j S|S|j j }|sJ||jS)z'The current value of the widget. (time))rrrHrrrWrr)r]rrs rOrczTimeInput.valuePsY$++|4 A)!X61668 =A = '' uTWW~rNc|j|Stjtj|jt |j z}|j|jS)zSelect the next available time.seconds rcrcombiner todayrrrrr]dts rOrzTimeInput.incrementZP :: K   djjlDJJ 7)DII:V V~~bggi((rNc|j|Stjtj|jt |j z }|j|jS)z#Select the previous available time.rrrs rOr zTimeInput.decrementarrN)rUrrWrVrvrw)rzTimeValue | NonervrBr)rvz time | None)rvrBr rs@rOrBrB0sk0 ++!u-E>- J I I L!  ))rNrBcNeZdZUedZded<ded<d dZed dZy ) rCFrQ ToastProtorUrSrc<||_d|_||_d|_yNtoastr&r\s rOr^zToast.__init__ns   rNc.|jjSr[rr`s rOrcz Toast.valuetrrNN)rUrrWrVrvrwrzrrMrNrOrCrCis/5)E:) I rNrCceZdZUdZded<edZded<ded <ded <ded <dfd Zedd Z eddZ ddZ xZ S)Togglez"A representation of ``st.toggle``.r rFrQrrUrSrrrcBt|||d|_d|_yNtogglerrs rOr^zToggle.__init__s  %  rNc^t}|j|_|j|_|Sr[rrs rOrzToggle._widget_staterrNc|j |jS|jj}|sJtd||jS)z'The current value of the widget. (bool)rrrs rOrcz Toggle.valuerrNc||_|Srrrs rOrzToggle.set_valuerrNrrr)rrrvr) rIrJrKrLr{r rUr^r|rrcrrrs@rOrrys\,  e,E=, J I L  ,,rNrceZdZUdZded<ded<edZded <edZd ed < d>d Zd?d Z d@dZ dAdZ e dBdZ e dCdZe dDdZe dEdZe dFdZe dGdZe dHdZe dIdZe dJdZe dKdZe dLdZe dMdZe dNdZe dOdZe dPdZe dQdZe dRd Ze dSd!Ze dTd"Ze dUd#Z e dVd$Z!e dWd%Z"e dXd&Z#e dYd'Z$e dZd(Z%e d[d)Z&e d\d*Z'e d]d+Z(e d^d,Z)e d_d-Z*e d`d.Z+e dad/Z,e dbd0Z-e dcd1Z.e ddd2Z/e ded3Z0e dfd4Z1e dgd5Z2e dhd6Z3e did7Z4e djd8Z5dkd9Z6d:d;dld<Z7dmd=Z8y:)nr-adA container of other elements. Elements within a Block can be inspected and interacted with. This follows the same syntax as inspecting and interacting within an ``AppTest`` object. For all container classes, parameters of the original element can be obtained as properties. For example, ``ChatMessage.avatar`` and ``Tab.label``. rSrTzdict[int, Node]childrenFrQrrUrVrWci|_||_|r1|jd}|||_||_yd|_||_yd|_||_y)NrT containerunknown)rrUrrTrWrs rOr^zBlock.__init__s\   !!&)B~  (  "DI rNc,t|jSr[)rrr`s rOrz Block.__len__s4==!!rNc#hK||jD]}|j|Ed{y7wr[r)r] child_idxs rOrazBlock.__iter__s3  0I}}Y/ / / 0 /s &202c |j|Sr[r)r]ks rOrzBlock.__getitem__s}}QrNcyr[rMr`s rOrYz Block.keysrNc6t|jdS)Nrrgetr`s rOrz Block.button$((8,--rNc6t|jdSrrr`s rOrzBlock.button_group$((>233rNc6t|jdSrrrr`s rOrz Block.caption488I.//rNc6t|jdSrrr`s rOrzBlock.chat_input$((<011rNc$|jdSN chat_messagerr`s rOrzBlock.chat_messagesxx''rNc6t|jdSrrr`s rOrzBlock.checkboxs$((:.//rNc6t|jdSr$rr`s rOr%z Block.code488F+,,rNc6t|jdSr.rr`s rOr/zBlock.color_pickerrrNc$|jdSNcolumnrr`s rOcolumnsz Block.columnsxx!!rNc6t|jdSr?rr`s rO dataframezBlock.dataframes488$6788rNc6t|jdS)NrQrr`s rOrQzBlock.date_inputrrNc6t|jdSrrr`s rOrz Block.dividerrrNc6t|jdSrrr`s rOrz Block.error488G,--rNc6t|jdSrbrr`s rOrczBlock.exception488K011rNc$|jdSNexpanderrr`s rOrzBlock.expander sxx ##rNc6t|jdSrurr`s rOrvz Block.header488H-..rNc6t|jdSrrr`s rOrz Block.inforrNc6t|jdSrrr`s rOrz Block.jsonrrNc6t|jdSrrr`s rOrz Block.latexrrNc6t|jdSrrr`s rOrzBlock.markdowns488J/00rNc6t|jdSrrr`s rOrz Block.metric#rrNc6t|jdSrrr`s rOrzBlock.multiselect's$((=122rNc6t|jdSrrr`s rOrzBlock.number_input+rrNc6t|jdSrrr`s rOrz Block.radio/s$((7+,,rNc6t|jdSr7rr`s rOr8zBlock.select_slider3s$((?344rNc6t|jdSr&rr`s rOr'zBlock.selectbox7$((;/00rNc6t|jdSrNrr`s rOrOz Block.slider;rrNc$|jdSNstatusrr`s rOrz Block.status?rrNc6t|jdSr|rr`s rOr}zBlock.subheaderCrrNc6t|jdSrrr`s rOrz Block.successGrrNc6t|jdSrYrr`s rOtablez Block.tableKs488M233rNc$|jdSNtabrr`s rOtabsz Block.tabsOsxxrNc6t|jdSr_rr`s rOr`z Block.textSrrNc6t|jdSrgrr`s rOrhzBlock.text_areaWrrNc6t|jdSryrr`s rOrzzBlock.text_input[rrNc6t|jdSrrr`s rOrzBlock.time_input_rrNc6t|jdSrrr`s rOrz Block.titlecrrNc6t|jdSrrr`s rOrz Block.toastgrrNc6t|jdSrrr`s rOrz Block.togglekrrNc6t|jdSrrr`s rOrz Block.warningorrNcL|Dcgc]}|j|k(s|c}Scc}wr[)rT)r] element_typers rOrz Block.getss!:a166\#9:::s!!Nrhc:|jj|SzRun the script with updated widget values. Parameters ---------- timeout The maximum number of seconds to run the script. None means use the AppTest's default. rhrkrms rOrlz Block.runvrnrNct|Sr[)rqr`s rOrrzBlock.__repr__s T{rN)rUBlockProto | NonerWrVrvrwr)rvzIterator[Node])rrrvNoder )rvzWidgetList[Button])rvzWidgetList[ButtonGroup[Any]])rvzElementList[Caption])rvzWidgetList[ChatInput])rvzSequence[ChatMessage])rvzWidgetList[Checkbox])rvzElementList[Code])rvzWidgetList[ColorPicker])rvzSequence[Column])rvzElementList[Dataframe])rvzWidgetList[DateInput])rvzElementList[Divider])rvzElementList[Error])rvzElementList[Exception])rvzSequence[Expander])rvzElementList[Header])rvzElementList[Info])rvzElementList[Json])rvzElementList[Latex])rvzElementList[Markdown])rvzElementList[Metric])rvzWidgetList[Multiselect[Any]])rvzWidgetList[NumberInput])rvzWidgetList[Radio[Any]])rvzWidgetList[SelectSlider[Any]])rvzWidgetList[Selectbox[Any]])rvzWidgetList[Slider[Any]])rvzSequence[Status])rvzElementList[Subheader])rvzElementList[Success])rvzElementList[Table])rvz Sequence[Tab])rvzElementList[Text])rvzWidgetList[TextArea])rvzWidgetList[TextInput])rvzWidgetList[TimeInput])rvzElementList[Title])rvzElementList[Toast])rvzWidgetList[Toggle])rvzElementList[Warning])rrSrvzSequence[Node]ryrz)9rIrJrKrLr{r rUrWr^rrarr|rYrrrrrrr%r/rrrQrrrcrrvrrrrrrrrr8r'rOrr}rrrr`rhrzrrrrrrrlrrrMrNrOr-r-s IE"E3"5)D+)   $"0   ..440022((00--44""992200..22$$//----..11//3344--5511..""220044--112222......00;.2 .rNr-cjj}dddgtigtrfdt D}n#fdj j D}g}|D]=\}}t|tr|dt|n|d|}|j|?d|dz|d<d j|}tj|d }|d |d S) ziA custom repr similar to `streamlit.util.repr_` but that shows tree structure using indentation. NFc3K|]m}|jr_t|j|jk7rzrepr_..s^ vvaff%2aff%X5 VVWT166* + sA3A6c36K|]\}}|vs ||fywr[rM)rrrrs rOrzrepr_..s W&1aQhEV1vWs  = r,  (z ))rrIsetr r __dict__itemsrdict format_dictrjointextwrapindent) r] classname fields_valsreprs field_namercline field_reprsrs ` @rOrqrqs''IUBr:HD D\ XDMM,?,?,AW E( E%&l!K./ 0rNc*eZdZdZ d ddZy) SpecialBlockz4Base class for the sidebar and main body containers.Nci|_||_|r||_||_y|r5|jdr$|jd}|J||_||_yd|_||_y)NrTr)rrUrTrrW)r]rUrWrTrs rOr^zSpecialBlock.__init__sq   DI u''/!!&)B> !>DI "DI rNr[)rUrrWrVrTrXrvrw)rIrJrKrLr^rMrNrOrrs5>      rNrcreZdZUdZedZded<edZded<ded<ded < d d Zy ) ChatMessagez(A representation of ``st.chat_message``.FrQrSrTBlockProto.ChatMessagerUrfavatarci|_||_||_d|_|j|_|j |_yr)rrUrWrTrfrr\s rOr^zChatMessage.__init__s6    " JJ ll rNN)rUrrWrVrvrw rIrJrKrLr rTr{rUr^rMrNrOrrsO25!D#!$)u$5E !5 I K #% # #  #rNrcreZdZUdZedZded<edZded<ded <ded < d d Zy )Columnz3A representation of a column within ``st.columns``.FrQrSrTBlockProto.ColumnrUrweightgapci|_||_||_d|_|j|_|j |_yr)rrUrWrTr%r&r\s rOr^zColumn.__init__s6     ll 99rNN)rUr$rWrVrvrwr!rMrNrOr#r#sO=5!D#!$%0E 0 M H      rNr#cbeZdZUedZded<edZded<ded<ded<d d Zy ) ExpanderFrQrSrTBlockProto.ExpandablerUrrci|_||_||_d|_|j|_|j |_yrrrUrWrTrrr\s rOr^zExpander.__init__s6    JJ [[ rNNrUr*rWrVrvrw)rIrJrKr rTr{rUr^rMrNrOr)r)s05!D#!#(e#4E 4 I J!rNr)cteZdZUedZded<edZded<ded<ded<d d Zed d Z y )StatusFrQrSrTr*rUrrci|_||_||_d|_|j|_|j |_yrr,r\s rOr^zStatus.__init__s4    JJ [[ rNcx|jdk(ry|jdk(ry|jdk(rytd)Nspinnerrunningz:material/check:completez:material/error:rzUnknown Status state)rrr`s rOrz Status.states= 99 ! 99* * 99* */00rNNr-rz) rIrJrKr rTr{rUr^r|rrMrNrOr/r/sD5!D#!#(e#4E 4 I J!11rNr/cheZdZUdZedZded<edZded<ded< d d Zy ) Tabz+A representation of tab within ``st.tabs``.FrQrSrTBlockProto.TabrUrc^i|_||_||_d|_|j|_yr)rrUrWrTrr\s rOr^z Tab.__init__)s+     [[ rNN)rUr7rWrVrvrwr!rMrNrOr6r6!sI55!D#!!u-E>- J ! ! !  !rNr6rc<t|tr |jSyr[)rrr)nodes rOget_widget_stater;8s$!!! rNceZdZUdZeddZded<ddZeddZ edd Z edd Z dd Z dd dd Z ddZy)rVaxA tree of the elements produced by running a streamlit script. Elements can be queried in three ways: - By element type, using `.foo` properties to get a list of all of that element, in the order they appear in the app - By user key, for widgets, by calling the above list with a key: `.foo(key='bar')` - Positionally, using list indexing syntax (`[...]`) to access a child of a block element. Not recommended because the exact tree structure can be surprising. Element queries made on a block container will return only the elements descending from that block. Returned elements have methods for accessing whatever attributes are relevant. For very simple elements this may be only its value, while complex elements like widgets have many. Widgets provide a fluent API for faking frontend interaction and rerunning the script with the new widget values. All widgets provide a low level `set_value` method, along with higher level methods specific to that type of widget. After an interaction, calling `.run()` will update the AppTest with the results of that script run. FN)rRrzAppTest | None_runnerc.i|_||_d|_y)NrW)rrWrTr`s rOr^zElementTree.__init__Ys   rNc4|d}t|tsJ|S)Nrrr-)r]ms rOmainzElementTree.main^ G!U###rNc4|d}t|tsJ|S)Nr@)r]ss rOsidebarzElementTree.sidebardrCrNcJ|jJ|jjSr[)r=rr`s rOrzElementTree.session_statejs"||'''||)))rNczt}|D]+}t|}||jj|-|Sr[)r(r;widgetsr)r]rr:ws rOget_widget_stateszElementTree.get_widget_statesos@ ^ %D &A} !!!$ %  rNrhcx|jJ|j}|jj||Sr)r=rL_run)r]ri widget_statess rOrlzElementTree.runxs<||'''..0 ||   @@rNc,t|jSr[)r rr`s rOrrzElementTree.__repr__s4==))rN)rvrw)rvr-)rvrD)rvr(ryrz)rIrJrKrLr r=r{r^r|rBrGrrLrlrrrMrNrOrVrV>sp.$=G^=   **.2 A*rNrVc<t}td|dtd|dtd|dd|_|D]}|jds|jj }|j }|jdd k(r |j}|jd}|d k(r|jj}|tjjk(rt|j| }n}|tjjk(rt!|j| }nG|tjj"k(rt%|j| }n|tjj&k(rt)|j| }nt+d |jj|d k(rt-|j.| }n|dk(rt1|j2| }n}|dk(rt5|j6| }n_|dk(rt9|j:| }nA|dk(rt=|j>| }n#|dk(re|j@jB} | tDjFjHk(rtK|j@| }ntM|j@| }n|dk(rtO|jP| }n|dk(rtS|jT| }n}|dk(rtW|jX| }n_|dk(rt[|j\| }nA|dk(r|j^j`tbjdjfk(rti|j^| }n|j^j`tbjjjfk(rtm|j^| }n|j^j`tbjnjfk(rtq|j^| }n]t+d|j^j`|dk(rts|jt| }n|dk(rJ|jvjxtzj|j~k(rt|jv| }n|jvjxtzj|jk(rt|jv| }n|jvjxtzj|jk(rt|jv| }n9|jvjxtzj|jk(rt|jv| }nt+d|jvjx|dk(rt|j| }n|dk(rt|j| }n|dk(rt|j| }ns|dk(rt|j| }nU|d k(rt|j| }n7|d!k(r|jjBtj|jk(rt|j| }n|jjBtj|jk(rt|j| }nt+d"|j|d#k(rt|j| }nh|d$k(rt|j| }nJ|d%k(rt|j| }n,|d&k(rt|j| }n|d'k(rt|j| }nt|| }n|jdd(k(r|j} | jd} | d)k(rt| j| }n| d*k(rt| j| }nx| d+k(rF| jjrt| j| }nEt| j| }n-| d,k(rt| j| }nt| |-}n9|} |dd.D]G} | j}|j| }|td|-}||| <t|tsJ|} It|tr1| jj|d.}||j|_|| j|d.<|S)/zTransform a list of `ForwardMsg` into a tree matching the implicit tree structure of blocks and elements in a streamlit app. Returns the root of the tree, which acts as the entrypoint for the query and interaction API. rBN)rTrWrUrGevent)rrErrT new_elementalert)rWzUnknown alert type with format r@rZrrrrr%r/rQrcheadingzUnknown heading type with tag rrzUnknown markdown type rrrrr'rOzSlider with unknown type r`rhrzrr add_blockrr expandabler)rUrW)prVrrHasFieldmetadata delta_pathrrrTrUformatrFormatERRORrINFOrSUCCESSrWARNINGrrr<r@rWrZr.rr/rr0rrrTr StyleTypeTOGGLErr$r1r%r2r/r3rQr5rcrVrlr TITLE_TAGrcr HEADER_TAGrs SUBHEADER_TAGrzr8rrrrTypeNATIVEr%CAPTIONrLATEXrDIVIDERrr9rrrr;rr<rr=r'rOr3SLIDERr& SELECT_SLIDERr2r?r`r@rhrArzrBrrCrr~rWrrr#rrXrr/r)r6rr-rr)messagesrWmsgr\reltr alert_formatnew_nodestyleblockbty current_noderrchildplaceholder_blocks rOparse_tree_from_messagesrzs =D V$d ; YT > W4t <DM I9||G$ \\,,     F #} 4##C'BW}"yy// :#4#4#:#::$SYYT:H!Z%6%6%;%;;#CIID9H!Z%6%6%>%>>&syyt%>>&syytH' 4@Hvt4~%&s'7'7dC|#$S^^$?{"$S]]>y;;??o&?&?&E&EE$S[[tx::??k&6&6&=&==%cjjt$>!08 jn-SI9V KrN)r]objectrvrS)rzdict[Any, Any]rvrS)r:rrvzWidgetState | None)rozlist[ForwardMsg]rvrV) __future__rr abcrrcollections.abcrrr dataclassesr r r r rr rrtypingrrrrrrrtyping_extensionsr streamlitrrstreamlit.elements.headingr(streamlit.elements.widgets.select_sliderr!streamlit.elements.widgets.sliderrr'streamlit.elements.widgets.time_widgetsrr r!r"streamlit.proto.Alert_pb2r#rstreamlit.proto.Checkbox_pb2r$rstreamlit.proto.Markdown_pb2r%rstreamlit.proto.Slider_pb2r&r3 streamlit.proto.WidgetStates_pb2r'r(streamlit.runtime.state.commonr)r*pandasr+rHstreamlit.proto.Arrow_pb2r,r=streamlit.proto.Block_pb2r- BlockProtostreamlit.proto.Button_pb2r.rstreamlit.proto.ButtonGroup_pb2r/rstreamlit.proto.ChatInput_pb2r0rstreamlit.proto.Code_pb2r1r streamlit.proto.ColorPicker_pb2r2r,streamlit.proto.DateInput_pb2r3rLstreamlit.proto.Element_pb2r4rustreamlit.proto.Exception_pb2r5rgstreamlit.proto.ForwardMsg_pb2r6streamlit.proto.Heading_pb2r7rkstreamlit.proto.Json_pb2r8rstreamlit.proto.Metric_pb2r9rstreamlit.proto.MultiSelect_pb2r:rstreamlit.proto.NumberInput_pb2r;rstreamlit.proto.Radio_pb2r<rstreamlit.proto.Selectbox_pb2r=r$streamlit.proto.Space_pb2r>rstreamlit.proto.Text_pb2r?r]streamlit.proto.TextArea_pb2r@rdstreamlit.proto.TextInput_pb2rArvstreamlit.proto.TimeInput_pb2rBrstreamlit.proto.Toast_pb2rCr*streamlit.runtime.state.safe_session_staterDstreamlit.testing.v1.app_testrErFrHr~rrrrrrrrrrr<rIr{rJrjrsrzrrrrrrrrr2rKrWrrrqr rrr#r)r/r6rr;rVrzrMrNrOrs $##88>>44#*6FE :BB<FP3==@OI:OICI9C:@OO=I=:FII=K5 CL      2 c2  2 j $W$$( 0Wc000 w$7&''%.&'RvVt4T"GDM     I  i  9  i  &$V&$&$R +++D )%v)%)%X $7$$* +!&+!+!\  P P P"H_,&/)BBTI 9I )))X ( '3& 0[00  3 33  /K//   7    w$ h  h  H   G   W$ N&'!*NNb V&'!*VVr%K  9!&9!9!x 7FGAJ77t C CCL 8.671:8.8.v~sE4xH  2.VW\*2.2.j  PG P P  7    0!v0!0!f 0!0!0!fh 9& 5)5)5)p  G   "V""J bbbJ +F 5, #%##* U* !u!!" 1U112 !%!!&E/i!  H*%H*H*VYrN