Ë
    :vžjw>  ã                   ó&  — d dl mZmZmZ d dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dl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mZmZ d„ Zd„ Zd„ Zdg fd	„Zd
„ Z e«        ej<                  j?                  ej<                  jA                  e!«      ddd«      Z"dZ#dZ$dZ%dZ&dZ'g d¢Z(e%fd„Z) G d„ dejT                  jV                  «      Z+d„ Z, G d„ dejZ                  j\                  «      Z/ G d„ de0«      Z1d„ Z2e3dk(  r e2«        yy)é    )Úabsolute_importÚdivisionÚprint_functionN)Ú	ZMQStreamé   )Ú	SceneTreeÚwalkÚ	find_nodec                 óŽ   — t        j                  | |«      }|st        dj                  || «      «      ‚|j	                  «       d   S )Nz&Could not match {:s} with pattern {:s}r   )ÚreÚmatchÚ
ValueErrorÚformatÚgroups)ÚpatternÚsr   s      új/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/meshcat/servers/zmqserver.pyÚcapturer      s?   € Ü�H‰H�W˜aÓ €EÙÜÐA×HÑHÈÈGÓTÓUÐUà�|‰|‹~˜aÑ Ð ó    c                 ó   — t        d| «      S )Nz^zmq_url=(.*)$©r   ©Úlines    r   Úmatch_zmq_urlr      ó   € ÜÐ$ dÓ+Ð+r   c                 ó   — t        d| «      S )Nz^web_url=(.*)$r   r   s    r   Úmatch_web_urlr   "   r   r   c                 ó@  — t         j                  dddg}| �"|j                  d«       |j                  | «       |r |j                  |Ž  t        t        j
                  «      }t        j                  j                  t        j                  j                  t        j                  j                  t        «      «      «      |d<   t        j                  |t        j                  t        j                  |d¬«      }d}d	|vr¸|j                  j                  «       j                  «       j                  d
«      }|j!                  «       �l|j#                  «       \  }}t%        |j                  d
«      «       t%        |j                  d
«      «       t'        dt)        |j!                  «       «      z   «      ‚d	|vrŒ¸t+        |«      } t-        |j                  j                  «       j                  «       j                  d
«      «      }d„ }	t/        j0                  |	|«       || |fS )z}
    Starts the ZMQ server as a subprocess, passing *args through popen.
    Optional Keyword Arguments:
        zmq_url
    z-uz-mzmeshcat.servers.zmqserverú	--zmq-urlÚ
