+
    ˜qgjé³  ã                   óü  € ^ RI t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHtH	t	 ^ RI
HtHtHtHtHtHtHtHt ^ RIHtHtHtHtHtHtHtHtHt ^ RIHt ^ RIH t  ^ RI!H"t"H#t# ^ RI$H%t% ^ R	I&H't' ^ R
I(H)t) ^ RI*H+t+ Rt,Rt-Rt.Rt/],]-]..t0Rt1Rt2Rt3Rt4Rt5Rt6Rt7Rt8]Pr                  ! ]:4      t;RRR 3RRR 3RRR  3/t<]	 ! R! R"]4      4       t= ! R# R$]4      t> ! R% R&]?4      t@ ! R' R(]?4      tA ! R) R*]?4      tBRHR+ ltC]53R, ltD ! R- R.]4      tE ! R/ R0]4      tF ! R1 R2]4      tG ! R3 R])] P�                  R47      tIR5 tJR6 R7 ltKR8 tLRIR9 R: lltMR; tNRJR< ltO ! R= R>]P4      tQR? tRR@ RA ltSRB RC ltTRD RE ltURF RG ltVR# )Ké    N)ÚEnumÚunique)ÚAnyÚDictÚListÚ
NamedTupleÚOptionalÚTupleÚUnionÚcast)	Úatomic_helperÚdmiÚimporterÚ	lifecycleÚnetÚperformanceÚ
type_utilsÚ	user_dataÚutil)Ú
write_json)ÚDistro)Ú
EventScopeÚ	EventType)Úlaunch_index)ÚPaths)ÚCloudInitPickleMixin)ÚeventsÚdisabledÚlocalr   ÚpassÚ
FILESYSTEMÚNETWORKÚ
DataSourcez|EXPERIMENTAL: The structure and format of content scoped under the 'ds' key may change in subsequent releases of cloud-init.zredacted for non-root userú
cloud-nameÚ_unsetÚunknownzcn-z	aws-chinac                 ó   € V R 8H  # ©Úaws© ©Úcs   &Ú</usr/lib/python3/dist-packages/cloudinit/sources/__init__.pyÚ<lambda>r.   F   s   €  1¨¢:ó    zus-gov-zaws-govc                 ó   € V R 8H  # r(   r*   r+   s   &r-   r.   r.   G   s   €  Q¨%¢Zr/   Úchinazazure-chinac                 ó   € V R 8H  # )Úazurer*   r+   s   &r-   r.   r.   H   s   €  q¨G¢|r/   c                   óJ   a € ] tR t^Lt o RtRtRtRtRtRt	V 3R lR lt
R	tV tR
# )ÚNetworkConfigSourcezV
Represents the canonical list of network config sources that cloud-init
knows about.
ÚcmdlineÚdsÚ
system_cfgÚfallbackÚ	initramfsc                ó    <€ V ^8„  d   QhRS[ /# ©é   Úreturn©Ústr)ÚformatÚ__classdict__s   "€r-   Ú__annotate__Ú NetworkConfigSource.__annotate__Y   ó   ø€ ÷ ñ ™ñ r/   c                ó   € V P                   # ©N©Úvalue©Úselfs   &r-   Ú__str__ÚNetworkConfigSource.__str__Y   ó   € Ø�z‰zÐr/   r*   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ÚCMD_LINEÚDSÚ
SYSTEM_CFGÚFALLBACKÚ	INITRAMFSrL   Ú__static_attributes__Ú__classdictcell__©rB   s   @r-   r5   r5   L   s/   ø‡ € ñð
 €HØ	€BØ€JØ€HØ€I÷ö r/   r5   c                   ó>   a € ] tR t^]t o RtRtRtV 3R lR ltRtV t	R# )ÚNicOrderzRepresents ways to sort NICsÚmacÚnic_namec                ó    <€ V ^8„  d   QhRS[ /# r<   r?   )rA   rB   s   "€r-   rC   ÚNicOrder.__annotate__c   rE   r/   c                ó   € V P                   # rG   rH   rJ   s   &r-   rL   ÚNicOrder.__str__c   rN   r/   r*   N)
rO   rP   rQ   rR   rS   ÚMACÚNIC_NAMErL   rY   rZ   r[   s   @r-   r]   r]   ]   s   ø‡ € Ù&à
€CØ€H÷ö r/   r]   c                   ó   € ] tR t^gtRtRtR# )ÚDatasourceUnpickleUserDataErrorzERaised when userdata is unable to be unpickled due to python upgradesr*   N©rO   rP   rQ   rR   rS   rY   r*   r/   r-   rg   rg   g   s   † ÝOr/   rg   c                   ó   € ] tR t^ktRtR# )ÚDataSourceNotFoundExceptionr*   N©rO   rP   rQ   rR   rY   r*   r/   r-   rj   rj   k   ó   † Ûr/   rj   c                   ó   € ] tR t^otRtRtR# )ÚInvalidMetaDataExceptionz8Raised when metadata is broken, unavailable or disabled.r*   Nrh   r*   r/   r-   rn   rn   o   s   † ÝBr/   rn   c                óÈ  € \         P                  ! V 4      p. p. pV P                  4        EF  w  rgV'       d   VR,           V,           pMTpVP                  4       V9   g   VP                  4       V9   d   VP	                  V4       \        V\        4      '       d=   VP                  R4      '       d&   VP	                  V4       VP                  RR4      W6&   \        V\        4      '       g   KÆ  \        WxV4      p	VP                  V	P                  R4      4       VP                  V	P                  R4      4       W“V&   EK  	  \        V4      VR&   \        V4      VR&   V# )z´Process all instance metadata cleaning it up for persisting as json.

Strip ci-b64 prefix and catalog any 'base64_encoded_keys' as a list

@return Dict copy of processed metadata.
Ú/zci-b64:Ú Úbase64_encoded_keysÚsensitive_keys)ÚcopyÚdeepcopyÚitemsÚlowerÚappendÚ
isinstancer@   Ú
startswithÚreplaceÚdictÚprocess_instance_metadataÚextendÚpopÚsorted)
ÚmetadataÚkey_pathrs   Úmd_copyrr   Ú	sens_keysÚkeyÚvalÚsub_key_pathÚ
return_vals
   &&&       r-   r}   r}   s   s+  € ô �mŠm˜HÓ%€GØÐØ€IØ—N‘N×$‰ˆßØ# c�>¨CÕ/‰LàˆLà�I‰I‹K˜>Ô)Ø×!Ñ!Ó# ~Ô5à×Ñ˜\Ô*Ü�cœ3×Ò C§N¡N°9×$=Ò$=Ø×&Ñ& |Ô4ØŸ;™; y°"Ó5ˆG‰LÜ�cœ4× Ô Ü2Ø >óˆJð  ×&Ñ& z§~¡~Ð6KÓ'LÔMØ×Ñ˜ZŸ^™^Ð,<Ó=Ô>Ø%�CŒLñ' %ô( &,Ð,?Ó%@€GÐ!Ñ"Ü & yÓ 1€GÐÑØ€Nr/   c                ób  € V P                  R. 4      '       g   V # \        P                  ! V 4      pV P                  R4       Fi  pVP                  R4      pTpV F@  pWe9   g   K  \	        WV,          \
        4      '       g   K)  WdR,          8w  g   K8  WV,          pKB  	  XV9   g   Ke  WV&   Kk  	  V# )z‡Redact any sensitive keys from to provided metadata dictionary.

