+
    ç‹cjÎ)  ã                   óF  € R t ^ RIt^ RIt ^ RIt^ RIHu H	t
 ^ RIHt R tR tR tR tR tR	]R
]R]R]R]R]/tR tR tR tR tR tR tR tRR lt]R8X  d¤   ^ RItRt]! ]P>                  4      ^ 8X  d?   ] ! R]P>                  ^ ,          ,          ]PB                  R7       ]PD                  ! ^4       ]P>                  ^,          t#]! ]P>                  4      ^8”  d   ]P>                  ^,          t]! ]#]4       R# R#   ] d   t]P                  R4       h RtAii ; i)z(Generate LDIF from Github documentation.Nz'Please install python3-markdown package)Ú
get_stringc                 ó   € R R . R 3# ©N© ©ÚdescriptionÚ
attributesÚsds   &&&ÚB/usr/lib/python3/dist-packages/samba/ms_forest_updates_markdown.pyÚnoopr   %   s   € Ø�$˜˜DÐ!Ð!ó    c                 ó0  € V P                  R 4      '       dc   V P                  R4      '       dL   V'       dD   VP                  4       R8X  d/   V'       d'   VP                  4       R8X  d   R\        V 4      RR.R3# RR. VP                  4       R8w  d   V3# R3# )zGranting the zto gMSA accounts.ún/aÚmodifyzadd: appliesToz/appliesTo: 7b8b558a-93a5-4af7-adca-c017e67f1057N)Ú
startswithÚendswithÚlowerÚextract_dn_or_noner   s   &&&r
   Úparse_grantr   *   s�   € à×Ñ˜×/Ò/Ø×ÑÐ0×1Ò1ß	˜
