
    Be4                         d Z ddlZddlZddlZddlZddlmZ ddlmZ ddl	m
Z
 ddlZddlmZ ddlmZ ddlmZ d	d
lmZ ddlmZmZ ddlmZ dZed             Zd ZddZd Zd Zd Zd Zdddddddi fdZ dS )zH
Various utilities for recording and embedding state in a rendered app.
    Ndefaultdict)contextmanager)product)Property)CustomJSWatcher   )param_watchers   )
add_to_docdiff)statez
var state = null
for (var root of cb_obj.document.roots()) {{
  if (root.id == '{id}') {{
    state = root;
    break;
  }}
}}
if (!state) {{ return; }}
state.set_state(cb_obj, {js_getter})
c              #      K   d }| rt           j        }|t           _        	 d V  | r|t           _        d S d S # | r|t           _        w xY w)Nc                     dS )NF )selfnewolds      .lib/python3.11/site-packages/panel/io/embed.pymatcheszalways_changed.<locals>.matches*   s    u    )r   r   )enabler   backups      r   always_changedr   (   sw         #!"& 	&%H	& 	&6 	&%H%%%%s	   7 Ac                 ^    t          | d          }|ddddS |j        |j        |j        dS )NF)binary{})headermetadatacontent)r   header_jsonmetadata_jsoncontent_json)docmsgs     r   record_eventsr(   6   sH    
s5
!
!
!C
{DTBBBo33D') ) )r   r    c           	      z   i } | j                     D ]'\  }}||fz   }	||k     rt          ||	|dz   |||          ||<   -d                    d |	D                       dz   }
t          j                            ||
          }t          j                            |          }t          j                            |          st          j        |           t          |d          5 }t          j
        ||           d d d            n# 1 swxY w Y   |}|r t          j                            ||
          }|||<   )|S )Nr   _c                 ,    g | ]}t          |          S r   )str).0is     r   
<listcomp>zsave_dict.<locals>.<listcomp>F   s     8 8 8AQ 8 8 8r   z.jsonw)items	save_dictjoinospathdirnameexistsmakedirsopenjsondump)r   keydepth	max_depth	save_path	load_pathfilename_dictkvcurkeyfilenamefilepath	directoryfrefpaths                  r   r3   r3   >   s{   M ' '1aT9(FE!GY)2I ?  ?M! xx 8 8 8 8 8997BHw||Ix88H11I7>>),, 'I&&&h$$  	!Q                             G <',,y(;;&M!s   #DD		D		c                 X    d t          |                                           D             S )Nc                 J    g | ] }|                                 D ]	}|D ]}|
!S r   )values)r.   	pwatchers	awatchersr1   s       r   r0   z get_watchers.<locals>.<listcomp>U   sh     D D D)&--//D DD D45  D D D D Dr   )r   rM   )reactives    r   get_watchersrQ   T   s<    D D~h77>>@@ D D D Dr   c                 L  	
 ddl m} ddlm}m} j        j        	fdj                                        D             }fdt                    D             }t          	|          r/d 	j        D             
	
fdt          	          D             }ng }j                                        D ]t          |          rd_        |r3t          	|          r#|s!|d	         	j        vst          	|          s|rd
S t          | d	|d	                   S )zE
    Converts Param pane widget links into JS links if possible.
    r   )Reactive)LiteralInputWidgetc                 "    g | ]\  }}|u 	|S r   r   )r.   rC   rD   widgets      r   r0   z#param_to_jslink.<locals>.<listcomp>b   s"    FFF41a!v++Q+++r   c                 8    g | ]}|j         vr|j         v|S r   _internal_callbacks)r.   r1   