Replace any keys values listed in 'sensitive_keys' with redact_value.
rs   rp   éÿÿÿÿ)Úgetrt   ru   Úsplitry   r|   )r�   Úredact_valuerƒ   r‚   Ú
path_partsÚobjÚpaths   &&     r-   Úredact_sensitive_keysr‘   –   s–   € ð �<‰<Ð(¨"×-Ò-ØˆÜ�mŠm˜HÓ%€GØ—L‘LÐ!1Ö2ˆØ—^‘^ CÓ(ˆ
ØˆÛˆDà–Ü˜s�y¬$×/Ô/Ø r�NÖ*à•i’ñ ð �3Ž;Ø$�‹Iñ 3ð €Nr/   c                   ó,   a € ] tR t^³t o V 3R ltRtV tR# )Ú	URLParamsc                óJ   <€ V ^8„  d   Qh/ S[ ;R&   S[ ;R&   S[ ;R&   S[ ;R&   # )r=   Úmax_wait_secondsÚtimeout_secondsÚnum_retriesÚsec_between_retries©Úint)rA   rB   s   "€r-   rC   ÚURLParams.__annotate__³   s5   ø‡ ‚ ÙÑñ áÑñ ñ Ññ ñ Ñò	 r/   r*   N©rO   rP   rQ   rR   Ú__annotate_func__rY   rZ   r[   s   @r-   r“   r“   ³   ó   ø‡ ‡ „ r/   r“   c                   ó,   a € ] tR t^ºt o V 3R ltRtV tR# )ÚDataSourceHostnamec                óB   <€ V ^8„  d   Qh/ S[ S[,          ;R&   S[;R&   # )r=   ÚhostnameÚ
is_default)r	   r@   Úbool)rA   rB   s   "€r-   rC   ÚDataSourceHostname.__annotate__º   s   ø‡ ‚ Ù‘s�mÑñ áÑò r/   r*   Nrœ   r[   s   @r-   r    r    º   rž   r/   r    c                   ó0   a € ] tR t^¿t o RtV 3R ltRtV tR# )ÚHotplugRetrySettingsz
in secondsc                ó>   <€ V ^8„  d   Qh/ S[ ;R&   S[;R&   S[;R&   # )r=   Úforce_retryÚsleep_periodÚsleep_total)r¤   rš   )rA   rB   s   "€r-   rC   Ú!HotplugRetrySettings.__annotate__¿   s,   ø‡ ‚ ñ Ññ ñ Ññ	 ñ
 Ñò r/   r*   N)rO   rP   rQ   rR   rS   r�   rY   rZ   r[   s   @r-   r§   r§   ¿   s   ø‡ € Ù÷ ƒ r/   r§   c            	       ó¨  a € ] tR t^Çt o ]tRtRtRtRt	Rt
Rt]P                  ]P                  ]P                  ]P                   3tRBt^
t^t^t]P.                  ]P2                  ]P4                  ]P6                  ]P8                  0/t]P.                  ]P2                  0/tR]3R]3R/ 3RCRDRERFRGRH3	t Rt!RIt"Rt#]$! R^ ^ 4      t%Rt&^t'RJV 3R lR	 llt(V 3R
 lR lt)R t*V 3R lR lt+V 3R lR lt,R t-R t.RKR lt/]0Pb                  ! RRR7      V 3R lR l4       t2RLR lt3V 3R lR lt4R t5RMR lt6R t7R t8]9R  4       t:]9R! 4       t;R" t<]9R# 4       t=R$ t>]9R% 4       t?R& t@R' tAR( tBR) tCR* tDR+ tER, tFR- tGR. tHR/ tI]9R0 4       tJ]9R1 4       tKR2 tLRNR3 ltMR4 tNV 3R5 lR6 ltOV 3R7 lR8 ltPR9 tQR: tR]SROR; l4       tT]9R< 4       tUR= tVR> tWR? tXV 3R@ ltYRAtZV t[R# )Pr#   zen_US.UTF-8Ú_undefNÚec2_metadataÚnetwork_jsonr�   Fc                ó&   <€ V ^8„  d   QhRS[ RS[/# )r=   ÚdistroÚpaths)r   r   )rA   rB   s   "€r-   rC   ÚDataSource.__annotate__O  s   ø€ ÷ #ñ #©ð #±uñ #r/   c                óÈ  € Wn         W n        W0n        R V n        / V n        R V n        R V n        R V n        R V n        R V n	        R V n
        \        V n        \        V n        \        P                  ! V P                   RV P                   3/ 4      V n        V P"                  '       g   / V n        V'       g(   \$        P&                  ! V P                  4      V n        R # W@n        R # )NÚ
datasource)Úsys_cfgr²   r³   Úuserdatar�   Úuserdata_rawÚ
vendordataÚvendordata2Úvendordata_rawÚvendordata2_rawÚmetadata_addressÚUNSETr°   r¯   r   Úget_cfg_by_pathÚdsnameÚds_cfgr   ÚUserDataProcessorÚud_proc)rK   r·   r²   r³   rÄ   s   &&&&&r-   Ú__init__ÚDataSource.__init__O  s´   € ØŒØŒØŒ
Ø'+ˆŒØ ˆŒØ9=ˆÔØˆŒØˆÔØ"ˆÔØ#ˆÔØ/3ˆÔÜ+0ˆÔÜ!ˆÔä×*Ò*Ø�L‰L˜<¨¯©Ð5°ró
ˆŒð �{�{ˆ{ØˆDŒKçÜ$×6Ò6°t·z±zÓBˆDŽLà"ŽLr/   c                ó$   <€ V ^8„  d   QhRS[ RR/# )r=   Úci_pkl_versionr>   Nr™   )rA   rB   s   "€r-   rC   r´   i  s   ø€ ÷ #?ñ #?©ð #?°ñ #?r/   c                óè  € RRRRRRR\         RRRRR\         R	R
RRRRR\        R
^ ^ 4      /pVP                  4        F$  w  r4\        W4      '       d   K  \	        WV4       K&  	  \        V R4      '       g   \	        V RR 4       \        V R4      '       d)   V P
                  e    \        V P
                  4       R# R# R#   \         d'   p\        P                  RT4       \        4       ThRp?ii ; i)z(Perform deserialization fixes for Paths.Ú_crawled_metadataNÚ_platform_typeÚ_subplatformr¯   Úextra_hotplug_udev_rulesr¾   r°   Úskip_hotplug_detectFr»   r½   Úhotplug_retry_settingsÚcheck_if_fallback_is_allowedc                  ó   € R # ©Fr*   r*   r/   r-   r.   Ú&DataSource._unpickle.<locals>.<lambda>}  s   € Á%r/   r¸   z:Unable to unpickle datasource: %s. Ignoring current cache.)r¿   r§   rv   ÚhasattrÚsetattrr¸   r@   ÚAttributeErrorÚLOGÚdebugrg   )rK   rÈ   Úexpected_attrsr…   rI   Úes   &&    r-   Ú	_unpickleÚDataSource._unpicklei  sø   € ð   Ø˜dØ˜DØœEØ&¨Ø ØœEØ! 5Ø˜4Ø˜tØ$Ô&:¸5À!ÀQÓ&Gð
ˆð )×.Ñ.Ö0‰JˆCÜ˜4×%Ô%Ü˜ 5Ö)ñ 1ô �tÐ;×<Ò<Ü�DÐ8¹-ÔHÜ�4˜×$Ò$¨¯©Ò)Bð?Ü�D—M‘MÖ"ñ *CÑ$øô "ô ?Ü—	‘	ð/àôô
 6Ó7¸QÐ>ûð?ús   Â%C  Ã C1Ã!C,Ã,C1c                ó.   € \         P                  ! V 4      # rG   )r   Úobj_namerJ   s   &r-   rL   ÚDataSource.__str__Ž  s   € Ü×"Ò" 4Ó(Ð(r/   c                ó    <€ V ^8„  d   QhRS[ /# r<   ©r¤   )rA   rB   s   "€r-   rC   r´   ‘  s   ø€ ÷ ñ ™4ñ r/   c                ó   € R# )z#Check if running on this datasourceTr*   rJ   s   &r-   Ú	ds_detectÚDataSource.ds_detect‘  ó   € ár/   c                ó    <€ V ^8„  d   QhRS[ /# r<   rá   )rA   rB   s   "€r-   rC   r´   •  s   ø€ ÷ ñ ¡Dñ r/   c                ó(  € V P                   P                  4       \        4       P                  4       8X  d   \        P	                  RV 4       R# V P
                  P                  R. 4      V P                   .8X  d   \        P	                  RV 4       R# R# )a  Override if either:
- only a single datasource defined (nothing to fall back to)
- command line argument is used (ci.ds=OpenStack)

