+
    �w±i‘_ ã                   óü  € R t ^ 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
HtHtHtHtHt ^ RIHt ^ RIt^ RIHt  ! R R]RR7      t ! R	 R
]RR7      t ! R R]RR7      tRs/ tRt ! R R]4      tR R ltR‡R R lltR R ltR R ltR R lt R R lt!R‡R R llt"R R  lt#R! R" lt$R# R$ lt%R% R& lt&R' R( lt'R) R* lt(R+ R, lt)R- R. lt*R/ R0 lt+R1 R2 lt,R3 R4 lt-R5 R6 lt.RˆR7 R8 llt/R9 R: lt0R; R< lt1R= R> lt2R‰R? R@ llt3RŠRA RB llt4R‹RC RD llt5RE RF lt6RŒRG RH llt7RI RJ lt8RK RL lt9 ! RM RN]4      t:RO RP lt;R�RQ RR llt<R�RS RT llt=RU RV lt>R�RW RX llt?RŽRY RZ llt@R�R[ R\ lltAR‡R] R^ lltBR_ R` ltCRa Rb ltDRc Rd ltERe Rf ltFRg Rh ltGRi Rj ltHRk Rl ltIRm Rn ltJRo Rp ltKRq Rr ltLRs Rt ltMRu Rv ltNRw Rx ltOR�Ry Rz lltPR{ R| ltQR} R~ ltRR R€ ltSR� R‚ ltTRƒ R„ ltUR… R† ltVR# )‘zGHardware and driver package detection functionality for Ubuntu systems.N)ÚOptionalÚDictÚListÚSetÚTupleÚAnyÚ	TypedDict)Ú
cmp_to_key)Úkerneldetectionc                   ó0   a € ] tR t^t o RtV 3R ltRtV tR# )Ú
DriverInfoz2Type definition for individual driver information.c                óJ   <€ V ^8„  d   Qh/ S[ ;R&   S[ ;R&   S[ ;R&   S[ ;R&   # )é   ÚfreeÚbuiltinÚfrom_distroÚrecommended©Úbool)ÚformatÚ__classdict__s   "€Ú6/usr/lib/python3/dist-packages/UbuntuDrivers/detect.pyÚ__annotate__ÚDriverInfo.__annotate__   s7   ø‡ ‚ ñ �Jñ ñ �Mñ	 ñ
 Ññ ñ Ñò ó    © N©Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotate_func__Ú__static_attributes__Ú__classdictcell__©r   s   @r   r   r      s   ø‡ € Ù<÷ ƒ r   r   F)Útotalc                   ó0   a € ] tR t^#t o RtV 3R ltRtV tR# )Ú
DeviceInfoz?Type definition for device information with associated drivers.c                ól   <€ V ^8„  d   Qh/ S[ ;R&   S[ ;R&   S[ ;R&   S[S[ S[3,          ;R&   S[;R&   # )r   ÚmodaliasÚvendorÚmodelÚdriversÚmanual_install)Ústrr   r   r   )r   r   s   "€r   r   ÚDeviceInfo.__annotate__#   sL   ø‡ ‚ ñ �Mñ ñ �Kñ	 ñ
 �Jñ ñ ‘#‘z�/Õ"Ñ"ñ ñ Ñò r   r   Nr   r%   s   @r   r(   r(   #   s   ø‡ € ÙI÷ ƒ r   r(   c                   ó0   a € ] tR t^-t o RtV 3R ltRtV tR# )ÚPackageInfoz<Type definition for driver package information dictionaries.c                ó®   <€ V ^8„  d   Qh/ S[ ;R&   S[ ;R&   S[ ;R&   S[;R&   S[;R&   S[ ;R&   S[ ;R&   S[;R&   S[S[ ,          ;R	&   S[;R
&   S[ ;R&   # )r   r*   ÚsyspathÚpluginr   r   r+   r,   r   ÚsupportÚopen_preferredÚmetapackage)r/   r   r   )r   r   s   "€r   r   ÚPackageInfo.__annotate__-   s’   ø‡ ‚ ñ �Mñ ñ �Lñ	 ñ
 �Kñ ñ �Jñ ñ Ññ ñ �Kñ ñ �Jñ ñ Ññ ñ ‘c�]Ññ ñ Ññ ñ Ñò r   r   Nr   r%   s   @r   r2   r2   -   s   ø‡ € ÙF÷ ƒ r   r2   Ú z/etc/custom_supported_gpus.jsonc                   ó¢   a € ] tR t^Bt o RtV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR	 ltV 3R
 lR lt	V 3R lR lt
V 3R lR ltRtV tR# )ÚNvidiaPkgNameInfoz%Class to process NVIDIA package namesc                ó$   <€ V ^8„  d   QhRS[ RR/# )r   Úpkg_nameÚreturnN©r/   )r   r   s   "€r   r   ÚNvidiaPkgNameInfo.__annotate__E   s   ø€ ÷ +ñ +¡ð +¨ñ +r   c                óœ   € Wn         R V n        R V n        R V n        RV n        RV n        R V n        V P                  V P                   4       R# )Fr:   Néÿÿÿÿ)Ú	_pkg_nameÚ_obsolete_name_schemeÚ_serverÚ_openÚ
_major_verÚ_flavourÚis_validÚ_process_name)Úselfr>   s   &&r   Ú__init__ÚNvidiaPkgNameInfo.__init__E   sD   € Ø!ŒØ%*ˆÔ"ØˆŒØˆŒ
ØˆŒØˆŒØˆŒØ×Ñ˜4Ÿ>™>Ö*r   c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   Únamer?   Nr@   )r   r   s   "€r   r   rA   O   s   ø€ ÷ .!ñ .!¡#ð .!¨$ñ .!r   c                óê  € R V9  d   \         P                  ! RV4       R# \        P                  ! R4      pVP	                  V4      pV'       dJ   RV n        \        VP                  ^4      4      V n        \        V P                  4      V n
        RV n        R# \        P                  ! R4      pVP	                  V4      pV'       d¾   VP                  ^ 4      P                  R4      R
8g  V n        VP                  ^ 4      P                  R4      R
8g  V n        VP                  ^4      : V P                  '       d   RMR: V P                  '       d   RMR: 2V n
        \        VP                  ^4      4      V n        RV n        \        P                  ! R	4      pVP	                  V4      pV'       dÀ   VP                  ^ 4      P                  R4      R
8g  V n        VP                  ^ 4      P                  R4      R
8g  V n        VP                  ^4      : V P                  '       d   RMR: V P                  '       d   RMR: 2V n
        \        VP                  ^4      4      V n        RV n        R# R# )Únvidiaz8NvidiaPkgNameInfo: %s is not an NVIDIA package. SkippingNznvidia-([0-9]+)Túnvidia-driver-([0-9]+)(.*)z-serverz-openr:   z nvidia-headless(.*)-([0-9]+)(.*)rC   )ÚloggingÚdebugÚreÚcompileÚmatchrE   ÚintÚgrouprH   r/   rI   rJ   ÚfindrF   rG   )rL   rP   ÚpatternrX   s   &&  r   rK   ÚNvidiaPkgNameInfo._process_nameO   sß  € Ø˜4ÔÜ�MŠMØJÈDôñ ä—*’*Ð.Ó/ˆØ—‘˜dÓ#ˆ÷ Ø)-ˆDÔ&Ü! %§+¡+¨a£.Ó1ˆDŒOÜ §¡Ó0ˆDŒMØ ˆDŒMÙô —*’*Ð9Ó:ˆØ—‘˜dÓ#ˆçØ Ÿ;™; q›>×.Ñ.¨yÓ9¸RÑ?ˆDŒLØŸ™ Q›×,Ñ,¨WÓ5¸Ñ;ˆDŒJà—‘˜A•Ø!Ÿ\Ÿ\˜\‘	¨rÑ1ØŸ:Ÿ:˜:‘¨2Ñ-ðˆDŒMô
 " %§+¡+¨a£.Ó1ˆDŒOØ ˆDŒMô —*’*Ð?Ó@ˆØ—‘˜dÓ#ˆçØ Ÿ;™; q›>×.Ñ.¨yÓ9¸RÑ?ˆDŒLØŸ™ Q›×,Ñ,¨WÓ5¸Ñ;ˆDŒJà—‘˜A•Ø!Ÿ\Ÿ\˜\‘	¨rÑ1ØŸ:Ÿ:˜:‘¨2Ñ-ðˆDŒMô
 " %§+¡+¨a£.Ó1ˆDŒOØ ˆDŽMñ r   c                ó    <€ V ^8„  d   QhRS[ /# ©r   r?   r   )r   r   s   "€r   r   rA      s   ø€ ÷ *ñ *©$ñ *r   c                ó   € V P                   # ©N)rE   ©rL   s   &r   Úhas_obsolete_name_schemeÚ*NvidiaPkgNameInfo.has_obsolete_name_scheme   s   € Ø×)Ñ)Ð)r   c                ó    <€ V ^8„  d   QhRS[ /# r_   r   )r   r   s   "€r   r   rA   ‚   s   ø€ ÷ ñ ™4ñ r   c                ó   € V P                   # ra   )rF   rb   s   &r   Ú	is_serverÚNvidiaPkgNameInfo.is_server‚   s   € Ø�|‰|Ðr   c                ó    <€ V ^8„  d   QhRS[ /# r_   r   )r   r   s   "€r   r   rA   …   s   ø€ ÷ ñ ™ñ r   c                ó   € V P                   # ra   )rG   rb   s   &r   Úis_openÚNvidiaPkgNameInfo.is_open…   s   € Ø�z‰zÐr   c                ó    <€ V ^8„  d   QhRS[ /# r_   )rY   )r   r   s   "€r   r   rA   ˆ   s   ø€ ÷ ñ ¡3ñ r   c                ó   € V P                   # ra   )rH   rb   s   &r   Úget_major_versionÚ#NvidiaPkgNameInfo.get_major_versionˆ   s   € Ø�‰Ðr   c                ó    <€ V ^8„  d   QhRS[ /# r_   r@   )r   r   s   "€r   r   rA   ‹   s   ø€ ÷ ñ ™Sñ r   c                ó   € V P                   # ra   )rI   rb   s   &r   Úget_flavourÚNvidiaPkgNameInfo.get_flavour‹   s   € Ø�}‰}Ðr   )rI   rH   rE   rG   rD   rF   rJ   N)r   r   r   r    r!   rM   rK   rc   rg   rk   ro   rs   r#   r$   r%   s   @r   r<   r<   B   sO   ø‡ € Ù/÷+ð +÷.!ð .!÷`*ð *÷ð ÷ð ÷ð ÷ö r   r<   c                ó$   € V ^8„  d   QhR\         /# r_   r@   )r   s   "r   r   r   �   s   € ÷ ñ ”cñ r   c                 ó^   € \         '       g   \        P                  ! 4       ^ ,          s \         # )zCache system architecture)Úsystem_architectureÚapt_pkgÚget_architecturesr   r   r   Úget_apt_archrz   �   s$   € ÷ ÓÜ%×7Ò7Ó9¸!Õ<ÐÜÐr   c                óh   € V ^8„  d   QhR\         \        ,          R\        \        \        3,          /# )r   Úsys_pathr?   )r   r/   r   )r   s   "r   r   r   —   s&   € ÷ -ñ -¤¬¥ð -¼¼cÄ3¸h½ñ -r   c                ó:  € / pV '       d   V  R2MRp\         P                  ! V4       EF—  w  r4pRpRV9   d[    \        \         P                  P	                  VR4      4      ;_uu_ 4       pVP                  4       P                  4       pRRR4       M‘RV9   d‹   RV9   d„   \        \         P                  P	                  VR4      4      ;_uu_ 4       p	V	 FC  p
V
P                  R4      '       g   K  V
P                  R	^4      ^,          P                  4       p M	  RRR4       V'       g   EK  \         P                  P	                  VR
4      p\         P                  P	                  VR4      p\         P                  P                  V4      '       d)   \         P                  P                  V4      '       g   EK“  W1V&   EKš  	  V#   + '       g   i     L³; i  \         d$   p\        P                  ! RY84        Rp?EKÚ  Rp?ii ; i  + '       g   i     L÷; i)uÕ   Get modaliases present in the system.

This ignores devices whose drivers are statically built into the kernel, as
you cannot replace them with other driver packages anyway.

Return a modalias â†’ sysfs path map.
z/devicesz/sys/devicesNr*   z0system_modaliases(): Cannot read %s/modalias: %sÚssbÚueventz	MODALIAS=Ú=ÚdriverÚmodule)ÚosÚwalkÚopenÚpathÚjoinÚreadÚstripÚIOErrorrT   rU   Ú
startswithÚsplitÚislink)r|   ÚaliasesÚdevicesr†   ÚdirsÚfilesr*   ÚfÚeÚfdÚlineÚ
driverlinkÚmodlinks   &            r   Úsystem_modaliasesr˜   —   sˆ  € ð €Gß'/��
˜(Ñ#°^€GÜŸWšW W×-Ñˆ�EØˆð ˜ÔðÜœ"Ÿ'™'Ÿ,™, t¨ZÓ8×9Ô9¸QØ Ÿv™v›xŸ~™~Ó/�H÷ :Ð9ð �dŒ]˜x¨5Ô0Ü”b—g‘g—l‘l 4¨Ó2×3Ô3°rÛ�DØ—‘ {×3Ô3Ø#'§:¡:¨c°1Ó#5°aÕ#8×#>Ñ#>Ó#@˜Ùñ ÷ 4÷ Úô —W‘W—\‘\ $¨Ó1ˆ
Ü—'‘'—,‘,˜z¨8Ó4ˆÜ�7‰7�>‰>˜*×%Ò%¬b¯g©g¯n©n¸W×.EÒ.Eâà �ÔñC .ðF €N÷; :×9ûäô Ü—’ØFÈôö ûð	ú÷ 4×3úsG   ¹1GÁ*GÂ	GÃH
Ã0+H
ÇGÇGÇGÇHÇ$HÈHÈ
Hc                ód   € V ^8„  d   QhR\         P                  R\         P                  R\        /# )r   Ú	apt_cacheÚpackager?   ©rx   ÚCacheÚPackager   )r   s   "r   r   r   Ç   s/   € ÷ Eñ E¤w§}¡}ð E¼w¿¹ð EÔSWñ Er   c                 óþ  € R pVP                   P                  R4      '       d&   VP                   P                  RR4      p W,          p\        P                  ! V 4      pVP                  V4      pRp VP                  P                  R4       F+  pV F"  w  r‰p
VP                  R4      '       g   K  Rp K)  	  K-  	  V'       g*   \        P
                  ! R	VP                   ,          4       R#  V R
,          pTP                  T4      pTP                   F!  w  rÍpTP                  R4      '       g   K  TpK#  	  T'       d©   Y,          pTP                   F+  pTP                  P                   TP                   8X  g   K*   R# 	  \        P
                  ! RTP                   T4       \        P
                  ! T: RTP                   Uu. uF  pTP                  NK  	  up: 24       R# R#   \         d"    \        P
                  ! RT,          4        R# i ; i  \        \        3 d$    \        P
                  ! RT,          4       Rp EL‘i ; i  \         d    \        P
                  ! R4        R# i ; iu upi )Núnvidia-driver-zxserver-xorg-video-nvidia-z5Cannot find %s package in the cache. Cannot check ABITFÚDependszxorg-video-abi-z@The %s package seems to have no dependencies. Skipping ABI checkz;Skipping check for %s since it does not depend on video abizxserver-xorg-corez1xserver-xorg-core not available, cannot check ABIzBDriver package %s is incompatible with current X.org server ABI %sz is not in )rP   r‹   ÚreplaceÚKeyErrorrT   rU   rx   ÚDepCacheÚget_candidate_verÚdepends_list_strÚgetÚ	TypeErrorÚprovides_listÚrev_depends_listÚ
parent_pkg)rš   r›   Úxorg_video_abiÚxorg_driver_nameÚdepcacheÚ	candidateÚneeds_video_abiÚdep_listÚdep_nameÚdep_verÚdep_opÚ	xorg_coreÚprovides_nameÚprovides_verÚ	p_versionÚabi_pkgÚdepÚxs   &&                r   Ú_check_video_abi_compatr¼   Ç   s:  € Ø€Nà‡|�|×ÑÐ/×0Ò0Ø"Ÿ<™<×/Ñ/ØÐ:ó
Ðð	ØÕ1ˆGô ×Ò 	Ó*€HØ×*Ñ*¨7Ó3€Ià€Oð Ø!×2Ñ2×6Ñ6°yÖAˆHÛ-5Ñ)� 6Ø×&Ñ&Ð'8×9Ô9Ø&*�OÚó .6ñ B÷ Ü�ŠØIÈGÏLÉLÕXô	
ñ ðØÐ1Õ2ˆ	ð
 ×*Ñ*¨9Ó5€Ià2;×2IÔ2IÑ.ˆ YØ×#Ñ#Ð$5×6Ô6Ø*ŠNñ 3J÷ ØÕ+ˆØ×+Ô+ˆCØ�~‰~×"Ñ" g§l¡lÖ2Úñ ,ô 	�ŠØPØ�L‰LØô	
ô
 	�Šã¨w×/GÒ/GÓHÑ/G¨!˜ŸœÑ/GÓHðJô	
ñ áøôy ô 	Ü�MŠMØGØ#õ%ôò ð	ûô" ”iÐ ô  Ü�ŠØNØõô	
ð  ‹ð ûô  ô Ü�ŠÐIÔJÚðüò. IsB   ÁG, Á3:H Â2H Ã/	I Ç	I:Ç,(HÈHÈ0IÉIÉ!I7É6I7c                óÀ   € V ^8„  d   QhR\         P                  R\        \        \        \
        \        \        \        \        ,          3,          3,          3,          /# ©r   rš   r?   )rx   r�   r   r/   r   r   r   )r   s   "r   r   r     sA   € ÷ ;ñ ;Ü�}‰}ð;ä	Œ#Œu”Sœ$œs¤C¬¥H˜}Õ-Ð-Õ.Ð
.Õ/ñ;r   c                óÚ  € \         P                  ! V 4      p\         P                  ! V 4      p/ pV P                   EFG  p VP	                  V4      pVP                  VP                  ^ ,          4       VR,          pV'       g   KK   TP                  R\        4       39  d   Ki  \        Y4      '       g   K|   TP                  R4       Fµ  pTP                  R4      pT'       g   K  TP                  R4      w  r‰T	P                  R4       Fo  p
T
P                  4       p
T
P                  R^4      ^ ,          pTP                  T/ 4      P                  T
\!        4       4      P#                  TP$                  4       Kq  	  K·  	  EKJ  	  / pVP-                  4        Fp  w  r½\.        P0                  ! R
P3                  VP5                  4        Uu. uF  p\6        P8                  ! V4      NK  	  up4      \.        P:                  4      pWí3WË&   Kr  	  V#   \        \        \        3 d     EKî  i ; i  \&         d.    \(        P*                  ! RTP$                  : R	T: 24        EK)  i ; iu upi )a5  Build a modalias map from an apt_pkg.Cache object.

This filters out uninstallable video drivers (i. e. which depend on a video
ABI that xserver-xorg-core does not provide).

Return a map bus -> modalias -> [package, ...], where "bus" is the prefix of
the modalias up to the first ':' (e. g. "pci" or "usb").
Ú
ModaliasesÚallÚ)ú, Ú(Ú,Ú:zPackage z has invalid modalias header: Ú|)rx   r¤   ÚPackageRecordsÚpackagesr¥   ÚlookupÚ	file_listr£   ÚAttributeErrorÚUnicodeDecodeErrorÚarchitecturerz   r¼   rŒ   r‰   Ú
setdefaultÚsetÚaddrP   Ú
ValueErrorrT   ÚerrorÚitemsrV   rW   r‡   ÚkeysÚfnmatchÚ	translateÚ
IGNORECASE)rš   r®   ÚrecordsÚresultr›   r¯   ÚmÚpartr‚   ÚlstÚaliasÚbusÚresult2Ú	alias_mapÚpats   &              r   Úapt_cache_modalias_maprã     sÿ  € ô ×Ò 	Ó*€HÜ×$Ò$ YÓ/€Gà-/€FØ×%Õ%ˆð	Ø ×2Ñ2°7Ó;ˆIØ�N‰N˜9×.Ñ.¨qÕ1Ô2Ø˜Õ%ˆAßÙð ð ×Ñ¨¬|«~Ð'>Ô>Ùä& y×:Ò:Ùð	ØŸ™ ž�Ø—z‘z $Ó'�ßÙØ"Ÿj™j¨›o‘�Ø ŸY™Y sž^�EØ!ŸK™K›M�EØŸ+™+ c¨1Ó-¨aÕ0�CØ×%Ñ% c¨2Ó.×9Ñ9¸%ÄÃÓG×KÑKØŸ™öó ,ô %ñ) &ðH ;=€GØ Ÿ,™,ž.‰ˆÜ�jŠjØ�H‰H¸	¿¹Ô8HÓIÑ8H°”g×'Ò'¨Ö,Ñ8HÑIÓJÜ�M‰Mó
ˆð Ð'ˆ‹ñ )ð €NøôI œ.Ô*<Ð=ô 	Ûð	ûô. ô 	Ü�M‹MØ@GÇÄÊaÐP÷ð ð	üò Js,   Á AHÂ8C
H-ÇI(ÈH*È)H*È-3I%É$I%c                ó$   € V ^8„  d   QhR\         /# r_   r@   )r   s   "r   r   r   M  s   € ÷ &ñ &¬ñ &r   c                  ó   € \         # ra   )Úcustom_supported_gpus_jsonr   r   r   Úpath_get_custom_supported_gpusrç   M  s   € Ü%Ð%r   c                óF   € V ^8„  d   QhR\         R\        \         ,          /# )r   Údidr?   ©r/   r   )r   s   "r   r   r   Q  s   € ÷ ñ ¬ð ´¼µñ r   c                óB  € \        4       pRp \        VR4      ;_uu_ 4       p \        \        P                  ! V4      R,          4      pV F\  pVR,          V 8X  g   K  VR,          P                  R4      ^ ,          p\        P                  ! RV: RVR	,          : R
V : R24        M	   RRR4       V#   \         d    \        P                  ! R4        L-i ; i  + '       g   i     T# ; i  \         d"    \        P                  ! RT,          4        T# i ; i)zpGet nvidia allowing driver for specific devices.

did: 0x1234
Return the situable nvidia driver version for it.
NÚrÚchipsÚdevidÚbranchÚ.z#Found a specific nv driver version z for rP   rÄ   rÂ   z;package_get_nv_allowing_driver(): unexpected json detected.z3package_get_nv_allowing_driver(): unable to read %s)
rç   r…   ÚlistÚjsonÚloadrŒ   rT   ÚinfoÚ	ExceptionrU   )ré   r†   ÚversionÚstreamÚgpusÚgpus   &     r   Úpackage_get_nv_allowing_driverrú   Q  sü   € ô *Ó+€DØ€GðÜ�$˜�_Œ_ ðÜœDŸIšI fÓ-¨gÕ6Ó7�Û�CØ˜7•| sÖ*Ø"% h¥-×"5Ñ"5°cÓ":¸1Õ"=˜ÜŸ›ã&¨¨F¯¨³Sð:ôñ ò  ÷ ð& €Nøô ô Ü—’ØQôñ ð	ú÷ Ž_ð& €Nûô ô Ü�ŠÐKÈdÕRÔSØØ€Nðúsd   ŽC2 ¢C¤6B7ÁA
B7Â)CÂ*B7Â,CÂ-C2 Â7!CÃCÃCÃCÃC/	Ã)C2 Ã/C2 Ã2(DÄDc                óü   € V ^8„  d   QhR\         P                  R\        R\        \        \        \
        \        \        \        \        \        ,          3,          3,          3,          ,          R\        R,          /# )r   rš   r*   Úmodalias_mapr?   zapt_pkg.Package)	rx   r�   r/   r   r   r   r   r   r   )r   s   "r   r   r   p  s`   € ÷ '(ñ '(Ü�}‰}ð'(äð'(ô œ4¤¤U¬3´´S¼#¼c½(°]Õ0CÐ+CÕ%DÐ DÕEÕFð'(ô 
Ð
Õñ	'(r   c                óL  € \        4       pVf   \        V 4      pVP                  VP                  R^4      ^ ,          R/ 34      w  rE\	        V4      w  rgRp^ p	VR8X  d¢   \        RV,           4      pVec   RV,          p
RV,          pV P                   F@  pVP                  4       P                  R4      ^ ,          V
8X  g   K0  \        V
.4      W[&   ^p	KB  	  Ve&   V	'       g   \        P                  ! RX
,          4       V	'       g   Ve   VP                  V4      '       g   . # V F^  p\        P                  ! VP                  4       VP                  4       4      '       g   K>  W],           F  pVP                  V4       K  	  K`  	  V Uu. uF  qÀV,          NK  	  up# u upi )zWSearch packages which match the given modalias.

Return a list of apt.Package objects.
NrÆ   Ú10DEÚ0xznvidia-driver-%szpci:v000010DEd0000%s*z%s is not in the package pool.)rÐ   rã   r§   rŒ   Ú_get_vendor_model_from_aliasrú   rÉ   Úget_fullnamerT   rU   rX   rÖ   ÚfnmatchcaseÚlowerrÑ   )rš   r*   rü   Úpkgsrâ   Úbus_mapÚvidré   ÚnvamdÚfoundÚnvamdnÚnvamdaÚprÞ   s   &&&           r   Úpackages_for_modaliasr  p  sa  € ô ‹5€DàÒÜ-¨iÓ8ˆà×#Ñ# H§N¡N°3¸Ó$:¸1Õ$=ÀÀb¸zÓJ�L€CÜ+¨HÓ5�H€CØ€EØ€EØ
ˆf„}Ü.¨t°c­zÓ:ˆØÒØ'¨%Õ/ˆFØ,¨sÕ2ˆFØ×'Ô'�Ø—>‘>Ó#×)Ñ)¨#Ó.¨qÕ1°VÖ;Ü&)¨6¨(£m�G‘OØ’Eñ (ð Ò§UÜ�MŠMÐ:¸VÕCÔDçØŠ;˜cŸi™i¨×1Ò1ØˆIãˆÜ×Ò˜xŸ~™~Ó/°·±³×?Ô?Ø—^�^�Ø—‘˜–ó $ñ ñ
 #'Ó'¡$˜Q�a�LˆL¡$Ñ'Ð'ùÒ's   ÆF!c                ód   € V ^8„  d   QhR\         P                  R\         P                  R\        /# ©r   rš   Úpkgr?   rœ   )r   s   "r   r   r   š  s)   € ÷ ñ ¤§¡ð ´G·O±Oð Ìñ r   c                 óö  € \         P                  ! V 4      pVP                  V4      pVf   Q hVP                  P	                  R4      '       d   R# \         P
                  ! V 4      pVP                  VP                  ^ ,          4       VP                  ^ ,          P                   F<  w  rVVP                  '       g    VR,          pVR9  u # VP                  R9   g   K;   R# 	  R#   \         d      R# i ; i)NrR   FÚ	ComponentT)Ú