PYTHONPATHT)ÚstdoutÚstderrÚenvÚstart_new_sessionÚ Úzmq_urlúutf-8z=the meshcat server process exited prematurely with exit code c                 óD   — | j                  «        | j                  «        y ©N)ÚkillÚwait)Úserver_procs    r   Úcleanupz/start_zmq_server_as_subprocess.<locals>.cleanupJ   s   € Ø×ÑÔØ×ÑÕr   )ÚsysÚ
executableÚappendÚdictÚosÚenvironÚpathÚdirnameÚ__file__Ú
subprocessÚPopenÚPIPEr!   ÚreadlineÚstripÚdecodeÚpollÚcommunicateÚprintÚRuntimeErrorÚstrr   r   ÚatexitÚregister)
r&   Úserver_argsÚargsr#   r,   r   ÚoutsÚerrsÚweb_urlr-   s
             r   Ústart_zmq_server_as_subprocessrI   %   s¯  € ô �N‰N˜D $Ð(CÐD€DØÐØ�‰�KÔ Ø�‰�GÔÙØˆ�‰�[Ñ!ô
 Œr�z‰zÓ
€CÜŸ™Ÿ™¬¯©¯©¼¿¹¿¹ÌÓ8QÓ(RÓS€CˆÑô ×"Ñ" 4Ü�‰Ü�‰ØØô	 €Kð
 €DØ
˜4Ñ
Ø×!Ñ!×*Ñ*Ó,×2Ñ2Ó4×;Ñ;¸GÓDˆØ×ÑÓÐ)Ø$×0Ñ0Ó2‰JˆD�$Ü�$—+‘+˜gÓ&Ô'Ü�$—+‘+˜gÓ&Ô'ÜÐ^ÔadÐep×euÑeuÓewÓaxÑxÓyÐyð ˜4Ò
ô ˜DÓ!€GÜ˜K×.Ñ.×7Ñ7Ó9×?Ñ?ÓA×HÑHÈÓQÓR€Gòô ‡O�O�G˜[Ô)Ø˜ Ð(Ð(r   c                  óÖ   — 	 t        t        j                  j                  d«      d   «      } | dk  r)t        j
                  j                  j                  «        y y # t        $ r Y y w xY w)NÚ.r   é   )ÚintÚzmqÚ__version__Úsplitr   Ú	eventloopÚioloopÚinstall)Úpyzmq_majors    r   Ú_zmq_install_iolooprU   R   s^   € ðÜœ#Ÿ/™/×/Ñ/°Ó4°QÑ7Ó8ˆð �RÒÜ�‰×Ñ×$Ñ$Õ&ð øô ò áðús   ‚+A Á	A(Á'A(z..ÚviewerÚdistz
index.htmliX  iè  Útcpip  )Úset_transformÚ
set_objectÚdeleteÚset_propertyÚset_animationc                 ój  — t        |«      D ]  }||z   }	  | |fi |¤Ž|fc S  t        dj                  |||z   «      «      ‚# t        t        j                  j                  f$ r- t        dj                  |«      t        j                  ¬«       Y Œ„t        $ r}t        t        |«      «       ‚ d }~ww xY w)Nz$Port: {:d} in use, trying another...©Úfilez;Could not find an available port in the range: [{:d}, {:d}))ÚrangeÚOSErrorrN   ÚerrorÚZMQErrorr?   r   r.   r"   Ú	ExceptionÚtype)ÚfuncÚdefault_portÚmax_attemptsÚkwargsÚiÚportÚes          r   Úfind_available_portrn   k   s»   € Ü�<Ö ˆØ˜aÑˆð	Ù˜Ñ' Ñ'¨Ð-Ò-ð !ô ÐU×\Ñ\Ð]iÐkwð  {Gñ  lGó  Hó  Ið  	Jøô œŸ™×+Ñ+Ð,ò 	XÜÐ8×?Ñ?ÀÓEÌCÏJÉJ×WÜò 	Ü”$�q“'ŒNØûð	ús   •
AÁAB2ÂB2ÂB-Â-B2c                   ó0   ‡ — e Zd Zˆ fd„Zd„ Zd„ Zd„ Zˆ xZS )ÚWebSocketHandlerc                 óX   •— |j                  d«      | _        t        t        | �  |i |¤Ž y )NÚbridge)Úpoprr   Úsuperrp   Ú__init__)ÚselfrE   rj   Ú	__class__s      €r   ru   zWebSocketHandler.__init__z   s(   ø€ Ø—j‘j Ó*ˆŒÜÔ Ñ.°Ð?¸Ó?r   c                 ó¼   — | j                   j                  j                  | «       t        d| t        j
                  ¬«       | j                   j                  | «       y )Nzopened:r_   )rr   Úwebsocket_poolÚaddr?   r.   r"   Ú
send_scene©rv   s    r   ÚopenzWebSocketHandler.open~   s<   € Ø�‰×"Ñ"×&Ñ& tÔ,Üˆi˜¤C§J¡JÕ/Ø�‰×Ñ˜tÕ$r   c                 ó¦   — 	 t        j                  |«      }| j                  j                  |d   «       y # t        $ r}t        |«       ‚ d }~ww xY w)NÚdata)ÚjsonÚloadsrr   Ú
send_imagere   r?   )rv   ÚmessageÚerrs      r   Ú
on_messagezWebSocketHandler.on_messageƒ   sH   € ð	Ü—j‘j Ó)ˆGØ�K‰K×"Ñ" 7¨6¡?Ô3ØøÜò 	Ü�#ŒJØûð	ús   ‚36 ¶	A¿AÁAc                 ó†   — | j                   j                  j                  | «       t        d| t        j
                  ¬«       y )Nzclosed:r_   )rr   ry   Úremover?   r.   r"   r|   s    r   Úon_closezWebSocketHandler.on_closeŒ   s*   € Ø�‰×"Ñ"×)Ñ)¨$Ô/Üˆi˜¤C§J¡JÖ/r   )Ú__name__Ú