Note: get_cmdline() is required for the general case - when ds-identify
does not run, _something_ needs to detect the kernel command line
definition.
z6Kernel command line set to use a single datasource %s.TÚdatasource_listz2Datasource list set to use a single datasource %s.F)rÁ   rw   Úparse_cmdliner×   rØ   r·   r‹   rJ   s   &r-   Úoverride_ds_detectÚDataSource.override_ds_detect•  st   € ð �;‰;×ÑÓ¤-£/×"7Ñ"7Ó"9Ô9Ü�I‰IØHØôñ Ø�\‰\×ÑÐ/°Ó4¸¿¹¸ÔEÜ�I‰IØDÀdôñ Ùr/   c                óö   € V P                  4       '       d   V P                  4       # V P                  4       '       d'   \        P	                  RV 4       V P                  4       # \        P	                  RV 4       R# )z&Overrides runtime datasource detectionzDetected %szDid not detect %sF)rê   Ú	_get_datarã   r×   rØ   rJ   s   &r-   Ú_check_and_get_dataÚDataSource._check_and_get_data«  s^   € à×"Ñ"×$Ò$Ø—>‘>Ó#Ð#Ø�^‰^×ÒÜ�I‰IØØôð —>‘>Ó#Ð#ä�I‰IÐ)¨4Ô0Ùr/   c                ó�  € V P                  4       P                  pV P                  4       pV P                  pVR,          pR/ RR.bRVbRVbR\	        V P
                  V P                  V P                  4      bRV P
                  bR	V P
                  bR
VR,          ^ ,          bRVR,          ^,          bRVR,          ^,          bRV P                  bRV P                  4       bRVR,          bRVbRVbRVR,          ^,          bRVbRVbRVR,          ^,          RV P                  RV P                  RVR,          RVR,          /C/# )z2Return a dictionary of standardized metadata keys.Úsys_infoÚv1Ú
_beta_keysÚsubplatformúavailability-zoneÚavailability_zoneÚcloud_idr$   Ú
cloud_namer²   ÚdistÚdistro_versionÚdistro_releaseÚplatformÚpublic_ssh_keysÚpython_versionÚpythonúinstance-idÚinstance_idÚkernel_releaseÚunameúlocal-hostnameÚlocal_hostnameÚmachineÚregionÚsystem_platformÚvariant)
Úget_hostnamer¢   Úget_instance_idrö   Úcanonical_cloud_idrø   r  Úplatform_typeÚget_public_ssh_keysrô   )rK   Úinstance_datar  r  rö   Úsysinfos   &&    r-   Ú_get_standardized_metadataÚ%DataSource._get_standardized_metadata¹  s´  € à×*Ñ*Ó,×5Ñ5ˆØ×*Ñ*Ó,ˆØ ×2Ñ2Ðð   
Õ+ˆàð Ø˜}˜oðà#Ð%6ðð $Ð%6ðð Ô.Ø—O‘O T§[¡[°$×2DÑ2Dóð	ð ˜dŸo™oðð ˜dŸo™oðð ˜' &�/¨!Õ,ðð ! '¨&¥/°!Õ"4ðð ! '¨&¥/°!Õ"4ðð ˜D×.Ñ.ðð " 4×#;Ñ#;Ó#=ðð ! '¨(Õ"3ðð ˜{ðð  ˜{ð!ð" ! '¨'Õ"2°1Õ"5ð#ð$ ! .ð%ð& ! .ð'ð( ˜7 7Õ+¨AÕ.Ø˜$Ÿ+™+Ø˜t×/Ñ/Ø! 7¨:Õ#6Ø˜7 9Õ-ñ1ð
ð 	
r/   c                óÒ   € V P                   '       g   R# V'       d   TpMV P                  pV F$  w  r4\        W4      '       g   K  \        WV4       K&  	  V'       g
   RV n         R# R# )z¥Reset any cached metadata attributes to datasource defaults.

@param attr_defaults: Optional tuple of (attr, value) pairs to
   set instead of cached_attr_defaults.
NF)Ú_dirty_cacheÚcached_attr_defaultsrÔ   rÕ   )rK   Úattr_defaultsÚattr_valuesÚ	attributerI   s   &&   r-   Úclear_cached_attrsÚDataSource.clear_cached_attrsß  sZ   € ð × × Ð ÙßØ'‰Kà×3Ñ3ˆKã +ÑˆIÜ�t×'Ô'Ü˜¨Ö/ñ !,÷ Ø %ˆDÖñ r/   zGetting metadataÚalways)Úlog_modec                ó    <€ V ^8„  d   QhRS[ /# r<   rá   )rA   rB   s   "€r-   rC   r´   ó  s   ø€ ÷ ñ ™$ñ r/   c                óh   € RV n         V P                  4       pV'       g   V# V P                  4        V# )zˆDatasources implement _get_data to setup metadata and userdata_raw.