restrictedÚ
multiverse)rx   r¤   r¥   rP   r‹   rÈ   rÊ   rË   Úversion_listÚ	componentr£   )rš   r  r®   r¯   rÙ   ÚpfileÚ_r  s   &&      r   Ú_is_package_freer  š  sÛ   € Ü×Ò 	Ó*€HØ×*Ñ*¨3Ó/€IØÒ Ð Ð ð ‡x�x×Ñ˜8×$Ò$Ùä×$Ò$ YÓ/€GØ‡N�N�9×&Ñ& qÕ)Ô*à×$Ñ$ QÕ'×1Ô1‰ˆØ��ˆðØ# KÕ0�	Ø Ð(DÑDÒDð �‰Ð">Ö>Úñ 2ñ øô ô Ûðús   Â>C(Ã(C8Ã7C8c                ód   € V ^8„  d   QhR\         P                  R\         P                  R\        /# r  rœ   )r   s   "r   r   r   ·  s)   € ÷ 	ñ 	¤w§}¡}ð 	¼7¿?¹?ð 	Ìtñ 	r   c                 óÐ   € \         P                  ! V 4      pVP                  V4      pVf   R#  VP                  ^ ,          ^ ,          P                  R8H  #   \
         d     R# i ; i)NFÚUbuntu)rx   r¤   r¥   rË   Úoriginr£   )rš   r  r®   r¯   s   &&  r   Ú_is_package_from_distror  ·  sc   € Ü×Ò 	Ó*€HØ×*Ñ*¨3Ó/€IØÒÙðØ×"Ñ" 1Õ% aÕ(×/Ñ/°8Ñ;Ð;øÜô Úðús   ¯&A ÁA%Á$A%c                óz   € V ^8„  d   QhR\         P                  R\         P                  R\        \        ,          /# r  )rx   r�   rž   r   r   )r   s   "r   r   r   Ã  s0   € ÷ ñ Ü�}‰}ðÜ#*§?¡?ðäŒc…]ñr   c                ó   € \         P                  ! V 4      pVP                  V4      p\         P                  ! V 4      pVP	                  VP
                  ^ ,          4        VR,          pTR9  d%   \        P                  ! RTP                  T4       R# T#   \        \        3 d&    \        P                  ! RTP                  4        R# i ; i)z>Determine if -open package is prefered from apt Package objectzPrefer-VariantzM_pkg_get_open_preference %s: package has Prefer-Open header, cannot determineFzb_pkg_get_open_preference %s: package has invalid Prefer-Open %sheader, cannot determine preferenceN)ÚOpenÚClosed©rx   r¤   r¥   rÈ   rÊ   rË   r£   rÌ   rT   rU   rP   )rš   r  r®   r¯   rÙ   Ú
