ó
    æ“–g‹X  ã                   ó   • 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5      r
 " S S\5      rS rS rS	 rS
 rS rS rS r\
S&S j5       r\
S'S j5       rS rS r\R0                  " S5      r\R0                  " S5      rS rS rS rS rS rS r S r!S r"0 4S jr#S 4S jr$ " S S \	5      r% " S! S"\5      r&S# r'S$ r(S% r)g)(é    N)Ú
MutableSetc                   ó    • \ rS rSrS rS rSrg)Úmemoizeé   c                 ó   • Xl         0 U l        g ©N)ÚfuncÚcache)Úselfr	   s     Ú,/usr/lib/python3/dist-packages/gyp/common.pyÚ__init__Úmemoize.__init__   s   € ØŒ	Øˆ�
ó    c                 ó€   •  U R                   U   $ ! [         a"    U R                  " U6 nX R                   U'   Us $ f = fr   )r
   ÚKeyErrorr	   )r   ÚargsÚresults      r   Ú__call__Úmemoize.__call__   sD   € ð	Ø—:‘:˜dÑ#Ð#øÜó 	Ø—Y’Y Ð%ˆFØ%�J‰J�tÑØŠMð	ús   ‚ ‘)=¼=)r
   r	   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   r   Ú__static_attributes__© r   r   r   r      s   † òõr   r   c                   ó   • \ rS rSrSrSrg)ÚGypErroré    z|Error class representing an error, which is to be presented