Minimally, the datasource should return a boolean True on success.
T)r  rî   Úpersist_instance_data)rK   Úreturn_values   & r-   Úget_dataÚDataSource.get_dataò  s7   € ð !ˆÔØ×/Ñ/Ó1ˆ÷ ØÐØ×"Ñ"Ô$ØÐr/   c                ó   € V'       d^   \         P                  P                  V P                  P                  4      '       d%   \        W P                  P                  R4      4       V P                  eX   \        \        \        P                  ! V P                  4      4      pVP                  RR4       VP                  RR4       RV/pMfRRV P                  //pV P                  \        8w  d   V P                  VR,          R&   V P                   \        8w  d   V P                   VR,          R&   \"        VR,          R	&   \        P                  ! V P$                  4      VR
&   RVR
,          R	&   \        P                  ! VR
,          4      VR&   RVR,          R	&   \&        P(                  ! 4       VR&   VP+                  V P-                  V4      4        \.        P0                  ! V4      p\3        \4        P6                  ! V4      V P8                  R7      pT P                  PE                  R4      pTR,          PG                  RR4      p\         P                  PI                  T P                  PJ                  R4      p	\&        PL                  ! T	 RT 2T R24       Rp
T	 RT 2p\         P                  PO                  T	4      '       d    \         P                  PQ                  T	4      p
\&        PR                  ! Y¹RR7       T
'       d   Y«8w  d   \&        PT                  ! T
4       \W        YuRR7       T P                  PE                  R4      p\W        T\Y        T4      4       R#   \:         d+   p\<        P?                  R\A        T4      4        Rp?R# Rp?i\B         d+   p\<        P?                  R\A        T4      4        Rp?R# Rp?ii ; i)a   Process and write INSTANCE_JSON_FILE with all instance metadata.

Replace any hyphens with underscores in key names for use in template
processing.

:param write_cache: boolean set True to persist obj.pkl when
    instance_link exists.

@return True on successful write, False otherwise.
Úobj_pklNú	user-dataúvendor-datar7   Ú	meta_datar°   r¯   Ú_docÚ
merged_cfgz<DEPRECATED: Use merged_system_cfg. Will be dropped from 24.1Úmerged_system_cfgzUMerged cloud-init system config from /etc/cloud/cloud.cfg and /etc/cloud/cloud.cfg.d/rñ   )rs   z'Error persisting instance-data.json: %sFÚinstance_data_sensitiverò   r÷   Únonezcloud-idÚ-Ú
T)Úforcei€  )Úmoder  )-Úosr�   Úlexistsr³   Úinstance_linkÚ	pkl_storeÚget_ipath_currÊ   r   r|   rt   ru   r   r�   r°   r¿   r¯   ÚEXPERIMENTAL_TEXTr·   r   Úsystem_infoÚupdater  r   Ú
json_dumpsr}   ÚjsonÚloadsÚsensitive_metadata_keysÚ	TypeErrorr×   Úwarningr@   ÚUnicodeDecodeErrorÚget_runpathr‹   ÚjoinÚrun_dirÚ
write_fileÚexistsÚrealpathÚsym_linkÚdel_filer   r‘   )rK   Úwrite_cacheÚcrawled_metadatar  ÚcontentÚprocessed_datarÚ   Újson_sensitive_filer÷   Úcloud_id_fileÚprev_cloud_id_fileÚnew_cloud_id_fileÚ	json_files   &&           r-   r  Ú DataSource.persist_instance_data  s	  € ÷ œ2Ÿ7™7Ÿ?™?¨4¯:©:×+CÑ+C×DÒDÜ�dŸJ™J×4Ñ4°YÓ?Ô@Ø×!Ñ!Ò-ô  $Ü”d—m’m D×$:Ñ$:Ó;ó Ðð × Ñ  ¨dÔ3Ø× Ñ  °Ô5Ø!Ð#3Ð4‰Mà! K°·±Ð#?Ð@ˆMØ× Ñ ¤EÔ)Ø6:×6GÑ6G�˜dÕ# NÑ3Ø× Ñ ¤EÔ)Ø6:×6GÑ6G�˜dÕ# NÑ3Ü&7ˆ�dÕ˜FÑ#ä&*§m¢m°D·L±LÓ&Aˆ�lÑ#ð Kð 	�lÕ#Øñ	
ô .2¯]ª]Ø˜,Õ'ó.
ˆÐ)Ñ*ð'ð 	Ð)Õ*¨6Ñ2ô %)×$4Ò$4Ó$6ˆ�jÑ!Ø×Ñ˜T×<Ñ<¸]ÓKÔLð	ä#×.Ò.¨}Ó=ˆGä6Ü—
’
˜7Ó#Ø#×;Ñ;ôˆNð #Ÿj™j×4Ñ4Ð5NÓOÐØ  Õ&×*Ñ*¨:°vÓ>ˆÜŸ™Ÿ™ T§Z¡Z×%7Ñ%7¸ÓDˆÜ�Š˜=˜/¨¨8¨*Ð5¸(¸À2°ÔGà!ÐØ,˜o¨Q¨x¨jÐ9Ðä�7‰7�>‰>˜-×(Ò(Ü!#§¡×!1Ñ!1°-Ó!@Ðä�ŠÐ'¸dÕCßÐ"4Ô"IÜ�MŠMÐ,Ô-ÜÐ&¸UÕCØ—J‘J×*Ñ*¨?Ó;ˆ	ä�9Ô3°NÓCÔDÙøô1 ô 	Ü�K‰KÐAÄ3ÀqÃ6ÔJÝûÜ!ô 	Ü�K‰KÐAÄ3ÀqÃ6ÔJÝûð	ús+   ÇAM% Í%OÍ0NÎOÎ"OÎ#OÏOc                ó    <€ V ^8„  d   QhRS[ /# r<   rá   )rA   rB   s   "€r-   rC   r´   [  s   ø€ ÷ 
ñ 
™4ñ 
r/   c                ó   € \        R4      h)z@Walk metadata sources, process crawled data and save attributes.zlSubclasses of DataSource must implement _get_data which sets self.metadata, vendordata_raw and userdata_raw.)ÚNotImplementedErrorrJ   s   &r-   rí   ÚDataSource._get_data[  s   € ä!ðDó
ð 	
r/   c           	     óf  € V P                   p \        V P                  P                  RV P                   4      4      pV P                  p \        ^ \        V P                  P                  RV P                  4      4      4      pV P                  p \        V P                  P                  RV P                  4      4      pV P                  p \        V P                  P                  RV P                  4      4      p\        WW44      #   \         d;    \
        P                  ! \        RT P                  P                  R4      T4        ELi ; i  \         dG    T P                  p\
        P                  ! \        RT P                  P                  R4      T4        ELi ; i  \         d;    \
        P                  ! \        RT P                  P                  R4      T4        EL(i ; i  \         d;    \
        P                  ! \        RT P                  P                  R4      T4        EL4i ; i)	zÎReturn the Datasource's preferred url_read parameters.

Subclasses may override url_max_wait, url_timeout, url_retries.

@return: A URLParams object with max_wait_seconds, timeout_seconds,
    num_retries.
Úmax_waitz6Config max_wait '%s' is not an int, using default '%s'Útimeoutz5Config timeout '%s' is not an int, using default '%s'Úretriesz5Config retries '%s' is not an int, using default '%s'r˜   zAConfig sec_between_retries '%s' is not an int, using default '%s')Úurl_max_waitrš   rÂ   r‹   Ú
ValueErrorr   Úlogexcr×   Úurl_timeoutÚmaxÚurl_retriesÚ	ExceptionÚurl_sec_between_retriesr“   )rK   rW  rX  rY  r˜   s   &    r-   Úget_url_paramsÚDataSource.get_url_paramsb  sÈ  € ð ×$Ñ$ˆð	Ü˜4Ÿ;™;Ÿ?™?¨:°t×7HÑ7HÓIÓJˆHð ×"Ñ"ˆð		Ü˜!œS §¡§¡°¸D×<LÑ<LÓ!MÓNÓOˆGð ×"Ñ"ˆð	Ü˜$Ÿ+™+Ÿ/™/¨)°T×5EÑ5EÓFÓGˆGð #×:Ñ:Ðð	Ü"%Ø—‘—‘Ø)¨4×+GÑ+Góó#Ðô ˜¨GÓIÐIøô_ ô 	Ü�KŠKÜØHØ—‘—‘ 
Ó+Ø÷	ð	ûô ô 	Ø×&Ñ&ˆGÜ�KŠKÜØGØ—‘—‘ 	Ó*Ø÷	ð	ûô ô 	Ü�KŠKÜØGØ—‘—‘ 	Ó*Ø÷	ð	ûô ô 	Ü�KŠKÜð&à—‘—‘Ð 5Ó6Ø#÷ð	úsK   Ž/D Á
9E Â/F# Ã/G+ ÄAEÅEÅAF ÆF Æ#AG(Ç'G(Ç+AH0È/H0c                óØ   € V P                   f/   V P                  P                  V P                  4       4      V n         V'       d   V P	                  V P                   4      # V P                   # rG   )r¸   rÄ   ÚprocessÚget_userdata_rawÚ_filter_xdata)rK   Úapply_filters   &&r-   Úget_userdataÚDataSource.get_userdataž  sM   € Ø�=‰=Ò Ø ŸL™L×0Ñ0°×1FÑ1FÓ1HÓIˆDŒMßØ×%Ñ% d§m¡mÓ4Ð4Ø�}‰}Ðr/   c                ó’   € V P                   f/   V P                  P                  V P                  4       4      V n         V P                   # rG   )rº   rÄ   re  Úget_vendordata_rawrJ   s   &r-   Úget_vendordataÚDataSource.get_vendordata¥  s5   € Ø�?‰?Ò"Ø"Ÿl™l×2Ñ2°4×3JÑ3JÓ3LÓMˆDŒOØ�‰Ðr/   c                ó’   € V P                   f/   V P                  P                  V P                  4       4      V n         V P                   # rG   )r»   rÄ   re  Úget_vendordata2_rawrJ   s   &r-   Úget_vendordata2ÚDataSource.get_vendordata2ª  s:   € Ø×ÑÒ#Ø#Ÿ|™|×3Ñ3°D×4LÑ4LÓ4NÓOˆDÔØ×ÑÐr/   c                ó|   € V P                   '       g    V P                  P                  4       V n         V P                   # rG   )rË   rÁ   rw   rJ   s   &r-   r  ÚDataSource.platform_type¯  s/   € à×"×"Ð"Ø"&§+¡+×"3Ñ"3Ó"5ˆDÔØ×"Ñ"Ð"r/   c                óh   € V P                   '       g   V P                  4       V n         V P                   # )a}  Return a string representing subplatform details for the datasource.

This should be guidance for where the metadata is sourced.
Examples of this on different clouds:
    ec2:       metadata (http://169.254.169.254)
    openstack: configdrive (/dev/path)
    openstack: metadata (http://169.254.169.254)
    nocloud:   seed-dir (/seed/dir/path)
    lxd:   nocloud (/seed/dir/path)
)rÌ   Ú_get_subplatformrJ   s   &r-   rô   ÚDataSource.subplatformµ  s-   € ð × × Ð Ø $× 5Ñ 5Ó 7ˆDÔØ× Ñ Ð r/   c                óR   € V P                   '       d   RV P                    R2# \        # )z?Subclasses should implement to return a "slug (detail)" string.z
metadata (Ú))r¾   ÚMETADATA_UNKNOWNrJ   s   &r-   rv  ÚDataSource._get_subplatformÅ  s*   € à× × Ð Ø × 5Ñ 5Ð6°aÐ8Ð8ÜÐr/   c                ó^  € V P                   '       d   V P                   # V P                  '       dÐ   V P                  P                  \        4      '       d«   V P                  P                  \        4      p\	        V\
        4      '       d"   VP                  4       V n         V P                   # V P                  4       P                  4       V n         \        P                  R\        \        V4      4        V P                   # V P                  4       P                  4       V n         V P                   # )z‰Return lowercase cloud name as determined by the datasource.

