
    6hf                       S r SSKJ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	r	SSK
Jr  SSKJr  SSKJr  SSKJrJrJrJrJrJr  SS	KJrJrJr  S
 r/ SQrS/r\R<                  " S\R>                  5      r S r!S r"S r# " S S5      r$S r%S r& " S S5      r'/ SQr( " S S\RR                  5      r*S r+S r, " S S5      r-S r.g)aR  command server extension for cHg

'S' channel (read/write)
    propagate ui.system() request to client

'attachio' command
    attach client's stdio passed by sendmsg()

'chdir' command
    change current directory

'setenv' command
    replace os.environ completely

'setumask' command (DEPRECATED)
'setumask2' command
    set umask

'validate' command
    reload the config and check if the server is up to date

Config
------

::

  [chgserver]
  # how long (in seconds) should an idle chg server exit
  idletimeout = 3600

  # whether to skip config or env change checks
  skiphash = False
    )annotationsN)Optional   )_)hex)commandserverencodingerror
extensionspycompatutil)hashutilprocutil
stringutilc                    [        [        R                  " [        R                  " U 5      5      R                  5       5      $ )z return sha1 hexdigest for a list)r   r   sha1r   pprintdigest)itemss    5/usr/lib/python3/dist-packages/mercurial/chgserver.py	_hashlistr   K   s*    x}}Z..u56==?@@    )s   aliass
   diff-toolss   eols   extdiffs
   extensionss   fastannotates   merge-toolss   schemes)s   commandss   show.aliasprefixs~  \A(?:
                    CHGHG
                    |HG(?:DEMANDIMPORT|EMITWARNINGS|MODULEPOLICY|PROF|RCPATH)?
                    |HG(?:ENCODING|PLAIN).*
                    |LANG(?:UAGE)?
                    |LC_.*
                    |LD_.*
                    |PATH
                    |PYTHON.*
                    |TERM(?:INFO)?
                    |TZ
                    )\Zc                   / n[          H#  nUR                  U R                  U5      5        M%     [         H%  u  p#UR                  U R	                  X#5      5        M'     [        U5      nS[        R                  ;   a  S1nO
[        5       n[        R                  R                  5        VVs/ s H+  u  pg[        R                  U5      (       d  M!  Xe;  d  M(  Xg4PM-     nnn[        [        U5      5      n	USS U	SS -   $ s  snnf )a  return a quick hash for detecting config/env changes

confighash is the hash of sensitive config items and environment variables.

for chgserver, it is designed that once confighash changes, the server is
not qualified to serve its client and should redirect the client to a new
server. different from mtimehash, confighash change will not mark the
server outdated and exit since the user can have different configs at the
same time.
s   CHGHGs   HGN   )_configsectionsappendconfigitems_configsectionitemsconfigr   r	   environsetr   _envrematchsorted)
uisectionitemssectionitemsectionhashignoredkvenvitemsenvhashs
             r   _confighashr/   r   s     L"BNN734 #,BIIg45 -L)K8###'% $$**,,DA<<? 	 / 	,  
 x()Gr?WRa[((s   - DDDc                   [         R                   " U 5       VVs/ s H  u  pUPM	     nnn SSKJn  UR                  U5        / n[
        R                  (       a  UR                  [
        R                  5        U H=  n UR                  [
        R                  " [        R                  " U5      5      5        M?     [        [        U5      5      $ s  snnf ! [         a     Nf = f! [         a     Mx  f = f)zget a list of paths that should be checked to detect change

The list will include:
- extensions (will not cover all files for complex extensions)
- mercurial/__version__.py
- python binary
r   )__version__)r    r1   r   ImportErrorr   sysexecutablefsencodeinspect
getabsfile	TypeErrorr$   r!   )r%   nmmodulesr1   filess         r   _getmtimepathsr=      s     (222676TQq6G7!{# EX++,	LL**7+=+=a+@AB 
 #e* 8
    		s(   CC ?9C&
C#"C#&
C43C4c                L    S n[        [        R                  " X5      5      SS $ )a'  return a quick hash for detecting file changes

mtimehash calls stat on given paths and calculate a hash based on size and
mtime of each file. mtimehash does not read file content because reading is
expensive. therefore it's not 100% reliable for detecting content changes.
it's possible to return different hashes for same file contents.
it's also possible to return a same hash for different file contents for
some carefully crafted situation.

for chgserver, it is designed that once mtimehash changes, the server is
considered outdated immediately and should no longer provide service.

mtimehash is not included in confighash because we only know the paths of
extensions after importing them (there is imp.find_module but that faces
race conditions). We need to calculate confighash without importing.
c                     [         R                  " U 5      nU[        R                     UR                  4$ ! [         a     g f = fN)osstatST_MTIMEst_sizeOSError)pathsts     r   trystat_mtimehash.<locals>.trystat   s>    	Bt}}%rzz22 		s   47 
AAN   )r   r   maplist)pathsrH   s     r   
_mtimehashrM      s&    $ X%%g56s;;r   c                  2    \ rS rSrSrS r\SS j5       rSrg)	hashstate   zCa structure storing confighash, mtimehash, paths used for mtimehashc                (    Xl         X l        X0l        g r@   
confighash	mtimehash
mtimepaths)selfrS   rT   rU   s       r   __init__hashstate.__init__   s    $"$r   Nc                    Uc  [        U 5      n[        U 5      n[        U5      nU R                  SSUU5        [	        X#U5      $ )Ns	   cmdservers   confighash = %s mtimehash = %s
)r=   r/   rM   logrO   )r%   rU   rS   rT   s       r   fromuihashstate.fromui   sL    '+J _
z*	
/		
 
;;r   rR   r@   )	__name__
__module____qualname____firstlineno____doc__rW   staticmethodr[   __static_attributes__ r   r   rO   rO      s    M%
 < <r   rO   c                H   ^^  " UU4S jSU R                   5      nU" U 5      $ )Nc                  F   >^  \ rS rSrSU U4S jjrS rSU4S jjrSrU =r$ )_newchgui.<locals>.chgui   c                f   > [         TU ]  U5        U(       a  [        UST5      U l        g TU l        g )N_csystem)superrW   getattrrj   )rV   src	__class__csystems     r   rW   !_newchgui.<locals>.chgui.__init__   s*    GS! 'Z A 'r   c                   X@R                   Ldf  [        U R                   S5      (       aK  U R                   R                  5       [        R                  R                  5       :w  d  U R
                  (       a  [        R                  " XX4S9$ U R                  5         U R                  U[        R                  " U5      U5      $ )Nfileno)r    cwdout)
fouthasattrrr   r   stdout_finoutredirectedsystemflushrj   shellenviron)rV   cmdr    rs   rt   s        r   
_runsystem#_newchgui.<locals>.chgui._runsystem   s     99$tyy(3399##%)?)?)AA))sNNJJL==h&;&;G&DcJJr   c                V   > U R                  U[        R                  " U5      SST0S9  g)N   pager   attachio)typecmdtableT)rj   r   r{   )rV   r|   envattachios      r   	_runpager"_newchgui.<locals>.chgui._runpager   s5    MM%%c*%x0	   r   )rj   r@   )	r]   r^   r_   r`   rW   r}   r   rc   __classcell__)rn   r   ro   s   @r   chguirg      s    	( 	(	K 	 	r   r   rn   )srcuiro   r   r   s    `` r   	_newchguir      s%      B <r   c           	     H   SSK Jn  U R                  R                  5       nS H  n[	        XE[        X5      5        M     [        U S5      (       a  U R                  Ul        UR                  XA5      nUR                  XAUS   5        UR                  XFS   5        U R                  5        HM  u  pxn	U R                  Xx5      n
SU
;   d  U
S:X  d  U
R                  S	5      (       a  M;  UR                  XxX5        MO     US
   nU=(       a    [        R                   R#                  U5      =(       d    S nUS   nUR%                  XLUS9u  p[&        R(                  " U5        [*        R,                  " XBS9  XNLa*  [&        R(                  " U5        [*        R,                  " XS9  XN4$ )Nr   )dispatch)finru   ferrr    rj   s   config_files   config   :s   --config   $s   cwds
   repository)wd)fp)r2   r   rn   loadsetattrrl   rv   rj   _earlyparseopts_parse_config_files_parseconfig
walkconfigconfigsource
startswith	setconfigrA   rF   realpath	_getlocalr   
populateuir   setuplogging)r   argscdebugr   newuiaoptionsr'   namevaluesourcers   rpathrF   newluis                  r   
_loadnewuir     sk   OO  "E/'%+, 0uj!! &&u3G  gn.EF%!34 !& 0 0 2u##G26>V{2f6G6G6M6Mu5 !3 &/C

'"''""3'
/4CM"E%%es%;LD% u0f%""65?r   c                  (    \ rS rSrSrS rSS jrSrg)channeledsystemi)  a  Propagate ui.system() request in the following format:

    payload length (unsigned int),
    type, ' ',
    cmd, ' ',
    cwd, ' ',
    envkey, '=', val, ' ',
    ...
    envkey, '=', val

    if type == 'system', waits for:

    exitcode length (unsigned int),
    exitcode (int)

    if type == 'pager', repetitively waits for a command name ending with '
'
    and executes it defined by cmdtable, or exits the loop if the command name
    is empty.
    c                (    Xl         X l        X0l        g r@   )in_rt   channel)rV   r   rt   r   s       r   rW   channeledsystem.__init__>  s    r   Nc           	        XA[         R                  " U=(       d    S5      /nUR                  S UR                  5        5       5        SR	                  U5      nU R
                  R                  [        R                  " SU R                  [        U5      5      5        U R
                  R                  U5        U R
                  R                  5         US:X  a  U R                  R                  S5      n[        R                  " SU5      u  nUS:w  a  [        R                   " [#        S5      5      e[        R                  " S	U R                  R                  S5      5      u  n	U	$ US
:X  a`   U R                  R%                  5       S S nU(       d  g U(       a  X;   a
  XQ   " 5         O"[        R                   " [#        S5      U-  5      eM_  [        R&                  " SU-  5      e)N   .c              3  2   #    U  H  u  pS X4-  v   M     g7f)s   %s=%sNrd   ).0r+   r,   s      r   	<genexpr>+channeledsystem.__call__.<locals>.<genexpr>E  s     B/$!Hv%/s          >cI   system      >Is   invalid response   >ir   s   unexpected command: %ss   invalid S channel type: %s)r   abspathextendr   joinrt   writestructpackr   lenrz   r   readunpackr
   Abortr   readlineProgrammingError)
rV   r|   r    rs   r   r   r   datalengthrcs
             r   __call__channeledsystem.__call__C  s^   4<<t45B'--/BBzz$v{{64<<TCDt9XX]]1%FeV4IV{kk!$7"899MM%q)9:ERIXhh'')#2.MO++a(A&BS&HII  (()F)MNNr   )r   r   rt   )Nr   N)r]   r^   r_   r`   ra   rW   r   rc   rd   r   r   r   r   )  s    (
Or   r   ))cinr   rb)coutru   wb)cerrr   r   c            	      &  ^  \ rS rSrU 4S jrU 4S jrS rS rS rS r	S r
S	 rS
 rS rU 4S jrS r\R"                  R$                  R'                  5       r\R)                  \\
\\\\S.5        \" \S5      (       a  S r\\S'   SrU =r$ SrU =r$ )chgcmdserverig  c	           
     *  > [         T	U ]  [        U[        X4S5      U R                  5      UUUU5        XPl        SU l        / U l        Xpl        Xl	        Ub=  U R                  R                  5       U l
        [        R                  U R                  S'   g g )N   SFs   validate)rk   rW   r   r   r   
clientsock_ioattached_oldiosrO   baseaddresscapabilitiescopyr   validate)
rV   r%   repor   ru   sockprereposetupsrO   r   rn   s
            r   rW   chgcmdserver.__init__h  s     	b/#T:DMMJ	
  "&  $ 1 1 6 6 8D-9-B-BDk* !r   c                   > [         TU ]  5         U R                  R                  5         U R	                  5         SU l        g NF)rk   cleanupr%   rz   
_restoreior   )rV   rn   s    r   r   chgcmdserver.cleanup{  s.     	 r   c                X   U R                   R                  [        R                  " SSS5      5        U R                   R	                  SS5      u  pp4[        U5      S:X  d   eUS   u  pVnU[        R                  :X  d   eU[        R                  :X  d   e[        U5      R                  S5      R                  5       nU R                  R                  SSU5        U R                  n	U	R                  5         U R                  5         [!        U["        5       H  u  n
u  pnU
S:  d   e[%        X5      n[&        R(                  " XR+                  5       5        [&        R,                  " U
5        U R.                  (       a  Mi  US	:X  a  UnOBUR1                  5       (       a  [2        R4                  " U5      nO[2        R6                  " U5      nXLa  [9        XU5        [9        XU5        M     S
U l        U R:                  R=                  [        R                  " S[        U5      5      5        g)zkAttach to client's stdio passed via unix domain socket; all
channels except cresult will no longer be used
r      Ir      r   i	   chgservers   received fds: %r
s   ferrTr   N)r   sendallr   r   recvmsgr   socket
SOL_SOCKET
SCM_RIGHTS
memoryviewcasttolistr%   rZ   rz   _saveiozip_iochannelsrl   rA   dup2rr   closer   isattyr   make_line_bufferedunwrap_line_bufferedr   cresultr   )rV   r   ancdata	msg_flagsaddress
cmsg_level	cmsg_type	cmsg_data	clientfdsr%   fdcnfnmoder   newfps                   r   r   chgcmdserver.attachio  s    	FD! <=,0OO,C,CAs,K)y7|q   +21:(
yV.....F----- y)..s3::<	L"7CWW

"%i"=B6M6BGGB		$HHRL
 W} 99;;$77;E$99"=E&De$- #>0  6;;uc)n=>r   c                   U R                   (       a  g U R                  n[         H]  u  p#n[        X5      n[        X5      n[        R
                  " UR                  5       5      nU R                   R                  XVU45        M_     g r@   )r   r%   r   rl   rA   duprr   r   )rV   r%   r  r	  _modechr   r  s           r   r   chgcmdserver._saveio  s`    <<WW(MBE"BB		$BLL-	 )r   c           	        U R                   (       d  g [        R                  " [        R                  [        R                  5      nU R
                  n[        U R                   [        5       H  u  u  p4nu  pgn SU;   a4  [        R                  " XR                  5       5        UR                  5         [        R                  " XTR                  5       5        [        R                  " U5        [!        XU5        [!        X'U5        M     [        R                  " U5        U R                   S S 2	 g ! [         a<  n	U R
                  R                  SS[        R                  " U	5      U5         S n	A	NS n	A	ff = f)Nwr   s   got %s while duplicating %s
)r   rA   opendevnullO_WRONLYr%   r   r   r   rr   rz   r   rE   rZ   r   forcebytestrr   )
rV   nullfdr%   r  r   r  r  r	  r
  errs
             r   r   chgcmdserver._restoreio  s   ||R[[1WW,/k,J(LRR.24$; GGFIIK0HHJIIK( Db!BB/ -K0 	LLO    4++C0	 s   9A4D//
E592E00E5c                8   U R                  5       nSnSn [        U R                  XR                  5      u  U l        nU(       a^  U R                  R                  5         SnU R                  R                  SS5      (       a  UnU R                  R!                  S	U-  5        g["        R%                  WU R"                  R&                  5      n/ nUR(                  U R"                  R(                  :w  aj  [+        U R,                  U R"                  R.                  5      n	UR1                  S
U	-  5        U R"                  R(                  (       a  UR1                  S5        UR.                  U R"                  R.                  :w  a4  [+        U R,                  UR.                  5      n	UR1                  SU	-  5        U R                  R3                  SS[        R4                  " U5      5        U R                  R!                  SR7                  U5      =(       d    S5        g! [        R
                   a  nU R                  R	                  [        S5      [        R                  " U5      -  5        UR                  (       a1  U R                  R	                  [        S5      UR                  -  5        Sn SnAGNuSnAf[        R                   aO  nUR                  b  UR                  nU R                  R	                  UR                  5       5        Sn SnAGNSnAff = f)a3  Reload the config and check if the server is up to date

Read a list of ' ' separated arguments.
Write a non-empty list of ' ' separated instruction strings or ' '
if the list is empty.
An instruction string could be either:
    - "unlink $path", the client should unlink the path to stop the
      outdated server.
    - "redirect $path", the client should attempt to connect to $path
      first. If it does not work, start a new server. It implies
      "reconnect".
    - "exit $n", the client should exit directly with code n.
      This may happen if we cannot parse the config.
    - "reconnect", the client should close the connection and
      reconnect.
If neither "reconnect" nor "redirect" is included in the instruction
list, the client can continue with this server after completing all
the instructions.
F   s
   abort: %s
s   (%s)
TNs   uis   detailed-exit-codes   exit %ds	   unlink %ss	   reconnects   redirect %sr   s   validate: %s
r   )	_readlistr   r%   r   r
   	RepoErrorr   r   r  hintErrordetailed_exit_codeformatrz   
configboolr   r   rO   r[   rU   rT   _hashaddressr   rS   r   rZ   r   r   )
rV   r   errorraisedr!  luiinst	exit_codenewhashinstsaddrs
             r   r   chgcmdserver.validate  s1   ( ~~ 	%dggt[[ALDGS GGMMOIww!!%)>??.	LLzI56""3(A(AB 8 88 0 0$..2K2KLDLL,- ~~''\*!:!:: 0 0'2D2DEDLL$./L"3Z5F5Fu5MN5::e,56C  	 GGMM!N+j.E.Ed.KKLyya	lTYY67K{{ 	&&2%)%<%<"GGMM$++-(K		s%   (H L.A?J33L
ALLc                    U R                  5       nU(       d  gU R                  R                  SSU5        [        R                  " U5        g)zChange current directory

Note that the behavior of --cwd option is bit different from this.
It does not affect --config parameter.
Nr   s   chdir to '%s'
)_readstrr%   rZ   rA   chdir)rV   rF   s     r   r/  chgcmdserver.chdir  s5     }}L"4d;
r   c                D    U R                  U R                  S5      5        g)zChange umask (DEPRECATED)r   N)	_setumask_readrV   s    r   setumaskchgcmdserver.setumask'  s     	tzz!}%r   c                z    U R                  5       n[        U5      S:w  a  [        S5      eU R                  U5        g)zChange umaskr   s(   invalid mask length in setumask2 requestN)r.  r   
ValueErrorr2  )rV   r   s     r   	setumask2chgcmdserver.setumask2-  s0    }}t9>HIItr   c                    [         R                  " SU5      S   nU R                  R                  SSU5        [        R
                  " U5        g )Nr   r   r   s   setumask %r
)r   r   r%   rZ   r   r5  )rV   r   masks      r   r2  chgcmdserver._setumask4  s8    }}UD)!,L"2D9dr   c                   > U R                   n/ U l          [        TU ]	  5       U R                  5         Xl         $ ! U R                  5         Xl         f = fr@   )r   rk   
runcommandr   )rV   globaloldiosrn   s     r   r?  chgcmdserver.runcommand9  sG     ||	(7%'OO'L OO'Ls	   : Ac                ^   U R                  5       n [        S U 5       5      nU R                  R	                  SS[        UR                  5       5      5        [        R                  R                  5         [        R                  R                  U5        g! [         a    [        S5      ef = f)zdClear and update os.environ

Note that not all variables can make an effect on the running process.
c              3  D   #    U  H  oR                  S S5      v   M     g7f)   =r   N)split)r   ss     r   r   &chgcmdserver.setenv.<locals>.<genexpr>L  s     6Aq''$**As    s"   unexpected value in setenv requestr   s   setenv: %r
N)r  dictr8  r%   rZ   r$   keysr	   r    clearupdate)rV   lnewenvs      r   setenvchgcmdserver.setenvE  s    
 NN	D6A66F 	L/6&++-3HI '  	DBCC	Ds   B B,)r   s   chdirs
   runcommands   setenvs   setumasks	   setumask2setprocnamec                    U R                  5       nU R                  R                  SSU5        [        R                  " U5        g)zChange process titler   s   setprocname: %r
N)r.  r%   rZ   r   rP  )rV   r   s     r   rP  chgcmdserver.setprocnameb  s0    ==?DGGKK&:DA  &r   s   setprocname)r   r   r   r   r   rO   r%   )r]   r^   r_   r`   rW   r   r   r   r   r   r/  r5  r9  r2  r?  rN  r   serverr   r   rK  rv   r   rP  rc   r   r   s   @r   r   r   g  s    C&!0?d.@:7x
&

(( !''4499;L!%!#	
	 x''	' (3^$ (r   r   c                6    SU [         R                  " 5       4-  $ )Ns	   %s.%d.tmp)rA   getpid)r  s    r   _tempaddressrV  k  s    7BIIK000r   c                    [         R                  R                  U 5      u  p#UR                  SS5      S   nS[         R                  R                  X#5      U4-  $ )Nr   r   r   s   %s-%s)rA   rF   rE  r   )r  hashstrdirnamebasenames       r   r$  r$  o  sK     g.G~~dA&q)Hrww||G6@@@r   c                  ~    \ rS rSr% SrSrS\S'   S\S'   S\S'   S	 rS
 rS r	S r
S rS rS rS rS rS rS rSrg)chgunixservicehandlerix  z"Set of operations for chg servicesr   zOptional[hashstate]
_hashstatezOptional[bytes]_baseaddress_realaddressc                    Xl         S U l        S U l        S U l        UR	                  SS5      U l        [        R                  " 5       U l        g )Nr   s   idletimeout)r%   r]  r^  r_  	configint_idletimeouttime_lastactive)rV   r%   s     r   rW   chgunixservicehandler.__init__  s?      LL~F99;r   c                    U R                  U5        U R                  5         U R                  U5        U R                  5         g r@   )_inithashstate_checkextensions_bind_createsymlink)rV   r   r  s      r   
bindsocket chgunixservicehandler.bindsocket  s4    G$

4r   c                    Xl         U R                  R                  SS5      (       a  S U l        Xl        g [
        R                  U R                  5      U l        [        XR                  R                  5      U l        g )Nr   s   skiphash)	r^  r%   r#  r]  r_  rO   r[   r$  rS   rV   r  s     r   rg  $chgunixservicehandler._inithashstate  s\    #77lK88"DO '#**4773(//2L2LMr   c                    U R                   (       d  g [        R                  " 5       (       a  SU R                   l        g g )Nr   )r]  r   	notloadedrT   r4  s    r   rh  &chgunixservicehandler._checkextensions  s.    !! ),DOO%	 "r   c                   [        U R                  5      n[        R                  " X5        [        R
                  " U5      U l        UR                  [        R                  5        [        R                  " X R                  5        g r@   )rV  r_  r   bindunixsocketrA   rB   _socketstatlistenr   	SOMAXCONNrename)rV   r   tempaddresss      r   ri  chgunixservicehandler._bind  sY     #4#4#45D.77;/F$$% 	K!2!23r   c                    U R                   U R                  :X  a  g [        U R                   5      n[        R                  " [        R
                  R                  U R                  5      U5        [        R                  " XR                   5        g r@   )	r^  r_  rV  rA   symlinkrF   rZ  r   rx  )rV   ry  s     r   rj  $chgunixservicehandler._createsymlink  s^     1 11"4#4#45


277##D$5$56DK!2!23r   c                    [         R                  " U R                  5      nUR                  U R                  R                  :H  =(       a1    U[        R
                     U R                  [        R
                     :H  $ ! [         a     gf = fr   )rA   rB   r_  st_inoru  rC   rE   )rV   rG   s     r   _issocketowner$chgunixservicehandler._issocketowner  sr    	**+B		T--444 It}}%)9)9$--)HH  		s   A:A= =
B
	B
c                p    U R                  5       (       d  g [        R                  " U R                  5        g r@   )r  r   	tryunlinkr_  rn  s     r   unlinksocket"chgunixservicehandler.unlinksocket  s(    ""$$
 	t(()r   c                   U R                  5       (       d(  U R                  R                  SSU R                  5        g[        R                  " 5       U R
                  -
  U R                  :  a  U R                  R                  SS5        gg)Nr   s   %s is not owned, exiting.
Ts   being idle too long. exiting.
F)r  r%   rZ   r_  rc  rd  rb  r4  s    r   
shouldexit chgunixservicehandler.shouldexit  sl    ""$$GGKK<d>O>O 99;)))D,=,==GGKK&HIr   c                8    [         R                   " 5       U l        g r@   )rc  rd  r4  s    r   newconnection#chgunixservicehandler.newconnection  s    99;r   c           
     b    [        U R                  UUUUUU R                  U R                  5      $ r@   )r   r%   r]  r^  )rV   r   connr   ru   r   s         r   createcmdserver%chgunixservicehandler.createcmdserver  s5    GGOO	
 		
r   )r^  r]  rb  rd  r_  ru  r%   N)r]   r^   r_   r`   ra   pollinterval__annotations__rW   rk  rg  rh  ri  rj  r  r  r  r  r  rc   rd   r   r   r\  r\  x  sT    ,L##!!!!'N,	44*	'

r   r\  c                   S[         R                  ;   a  [         R                  S	 S[         R                  ;   a6  [         R                  S   [         R                  S'   [         R                  S	 OJS[         R                  ;   a6  S[         R                  ;   a  [         R                  S	 [         R                  S	 U(       a  U R                  SSSS5        [        U 5      n[        R
                  " U S X#S	9$ )
Ns   CHGINTERNALMARKs   CHGORIG_LC_CTYPEs   LC_CTYPEs   CHG_CLEAR_LC_CTYPEs   bundles   mainreporootr   s   repo)r   optshandler)r	   r    r   r\  r   unixforkingservice)r%   r   r  hs       r   chgunixservicer    s     X---/0 h...(0(8(89L(M%01	("2"2	2(***  -23
Yg>b!A++BTPPr   )/ra   
__future__r   r6   rA   rer   rB   r   rc  typingr   i18nr   noder   r2   r   r	   r
   r   r   r   utilsr   r   r   r   r   r   compileXr"   r/   r=   rM   rO   r   r   r   r   rS  r   rV  r$  r\  r  rd   r   r   <module>r     s    D #  	 	        A	 ' 
 
 DD
")>4<:< <."J"J3O 3OlA3='' A3H1Ai
 i
XQr   