preferences   &&    r   Ú_pkg_get_open_preferencer$  Ã  s½   € ô ×Ò 	Ó*€HØ×*Ñ*¨3Ó/€IÜ×$Ò$ YÓ/€GØ‡N�N�9×&Ñ& qÕ)Ô*ðØÐ-Õ.ˆ
ð Ð+Ô+Ü�Šð2à�H‰HØô		
ñ àÐøô! ”nÐ%ô Ü�ŠØ[Ø�H‰Hô	
ò ðúó   Á!	B Â2CÃCc                óz   € V ^8„  d   QhR\         P                  R\         P                  R\        \        ,          /# r  ©rx   r�   rž   r   r/   )r   s   "r   r   r   á  s.   € ÷ ñ œwŸ}™}ð ´7·?±?ð ÄxÔPSÅ}ñ r   c                óÊ  € \         P                  ! V 4      pVP                  V4      p\         P                  ! V 4      pVP	                  VP
                  ^ ,          4        VR,          pTP                  R4      pT^ 8:  d$   \        P                  ! RTP                  4       R# TRT pT#   \        \        3 d&    \        P                  ! RTP                  4        R# i ; i)z-Determine module name from apt Package objectrÀ   zM_pkg_get_module %s: package has no Modaliases header, cannot determine moduleNrÄ   zR_pkg_get_module %s: package has invalid Modaliases header, cannot determine module)rx   r¤   r¥   rÈ   rÊ   rË   r£   rÌ   rT   rU   rP   r[   )rš   r  r®   r¯   rÙ   rÛ   Úparenr‚   s   &&      r   Ú_pkg_get_moduler*  á  sÊ   € ä×Ò 	Ó*€HØ×*Ñ*¨3Ó/€IÜ×$Ò$ YÓ/€GØ‡N�N�9×&Ñ& qÕ)Ô*ðØ�LÕ!ˆð �F‰F�3‹K€EØ�„zÜ�ŠØ`Ø�H‰Hô	
ñ àˆv�ˆY€FØ€Møô! ”nÐ%ô Ü�ŠØ[Ø�H‰Hô	
ò ðús   Á!	B, Â,2C"Ã!C"c                óz   € V ^8„  d   QhR\         P                  R\         P                  R\        \        ,          /# r  r'  )r   s   "r   r   r   ý  s.   € ÷ ñ ¤§¡ð ´G·O±Oð ÌÔQTÍñ r   c                ó   € \         P                  ! V 4      pVP                  V4      p\         P                  ! V 4      pVP	                  VP
                  ^ ,          4        VR,          pTR9  d%   \        P                  ! RTP                  T4       R# T#   \        \        3 d&    \        P                  ! RTP                  4        R# i ; i)z/Determine support level from apt Package objectÚSupportzR_pkg_get_support %s: package has no Support header, cannot determine support levelNzY_pkg_get_support %s: package has invalid Support %sheader, cannot determine support level)ÚPBÚNFBÚLTSBÚLegacyr"  )rš   r  r®   r¯   rÙ   r6   s   &&    r   Ú_pkg_get_supportr2  ý  s»   € ô ×Ò 	Ó*€HØ×*Ñ*¨3Ó/€IÜ×$Ò$ YÓ/€GØ‡N�N�9×&Ñ& qÕ)Ô*ðØ˜)Õ$ˆð Ð5Ô5Ü�Šð5à�H‰HØô		
ñ à€Nøô! ”nÐ%ô Ü�ŠØ`Ø�H‰Hô	
ò ðúr%  c                ó<   € V ^8„  d   QhR\         R\         R\        /# )r   rÞ   Úverr?   ©r/   r   )r   s   "r   r   r     s!   € ÷ !ñ !¬sð !¼ð !Äñ !r   c           	     ó”  € \         P                  ! RV 4      pV'       g   R# VP                  ^4      pVP                  ^4      pVR8w  d   R# RV,          p\        4       p \	        VR4      ;_uu_ 4       p \        \        P                  ! V4      R,          4      pV F³  pVR,          V8X  g   K  RVR	,          9   g   K#  VR
,          P                  R4      ^ ,          V8w  dG   \        P                  ! RVR
,          P                  R4      ^ ,          : RV: 24        RRR4       R# \        P                  ! RV,          4        RRR4       R# 	  RRR4       R#   \         d    \        P                  ! R4        L-i ; i  + '       g   i     R# ; i  \         d"    \        P                  ! RT,          4        R# i ; i)zAalias: e.g. pci:v000010DEd000024BAsv0000103Csd000089C6bc03sc00i00zpci:v0000(.*)d0000(.*)sv(.*)Frþ   z0x%srì   rí   rî   Ú	runtimepmÚfeaturesrï   rð   z!Candidate version does not match z != NzFound runtimepm supports on %s.Tz?_is_nv_allowing_runtimepm_supported(): unexpected json detectedz8_is_nv_allowing_runtimepm_supported(): unable to read %s)rV   ÚsearchrZ   rç   r…   rñ   rò   ró   rŒ   rT   rU   rô   rõ   )	rÞ   r4  rÚ   r  ré   r†   r÷   rø   rù   s	   &&       r   Ú#_is_nv_allowing_runtimepm_supportedr:    sw  € ä�YŠYÐ5°uÓ=€FßÙØ
�,‰,�q‹/€CØ
�,‰,�q‹/€CØ
ˆf„}ÙØ
�3�,€CÜ)Ó+€DðÜ�$˜�_Œ_ ðÜœDŸIšI fÓ-¨gÕ6Ó7�Û�CØ˜7•| sÖ*¨{¸cÀ*½oÖ/MØ˜x�=×.Ñ.¨sÓ3°AÕ6¸#Ô=Ü#ŸM›Mà#& x¥=×#6Ñ#6°sÓ#;¸A×#>Ð#>Âð!Eôð $)÷ ‰_ô  ŸšÐ%FÈÕ%LÔMØ#÷ ‰_ñ  ÷ ñ* øô ô Ü—’ØUôñ ð	ú÷ Ž_ñ* ûô ô Ü�ŠÐPÐSWÕWÔXØÙðúss   Á!F Á5FÁ76E Â2E ÃA E Ä"F Ä,E Å
F ÅE ÅF Å !FÆFÆFÆFÆF	ÆF ÆF Æ(GÇGc                óp   € V ^8„  d   QhR\         P                  R\         P                  R\        R\        /# )r   rš   r  rÞ   r?   )rx   r�   rž   r/   r   )r   s   "r   r   r   >  s4   € ÷ 
ñ 
Ü�}‰}ð
Ü#*§?¡?ð
Ü;>ð
ä	ñ
r   c                óÔ  a€  \         P                  ! V 4      pVP                  V4      p\         P                  ! V 4      pVP	                  VP
                  ^ ,          4       \         P                  ! VP                  4      pVP                  P                  R4      ^ ,          pVR,          pVP                  R4      ^ 8w  d   R# WˆP                  R4      ^,           VP                  R4       p	V	P                  R4      p
\        SV4      '       d   R# \        ;QJ d    V3R	 lV
 4       F  '       g   K   R# 	  R# ! V3R	 lV
 4       4      #   \        \        \        3 d     R# i ; i)
z>Check if the package supports runtimepm for the given modaliasrð   Ú	PmAliasesznvidia(FrÄ   rÂ   rÃ   Tc              3   óŠ   <"  € T F8  p\         P                   ! SP                  4       VP                  4       4      x € K:  	  R # 5ira   )rÖ   r  )Ú.0ÚregexrÞ   s   & €r   Ú	<genexpr>Ú*_is_runtimepm_supported.<locals>.<genexpr>T  s.   øé € ð 
ÙGQ¸eŒG�OŠO˜EŸK™K›M¨5¯;©;«=×9Ð9Ãzùs   ƒA A)rx   r¤   r¥   rÈ   rÊ   rË   Ú
TagSectionÚrecordÚver_strrŒ   r[   r:  Úanyr£   rÌ   rÍ   )rš   r  rÞ   r®   r¯   rÙ   Úsectionr4  rÛ   ÚnÚ
modaliasess   &&f        r   Ú_is_runtimepm_supportedrJ  >  s0  ø€ ð
Ü×#Ò# IÓ.ˆØ×.Ñ.¨sÓ3ˆ	Ü×(Ò(¨Ó3ˆØ�‰�y×*Ñ*¨1Õ-Ô.Ü×$Ò$ W§^¡^Ó4ˆØ×Ñ×%Ñ% cÓ*¨1Õ-ˆØ�KÕ ˆð �6‰6�)Ó Ô!Ùà�f‰f�S‹k˜A�o §¡ s£Ð,ˆØ—W‘W˜T“]ˆ
Ü.¨u°c×:Ò:Ùß‹sô 
ÙGQó
�sŒsð 	
Šsð 	
ˆsô 
ÙGQó
ó 
ð 	
øô ”nÔ&8Ð9ô Úðús   ƒB*E ÅE'Å&E'c                ó$   € V ^8„  d   QhR\         /# r_   r   )r   s   "r   r   r   Y  s   € ÷ ñ œDñ r   c                 óš   € \         P                  P                  RR4      R8H  ;'       g"    \         P                  P                  R4      RJ# )z*Check if the current session in on WaylandÚXDG_SESSION_TYPEr:   ÚwaylandÚWAYLAND_DISPLAYN)rƒ   Úenvironr§   r   r   r   Úis_wayland_sessionrQ  Y  sA   € ô 	�
‰
�‰Ð)¨2Ó.°)Ñ;÷ 	9ð 	9Ü�:‰:�>‰>Ð+Ó,°DÐ8ðr   c                ód   € V ^8„  d   QhR\         P                  R\         P                  R\        /# r  rœ   )r   s   "r   r   r   a  s)   € ÷ (ñ (¤'§-¡-ð (´g·o±oð (Ì$ñ (r   c                óÄ  € VP                   '       d   R# VP                  P                  R4      '       d   RpM/VP                  P                  R4      '       d   RpM\        W4      pV'       g   R#  \        P
                  ! RV.\        P                  \        P                  R7      pVP                  4        VP                  ^ 8X  d%   \        P                  ! RVP                  V4       R#  \        P                  ! R
TP                  T4       R#   \        \        \        P                  3 d,   p\        P                  ! R\        T4      4        R	p?R# R	p?ii ; i)zIDetermine if the kernel module from an apt.Package is manually installed.FrR   ÚfglrxÚmodinfo)ÚstdoutÚstderrzJ_is_manual_install %s: builds module %s which is available, manual installTz_is_manual_install failed: %sNzQ_is_manual_install %s: builds module %s which is not available, no manual install)Úcurrent_verrP   r‹   r*  Ú
subprocessÚPopenÚPIPEÚcommunicateÚ
returncoderT   rU   ÚOSErrorÚFileNotFoundErrorÚCalledProcessErrorr/   )rš   r  r‚   rU  r“   s   &&   r   Ú_is_manual_installra  a  s  € ð ‡‡€Ùð ‡x�x×Ñ˜8×$Ò$Ø‰Ø	�‰×	Ñ	˜W×	%Ò	%Ø‰ä  Ó0ˆçÙðÜ×"Ò"Ø˜Ð¬
¯©Ä
ÇÁô
ˆð 	×ÑÔð
 ×Ñ Ô"Ü�MŠMØ\Ø—‘Øôñ
 ð #ô ‡M‚MØ[Ø�‰Øôñ
 øô# Ô&¬
×(EÑ(EÐFô Ü�ŠÐ5´s¸1³vÔ>Ýûðús   Á3AD Ä EÄ4 EÅEc          	      óŠ   € V ^8„  d   QhR\         R\         R\        \        \         ,          \        \         ,          3,          /# )r   r4   rÞ   r?   ©r/   r   r   )r   s   "r   r   r   Œ  s3   € ÷ ñ œ#ð ¤cð ¬e´H¼SµMÄ8ÌCÅ=Ð4PÕ.Qñ r   c           	     óº  €  \         P                  ! RRV.RR7      p\        P
                  ! RT4       RpRpTP                  4        F+  pTP                  R^4      w  rxR	T9   d   TpR
T9   g   K)  TpK-  	  \        P
                  ! RYYE4       YE3#   \        \         P                  3 d.   p\        P
                  ! RY\        T4      4       Ru Rp?# Rp?ii ; i)zLReturn (vendor, model) names for given device.

Values are None if unknown.
zsystemd-hwdbÚqueryT©Úuniversal_newlinesz-_get_db_name(%s, %s): systemd-hwdb failed: %sNz_get_db_name: output
%s
r€   Ú_VENDORÚ_MODELz-_get_db_name(%s, %s): vendor "%s", model "%s"©NN)	rY  Úcheck_outputr^  r`  rT   rU   r/   Ú
splitlinesrŒ   )	r4   rÞ   Úoutr“   r+   r,   r•   ÚkÚvs	   &&       r   Ú_get_db_namerp  Œ  sÕ   € ð
Ü×%Ò%Ø˜W eÐ,Àô
ˆô ‡M‚MÐ.°Ô4à€FØ€EØ—‘Ö ˆØ—‘˜C Ó#‰ˆØ˜Œ>ØˆFØ�qŽ=ØŠEñ !ô ‡M‚MØ7¸Èôð ˆ?Ðøô) ”Z×2Ñ2Ð3ô Ü�ŠØ;¸WÌSÐQRËVô	
ð Õûð	ús   ‚B ÂCÂ-"CÃCÃCc                ód   € V ^8„  d   QhR\         P                  R\         P                  R\        /# r  rœ   )r   s   "r   r   r   ¬  s)   € ÷ ñ ¤§¡ð ´W·_±_ð Ìñ r   c                 óœ  € VP                   P                  R 4      '       g   R# \        W4      pVfO   \        VP                   4      pVP	                  4       R8¼  d$   \
        P                  ! RVP                   4       R# M*VR8X  d$   \
        P                  ! RVP                   4       R# \
        P                  ! RVP                   4       R# )únvidia-Fi0  z_is_open_prefered(%s): TrueTr   z_is_open_prefered(%s): False)rP   r‹   r$  r<   ro   rT   rU   )rš   r  r#  Únvidia_infos   &&  r   Ú_is_open_preferedru  ¬  sš   € Ø�8‰8×Ñ˜y×)Ò)Ùä)¨)Ó9€JØÒÜ'¨¯©Ó1ˆØ×(Ñ(Ó*¨cÔ1Ü�MŠMÐ7¸¿¹ÔBÙð 2ð 
�vÔ	Ü�ŠÐ3°S·X±XÔ>Ùä‡M‚MÐ0°#·(±(Ô;Ùr   c                ó(   € V ^8„  d   QhR\         RR/# )r   Úvaluer?   Nr   )r   s   "r   r   r   ¾  s   € ÷ 
ñ 
œ$ð 
 4ñ 
r   c                óv   € RpRV ,          p\        VR4      pVP                  V4       VP                  4        R# )zSet KMS on or off for NVIDIAz/lib/modprobe.d/nvidia-kms.confz‚# This file was generated by ubuntu-drivers
# Set value to 1 to enable modesetting, 0 to disable it
options nvidia-drm modeset=%d
ÚwN)r…   ÚwriteÚclose)rw  Únvidia_kms_fileÚkms_textÚkms_fds   &   r   Úset_nvidia_kmsr  ¾  s;   € à7€Oð#ð 	õ€Hô
 �/ 3Ó'€FØ
‡L�L�ÔØ
‡L�L†Nr   c                ó¶   € V ^8„  d   QhR\         \        P                  ,          R\         \        ,          R\        R\        R\
        \        \        3,          /# )r   rš   r|   ÚfreeonlyÚinclude_oemr?   ©r   rx   r�   r/   r   r   r2   )r   s   "r   r   r   Ë  sX   € ÷ cñ cÜœŸ™Õ&ðcä”s�mðcô ðcô ð	cô
 
Œ#Œ{Ð
Õñcr   c                óV  € \        V4      pV '       g    \        P                  ! R4      p / p\        V 4      pVP                  4        Fð  w  r‰\        WVR7       FÚ  p
V'       d   \        W
4      '       g   K  V'       g*   \        P                  ! V
P                  R4      '       d   KO  RVRV	R\        W
4      R\        W
4      R\        W
4      R	\        W
V4      R
\        W
4      /WjP                  &   \!        W˜4      w  r¼Ve   W¶V
P                  ,          R&   Vf   KÅ  WÆV
P                  ,          R&   KÜ  	  Kò  	  V U
u. uF  qªP#                  R4      '       g   K  V
NK  	  pp
V'       d†   VP                  4        F'  w  rïVP#                  R4      '       g   K  V\$        V&   K)  	  VP'                  \(        P*                  ! \,        4      R7       VR,          pV F  p
V
V8H  Wj,          R&   K  	  \/        V 4      P                  4        F6  w  ppV F*  p
 W
,          pR\        V V4      R\        V V4      RV/Wj&   K,  	  K8  	  V#   \         d#   p\        P
                  ! T4       / u Rp?# Rp?ii ; iu up
i   \0         d"    \        P2                  ! RT
,          4        K”  i ; i)uq  Get driver packages that are available for the system.

This calls system_modaliases() to determine the system's hardware and then
queries apt about which packages provide drivers for those. It also adds
available packages from detect_plugin_packages().

If you already have an apt_pkg.Cache() object, you should pass it as an
argument for efficiency. If not given, this function creates a temporary
one by itself.

If freeonly is set to True, only free packages (from main and universe) are
considered

Return a dictionary which maps package names to information about them:

  driver_package â†’ {'modalias': 'pci:...', ...}

Available information keys are:
  'modalias':    Modalias for the device that needs this driver (not for
                 drivers from detect plugins)
  'syspath':     sysfs directory for the device that needs this driver
                 (not for drivers from detect plugins)
  'plugin':      Name of plugin that detected this package (only for
                 drivers from detect plugins)
  'free':        Boolean flag whether driver is free, i. e. in the "main"
                 or "universe" component.
  'from_distro': Boolean flag whether the driver is shipped by the distro;
                 if not, it comes from a (potentially less tested/trusted)
                 third party source.
  'vendor':      Human readable vendor name, if available.
  'model':       Human readable product name, if available.
  'recommended': Some drivers (nvidia, fglrx) come in multiple variants and
                 versions; these have this flag, where exactly one has
                 recommended == True, and all others False.