×(Ñ(Ó*¨eÔ3ß	�—‘“
˜eÔ#ØÔ,¨[Ó9Ø!Ð#TÐUØðð 	ð �d˜B b§h¡h£j°EÔ&9 ÐDÐD¸tÐDÐDr   c                 óf   € \        V 4      pR T\        W14      VP                  4       R8w  d   V3# R3# )Úaddr   N)Ú
extract_dnÚextract_attribr   )r   r   r	   Údns   &&& r
   Ú	parse_addr   8   s6   € Ü	�KÓ	 €BØ�2”~ bÓ5¸R¿X¹X»ZÈ5Ô=P°rÐ[Ð[ÐVZÐ[Ð[r   c                 ób   € R \        V 4      \        V4      VP                  4       R8w  d   V3# R3# )r   r   N)r   Úextract_replace_attribr   r   s   &&&r
   Ú	parse_setr   >   s<   € ØÔ(¨Ó5Ü" :Ó.Ø—(‘(“* Ô%ˆBð1ð 1à+/ð1ð 1r   c                 óx   € R  pRV! V 4      ^ ,          RRV,          .R3RV! V 4      ^,          RRV,          .R3.# )c                 ó*   € R V 9   d   R# RV 9   d   R# R# )z
Sam-Domainz
Domain-DNSN)z${DOMAIN_DN}zCN=Sam-Domain,${SCHEMA_DN})z${...}zCN=Domain-DNS,${SCHEMA_DN}r   ©Útexts   &r
   Úextract_dn_aceÚ!parse_ace.<locals>.extract_dn_aceH   s!   € Ø˜4ÔØAÐAØ˜TÔ!Ø;Ð;ár   r   zreplace: nTSecurityDescriptorz+nTSecurityDescriptor: ${DOMAIN_SCHEMA_SD}%sNz"replace: defaultSecurityDescriptorz,defaultSecurityDescriptor: ${OLD_SAMBA_SD}%sr   )r   r   r	   r"   s   &&& r
   Ú	parse_acer$   F   si   € òð ‘~ kÓ2°1Õ5Ø-Ø;¸bÕ@ðBØCGðIð ‘~ kÓ2°1Õ5Ø2Ø<¸rÕAðCØDHðJðKð Kr   ÚGrantingÚCreatedÚSetú	Added ACEÚUpdatedÚCallc                ó  € V P                  RR4      p V P                  RR4      p \        P                  ! RV 4      P                  ^ 4      pVR8X  d   R# VP	                  R4      '       d   VP                  R	R
4      pVR,           # V# )zS
Extract a DN from the textual description
:param text:
:return: DN in string form
z in the Schema partition.z,${SCHEMA_DN}z  in the Configuration partition.z,${CONFIG_DN}z!([CDO][NCU]=.*?,)*([CDO][NCU]=.*)zQCN=ad://ext/AuthenticationSilo,CN=Claim Types,CN=Claims Configuration,CN=Servicesz^CN=ad://ext/AuthenticationSilo,CN=Claim Types,CN=Claims Configuration,CN=Services,${CONFIG_DN}z&,CN=Extended-Rights" to gMSA accounts.z" to gMSA accounts.Ú )ÚreplaceÚreÚsearchÚgroupr   )r!   r   s   & r
   r   r   i   sƒ   € ð �<‰<Ð3°_ÓE€DØ�<‰<Ð:¸OÓL€DÜ	�ŠÐ6¸Ó	=×	CÑ	CÀAÓ	F€Bð 
Ð`Ô`Ùoð 
‡{�{Ð;×<Ò<Ø�Z‰ZÐ-¨rÓ2ˆØ�OÕ#Ð#à€Ir   c                ó*   €  \        V 4      #     R# ; i)zU
Same as above, but returns None if it doesn't work
:param text:
:return: DN or None
N)r   r    s   &r
   r   r      s   € ðÜ˜$ÓÐøðÚús   ‚
 �c                óê  € \         P                  P                  W 4      p\        VR4      ;_uu_ 4       pV Fœ  pVw  rgr‰VP	                  RV,          4       VP	                  RV,          4       \        V4      ^ 8”  d(   VP	                  RP                  V4      R,           4       V	e   VP	                  RV	,          4       VP	                  R4       Kž  	  RRR4       R#   + '       g   i     R# ; i)zÆ
Save ldif to disk for each updates
:param filename: filename use ([OPERATION NUM]-{GUID}.ldif)
:param answers: array of tuples generated with earlier functions
:param out_folder: folder to prepend
Úwúdn: %s
úchangetype: %s
Ú
NúnTSecurityDescriptor: D:%s
ú-

)ÚosÚpathÚjoinÚopenÚwriteÚlen)
ÚfilenameÚanswersÚ
out_folderr:   ÚldifÚanswerÚchanger   Úattribr	   s
   &&&       r
   Ú	save_ldifrF   ‹   s­   € ô �7‰7�<‰<˜
Ó-€DÜ	ˆd�C�Œ˜DÛˆFØ%+Ñ"ˆF˜Ø�J‰J�z B•Ô'Ø�J‰JÐ)¨FÕ2Ô3Ü�6‹{˜QŒØ—
‘
˜4Ÿ9™9 VÓ,¨tÕ3Ô4ØŠ~Ø—
‘
Ð9¸BÕ>Ô?Ø�J‰J�wÖñ ÷ 
��Šús   ´B#C!Ã!C2	c                ó  € RpV Ft  pVw  rVrxVRV,          ,          pVRV,          ,          p\        V4      ^ 8”  d    VRP                  V4      R,           ,          pVe   VRV,          ,          pVR,          pKv  	  W2V &   R# )z¢
Save ldif to an output dictionary
:param guid: GUID to store
:param answers: array of tuples generated with earlier functions
:param out_dict: output dictionary
r,   r4   r5   r6   Nr7   r8   )r>   r;   )	Úguidr@   Úout_dictrB   rC   rD   r   rE   r	   s	   &&&      r
   Ú
save_arrayrJ   Ÿ   s…   € ð €DÛˆØ!'Ñˆ�FØ�
˜R•ÕˆØÐ" VÕ+Õ+ˆÜˆv‹;˜Œ?Ø�D—I‘I˜fÓ%¨Õ,Õ,ˆDØŠ>ØÐ2°RÕ7Õ7ˆDØ��Šñ ð ˆTƒNr   c                ó  € VP                  R4       Uu. uF3  q"P                  4       R8w  g   K  VR8w  g   K"  VP                  R4      NK5  	  ppV Uu. uF-  q"P                  R4      '       d   VP	                  RR4      MTNK/  	  ppV Uu. uF-  q"P                  R4      '       d   VP	                  RR4      MTNK/  	  ppV Uu. uF+  q"P                  4       P                  R	4      '       d   K)  VNK-  	  ppV# u upi u upi u upi u upi )
z¬
Extract the attributes as an array from the attributes column
:param dn: parsed from markdown
:param attributes: from markdown
:return: attribute array (ldif-type format)
ú-   r   r,   ú- z: Truez: TRUEz: Falsez: FALSEzmsds-claimpossiblevalues)Úsplitr   Úlstripr   r-   r   )r   r   ÚxrE   s   &&  r
   r   r   ´   sæ   € ð '1×&6Ñ&6°vÔ&>ÓaÑ&> Ç'Á'Ã)ÈuÑBTŒnÐYZÐ^`ÑY`Œnˆa�h‰h�tŽnÑ&>€FÐaÙTZÓ[ÑTZÈq¯z©z¸(×/CÒ/Cˆa�i‰i˜ (Ô+ÈÒJÑTZ€FÐ[ÙW]Ó^ÑW]ÐRS·±¸I×1FÒ1Fˆa�i‰i˜	 9Ô-ÈAÒMÑW]€FÐ^áÓX™�A§w¡w£y×';Ñ';Ð<V×'W�aˆa™€FÐXà€Mùò bùÚ[ùÚ^ùâXs'   ”C:¯C:¸C:Á3C?Â3DÃ&D	Ã0D	c                óV  € V P                  R4       Uu. uF3  qP                  4       R8w  g   K  VR8w  g   K"  VP                  R4      NK5  	  ppV Uu. uF$  pRVP                  R4      ^ ,          ,          V3NK&  	  ppV UUu. uF  qD F  q3NK  	  K  	  pppV# u upi u upi u uppi )zš
Extract the attributes as an array from the attributes column
(for replace)
:param attributes: from markdown
:return: attribute array (ldif-type format)
rL   r   r,   rM   zreplace: %sÚ:)rN   r   rO   )r   rP   ÚlinesÚlineÚpairs   &    r
   r   r   Ä   s�   € ð &0×%5Ñ%5°fÔ%=Ó`Ñ%= ÇÁÃÈeÑASŒ^ÐXYÐ]_ÑX_Œ^ˆQ�X‰X�dŽ^Ñ%=€EÐ`ÙDIÓJÁE¸Dˆm˜dŸj™j¨›o¨aÕ0Õ0°$Ó7ÁE€EÐJÙ#Ô5™e�d²¨ŠT±‰T™e€EÑ5Ø€Lùò aùÚJùÛ5s   ”B¯B¸BÁ*B ÂB%c                 óž   € V P                   ;'       g    R R P                  R V  4       4      ,           V P                  ;'       g    R ,           # )r,   c              3   ó8   "  € T F  p\        V4      x € K  	  R # 5ir   )Ú	innertext)Ú.0Úes   & r
   Ú	<genexpr>Úinnertext.<locals>.<genexpr>Ó   s   é € Ð*¡c ”	˜!—�£cùs   ‚)r!   r;   Útail)Útags   &r
   rX   rX   Ñ   s=   € Ø�H‰H�NˆN˜Ø
