
    bg2                        S r SSKrSSKrSSKrSSKrSSKrSSKrSSKJrJ	r	  SSK
Jr  SSKJr  SSKJr  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJrJr  SSKJrJr  SSKJr  SSKrSSKr\R>                  S:  a5  \R@                  S:X  a%  SSK!r!\!RD                  " \!RF                  " 5       5        \RH                  " S5      r%Sr&S r'SS jr( " S S\RR                  5      r* " S S\5      r+ " S S5      r,g)z
livereload.server
~~~~~~~~~~~~~~~~~

WSGI app server for livereload.

:copyright: (c) 2013 - 2015 by Hsiaoming Yang
:license: BSD, see LICENSE for more details.
    N)PopenPIPE)WSGIContainer)IOLoop)add_reload_hook)web)escape)httputil)LogFormatter   )LiveReloadHandlerLiveReloadJSHandler)ForceReloadHandlerStaticFileHandler)get_watcher_class)      win32
livereloads   </head>c                    ^ ^^ U UU4S jnU$ )z1Helper Function to Add HTTP headers to the serverc                 B   > T" U /UQ70 UD6  U R                  TT5        g N)
set_header)selfargskwargsfnnamevalues      3/usr/lib/python3/dist-packages/livereload/server.pyset_default_headers'set_header.<locals>.set_default_headers-   s#    
4!$!&!e$     )r   r   r   r!   s   ``` r    r   r   +   s    % r#   c                   ^ ^^^^ T(       d  [         R                  mO`[         R                  R                  T5      nU(       a:  [         R                  R	                  U5      (       d  [         R
                  " U5        [        T [        [        45      (       d  T(       d  [        R                  " T 5      m U UUUU4S jnU$ )a  Execute a shell command.

You can add a shell command::

    server.watch(
        'style.less', shell('lessc style.less', output='style.css')
    )

:param cmd: a shell command, string or list
:param output: output stdout to the given file
:param mode: only works with output, mode ``w`` means write,
             mode ``a`` means append
:param cwd: set working directory before command is executed.
:param shell: if true, on Unix the executable argument specifies a
              replacement shell for the default ``/bin/sh``.
c            	        >  [        T[        [        [        TT	S9n U R                  5       u  p#UR                  5       nUR                  5       nU(       a  [        R	                  U5        U$ [        TT5       nUR                  U5        S S S 5        g ! [         aX  n[        R	                  U5        UR
                  [
        R                  :X  a  [        R	                  STS   5        Us S nA$ S nAff = f! , (       d  f       g = f)N)stdinstdoutstderrcwdshellzmaybe you haven't installed %sr   )r   r   OSErrorloggererrorerrnoENOENTcommunicatedecodeopenwrite)
per(   r)   fcmdr*   modeoutputr+   s
        r    	run_shellshell.<locals>.run_shellN   s    	cd4S!#A LL M&$1GGFO    	LLOww%,,&=s1vFH		  s*   B 9C9
C6AC1+C61C69
D)osdevnullpathdirnameisdirmakedirs
isinstancelisttupleshlexsplit)r8   r:   r9   r*   r+   folderr;   s   `````  r    r+   r+   3   sw    " ("''--//KKcD%=))%kk# & r#   c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )LiveScriptInjectord   c                 $   > [         TU ]  U5        g r   )super__init__)r   request	__class__s     r    rN   LiveScriptInjector.__init__e   s    !r#   c                    SUR                  SS5      ;   nU(       aj  [        U;   a`  UR                  [        U R                  [        -   S5      nSU;   a2  [	        US   5      [        U R                  5      -   n[        U5      US'   XU4$ )NhtmlContent-Type r   Content-Length)getHEAD_ENDreplacescriptintlenstr)r   status_codeheaderschunk	finishingis_htmllengths          r    transform_first_chunk(LiveScriptInjector.transform_first_chunkh   s|    GKK;;x5(MM(DKK(,BAFE7*W%567#dkk:JJ,/K()U**r#   r$   )__name__
__module____qualname____firstlineno__rN   rd   __static_attributes____classcell__)rP   s   @r    rJ   rJ   d   s    "+ +r#   rJ   c                   $    \ rS rSrSS jrS rSrg)LiveScriptContainerr   c                     Xl         X l        g r   )wsgi_apprZ   )r   rp   rZ   s      r    rN   LiveScriptContainer.__init__s   s     r#   c                   ^^ 0 m/ mSUU4S jjnU R                  [        U R                   5      R                  U5      U5      n TR                  U5        SR	                  T5      n[        US5      (       a  UR                  5         T(       d  [        S5      eTS   R                  SS5      u  pV[        U5      nTS   nU VV	s1 s H  u  pUR                  5       iM     n
nn	[        R                  " U5      n[        U;   a'  UR                  [        U R                  [        -   5      nUS	:w  aB  S
U
;  a  UR!                  S5        SU
;  a%  UR!                  S[#        [%        U5      5      45        SU
;  a  UR!                  S5        [&        R(                  " SXV5      n[&        R*                  " 5       nU H>  u  pUR                  5       S:X  a  [#        [%        U5      5      nUR-                  X5        M@     UR.                  R1                  XUS9  UR.                  R3                  5         U R5                  XQ5        g ! [        US5      (       a  UR                  5         f f = fs  sn	nf )Nc                 0   > U TS'   UTS'   TR                   $ )Nstatusr_   )append)rt   response_headersexc_infodataresponses      r    start_response4LiveScriptContainer.__call__.<locals>.start_response{   s    #DN.DO??"r#   r#   closez$WSGI app did not call start_responsert    r   r_   i0  zcontent-type)rT   z'application/octet-stream; charset=UTF-8zcontent-lengthrV   server)Server
LiveServerzHTTP/1.1)r`   r   )rp   r   environextendjoinhasattrr|   	ExceptionrG   r[   lowerr	   utf8rX   rY   rZ   ru   r]   r\   r
   ResponseStartLineHTTPHeadersadd
connectionwrite_headersfinish_log)r   rO   rz   app_responsebodyr^   reasonr_   kv
header_set
start_line
header_objkeyr   rx   ry   s                  @@r    __call__LiveScriptContainer.__call__w   s   	# 	#
 }}$--(009>K	%OOL)88H%D|W--""$BCC"8n223:+&y/.56gFQaggig
6{{4 t<<$++*@AD#Z/     z1 0#c$i.AB:%NN34//

 ))+
!JCyy{..CINN3& " 	((t(L!!#		+'I |W--""$ . 7s   "I I($I%)rZ   rp   N)rU   )rf   rg   rh   ri   rN   r   rj   r$   r#   r    rm   rm   r   s    3(r#   rm   c                   \    \ rS rSrSrSS jrS rSS jr  SS jrS r	   SS	 jr
S
 rSrg)r      a  Livereload server interface.

Initialize a server and watch file changes::

    server = Server(wsgi_app)
    server.serve()

:param app: a WSGI application instance
:param watcher: A Watcher instance, you don't have to initialize
                it by yourself. Under Linux, you will want to install
                pyinotify and use INotifyWatcher() to avoid wasted
                CPU usage.
Nc                 p    S U l         Xl        U(       d  [        5       nU" 5       nX l        [        U l        g r   )rootappr   watcherr   SFH)r   r   r   watcher_clss       r    rN   Server.__init__   s,    	+-K!mG$r#   c                 `    [        [        R                  X5      [        l        [        U l        g)a  Add or override HTTP headers at the at the beginning of the 
   request.

Once you have initialized a server, you can add one or more 
headers before starting the server::

    server.setHeader('Access-Control-Allow-Origin', '*')
    server.setHeader('Access-Control-Allow-Methods', '*')
    server.serve()

:param name: The name of the header field to be defined.
:param value: The value of the header field to be defined.
N)r   r   r!   r   )r   r   r   s      r    	setHeaderServer.setHeader   s%     1;!55t1D-$r#   c                     [        U[        5      (       a  Un[        U5      nSU 3Ul        U R                  R                  XX4S9  g)a)  Add the given filepath for watcher list.

Once you have initialized a server, watch file changes before
serve the server::

    server.watch('static/*.stylus', 'make static')
    def alert():
        print('foo')
    server.watch('foo.txt', alert)
    server.serve()

:param filepath: files to be watched, it can be a filepath,
                 a directory, or a glob pattern
:param func: the function to be called, it can be a string of
             shell command, or any callable object without
             parameters
:param delay: Delay sending the reload message. Use 'forever' to
              not send it. This is useful to compile sass files to
              css, but reload on changed css files then only.
:param ignore: A function return True to ignore a certain pattern of
               filepath.
zshell: )ignoreN)rC   r]   r+   r   r   watch)r   filepathfuncdelayr   r8   s         r    r   Server.watch   sC    . dC  C;D!#DI85@r#   c                 V  ^ U R                   [        l         U[        l        Uc  U R                  (       a  SnS[        4S[        4S[
        4/nSmU(       a  [        R                  " TU-  5      mO[        R                  " TS-  5      mU R                  T5      n " U4S jS[        5      nU(       d+  Xg-   n	[        R                  " U	UU/S	9n
U
R                  XS
9  g [        R                  " UUU/S	9n
U
R                  XS
9  [        R                  " USS9nUR                  X2S
9  g )NTz/livereloadz/forcereloadz/livereload.jsz<script type="text/javascript">(function(){var s=document.createElement("script");var port=%s;s.src="//"+window.location.hostname+":"+port+ "/livereload.js?port=" + port;document.head.appendChild(s);})();</script>zJ(window.location.port || (window.location.protocol == 'https:' ? 443: 80))c                      > \ rS rSr Y rSrg)/Server.application.<locals>.ConfiguredTransformi  r$   N)rf   rg   rh   ri   rZ   rj   )live_scripts   r    ConfiguredTransformr     s     Fr#   r   )handlersdebug
transforms)addressF)r   r   )r   r   live_cssr   r   r   r	   r   get_web_handlersrJ   r   Applicationlisten)r   porthostliveportr   r   live_handlersweb_handlersr   r   r   liver   s               @r    applicationServer.application   s(   $(LL!%-"=TXXE ./01 34
 	  ++kH&<=K ++k  5A  'A  BK,,[9	!"4 	! $3H//!/0C
 JJtJ*//%/0C
 JJtJ*??MGDKKK/r#   c                     U R                   (       a,  [        U R                   U5      nS[        R                  SU04/$ SU R                  U R
                  =(       d    SU R                  S.4/$ )Nz.*fallbackz/(.*).)r?   default_filename)r   rm   r   FallbackHandlerr   r   r   )r   rZ   r   s      r    r   Server.get_web_handlers*  sf    88*488V<HC//*h1GHIItxx		(S$($9$9" 
 	
r#   c                   ^^^ T=(       d    SmUb  X@l         U R                  5         [        R                  ST ST 35        Xl        U R                  TTX%U	S9  U(       a  [        R                  S5        Tb*  UUU4S jn[        R                  " US9R                  5          U R                  R                  R                  S	U45        [        R                  " 5         [        S
 5        [         R"                  " 5       R                  5         [         R$                  " 5       R'                  SS9  g! [(         a    [        R                  S5         gf = f)a  Start serve the server with the given port.

:param port: serve on this port, default is 5500
:param liveport: live reload on this port
:param host: serve on this hostname, default is 127.0.0.1
:param root: serve static on this root directory
:param debug: set debug mode, which autoreloads the app on code changes
              via Tornado (and causes polling). Defaults to True when
              ``self.app`` is set, otherwise False.
:param open_url_delay: open webbrowser after the delay seconds
:param live_css: whether to use live css or force reload on css.
                 Defaults to True
:param default_filename: launch this file from the selected root on startup
z	127.0.0.1NzServing on http://:)r   r   r   z*Use `open_url_delay` instead of `open_url`c                  j   > [         R                  " T5        [        R                  " ST  ST 35        g )Nzhttp://r   )timesleep
webbrowserr3   )r   open_url_delayr   s   r    openerServer.serve.<locals>.openerW  s(    

>*'$q 78r#   )target__livereload__c                  H    [         R                  " 5       R                  5       $ r   )r   instancestopr$   r#   r    <lambda>Server.serve.<locals>.<lambda>`  s    FOO$5$:$:$<r#   T)all_fdszShutting down...)r   _setup_loggingr-   infor   r   r.   	threadingThreadstartr   _changesru   r   start_tasksr   r   r   currentr|   KeyboardInterrupt)r   r   r   r   r   r   open_urlrestart_delayr   r   r   r   s    ` `    `   r    serveServer.serve5  s   " "{I(av67 0$ 	 	K LLEF%9 F+113
	,LL!!((*:M)JK))+<=OO##%NN""4"0  	,KK*+	,s   %BD3 3EEc                    [         R                  [        R                  5        [        R                  " 5       nUR                  [        5       5        [         R                  U5        [        R                  " S5      R                  U5        g )Ntornado)	r-   setLevelloggingINFOStreamHandlersetFormatterr   
addHandler	getLogger)r   channels     r    r   Server._setup_loggingh  sY    %'')\^,'" 	)$//8r#   )r   r   r   r   r   )NN)NNN)NNT)
i|  NNNNF   NTz
index.html)rf   rg   rh   ri   __doc__rN   r   r   r   r   r   r   rj   r$   r#   r    r   r      sC    %%$A< <@!30j	
 KO>B.:1,f9r#   r   )NwNF)-r   r=   r   rF   r   r   r   
subprocessr   r   tornado.wsgir   tornado.ioloopr   tornado.autoreloadr   r   r   r	   r
   tornado.logr   r   r   r   r   r   r   r   sysr/   version_infoplatformasyncioset_event_loop_policyWindowsSelectorEventLoopPolicyr   r-   rX   r   r+   OutputTransformrJ   rm   r   r$   r#   r    <module>r      s    
      " & ! .    $ < ; & 
 v#,,'"9!!'"H"H"JK			<	(.b+,, +8(- 8(vC9 C9r#   