N©rü   ú
oem-*-metar*   r4   r   r   r6   r7  r7   r+   r,   rs  ©Úkeyr   r5   z*Package %s plugin not available. Skipping.rC   )r˜   rx   r�   rõ   rT   rÓ   rã   rÔ   r  r  rÖ   rP   r  r2  rJ  ru  rp  r‹   Úlookup_cacheÚsortÚ	functoolsr	   Ú_cmp_gfx_alternativesÚdetect_plugin_packagesr£   rU   )rš   r|   r�  r‚  rI  ÚexrÉ   rü   rÞ   r4   r  r+   r,   Únvidia_packagesrˆ  rw  r   r5   r  Úapt_ps   &&&&                r   Úsystem_driver_packagesr‘  Ë  s^  € ôR # 8Ó,€Jçð	ÜŸš dÓ+ˆIð
 €HÜ)¨)Ó4€LØ$×*Ñ*Ö,‰ˆÜ& yÀl×SˆAßÔ 0°× >Ò >Ùß¤7§?¢?°1·6±6¸<×#HÒ#HÙà˜EØ˜7ØÔ(¨Ó6ØÔ6°yÓDØÔ+¨IÓ9ØÔ4°YÀ5ÓIØ Ô"3°IÓ"Að ˆH—V‘VÑô +¨7Ó:‰OˆVØÒ!Ø-3˜Ÿ™Õ  Ñ*ØÔ Ø,1˜Ÿ™Õ  Ó)ó% Tñ -ñ, #+ÓF¡(˜Q¯l©l¸9×.E—q�q¡(€OÐFßð #Ÿ.™.Ö*‰JˆCØ�~‰~˜i×(Ô(Ø$)”˜SÓ!ñ +ð 	×Ñ¤×!5Ò!5Ô6KÓ!LÐÔMØ% bÕ)ˆÛ ˆAØ)*¨kÑ)9ˆH�K˜Ó&ñ !ô /¨yÓ9×?Ñ?ÖA‰ˆ�ÛˆAðPØ!��àÔ,¨Y¸Ó>Ø!Ô#:¸9ÀeÓ#LØ˜fð�“ó ñ Bð €Oøôk ô 	Ü�MŠM˜"ÔØ�Iûð	üò8 Gøô, ô PÜ—’ÐJÈQÕN×OðPús;   •I Å I7ÅI7È&I<ÉI4ÉI/É)I4É/I4É<(J(Ê'J(c                ó~   € V ^8„  d   QhR\         R\        \        \         ,          \        \         ,          3,          /# )r   rÞ   r?   rc  )r   s   "r   r   r   1  s,   € ÷ ñ ¬ð ´´h¼sµmÄXÌcÅ]Ð6RÕ0Sñ r   c                 óÄ   € \         P                  ! R 4      pVP                  V 4      pV'       d1   VP                  ^4      R,          VP                  ^4      R,          3# R# )z$(.+):v(.+)d(.+)sv(.+)sd(.+)bc(.+)i.*:é   NNrj  )rV   rW   rX   rZ   )rÞ   Úmodalias_patternÚdetailss   &  r   r   r   1  sR   € Ü—z’zÐ"HÓIÐà×$Ñ$ UÓ+€GçØ—‘˜aÓ  Õ$ g§m¡m°AÓ&6°rÕ&:Ð;Ð;àÐr   c                óf   € V ^8„  d   QhR\         P                  R\        R\        \        ,          /# )r   rš   r>   r?   )rx   r�   r/   r   )r   s   "r   r   r   <  s*   € ÷ ñ ¤g§m¡mð ¼sð ÄxÔPSÅ}ñ r   c                 óú  € Vf   Q hR p \         P                  ! V 4      p\        V4      pVP                  '       g    \        P
                  ! RV,          4       V# VP                  4       '       d    \        P
                  ! RV,          4       V# VP                  4       pRV,          p W,          pVP                  V4      pV'       d   VP                  R\        4       39   d   TpV#   \         d     T# i ; i)Nú)Unsupported driver detected: %s. Skippingú%Legacy driver detected: %s. Skipping.znvidia-driver-lrm-%srÁ   )rx   r¤   r<   rJ   rT   rU   rc   rs   r¥   Úarchrz   r£   )	rš   r>   r8   r®   rt  Úcandidate_flavourr¯   r›   Úpackage_candidates	   &&       r   Úget_userspace_lrm_metarž  <  sø   € ØÒÐÐØ!%€Kðô ×Ò 	Ó*€Hä# HÓ-€KØ××ÐÜ�ŠÐAÀHÕLÔMØÐà×+Ñ+×-Ò-Ü�ŠÐ=ÀÕHÔIØÐà#×/Ñ/Ó1ÐØ&Ð*;Õ<€IðØÕ&ˆð %×6Ñ6°wÓ?ÐßÐ*×/Ñ/°E¼<»>Ð3JÔJØ#ˆKð Ðøô ô ØàÐðús   Â+>C+ Ã+C:Ã9C:c                óz   € V ^8„  d   QhR\         P                  R\         P                  R\        \        ,          /# )r   r  rš   r?   )rx   rž   r�   r   r/   )r   s   "r   r   r   ^  s0   € ÷ #ñ #Ü	�‰ð#Ü%,§]¡]ð#äŒc…]ñ#r   c                 ó  € V f   Q hR p \         P                  ! V4      pV P                  p\        V4      pVP                  '       g    \
        P                  ! RV,          4       V# VP                  4       '       d    \
        P                  ! RV,          4       V# VP                  4       pRV,          p W,          pVP                  V4      p	V'       d   V	P                  R\        4       39   d   TpV#   \         d     T# i ; i)Nr™  rš  znvidia-headless-no-dkms-%srÁ   )rx   r¤   rP   r<   rJ   rT   rU   rc   rs   r¥   r›  rz   r£   )
r  rš   r8   r®   rP   rt  rœ  r¯   r›   r�  s
   &&        r   Ú!_get_headless_no_dkms_metapackager¡  ^  s  € ð Š?Ðˆ?Ø!%€Kðô
 ×Ò 	Ó*€HØ�8‰8€Dä# DÓ)€KØ××ÐÜ�ŠÐAÀDÕHÔIØÐà×+Ñ+×-Ò-Ü�ŠÐ=ÀÕDÔEØÐà#×/Ñ/Ó1ÐØ,Ð0AÕB€IðØÕ&ˆð %×6Ñ6°wÓ?ÐßÐ*×/Ñ/°E¼<»>Ð3JÔJØ#ˆKð Ðøô ô ØàÐðús   Â7>C7 Ã7DÄDc          
      óª   € V ^8„  d   QhR\         \        P                  ,          R\         \        ,          R\        R\
        \        \        3,          /# )r   rš   r|   r‚  r?   rƒ  )r   s   "r   r   r   „  sM   € ÷ Bñ BÜœŸ™Õ&ðBä”s�mðBô ðBô 
Œ#Œ{Ð
Õñ	Br   c                ób  € V'       g   / # \        V4      pV '       g    \        P                  ! R4      p / p\        V 4      pVP                  4        F©  w  rx\        WVR7       F“  p	\        P                  ! V	P                  R4      '       g*   \        P                  ! V	P                  R4      '       g   KS  RVRVR\        W	4      R\        W	4      R	R
R\        W	4      R\        W	4      /WYP                  &   K•  	  K«  	  V#   \         d#   p\        P
                  ! T4       / u Rp?# Rp?ii ; i)ux  Get device specific metapackages for this system

This calls system_modaliases() to determine the system's hardware and then
queries apt about which packages provide hardware enablement support for
those.

If you already have an apt_pkg.Cache() object, you should pass it as an
argument for efficiency. If not given, this function creates a temporary
one by itself.

Return a dictionary which maps package names to information about them:

  driver_package â†’ {'modalias': 'pci:...', ...}

Available information keys are:
  'modalias':    Modalias for the device that needs this driver (not for
                 drivers from detect plugins)
  'syspath':     sysfs directory for the device that needs this driver
                 (not for drivers from detect plugins)
  'plugin':      Name of plugin that detected this package (only for
                 drivers from detect plugins)
  'free':        Boolean flag whether driver is free, i. e. in the "main"
                 or "universe" component.
  'from_distro': Boolean flag whether the driver is shipped by the distro;
                 if not, it comes from a (potentially less tested/trusted)
                 third party source.
  'vendor':      Human readable vendor name, if available.
  'model':       Human readable product name, if available.
  'recommended': Always True; we always recommend you install these
                 packages.
Nr…  r†  ú
hwe-*-metar*   r4   r   r   r   Tr6   r7   )r˜   rx   r�   rõ   rT   rÓ   rã   rÔ   r  rÖ   rP   r  r  r2  ru  )
rš   r|   r‚  rI  rŽ  rÉ   rü   rÞ   r4   r  s
   &&&       r   Ú#system_device_specific_metapackagesr¥  „  s  € ÷H Øˆ	ä" 8Ó,€Jçð	ÜŸš dÓ+ˆIð
 €HÜ)¨)Ó4€LØ$×*Ñ*Ö,‰ˆÜ& yÀl×SˆAÜ—?’? 1§6¡6¨<×8Ò8ÄÇÂØ—‘˜÷Bò Bñ à˜EØ˜7ØÔ(¨Ó6ØÔ6°yÓDØ˜tØÔ+¨IÓ9Ø Ô"3°IÓ"Að ˆH—V‘VÓó Tñ -ð  €Oøô- ô 	Ü�MŠM˜"ÔØ�Iûð	ús   ŸD ÄD.ÄD)Ä#D.Ä)D.c                óž   € V ^8„  d   QhR\         \        P                  ,          R\         \        ,          R\        \        \
        3,          /# )r   rš   r|   r?   )r   rx   r�   r/   r   r2   )r   s   "r   r   r   É  s@   € ÷ Rñ RÜœŸ™Õ&ðRÜ9AÄ#½ðRä	Œ#Œ{Ð
ÕñRr   c                óF  € R.p\        V4      pV '       g    \        P                  ! R4      p / p\        V 4      pVP                  4        Fæ  w  rx\        WVR7       FÐ  p	\        W‡4      w  r«\        V4      w  rÍVf   K#  VP                  4       V9   g   K:  RVRVR\        W	4      R\        W	4      R\        W	4      R	\        W	4      /WYP                   &   V
e   W¥V	P                   ,          R
&   Ve   WµV	P                   ,          R&   \#        W�4      pVf   K»  WåV	P                   ,          R&   KÒ  	  Kè  	  V U	u. uF  q™P%                  R4      '       g   K  V	NK  	  pp	V'       d‡   VP                  4        F(  w  ppVP%                  R4      '       g   K  V\&        V&   K*  	  VP)                  \*        P,                  ! \.        4      R7       VR,          pV F  p	V	V8H  WY,          R&   K  	  V#   \         d#   p\        P
                  ! T4       / u Rp?# Rp?ii ; iu up	i )uN  Get driver packages, for gpgpu purposes, that are available for the system.

This calls system_modaliases() to determine the system's hardware and then
queries apt about which packages provide drivers for those. Finally, it looks
for the correct metapackage, by calling _get_headless_no_dkms_metapackage().

If you already have an apt_pkg.Cache() object, you should pass it as an
argument for efficiency. If not given, this function creates a temporary
one by itself.

Return a dictionary which maps package names to information about them:

  driver_package â†’ {'modalias': 'pci:...', ...}

Available information keys are:
  'modalias':    Modalias for the device that needs this driver (not for
                 drivers from detect plugins)
  'syspath':     sysfs directory for the device that needs this driver
                 (not for drivers from detect plugins)
  'plugin':      Name of plugin that detected this package (only for
                 drivers from detect plugins)
  'free':        Boolean flag whether driver is free, i. e. in the "main"
                 or "universe" component.
  'from_distro': Boolean flag whether the driver is shipped by the distro;
                 if not, it comes from a (potentially less tested/trusted)
                 third party source.
  'vendor':      Human readable vendor name, if available.
  'model':       Human readable product name, if available.
  'recommended': Some drivers (nvidia, fglrx) come in multiple variants and
                 versions; these have this flag, where exactly one has
                 recommended == True, and all others False.
Ú10deNr…  r*   r4   r   r   r6   r7   r+   r,   r8   rs  r‡  r   rC   )r˜   rx   r�   rõ   rT   rÓ   rã   rÔ   r  rp  r   r  r  r  r2  ru  rP   r¡  r‹   r‰  rŠ  r‹  r	   Ú_cmp_gfx_alternatives_gpgpu)rš   r|   Úvendors_whitelistrI  rŽ  rÉ   rü   rÞ   r4   r  r+   r,   Ú	vendor_idÚmodel_idr8   r�  rˆ  rw  r   s   &&                 r   Úsystem_gpgpu_driver_packagesr­  É  sð  € ðF  ˜ÐÜ" 8Ó,€Jçð	ÜŸš dÓ+ˆIð
 €HÜ)¨)Ó4€LØ$×*Ñ*Ö,‰ˆÜ& yÀl×SˆAÜ*¨7Ó:‰OˆVÜ">¸uÓ"EÑˆIØÔ%¨I¯O©OÓ,=ÐARÖ,Rà Ø˜wØÔ,¨YÓ:Ø!Ô#:¸9Ó#HØÔ/°	Ó=Ø$Ô&7¸	Ó&Eð$�Ÿ™Ñ ð Ò%Ø17˜QŸV™VÕ$ XÑ.ØÒ$Ø05˜QŸV™VÕ$ WÑ-Ü?ÀÓM�àÔ*Ø6A˜QŸV™VÕ$ ]Ó3ó' Tñ -ñ. #+ÓF¡(˜Q¯l©l¸9×.E—q�q¡(€OÐFßð #Ÿ.™.Ö*‰JˆC�Ø�~‰~˜i×(Ô(Ø$)”˜SÓ!ñ +ð 	×Ñ¤×!5Ò!5Ô6QÓ!RÐÔSØ% bÕ)ˆÛ ˆAØ)*¨kÑ)9ˆH�K˜Ó&ñ !ð €OøôS ô 	Ü�MŠM˜"ÔØ�Iûð	üò: Gs)   ˜G. Ä9HÅHÇ.HÇ9HÈHÈHc          
      óª   € V ^8„  d   QhR\         \        P                  ,          R\         \        ,          R\        R\
        \        \        3,          /# )r   rš   r|   r�  r?   )r   rx   r�   r/   r   r   r(   )r   s   "r   r   r     sL   € ÷ ^ñ ^ÜœŸ™Õ&ð^ä”s�mð^ô ð^ô 
Œ#Œzˆ/Õñ	^r   c                óÆ  € / pV '       g    \         P                  ! R4      p \        WVR7      P                  4        Fœ  w  rVRV9   d   VR,          pM	VR,          pVP                  V/ 4       R F  pW†9   g   K  Wh,          W7,          V&   K  	  W7,          P                  R/ 4      p	RVR,          RVR,          /W•&   RV9   g   KŠ  VR,          W•,          R&   Kž  	  VP                  4        F5  w  r«VR,           F  p\        W V,          4      '       d   K   K.  	  R	VR
&   K7  	  \        V4       V#   \         d#   p\        P                  ! T4       / u Rp?# Rp?ii ; i)um
  Get by-device driver packages that are available for the system.

This calls system_modaliases() to determine the system's hardware and then
queries apt about which packages provide drivers for each of those. It also
adds available packages from detect_plugin_packages(), using the name of
the detction plugin as device name.

If you already have an apt_pkg.Cache() object, you should pass it as an
argument for efficiency. If not given, this function creates a temporary
one by itself.

If freeonly is set to True, only free packages (from main and universe) are
considered

Return a dictionary which maps devices to available drivers:

  device_name â†’  {'modalias': 'pci:...', <device info>,
                  'drivers': {'pkgname': {<driver package info>}}

A key (device name) is either the sysfs path (for drivers detected through
modaliases) or the detect plugin name (without the full path).

Available keys in <device info>:
  'modalias':    Modalias for the device that needs this driver (not for
                 drivers from detect plugins)
  'vendor':      Human readable vendor name, if available.
  'model':       Human readable product name, if available.
  'drivers':     Driver package map for this device, see below. Installing any
                 of the drivers in that map will make this particular
                 device work. The keys are the package names of the driver
                 packages; note that this can be an already installed
                 default package such as xserver-xorg-video-nouveau which
                 provides a free alternative to the proprietary NVidia
                 driver; these will have the 'builtin' flag set.
  'manual_install':
                 None of the driver packages are installed, but the kernel
                 module that it provides is available; this usually means
                 that the user manually installed the driver from upstream.

Aavailable keys in <driver package info>:
  'builtin':     The package is shipped by default in Ubuntu and MUST
                 NOT be uninstalled. This usually applies to free
                 drivers like xserver-xorg-video-nouveau.
  'free':        Boolean flag whether driver is free, i. e. in the "main"
                 or "universe" component.
  'from_distro': Boolean flag whether the driver is shipped by the distro;
                 if not, it comes from a (potentially less tested/trusted)
                 third party source.
  'recommended': Some drivers (nvidia, fglrx) come in multiple variants and
                 versions; these have this flag, where exactly one has
                 recommended == True, and all others False.
N)r�  r4   r5   r-   r   r   r   Tr.   )r*   r+   r,   )
rx   r�   rõ   rT   rÓ   r‘  rÔ   rÏ   ra  Ú_add_builtins)rš   r|   r�  rÚ   rŽ  r  ÚpkginfoÚdevice_nameÚopt_keyr-   r�   rô   s   &&&         r   Úsystem_device_driversr´    sQ  € ðr %'€Fßð	ÜŸš dÓ+ˆIô /Ø hôç�eƒgò‰ˆð ˜ÔØ! )Õ,‰Kà! (Õ+ˆKØ×Ñ˜+ rÔ*Û6ˆGØÖ!Ø/6Õ/?�Õ# GÓ,ñ 7ð Õ%×0Ñ0°¸BÓ?ˆØ ¨¥°ÀÈÕ@VÐWˆ‰Ø˜GÖ#Ø*1°-Õ*@ˆG�L˜Ó'ñð$ Ÿ™ž‰ˆØ˜	—?�?ˆCÜ% i¸3µ×@Ô@Úñ #ð &*ˆDÐ!Ó"ñ 'ô �&Ôà€MøôC ô 	Ü�MŠM˜"ÔØ�Iûð	ús   ŒD3 Ä3E Ä>EÅE ÅE c                óf   € V ^8„  d   QhR\         P                  R\        R\        \        ,          /# )r   rš   Úglob_patternr?   )rx   r�   r/   r   )r   s   "r   r   r     s,   € ÷ &ñ &Ü�}‰}ð&Ü,/ð&ä	Œ#…Yñ&r   c                óà   € . pV P                    FR  pVP                  pVP                  '       g   K#  \        P                  ! WA4      '       g   KA  VP	                  V4       KT  	  \        V4      # )a(  Query apt-cache for installed packages matching a specific glob pattern.