Datasource can determine or define its own cloud product name in
metadata.
z5Ignoring metadata provided key %s: non-string type %s)Ú_cloud_namer�   r‹   ÚMETADATA_CLOUD_NAME_KEYry   r@   rw   Ú_get_cloud_namer×   rØ   Útype)rK   rø   s   & r-   rø   ÚDataSource.cloud_nameË  sç   € ð ××ÐØ×#Ñ#Ð#Ø�=�=ˆ=˜TŸ]™]×.Ñ.Ô/F×GÒGØŸ™×*Ñ*Ô+BÓCˆJÜ˜*¤c×*Ò*Ø#-×#3Ñ#3Ó#5�Ô ð ×ÑÐð $(×#7Ñ#7Ó#9×#?Ñ#?Ó#A�Ô Ü—	‘	ØKÜ+Ü˜Ó$õð ×ÑÐð  $×3Ñ3Ó5×;Ñ;Ó=ˆDÔØ×ÑÐr/   c                ó   € V P                   # )z¢Return the datasource name as it frequently matches cloud name.

Should be overridden in subclasses which can run on multiple
cloud names, such as DatasourceEc2.
)rÁ   rJ   s   &r-   r  ÚDataSource._get_cloud_nameã  s   € ð �{‰{Ðr/   c                óv   € V P                   '       g   R # RV P                   9   d   V P                   R,          # R # )Nzlaunch-index)r�   rJ   s   &r-   r   ÚDataSource.launch_indexë  s,   € à�}�}ˆ}ÙØ˜TŸ]™]Ô*Ø—=‘= Õ0Ð0Ùr/   c                ó¨   € \         P                  ! \        P                  ! V P                   4      4      .pTpV F  pVP	                  V4      pK  	  V# rG   )r   ÚFilterr   Úsafe_intÚapply)rK   Úprocessed_udÚfiltersÚnew_udÚfs   &&   r-   rg  ÚDataSource._filter_xdataó  sI   € ä×Ò¤§¢¨d×.?Ñ.?Ó @ÓAð
ˆð ˆÛˆAØ—W‘W˜V“_ŠFñ àˆr/   c                ó   € V P                   # rG   )r¹   rJ   s   &r-   rf  ÚDataSource.get_userdata_rawü  s   € Ø× Ñ Ð r/   c                ó   € V P                   # rG   )r¼   rJ   s   &r-   rl  ÚDataSource.get_vendordata_rawÿ  s   € Ø×"Ñ"Ð"r/   c                ó   € V P                   # rG   )r½   rJ   s   &r-   rp  ÚDataSource.get_vendordata2_raw  s   € Ø×#Ñ#Ð#r/   c                ó   € / # rG   r*   rJ   s   &r-   Úget_config_objÚDataSource.get_config_obj  s   € Øˆ	r/   c                óJ   € \        V P                  P                  R 4      4      # )zpublic-keys)Únormalize_pubkey_datar�   r‹   rJ   s   &r-   r  ÚDataSource.get_public_ssh_keys  s   € Ü$ T§]¡]×%6Ñ%6°}Ó%EÓFÐFr/   c                ó   € R# )a  Publish the public SSH host keys (found in /etc/ssh/*.pub).

@param hostkeys: List of host key tuples (key_type, key_value),
    where key_type is the first field in the public key file
    (e.g. 'ssh-rsa') and key_value is the key itself
    (e.g. 'AAAAB3NzaC1y...').
Nr*   )rK   Úhostkeyss   &&r-   Úpublish_host_keysÚDataSource.publish_host_keys  s   ‚ r/   c                ó  € R R/pVP                  4        Fg  w  r4VP                  V4      '       g   K  V FC  pRV: V\        V4      R : 2p\        P                  P                  V4      '       g   K?  Vu u # 	  Ki  	  R# )Úsdz/dev/N)ÚvdÚxvdÚvtb)rv   rz   Úlenr1  r�   rD  )rK   Ú
short_nameÚmappingsÚnfromÚtlistÚntoÚcands   &&     r-   Ú_remap_deviceÚDataSource._remap_device  sr   € ð Ð.Ð/ˆØ$ŸN™NÖ,‰LˆEØ×(Ñ(¨×/Ò/ÙÛ‘Ú&)¨:´c¸%³j°lÒ+CÐD�Ü—7‘7—>‘> $×'Ô'Ø”Kó ñ -ñ r/   c                ó   € R # rG   r*   )rK   Ú_names   &&r-   Údevice_name_to_deviceÚ DataSource.device_name_to_device'  s   € ñ r/   c                óx   € V P                   p V P                  P                  4       pV#   \         d     T# i ; i)z<Default locale is en_US.UTF-8, but allow distros to override)Údefault_localer²   Ú
get_localerT  )rK   Úlocales   & r-   r³  ÚDataSource.get_locale/  sD   € à×$Ñ$ˆð	Ø—[‘[×+Ñ+Ó-ˆFð ˆøô #ô 	ØØˆð	ús   Ž* ª9¸9c                óÖ   € V P                   P                  R V P                   P                  R4      4      pV'       d   V# V P                   P                  R/ 4      P                  R 4      # )rõ   rö   Ú	placement©r�   r‹   )rK   Útop_level_azs   & r-   rö   ÚDataSource.availability_zone8  sY   € à—}‘}×(Ñ(Ø §¡×!2Ñ!2Ð3FÓ!Gó
ˆ÷ ØÐØ�}‰}× Ñ  ¨bÓ1×5Ñ5Ð6IÓJÐJr/   c                ó8   € V P                   P                  R 4      # )r  r¸  rJ   s   &r-   r  ÚDataSource.regionA  s   € à�}‰}× Ñ  Ó*Ð*r/   c                ó„   € V P                   '       d   R V P                   9  d   R# \        V P                   R ,          4      # )r   ziid-datasource)r�   r@   rJ   s   &r-   r  ÚDataSource.get_instance_idE  s-   € Ø�}�}ˆ} °T·]±]Ô Bá#Ü�4—=‘= Õ/Ó0Ð0r/   c                ó  € RpRpTpRpV P                   '       d"   V P                   P                  R4      '       gÍ   V'       d   \        RV4      # . p\        P                  ! 4       p	V	R8X  d   Rp\        P
                  ! V	4      p
V
'       d2   V
P                  R4      ^ 8”  d   \        V
4      P                  R4      pMçV	'       d2   V	P                  R4      ^ 8”  d   \        V	4      P                  R4      pM®V	'       d   W”.pM¢WT.pMžV P                   R,          p\        P                  ! V4      '       d_   . pV'       d   \        P                  ! V4      pV'       d   \        V4      P                  R4      pM,RVP                  RR	4      ,          .pMVP                  R4      p\        V4      ^8”  d#   V^ ,          p	RP                  VR
,          4      pM	V^ ,          p	V'       d   Wd8w  d
   V	: RV: 2p	\        W—4      # )a  Get hostname or fqdn from the datasource. Look it up if desired.

@param fqdn: Boolean, set True to return hostname with domain.
@param resolve_ip: Boolean, set True to attempt to resolve an ipv4
    address provided in local-hostname meta-data.
@param metadata_only: Boolean, set True to avoid looking up hostname
    if meta-data doesn't have local-hostname present.

@return: a DataSourceHostname NamedTuple
    <hostname or qualified hostname>, <is_default> (str, bool).
    is_default is a bool and
    it's true only if hostname is localhost and was
    returned by util.get_hostname() as a default.
    This is used to differentiate with a user-defined
    localhost hostname.
    Optionally return (None, False) when
    metadata_only is True and local-hostname data is not available.
ÚlocaldomainÚ	localhostFr  NTÚ.zip-%sr-  :é   NN)r�   r‹   r    r   r
  Úget_fqdn_from_hostsÚfindr@   rŒ   r   Úis_ipv4_addressÚgethostbyaddrr{   r¤  rA  )rK   ÚfqdnÚ
resolve_ipÚmetadata_onlyÚ	defdomainÚdefhostÚdomainr£   Útoksr¢   Ú
hosts_fqdnÚlhosts   &&&&        r-   r
  ÚDataSource.get_hostnameK  sš  € ð& "ˆ	ØˆØˆØˆ