__module__Ú__qualname__ru   r}   r…   rˆ   Ú__classcell__)rw   s   @r   rp   rp   y   s   ø„ ô@ò%ò
ö0r   rp   c                 óh   — dj                  t        j                  | «      j                  d«      «      S )zIEncode the drawing command into a Javascript fetch() command for display.z¨
fetch("data:application/octet-binary;base64,{}")
    .then(res => res.arrayBuffer())
    .then(buffer => viewer.handle_command_bytearray(new Uint8Array(buffer)));
    r'   )r   Úbase64Ú	b64encoder<   )r   s    r   Úcreate_commandr�   ‘   s.   € ð÷ 	‰Œv×Ñ Ó%×,Ñ,¨WÓ5Ó6ð	7r   c                   ó   — e Zd ZdZd„ Zy)ÚStaticFileHandlerNoCachezjEnsures static files do not get cached.

    Taken from: https://stackoverflow.com/a/18879658/7829525
    c                 ó(   — | j                  dd«       y )NzCache-Controlz.no-store, no-cache, must-revalidate, max-age=0)Ú
set_header)rv   r4   s     r   Úset_extra_headersz*StaticFileHandlerNoCache.set_extra_headersŸ   s   € à�‰˜Ð)YÕZr   N)r‰   rŠ   r‹   Ú__doc__r•   © r   r   r’   r’   š   s   „ ñó[r   r’   c                   ój   — e Zd Z ej                  «       Z	 	 dd„Zd„ Zd„ Zd„ Z	d„ Z
d„ Zd„ Zd	„ Zd
„ Zy)ÚZMQWebSocketBridgeNc                 óì  ‡ ‡— |‰ _         t        «       ‰ _        ‰ j                  «       ‰ _        t
        j                  j                  j                  «       ‰ _        |€,ˆ fd„}t        |t        «      \  \  ‰ _        ‰ _        ‰ _        }n$‰ j                  |«      \  ‰ _        ‰ _        ‰ _        d}	i }