Args:
    apt_cache: The apt cache object
    glob_pattern: Glob pattern to match package names (e.g., "nvidia-driver-*")

Returns:
    List of strings containing the names of all installed packages that match the pattern
)rÉ   rP   rX  rÖ   ÚappendÚsorted)rš   r¶  Úinstalled_packagesr›   Úpackage_names   &&   r   Úget_installed_packages_by_globr¼    sY   € ð Ðà×%Ô%ˆØ—|‘|ˆØ××Ò¤7§?¢?°<×#NÔ#NØ×%Ñ% lÖ3ñ &ô
 Ð$Ó%Ð%r   c                ó¬   € V ^8„  d   QhR\         P                  R\        \        ,          R\        R\        R\        R\        R\
        \        ,          /# )r   rš   r|   Ú	free_onlyr‚  Údriver_stringÚinclude_dkmsr?   )rx   r�   r   r/   r   r   )r   s   "r   r   r   •  sZ   € ÷ ñ Ü�}‰}ðä”s�mðô ðô ð	ô
 ðô ðô 
Œ#…Yñr   c                ó|   € \        WW#R7      p\        WWdRR7      pV'       g   \        P                  ! R4       V# V# )z4Return the list of packages that should be installed)r�  r‚  F)Úget_recommendedz"No drivers found for installation.)r‘  Úauto_install_filterrT   rU   )rš   r|   r¾  r‚  r¿  rÀ  rÉ   Ú
to_installs   &&&&&&  r   Úget_desktop_package_listrÅ  •  sD   € ô &Ø iô€Hô %Ø È%ô€J÷ Ü�ŠÐ:Ô;ØÐàÐr   c                ó>   € V ^8„  d   QhR\         \        ,          RR/# )r   rÄ  r?   N)r   r/   )r   s   "r   r   r   ¬  s   € ÷ ñ ´T¼#µYð À4ñ r   c                ót   € V  F1  p\        V4      pVP                  4       R8¼  g   K%  \        R4        R# 	  R# )zHApplies changes that need to happen before installing the NVIDIA driversiÖ  TN)r<   ro   r  )rÄ  r»  rt  s   &  r   Ú$nvidia_desktop_pre_installation_hookrÈ  ¬  s4   € ó #ˆÜ'¨Ó5ˆØ×(Ñ(Ó*¨cÖ1Ü˜4Ô Úó	 #r   c                ó   € V ^8„  d   QhRR/# )r   r?   Nr   )r   s   "r   r   r   ·  s   € ÷ :ñ :¨tñ :r   c                  óX  € \         P                  P                  R 4      '       d`   \        P                  ! R4        \
        P                  ! RR.4       \        RR4      ;_uu_ 4       p V P                  R4       RRR4       R# R#   \         d     L?i ; i  + '       g   i     R# ; i)ú/run/nvidia_runtimepm_supportedz,Trying to select the on-demand PRIME profilez/usr/bin/prime-selectz	on-demandz$/etc/u-d-c-nvidia-runtimepm-overridery  z!# File created by ubuntu-drivers
N)
rƒ   r†   ÚisfilerT   rU   rY  Úcallr_  r…   rz  )r’   s    r   Ú%nvidia_desktop_post_installation_hookrÎ  ·  sˆ   € ô 
‡w�w‡~�~Ð7×8Ò8Ü�ŠÐDÔEð	Ü�OŠOÐ4°kÐBÔCô
 Ð8¸#×>Ô>À!Ø�G‰GÐ8Ô9÷ ?Ñ>ñ 9øô !ô 	Ùð	ú÷ ?×>Ð>ús   ½B Á)BÂBÂBÂB)	c                   óH   a € ] tR tRt o RV 3R lR lltV 3R lR ltRtV tR# )	Ú_GpgpuDriveriÆ  Nc                óJ   <€ V ^8„  d   QhRS[ S[,          RS[ S[,          RR/# )r   r+   Úflavourr?   N©r   r/   )r   r   s   "€r   r   Ú_GpgpuDriver.__annotate__È  s-   ø€ ÷ ñ Ù™s•mðÙ5=¹cµ]ðà	ñr   c                ó,   € RV n         Wn        W n        R# )rR   N)rR   )Ú_vendors_whitelistr+   rÒ  )rL   r+   rÒ  s   &&&r   rM   Ú_GpgpuDriver.__init__È  s   € ð #.ˆÔØŒØŽr   c                ó    <€ V ^8„  d   QhRS[ /# r_   r   )r   r   s   "€r   r   rÔ  Ï  s   ø€ ÷ :ñ :™$ñ :r   c                óê   € V P                   '       d4   \        P                  ! V P                  V P                   4      '       g   R # V P                   '       * ;'       d    V P                  '       * '       * # ©F)r+   rÖ   ÚfilterrÖ  rÒ  rb   s   &r   rJ   Ú_GpgpuDriver.is_validÏ  sG   € Ø�;�;ˆ;ä—>’> $×"9Ñ"9¸4¿;¹;×GÒGÙØŸ™”O×8Ð8¨D¯L©LÔ(8Ô9Ð9r   )rÖ  rÒ  r+   rj  )r   r   r   r    rM   rJ   r#   r$   r%   s   @r   rÐ  rÐ  Æ  s   ø‡ € ÷ò ÷:ö :r   rÐ  c                ó0   € V ^8„  d   QhR\         R\        /# )r   Ústringr?   )r/   rÐ  )r   s   "r   r   r   ×  s   € ÷  ñ  ¤3ð  ¬<ñ  r   c                óæ  € \        4       p\        P                  ! R4      pVP                  V 4      pV'       d5   RVn        VP                  ^4      : VP                  ^4      : 2Vn        V# \        P                  ! R4      p\        P                  ! R4      p\        P                  ! R4      pVP                  V 4      pVP                  V 4      pVP                  V 4      p	V'       dD   VP                  ^4      Vn        VP                  ^4      : VP                  ^4      : 2Vn        V# V'       d	   Wn        V# V	'       d,   V	P                  ^4      : V	P                  ^4      : 2Vn        V# )zReturns a _GpgpuDriver objectrS   rR   z(.+):([0-9]+)(.*)z([a-z]+)z([0-9]+)(.*))rÐ  rV   rW   rX   r+   rZ   rÒ  )
rÞ  r�   Úmetapackage_patternÚmetapackage_matchÚfull_patternÚvendor_only_patternÚseries_only_patternÚ
full_matchÚvendor_matchÚseries_matchs
   &         r   Ú_process_driver_stringrè  ×  s:  € ä‹^€Fô Ÿ*š*Ð%AÓBÐØ+×1Ñ1°&Ó9ÐçØ ˆŒà×#Ñ# AÕ&Ø×#Ñ# AÕ&ð
ˆŒð ˆä—:’:Ð1Ó2€LÜŸ*š* ZÓ0ÐÜŸ*š* ^Ó4Ðà×#Ñ# FÓ+€JØ&×,Ñ,¨VÓ4€LØ&×,Ñ,¨VÓ4€LçØ"×(Ñ(¨Ó+ˆŒØ#-×#3Ñ#3°AÕ#6¸
×8HÑ8HÈÕ8KÐLˆŒð €M÷ 
ØŒð €M÷ 
Ø#/×#5Ñ#5°aÕ#8¸,×:LÑ:LÈQÕ:OÐPˆŒà€Mr   c          	      ó–   € V ^8„  d   QhR\         \        \        3,          R\        R\        \
        \        \        3,          ,          /# )r   rÉ   Úgpgpur?   )r   r/   r2   r   r   r   )r   s   "r   r   r   ú  s=   € ÷ ñ Ü”3œÐ#Õ$ðÜ-1ðä	Œ%””[Ð Õ
!Õ"ñr   c                ó~   a€ V'       d   \         M\        o\        V P                  4       \	        V3R l4      RR7      # )aè  
Sort packages by preference based on desktop or GPGPU mode.

Args:
    packages: Dict of package candidates to sort.
        Typically originates from system_driver_packages() or system_gpgpu_driver_packages(),
        and is filtered depending on the mode (desktop vs gpgpu) and user preferences.
    gpgpu: Boolean flag indicating whether to use GPGPU (server) sorting preferences.

Returns:
    List of (package_name, package_info) tuples sorted by preference (most preferred first).
c                 ó2   <€ S! V ^ ,          V^ ,          4      # )é    r   )ÚleftÚrightÚ
comparators   &&€r   Ú<lambda>Ú._sort_packages_by_preference.<locals>.<lambda>  s   ø€ ©:°d¸1µg¸uÀQ½xÔ+Hr   T)rˆ  Úreverse)r©  rŒ  r¹  rÔ   r	   )rÉ   rê  rð  s   &&@r   Ú_sort_packages_by_preferencerô  ú  s3   ø€ ÷ 16Õ,Ô;P€JÜØ�‰ÓÜÔHÓIØôð r   c                ó¶   € V ^8„  d   QhR\         P                  R\        \        \        \
        3,          ,          R\        R\        R\        \        ,          /# )r   ÚcacheÚsorted_packagesrÀ  rê  r?   )rx   r�   r   r   r/   r2   r   )r   s   "r   r   r     sX   € ÷ [ñ [Ü�=‰=ð[äœ%¤¤[Ð 0Õ1Õ2ð[ô ð[ô ð	[ô
 
Œ#…Yñ[r   c                ón  € \         P                  ! V 4      p. pRpV EF  w  rx\        P                  ! R\	        V4      ,           4       VP                  R4      '       g   V'       d   KM  V'       g�   VP                  W,          4      p	\         P                  ! V 4      p
V
P                  V	P                  ^ ,          4       V
R,          '       d/    \        RR4      pVP                  R4       VP                  4        VP                  R4      pVP                  R	4      '       d>   \        ;QJ d    R
 V 4       F  '       g   K   RM	  RM! R
 V 4       4      '       d   EKF  V'       dC   W,          P                   '       d   . pRpEKm  VP#                  V4       VP#                  V4       M7\        P                  ! R\	        V4      ,           4       VP#                  V4       \        P                  ! R\	        V4      ,           4       \%        W4      p\        P                  ! V4       V'       g   EK  W,          P                   '       d   EK4  V'       g9   RV9   d2   Wu9   d   VP'                  V4       WÅ9   d   VP'                  V4       EKt  Wu9   d   V'       d   VP'                  V4       VP#                  V4       \)        W4      pV'       dI   W,          P                   '       g1   VP#                  V4       Wu9   d   V'       d   VP'                  V4       RpEK  	  V#   \         d     EL5i ; i)aÔ  
Build the list of packages to install including metapackages and modules.

Args:
    cache: The apt cache object used to check installed packages.
    sorted_packages: List of (package_name, package_info) tuples sorted by preference.
    include_dkms: Boolean indicating whether to include DKMS packages.
    gpgpu: Boolean flag indicating whether to use GPGPU (server) mode.

Returns:
    List of package names to install including metapackages and module packages.
FzProcessing package: zhwe-r7  rË  ry  Ú
r8   r    c              3   óB   "  € T F  qP                  R 4      x € K  	  R# 5i©r    N©r‹   ©r?  r  s   & r   rA  Ú+_build_installation_list.<locals>.<genexpr>B  s   é € ÐJ¹z¸—>‘>Ð"2×3Ð3»zùó   ‚Tz#No candidate metapackage found for zCandidate: Údkms)rx   r¤   rT   rU   r/   r‹   r¥   rÈ   rÊ   rË   r…   rz  r{  ÚPermissionErrorr§   rF  rX  r¸  Úget_linux_modules_metapackageÚremoverž  )rö  r÷  rÀ  rê  r®   rÄ  Údriver_foundr  Úpkg_infoÚcandidate_verrÙ   Úpm_fdr¯   Úmodules_packageÚlrm_metas   &&&&           r   Ú_build_installation_listr
    sd  € ô$ ×Ò Ó&€HØ€Jà€LÜ&‰ˆô 	�ŠÐ,¬s°1«vÕ5Ô6Ø�|‰|˜F×#Ò#¯ÙçØ$×6Ñ6°uµxÓ@ˆMÜ×,Ò,¨UÓ3ˆGØ�N‰N˜=×2Ñ2°1Õ5Ô6à�{×#Ô#ðÜ Ð!BÀCÓH�EØ—K‘K Ô%Ø—K‘K”Mð —L‘L Ó/ˆ	à�<‰<Ð(×)Ò)ß‹sÑJ¹zÓJ�s�sŠsÑJ¹zÓJ×JÒJÚçØÕ×+×+Ð+Ø�
Ø#�Úà×!Ñ! !Ô$Ø×!Ñ! )Õ,ä�MŠMÐ?Ä#ÀaÃ&ÕHÔIØ×Ñ˜aÔ ä�Š�m¤c¨)£nÕ4Ô5ä7¸ÓAˆÜ�Š�oÔ&ßŠ? 5Õ#9×#E×#EÓ#Eß F¨oÔ$=Ø”?Ø×%Ñ% aÔ(ØÔ*Ø×%Ñ% iÔ0Úð Œ§5Ø×!Ñ! !Ô$Ø×Ñ˜oÔ.ä-¨eÓ7ˆHß ¥× ;× ;Ð ;à×!Ñ! (Ô+Ø”?§uØ×%Ñ% aÔ(ØˆLÚñG 'ðJ Ðøôe 'ô ò ðús   Ã-L%Ì%L4Ì3L4c                ó’   € V ^8„  d   QhR\         \        P                  ,          R\        \        ,          R\        \        ,          /# )r   rö  rÉ   r?   )r   rx   r�   r   r/   )r   s   "r   r   r   o  s5   € ÷ ñ Ü”G—M‘MÕ"ðÜ.2´3­iðä	Œ#…Yñr   c                óÒ   € . p\        VRR7       FS  pV '       d8   W,          P                  '       d    \        P                  ! RV,           4       KB  VP	                  V4       KU  	  V# )zé
Filter out packages that are already installed.

Args:
    cache: The apt cache object used to check installed packages.
    packages: List of package names to filter.

Returns:
    List of package names that are not yet installed.
T)ró  z4Removing already-installed package from to_install: )r¹  rX  rT   rU   r¸  )rö  rÉ   Úfilteredr  s   &&  r   Ú_remove_already_installedr  o  sP   € ð €HÜ�H d×+ˆß�U•X×)×)Ð)Ü�MŠMÐPÐSTÕTÖUà�O‰O˜AÖñ	 ,ð
 €Or   c                ó¶   € V ^8„  d   QhR\         \        P                  ,          R\        \        \
        3,          R\        R\        R\        \        ,          /# )r   rö  rÉ   rÀ  rê  r?   )r   rx   r�   r   r/   r2   r   r   )r   s   "r   r   r   …  sQ   € ÷ 8ñ 8Ü”G—M‘MÕ"ð8ä”3œÐ#Õ$ð8ô ð8ô ð	8ô
 
Œ#…Yñ8r   c                ó¢  € V '       g   . p\        W4      pV Fi  w  rgVP                  R4      '       d=   \        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   KX  VP                  V4       Kk  	  V# \        W4      p\	        WW#4      p\        W4      p\        P                  ! R\        V4      ,           4       V# )aë  
Sort driver branch to install according to preference, then select
most appropriate modules package and filter out already installed packages.