à�}�}ˆ} D§M¡M×$5Ñ$5Ð6F×$GÒ$GßÜ)¨$°
Ó;Ð;ð
 ˆDÜ×(Ò(Ó*ˆHØ˜;Ô&à!�
Ü×1Ò1°(Ó;ˆJß˜jŸo™o¨cÓ2°QÔ6Ü˜:“×,Ñ,¨SÓ1‘ß˜hŸm™m¨CÓ0°1Ô4Ü˜8“}×*Ñ*¨3Ó/‘ßØ Ð,‘àÐ+‘ð —M‘MÐ"2Õ3ˆEÜ×"Ò" 5×)Ò)Ø�ßÜ×-Ò-¨eÓ4�DçÜ˜t›9Ÿ?™?¨3Ó/‘Dà# e§m¡m°C¸Ó&=Õ=Ð>‘Dà—{‘{ 3Ó'�äˆt‹9�qŒ=Ø˜A•wˆHØ—X‘X˜d 2�hÓ'‰Fà˜A•wˆHç�FÔ'Û"*ªFÐ3ˆHä! (Ó7Ð7r/   c                ó:   € V P                   P                  V R 7      # ))Údata_source)r²   Úget_package_mirror_inforJ   s   &r-   rÔ  Ú"DataSource.get_package_mirror_info“  s   € Ø�{‰{×2Ñ2¸tÐ2ÓDÐDr/   c                ó0   <€ V ^8„  d   QhRS[ S[,          /# )r=   Úsource_event_types)r   r   )rA   rB   s   "€r-   rC   r´   –  s   ø€ ÷  ñ  ±t¹Iµñ  r/   c                óè   € / pV Fi  pV P                   P                  4        FH  w  ppW59   g   K  VP                  V4      '       g   \        4       W$&   W$,          P	                  V4       KJ  	  Kk  	  V# rG   )Úsupported_update_eventsrv   r‹   ÚsetÚadd)rK   r×  Úsupported_eventsÚeventÚupdate_scopeÚupdate_eventss   &&    r-   Úget_supported_eventsÚDataSource.get_supported_events–  sq   € Ø24ÐÛ'ˆEð ×-Ñ-×3Ñ3Ö5ñØØàÖ)Ø+×/Ñ/°×=Ò=Ü9<»Ð(Ñ6Ø$Õ2×6Ñ6°uÖ=ó	 6ñ	 (ð  Ðr/   c                ó6   <€ V ^8„  d   QhRS[ S[,          RS[/# )r=   r×  r>   )r   r   r¤   )rA   rB   s   "€r-   rC   r´   £  s!   ø€ ÷ $ñ $Ù"&¡y¥/ð$á	ñ$r/   c                ó   € V P                  V4      pVP                  4        Fm  w  r4\        P                  RVP                  RP                  V Uu. uF  qUP                  NK  	  up4      4       V P                  RV,          \        334       Ko  	  V'       d+   V P                  4        V P                  4       pV'       d   R# \        P                  RT RP                  V Uu. uF  qUP                  NK  	  up4      4       R# u upi u upi )a‘  Refresh cached metadata if the datasource supports this event.

The datasource has a list of supported_update_events which
trigger refreshing all cached metadata as well as refreshing the
network configuration.

@param source_event_types: List of EventTypes which may trigger a
    metadata update.

@return True if the datasource did successfully update cached metadata
    due to source_event_type.
z:Update datasource metadata and %s config due to events: %sú, z
_%s_configTz(Datasource %s not updated for events: %sF)	rà  rv   r×   rØ   rI   rA  r  r¿   r!  )rK   r×  rÜ  ÚscopeÚmatched_eventsrÝ  Úresults   &&     r-   Úupdate_metadata_if_supportedÚ'DataSource.update_metadata_if_supported£  sá   € ð  ×4Ñ4Ð5GÓHÐØ%5×%;Ñ%;Ö%=Ñ!ˆEÜ�I‰IØLØ—‘Ø—	‘	±NÓC±N¨5Ÿ;œ;±NÑCÓDôð ×#Ñ# l°UÕ&:¼EÐ%BÐ$DÖEñ &>÷ Ø×#Ñ#Ô%Ø—]‘]“_ˆFßÙÜ�	‰	Ø6ØØ�I‰IÑ0BÓCÑ0B u—{”{Ñ0BÑCÓDô	
ñ
 ùò! Dùò Ds   ÁDÃ%Dc                ó   € R # rÒ   r*   )rK   r·   s   &&r-   Úcheck_instance_idÚDataSource.check_instance_idÉ  s   € ár/   c                ó   € R# )zñcheck_if_fallback_is_allowed()
Checks if a cached ds is allowed to be restored when no valid ds is
found in local mode by checking instance-id and searching valid data
through ds list.

@return True if a ds allows fallback, False otherwise.
Fr*   rJ   s   &r-   rÐ   Ú'DataSource.check_if_fallback_is_allowedÍ  s   € ñ r/   c                ó�   € Vf   \         pVf   \        pV  F+  pVf   K	  W29   d   Vu # \        P                  RW14       Vu # 	  V# )Nz%invalid dsmode '%s', using default=%s)ÚDSMODE_NETWORKÚVALID_DSMODESr×   r>  )Ú
candidatesÚdefaultÚvalidÚ	candidates   &&& r-   Ú_determine_dsmodeÚDataSource._determine_dsmode×  sV   € ð Š?Ü$ˆGàŠ=Ü!ˆEã#ˆIØÒ ÙØÔ!Ø Ò ä—‘Ø;¸Yôð ’ñ $ð ˆr/   c                ó   € R # rG   r*   rJ   s   &r-   Únetwork_configÚDataSource.network_configí  rå   r/   c                ó   € R# )a   setup(is_new_instance)

This is called before user-data and vendor-data have been processed.

Unless the datasource has set mode to 'local', then networking
per 'fallback' or per 'network_config' will have been written and
brought up the OS at this point.
Nr*   )rK   Úis_new_instances   &&r-   ÚsetupÚDataSource.setupñ  s   € ñ 	r/   c                ó   € R# )až  activate(cfg, is_new_instance)

This is called before the init_modules will be called but after
the user-data and vendor-data have been fully processed.

The cfg is fully up to date config, it contains a merged view of
   system config, datasource config, user config, vendor config.
It should be used rather than the sys_cfg passed to __init__.

is_new_instance is a boolean indicating if this is a new instance.
Nr*   )rK   Úcfgrü  s   &&&r-   ÚactivateÚDataSource.activateü  s   € ñ 	r/   c                ó   € R# )z‹
Called when the user issues 'cloud-init clean -c datasource'
command.
Individual data sources should implement their own cleanup handler.
Nr*   rJ   s   &r-   ÚcleanÚDataSource.clean
  s   € ñ 	r/   c                óú   <€ V ^8„  d   Qh/ S[ S[,          ;R&   S[ S[S[S[3,          ,          ;R&   S[S[R3,          ;R&   S[S[S[S[3,          R3,          ;R&   S[S[R3,          ;R&   S[ S[,          ;R&   # )r=   r}  rÊ   .Únetwork_config_sourcesr  r<  rÍ   )r	   r@   r   r   r
   r5   r   )rA   rB   s   "€r-   rC   r´   Ç   sš   ø‡ ‚ ñ ™#•Ñ%ñ ñ(  ¡¡d©C iÕ 0Õ1Ñ8ñ) ñ6 "Ñ"5°sÐ":Õ;ñ ñ7 ñp  ¡¡c©3 h¥°Ð 4Õ5ñ 
ñq ñP #¡3¨ 8�_ñ ñQ ñH '¡s�mÑ2òI r/   )r}  r  rË   rÌ   r²   rÂ   r¯   r�   r¾   r°   r³   r·   rÄ   r¸   r¹   rº   r»   r½   r¼   rŠ   )r¸   N)r¹   N)rº   N)r¼   N)r»   N)r½   N)
Úcombined_cloud_configr)  r*  zsecurity-credentialsr¸   r%  r   rº   r&  zds/vendor_datarG   )r*   ©TrÒ   )FFF)NN)\rO   rP   rQ   rR   rð  Údsmoder²  rÁ   r}  rË   rÌ   rÊ   r5   rT   rX   rV   rU   r  rZ  r]  r_  ra  r   r"   r   ÚBOOT_NEW_INSTANCEÚBOOTÚBOOT_LEGACYÚHOTPLUGrÙ  Údefault_update_eventsr¿   r  r  r<  rÎ   r§   rÏ   rÍ   Ú_ci_pkl_versionrÅ   rÛ   rL   rã   rê   rî   r  r  r   Útimedr!  r  rí   rb  ri  rm  rq  Úpropertyr  rô   rv  rø   r  r   rg  rf  rl  rp  r–  r  r�  r«  r¯  r³  rö   r  r  r
  rÔ  rà  rè  rë  rÐ   Ústaticmethodrö  rù  rý  r  r  r�   rY   rZ   r[   s   @r-   r#   r#   Ç   sé  ø‡ € à€FØ"€Nð €Fð "&€Kð €Nð
 €Là48Ðð 	×$Ñ$Ø×%Ñ%Ø×&Ñ&Ø×Ñð	?Ðð €LØ€KØ€KØÐð@ 	×ÑØ×'Ñ'Ø�N‰NØ×!Ñ!Ø×Ñð	
ðÐð 	×ÑØ×'Ñ'ð
ðÐð 
˜ÐØ	˜ÐØ	�RÐØØØØ ØØ!ð
9Ðð €Lð0Ðð"  Ðñ 2°%¸¸AÓ>Ðð /3Ðà€O÷#ò #÷4#?ð #?òJ)÷ð ÷ð ò,ò$
ôL&ð& ×ÒÐ)°HÔ=÷ó >ðô$T÷l
ð 
ò:Jôxòò
 ð
 ñ#ó ð#ð
 ñ!ó ð!ò ð ñ ó ð ò.ð ñó ðòò!ò#ò$òòGòòò òð ñKó ðKð ñ+ó ð+ò1ôF8òPE÷ ð  ÷$ð $òLòð óó ðð* ñó ðò	òò÷G ƒ r/   )Ú	metaclassc                 óÐ  € V '       g   . # \        V \        4      '       d   V P                  4       # \        V \        \        34      '       d   \        V 4      # \        V \
        4      '       dy   . pV P                  4        F`  w  r#\        V\        4      '       d   V.p\        V\        \        34      '       g   K<  V F  pV'       g   K  VP                  V4       K   	  Kb  	  V# . # rG   )ry   r@   Ú
splitlinesÚlistrÚ  r|   rv   rx   )Úpubkey_dataÚkeysÚ_keynameÚklistÚpkeys   &    r-   r™  r™    s¹   € çØˆ	ä�+œs×#Ò#Ø×%Ñ%Ó'Ð'ä�+¤¤c˜{×+Ò+Ü�KÓ Ð ä�+¤×&Ò&ØˆØ*×0Ñ0Ö2‰OˆHô ˜%¤×%Ò%Ø˜�Ü˜%¤$¬ ×-Ô-Û!�D÷ ‘tØŸ™ DÖ)ó	 "ñ  3ð ˆØ€Ir/   c                óF   € V ^8„  d   QhR\         \        \        3,          /# r<   )r
   r#   r@   )rA   s   "r-   rC   rC   0  s   € ÷ +ñ +ä
Œ:”sˆ?Õñ+r/   c           	      óJ  € \        WCV4      pV Uu. uF  p\        P                  ! V4      NK  	  p	p\        V9   d   R MRp
\        P                  RW©4       \        W—4       FÓ  w  r¼\        P                  ! RVP                  RR4      ,          RV
: RV: 2RV
: R	V: 2VR
7      p T;_uu_ 4        \        P                  RV4       V! WV4      pVP                  \        P                  .4      '       d4   RV
: RV: 2Vn        V\        P                  ! V4      3uuRRR4       u #  RRR4       KÕ  	  RRP#                  V	4      ,          p\%        V4      hu upi   + '       g   i     EK  ; i  \         d"    \        P                   ! \        RT4        EK?  i ; i)Únetworkr   z#Searching for %s data source in: %sz	search-%sr#   rq   zsearching for z data from zno z data found from )ÚnameÚdescriptionÚmessageÚparentz%Seeing if we can get any data from %szfound NzGetting data from %s failedz4Did not find any data source, searched classes: (%s)rä  )Úlist_sourcesr   rÞ   ÚDEP_NETWORKr×   rØ   Úzipr   ÚReportEventStackr{   rè  r   r  r"  r`  r   r\  rA  rj   )r·   r²   r³   Úds_depsÚcfg_listÚpkg_listÚreporterÚds_listr�  Úds_namesr0  r   ÚclsÚmyrepÚsÚmsgs   &&&&&&&         r-   Úfind_sourcer2  0  sl  € ô ˜8¨hÓ7€GÙ07Ó8±¨1”
×#Ò# AÖ&±€HÐ8Ü# wÔ.‰9°G€DÜ‡I�IÐ3°TÔDä˜Ö+‰	ˆÜ×'Ò'Ø˜tŸ|™|¨L¸"Ó=Ö=Û;?ÂÑFÛ26ºÐ=Øô	
ˆð
	Aß’Ü—	‘	ÐAÀ3ÔGÙ˜¨Ó/�Ø×1Ñ1Ü×0Ñ0Ð1÷ó ó @DÂTÐ$J�E”MØœz×2Ò2°3Ó7Ð8÷ ”ð÷ ‘ñ ,ð& AÀ4Ç9Á9ØóDõ €Cô & cÓ
*Ð*ùò5 9÷ —‘ûô ô 	AÜ�KŠKœÐ:¸C×@Ð@ð	Aús<   ‘EÂ)
E6Â3A,E!Ä
E6Ä-E6Å!E3Å,E6Å3E6Å6'F"Æ!F"c                ó†  € . p\         P                  RV VV4       V  F   p\        P                  ! V4      p\        P                  ! WRR.4      w  rgV'       g   \         P                  RV4       V FI  p\        P                  ! V4      p	\        V	R4      p
V
! V4      pV'       g   K7  VP                  V4        Kž  	  K¢  	  V# )zØReturn a list of classes that have the same depends as 'depends'
iterate through cfg_list, loading "DataSource*" modules
and calling their "get_datasource_list".
Return an ordered list of classes that match (if any)
zLLooking for data source in: %s, via packages %s that matches dependencies %sÚget_datasource_listzDCould not import %s. Does the DataSource exist and is it importable?)	r×   rØ   r   Ú"match_case_insensitive_module_nameÚfind_moduleÚerrorÚimport_moduleÚgetattrr~   )r)  Údependsr*  Úsrc_listr7   Úds_nameÚm_locsÚ_looked_locsÚm_locÚmodÚlisterÚmatchess   &&&         r-   r$  r$  Q  sÁ   € ð €HÜ‡I�Ið	8àØØôó ˆÜ×=Ò=¸bÓAˆÜ'×3Ò3ØÐ 5Ð6ó 
Ñˆ÷ Ü�I‰Ið$àôó
 ˆEÜ×(Ò(¨Ó/ˆCÜ˜SÐ"7Ó8ˆFÙ˜W“oˆGß‰wØ—‘ Ô(Úó ñ ð$ €Or/   c                ó0   € V ^8„  d   QhR\         R\        /# )r=   Úfieldr>   )r@   r¤   )rA   s   "r-   rC   rC   u  s   € ÷ 4ñ 4Üð4ä	ñ4r/   c                 ó˜   € V '       g   R # \         P                  ! V4      pV'       g   R # V P                  4       VP                  4       8H  # rÒ   )r   Úread_dmi_datarw   )r  rD  Ú	dmi_values   && r-   Úinstance_id_matches_system_uuidrH  u  s;   € ÷
 Ùä×!Ò! %Ó(€IßÙØ×ÑÓ )§/¡/Ó"3Ñ3Ð3r/   c                ó$  € V '       g   \         p V'       g   \         pV\         8X  d   V \         8w  d   V # V# \        P                  4        F4  w  r4Vw  rVVP                  V4      '       g   K"  V! V 4      '       g   K2  Vu # 	  V \         8w  d   V # V# )z@Lookup the canonical cloud-id for a given cloud_name and region.)rz  ÚCLOUD_ID_REGION_PREFIX_MAPrv   rz   )rø   r  rü   ÚprefixÚcloud_id_testr÷   Úvalid_clouds   &&&    r-   r  r  ƒ  s„   € çÜ%ˆ
ßÜ!ˆØÔ!Ô!ØÔ)Ô)ØÐØˆÜ!;×!AÑ!AÖ!CÑˆØ"/ÑˆØ×Ñ˜V×$Ô$©°Z×)@Ô)@ØŠOñ "Dð Ô%Ô%ØÐØ€Or/   c                óZ  € V '       g   R# \        V \        4      '       d   V # \        V \        4      '       d   \        P                  ! V 4      # \        V \
        4      '       d.   VRJ d   \        V P                  R4      RR7      # \        R4      h\        R\        V 4      ,          4      h)a,  data: a loaded object (strings, arrays, dicts).
return something suitable for cloudinit vendordata_raw.

if data is:
   None: return None
   string: return string
   list: return data
         the list is then processed in UserDataProcessor
   dict: return convert_vendordata(data.get('cloud-init'))
NTz
cloud-initF)Úrecursez'vendordata['cloud-init'] cannot be dictz$Unknown data type for vendordata: %s)
ry   r@   r  rt   ru   r|   Úconvert_vendordatar‹   r[  r€  )ÚdatarO  s   &&r-   rP  rP  –  sƒ   € ÷ ÙÜ�$œ×ÒØˆÜ�$œ×ÒÜ�}Š}˜TÓ"Ð"Ü�$œ×ÒØ�d‹?Ü% d§h¡h¨|Ó&<ÀeÔLÐLÜÐBÓCÐCÜ
Ð;¼dÀ4»jÕHÓ
IÐIr/   c                   ó   € ] tR tRtRtR# )ÚBrokenMetadatai®  r*   Nrk   r*   r/   r-   rS  rS  ®  rl   r/   rS  c                 ó|   € . p\        V 4      pV F(  w  rEV\        V4      8X  g   K  VP                  V4       K*  	  V# rG   )rÚ  rx   )r:  r,  Úret_listÚdepsetr.  Údepss   &&    r-   Úlist_from_dependsrX  ¹  s;   € Ø€HÜ�‹\€FÛ‰	ˆØ”S˜“YÖØ�O‰O˜CÖ ñ ð €Or/   c                ó<   € V ^8„  d   QhR\         R\        R\        /# )r=   r�   Úfnamer>   )r#   r@   r¤   )rA   s   "r-   rC   rC   Â  s!   € ÷ ñ ”:ð ¤cð ¬dñ r/   c                ó   €  \         P                  ! V 4      p \        P                  ! YRRR7       R#   \         d!    \        P                  ! \
        RT 4        R# i ; i  \         d!    \        P                  ! \
        RT4        R# i ; i)zSUse pickle to serialize Datasource to a file as a cache.

:return: True on success
zFailed pickling datasource %sFÚwbé   )Úomoder0  z Failed pickling datasource to %sT)ÚpickleÚdumpsr`  r   r\  r×   rC  )r�   rZ  Úpk_contentss   && r-   r4  r4  Â  sx   € ð
Ü—l’l 3Ó'ˆðÜ�Š˜°$¸UÕCñ øô ô Ü�Š”CÐ8¸#Ô>Úðûô
 ô Ü�Š”CÐ;¸UÔCÚðús    ‚4 ™A" ´'AÁAÁ"'BÂBc                óF   € V ^8„  d   QhR\         R\        \        ,          /# )r=   rZ  r>   )r@   r	   r#   )rA   s   "r-   rC   rC   Ô  s   € ÷ ñ ”Cð œH¤ZÕ0ñ r/   c                ó’  € Rp \         P                  ! V 4      pV'       g   R#  \        P                  ! V4      #   \         dF   p\        P                  P                  T 4      '       d   \        P                  RY4        Rp?LlRp?ii ; i  \         d     R# \         d!    \         P                  ! \        RT 4        R# i ; i)zBUse pickle to deserialize a instance Datasource from a cache file.Nzfailed loading pickle in %s: %sz#Failed loading pickled blob from %s)r   Úload_binary_filer`  r1  r�   Úisfiler×   r>  r_  r;  rg   r\  )rZ  Úpickle_contentsrÚ   s   &  r-   Úpkl_loadrg  Ô  sŸ   € à€OðEÜ×/Ò/°Ó6ˆ÷ ÙðÜ�|Š|˜OÓ,Ð,øô ô EÜ�7‰7�>‰>˜%× Ò Ü�K‰KÐ9¸5ÔDÿøðEûô +ô ÚÜô Ü�Š”CÐ>ÀÔFÚðús2   „; ¥B »BÁ;BÂBÂCÂCÂ%CÃCc                ó$   € V ^8„  d   QhR\         /# r<   r?   )rA   s   "r-   rC   rC   é  s   € ÷ 4ñ 4”sñ 4r/   c                 ó>   € \        \        P                  ! 4       4      # )z}Check if command line argument for this datasource was passed