|€|�$|€t        d«      ‚|€t        d«      ‚||dœ|
d<   d}	|€.t        ‰ j                  j                   t"        fi |
¤Ž\  }‰ _        n$ ‰ j                  j                   |fi |
¤Ž |‰ _        dj'                  |	‰ j                   ‰ j$                  ¬	«      ‰ _        |rÑ|	dk(  rt        d
«      ‚	 dd lŠdd lŠ‰j.                  j1                  d¬«      }‰j2                  j5                  ‰ j$                  d|¬«      ‰ _        t7        ‰ j(                  t8        «      s‰ j(                  j:                  ‰ _        ‰ xj(                  dz  c_        t=        d«       ˆfd„}t?        j@                  |«       tI        «       ‰ _%        y # tB        $ r-}d|jD                  jF                  v rt        d«      ‚Y d }~ŒAd }~ww xY w)Nc                 ód   •— ‰j                  dj                  t        ‰j                  | «      «      S )Nz{:s}://{:s}:{:d})Ú	setup_zmqr   ÚDEFAULT_ZMQ_METHODÚhost)rl   rv   s    €r   Úfz&ZMQWebSocketBridge.__init__.<locals>.f¯   s+   ø€ Ø—~‘~Ð&8×&?Ñ&?Ô@RÐTX×T]ÑT]Ð_cÓ&dÓeÐer   zhttp:z2You must supply a certfile if you supply a keyfilez2You must supply a keyfile if you supply a certfile)ÚcertfileÚkeyfileÚssl_optionszhttps:z!{protocol}//{host}:{port}/static/)Úprotocolrž   rl   z0The free version of ngrok does not support httpsr   T)r$   Úhttp)Úpyngrok_configz/static/Ú
c                  ó:   •— ‰ j                   j                  «        y r)   )Úngrokr*   )Úpyngroks   €r   r-   z,ZMQWebSocketBridge.__init__.<locals>.cleanupã   s   ø€ Ø—M‘M×&Ñ&Õ(r   r©   z:You must install pyngrok (e.g. via `pip install pyngrok`).)&rž   Úsetry   Úmake_appÚappÚtornadorR   ÚIOLoopÚcurrentrn   ÚDEFAULT_ZMQ_PORTÚ
zmq_socketÚ
zmq_streamr&   rœ   re   ÚlistenÚDEFAULT_FILESERVER_PORTÚfileserver_portr   rH   Úpyngrok.confÚpyngrok.ngrokÚconfÚPyngrokConfigr¨   ÚconnectÚ
isinstancerA   Ú
public_urlr?   rB   rC   ÚImportErrorrw   r‰   r   Útree)rv   r&   rž   rl   r    r¡   Úngrok_http_tunnelrŸ   Ú_r£   Úlisten_kwargsÚconfigr-   rm   r©   s   `             @r   ru   zZMQWebSocketBridge.__init__§   s1  ù€ àˆŒ	Ü!›eˆÔØ—=‘=“?ˆŒÜ—n‘n×+Ñ+×3Ñ3Ó5ˆŒàˆ?ôfäBUÐVWÔYiÓBjÑ?Ñ<ˆTŒ_˜dœo¨t¬|¹aà=A¿^¹^ÈGÓ=TÑ:ˆDŒO˜Tœ_¨d¬làˆØˆØÐ 7Ð#6ØÐÜÐ TÓUÐVØˆÜÐ TÓUÐVà9AØ8?ñ,BˆM˜-Ñ(àˆHàˆ<Ü&9¸$¿(¹(¿/¹/ÔKbÑ&tÐfsÑ&tÑ#ˆAˆtÕ#àˆD�H‰H�O‰O˜DÑ2 MÒ2Ø#'ˆDÔ Ø:×AÑAØ D§I¡I°D×4HÑ4Hð Bó JˆŒñ Ø˜8Ò#ô  Ð RÓSÐTðcÛ#Û$ð
 !Ÿ™×3Ñ3ÀdÐ3ÓK�Ø&Ÿ}™}×4Ñ4°T×5IÑ5IÈ6ÐbhÐ4Ói�”ô " $§,¡,´Ô4Ø#'§<¡<×#:Ñ#:�D”LØ—’ 
Ñ*•ä�d”ô)ô —‘ Ô(ô “Kˆ�	øô	 ò cØ §¡× 4Ñ 4Ñ4Ü#Ð$`ÓaÐbô 5ûðcús   Å-C H= È=	I3É#I.É.I3c                 óz   — t         j                  j                  dt        t        t
        dœfdt        d| ifg«      S )Nz/static/(.*))r4   Údefault_filenameÚ/rr   )r­   ÚwebÚApplicationr’   ÚVIEWER_ROOTÚVIEWER_HTMLrp   r|   s    r   r«   zZMQWebSocketBridge.make_appî   s?   € Ü�{‰{×&Ñ&ØÔ6ÄÔbmÑ8nÐoØÔ# h°Ð%5Ð6ð(
ó ð 	r   c                 ó¸   — t        | j                  «      dkD  r| j                  j                  d«       y | j                  j                  d| j                  «       y )Nr   ó   okgš™™™™™¹?)Úlenry   r±   ÚsendrR   Ú
call_laterÚwait_for_websocketsr|   s    r   rÏ   z&ZMQWebSocketBridge.wait_for_websocketsô   sA   € Üˆt×"Ñ"Ó# aÒ'Ø�O‰O× Ñ  Õ'à�K‰K×"Ñ" 3¨×(@Ñ(@ÕAr   c                 ó�   — dd l }|j                  dd«      \  }} |j                  |«      }| j                  j	                  |«       y )Nr   Ú,r   )rŽ   rP   Ú	b64decoder²   rÍ   )rv   r   rŽ   ÚmimeÚimg_codeÚ	img_bytess         r   r‚   zZMQWebSocketBridge.send_imageú   s=   € ÛØŸ™ C¨Ó+‰ˆˆhØ$�F×$Ñ$ XÓ.ˆ	Ø�‰×Ñ˜YÕ'r   c                 óB  ‡ ‡— ‰d   j                  d«      }|dk(  r5‰ j                  j                  ‰ j                  j	                  d«      «       y |dk(  r&‰ j
                  j                  ‰ j                  «       y |dk(  rKt        ‰ j                  «      dkD  r‰ j                  ‰«       y ‰ j
                  j                  dˆˆ fd„«       y |t        v �rÜt        ‰«      dk7  r‰ j                  j                  d	«       y t        t        d
„ ‰d   j                  d«      j                  d«      «      «      }‰d   }|dk(  xrE t!        ‰ j"                  |«      j$                  xr# t!        ‰ j"                  |«      j$                  |k(  }|s‰ j                  ‰«       |dk(  r|t!        ‰ j"                  |«      _        nÚ|dk(  r7|t!        ‰ j"                  |«      _        g t!        ‰ j"                  |«      _        nž|dk(  r0t!        ‰ j"                  |«      j(                  j+                  |«       ni|dk(  r|t!        ‰ j"                  |«      _        nH|dk(  rCt        |«      dkD  r&t!        ‰ j"                  |d d «      }|d   }||v r||= nt/        «       ‰ _        ‰ j                  j                  d«       y |dk(  �rBd}t1        ‰ j"                  «      D ]Ž  }	|	j$                  �|t3        |	j$                  «      z  }|	j(                  D ]  }
|t3        |
«      z  }Œ |	j&                  �|t3        |	j&                  «      z  }|	j,                  €Œw|t3        |	j,                  «      z  }Œ� t4        j6                  j9                  t:        d«      }d}t=        |d«      5 }|j?                  «       }d d d «       dj9                  |«      }djA                  ||¬«      }‰ j                  j                  |j	                  d«      «       y ‰ j                  j                  d«       y # 1 sw Y   ŒtxY w)Nr   r'   Úurlr+   Úcapture_imageg333333Ó?c                  ó&   •— ‰j                  ‰ «      S r)   )Ú
handle_zmq)Úframesrv   s   €€r   Ú<lambda>z/ZMQWebSocketBridge.handle_zmq.<locals>.<lambda>
  s   ø€ °D·O±OÀFÔ4Kr   é   s   error: expected 3 framesc                 ó   — t        | «      dkD  S )Nr   )rÌ   )Úxs    r   rÜ   z/ZMQWebSocketBridge.handle_zmq.<locals>.<lambda>  s   € ¬¨Q«°!ªr   r   rÅ   é   rZ   rY   r\   r]   r[   éÿÿÿÿrË   Ú	get_scener%   zmain.min.jsÚra÷  
                <!DOCTYPE html>
                <html>
                    <head> <meta charset=utf-8> <title>MeshCat</title> </head>
                    <body>
                        <div id="meshcat-pane">
                        </div>
                        <script>
                            {mainminjs}
                        </script>
                        <script>
                            var viewer = new MeshCat.Viewer(document.getElementById("meshcat-pane"));
                            {commands}
                        </script>
                         <style>
                            body {{margin: 0; }}
                            #meshcat-pane {{
                                width: 100vw;
                                height: 100vh;
                                overflow: hidden;
                            }}
                        </style>
                        <script id="embedded-json"></script>
                    </body>
                </html>
            )Ú	mainminjsÚcommandss   error: unrecognized comand)!r<   r±   rÍ   rH   ÚencoderR   Úadd_callbackrÏ   rÌ   ry   Úforward_to_websocketsrÎ   ÚMESHCAT_COMMANDSÚlistÚfilterrP   r
   r¾   ÚobjectÚ	transformÚ