Args:
    cache: The apt cache object used to check installed packages.
    packages: Dict of package candidates to consider for installation.
        Typically originates from system_driver_packages() or system_gpgpu_driver_packages(),
        and is filtered depending on the mode (desktop vs gpgpu) and user preferences.
    include_dkms: Boolean indicating whether to include DKMS packages.
    gpgpu: Boolean flag indicating whether to use GPGPU (server) sorting preferences.

Takes a list of packages of this format:
{'modalias': 'pci:v000010DEd000010C3sv00003842sd00002670bc03sc03i00',
 'syspath': '/tmp/umockdev.8CRPA3/sys/devices/graphics', 'free': False,
 'from_distro': False, 'support': None, 'open_preferred': False,
 'vendor': 'NVIDIA Corporation', 'model': 'GT218 [GeForce 8400 GS Rev. 3]',
 'metapackage': 'nvidia-headless-no-dkms-410', 'recommended': True}
checks to see if the requested packages are already installed, then filters
them out if so.

Returns:
    A simplified list of just the package names for apt to install, of the form:
    ['nvidia-driver-410', 'nvidia-headless-no-dkms-410']
r    c              3   óB   "  € T F  qP                  R 4      x € K  	  R# 5irû  rü  rý  s   & r   rA  Ú+already_installed_filter.<locals>.<genexpr>®  s   é € ÐNÁ:¸C—~‘~Ð&6×7Ð7Ã:ùrÿ  TFzto_install_final:  )	rô  r‹   rF  r¸  r
  r  rT   rU   r/   )rö  rÉ   rÀ  rê  rÄ  r÷  r  r  s   &&&&    r   Úalready_installed_filterr  …  s¯   € ÷F Ø "ˆ
Ü6°xÓGˆÛ#‰DˆAà�|‰|Ð,×-Ò-ß“3ÑNÁ:ÓN—3—3’3ÑNÁ:ÓN×NÒNÙØ×Ñ˜aÖ ñ $ð Ðô 3°8ÓC€Oô *¨%À,ÓV€Jô +¨5Ó=€Jä‡M‚MÐ'¬#¨j«/Õ9Ô:ØÐr   c                óÎ   € V ^8„  d   QhR\         \        P                  ,          R\        R\        \
        \        3,          R\
        R\        R\        R\        \
        ,          /# ©r   rö  rÀ  rÉ   Údrivers_strrÂ  rê  r?   ©r   rx   r�   r   r   r/   r2   r   )r   s   "r   r   r   À  sw   € ÷ }Hñ }HÜ”G—M‘MÕ"ð}Häð}Hô ”3œÐ#Õ$ð}Hô ð	}Hô
 ð}Hô ð}Hô 
Œ#…Yñ}Hr   c                 ó  € . p. p/ p V'       g   \        VP                  4       4      # V'       dX   VP                  R 4       FA  p	\        V	4      p
V
'       g   K  V
P	                  4       '       g   K0  VP                  V
4       KC  	  M\        4       p
VP                  V
4       \        V4      ^8  d   . # ^ pV F+  p
V
P                  '       g   RWk,          n        V^,          pK-  	  ^ p. pV FM  p
V
P                  pWÜ9   d   \        P                  ! R4       . u # Ve   VP                  V4       V^,          pKO  	  ^ pV F=  p
V
P                  '       g    V
P                  '       g   RWk,          n        V^,          pK?  	  V Fk  p
V
P                  '       d   V
P                  : RV
P                  : 2pMRV
P                  ,          pVP                  \        P                  ! W.4      4       Km  	  V F‡  pV F~  p
VP                  V
P                  4      '       g   K&  V
P                  '       d   W/,          W�&   M:V'       d)   W/,          P!                  R4      '       d   W/,          W�&   M
W/,          W�&    K…  	  K‰  	  \#        WW4      # )rÅ   rR   z0Multiple nvidia versions passed at the same timeÚ*z%s*r   )rñ   rÕ   rŒ   rè  rJ   r¸  rÐ  Úlenr+   rT   rU   rÒ  ÚextendrÖ   rÛ  Ú__contains__r§   r  )rö  rÀ  rÉ   r  rÂ  rê  r-   ÚallowrÚ   Úitemr�   ÚitÚvendors_tempr+   r\   r  s   &&&&&&          r   Úgpgpu_install_filterr!  À  s  € ð #%€GØ€EØ%'€Fð"÷F Ü�F—K‘K“MÓ"Ð"çð  ×%Ñ% cÖ*ˆDÜ+¨DÓ1ˆFß‰v˜&Ÿ/™/×+Ô+Ø—‘˜vÖ&ò +ô “ˆØ�‰�vÔä
ˆ7ƒ|�aÔØˆ	ð 
€BÛˆØ�}�}ˆ}Ø!)ˆG�KÔØ
ˆa�Šñ ð 
€BØ €LÛˆØ—‘ˆØÔ!ä�MŠMÐLÔMØŠIØÒØ×Ñ Ô'Ø
ˆa�Šñ ð 
€BÛˆØ�~�~ˆ~ f§m§m mØ!)ˆG�KÔØ
ˆa�Šñ ó ˆØ�>�>ˆ>Ø!'§¤°·³Ð?‰Gà˜vŸ}™}Õ-ˆGØ�‰”W—^’^ HÓ6Ö7ñ ó ˆãˆFØ�~‰~˜fŸm™m×,Ô,Ø—>—>�>à (¥�F’I÷ 'Ø#�;Ÿ?™?¨=×9Ò9Ø(0­˜F™Iøà$,¥K˜™	âó ñ ô  $ E°<ÓGÐGr   c                óÎ   € V ^8„  d   QhR\         \        P                  ,          R\        R\        \
        \        3,          R\
        R\        R\        R\        \
        ,          /# r  r  )r   s   "r   r   r   @  sn   € ÷ :Hñ :HÜ”G—M‘MÕ"ð:Häð:Hô ”3œÐ#Õ$ð:Hô ð	:Hô
 ð:Hô ð:Hô 
Œ#…Yñ:Hr   c                óL  € . ROpV'       d   \        WW#RV4      pV# . pV F(  p	VP                  \        P                  ! W)4      4       K*  	  / p
V FE  pV'       d1   RW+,          9  g   W+,          R,          '       d   W+,          W«&   K9  K;  W+,          W«&   KG  	  \	        W
W4      # )a  
Get packages which are appropriate for automatic installation.

Args:
    cache: The apt cache object used to check installed packages.
    include_dkms: Boolean indicating whether to include DKMS packages.
    packages: Dict of package candidates to consider for installation.
        Typically originates from system_driver_packages() or system_gpgpu_driver_packages(),
        and is filtered depending on the mode (desktop vs gpgpu) and user preferences.
    drivers_str: String specifying driver(s) and version(s) to filter for (optional).
    get_recommended: Boolean, if True only recommended packages are considered.
    gpgpu: Boolean flag indicating whether to use GPGPU (server) sorting preferences.

Returns:
    The subset of the given list of packages which are appropriate for
    automatic installation by the installer as a list. This applies to e.g. the Broadcom
    Wifi driver (as there is no alternative), but not to the FGLRX proprietary
    graphics driver (as the free driver works well and FGLRX does not provide
    KMS).
Tr   )zbcmwl*z	pvr-omap*zvirtualbox-guest*znvidia-*zopen-vm-tools*r¤  r†  zbroadcom-sta-dkms)r!  r  rÖ   rÛ  r  )rö  rÀ  rÉ   r  rÂ  rê  Ú	whitelistÚresultsr  r\   rÚ   r  s   &&&&&&      r   rÃ  rÃ  @  sŸ   € ò:	€I÷ Ü&Ø ¸¸eó
ˆð ˆà€EÛˆØ�‰”W—^’^ HÓ6Ö7ñ ð €FÛˆßØ H¥KÔ/°8µ;¸}×3MÔ3MØ$�K�“	ñ 4Nð !�ˆF‹Iñ ô $ E°<ÓGÐGr   c                ó’   € V ^8„  d   QhR\         \        P                  ,          R\        \        \
        \        ,          3,          /# r¾   )r   rx   r�   r   r/   r   )r   s   "r   r   r   }  s6   € ÷ Dñ DÜœŸ™Õ&ðDä	Œ#Œt”C�yˆ.ÕñDr   c           
     ó$  € / p\         P                  P                  RR4      p\         P                  P	                  V4      '       g   \
        P                  ! RV4       V# V f    \        P                  ! R4      p \         P                  ! V4       EFY  pVP                  R4      '       g   K  \         P                  P                  W$4      p\
        P                  ! RV4       / p\        V4      ;_uu_ 4       p \        \!        VP#                  4       VR4      V4       VR,          ! V 4      p\
        P                  ! R	WX4       Tf    RRR4       KÄ  \'        T4      \(        \*        39  d.   \
        P                  ! RT\'        T4      4        RRR4       EK  T F@  p	 Y	,          p
\-        Y
4      '       d$   TP/                  T. 4      P1                  T	4       K@  KB  	  RRR4       EK\  	  V#   \         d#   p\
        P                  ! T4       / u Rp?# Rp?ii ; i  \         d%    \
        P$                  ! R
T4        RRR4       EK¾  i ; i  \2         d    \
        P                  ! RY•4        KÚ  i ; i  + '       g   i     EKý  ; i)a9  Get driver packages from custom detection plugins.

Some driver packages cannot be identified by modaliases, but need some
custom code for determining whether they apply to the system. Read all *.py
files in /usr/share/ubuntu-drivers-common/detect/ or
$UBUNTU_DRIVERS_DETECT_DIR and call detect(apt_cache) on them. Filter the
returned lists for packages which are available for installation, and
return the joined results.

If you already have an existing apt_pkg.Cache() object, you can pass it as an
argument for efficiency.

Return pluginname -> [package, ...] map.
ÚUBUNTU_DRIVERS_DETECT_DIRz(/usr/share/ubuntu-drivers-common/detect/z3Custom detection plugin directory %s does not existNz.pyz"Loading custom detection plugin %sÚexecÚdetectzplugin %s return value: %szplugin %s failed:z6plugin %s returned a bad type %s (must be list or set)z.Ignoring unavailable package %s from plugin %s)rƒ   rP  r§   r†   ÚisdirrT   rU   rx   r�   rõ   rÓ   ÚlistdirÚendswithr‡   r…   r)  rW   rˆ   Ú	exceptionÚtyperñ   rÐ   r¼   rÏ   r¸  r£   )rš   rÉ   Ú	plugindirrŽ  Úfnamer5   Úsymbr’   rÚ   r  r›   s   &          r   r�  r�  }  s  € ð" &(€HÜ—
‘
—‘Ø#Ð%Oó€Iô �7‰7�=‰=˜×#Ò#Ü�ŠÐKÈYÔWØˆàÒð	ÜŸš dÓ+ˆIô
 —’˜I×&ˆØ�~‰~˜e×$Ò$ÙÜ—‘—‘˜iÓ/ˆÜ�ŠÐ:¸FÔCà!ˆÜ�&�\Œ\˜QðÜ”W˜QŸV™V›X v¨vÓ6¸Ô=Ø˜hž¨	Ó2�Ü—’Ð:¸FÔKð
 Š~Ø÷ ‰\ô �F‹|¤D¬# ;Ô.Ü—’ØLØÜ˜“Lôð
 ÷# Š\ó& �ðØ'�n�GÜ.¨y×BÒBØ ×+Ñ+¨E°2Ó6×=Ñ=¸cÖBñ Cñ ÷' Š\ñ 'ðH €OøôQ ô 	Ü�MŠM˜"ÔØ�Iûð	ûô  ô Ü×!Ò!Ð"5°vÔ>Ø÷ Š\ð
ûô&  ô Ü—M’MØHÈ#÷ðú÷1 �\‰\ús   Á&G2 Ã:I=Ã<AH"ÅI=Å<I=ÆI=Æ#:IÇI=Ç2HÇ=HÈHÈHÈ""I	ÉI=ÉI	ÉI=É"I:É6I=É9I:É:I=É=Jc                óF   € V ^8„  d   QhR\         R\        \         ,          /# ©r   r»   r?   rê   )r   s   "r   r   r   Ä  s   € ÷ ñ œsð ¤x´¥}ñ r   c                ó„   € \         P                  V 4      '       d%   \         P                  V 4      P                  R4      # R# )z5Look up driver package and return their support levelr6   N©r‰  r§   ©r»   s   &r   Ú_pkg_support_from_cacher8  Ä  s2   € ä×Ñ˜×ÒÜ×Ñ Ó"×&Ñ& yÓ1Ð1Ùr   c                ó0   € V ^8„  d   QhR\         R\        /# r4  r5  )r   s   "r   r   r   Ë  s   € ÷ ñ ¤cð ¬dñ r   c                ó„   € \         P                  V 4      '       d%   \         P                  V 4      P                  R4      # R# )z6Look up driver and return if open package is preferredr7   Fr6  r7  s   &r   Ú_pkg_open_preferred_from_cacher;  Ë  s3   € ä×Ñ˜×ÒÜ×Ñ Ó"×&Ñ&Ð'7Ó8Ð8Ùr   c                ó0   € V ^8„  d   QhR\         R\        /# r4  ©r/   rY   )r   s   "r   r   r   Ò  s   € ÷ ñ ”cð œcñ r   c                ó  € \        V 4      '       d€   \        P                  ! RV 4      '       d   ^# \        P                  ! RV 4      '       d   ^# \        P                  ! RV 4      '       d   ^# \        P                  ! RV 4      '       d   ^ #  ^ # \        P                  ! RV 4      '       d   ^# \        P                  ! RV 4      '       d   ^# \        P                  ! RV 4      '       d   ^# \        P                  ! RV 4      '       d   ^ # ^ # )z4decide how well the package fits desktop environmentú(\d{3})-open$ú(\d{3})$ú(\d{3})-server-open$ú(\d{3})-server$©r;  rV   r9  r7  s   &r   Ú_get_fit_levelrD  Ò  sÄ   € ô & a×(Ò(Ü�9Š9Ð% q×)Ò)Ùä�9Š9�[ !×$Ò$Ùä�9Š9Ð,¨a×0Ò0Ùä�9Š9Ð'¨×+Ò+Ùð ,ñ ô �9Š9�[ !×$Ò$Ùä�9Š9Ð'¨×+Ò+Ùä�9Š9Ð% q×)Ò)Ùä�9Š9Ð,¨a×0Ò0ÙÙr   c                ó0   € V ^8„  d   QhR\         R\        /# r4  r=  )r   s   "r   r   r   ó  s   € ÷ ñ œCð ¤Cñ r   c                ó  € \        V 4      '       d€   \        P                  ! RV 4      '       d   ^# \        P                  ! RV 4      '       d   ^# \        P                  ! RV 4      '       d   ^# \        P                  ! RV 4      '       d   ^ #  ^ # \        P                  ! RV 4      '       d   ^# \        P                  ! RV 4      '       d   ^# \        P                  ! RV 4      '       d   ^# \        P                  ! RV 4      '       d   ^ # ^ # )z3decide how well the package fits server environmentrA  rB  r?  r@  rC  r7  s   &r   Ú_get_fit_level_gpgpurG  ó  sÄ   € ô & a×(Ò(Ü�9Š9Ð,¨a×0Ò0Ùä�9Š9Ð'¨×+Ò+Ùä�9Š9Ð% q×)Ò)Ùä�9Š9�[ !×$Ò$Ùð %ñ ô �9Š9Ð'¨×+Ò+Ùä�9Š9�[ !×$Ò$Ùä�9Š9Ð,¨a×0Ò0Ùä�9Š9Ð% q×)Ò)ÙÙr   c                ó<   € V ^8„  d   QhR\         R\         R\        /# ©r   r»   Úyr?   r=  )r   s   "r   r   r     s&   € ÷ Tñ TœSð T¤Sð T¬Sñ Tr   c                óœ  € V P                  R4      '       Ed   VP                  R4      '       Ed   \        V 4      \        V4      8”  d   ^# \        V 4      \        V4      8  d   R# RR.p^ p^ p\        V 4      p\        V4      pWR9   d
   V^d,          pWb9   d
   V^d,          pW8”  d   V^,          pMW8  d
   V^,          pV^d8¼  g   V^d8¼  d   W48”  d   ^# W48  d   R# \        V 4      R8X  d   \        V4      R8w  d   ^# \        V 4      R8w  d   \        V4      R8X  d   R# \        V 4      R8X  d   \        V4      R8w  d   ^# \        V 4      R8w  d   \        V4      R8X  d   R# \        V 4      R8X  d   \        V4      R8w  d   R# \        V 4      R8w  d   \        V4      R8X  d   ^# \        V 4      R8X  d   \        V4      R8w  d   R# \        V 4      R8w  d   \        V4      R8X  d   ^# \        V 4      R8X  d   \        V4      R8w  d   R# \        V 4      R8w  d   \        V4      R8X  d   ^# W8  d   R# W8”  d   ^# W8X  g   Q h^ # )a(  Compare two graphics driver names in terms of preference. (desktop)

-open by default sorts after non-open, unless a driver preferes open variant
-server always sorts after non-server.
LTSB (Long Term Support Branch) always sorts before NFB (New Feature Branch).
Legacy always sorts before Beta.
rs  r.  r0  r/  r1  ÚBetarC   )r‹   rD  r8  )r»   rJ  Úpreferred_supportÚx_scoreÚy_scoreÚ	x_supportÚ	y_supports   &&     r   rŒ  rŒ    s  € ð 	‡|�|�I×Ó 1§<¡<°	×#:Ó#:Ü˜!Óœ~¨aÓ0Ô0ÙÜ˜!Óœ~¨aÓ0Ô0ØˆIà! 6˜NÐàˆØˆä+¨AÓ.ˆ	Ü+¨AÓ.ˆ	àÔ)Ø�s�NˆGàÔ)Ø�s�NˆGàŒ5Ø�q�L‰GØŒUØ�q�LˆGà�sŒN ¨3¤ØÔ ÙØÔ"Ø�	ä" 1Ó%¨Ô-Ô2IÈ!Ó2LÐPTÔ2TÙÜ" 1Ó%¨Ô-Ô2IÈ!Ó2LÐPTÔ2TØˆIä# AÓ&¨&Ô0Ü'¨Ó*¨fÔ4áä# AÓ&¨&Ô0Ü'¨Ó*¨fÔ4àˆIÜ" 1Ó%¨Ô.Ô3JÈ1Ó3MÐQVÔ3VØˆIÜ" 1Ó%¨Ô.Ô3JÈ1Ó3MÐQVÔ3VÙä# AÓ&¨(Ô2Ü'¨Ó*¨hÔ6àˆIä# AÓ&¨(Ô2Ü'¨Ó*¨hÔ6áä# AÓ&¨&Ô0Ü'¨Ó*¨fÔ4àˆIä# AÓ&¨&Ô0Ü'¨Ó*¨fÔ4áà„uØˆ	Ø„uÙØŒ6€Mˆ6Ùr   c                ó<   € V ^8„  d   QhR\         R\         R\        /# rI  r=  )r   s   "r   r   r   k  s!   € ÷ <ñ <¤3ð <¬3ð <´3ñ <r   c                óª  € V P                  R4      '       Ed£   VP                  R4      '       Ed‹   \        V 4      \        V4      8”  d   ^# \        V 4      \        V4      8  d   R# \        V 4      R8X  d   \        V4      R8w  d   ^# \        V 4      R8w  d   \        V4      R8X  d   R# \        V 4      R8X  d   \        V4      R8w  d   ^# \        V 4      R8w  d   \        V4      R8X  d   R# \        V 4      R8X  d   \        V4      R8w  d   R# \        V 4      R8w  d   \        V4      R8X  d   ^# \        V 4      R8X  d   \        V4      R8w  d   R# \        V 4      R8w  d   \        V4      R8X  d   ^# \        V 4      R8X  d   \        V4      R8w  d   R# \        V 4      R8w  d   \        V4      R8X  d   ^# W8  d   R# W8”  d   ^# W8X  g   Q h^ # )a]  Compare two graphics driver names in terms of preference. (server)