to the user.  The main entry point will catch and display this.
r   N)r   r   r   r   Ú__doc__r   r   r   r   r   r       s   † ñò 	r   r   c                 ó  • U R                   (       d	  U4U l         g[        U R                   5      S:X  a%  [        U R                   S   5      S-   U-   4U l         g[        U R                   S   5      S-   U-   4U R                   SS -   U l         g)z2Append a message to the given exception's message.é   r   Ú N)r   ÚlenÚstr)ÚeÚmsgs     r   ÚExceptionAppendr'   (   sq   € à�6�6Ø�ˆ�Ü	ˆQ�V‰V‹˜Ó	Ü�a—f‘f˜Q‘i“. 3Ñ&¨Ñ,Ð.ˆ�ä�a—f‘f˜Q‘i“. 3Ñ&¨Ñ,Ð.°·±¸¸°Ñ;ˆ�r   c                 óZ   • U Vs/ s H  n[        U5      S   U :X  d  M  UPM     sn$ s  snf )z]
Given a list of qualified targets, return the qualified targets for the
specified |target|.
r!   ©ÚParseQualifiedTarget)ÚtargetÚqualified_listÚts      r   ÚFindQualifiedTargetsr.   2   s.   € ñ
 &ÓN’~�!Ô)=¸aÓ)@ÀÑ)CÀvÑ)M�A‘~ÑNÐNùÒNs   …(Ÿ(c                 óª   • U R                  SS5      n[        U5      S:X  a  Uu  p OS nU R                  SS5      n[        U5      S:X  a  Uu  pOS nX U/$ )NÚ:r!   é   Ú#)Úrsplitr#   )r+   Útarget_splitÚ
build_fileÚtoolsets       r   r*   r*   :   sg   € ð —=‘=  aÓ(€LÜ
ˆ<Ó˜AÓØ+Ñˆ�Vàˆ
à—=‘=  aÓ(€LÜ
ˆ<Ó˜AÓØ(Ñˆ�àˆà Ð(Ð(r   c                 ón  • [        U5      u  p1nU(       a”  U (       a‹  [        R                  R                  [        R                  R	                  [        R                  R                  U 5      U5      5      n [        R                  R                  U 5      (       d  [        U S5      n OUn U(       a  UnXU/$ )NÚ.)r*   ÚosÚpathÚnormpathÚjoinÚdirnameÚisabsÚRelativePath)r5   r+   r6   Úparsed_build_fileÚparsed_toolsets        r   ÚResolveTargetrB   M   s‹   € ô 3GÀvÓ2NÑ/Ð æÞô Ÿ™×)Ñ)Ü—‘—‘œRŸW™WŸ_™_¨ZÓ8Ð:KÓLóˆJô —7‘7—=‘= ×,Ñ,Ü)¨*°cÓ:�
øà*ˆJæØ ˆà Ð(Ð(r   c                 ó   • [        U 5      S   $ ©Nr   r)   )Úfully_qualified_targets    r   Ú	BuildFilerF   p   s   € äÐ 6Ó7¸Ñ:Ð:r   c                 ój   • U  H,  nU[         R                  ;   d  M  [         R                  U   s  $    U$ )znLook up a key in the environment, with fallback to secondary keys
and finally falling back to a default value.)r9   Úenviron)Úvar_listÚdefaultÚvars      r   ÚGetEnvironFallbackrL   u   s/   € ó ˆØ”"—*‘*ÕÜ—:‘:˜c‘?Ò"ñ ð €Nr   c                 ó4   • U S-   U-   nU(       a  US-   U-   nU$ )Nr0   r2   r   )r5   r+   r6   Úfully_qualifieds       r   ÚQualifiedTargetrO   ~   s+   € ð ! 3Ñ&¨Ñ/€OÞØ)¨CÑ/°'Ñ9ˆØÐr   c                 óh  • U(       a  [         R                  R                  U 5      O[         R                  R                  U 5      n [         R                  R                  U5      n[        R
                  S:X  ad  [         R                  R                  U 5      S   R                  5       [         R                  R                  U5      S   R                  5       :w  a  U $ U R                  [         R                  R                  5      nUR                  [         R                  R                  5      n[        [         R                  R                  X4/5      5      n[         R                  R                  /[        U5      U-
  -  X5S  -   n[        U5      S:X  a  g[         R                  R                  " U6 $ )NÚwin32r   Ú )r9   r:   ÚrealpathÚabspathÚsysÚplatformÚ
splitdriveÚlowerÚsplitÚsepr#   ÚcommonprefixÚpardirr<   )r:   Úrelative_toÚfollow_path_symlinkÚ
path_splitÚrelative_to_splitÚ
prefix_lenÚrelative_splits          r   r?   r?   ˆ   s?  € ö &9Œ2�7‰7×Ñ˜DÔ!¼b¿g¹g¿o¹oÈdÓ>S€DÜ—'‘'×"Ñ" ;Ó/€Kô ‡|�|�wÓÜ
�‰×Ñ˜4Ó  Ñ#×)Ñ)Ó+Ü�7‰7×Ñ˜kÓ*¨1Ñ-×3Ñ3Ó5ó	6ð ˆð —‘œBŸG™GŸK™KÓ(€JØ#×)Ñ)¬"¯'©'¯+©+Ó6Ðô ”R—W‘W×)Ñ)¨:Ð*IÓJÓK€Jô —g‘g—n‘nÐ%ÜÐÓ Ñ+ñà�;Ðñ €Nô ˆ>Ó˜aÓàô �7‰7�<Š<˜Ð(Ð(r   c                 ót   • U (       d  U $ Uc  SOUn[        U[        R                  R                  X5      5      $ )a  Given a path like foo/bar that is relative to toplevel_dir, return
the inverse relative path back to the toplevel_dir.

E.g. os.path.normpath(os.path.join(path, InvertRelativePath(path)))
should always produce the empty string, unless the path contains symlinks.
r8   )r?   r9   r:   r<   )r:   Útoplevel_dirs     r   ÚInvertRelativePathre   ³   s2   € ö ØˆØ&Ñ.‘3°L€LÜ˜¤b§g¡g§l¡l°<Ó&FÓGÐGr   c                 ód   • [         R                  R                  U 5      (       a  U $ [        X5      $ r   )r9   r:   r>   r?   )r:   r]   s     r   ÚFixIfRelativePathrg   Á   s%   € ä	‡w�w‡}�}�T×ÑØˆÜ˜Ó*Ð*r   c                 ó¸   • [         R                  R                  U5      n[         R                  R                  [         R                  R	                  X 5      5      $ r   )r9   r:   r=   r;   r<   )r:   r]   Úrel_dirs      r   ÚUnrelativePathrj   È   s8   € ô �g‰g�o‰o˜kÓ*€GÜ�7‰7×ÑœBŸG™GŸL™L¨Ó7Ó8Ð8r   z[	
 #$%&'()*;<=>?[{|}~]|^$z(["\\`])c                 óÆ   • [        U [        5      (       d  [        U 5      n [        R                  U 5      (       a  SOSnU[        R
                  " [        SU 5      -   U-   nU$ )a   Encodes |argument| suitably for consumption by POSIX shells.

argument may be quoted and escaped as necessary to ensure that POSIX shells
treat the returned value as a literal representing the argument passed to
this function.  Parameter (variable) expansions beginning with $ are allowed
to remain intact without escaping the $, to allow the argument to contain
references to variables to be expanded by the shell.
Ú"rR   z\\\1)Ú
isinstancer$   Ú_quoteÚsearchÚreÚsubÚ_escape)ÚargumentÚquoteÚencodeds      r   ÚEncodePOSIXShellArgumentrv     sP   € ô �h¤×$Ñ$Ü�x“=ˆä—=‘= ×*Ñ*‰C°€Eà”b—f’fœW g¨xÓ8Ñ8¸5Ñ@€Gà€Nr   c                 ón   • / nU  H  nUR                  [        U5      5        M     SR                  U5      $ )z¾Encodes |list| suitably for consumption by POSIX shells.

Returns EncodePOSIXShellArgument for each item in list, and joins them
together using the space character as an argument separator.
r"   )Úappendrv   r<   )ÚlistÚencoded_argumentsrs   s      r   ÚEncodePOSIXShellListr{     s8   € ð ÐÛˆØ× Ñ Ô!9¸(Ó!CÖDñ à�8‰8Ð%Ó&Ð&r   c                 óz  • [        5       n[        U5      nU(       a‰  UR                  5       nXB;   a  M  UR                  U5        X   nUR                  [        UR	                  S/ 5      5      5        UR                  [        UR	                  S/ 5      5      5        U(       a  M‰  [        U[        U5      -
  5      $ )z2Returns the recursive list of target dependencies.ÚdependenciesÚdependencies_original)ÚsetÚpopÚaddÚupdateÚgetry   )Útarget_dictsÚrootsr}   ÚpendingÚrÚspecs         r   ÚDeepDependencyTargetsr‰   (  s”   € ä“5€LÜ�%‹j€GÞ
à�K‰K‹MˆàÓÙà×Ñ˜Ôà‰ˆØ�‰”s˜4Ÿ8™8 N°BÓ7Ó8Ô9Ø�‰”s˜4Ÿ8™8Ð$;¸RÓ@ÓAÔB÷ ˆ'ô �œs 5›zÑ)Ó*Ð*r   c                 óT   • U  Vs/ s H  n[        U5      U:X  d  M  UPM     sn$ s  snf )zHFrom a target_list, returns the subset from the specified build_file.
  )rF   )Útarget_listr5   Úps      r   ÚBuildFileTargetsr�   ;  s'   € ñ #ÓA’{�!¤i°£l°jÑ&@�A‘{ÑAÐAùÒAs   …%œ%c                 ó6   • [        X5      n[        X5      nX4-   $ )zNReturns all targets (direct and dependencies) for the specified build_file.
  )r�   r‰   )r‹   r„   r5   Ú	bftargetsÚ
deptargetss        r   Ú
AllTargetsr‘   A  s!   € ô ! Ó9€IÜ& |Ó?€JØÑ!Ð!r   c                 ó,   ^ •  " U 4S jS5      nU" 5       $ )zîWrite to a file only if the new contents differ.

Arguments:
  filename: name of the file to potentially write to.
Returns:
  A file like object which will write to temporary file and only overwrite
  the target if it differs (on close).
c                   ó>   >• \ rS rSrSrU 4S jrS rU 4S jrS rSr	g)	ÚWriteOnDiff.<locals>.WriteriS  z?Wrapper around file which only covers the target if it differs.c                 ó~  >• [        5       (       a  SO[        R                  R                  T5      n[        R
                  " S[        R                  R                  T5      S   S-   US9u  o l         [        R                  " US5      U l	        g ! [         a"    [        R                  " U R                  5        e f = f)NrR   z.tmpr!   z.gyp.)ÚsuffixÚprefixÚdirÚwb)ÚIsCygwinr9   r:   r=   ÚtempfileÚmkstemprY   Útmp_pathÚfdopenÚtmp_fileÚ	ExceptionÚunlink)r   Úbase_temp_dirÚtmp_fdÚfilenames      €r   r   Ú$WriteOnDiff.<locals>.Writer.__init__V  s�   ø€ ô #+§*¡*™B´"·'±'·/±/À(Ó2KˆMä$,×$4Ò$4ØÜ—w‘w—}‘} XÓ.¨qÑ1°GÑ;Ø!ñ%Ñ!ˆF”Mð
Ü "§	¢	¨&°$Ó 7�•øÜó ä—	’	˜$Ÿ-™-Ô(Øðús   Á3B Â,B<c                 ó.   • [        U R                  U5      $ r   )ÚgetattrrŸ   )r   Úattrnames     r   Ú__getattr__Ú'WriteOnDiff.<locals>.Writer.__getattr__m  s   € ä˜4Ÿ=™=¨(Ó3Ð3r   c                 ó"  >•  U R                   R                  5         Sn [        R                  " U R                  TS5      nU(       a!  [        R                  " U R                  5        g [        R                  " S5      n[        R                  " U5        [        R                  " U R                  SU) -  5        [        R                  S:X  a:  [        R                  R                  T5      (       a  [        R                   " T5        [        R"                  " U R                  T5        g ! [
         a*  nUR                  [        R                  :w  a  e  S nAGNS nAff = f! [$         a"    [        R                  " U R                  5        e f = f)NFé?   i¶  rQ   )rŸ   ÚcloseÚfilecmpÚcmpr�   ÚOSErrorÚerrnoÚENOENTr9   r¡   ÚumaskÚchmodrU   rV   r:   ÚexistsÚremoveÚrenamer    )r   Úsamer%   r³   r¤   s       €r   r­   Ú!WriteOnDiff.<locals>.Writer.closeq  s  ø€ ð(à—‘×#Ñ#Ô%à�ðÜ"Ÿ;š; t§}¡}°hÀÓF�Dö
 ô —I’I˜dŸm™mÕ,ô ŸHšH T›N�EÜ—H’H˜U”OÜ—H’H˜TŸ]™]¨E°U°F©NÔ;Ü—|‘| wÓ.´2·7±7·>±>À(×3KÑ3Kô Ÿ	š	 (Ô+Ü—I’I˜dŸm™m¨XÕ6øô; ó Ø—w‘w¤%§,¡,Ó.Øõ /ûðûô< ó ä—	’	˜$Ÿ-™-Ô(Øðús;   ƒE"  "D+ Á'E" Á*C E" Ä+
EÄ5EÅE" ÅEÅE" Å",Fc                 óX   • U R                   R                  UR                  S5      5        g )Núutf-8)rŸ   ÚwriteÚencode)r   Úss     r   r¼   Ú!WriteOnDiff.<locals>.Writer.writeœ  s   € Ø�M‰M×Ñ §¡¨Ó 1Õ2r   )rŸ   r�   N)
r   r   r   r   r   r   r©   r­   r¼   r   )r¤   s   €r   ÚWriterr”   S  s   ø† ÙMõ	ò.	4õ)	õV	3r   rÀ   r   )r¤   rÀ   s   ` r   ÚWriteOnDiffrÁ   I  s   ø€ ÷J3ô J3ñX ‹8€Or   c                 óŒ   •  [         R                  " [         R                  R                  U 5      5        g! [         a     gf = f)z*Make sure the directory for |path| exists.N)r9   Úmakedirsr:   r=   r°   )r:   s    r   ÚEnsureDirExistsrÄ   ¢  s2   € ðÜ
�Š”B—G‘G—O‘O DÓ)Õ*øÜó Ùðús   ‚36 ¶
AÁAc                 óZ  • SSSS.nSU ;   a  U S   $ [         R                  U;   a  U[         R                     $ [         R                  R                  S5      (       a  g[         R                  R                  S5      (       a  g[         R                  R                  S	5      (       a  g	[         R                  R                  S
5      (       a  g
[         R                  R                  S5      (       a  g[         R                  R                  S5      (       a  g[         R                  S:X  a  gg)zFReturns |params.flavor| if it's set, the system's default flavor else.ÚwinÚmac)ÚcygwinrQ   ÚdarwinÚflavorÚsunosÚsolaris)Ú	dragonflyÚfreebsdrÎ   ÚopenbsdÚnetbsdÚaix)Úos390ÚzosrÓ   Úos400Úlinux)rU   rV   Ú
startswith)ÚparamsÚflavorss     r   Ú	GetFlavorrÙ   ª  sè   € ð ØØñ€Gð �6ÓØ�hÑÐÜ
‡|�|�wÓØ”s—|‘|Ñ$Ð$Ü
‡|�|×Ñ˜w×'Ñ'ØÜ
‡|�|×ÑÐ7×8Ñ8ØÜ
‡|�|×Ñ˜y×)Ñ)ØÜ
‡|�|×Ñ˜x×(Ñ(ØÜ
‡|�|×Ñ˜u×%Ñ%ØÜ
‡|�|×ÑÐ/×0Ñ0ØÜ
‡|�|�wÓØàr   c           	      óÚ  • SSSSSSS.R                  U S5      nU(       d  g[        R                  R                  [        R                  R	                  [        R                  R                  [        5      5      SU-  5      n[        U5       nUR                  5       nSSS5        SnUR                  SS5      nU S:X  a  U(       a  US	U-  -  n[        R                  R                  US
U-  5      n	[        U	S5       n
U
R                  SR                  WS   U/USS -   5      5        SSS5        [        R                  " U	S5        g! , (       d  f       N²= f! , (       d  f       N7= f)zPFinds (flock|mac|win)_tool.gyp in the gyp directory and copies it
to |out_path|.ÚflockrÇ   rÆ   )rÑ   rÔ   rÌ   rÇ   ÚiosrÆ   Nz
%s_tool.pyz!# Generated by gyp. Do not edit.
Úmac_toolchain_dirz,import os;
os.environ['DEVELOPER_DIR']='%s'
zgyp-%s-toolÚwrR   r   r!   ií  )rƒ   r9   r:   r<   r=   rT   Ú__file__ÚopenÚ	readlinesr¼   r´   )rÊ   Úout_pathÚgenerator_flagsr—   Úsource_pathÚsource_fileÚsourceÚheaderrÝ   Ú	tool_pathÚ	tool_files              r   ÚCopyToolrê   È  s:  € ð ØØØØØñ÷ 
�cˆ&�$Óð ö Øô —'‘'—,‘,Ü
�‰�‰œŸ™Ÿ™¬Ó1Ó2°LÀ6Ñ4Ió€Kô 
ˆkÔ	˜kØ×&Ñ&Ó(ˆ÷ 
ð 2€FØ'×+Ñ+Ð,?ÀÓFÐØ�ƒÖ,ØÐBÐEVÑVÑVˆô —‘—‘˜X }°vÑ'=Ó>€IÜ	ˆi˜Ô	 Ø�‰˜Ÿ™ ¨¡¨FÐ 3°f¸Q¸R°jÑ @ÓAÔB÷ 
ô ‡H‚HˆY˜Õ÷ 
Õ	ú÷ 
Õ	ús   ÂEÃ?,EÅ
EÅ
E*c                 ó   • U $ r   r   )Úxs    r   Ú<lambda>rí   õ  s   € ¡r   c                 óh   • 0 n/ nU  H'  nU" U5      nXR;   a  M  SX%'   UR                  U5        M)     U$ )Nr!   )rx   )ÚseqÚidfunÚseenr   ÚitemÚmarkers         r   Úuniquerrô   õ  sA   € Ø€DØ€FÛˆÙ�t“ˆØ‹>ÙØˆ‰Ø�‰�dÖñ ð €Mr   c                   ó^   • \ rS rSrSS jrS rS rS rS rS r	S	 r
SS
 jrS rS rS rSrg)Ú
OrderedSeti  Nc                 óB   • / =U l         nUS X"/-  n0 U l        Ub  X-  n g g r   ©ÚendÚmap)r   Úiterablerù   s      r   r   ÚOrderedSet.__init__  s7   € ØÐˆŒ�3Ø��cÐÑˆØˆŒØÑØÑ‰Dð  r   c                 ó,   • [        U R                  5      $ r   )r#   rú   ©r   s    r   Ú__len__ÚOrderedSet.__len__
  s   € Ü�4—8‘8‹}Ðr   c                 ó   • XR                   ;   $ r   )rú   )r   Úkeys     r   Ú__contains__ÚOrderedSet.__contains__  s   € Ø—h‘h‰Ðr   c                 ó|   • XR                   ;  a-  U R                  nUS   nXU/=US'   =US'   U R                   U'   g g )Nr!   r1   )rú   rù   )r   r  rù   Úcurrs       r   r�   ÚOrderedSet.add  sG   € Ø—h‘hÓØ—(‘(ˆCØ�q‘6ˆDØ03¸3Ð/?Ð?ˆD�‰GÐ?�c˜!‘f˜tŸx™x¨š}ð r   c                 óp   • XR                   ;   a'  U R                   R                  U5      u  pnX2S'   X#S'   g g )Nr1   r!   )rú   r€   )r   r  Ú	prev_itemÚ	next_items       r   ÚdiscardÚOrderedSet.discard  s5   € Ø—(‘(‹?Ø(,¯©¯©°SÓ(9Ñ%ˆC˜IØ$�a‰LØ$�aŠLð r   c              #   ó\   #   • U R                   nUS   nX!La  US   v •  US   nX!La  M  g g 7f)Nr1   r   ©rù   ©r   rù   r  s      r   Ú__iter__ÚOrderedSet.__iter__  ó5   é € Ø�h‰hˆØ�1‰vˆØŠoØ�q‘'ŠMØ˜‘7ˆDð Žoùó   ‚&,ª,c              #   ó\   #   • U R                   nUS   nX!La  US   v •  US   nX!La  M  g g 7f)Nr!   r   r  r  s      r   Ú__reversed__ÚOrderedSet.__reversed__#  r  r  c                 ó¢   • U (       d  [        S5      eU(       a  U R                  S   S   OU R                  S   S   nU R                  U5        U$ )Nzset is emptyr!   r   r1   )r   rù   r  )r   Úlastr  s      r   r€   ÚOrderedSet.pop+  sB   € ÞÜ˜>Ó*Ð*Þ $ˆd�h‰h�q‰k˜!Šn¨$¯(©(°1©+°a©.ˆØ�‰�SÔØˆ
r   c                 óŽ   • U (       d  U R                   R                   S3$ U R                   R                   S[        U 5      < S3$ )Nz()Ú(Ú))Ú	__class__r   ry   rþ   s    r   Ú__repr__ÚOrderedSet.__repr__2  s?   € ÞØ—n‘n×-Ñ-Ð.¨bÐ1Ð1Ø—.‘.×)Ñ)Ð*¨!¬D°«J©>¸Ð;Ð;r   c                 óÄ   • [        U[        5      (       a5  [        U 5      [        U5      :H  =(       a    [        U 5      [        U5      :H  $ [	        U 5      [	        U5      :H  $ r   )rm   rö   r#   ry   r   )r   Úothers     r   Ú__eq__ÚOrderedSet.__eq__7  sG   € Ü�eœZ×(Ñ(Ü�t“9¤ E£
Ñ*×H¬t°D«z¼TÀ%»[Ñ/HÐHÜ�4‹yœC ›JÑ&Ð&r   c                 óF   • U H  nX ;  d  M
  U R                  U5        M     g r   )r�   )r   rû   Úis      r   r‚   ÚOrderedSet.update=  s   € ÛˆAØ�}Ø—‘˜–ò r   rø   r   ©T)r   r   r   r   r   rÿ   r  r�   r  r  r  r€   r  r"  r‚   r   r   r   r   rö   rö     s:   † ôòòò@ò%òòôò<ò
'õr   rö   c                   ó$   • \ rS rSrSrS rS rSrg)Ú
CycleErroriC  z9An exception raised when an unexpected cycle is detected.c                 ó   • Xl         g r   ©Únodes)r   r,  s     r   r   ÚCycleError.__init__F  s   € Ø�
r   c                 ó2   • S[        U R                  5      -   $ )NzCycleError: cycle involving: )r$   r,  rþ   s    r   Ú__str__ÚCycleError.__str__I  s   € Ø.´°T·Z±Z³Ñ@Ð@r   r+  N)r   r   r   r   r   r   r/  r   r   r   r   r)  r)  C  s   † ÙCòõAr   r)  c                 óš   ^^^^^• [        T5      m[        5       m[        5       m/ mUUUUU4S jm[        U 5       H  nT" U5        M     T$ )a°  Topologically sort based on a user provided edge definition.

Args:
  graph: A list of node names.
  get_edges: A function mapping from node name to a hashable collection
             of node names which this node has outgoing edges to.
Returns:
  A list containing all of the node in graph in topological order.
  It is assumed that calling get_edges once for each node and caching is
  cheaper than repeatedly calling get_edges.
Raises:
  CycleError in the event of a cycle.
Example:
  graph = {'a': '$(b) $(c)', 'b': 'hi', 'c': '$(b)'}
  def GetEdges(node):
    return re.findall(r'\$\(([^))]\)', graph[node])
  print TopologicallySorted(graph.keys(), GetEdges)
  ==>
  ['a', 'c', b']
c                 óî   >• U T;   a  [        T5      eU T;   a  g TR                  U 5        TR                  U 5        T" U 5       H  nT" U5        M     TR                  U 5        TR                  SU 5        g rD   )r)  r�   r¶   Úinsert)ÚnodeÚneighborÚVisitÚ	get_edgesÚordered_nodesÚvisitedÚvisitings     €€€€€r   r6  Ú"TopologicallySorted.<locals>.Visitg  si   ø€ Ø�8ÓÜ˜XÓ&Ð&Ø�7‹?ØØ�‰�DÔØ�‰�TÔÙ! $žˆHÙ�(ŽOñ (à�‰˜ÔØ×Ñ˜Q Õ%r   )r   r   Úsorted)Úgraphr7  r4  r6  r8  r9  r:  s    ` @@@@r   ÚTopologicallySortedr>  M  sI   ü€ ô* ˜	Ó"€IÜ‹e€GÜ‹u€HØ€M÷
&ñ 
&ô �u–ˆÙˆdŽñ àÐr   c                  ó  • [         R                  R                  S5      =(       dÝ    [         R                  R                  S5      =(       d·    [         R                  R                  S5      =(       d‘    [         R                  R                  S5      =(       dk    [         R                  R                  S5      =(       dE    [         R                  R                  S5      =(       d    [         R                  R                  S5      $ )NÚGYP_CROSSCOMPILEÚAR_hostÚCC_hostÚCXX_hostÚ	AR_targetÚ	CC_targetÚ
CXX_target)r9   rH   rƒ   r   r   r   ÚCrossCompileRequestedrG  x  s    € ô 	�
‰
�‰Ð)Ó*÷ 	(Ü�:‰:�>‰>˜)Ó$÷	(ä�:‰:�>‰>˜)Ó$÷	(ô �:‰:�>‰>˜*Ó%÷	(ô �:‰:�>‰>˜+Ó&÷		(ô
 �:‰:�>‰>˜+Ó&÷	(ô �:‰:�>‰>˜,Ó'ðr   c                  óè   •  [         R                  " S[         R                  [         R                  S9n U R	                  5       S   R                  S5      nS[        U5      ;   $ ! [         a     gf = f)NÚuname)ÚstdoutÚstderrr   r»   ÚCYGWINF)Ú
subprocessÚPopenÚPIPEÚSTDOUTÚcommunicateÚdecoder$   r    )ÚoutrJ  s     r   rš   rš   †  sg   € ðÜ×ÒØœJŸO™O´J×4EÑ4Eñ
ˆð —‘Ó" 1Ñ%×,Ñ,¨WÓ5ˆØœ3˜v›;Ñ&Ð&øÜó Ùðús   ‚A!A$ Á$
A1Á0A1r'  r   )*r±   r®   Úos.pathr9   rp   r›   rU   rM  Úcollections.abcr   r   r    r   r'   r.   r*   rB   rF   rL   rO   r?   re   rg   rj   Úcompilern   rr   rv   r{   r‰   r�   r‘   rÁ   rÄ   rÙ   rê   rô   rö   r)  r>  rG  rš   r   r   r   Ú<module>rW     s  ðó
 Û Û Û 	Û Û 
Û å &÷
ñ ô	ˆyô 	ò<òOò)ò& )òF;ò
òð 	ó')ó 	ð')ðT 	ó
Hó 	ð
Hò+ò9ðD 
�ŠÐ2Ó	3€ð4 �*Š*�[Ó
!€òò(
'ò+ò&Bò"òVòròð< 02ô #ñZ #ô 	ô>�ô >ôBA�ô Aò(òVór   