propertiesr0   Ú	animationr   r	   r�   r2   r4   ÚjoinrÈ   r}   Ú	readlinesr   )rv   rÛ   Úcmdr4   r   Ú	cache_hitÚparentÚchildÚdrawing_commandsÚnodeÚpÚmainminjs_pathÚmainminjs_srcrŸ   Úhtmls   ``             r   rÚ   zZMQWebSocketBridge.handle_zmq   so  ù€ Ø�Q‰i×Ñ˜wÓ'ˆØ�%Š<Ø�O‰O× Ñ  §¡×!4Ñ!4°WÓ!=Õ>Ø�FŠ]Ø�K‰K×$Ñ$ T×%=Ñ%=Õ>Ø�OÒ#Ü�4×&Ñ&Ó'¨!Ò+Ø×*Ñ*¨6Õ2à—‘×&Ñ& sÔ,KÕLØÔ$Ò$Ü�6‹{˜aÒØ—‘×$Ñ$Ð%@ÔAØÜœÑ3°V¸A±Y×5EÑ5EÀgÓ5N×5TÑ5TÐUXÓ5YÓZÓ[ˆDØ˜!‘9ˆDà Ñ,ò CÜ" 4§9¡9¨dÓ3×:Ñ:òCä" 4§9¡9¨dÓ3×:Ñ:¸dÑBð ñ Ø×*Ñ*¨6Ô2Ø�oÒ%Ø7;”	˜$Ÿ)™) TÓ*Õ4Ø˜Ò$Ø48”	˜$Ÿ)™) TÓ*Ô1Ø8:”	˜$Ÿ)™) TÓ*Õ5Ø˜Ò&Ü˜$Ÿ)™) TÓ*×5Ñ5×<Ñ<¸TÕBØ˜Ò'Ø7;”	˜$Ÿ)™) TÓ*Õ4Ø˜’Ü�t“9˜q’=Ü& t§y¡y°$°s¸°)Ó<�FØ  ™H�EØ ‘Ø" 5™Mä )£�D”IØ�O‰O× Ñ  Õ'Ø�KÓð  "ÐÜ˜TŸY™Yž�Ø—;‘;Ð*Ø$¬°t·{±{Ó(CÑCÐ$ØŸœ�AØ$¬°qÓ(9Ñ9Ñ$ð )à—>‘>Ð-Ø$¬°t·~±~Ó(FÑFÐ$Ø—>‘>Ñ-Ø$¬°t·~±~Ó(FÑFÑ$ð (ô  ŸW™WŸ\™\¬+°}ÓEˆNØˆMÜ�n cÔ*¨aØ !§¡£�÷ +àŸG™G MÓ2ˆMð÷2 ‘ Ð9I�ÓJð3 ð4 �O‰O× Ñ  §¡¨WÓ!5Õ6à�O‰O× Ñ Ð!>Õ?÷A +Ð*ús   ÎPÐPc                 óX   — |\  }}}| j                   D ]  }|j                  |d¬«       Œ y ©NT)Úbinary)ry   Úwrite_message)rv   rÛ   rò   r4   r   Ú	websockets         r   rè   z(ZMQWebSocketBridge.forward_to_websockets]  s0   € Ø ‰ˆˆT�4Ø×,Ô,ˆIØ×#Ñ# D°Ð#Õ6ñ -r   c                 óÌ   — | j                   j                  t        j                  «      }|j	                  |«       t        |«      }|j                  | j                  «       |||fS r)   )ÚcontextÚsocketrN   ÚREPÚbindr   Úon_recvrÚ   )rv   r×   r±   r²   s       r   rœ   zZMQWebSocketBridge.setup_zmqb  sO   € Ø—\‘\×(Ñ(¬¯©Ó1ˆ
Ø�‰˜ÔÜ˜zÓ*ˆ
Ø×Ñ˜4Ÿ?™?Ô+Ø˜: sÐ*Ð*r   c                 óx  — t        | j                  «      D ]¢  }|j                  �|j                  |j                  d¬«       |j                  D ]  }|j                  |d¬«       Œ |j
                  �|j                  |j
                  d¬«       |j                  €Œ†|j                  |j                  d¬«       Œ¤ y rý   )r	   r¾   rì   rÿ   rî   rí   rï   )rv   r   r÷   rø   s       r   r{   zZMQWebSocketBridge.send_scenei  s˜   € Ü˜Ÿ™–OˆDØ�{‰{Ð&Ø×'Ñ'¨¯©¸DÐ'ÔAØ—_”_�Ø×'Ñ'¨°$Ð'Õ7ð %à�~‰~Ð)Ø×'Ñ'¨¯©¸tÐ'ÔDØ�~‰~Ñ)Ø×'Ñ'¨¯©¸tÐ'ÕDñ $r   c                 ó8   — | j                   j                  «        y r)   )rR   Ústartr|   s    r   ÚrunzZMQWebSocketBridge.runt  s   € Ø�‰×ÑÕr   )Nz	127.0.0.1NNNF)r‰   rŠ   r‹   rN   ÚContextr  ru   r«   rÏ   r‚   rÚ   rè   rœ   r{   r
  r—   r   r   r™   r™   ¤   sI   „ Øˆc�k‰k‹m€Gà<@Ø@EóE òNòBò(ò[@òz7ò
+ò	Eór   r™   c                  óf  — dd l } dd l}dd l}dd l}dd l}|j
                  dk\  r2|j                  «       dk(  r|j                  |j                  «       «       | j                  d¬«      }|j                  ddt        dd ¬	«       |j                  d
