ó
    cÛ–iDo  ã                   óB  • S SK Jr  S SKrS SKJrJr  SrS rS.S jrS/S jr	  S0S jr
            S1S
 jr\R                  \R                  4\R                  \R                  \R                   \R"                  \R$                  S.\R                  \R                  4\R&                  \R(                  \R*                  \R"                  \R$                  S.\R,                  " S5      \R,                  " S5      4\R,                  " SS	S9\R,                  " S5      \R,                  " S5      \R,                  " S5      \R,                  " S5      \R,                  " S5      \R,                  " S5      \R,                  " S5      4\R"                  \R$                  S.\R,                  " S5      \R,                  " S5      4\R,                  " SS	S9\R,                  " SS	S9\R,                  " SS	S9\R,                  " SS	S9\R,                  " SS	S9\R,                  " SS	S9\R,                  " SS	S9\R,                  " SS	S94\R"                  \R$                  S.SSSSSSS.S.rSSSSS S!S".S#S S$S%S S&S".S'.rS( rS) r      S2S* jrS3S+ jrS, r           S4S- jrg)5é    )ÚcolourN)ÚcycleÚgroupbyé
   c                 ó¾  • [        U 5      S:  a  U $ U R                  SS5      n / nU R                  S5       H“  n[        U5      S:”  ag  SUSS ;   a  UR                  SS5      u  p2O$[        U5      S-  n[        U5      U-  nUS	U X%S	 p#UR                  US-   5        [        U5      S:”  a  Mg  U(       d  M‚  UR                  U5        M•     S
R	                  U5      $ )z´Break DNs over multiple lines, for better shaped and arguably more
readable nodes. We try to split after commas, and if necessary
after hyphens or failing that in arbitrary places.é   Ú,z,
Ú
é   Ú-é   é   Nz\n)ÚlenÚreplaceÚsplitÚappendÚjoin)ÚsÚpiecesÚpÚqÚnÚbs         Ú-/usr/lib/python3/dist-packages/samba/graph.pyÚreformat_graph_labelr      sÒ   € ô ˆ1ƒv�ƒ{Øˆà	�	‰	�#�uÓ€AØ€FØ�W‰W�TŽ]ˆÜ�!‹f�r‹kØ�a˜˜"�g‹~Ø—w‘w˜s A“‘��1ä˜“F˜b‘L�Ü˜“F˜a‘K�Ø˜˜!�u˜a ˜e�1Ø�M‰M˜!˜c™'Ô"ô �!‹f�r�k÷ ˆ1Ø�M‰M˜!Öñ ð �:‰:�fÓÐó    c                 óT   • U R                  SS5      n U(       a  [        U 5      n SU -  $ )z%Escape a string as graphvis requires.Ú"z%s)r   r   )r   Úreformats     r   Úquote_graph_labelr    4   s*   € ð 	
�	‰	�#�tÓ€AÞÜ  Ó#ˆØ�!‰8€Or   c                 óž  ^
• [        S U  5       5      n/ n[        U5      S:”  aÛ  Sm
[        UR                  5       5      n  [	        U
4S jU 5       5      n[        U5      S:”  d  SU;   a  OT
S-  m
M2  T
S-  m
US   nT
[        U5      :  a(  UT
   S:w  a  T
S-  m
T
[        U5      :  a  UT
   S:w  a  M  T
[        U5      * :¼  a  X44$ UR                  XT
S 45        UR                  5        H  u  p‰U	ST
 U-   X8'   M     U(       a²  UR                  5        H  n	S	U	;  d  M    O3   [        S
 UR                  5        5       5      nUR                  S5        UR                  5        H  n	U	R                  S5      (       a  M    X44$    [        S UR                  5        5       5      nUR                  S5        X44$ ! [
         a    X44s $ f = f)aR  Replace the common suffix (in practice, the base DN) of a number of
vertices with a short string (default ",..."). If this seems
pointless because the replaced string is very short or the results
seem strange, the original vertices are retained.

:param vertices: a sequence of vertices to shorten
:param suffix: the replacement string [",..."]
:param aggressive: replace certain common non-suffix strings

:return: tuple of (rename map, replacements)

The rename map is a dictionary mapping the old vertex names to
their shortened versions. If no changes are made, replacements
will be empty.
c              3   ó(   #   • U  H  oU4v •  M
     g 7f©N© ©Ú.0Úvs     r   Ú	<genexpr>Ú'shorten_vertex_names.<locals>.<genexpr>N   s   é € Ð)¢˜1�A•¢ùs   ‚r   éÿÿÿÿc              3   ó,   >#   • U  H	  oT   v •  M     g 7fr#   r$   )r&   ÚxÚis     €r   r(   r)   X   s   øé € Ð,¢e ˜!ž¢eùs   ƒÚ*r   r	   Nú,CN=Servers,c              3   óN   #   • U  H  u  pXR                  S SS5      4v •  M     g7f)r/   z,**,r   N©r   ©r&   Úkr'   s      r   r(   r)   y   s)   é € ð 2Ú$0™D˜Að ŸI™I n°f¸aÓ@ÕAÚ$0ùó   ‚#%)z**z
CN=ServersúCN=NTDS Settings,c              3   óN   #   • U  H  u  pXR                  S SS5      4v •  M     g7f)r5   z*,r   Nr1   r2   s      r   r(   r)   �   s*   é € ð 2Ú$0™D˜Að ŸI™IÐ&9¸4ÀÓCÕDÚ$0ùr4   )r.   zCN=NTDS Settings)	Údictr   ÚlistÚvaluesÚsetÚ
IndexErrorr   ÚitemsÚ
startswith)ÚverticesÚsuffixÚ
aggressiveÚvmapÚreplacementsÚvlistÚcr,   r3   r'   r-   s             @r   Úshorten_vertex_namesrE   >   sã  ø€ ô  Ñ)¡Ó)Ó)€DØ€Lä
ˆ4ƒy�1ƒ}ð ˆÜ�T—[‘[“]Ó#ˆð		&ØÜÔ,¡eÓ,Ó,�Ü�q“6˜A“: ¨£ØØ�Q‘�ñ	 ð 	
ˆQ‰ˆð �!‰HˆØ”#�a“&‹j˜Q˜q™T S›[Ø�‰FˆAð ”#�a“&‹j˜Q˜q™T S�[ð ”�V“�ÓàÐ%Ð%à×Ñ˜V q r U˜OÔ,à—J‘J–L‰DˆAØ˜˜�e˜f‘nˆD‹Gñ !ö à—‘–ˆAØ QÕ&Ùñ ô ñ 2Ø$(§J¡J¤Ló2ó 2ˆDà×ÑÐ 4Ô5à—‘–ˆAØ—<‘<Ð 3×4Ó4Øð ÐÐñ ô ñ 2Ø$(§J¡J¤Ló2ó 2ˆDà×ÑÐ 9Ô:àÐÐøôS ó 	&ð Ð%Ò%ð	&ús   Á+F< Á-F< Æ<GÇGc                 óz  • Uc  / n/ n/ n/ n/ n/ n	[        U 5       GH  u  p«Uu  pÍnSX:4-  n[        U5      nSU-  nU(       aA  U	R                  U5        UR                  U5        UR                  U< SU< SU< S35        Mi  UR                  U5        SU-  nSU-  nU	R                  U5        UR                  S	U-  5        UR                  U< S
U< S35        UR                  U< SU< S35        UR                  U< SU< SU< S35        UR                  SUXN4-  5        UR                  S5        GM"     SnU(       a^  [        [        U5      5       HF  u  n
nU	R                  SU
-  5        Uu  nnUS   S:X  a  US   S:X  a
  USS nUSS nUSU
UU4-  -  nMH     / nU	(       a&  U H   nUR                  SU< SU	S   < S35        M"     SSR	                  U5      < SSR	                  U5      < SSR	                  U5      < S U< S!SR	                  U5      < SSR	                  U	5      < S"3nU$ )#ak  Generate a dot file snippet that acts as a legend for a graph.

:param key_items: sequence of items (is_vertex, style, label)
:param nodes_above: list of vertices (pushes key into right position)
:param elision: tuple (short, full) indicating suffix replacement
:param prefix: string used to generate key node names ["key_"]
:param width: default width of node lines

Each item in key_items is a tuple of (is_vertex, style, label).
is_vertex is a boolean indicating whether the item is a vertex
(True) or edge (False). Style is a dot style string for the edge
or vertex. label is the text associated with the key item.
Nz%s%d_z%s_labelz[label="z"; Ú]z%se1z%se2zsubgraph cluster_%s {z$[label=src; color="#000000"; group="z_g"]z%[label=dest; color="#000000"; group="z -> z [constraint = false; z8%s[shape=plaintext; style=solid; width=%f; label="%s\r"]Ú}Ú z	elision%dr   r	   r   uO   
elision%d[shape=plaintext; style=solid; label="\â€œ%sâ€�  means  â€œ%sâ€�\r"]
r   z" -> z [style=invis]z\subgraph cluster_key {
label="Key";
subgraph cluster_key_nodes {
label="";
color = "invis";
z;
z;
}
subgraph cluster_key_edges {
label="";
color = "invis";
r
   z
{Ú z}
}
z
}
z [style=invis; weight=9]
)Ú	enumerater    r   Úreversedr   )Ú	key_itemsÚnodes_aboveÚelisionsÚprefixÚwidthÚ
edge_linesÚ
edge_namesÚvertex_linesÚvertex_namesÚorder_linesr-   ÚitemÚ	is_vertexÚstyleÚlabelÚtagÚnameÚe1Úe2Úelision_strÚelisionÚshortÚlongÚabove_linesr   r   s                             r   Úcompile_graph_keyrd   ˆ   sc  € ð ÑØˆØ€JØ€JØ€LØ€LØ€KÜ˜Y×'‰ˆØ"&Ñˆ	˜%Ø˜˜Ñ#ˆÜ! %Ó(ˆØ˜CÑˆæØ×Ñ˜tÔ$Ø×Ñ Ô%Ø×ÑÛ!%£u«eð!5ö 6ð ×Ñ˜dÔ#Ø˜#‘ˆBØ˜#‘ˆBØ×Ñ˜tÔ$Ø×ÑÐ5¸Ñ;Ô<Ø×ÑÛ!£3ð(ô )à×ÑÛ!£3ð(ô )à×ÑÃRËÛEJðLô Mà×Ñð  0à# UÐ2ñ3ô 4ð ×Ñ˜c×"ñ5 (ð8 €KÞÜ#¤H¨XÓ$6Ö7‰JˆAˆwØ×Ñ˜{¨Q™Ô/Ø!‰KˆE�4Ø�Q‰x˜3‹ 4¨¡7¨c£>Ø˜a˜b˜	�Ø˜A˜B�x�Øð Hà ! 5¨$Ð/ñ1ñ 2ŠKñ 8ð €KÞÛˆAØ×ÒÛ ! ;¨q¤>ð 3ö 4ñ øð, �J‰J�|Ö$Ø�I‰I�jÖ!Ø�H‰H�ZÖ ÛØ�J‰J�{Ö#Ø�K‰K˜Ö$ð/
€Að4 €Hr   Tc                 ó  • / nUR                   nU c%  [        S U 5       5      [        S U 5       5      -  n U(       a}  [        [        S U 5       5      [        S U 5       5      -  [        U 5      -  5      n[        U5      u  nnU  Vs/ s H  nUU   PM
     n nU VVs/ s H  u  nnUU   UU   4PM     nnnOSnU
c  Sn
U(       a  SnSnOS	nS
nU" S5        U" U< SU
< S35        Ub  U" SU< S35        U" S[        -  5        U" S[        -  5        SnSn/ n[        U 5       GH  u  nn[        UU5      nUR                  U5        / nU(       a_  UU   (       aU  UU   nUU:w  aJ  Ub  U" S5        Un[        U5      nU(       a+  U" SU-  5        US-  nU" S5        U" S5        U" SU-  5        U(       a  UU   (       a  UR                  UU   5        U(       a*  UU   (       a   UR                  S[        UU   5      -  5        U(       a#  U" SU< SSR                  U5      < S35        GM  U" SU< S35        GM     U(       a  U" S5        [        U5       Hà  u  nn U u  nnUc  SnUc  Sn[        UU5      n[        UU5      n/ nU(       a"  [        UU   5      n!UR                  S U!-  5        U(       a   UR                  S[        UU   5      -  5        U	(       a  UR                  U	U   5        U(       a*  U" SU< S!U< S"U< SSR                  U5      < S3	5        MË  U" SU< S!U< S"U< S35        Mâ     U(       a  [        UUUS#9n"U" U"5        U" S$5        S%R                  U5      $ s  snf s  snnf )&aO  Generate a Graphviz representation of a list of vertices and edges.

:param vertices: list of vertex names (optional).
:param edges:    list of (vertex, vertex) pairs
:param directed: bool: whether the graph is directed
:param title: optional title for the graph
:param reformat_labels: whether to wrap long vertex labels
:param vertex_colors: if not None, a sequence of colours for the vertices
:param edge_colors: if not None, colours for the edges
:param edge_labels: if not None, labels for the edges
:param vertex_styles: if not None, DOT style strings for vertices
:param edge_styles: if not None, DOT style strings for edges
:param graph_name: if not None, name of graph
:param shorten_names: if True, remove common DN suffixes
:param key: (is_vertex, style, description) tuples
:param vertex_clusters: list of subgraph cluster names

Colour, style, and label lists must be the same length as the
corresponding list of edges or vertices (or None).

Colours can be HTML RGB strings ("#FF0000") or common names
("red"), or some other formats you don't want to think about.

If `vertices` is None, only the vertices mentioned in the edges
are shown, and their appearance can be modified using the
vertex_colors and vertex_styles arguments. Vertices appearing in
the edges but not in the `vertices` list will be shown but their
styles can not be modified.
Nc              3   ó*   #   • U  H	  oS    v •  M     g7f©r   Nr$   ©r&   r,   s     r   r(   Údot_graph.<locals>.<genexpr>  s   é € Ð+¢U ˜–t¢Uùó   ‚c              3   ó*   #   • U  H	  oS    v •  M     g7f©r   Nr$   rh   s     r   r(   ri     s   é € Ð1FÂ¸1°A¶$Âùrj   c              3   ó*   #   • U  H	  oS    v •  M     g7frg   r$   rh   s     r   r(   ri     ó   é € Ð-¢u !˜1ž¢uùrj   c              3   ó*   #   • U  H	  oS    v •  M     g7frl   r$   rh   s     r   r(   ri     rn   rj   ÚA_samba_tool_productionÚdigraphz->Úgraphz--z/* generated by samba */rJ   z {zlabel="z";zfontsize=%s;
z'node[fontname=Helvetica; fontsize=%s];
r   rH   zsubgraph cluster_%d {r   zstyle = "rounded,dotted";z'node [style="filled"; fillcolor=white];zlabel = "%s";z
color="%s"r   z" [z, z];zMissing source valuezMissing destination valuez
label="%s"z" z ")rN   rO   z}
r
   )	r   r:   r8   rE   Ú	FONT_SIZErK   r    r   rd   )#r>   ÚedgesÚdirectedÚtitleÚreformat_labelsÚvertex_colorsÚedge_colorsÚedge_labelsÚvertex_stylesÚedge_stylesÚ
graph_nameÚshorten_namesrM   Úvertex_clustersÚoutÚwriterC   rA   rO   r,   Úar   Ú
graph_typeÚ	connectorÚprev_clusterÚ	cluster_nÚquoted_verticesr-   r'   ÚattrsÚclusterr   ÚedgerZ   Úkeys#                                      r   Ú	dot_graphrŒ   é   sV  € ðT €CØ�J‰J€EàÑÜÑ+¡UÓ+Ó+¬cÑ1FÁÓ1FÓ.FÑFˆæÜ”SÑ-¡uÓ-Ó-ÜÑ-¡uÓ-Ó-ñ.ä˜“]ñ#ó $ˆô .¨eÓ4‰ˆˆhÙ%-Ó.¢X �D˜”G¡XˆÐ.Ù05Ô6²©¨¨1�$�q‘'˜4 ™7Ó#±ˆÑ6ˆð ˆàÑØ.ˆ
æØˆ
Ø‰	àˆ
Øˆ	á	Ð
$Ô%Ù	“z£:Ð
.Ô/ØÑÚ›uÐ&Ô'Ù	Ð
œiÑ
(Ô)Ù	Ð
4¼	Ñ
BÔCà€LØ€IØ€OÜ˜(×#‰ˆˆ1Ü˜a Ó1ˆØ×Ñ˜qÔ!ØˆÞ˜¨q×1Ø% aÑ(ˆGØ˜,Ó&ØÑ+Ù˜#”JØ&�Ü% gÓ.�ÞÙÐ1°IÑ=Ô>Ø ‘N�IÙÐ5Ô6ÙÐCÔDÙ˜/¨AÑ-Ô.æ˜]¨1×-Ø�L‰L˜ qÑ)Ô*Þ˜]¨1×-Ø�L‰L˜Ô(9¸-ÈÑ:JÓ(KÑKÔLÞÚ£! T§Y¡Y¨uÖ%5Ð6×7â›Q�.×!ñ3 $ö6 ÙˆcŒ
ä˜UÖ#‰ˆˆ4Ø‰ˆˆ1Ø‰9Ø&ˆAØ‰9Ø+ˆAä˜a Ó1ˆÜ˜a Ó1ˆàˆÞÜ% k°!¡nÓ5ˆEØ�L‰L˜¨Ñ-Ô.ÞØ�L‰L˜Ô(9¸+Àa¹.Ó(IÑIÔJÞØ�L‰L˜ Q™Ô(ÞÚ«!«Y»¸4¿9¹9ÀUÖ;KÐLÖMâ£Q«	³1Ð5Ö6ñ+ $ö. Ü 	°Ø)1ñ3ˆáˆcŒ
á	ˆ%„LØ�9‰9�S‹>Ðùòk /ùÛ6s   Â
M8Â M=)úalternate rowsÚdisconnectedÚ	connectedÚ
transitiveÚheaderÚreseté'   é-   é|   )Úbgép   éÖ   é¾   é¸   éÜ   éÐ   )r�   rŽ   r�   r�   útransitive scaler‘   r’   é«   éÏ   ©rI   rI   )Úansizansi-heatmapzxterm-256colorzxterm-256color-heatmapNu   â”‚u   â”€u   â•­ô   Â·r   u   â†�)ÚverticalÚ
horizontalÚcornerÚdiagonalÚmissingÚright_arrowÚ|r	   Ú0z<-)Úutf8Úasciic                 ó  • [        U 5      [        S U 5       5      -  [        S U 5       5      -  nU[        U 5      :w  a'  [        SU[        U 5      -
  -  [        R                  S9  [	        U5      n0 nU H	  nUS0XE'   M     U H  u  pgXF   R                  US5      XF   U'   M      [        U5       H–  nSn	0 n
UR                  5        Hp  u  p[UR                  5       nXÊU'   UR                  5        HC  u  p}XG   R                  5        H(  u  pïXß-   nUR                  Xã5      nUU:  d  M"  UXÎ'   Sn	M*     ME     Mr     U
nU	(       a  M–    O   0 nU  H5  n0 UU'   U  H'  nXE   R                  UU5      nUU:  d  M  UUU   U'   M)     M7     U$ )	Nc              3   ó*   #   • U  H	  oS    v •  M     g7frg   r$   ©r&   Úes     r   r(   Ú+find_transitive_distance.<locals>.<genexpr>Ë  ó   é € Ð,¢e ˜!ž¢eùrj   c              3   ó*   #   • U  H	  oS    v •  M     g7frl   r$   r¯   s     r   r(   r±   Ì  r²   rj   zthere are unknown vertices: %s)Úfiler   r   FT)	r:   ÚprintÚsysÚstderrr   ÚgetÚranger<   Úcopy)r>   rt   Úall_verticesÚinfÚ	distancesr'   ÚsrcÚdestr-   ÚchangedÚnew_distancesÚdÚnew_dÚcostÚleafÚcost2Únew_costÚold_costÚanswerÚv2r‚   s                        r   Úfind_transitive_distancerË   É  s¥  € Ü˜“MÜÑ,¡eÓ,Ó,ñ-äÑ,¡eÓ,Ó,ñ-€Lð ”s˜8“}Ó$ÜÐ.Øœc (›mÑ+ñ-ä—:‘:ò	ô ˆlÓ
€CØ€IÛˆØ˜1�vˆ	‹ñ ó ‰	ˆØ(™~×1Ñ1°$¸Ó:ˆ	‰�tÓñ ô
 �3ŽZˆØˆØˆØ—O‘OÖ%‰DˆAØ—F‘F“HˆEØ$˜!ÑØŸg™gži‘
�Ø#,¡?×#8Ñ#8Ö#:‘K�DØ#™|�HØ Ÿu™u TÓ/�HØ (Õ*Ø&.˜™Ø"&šó $;ó (ñ &ð "ˆ	ßˆwÙñ! ð& €FÛˆØˆˆq‰	ÛˆBØ‘× Ñ   SÓ)ˆAØ�3�wØ !��q‘	˜"“ó ñ ð €Mr   c                 ó|   ^ ^^^• ST ;   a+  T S   m[        T5      mS[        US-  5      -   mUUU4S jnU$ U 4S jnU$ )Nr�   r   g      à?c                 ó`   >• [        U [        5      (       d  gT[        U T-  T-  TS-
  5         $ )NrI   r   )Ú
isinstanceÚintÚmin)ÚlinkÚmr   Úscales    €€€r   ÚfÚ"get_transitive_colourer.<locals>.f  s1   ø€ Ü˜d¤C×(Ñ(ØØœ˜T A™X¨™]¨A°©EÓ2Ñ3Ð3r   c                 ó   >• TS   $ )Nr�   r$   )rÑ   Úcolourss    €r   rÔ   rÕ   	  s   ø€ Ø˜<Ñ(Ð(r   )r   rÏ   )r×   Ú
n_verticesrÔ   rÒ   r   rÓ   s   `  @@@r   Úget_transitive_colourerrÙ   ý  sK   û€ Ø˜WÓ$ØÐ*Ñ+ˆÜ�‹JˆØ”�J #Ñ%Ó&Ñ&ˆ÷	4ð €Hõ	)ð €Hr   c                 ó	  ^0• / nUR                   n	[        U(       a  SOS   n
U
S   nU
S   nU
S   nU
S   nU
S   nU
S   n[        U   n[        UR	                  S	S
5      5      nU c.  [        [        S U 5       5      [        S U 5       5      -  5      n UbE  [        XS9n / n[        XS9 H,  u  nn[        U5      m0UR                  U04S jU 5       5        M.     OU  Vs/ s H  n[        U5      PM     nnU(       a|  [        [        S U 5       5      [        S U 5       5      -  [        U 5      -  5      n[        USSS9u  nnU  Vs/ s H  nUU   PM
     n nU VVs/ s H  u  nnUU   UU   4PM     nnn[        S[        S U  5       5      5      nUR	                  SS5      nUR	                  SS5      nUR	                  SS5      nUR	                  SS5      n [        U[        U 5      5      n!SU-  n"Sn#U	" SUSS[        U 5      -  UU 4-  5        [        U 5       H^  u  n$n[        U 5      U$-
  n%UU$   m0U%S:X  a  U"S S < U< SU < 3n&OU"n&U	" U&< SU#< U < T0< U< UU%-  < SU< U < 3
5        U#T0U-   -  n#M`     [!        X5      n'[        U 5       GH  u  n$nUU$   m0U'U   n(/ n)U  HŸ  n*U(R	                  U*5      n+U+c  U)R                  U< U< 35        M0  U+S :X  a  U)R                  U < T0< U< U < 35        MU  U+S:X  a  U)R                  U< S!U < 35        Mu  U!" U+5      n,U+S":”  a  S#n+U)R                  U,< U+< U < 35        M¡     Ub)  UU$   (       a  U)R                  U < SU< SUU$   < 35        U	" S$T0UUU SR#                  U)5      U 4-  5        GM     [        U5      n-U(       a:  U	" S5        [%        W5       H#  u  n.n/U	" S%U-< U.< U < S&U-< U/< U < S%3	5        M%     U(       ak  U	" S5        U	" S'U< SU < S(U< S)U < S*3	5        U	" U-< U< U < S+35        U	" U< S!U < S,35        U	" U!" S-5      < S.U < S/35        U	" U< U< U < S035        S1R#                  U5      $ s  snf s  snf s  snnf )2Nr«   r¬   r£   r¤   r¥   r¦   r§   r¨   r�   r    c              3   ó*   #   • U  H	  oS    v •  M     g7frg   r$   rh   s     r   r(   Ú"distance_matrix.<locals>.<genexpr>&  s   é € Ð2ªE q ždªEùrj   c              3   ó*   #   • U  H	  oS    v •  M     g7frl   r$   rh   s     r   r(   rÜ   &  s   é € Ð8MÂuÀ!¸1¾Âuùrj   ©r‹   c              3   ó(   >#   • U  H  nTv •  M	     g 7fr#   r$   ©r&   r,   rD   s     €r   r(   rÜ   /  ó   øé € ˜nª! Q�qª!ùó   ƒc              3   ó*   #   • U  H	  oS    v •  M     g7frg   r$   rh   s     r   r(   rÜ   4  rn   rj   c              3   ó*   #   • U  H	  oS    v •  M     g7frl   r$   rh   s     r   r(   rÜ   5  rn   rj   Ú+T©r@   é   c              3   ó8   #   • U  H  n[        U5      v •  M     g 7fr#   ©r   r%   s     r   r(   rÜ   <  s   é € Ð/¢h ”c˜!—f�f¢hùó   ‚r‘   rI   rŽ   r�   r’   rJ   z%*s %s  %sdestination%sr   iúÿÿÿÚsourcer   Ú1é	   Ú>ú%s%*s%s %s%sÚ'ú' stands for 'zData can get from z to Údestinationz" in the indicated number of steps.z% means zero steps (it is the same DC)z means a direct linkr   Ú2zG means a transitive link involving two steps (i.e. one intermediate DC)z5 means there is no connection, even through other DCsr
   )r   ÚCHARSETSÚCOLOUR_SETSr   r¸   Úsortedr:   r   ÚnextÚextendr8   rE   ÚmaxrÙ   r   rK   rË   r   rL   )1r>   rt   r«   r   r~   Úgenerate_keyÚgrouping_functionÚrow_commentsÚlinesr�   Úcharsetr£   r¤   r¥   r¦   r§   r¨   r×   Úcolour_cycleÚcolour_listr3   r'   rC   rA   rB   r,   r‚   r   ÚvlenÚc_headerÚ	c_disconnÚc_connÚc_resetÚcolour_transitiveÚvspaceÚ	verticalsr-   ÚjÚstartÚconnectionsÚlinksÚrowrÊ   rÑ   ÚctÚ	example_cÚ
substituteÚoriginalrD   s1                                                   @r   Údistance_matrixr    sª  ø€ ð €EØ�L‰L€Eä¦‘v¨7Ñ3€GØ�zÑ"€HØ˜Ñ&€JØ�XÑ€FØ�zÑ"€HØ�iÑ €GØ˜-Ñ(€Kä˜&Ñ!€Gä˜Ÿ™Ð%5°uÓ=Ó>€LàÑÜœ#Ñ2©EÓ2Ó2´SÑ8MÁuÓ8MÓ5MÑMÓNˆàÑ$ô ˜(Ñ:ˆØˆÜ˜HÔ<‰DˆAˆqÜ�\Ó"ˆAØ×Ñœn©!›nÖ,ò =ñ 4<Ó<²8¨a”t˜LÖ)±8ˆÐ<æÜ”SÑ-¡uÓ-Ó-ÜÑ-¡uÓ-Ó-ñ.ä˜“]ñ#ó $ˆô 2°%¸Ø=AñCÑˆˆlá%-Ó.¢X �D˜”G¡XˆÐ.Ù05Ô6²©¨¨1�$�q‘'˜4 ™7Ó#±ˆÑ6äˆq”#Ñ/¡hÓ/Ó/Ó0€Dð �{‰{˜8 RÓ(€HØ—‘˜N¨BÓ/€IØ�[‰[˜ bÓ)€FØ�k‰k˜' 2Ó&€Gä/°¼¸X»ÓGÐà�4‰Z€FØ€IÙ	Ð
# t¨RØ'*¬S°«]Ñ':Ø'/Ø'.ð'0ñ 0ô 1ô ˜(Ö#‰ˆˆ1Ü�‹M˜AÑˆØ˜‰NˆØ�‹6Ø&,¨S¨b¢k³8ºWÐE‰EàˆEÙ£eÚ&/Ú&-Ú&'Ú&,Ø&0°1¤nÚ&'Ú&-ð(ô 	)ð 	�Q˜‘\Ñ!Š	ñ! $ô$ +¨8Ó;€Kä˜(×#‰ˆˆ1Ø˜‰NˆØ˜A‘ˆØˆÛˆBØ—9‘9˜R“=ˆDØ‰|Ø—
‘
¢Y²Ð8Ô9ÙØ�q‹yØ—
‘
ª²!²XºwÐGÖHØ˜“Ø—
‘
£fªgÐ6Ö7á& tÓ,�Ø˜!“8Ø�DØ—
‘
¢rª4²Ð9Ö:ñ ð Ñ#¨°Q¯Ø�J‰J£W«k¸<È»?ÐKÔLáˆn  4¨¨GØ "§¡¨£¨gð 7ñ 7÷ 	8ñ- $ô2 �\Ó"€IÞÙˆbŒ	Ü$,¨\Ö$:Ñ ˆJ˜Ú²IÚ4>Û4;Ú4=Ú4<Û4;ð=ö >ñ %;ö ÙˆbŒ	ÚÛ.6»Û.6»ðAô 	Bñ 	Úš(£Gð-ô 	.á«V³WÐ=Ô>Ùá  Ö#£Wð.ô 	/ñ 	Úš'£7ð,ô 	-ð �9‰9�UÓÐùòA =ùò /ùÛ6s   Ã!Q2ÅQ7Å!Q<c                 ó.   • US:X  a  SnSUS-
  -  U -   U-   $ )Nr   rI   rJ   r$   )ÚcharÚdigitsÚpaddings      r   Úpad_charr  ”  s'   € Ø�ƒ{ØˆØ�&˜1‘*Ñ Ñ$ wÑ.Ð.r   c                 ó–   • 0 nU R                  5        H2  u  p#UR                  5        H  u  pEXQR                  U0 5      U'   M     M4     U$ r#   )r<   Ú
setdefault)rÒ   Úm2Úk1r  Úk2Údists         r   Útranspose_dict_matrixr  š  sE   € Ø	€BØ—7‘7–9‰ˆØŸ	™	ž‰HˆBØ(,�M‰M˜"˜bÓ! "Ó%ó $ñ ð €Ir   c                 ó\	  ^7^8• / nUR                   nU(       a  [        U 5      n US:„  n[        U(       a  SOS   n[        US   U5      nUS   XŽ-   -  n[        US   UUS   5      n[        US   U5      n[        US   U5      n[        S	U5      nUS
   n[        SU5      n[        U   n[        UR                  SS5      5      n[        U R                  5       5      nUbL  UR                  US9  / n[        UUS9 H,  u  nn[        U5      m7UR                  U74S jU 5       5        M.     OU Vs/ s H  n[        U5      PM     nnU(       an  [        USSS9u  m8n0 nU R                  5        H/  u  n n![        U84S jU!R                  5        5       5      UT8U    '   M1     Un [        U R                  5       5      n[!        S[#        U
5      [!        S U 5       5      5      n"UR                  SS5      n#UR                  SS5      n$UR                  SS5      n%UR                  SS5      n&Uc  [#        U 5      n[%        UU5      n'SU"-  n(Sn)U" U(< SU[#        U 5      S-   -  < SU#< U
< U&< 35        ['        U5       Hm  u  n*n[#        U 5      U*-
  n+UU*   m7U+S:X  a  U(S [#        U	5      *  < U#< U	< U&< 3n,OU(n,U" U,< SU)< U&< T7< U< UU+-  < SU< U&< 3
5        U)T7< U< 3-  n)Mo     SU-  < U&< 3n-Sn.['        U5       GH  u  n*nU U   n/UU*   m7/ n0U H§  n1U1U/;  a  U0R                  U$< U< U&< 35        M%  UU1:X  a  U0R                  U&< T7< U< U&< 35        MJ  U/U1   n2U2SU-  :¼  a&  U'" U25      n3U0R                  U3< U< U&< 35        Sn.M~  U2S:X  a  U%n3OU'" U25      n3U0R                  SU3UU2U-4-  5        M©     Ub)  UU*   (       a  U0R                  U&< SU< SUU*   < 35        U" ST7U"UU&SR)                  U05      U&4-  5        GM     U.(       d  U(       a  U" S5        U.(       a  U" S U'" SU-  5      UU&SU-  S-
  4-  5        U(       a=  [        U5      n4[+        W5       H#  u  n5n6U" S!U4< U5< U&< S"U4< U6< U&< S!3	5        M%     S#R)                  U5      $ s  snf )$Nr   r«   r¬   r£   r¤   r¥   r¦   r§   rî   r¨   rJ   r�   r    rÞ   c              3   ó(   >#   • U  H  nTv •  M	     g 7fr#   r$   rà   s     €r   r(   Úfull_matrix.<locals>.<genexpr>Ì  rá   râ   rå   Træ   c              3   ó6   >#   • U  H  u  pTU   U4v •  M     g 7fr#   r$   )r&   r3   r'   rA   s      €r   r(   r!  Õ  s   øé € Ð$Hºi±d°a d¨1¡g¨q¥\ºiùs   ƒrç   c              3   ó8   #   • U  H  n[        U5      v •  M     g 7fr#   ré   r%   s     r   r(   r!  Ú  s   é € Ð"<²8¨a¤3 q§6 6²8ùrê   r‘   rI   rŽ   r�   r’   Fr   r   z%s%*s%srï   z'%s%s%s' means greater than %d rð   rñ   r
   )r   r  rô   r  rõ   r   r¸   r8   ÚkeysÚsortr   r÷   rø   rE   r<   r7   rù   r   rÙ   rK   r   rL   )9Úrowsr«   r   r~   rú   rû   rü   Úcolour_scaler  ÚylabelÚxlabelÚ	transposerý   r�   Úuse_paddingrþ   r£   r¤   r¥   r¦   r§   Útoobigr¨   Úemptyr×   rÿ   r>   r   r3   r'   rB   Úrows2ÚvertÚrr  r  r  r  r  r  r  r  r-   r	  r
  Úend_cellÚoverflowr  r  rÊ   rÑ   r  r  r  r  rD   rA   s9                                                          @@r   Úfull_matrixr3  ¢  sÒ  ù€ ð €EØ�L‰L€EæÜ$ TÓ*ˆà˜1‘*€Kä¦‘v¨7Ñ3€GÜ˜ 
Ñ+¨VÓ4€HØ˜Ñ&¨&Ñ*>Ñ?€JÜ�g˜hÑ'¨Ø˜lÑ+ó-€Fä˜ 
Ñ+¨VÓ4€HÜ�w˜yÑ)¨6Ó2€GÜ�c˜6Ó"€FØ˜-Ñ(€KÜ�S˜&Ó!€Eä˜&Ñ!€Gä˜Ÿ™Ð%5°uÓ=Ó>€LÜ�D—I‘I“KÓ €HØÑ$ð 	�‰Ð+ˆÑ,ØˆÜ˜HÐ*;Ô<‰DˆAˆqÜ�\Ó"ˆAØ×Ñœn©!›nÖ,ò =ñ 4<Ó<²8¨a”t˜LÖ)±8ˆÐ<æÜ1°(¸CØ=AñCÑˆˆlàˆØ—z‘z–|‰GˆD�!Ü $Ô$H¸a¿g¹g¼iÓ$HÓ HˆE�$�t‘*Óñ $ð ˆÜ˜Ÿ	™	›Ó$ˆäˆq”#�f“+œsÑ"<±8Ó"<Ó<Ó=€Dð �{‰{˜8 RÓ(€HØ—‘˜N¨BÓ/€IØ�[‰[˜ bÓ)€FØ�k‰k˜' 2Ó&€GàÑÜ˜4“yˆÜ/°¸ÓFÐà�4‰Z€FØ€IÙ	›FØ!¤S¨£Y°¡]Ô3Ú$Ú"Ú#ð	%ô &ô
 ˜(Ö#‰ˆˆ1Ü�‹I˜‰MˆØ˜‰NˆØ�‹6Ø"(¨¬3¨v«;¨,Ò"7Ú"*Ú"(Ú")ð+‰Eð
 ˆEÙ£eÚ&/Ú&-Ú&'Ú&,Ø&0°1¤nÚ&'Ú&-ð(ô 	)ð 	šq¢(Ð+Ñ+Š	ñ' $ð* ˜{Ó*ªGÐ4€HØ€HÜ˜(×#‰ˆˆ1Ø�Q‘ˆØ˜‰NˆØˆÛˆBØ˜‹Ø—
‘
¢y²'º7ÐCÖDØ�b“Ø—
‘
ª²!²XºwÐGÖHà˜R‘y�Ø˜2 ™<Ó'Ù*¨4Ó0�BØ—J‘Jª2ªv²wÐ?Ô@Ø#�HÙØ˜1“9Ø‘Bá*¨4Ó0�BØ—
‘
˜9¨¨F°D¸(Ð'CÑCÖDñ! ð$ Ñ#¨°Q¯Ø�J‰J£W«k¸<È»?ÐKÔLáˆn  4¨¨GØ "§¡¨£¨gð 7ñ 7÷ 	8ñ3 $ö8 –=ÙˆbŒ	æÙÐ3Ù$ R¨6¡\Ó2ØØØ˜‘< !Ñ#ð%ñ%ô &ö Ü˜Ó&ˆ	Ü$,¨\Ö$:Ñ ˆJ˜Ú²IÚ4>Û4;Ú4=Ú4<Û4;ð=ö >ñ %;ð �9‰9�UÓÐùòM =s   Ä1R))F)z,...F)NNÚkey_r   )FNTNNNNNNFNN)FNFFNN)rJ   )FNFFNNNr   rë   rò   T)Úsambar   r¶   Ú	itertoolsr   r   rs   r   r    rE   rd   rŒ   Ú
DARK_WHITEÚBLACKÚREDÚGREENÚDARK_YELLOWÚ	UNDERLINEÚC_NORMALÚREV_REDÚ	REV_GREENÚREV_DARK_YELLOWÚxterm_256_colourrõ   rô   rË   rÙ   r  r  r  r3  r$   r   r   Ú<module>rB     s  ðõ* Û 
ß $à€	òô0ôGðT =AØ+,ô^ðD ØØ"Ø ØØØ ØØØ!ØØ"ôJð^ "×,Ñ,¨f¯l©lÐ;ØŸ
™
Ø—\‘\Ø×(Ñ(Ø×"Ñ"Ø—‘ñð "×,Ñ,¨f¯l©lÐ;ØŸ™Ø×%Ñ%Ø×,Ñ,Ø×"Ñ"Ø—‘ñð "×2Ò2°2Ó6Ø!×2Ò2°2Ó6ð8ð ×/Ò/°¸Ñ=Ø×,Ò,¨SÓ1Ø×-Ò-¨cÓ2Ø#×4Ò4°SÓ9Ø#×4Ò4°SÓ9Ø#×4Ò4°SÓ9Ø#×4Ò4°SÓ9Ø#×4Ò4°SÓ9ð	ð ×"Ñ"Ø—‘ñð$ "×2Ò2°3Ó7Ø!×2Ò2°3Ó7ð9ð ×/Ò/°¸Ñ=Ø×,Ò,¨S°TÑ:Ø×-Ò-¨c°dÑ;Ø#×4Ò4°S¸TÑBØ#×4Ò4°S¸TÑBØ#×4Ò4°S¸TÑBØ#×4Ò4°S¸TÑBØ#×4Ò4°S¸TÑBð	ð ×"Ñ"Ø—‘ñð$  ØØØØØññg;€ð~ ØØààØñ	ð ØØØØØññ€ò,1òhð& ØØ"'Ø!&Ø&*Ø!%ôBôJ/òð ØØ#Ø"Ø"&Ø!Ø!ØØØ$ØõRr   