param_panerW   s     r   r0   z#param_to_jslink.<locals>.<listcomp>c   s>       1F4N+N+NZ333 	
333r   c                 0    g | ]}t          |d d          S Nr	   r.   ls     r   r0   z#param_to_jslink.<locals>.<listcomp>i   s%    ;;;!Waf%;;;r   c                 @    g | ]}|j         vr|v|j         v|S r   rY   )r.   r1   r[   pobj	tgt_linkss     r   r0   z#param_to_jslink.<locals>.<listcomp>j   sH     
 
 
Qd6N-N-N""q
0N'N'N 'N'N'Nr   r;   r   Nvalue)rP   rS   widgetsrT   rU   _param_paneobject_widgetsr2   rQ   
isinstance_linksrM   
serializer_linkable_paramslink_to_jslink)modelrW   rS   rT   rU   pnamewatcherstgt_watchersr[   rb   rc   s    `      @@@r   param_to_jslinkrr   Y   s    $#####........#JDFFFF:.4466FFFE    ''  H
 $!! ;;t{;;;	
 
 
 
 
 
#D))
 
 

 %,,.. ' 'fl++ 	' &F D(33 x a---f%% 	.*6 	.%$aAAAr   c                 P   | j         d         }|j                            |d          -|j                            |d          ||j        vs	||j        vrdS ddlm}m} t          |j	                            ||                    } |||d|          }	 || |	||           |	S )	z
    Converts links declared in Python into JS Links by using the
    declared forward and reverse JS transforms on the source and target.
    idFNr   )JSLinkCallbackGeneratorLinkrd   T)bidirectional
properties)
ref_source_transformsget_target_transforms_modelslinksru   rv   dict_rename)
rn   sourcesrc_spectargettgt_specrz   ru   rv   ry   links
             r   rm   rm   |   s    
 )D/C		"	&	&x	7	7	?		"	&	&x	7	7	?6>!!S%>%> 	55555555FN..xBBCCCJ4dzJJJDE4888Kr   c           	         ddl m} d j        D             t          fdt	                    D                       rd S g }j        D ]}|j        fdt	                    D             }|j        s|rt          |          s d S g }|j        	                                D ]H\  }}t          |d d          t                    |         d         v r|                    ||f           I|r|                    ||f           g }	|D ]Z\  }}
|
D ]R\  }}t          | ||j        |          }|  d S j                            |           |	                    |           S[|	S )Nr   )rU   c                 0    g | ]}t          |d d          S r]   r	   r_   s     r   r0   z$links_to_jslinks.<locals>.<listcomp>   s%    999a!CRC&!999r   c              3   2   K   | ]}|j         vo|vV  d S NrY   )r.   r1   	src_linksrW   s     r   	<genexpr>z#links_to_jslinks.<locals>.<genexpr>   s5      
d
d!1F..E1I3E
d
d
d
d
d
dr   c                 &    g | ]}|j         v|S r   rY   )r.   r1   r   s     r   r0   z$links_to_jslinks.<locals>.<listcomp>   s&    ___a1FD^;^;^;^;^;^r   r^   rd   )re   rU   rj   anyrQ   r   transformedri   r   r2   r
   r   appendrm   paramtrigger)rn   rW   rU   r   r   rq   mappingsro   r   jslinksmappingr   jslinkr   r   s    `           @@r   links_to_jslinksr      s         996=999I

d
d
d
d
d|\bOcOc
d
d
ddd E + +____<#7#7___ 	 	Z5O5O 	FF#z//11 	3 	3OE8SbS	"nV&<&<U&CG&LLL 1222 	+LL$)***G # #g") 	# 	#Hh#E68T[(SSF~L  ***NN6""""	# Nr   i     Fz./Tc           	        789:;<=> ddl m } ddlm} ddlm} ddlm8 ddlm} ddlm	} dd	l
m7m9 |j        d
         =t          | |          r=| j        j        v r| j        } t          | |          st!          ||           dS t"          j        =         \  }}}}|j                            d           79=fd}8fd|                     |          D             } |            }g i g }}}|D ]7>>j        mt/          |>          }|[>j        j        <t          <9          r>t3          <>fdt5          <          D                       s|                    <           w>j        rt9          |>          }|r>j        r(t=          >fdt5          >          D                       r>                    ||
                     >          |          \  }}}}}}|j!        } t          |7          r4|j"        d         j        =         d         #                    d| i          }n:|j        =         d         }t          ||           s|#                    d| i          }>j$        rW>j$        |v rN|>j$                 d                             |           |>j$                 d                             |           tK          tL          '                    |j        d
         |                    }!|                    |g|g|||!|f           |d         |>j$        <   9g }"|D ]\  }#}$}}}!}|#d         |v r|$D ]}|(                    ||!           |$d         }%|$dd         D ]Q}&|#d         j)                             dd          }'|%*                    |'|&|'           |&*                    |'|%|'           R|"                    |#|$||f           t!          ||d           g |j+        _,        |sdS d |"D             }(d |"D             })t[          t]          d |"D                        }*t_          |*          |k    r=|j0        rdS tb          j2        j1        3                    dt_          |*          z             ;fd; ;            }+d},|	r ||*dth          j5                  n|*D ] }-|+}.d}/tm          |-          D ]w\  }0}1|"|0         \  }#}2}}3	 to          |j8                  5  |#D ]	}|1|_9        
	 ddd           n# 1 swxY w Y   n# tt          $ r d}/Y  nw xY w|. |3|2d                            }.x|/rg |j+        _,        d |"D             ::fd |j+        j,        D             |j+        _,        tw          |          }4|,|4d!         d"k    z  },|4r|.<                    |4           |,sdS t{          |"|(          D ];\  \  }#}}}}5	 |#D ]}|j1        <                    |5#           ,# tt          $ r Y 8w xY w|rd$>                    |t          j@                    jA        g          }6t          jC        >                    ||6          }| t          jC        >                    ||6          }t          |+t_          |"          dz
  ||%          }+|<                    ||+|)d& tm          |"          D             '           |E                    |           |S )(a0  
    Embeds the state of the application on a State model which allows
    exporting a static version of an app. This works by finding all
    widgets with a predefined set of options and evaluating the cross
    product of the widget values and recording the resulting events to
    be replayed when exported. The state is recorded on a State model
    which is attached as an additional root on the Document.

    Arguments
    ---------
    panel: panel.reactive.Reactive
      The Reactive component being exported
    model: bokeh.model.Model
      The bokeh model being exported
    doc: bokeh.document.Document
      The bokeh Document being exported
    max_states: int (default=1000)
      The maximum number of states to export
    max_opts: int (default=3)
      The max number of ticks sampled in a continuous widget like a slider
    json: boolean (default=True)
      Whether to export the data to json files
    json_prefix: str (default='')
      Prefix for JSON filename
    save_path: str (default='./')
      The path to save json files to
    load_path: str (default=None)
      The path or URL the json files will be loaded from.
    progress: boolean (default=True)
      Whether to report progress
    states: dict (default={})
      A dictionary specifying the widget values to embed for each widget
    r   )tqdmr   )config)Panel)rv   )State)PaneBase)DiscreteSliderrU   rt   Nembeddedc                     t          |           r| j        rdS t          |           r| j        d         j        v S | j        v S )NFr   )ri   disabled