-open by default sorts after non-open, unless a driver preferes open variant
-server always sorts before non-server.
non server package always sorts after server package
LTSB (Long Term Support Branch) always sorts before NFB (New Feature Branch).
Legacy always sorts before Beta.
rs  r.  r0  r1  r/  rL  rC   )r‹   rG  r8  )r»   rJ  s   &&r   r©  r©  k  s�  € ð 	‡|�|�I×Ó 1§<¡<°	×#:Ó#:Ü Ó"Ô%9¸!Ó%<Ô<ÙÜ Ó"Ô%9¸!Ó%<Ô<ØˆIä" 1Ó%¨Ô-Ô2IÈ!Ó2LÐPTÔ2TÙÜ" 1Ó%¨Ô-Ô2IÈ!Ó2LÐPTÔ2TØˆIä# AÓ&¨&Ô0Ü'¨Ó*¨fÔ4áä# AÓ&¨&Ô0Ü'¨Ó*¨fÔ4àˆIä# AÓ&¨(Ô2Ü'¨Ó*¨hÔ6àˆIä# AÓ&¨(Ô2Ü'¨Ó*¨hÔ6áÜ" 1Ó%¨Ô.Ô3JÈ1Ó3MÐQVÔ3VØˆIÜ" 1Ó%¨Ô.Ô3JÈ1Ó3MÐQVÔ3VÙä# AÓ&¨&Ô0Ü'¨Ó*¨fÔ4àˆIä# AÓ&¨&Ô0Ü'¨Ó*¨fÔ4áà„uØˆ	Ø„uÙØŒ6€Mˆ6Ùr   c                óJ   € V ^8„  d   QhR\         \        \        3,          RR/# )r   r-   r?   N)r   r/   r(   )r   s   "r   r   r   ª  s#   € ÷ ñ œ4¤¤Z Õ0ð °Tñ r   c           
     óV  € V P                  4        F”  w  rVR,           F‚  pVP                  R4      '       d   RRRRRRRR/VR,          R	&    K?  VP                  R
4      '       g   KJ  VR,           F  pRVR,          V,          R&   K  	  RRRRRRRR/VR,          R&    K’  	  K–  	  R# )zAdd builtin driver alternativesr-   rR   r   Tr   r   r   Fzxserver-xorg-video-nouveaurT  zxserver-xorg-video-atiN)rÔ   r‹   )r-   Údevicerô   r  Úds   &    r   r°  r°  ª  sÂ   € ð  Ÿ™ž‰ˆØ˜	—?�?ˆCð �~‰~˜h×'Ò'à˜DØ˜tØ! 4Ø! 5ð	A��Y•Ð <Ñ=ò ð �~‰~˜g×&Ô&Ø˜iŸ˜�AØ8=�D˜•O AÕ& }Ó5ñ )ð ˜DØ˜tØ! 4Ø! 4ð	=��Y•Ð 8Ñ9ò ó/ #ó (r   c                óD   € V ^8„  d   QhR\         P                  R\        /# r¾   ©rx   r�   r/   )r   s   "r   r   r   È  s   € ÷ <ñ <¤§¡ð <´3ñ <r   c                óN   € \         P                  ! V 4      pVP                  4       # )z0Return the linux headers for the system's kernel)r
   ÚKernelDetectionÚget_linux_headers_metapackage©rš   Úkernel_detections   & r   Úget_linux_headersr_  È  s"   € ä&×6Ò6°yÓAÐØ×9Ñ9Ó;Ð;r   c                óD   € V ^8„  d   QhR\         P                  R\        /# r¾   rY  )r   s   "r   r   r   Î  s   € ÷ :ñ :œwŸ}™}ð :´ñ :r   c                óN   € \         P                  ! V 4      pVP                  4       # ©z.Return the linux image for the system's kernel)r
   r[  Úget_linux_image_metapackager]  s   & r   Úget_linux_imagerd  Î  s"   € ä&×6Ò6°yÓAÐØ×7Ñ7Ó9Ð9r   c                óZ   € V ^8„  d   QhR\         P                  R\        \        ,          /# r¾   )rx   r�   r   r/   )r   s   "r   r   r   Ô  s"   € ÷ 0ñ 0¤§¡ð 0´8¼Cµ=ñ 0r   c                óN   € \         P                  ! V 4      pVP                  4       # rb  )r
   r[  Úget_linux_versionr]  s   & r   rg  rg  Ô  s"   € ä&×6Ò6°yÓAÐØ×-Ñ-Ó/Ð/r   c                óD   € V ^8„  d   QhR\         P                  R\        /# r¾   rY  )r   s   "r   r   r   Ú  s   € ÷ 4ñ 4œŸ™ð 4¬3ñ 4r   c                óN   € \         P                  ! V 4      pVP                  4       # )z4Return the linux metapackage for the system's kernel)r
   r[  Úget_linux_metapackager]  s   & r   Ú	get_linuxrk  Ú  s"   € ä&×6Ò6°yÓAÐØ×1Ñ1Ó3Ð3r   c                óF   € V ^8„  d   QhR\         R\        \         ,          /# )r   r  r?   rê   )r   s   "r   r   r   à  s   € ÷ ñ ¬cð ´h¼sµmñ r   c                 óÂ  € \         P                  ! V 4      p VP                  W,          4      p TP                  P                  R4       F,  pT F#  w  rVpTP                  R4      '       g   K  Tu u # 	  K.  	  R#   \         d"    \        P
                  ! R T,          4        R# i ; i  \        \        3 d"    \        P
                  ! RT,          4        R# i ; i)zNo candidate for %s foundNr¡   úlinux-image-z+Could not check dependencies for %s package)
rx   r¤   r¥   r£   rT   rU   r¦   r§   r‹   r¨   )rš   r  r®   r¯   r±   r²   r³   r´   s   &&      r   Úget_linux_image_from_metaro  à  sÉ   € Ü×Ò 	Ó*€HðØ×.Ñ.¨y­~Ó>ˆ	ð
MØ!×2Ñ2×6Ñ6°yÖAˆHÛ-5Ñ)� 6Ø×&Ñ& ~×6Ô6Ø#”Oó .6ñ Bñ& øô1 ô Ü�ŠÐ1°CÕ7Ô8Úðûô ”iÐ ô MÜ�ŠÐCÀsÕKÕLñ ðMús.   ˜A= °:B, Á/B, Á5B, Á=(B)Â(B)Â,.CÃCc                óF   € V ^8„  d   QhR\         R\        \         ,          /# )r   r¯   r?   rê   )r   s   "r   r   r      s"   € ÷ nñ n¼ð nÄÌÅñ nr   c                ó‚  € Vf   Q hRpRpRp\         P                  ! V 4      p\        V4      pVP                  '       g    \        P
                  ! RV,          4       V# VP                  4       '       d    \        P
                  ! RV,          4       V# \        V 4      p\        W4      pV'       d   VP                  RR4      pM\        P
                  ! RV,          4       V# VP                  4       p	RV	: RV: 2p
 W
,          pVP                  V4      pV'       d©   VP                  R	\        4       39   dŽ   \        V 4      pRV	: RV: 2p\        P
                  ! R
V,          4       W,          pVP                  V4      pV'       d;   VP                  R	\        4       39   d    \        P
                  ! RV,          4       T
pT'       d³   Y,          P                    Uu. uFF  pTP"                  P$                  P'                  R4      '       g   K0  TP"                  P$                  NKH  	  ppRp\        T 4      P                  RR4      pTR8X  d   RpRT	: RT: 2pT F  pTT8X  g   K  TpK  	  T'       d   TpT# RT	,          p\        P
                  ! RT,          4        T T,          pTP                  T4      pT'       d   TP                  R	\        4       39   d   TpT#   \         d    \        P
                  ! RT
4        ELGi ; iu upi   \         d    \        P(                  ! RT4        T# i ; i)zDReturn the linux-modules-$driver metapackage for the system's kernelNr:   zNNon NVIDIA linux-modules packages are not supported at this time: %s. Skippingrš  rn  z-No linux-image can be found for %s. Skipping.zlinux-modules-nvidia-Ú-rÁ   zlinux_modules_abi_candidate: %szFound ABI compatible %szNo "%s" can be found.ÚvirtualÚgenericznvidia-dkms-%szFalling back to %s)rx   r¤   r<   rJ   rT   rU   rc   rd  ro  r¢   rs   r¥   r›  rz   rg  r£   rª   r«   rP   r‹   rÓ   )rš   r¯   r8   Úlinux_flavourÚlinux_modules_matchr®   rt  Úlinux_image_metaÚlinux_imagerœ  Úlinux_modules_candidater›   r�  Úlinux_versionÚlinux_modules_abi_candidateÚabi_specificÚabi_specific_candidaterº   Úreverse_depsÚpickÚcandidate_suffixÚmodules_candidateÚdkms_packages   &&                     r   r  r     s  € àÒ Ð Ð Ø€KØ€MØÐä×Ò 	Ó*€Hä# IÓ.€KØ××ÐÜ�ŠØ\Øõô	
ð Ðà×+Ñ+×-Ò-Ü�ŠÐ=À	ÕIÔJØÐä& yÓ1Ðä+¨IÓH€KçØ#×+Ñ+¨N¸BÓ?‰ä�ŠÐEÈ	ÕQÔRØÐà#×/Ñ/Ó1ÑãÚðÐð
ØÕ4ˆà$×6Ñ6°wÓ?ÐçÐ!2×!7Ñ!7¸EÄ<Ã>Ð;RÔ!RÜ-¨iÓ8‰Mã!Úð+Ð'ô �MŠMØ1Ð5PÕQôð %ÕAˆLà%-×%?Ñ%?ÀÓ%MÐ"ß%Ð*@×*EÑ*EØÜ“ðJô +ô —’Ð7Ð;VÕWÔXØ&=Ð#÷ ð
 !Õ5×FÒFó
áF�Ø�~‰~×"Ñ"×-Ñ-Ð.E×Fô  ˆC�N‰N×ÔÙFð 	ð 
ð ˆÜ*¨9Ó5×=Ñ=¸nÈbÓQÐØ˜yÔ(Ø(ÐøãÚð
Ðó
  ˆCØÐ'Ö'Ø’ñ  ÷ ØˆKØÐð $Ð&7Õ7€LÜ‡M‚MÐ&¨,Õ7Ô8ð	Ø˜LÕ)ˆØ$×6Ñ6°wÓ?Ð÷ Ð!2×!7Ñ!7¸EÄ<Ã>Ð;RÔ!RØ&ˆKð
 Ðøô_ ô Ü�ŠÐ-Ð/FÔGÚðüò
øôD ô Ü�ŠÐ-¨|Ô<ØàÐð	ús7   Ã?C	K* Ç$-LÈLÊ)!L ËL Ë*"LÌLÌ"L>Ì=L>c                óF   € V ^8„  d   QhR\         R\        \         ,          /# )r   Úgrub_cfg_pathr?   rê   )r   s   "r   r   r   q  s   € ÷ ñ ¤#ð Ä(Ì3Å-ñ r   c                óv  €  \         P                  P                  V 4      '       g   \        P                  ! RV 4       R# \        V R4      ;_uu_ 4       pVP                  4       uuRRR4       #   + '       g   i     R# ; i  \        \        3 d%   p\        P                  ! RT 24        Rp?R# Rp?ii ; i)zÎLoad grub configuration file content.

Args:
    grub_cfg_path: Path to grub.cfg file (default: /boot/grub/grub.cfg)

Returns:
    String content of grub.cfg, or None if file doesn't exist or can't be read
z%Could not read %s in _load_grub_cfg()Nrì   zError loading grub.cfg: $)	rƒ   r†   ÚexistsrT   rU   r…   rˆ   r^  rŠ   )r„  r’   r“   s   &  r   Ú_load_grub_cfgr‡  q  s~   € ð	Ü�w‰w�~‰~˜m×,Ò,Ü�MŠMÐAÀ=ÔQÙä�- ×%Ô%¨Ø—6‘6“8÷ &×%×%Ó%ûä”WÐô Ü�ŠÐ1°!°Ð5Ô6Ýûðús@   ‚$B §B Á B ÁA/Á$
B Á/B 	Á:B Â B ÂB8ÂB3Â3B8c                óh   € V ^8„  d   QhR\         \        ,          R\        R\         \        ,          /# )r   Úgrub_contentÚ	entry_numr?   rÓ  )r   s   "r   r   r   †  s1   € ÷ Yñ YÜœ3•-ðYÜ,/ðYäŒc…]ñYr   c                ó´  € V '       g   R# Rp V P                  R4      pRpVP                  4       '       Egr   . pV EF  pVP                  4       P                  R4      '       d|   RV,           R,           VP                  4       9   gG   RV,           R,           VP                  4       9   g$   RV,           R,           VP                  4       9   d   VP                  4       pK¤  VP                  4       P                  R4      '       g   KË  V'       g   KÕ  \        P
                  ! W&4      pV'       d!   VP                  VP                  ^4      4       RpEK  	  \        V4      ^8X  d
   V^ ,          # \        V4      ^8”  d   \        R	\        V4      ,           4       R# \        R