�‰Ñ*¡cÓ*Ó*õ+à	�‰�ˆ�Rõð r   c           	     ó~  € \        V 4      ;_uu_ 4       pVP                  4       p\        P                  ! RRV4      p\        P                  ! RRV4      p\        P                  ! RRV4      p\        P                  ! VRR7      pR	R	R	4       XP                  R
R4      p\        P                  ! RV,           R,           4      pV EFÕ  pVP                  '       g   K  R	pVP                  P                  R4      '       da   \        \        P                  ! VRR7      4      P                  4        U	u. uF&  q™^\        V	4      ^,
           P                  R4      NK(  	  pp	M€VP                  P                  R4      '       d`   \        \        P                  ! VRR7      4      P                  4        U	u. uF&  q™^\        V	4      ^,
           P                  R4      NK(  	  pp	V'       g   EK&  VR,           EF¡  p
\        P                  ! RV
^ ,          4      pV'       d:   VP!                  ^4      pVP!                  ^4      P#                  ^4      : RV: R2pRpV
^,          P                  R4      '       g   V
^,          P                  R4      '       dm   V
^,          P                  R4      R,          V
^&   \%        V
^,          V
^,          V
^,          4      pX'       d   Ve   \'        WßV4       M\)        XWò4       EK  \*         Fw  pV
^,          P                  V4      '       g   K#  Rp\*        V,          ! V
^,          V
^,          V
^,          4      pX'       d   Ve   \'        Wß.V4       M\)        XV.V4        M	  V'       d   EK™  \-        V
4      h	  EKØ  	  R	#   + '       g   i     EL%; iu up	i u up	i )z¥
Read Github documentation to produce forest wide updates
:param in_file: Forest-Wide-Updates.md
:param out_folder: output folder
:param out_dict: output dictionary
z<p>z<br />zCN=\\<forest root domainzCN=<forest root domainzCN=<forest root domain.*?>z${FOREST_ROOT_DOMAIN}Úxhtml)Úoutput_formatNzCN=Schema,%wsz${SCHEMA_DN}z<root>z</root>z
|Operationr!   )ÚmethodÚ|z| Operationz | :é   NNzOperation (\d+): {(.*)}z-{z}.ldifFr&   r(   rR   Téÿÿÿÿ)r<   Úreadr.   ÚsubÚmarkdownr-   ÚETÚ
fromstringr!   r   r   ÚtostringÚ
splitlinesr>   rN   Úmatchr0   Úzfillr$   rF   rJ   Úoperation_mapÚ	Exception)Úin_filerA   rI   Úupdate_fileÚcontentÚhtmlÚtreeÚnodeÚupdatesrP   ÚupdateÚoutputrH   r?   ÚfoundÚresultÚ	operations   &&&              r
   Úread_ms_markdownr}   ×   s  € ô 