_compositer~   )rg   r   rU   rz   s    r   is_embeddablez"embed_state.<locals>.is_embeddable   sX    &&)) 	V_ 	5fn-- 	7&+A.666fn$$r   c                 &    g | ]}|j         v|S r   )registry)r.   r1   rv   s     r   r0   zembed_state.<locals>.<listcomp>   s/     * * *Q4=(( (((r   c              3   F   K   | ]}|j         vo|j        j         vV  d S r   )rZ   rf   )r.   r1   rb   rW   s     r   r   zembed_state.<locals>.<genexpr>   sO       < <#$  !(@@tQfN`NtEt < < < < < <r   c              3   *   K   | ]}|j         v V  d S r   rY   )r.   r1   rW   s     r   r   zembed_state.<locals>.<genexpr>  s,      ,k,kQRQ&2L-L,k,k,k,k,k,kr   r   type)rt   	js_getter)coderd   Tc                 2    g | ]\  }}}}|d          j         S r   rw   )r.   wsr+   s      r   r0   zembed_state.<locals>.<listcomp>;  s&    555{r1ar!u{555r   c                 :    g | ]\  }}}} ||d                    S r   r   )r.   r+   msgs       r   r0   zembed_state.<locals>.<listcomp><  s,    444kaQ2a5444r   c                 .    g | ]\  }}}}|d d d         S )Nr   r   )r.   r+   valss      r   r0   zembed_state.<locals>.<listcomp>=  s*    "J"J"J-!Qa4":"J"J"Jr   zThe cross product of different application states is very large to explore (N=%d), consider reducing the number of options on the widgets or increase the max_states specified in the function to remove this warningc                  "    t                     S r   r   )nested_dicts   r   <lambda>zembed_state.<locals>.<lambda>H  s    +k22 r   F)leavefilec                 (    g | ]}|d          D ]}|S )r   r   )r.   rD   ms      r   r0   zembed_state.<locals>.<listcomp>]  s)    222QqT22!2222r   c                 &    g | ]}|j         v|S r   )rn   )r.   emodelss     r   r0   zembed_state.<locals>.<listcomp>^  s&    %e%e%eAqw^dOdOdaOdOdOdr   r"   r   rw   r+   )r?   r@   rA   c                 F    i | ]\  }\  }}}}|d          j         d         |S )r   rt   )rz   )r.   r/   r+   r   s       r   
<dictcomp>zembed_state.<locals>.<dictcomp>w  s0    [[[oa!Q1![[[r   )r;   r   rM   re   )Fr   r   layoutr   r   rv   models.stater   paner   re   r   rU   rz   ri   r~   r   r   _viewstagsr   selectrf   rr   rg   r   rQ   rj   r   _supports_embedall_get_embed_stater|   _widget_typer   
select_onenamer   STATE_JSformatjs_on_changer   js_link	callbacks_held_eventslistr   len
_doc_buildr   mainwarningsysstdout	enumerater   
safe_embedrd   	Exceptionr(   updatezipr4   uuiduuid4hexr5   r6   r3   add_root)?panelrn   r&   
max_statesmax_optsr;   json_prefixr@   rA   progressstatesr   r   r   r   r   r+   commr   re   state_modelwidget_datamergedignorer   r   r1   w_modelr   getter	on_changer   w_typejs_callbackrM   r   w_modelswmwmoattrrestore	init_valscross_product
state_dictchangesr=   sub_dictskipr/   rC   r   r   eventsrD   
random_dirr   rv   rU   r   r   rb   rz   rW   s?                                                          @@@@@@@@r   embed_stater      s   H $$$$$$00000000
)D/C%"" sel.B'B'BeU## 5#L%MAq!T	Jj!!!% % % % % % %* * * *%,,}55 * * *G%''K"$b"K ). ).)"5&11D)0dF++ , < < < < <(4T(:(:< < < < < ,d+++= 	&uf55G  % 	,k,k,k,kVbciVjVj,k,k,k)k)k 	 :@9P9P6::f%%x:1 :167D&)Ya(( 	?l1o-c215@@&&AQRRGGinQ'Ggv.. ?!,,ff-=>> ; 	6;&006;"))!,,,6;"))'222HOOt$	 %4 %; %; < < <QC'D&+yQRRR)"ov{ F@K 4 4<XtV[)a5F?? 	9 	9G  K8888 a[ABB< 	( 	(Ca5=$$Wg66DJJtS$'''KKb$''''r8T623333uc4   !#CM 55f555G44V444I"J"J6"J"J"JKLLM
=J&& 	F
   "4
 }--". 	/ 	/ 	/ 3222KJGEM`]%cjAAAAS` $ $cNN 		) 		)DAq )KB1a#F$566 $ $ $ $"#$$ $ $ $ $ $ $ $ $ $ $ $ $ $ $      !A$(HH 	)+CM& 32V222%e%e%e%e1K%e%e%e"s##6)$,, 	$OOF### 00  Q1q	 ( (Q''''( 	 	 	D	  IXX{DJLL,<=>>
GLLJ77	 Y
;;IzS[[])2iI I I
 D
9[[SYIZIZ[[[  ] ] ]LLsH   T1T?TTTTTT'&T' W66
XX)r   r   Nr)   N)!__doc__r;   r5   r   r   collectionsr   
contextlibr   	itertoolsr   r   bokeh.core.property.basesr   bokeh.modelsr   param.parameterizedr
   utilr   rn   r   r   r   r   r   r(   r3   rQ   rr   rm   r   r   r   r   r   <module>r	     s     				 



  # # # # # # % % % % % %        . . . . . . ! ! ! ! ! ! ' ' ' ' ' ' ! ! ! ! ! ! # # # # # # # #      
 
& 
& 
&) ) )   ,D D D
 B  B  BF  *  H /3QdbD D D D D Dr   