4       R# . pV F«  pVP                  4       P                  R4      '       d   VP                  4       pK:  VP                  4       P                  R4      '       g   Ka  V'       g   Kk  \        P
                  ! W&4      pV'       d!   VP                  VP                  ^4      4       RpK­  	  \        V4      p	^ T	u;8:  d   \        V4      8  d   M MW‰,          # \        P                  ! R4       R#   \        \        3 d%   p
\        P                  ! RT
 24        Rp
?
R# Rp
?
ii ; i)a  Parse grub configuration content to find kernel version for given entry.

Args:
    grub_content: Content of grub.cfg file as string
    entry_num: Entry identifier - either numeric index (as string) or entry ID

Returns:
    Kernel version string, or None if not found
Nzlinux\s+.*vmlinuz-([^\s]+)rù  Ú	menuentryÚ Ú'Ú"ÚlinuxzCCould not determine which of the following kernels will boot next: zHCould not determine which kernel will boot next from /boot/grub/grub.cfgz:Could not determine kernel in _parse_grub_cfg_for_kernel()z'Error in _parse_grub_cfg_for_kernel() $)rŒ   Úisdigitr‰   r‹   rV   r9  r¸  rZ   r  Úprintr/   rY   rT   rU   rÒ   Ú
IndexError)r‰  rŠ  Úvmlinuz_entry_regexÚlinesÚcurrent_entryÚmatchesr•   rX   Úmenu_entriesÚ	entry_idxr“   s   &&         r   Ú_parse_grub_cfg_for_kernelrš  †  s%  € ÷ Ùà7ÐðIØ×"Ñ" 4Ó(ˆØˆð × Ñ ×"Ó"ØˆGÜ�Ø—:‘:“<×*Ñ*¨;×7Ò7Ø˜9•_ sÕ*¨t¯z©z«|Ô;Ø˜i�¨#Õ-°$·*±*³,Ô>Ø˜i�¨#Õ-°$·*±*³,Ô>à$(§J¡J£L’MØ—Z‘Z“\×,Ñ,¨W×5Ô5¿-¹-äŸIšIÐ&9Ó@�EßØŸ™ u§{¡{°1£~Ô6Ø$(“Mñ ô" �7‹|˜qÔ Ø˜q•zÐ!Ü�W“ Ô!ÜØYÜ˜'“lõ#ôñ äØ^ôñ ð ˆÛˆDØ�z‰z‹|×&Ñ& {×3Ò3Ø $§
¡
£’Ø—‘“×(Ñ(¨×1Ô1·m±mäŸ	š	Ð"5Ó<�ßØ ×'Ñ'¨¯©°A«Ô7Ø $’ñ ô ˜	“Nˆ	Ø�	Ö-œC Ó-×-ØÕ*Ð*ä�ŠÐRÔSÙøÜœ
Ð#ô Ü�ŠÐ?À¸sÐCÔDÝûðúsP   Ž)J" ¸C
J" ÄJ" ÄAJ" Å/+J" ÆJ" Æ)A J" ÈJ" ÈA1J" Ê
J" Ê"KÊ3KËKc                óF   € V ^8„  d   QhR\         R\        \         ,          /# )r   rŠ  r?   rê   )r   s   "r   r   r   â  s   € ÷ ?ñ ?¬3ð ?´8¼Cµ=ñ ?r   c                ó8   € \        4       pVf   R# \        W4      # )zÑConvert grub entry number to kernel version by parsing grub.cfg.

Args:
    entry_num: Entry identifier - either numeric index (as string) or entry ID

Returns:
    Kernel version string, or None if not found
N)r‡  rš  )rŠ  r‰  s   & r   Ú_get_kernel_from_grub_entryr�  â  s    € ô "Ó#€LØÒÙÜ% lÓ>Ð>r   c                ó:   € V ^8„  d   QhR\         \        ,          /# r_   rÓ  )r   s   "r   r   r   ñ  s   € ÷ 1ñ 1¤(¬3¥-ñ 1r   c            
     ó4  €  Rp \         P                  P                  V 4      '       g   \        P                  ! R4       R# \        V R4      ;_uu_ 4       pV EF¿  pVP                  R4      '       g   K  VP                  R^4      ^,          P                  4       P                  R4      pVP                  4       '       d   \        V4      u uuRRR4       # VR8X  dß   R	p\         P                  P                  V4      '       d·   \        VR4      ;_uu_ 4       pV F’  pVP                  R
4      '       g   K  VP                  R^4      ^,          P                  4       pRV9   d(   VP                  R^4      ^,          P                  4       p\        V4      u uuRRR4       u uuRRR4       # 	  RRR4       M\M[RV9   d>   \        P                  ! RV4      pV'       d   VP                  ^4      u uuRRR4       # M\        V4      u uuRRR4       #  M	  RRR4       \        P                  ! R4       R#   + '       g   i     L4; i  + '       g   i     L;; i  \        \        3 d%   p	\        P                  ! RT	 24        Rp	?	R# Rp	?	ii ; i)z@Get the actual grub default entry by checking grub configurationz/etc/default/grubz>Could not read /etc/default/grub in _get_actual_grub_default()Nrì   zGRUB_DEFAULT=r€   z"'Úsavedz/boot/grub/grubenvzsaved_entry=Ú>zvmlinuz-zvmlinuz-([^\s]+)z%Error in _get_actual_grub_default() $)rƒ   r†   r†  rT   rU   r…   r‹   rŒ   r‰   r‘  r�  rV   r9  rZ   r^  rŠ   )
Úgrub_default_pathr’   r•   Údefault_valÚgrubenv_pathÚf2Úenv_linerŠ  rX   r“   s
             r   Ú_get_actual_grub_defaultr§  ñ  s  € ð/à/ÐÜ�w‰w�~‰~Ð/×0Ò0Ü�MŠMØPôñ äÐ# S×)Ô)¨QÜ�Ø—?‘? ?×3Ô3Ø"&§*¡*¨S°!Ó"4°QÕ"7×"=Ñ"=Ó"?×"EÑ"EÀeÓ"L�Kà"×*Ñ*×,Ò,ä:¸;ÓGÑG÷ *Ò)ð %¨Ô/à';˜ÜŸ7™7Ÿ>™>¨,×7Ò7Ü!% l°C×!8Ô!8¸BÛ02 HØ'/×':Ñ':¸>×'JÔ'JØ4<·N±NÀ3ÈÓ4JÈ1Õ4M×4SÑ4SÓ4U¨	ð ,/°)Ô+;Ø8@¿¹ÀsÈAÓ8NØ01õ9.ç.3©e«gð -6ô 0KÈ9Ó/UÑ(U÷ "9Ó!8÷ *Ò)ñ 13÷ "9Ð!8ð 8ð $ {Ô2ä "§	¢	Ð*=¸{Ó K˜ß Ø#(§;¡;¨q£>Ñ1÷7 *Ò)ð4 !ô  ;¸;ÓGÑG÷= *Ò)ñ> ñ= ÷ *ôB 	�ŠÐVÔWÙ÷- "9×!8ú÷ *×)ûôH ”WÐô Ü�ŠÐ=¸a¸SÐAÔBÝûðús¨   ‚&I" ©I" ÁI" ÁIÁ5AIÃIÃ
I" Ã-IÄIÄH<Ä9A!H<ÆIÆ&
I" Æ1H<Æ3/IÇ#IÇ5
I" È IÈ
I" ÈIÈI" È<IÉIÉI	ÉI" É"JÉ3JÊJc                ó\   € V ^8„  d   QhR\         \        ,          R\         \        ,          /# )r   Úkernel_versionr?   rÓ  )r   s   "r   r   r   %	  s$   € ÷  ñ  ÜœS•Mð äŒc…]ñ r   c                óÖ  € V '       g   \         P                  ! R4       R# RV  2p\        P                  P	                  V4      '       g   \         P                  ! RV R24       R# \
        P                  ! RVRRR	R
.R\
        P                  R7      pVP                  4       P                  R4      pV'       d   V^ ,          '       d
   V^ ,          # \         P                  ! R4       R# )zŸReturn the path to the NVIDIA kernel module for a given kernel version, if present.

Uses find to search for nvidia.ko* files in the kernel modules directory.
zGKernel not known, giving up on _resolve_nvidia_module_path_for_kernel()Nz/lib/modules/zModule directory z does not existr[   z-namez
nvidia.ko*z-typer’   T)rg  rW  rù  z6_resolve_nvidia_module_path_for_kernel() returned None)
rT   rU   rƒ   r†   r†  rY  rk  ÚDEVNULLr‰   rŒ   )r©  Úmodules_dirrÚ   r—  s   &   r   Ú&_resolve_nvidia_module_path_for_kernelr­  %	  s¿   € ÷ Ü�ŠØUô	
ñ à! .Ð!1Ð2€KÜ�7‰7�>‰>˜+×&Ò&Ü�ŠÐ)¨+¨°oÐFÔGÙô ×$Ò$Ø	�˜g |°W¸cÐBØÜ×!Ñ!ô€Fð �l‰l‹n×"Ñ" 4Ó(€Gß�7˜1—:”:Ø�q�zÐä‡M‚MÐJÔKÙr   c                óF   € V ^8„  d   QhR\         \        \        3,          /# r_   ©r   r/   r   )r   s   "r   r   r   H	  s   € ÷ Lñ L¤D¬¬c¨¥Nñ Lr   c                 óP  € RRRRRRRRRRRR/p  \         P                  ! R	.R
R7      pRV R&   VP                  4        F2  pVP                  4       pV'       g   K  V^ ,          R8X  g   K-  R
V R&    M	   V R,          '       dw    \         P                  ! RR.R
R7      pVP                  4        FF  pVP                  R4      '       g   K  VP                  R^4      ^,          P                  4       V R&    M	   \        4       V R&   V R,          '       g   RV R&   RV R&   RV R&   V # \        P                  ! 4       P                  p\        V R,          ;'       d    V R,          V8g  4      V R&   \        V R,          4      pV'       d   WpR&   V # R
V R&   RV R,          /V R&   V #   \         P                  \
        3 d%   p\        P                  ! RT 24        Rp?ELiRp?ii ; i  \         P                  \
        3 d%   p\        P                  ! RT 24        Rp?EL&Rp?ii ; i)aB  Check NVIDIA module status and kernel compatibility.

Returns:
    dict: Contains information about NVIDIA module status:
        - 'loaded': bool - Whether nvidia module is currently loaded
        - 'current_module_path': str or None - Path to current nvidia module
        - 'next_boot_kernel': str or None - Next boot kernel version
        - 'next_boot_module_path': str or None - Path to nvidia module for next boot kernel
        - 'needs_reboot': bool - Whether a reboot is needed
        - 'module_missing': bool - Whether nvidia module is missing for next boot kernel
ÚloadedFÚcurrent_module_pathNÚnext_boot_kernelÚnext_boot_module_pathÚneeds_rebootÚmodule_missingÚlsmodTrf  rR   z#Exception in loaded module check: $rU  z	filename:rÆ   z!Exception in module path check: $Úchecked_kernelÚ
debug_info)rY  rk  rl  rŒ   r`  r_  rT   rU   r‹   r‰   r§  rƒ   ÚunameÚreleaser   r­  )rÚ   Úlsmod_outputr•   Úpartsr“   Úmodinfo_outputÚcurrent_kernelÚ	next_paths           r   Úcheck_nvidia_module_statusrÁ  H	  s5  € ð 	�%Ø˜tØ˜DØ Ø˜Ø˜%ð€FðÜ!×.Ò.°¨yÈTÔRˆà ˆˆxÑØ ×+Ñ+Ö-ˆDð —J‘J“LˆEß‰u˜˜q� XÖ-Ø#'��xÑ Ùò .ð ˆh×Ôð
	Ü'×4Ò4Ø˜HÐ%¸$ôˆNð '×1Ñ1Ö3�Ø—?‘? ;×/Ô/Ø48·J±J¸sÀAÓ4FÀqÕ4I×4OÑ4OÓ4Q�FÐ0Ñ1Ùò 4ô ":Ó!;€FÐÑð Ð$×%Ô%Ø!&ˆˆ~ÑØ#(ˆÐÑ Ø*.ˆÐ&Ñ'Øˆä—X’X“Z×'Ñ'€NÜ!ØÐ!Õ"×SÐS vÐ.@Õ'AÀ^Ñ'Só€Fˆ>Ñô
 7°vÐ>PÕ7QÓR€IßØ*3Ð&Ñ'ð €Mð	 $(ˆÐÑ à 0°&Ð9KÕ2LÐMˆˆ|Ñà€MøôU ×)Ñ)Ô+<Ð=ô Ü�ŠÐ;¸A¸3Ð?Ô@Ýûðûô ×-Ñ-Ô/@ÐAô 	Ü�MŠMÐ=¸a¸SÐAÔBÝûð	úsO   �AF$ ÁF$ Á+F$ Á2F$ ÂAG& Ã+G& Ã7G& Æ$G#Æ?GÇG#Ç&H%ÈH È H%c                óF   € V ^8„  d   QhR\         \        \        3,          /# r_   r¯  )r   s   "r   r   r   —	  s   € ÷ ,ñ ,¤$¤s¬C x¥.ñ ,r   c            
     óà  € RRR. R. RRRR/p \         P                  ! 4        \         P                  ! 4         \         P                  ! R4      p\        TR4      ;'       g    \        TR4      T R&   \        TR	4      T R&   T R,          '       d    \        4       T R&   T # T #   \         d   p\        T4      T R&   T u Rp?# Rp?ii ; i  \         d   p\        T4      T R&    Rp?T # Rp?ii ; i)
a®  Gather data for the welcome page.

Returns:
    dict: A dictionary containing:
        - cache_error: Error message if cache couldn't be loaded, or None
        - nvidia_drivers: List of installed NVIDIA driver packages
        - oem_packages: List of installed OEM packages
        - nvidia_status: NVIDIA module status dict, or None if not applicable
        - nvidia_status_error: Error message if status check failed, or None
Úcache_errorNÚnvidia_driversÚoem_packagesÚnvidia_statusÚnvidia_status_errorznvidia-driver-*zlinux-modules-nvidia-*r†  )rx   Úinit_configÚinit_systemr�   rõ   r/   r¼  rÁ  )Údatarö  rŽ  r“   s       r   Úgather_welcome_page_datarÌ  —	  s  € ð 	�tØ˜"Ø˜Ø˜Ø˜tð€Dô ×ÒÔÜ×ÒÔðÜ—’˜dÓ#ˆô <ØÐ ó÷ Ið Iä	'¨Ð/GÓ	Hð 	Ð	Ñô
 :¸%ÀÓN€DˆÑð Ð×Ôð	1Ü$>Ó$@ˆD�Ñ!ð €Kˆ4€Køô' ô Ü! "›gˆˆ]ÑØ�ûðûô  ô 	1Ü*-¨a«&ˆDÐ&Õ'à€Kûð	1ús5   ¸B! ÂC	 Â!CÂ,CÂ;CÃCÃ	C-ÃC(Ã(C-ra   )NNFT)NNTrj  )NNF)NFTr:   FrÚ  )TT)r:   TF)z/boot/grub/grub.cfg)Wr!   rƒ   rT   rÖ   rY  r‹  rV   rò   Útypingr   r   r   r   r   r   r   r	   rx   ÚUbuntuDriversr
   r   r(   r2   rw   r‰  ræ   Úobjectr<   rz   r˜   r¼   rã   rç   rú   r  r  r  r$  r*  r2  r:  rJ  rQ  ra  rp  ru  r  r‘  r   rž  r¡  r¥  r­  r´  r¼  rÅ  rÈ  rÎ  rÐ  rè  rô  r
  r  r  r!  rÃ  r�  r8  r;  rD  rG  rŒ  r©  r°  r_  rd  rg  rk  ro  r  r‡  rš  r�  r§  r­  rÁ  rÌ  r   r   r   Ú<module>rÐ     sÖ  ðÙ Mó 
Û Û Û Û Û 	Û ß C× CÑ CÝ  ã å )ô� %õ ô� %õ ô�) 5õ ð  Ð Ø€Ø>Ð ôJ˜ô JõZ÷-õ`EõP;õ|&õ÷>'(õTõ:	õõ<õ8õ:!õH
õ6õ(õVõ@õ$
÷cõLõõD#÷LB÷JR÷j^õB&÷,õ.õ:ô:�6ô :õ" ÷F÷.[õ|÷,8÷v}H÷@:H÷zDõNõõõBõBTõn<õ~õ<<õ:õ0õ4õõ@n÷bõ*Yõx?õ1õh õFL÷^,r   