ˆg�Œ˜+à×"Ñ"Ó$ˆä—&’&˜Ø!Ø ó"ˆô —&’&Ð4Ø1Ø ó"ˆô —&’&Ð6Ø0Ø ó"ˆô × Ò  Ø/6ô8ˆ÷ 
ð$ �<‰<˜¨Ó8€Dä�=Š=˜ D�¨9Õ4Ó5€DäˆØ�y�yˆyÙØˆØ�9‰9×Ñ ×-Ò-ô "¤"§+¢+¨d¸6Ô"BÓC×NÑNÔPóRÙPð 78˜œ3˜q›6 A�:�×,Ñ,¨SÖ1ÙPð ð RˆGà�Y‰Y×!Ñ! -×0Ò0ô "¤"§+¢+¨d¸6Ô"BÓC×NÑNÔPóRÙPð 9:˜œ3˜q›6 A�:�×,Ñ,¨UÖ3ÙPð ð RçŠ7Ø! "Ÿ+™+�ÜŸšÐ"<¸fÀQ½iÓH�ßà!Ÿ<™<¨›?�DØ17·±¸a³×1FÑ1FÀqÖ1IË4ÐP�Hà�à˜!•9×'Ñ'¨	×2Ò2°f¸Qµi×6JÑ6JÈ;×6WÒ6Wð !' q¥	§¡°Ó 4°RÕ 8�F˜1‘Iä& v¨a¥y°&¸µ)¸VÀA½YÓG�Fç JÒ$:Ü! (°JÕ?ä" 4¨Ô:âç!.�IØ˜a•y×+Ñ+¨I×6Ô6Ø $˜ä!.¨yÖ!9¸&À½)ÀVÈAÅYÐPVÐWXÕPYÓ!Z˜ç#¨
Ò(>Ü% h°¸*ÕEä& t¨f¨X°xÔ@áñ "/÷ ’uÜ# FÓ+Ð+ôK &ó ÷- 
�ˆüò8RùòRs   ”A1N!Ä1,N5Æ2,N:Î!N2	Ú__main__r,   z4Usage: %s <Forest-Wide-Updates.md> [<output folder>])Úfile)NN)$Ú__doc__r.   r9   rh   ÚImportErrorrZ   Úadd_noteÚxml.etree.ElementTreeÚetreeÚElementTreeri   Úsamba.commonr   r   r   r   r   r$   ro   r   r   rF   rJ   r   r   rX   r}   Ú__name__ÚsysrA   r>   ÚargvÚprintÚstderrÚexitrq   r   r   r
   Ú<module>r�      s9  ðñ. /ã 	Û 	ð
Û÷ #Ð "Ý #ò"ò

Eò\ò1òKð* �àˆyà	ˆ9à�àˆyà
ˆDð€ò ò,	ò ò(ò*ò 
òôP,ðj ˆzÔÛà€Já
ˆ3�8‰8ƒ}˜ÔÙÐDÈÏÉÐQRÍÕTÐ[^×[eÑ[eÕfØ�Š�Œà�h‰h�q�k€GÙ
ˆ3�8‰8ƒ}�qÔØ—X‘X˜a•[ˆ
á�W˜jÖ)ñ øð_ ô 
Ø‡J�JÐ8Ô9Ø	ûð
ús   ŒD ÄD Ä	DÄD 