Passing by command line overrides runtime datasource detection
)Úparse_cmdline_or_dmir   Úget_cmdliner*   r/   r-   ré   ré   é  s   € ô  ¤× 0Ò 0Ó 2Ó3Ð3r/   c                ó0   € V ^8„  d   QhR\         R\         /# )r=   Úinputr>   r?   )rA   s   "r-   rC   rC   ð  s   € ÷ ñ ¤ð ¬ñ r/   c                 óÈ  € \         P                  ! R V 4      p\         P                  ! RV 4      p\         P                  ! RV 4      pT;'       g    T;'       g    TpT;'       g    TpV'       dC   VP                  ^4      P                  4       p\        P
                  ! RV RV 2RRV R2R7       V'       d)   VP                  ^4      '       d   VP                  ^4      # R	# )
z(?:^|\s)ds=([^\s;]+)z(?:^|\s)ci\.ds=([^\s;]+)z (?:^|\s)ci\.datasource=([^\s;]+)z8Defining the datasource on the command line using ci.ds=z or ci.datasource=z23.2zUse ds=z instead)Ú
deprecatedÚdeprecated_versionÚextra_messagerq   )ÚreÚsearchÚgroupÚstripr   Ú	deprecate)rm  Ú
ds_parse_0Ú
ds_parse_1Ú
ds_parse_2r7   ro  rÁ   s   &      r-   rj  rj  ð  sÍ   € Ü—’Ð2°EÓ:€JÜ—’Ð6¸Ó>€JÜ—’Ð>ÀÓF€JØ	×	/Ð	/�z×	/Ð	/ Z€BØ×)Ð)˜z€JßØ×!Ñ! !Ó$×*Ñ*Ó,ˆÜ×ÒðØ˜ð !!Ø!' ð*ð  &Ø# F 8¨8Ð4õ	
÷ 
ˆb�h‰h�q�kŠkØ�x‰x˜‹{ÐÙr/   )rq   r*   )zsystem-uuidr	  )WÚabcrt   r:  Úloggingr1  r_  rr  Úenumr   r   Útypingr   r   r   r   r	   r
   r   r   Ú	cloudinitr   r   r   r   r   r   r   r   r   Úcloudinit.atomic_helperr   Úcloudinit.distrosr   Úcloudinit.eventr   r   Úcloudinit.filtersr   Úcloudinit.helpersr   Úcloudinit.persistencer   Úcloudinit.reportingr   ÚDSMODE_DISABLEDÚDSMODE_LOCALrð  ÚDSMODE_PASSrñ  ÚDEP_FILESYSTEMr%  Ú	DS_PREFIXr6  ÚREDACT_SENSITIVE_VALUEr~  r¿   rz  Ú	getLoggerrO   r×   rJ  r5   r]   r`  rg   rj   rn   r}   r‘   r“   r    r§   ÚABCMetar#   r™  r2  r$  rH  r  rP  ÚIOErrorrS  rX  r4  rg  ré   rj  r*   r/   r-   Ú<module>r�     s½  ðó Û Û Û Û 	Û Û 	ß ß L× LÓ L÷
÷ 
õ 
õ /Ý $ß 1Ý *Ý #Ý 6Ý &à€Ø€Ø€Ø€à  ,°Ð?€à€Ø€Ø€	ð<ð ð 6Ð ð 'Ð à€ØÐ à×Ò˜Ó!€ð
 
ˆKÑ-Ð.Ø�	Ñ/Ð0ØˆmÑ3Ð4ðÐ ð ô˜$ó ó ðô ˆtô ôP iô Pô	 )ô 	ôC˜yô Cô ðF 2Hô ô:�
ô ô˜ô ô
˜:ô ôIÐ%°·±õ IòXõ:+òB!÷H4òô&Jô0	�Wô 	òõõ$õ*4÷r/   