dd¬«       |j                  dt        d ¬«       |j                  dt        d ¬«       |j                  ddd¬«       |j                  «       }t        |j                  |j                  |j                   |j"                  ¬«      }t%        dj'                  |j                  «      «       t%        dj'                  |j(                  «      «       |j*                  r|j+                  |j(                  d¬«       	 |j-                  «        y # t.        $ r Y y w xY w)Nr   )rÝ   é   ÚWindowsz;Serve the MeshCat HTML files and listen for ZeroMQ commands)Údescriptionr   z-zÚ?)rf   ÚnargsÚdefaultz--openz-oÚ
store_true)Úactionz
--certfile)rf   r  z	--keyfilez--ngrok_http_tunnelz‘
ngrok is a service for creating a public URL from your local machine, which
is very useful if you would like to make your meshcat server public.)r  Úhelp)r&   r    r¡   r¿   zzmq_url={:s}zweb_url={:s}rà   )Únew)Úargparser.   Ú
webbrowserÚplatformÚasyncioÚversion_infoÚsystemÚset_event_loop_policyÚWindowsSelectorEventLoopPolicyÚArgumentParserÚadd_argumentrA   Ú
parse_argsr™   r&   r    r¡   r¿   r?   r   rH   r}   r
  ÚKeyboardInterrupt)r  r.   r  r  r  ÚparserÚresultsrr   s           r   Úmainr%  x  su  € ÛÛÛÛÛð ×Ñ˜6Ò! h§o¡oÓ&7¸9Ò&DØ×%Ñ% g×&LÑ&LÓ&NÔOà×$Ñ$Ð1nÐ$Óo€FØ
×Ñ˜ T´¸3ÈÐÔMØ
×Ñ˜ $¨|ÐÔ<Ø
×Ñ˜¬3¸ÐÔ=Ø
×Ñ˜¬#°tÐÔ<Ø
×ÑÐ-°lð JHÐô Ið ×ÑÓ!€GÜ¨¯©Ø)0×)9Ñ)9Ø(/¯©Ø29×2KÑ2KôM€Fô 
ˆ.×
Ñ
 §¡Ó
/Ô0Ü	ˆ.×
Ñ
 §¡Ó
/Ô0Ø‡|‚|Ø�‰˜Ÿ™¨AˆÔ.ðØ�
‰
�øÜò Ùðús   ÆF$ Æ$	F0Æ/F0Ú__main__)4Ú
__future__r   r   r   rB   rŽ   r2   r   r.   r7   Úmultiprocessingr€   Útornado.webr­   Útornado.ioloopÚtornado.websocketÚtornado.genrN   Úzmq.eventloop.ioloopÚzmq.eventloop.zmqstreamr   r¾   r   r	   r
   r   r   r   rI   rU   r4   rð   r5   r6   rÈ   rÉ   r´   ÚMAX_ATTEMPTSr�   r°   ré   rn   r   rp   r�   rÆ   ÚStaticFileHandlerr’   rì   r™   r%  r‰   r—   r   r   Ú<module>r1     s  ðß @Ñ @ã Û Û 	Û 	Û 
Û Û Û ã Û Û Û ã 
Û Ý -ç ,Ñ ,ò!ò,ò,ð ,0¸Ró *)òZ	'ñ Ô à�g‰g�l‰l˜2Ÿ7™7Ÿ?™?¨8Ó4°d¸HÀfÓM€Ø€àÐ Ø€ØÐ ØÐ â]Ð ð :Fó Jô0�w×(Ñ(×9Ñ9ô 0ò07ô[˜wŸ{™{×<Ñ<ô [ôQ˜ô Qòh!ðF ˆzÒÙ…Fð r   