Ë
    š„j‚æ  ã                   óà  — d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZ	d dl
Z	d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZmZ ddlmZmZmZ ddlmZm Z m!Z! ddl"m#Z#m$Z$ ddl%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ ddl0m1Z1 dd	l2m3Z3 h d
£Z4e4ddhz  Z5 G d„ de1«      Z6d„ Z7 G d„ de'«      Z8d„ Z9d e6«       fdddœd„Z:d„ Z;d„ Z<d„ Z=d„ Z>d„ Z?d„ Z@ G d„ d«      ZAdddœd„ZB G d„ d eA«      ZC G d!„ d"eA«      ZD G d#„ d$eA«      ZEd%„ ZF G d&„ d'eG«      ZH G d(„ d)«      ZId*„ ZJd+„ ZKd,„ ZLd-„ ZMd e6«       fd.„ZN G d/„ d0e«      ZO G d1„ d2e«      ZPePj¢                  j¥                  «       ZSd3„ ZTd4„ ZUd5„ ZVd6„ ZWd7„ ZXd8„ ZYd9„ ZZd:„ Z[d;„ Z\dKd<„Z]dLd=„Z^d>„ Z_d?„ Z`d@„ ZadA„ ZbdB„ ZcdC„ ZddD„ ZedE„ ZfdMdF„Zg G dG„ dHe	jÐ                  jÒ                  «      Zj G dI„ dJe	jÖ                  jØ                  «      Zmy)Né    N)ÚEnumÚautoé   )Úaes_cbc_decrypt_bytesÚ aes_gcm_decrypt_and_verify_bytesÚunpad_pkcs7)Ú!_SECRETSTORAGE_UNAVAILABLE_REASONÚsecretstorageÚsqlite3)ÚMultilinePrinterÚQuietMultilinePrinter)
ÚDownloadErrorÚYoutubeDLErrorÚPopenÚerror_to_strÚexpand_pathÚis_path_likeÚsanitize_urlÚstr_or_noneÚtry_callÚwrite_string)Ú
_YDLLogger)Únormalize_url>   ÚedgeÚbraveÚoperaÚwhaleÚchromeÚvivaldiÚchromiumÚfirefoxÚsafaric                   ó<   ‡ — e Zd Zdˆ fd„	Z G d„ de«      Zd„ Zˆ xZS )Ú	YDLLoggerc                 ó&   •— t         ‰| �  ||¬«      S )N)Úonce)ÚsuperÚwarning)ÚselfÚmessageÚ	only_onceÚ	__class__s      €úE/var/www/html/GAP/venv/lib/python3.12/site-packages/yt_dlp/cookies.pyr(   zYDLLogger.warning6   s   ø€ Ü‰w‰˜w¨YˆÓ7Ð7ó    c                   ó   — e Zd Zd\  ZZd„ Zy)úYDLLogger.ProgressBar)gš™™™™™¹?r   c                 ó¾   — t        j                   «       | j                  z
  | j                  kD  r/| j                  d|› �d«       t        j                   «       | _        y y )Nz
[Cookies] r   )ÚtimeÚ_timerÚ_DELAYÚprint_at_line)r)   r*   s     r-   ÚprintzYDLLogger.ProgressBar.print<   sF   € Ü�y‰y‹{˜TŸ[™[Ñ(¨4¯;©;Ò6Ø×"Ñ" Z°¨yÐ#9¸1Ô=Ü"Ÿi™i›k�•ð 7r.   N)Ú__name__Ú
__module__Ú__qualname__r4   r3   r6   © r.   r-   ÚProgressBarr0   9   s   „ Ø‰ˆ�ó	*r.   r;   c                 óZ  — | j                   rJ| j                   j                  j                  d«      s%| j                   j                  j                  d«      ry| j                   j                  j                  }	 |j                  «       sy	 | j                  |d¬«      S # t        $ r Y yw xY w)z8Return a context manager with a print method. (Optional)Ú
noprogressÚloggerNF)Úpreserve_output)Ú_ydlÚparamsÚgetÚ
_out_filesÚerrorÚisattyÚBaseExceptionr;   )r)   Úfiles     r-   Úprogress_barzYDLLogger.progress_barA   s”   € ð �yŠy˜DŸI™I×,Ñ,×0Ñ0°Ô>À$Ç)Á)×BRÑBR×BVÑBVÐW_ÔB`ØØ�y‰y×#Ñ#×)Ñ)ˆð	Ø—;‘;”=Øð !ð ×Ñ °eÐÓ<Ð<øô ò 	Ùð	ús   Á9B Â	B*Â)B*©F)r7   r8   r9   r(   r   r;   rH   Ú__classcell__©r,   s   @r-   r$   r$   5   s   ø„ õ8ô*Ð&ô *ö=r.   r$   c                 ój   — t        | d«      r| j                  «       }|r|S t        «       }d„ |_        |S )NrH   c                  ó   — y ©Nr:   )Ú_s    r-   ú<lambda>z&_create_progress_bar.<locals>.<lambda>U   s   � r.   )ÚhasattrrH   r   r6   )r>   Úprinters     r-   Ú_create_progress_barrS   O   s6   € Üˆv�~Ô&Ø×%Ñ%Ó'ˆÙØˆNÜ#Ó%€GÙ"€G„MØ€Nr.   c                   ó   — e Zd Zy)ÚCookieLoadErrorN©r7   r8   r9   r:   r.   r-   rU   rU   Y   ó   „ Ør.   rU   c           	      ó”  — 	 g }|�5t        |Ž \  }}}}|j                  t        ||t        |«      ||¬«      «       | �jt	        | «      }|rt        | «      } t        | «      }	|r$t        j                  | t        j                  «      r|	j                  «        |j                  |	«       t        |«      S # t        $ r t        d«      ‚w xY w)N©ÚkeyringÚ	containerzfailed to load cookies)Ú_parse_browser_specificationÚappendÚextract_cookies_from_browserr$   r   r   ÚYoutubeDLCookieJarÚosÚaccessÚR_OKÚloadÚ_merge_cookie_jarsÚ	ExceptionrU   )
Úcookie_fileÚbrowser_specificationÚydlÚcookie_jarsÚbrowser_nameÚprofilerZ   r[   Úis_filenameÚjars
             r-   Úload_cookiesrn   ]   sÅ   € ð8ØˆØ Ð,Ü8TÐVkÐ8lÑ5ˆL˜' 7¨IØ×ÑÜ,¨\¸7ÄIÈcÃNÐ\cÐoxÔyô{ð Ð"Ü& {Ó3ˆKÙÜ)¨+Ó6�ä$ [Ó1ˆCÙ¤"§)¡)¨K¼¿¹Ô"AØ—‘”
Ø×Ñ˜sÔ#ä! +Ó.Ð.øÜò 8ÜÐ6Ó7Ð7ð8ús   ‚B/B2 Â2CrY   c                ó�   — | dk(  rt        |||«      S | dk(  rt        ||«      S | t        v rt        | |||«      S t	        d| › �«      ‚)Nr!   r"   zunknown browser: )Ú_extract_firefox_cookiesÚ_extract_safari_cookiesÚCHROMIUM_BASED_BROWSERSÚ_extract_chrome_cookiesÚ
ValueError)rj   rk   r>   rZ   r[   s        r-   r^   r^   t   s[   € Ø�yÒ Ü'¨°¸FÓCÐCØ	˜Ò	!Ü& w°Ó7Ð7Ø	Ô0Ñ	0Ü& |°W¸gÀvÓNÐNäÐ,¨\¨NÐ;Ó<Ð<r.   c                 óŒ  ‡— d}|j                  d«       t        s|j                  d«       t        «       S | €t	        t        «       «      }nDt        | «      r| g}n5t        «       D �cg c]"  }t        j                  j                  || «      ‘Œ$ }}dj                  t        t        |«      «      }t        t        |«      «      }|€t        d|› �«      ‚|j                  d|› d�«       d }‰dvrýt        j                  j                  t        j                  j!                  |«      d	«      }	t        j                  j#                  |	«      r$t        j$                  |	t        j&                  «      st        d
|› �«      ‚t)        |	d¬«      5 }
t+        j,                  |
«      j/                  dg «      }d d d «       t1        ˆfd„D «       d «      }t3        |t4        «      st7        d‰› d�«      ‚t9        j:                  d¬«      5 }t=        ||«      }t?        j@                  |jB                  «      5  |jE                  d«      jG                  «       d   }||kD  r|j                  d|› �«       n|j                  d|› �«       t3        |t4        «      r3|j                  d‰› d|› �«       |jE                  dd|› �d|› d�f«       n9‰dk(  r#|j                  d«       |jE                  d«       n|jE                  d«       t        «       }tI        |«      5 }|jK                  «       }tM        |«      }tO        |«      D ]’  \  }\  }}}}}}|jQ                  d |d!›d"|d!›�«       |d#k\  r|�|d$z  }tR        jT                  jW                  d||d d%|tY        |«      |j[                  d&«      |tY        |«      ||d%d d i ¬'«      }|j]                  |«       Œ” 	 d d d «       |j                  d(tM        |«      › d)�«       |cd d d «       cd d d «       S c c}w # 1 sw Y   �Œ^xY w# 1 sw Y   ŒMxY w# 1 sw Y   nxY w	 d d d «       y # 1 sw Y   y xY w)*Né   zExtracting cookies from firefoxzzCannot extract cookies from firefox without sqlite3 support. Please use a Python interpreter compiled with sqlite3 supportz, z+could not find firefox cookies database in úExtracting cookies from: "ú")NÚnonezcontainers.jsonz"could not read containers.json in Úutf8©ÚencodingÚ
identitiesc              3   ó†   •‡K  — | ]7  Š‰‰j                  d «      t        ˆfd„«      fv sŒ%‰j                  d«      –— Œ9 y­w)Únamec                  óR   •— t        j                  d‰ d   «      j                  «       S )NzuserContext([^\.]+)\.labelÚl10nID)ÚreÚ	fullmatchÚgroup)Úcontexts   €r-   rP   z4_extract_firefox_cookies.<locals>.<genexpr>.<lambda>ž   s"   ø€ œRŸ\™\Ð*GÈÐQYÑIZÓ[×aÑaÓc€ r.   ÚuserContextIdN)rB   r   )Ú.0r…   r[   s    @€r-   ú	<genexpr>z+_extract_firefox_cookies.<locals>.<genexpr>œ   sB   ùè ø€ ò ¸gÐW`Ø�K‰K˜ÓÜÓcÓdðe
ò X
˜WŸ[™[¨×9ñ ùs
   „&A«Az"could not find firefox container "z" in containers.jsonÚyt_dlp©ÚprefixzPRAGMA user_version;r   z7Possibly unsupported firefox cookies database version: z"Firefox cookies database version: z-Only loading cookies from firefox container "z", ID zzSELECT host, name, value, path, expiry, isSecure FROM moz_cookies WHERE originAttributes LIKE ? OR originAttributes LIKE ?z%userContextId=z&%ry   z3Only loading cookies not belonging to any containerztSELECT host, name, value, path, expiry, isSecure FROM moz_cookies WHERE NOT INSTR(originAttributes,'userContextId=')zASELECT host, name, value, path, expiry, isSecure FROM moz_cookiesúLoading cookie ú 6dú/é   iè  Fú.©Úversionr   ÚvalueÚportÚport_specifiedÚdomainÚdomain_specifiedÚdomain_initial_dotÚpathÚpath_specifiedÚsecureÚexpiresÚdiscardÚcommentÚcomment_urlÚrestú
Extracted z cookies from firefox)/Úinfor   r(   r_   ÚlistÚ_firefox_browser_dirsÚ_is_pathr`   r™   ÚjoinÚmapÚreprÚ_newestÚ_firefox_cookie_dbsÚFileNotFoundErrorÚdebugÚdirnameÚisfilera   rb   ÚopenÚjsonrc   rB   ÚnextÚ
isinstanceÚintrt   ÚtempfileÚTemporaryDirectoryÚ_open_database_copyÚ
contextlibÚclosingÚ
connectionÚexecuteÚfetchonerS   ÚfetchallÚlenÚ	enumerater6   ÚhttpÚ	cookiejarÚCookieÚboolÚ
startswithÚ
set_cookie)rk   r[   r>   ÚMAX_SUPPORTED_DB_SCHEMA_VERSIONÚsearch_rootsr™   Úsearch_rootÚcookie_database_pathÚcontainer_idÚcontainers_pathÚ
containersr}   ÚtmpdirÚcursorÚdb_schema_versionrm   rH   ÚtableÚtotal_cookie_countÚiÚhostr   r“   ÚexpiryÚ	is_secureÚcookies    `                        r-   rp   rp      s0  ø€ Ø&(Ð#à
‡K�KÐ1Ô2ÝØ�‰ð Wô 	Xä!Ó#Ð#à€ÜÔ1Ó3Ó4‰Ü	�'Ô	Ø�y‰ä@UÓ@WÖX¸œŸ™Ÿ™ T¨7Õ3ÐXˆÐXØ—)‘)œC¤ lÓ3Ó4€Kä"Ô#6°|Ó#DÓEÐØÐ#ÜÐ"MÈkÈ]Ð [Ó\Ð\Ø
‡L�LÐ-Ð.BÐ-CÀ1ÐEÔFà€LØ˜Ñ&ÜŸ'™'Ÿ,™,¤r§w¡w§¡Ð7KÓ'LÐN_Ó`ˆÜ�w‰w�~‰~˜oÔ.´b·i±iÀÔQS×QXÑQXÔ6YÜ#Ð&HÈÈÐ$VÓWÐWÜ�/¨FÔ3ð 	E°zÜŸ™ :Ó.×2Ñ2°<ÀÓDˆJ÷	Eäó Èô ð óˆô ˜,¬Ô,ÜÐAÀ)ÀÐL`ÐaÓbÐbä	×	$Ñ	$¨HÔ	5ð %¸Ü$Ð%9¸6ÓBˆÜ×Ñ × 1Ñ 1Ó2ñ #	Ø &§¡Ð/EÓ F× OÑ OÓ QÐRSÑ TÐØ Ð#BÒBØ—‘Ð!XÐYjÐXkÐlÕmà—‘ÐAÐBSÐATÐUÔVÜ˜,¬Ô,Ø—‘ØCÀIÀ;ÈfÐUaÐTbÐcôeà—‘ð QØ& | nÐ5¸ÈÈÐVXÐ7YÐZõ\ð ˜fÒ$Ø—‘ÐRÔSØ—‘ð KõLð —‘ÐbÔcÜ$Ó&ˆCÜ% fÓ-ð +°ØŸ™Ó)�Ü%(¨£ZÐ"ÜGPÐQVÓGWò +ÑC�AÑC˜˜d E¨4°¸Ø ×&Ñ&¨¸¸3¸¸qÐASÐTWÐ@XÐ'YÔZð )¨BÒ.°6Ð3EØ $™˜Ü!Ÿ^™^×2Ñ2Ø !¨°EÀÐUZØ#´d¸4³jÐUY×UdÑUdÐehÓUiØ!´$°t³*ÀYÐX^ÐhmØ $°$¸Rð	 3ó A�Fð
 —N‘N 6Õ*ñ+÷+ð �K‰K˜*¤S¨£X JÐ.CÐDÔEØ÷G#	ð #	÷%ñ %ùò- Y÷	Eñ 	Eú÷<+ð +ú÷'#	ð #	úð #	÷%÷ %ñ %úsP   Á''PÆ	&PÈ,P:È-C"P$ÌB<PÏ'P$Ï3	P:ÐPÐP!ÐP$Ð$P-	Ð)P:Ð:Qc               #   óª  K  — t         j                  dv r-t        t        j                  j
                  d«      E d {  –—†  y t         j                  dk(  r"t        j                  j                  d«      –— y t        t        j                  j                  t        j                  j                  t        «       d«      dddd	f«      E d {  –—†  y 7 Œ’7 Œ­w)
N©ÚcygwinÚwin32)z"%APPDATA%\Mozilla\Firefox\Profilesza%LOCALAPPDATA%\Packages\Mozilla.Firefox_n80bbvh6b1yt2\LocalCache\Roaming\Mozilla\Firefox\ProfilesÚdarwinz.~/Library/Application Support/Firefox/Profileszmozilla/firefoxz~/.mozilla/firefoxz5~/.var/app/org.mozilla.firefox/config/mozilla/firefoxz/~/.var/app/org.mozilla.firefox/.mozilla/firefoxz&~/snap/firefox/common/.mozilla/firefox)	ÚsysÚplatformr§   r`   r™   Ú
expandvarsÚ
expanduserr¦   Ú_config_homer:   r.   r-   r¤   r¤   Ë   s­   è ø€ Ü
‡|�|Ð*Ñ*Ü”r—w‘w×)Ñ)ð ,
ó ÷ 	ñ 	ô
 
�‰˜Ò	!Ü�g‰g× Ñ Ð!QÓRÓRô ”r—w‘w×)Ñ)ô �G‰G�L‰Lœ›Ð):Ó;à àCØ=à4ð,
ó ÷ 	ñ 	ð	øð	ús"   ‚:C¼C½BCÃ	CÃ
CÃCc           	   #   óè   K  — t        t        j                  j                  | «      D ]E  }dD ]>  }t	        j
                  t        j                  j                  ||d«      «      E d {  –—†  Œ@ ŒG y 7 Œ	­w)N)Ú z*/zProfiles/*/zcookies.sqlite)r§   r`   r™   ÚabspathÚglobÚiglobr¦   )ÚrootsÚrootÚpatterns      r-   rª   rª   ä   s^   è ø€ Ü”B—G‘G—O‘O UÓ+ò QˆØ0ò 	QˆGÜ—z‘z¤"§'¡'§,¡,¨t°WÐ>NÓ"OÓP×PÑPñ	QñQàPús   ‚A$A2Á&A0Á'
A2c           
      ó
  — t         j                  dv �rt        j                  j	                  d«      }t        j                  j	                  d«      }t        j                  j                  |d«      t        j                  j                  |d«      t        j                  j                  |d«      t        j                  j                  |d«      t        j                  j                  |d«      t        j                  j                  |d	«      t        j                  j                  |d
«      dœ|    }�nût         j                  dk(  rÿt        j                  j                  d«      }t        j                  j                  |d«      t        j                  j                  |d«      t        j                  j                  |d«      t        j                  j                  |d«      t        j                  j                  |d«      t        j                  j                  |d«      t        j                  j                  |d«      dœ|    }nét        «       }t        j                  j                  |d«      t        j                  j                  |d«      t        j                  j                  |d«      t        j                  j                  |d«      t        j                  j                  |d«      t        j                  j                  |d«      t        j                  j                  |d«      dœ|    }dddt         j                  dk(  rdndt         j                  dk(  rdndt         j                  dk(  rdndddœ|    }dh}||| |vdœS ) Nr×   z%LOCALAPPDATA%z	%APPDATA%z%BraveSoftware\Brave-Browser\User DatazGoogle\Chrome\User DatazChromium\User DatazMicrosoft\Edge\User DatazOpera Software\Opera StablezVivaldi\User DatazNaver\Naver Whale\User Data)r   r   r    r   r   r   r   rÚ   z~/Library/Application SupportzBraveSoftware/Brave-BrowserzGoogle/ChromeÚChromiumzMicrosoft Edgezcom.operasoftware.OperaÚVivaldizNaver/Whalezgoogle-chromer    zmicrosoft-edger   r   znaver-whaleÚBraveÚChromeÚOperaÚWhale)Úbrowser_dirÚkeyring_nameÚsupports_profiles)rÛ   rÜ   r`   r™   rÝ   r¦   rÞ   rß   )rj   Úappdata_localÚappdata_roamingrï   ÚappdataÚconfigrð   Úbrowsers_without_profiless           r-   Ú$_get_chromium_based_browser_settingsr÷   ê   s’  € ä
‡|�|Ð*Ò*ÜŸ™×*Ñ*Ð+;Ó<ˆÜŸ'™'×,Ñ,¨[Ó9ˆä—W‘W—\‘\ -Ð1YÓZÜ—g‘g—l‘l =Ð2LÓMÜŸ™Ÿ™ ]Ð4IÓJÜ—G‘G—L‘L Ð0KÓLÜ—W‘W—\‘\ /Ð3QÓRÜ—w‘w—|‘| MÐ3GÓHÜ—W‘W—\‘\ -Ð1OÓPñ
ð ñŠô 
�‰˜Ò	!Ü—'‘'×$Ñ$Ð%DÓEˆä—W‘W—\‘\ 'Ð+HÓIÜ—g‘g—l‘l 7¨OÓ<ÜŸ™Ÿ™ W¨jÓ9Ü—G‘G—L‘L Ð*:Ó;Ü—W‘W—\‘\ 'Ð+DÓEÜ—w‘w—|‘| G¨YÓ7Ü—W‘W—\‘\ '¨=Ó9ñ
ð ñ‰ô “ˆä—W‘W—\‘\ &Ð*GÓHÜ—g‘g—l‘l 6¨?Ó;ÜŸ™Ÿ™ V¨ZÓ8Ü—G‘G—L‘L Ð)9Ó:Ü—W‘W—\‘\ &¨'Ó2Ü—w‘w—|‘| F¨IÓ6Ü—W‘W—\‘\ &¨-Ó8ñ
ð ñˆð ØØÜ$'§L¡L°HÒ$<Ñ À*ÜŸL™L¨HÒ4‘¸*Ü #§¡°Ò 8‘9¸hØñð ñ€Lð ") 	Ðð #Ø$Ø)Ð1JÐJñð r.   c           
      ó²  — |j                  d| › �«       t        s|j                  d| › d�«       t        «       S t	        | «      }|€|d   }nyt        |«      r,|}|d   rt        j                  j                  |«      n||d<   nB|d   r$t        j                  j                  |d   |«      }n|j                  | › d�«       |d   }t        t        |d|«      «      }|€t        d| › d	|› d
�«      ‚|j                  d|› d
�«       t        j                   d¬«      5 }d }	 t#        ||«      }t%        |j'                  d«      j)                  «       d   «      }	t+        |d   |d   |||	¬«      }
t,        |j.                  _        t3        |d«      }d|v rdnd}|j'                  d|› d�«       t        «       }d}d}t5        |«      5 }|j7                  «       }t9        |«      }t;        |«      D ]M  \  }}|j=                  d|d›d|d›�«       t?        |
g|¢­Ž \  }}|s|dz  }Œ6|s|dz  }|jA                  |«       ŒO 	 d d d «       |dkD  rd|› d�}nd}|j                  dt9        |«      › d| › |› �«       |
jB                  jE                  «       }||d <   |j                  d!|› �«       ||�|j.                  jG                  «        cd d d «       S # 1 sw Y   Œ“xY w# tH        $ rF}t        jJ                  d"k(  r-|jL                  d#k(  rd$}|j                  |«       tO        |«      ‚‚ d }~ww xY w# |�|j.                  jG                  «        w w xY w# 1 sw Y   y xY w)%NzExtracting cookies from zCannot extract cookies from zW without sqlite3 support. Please use a Python interpreter compiled with sqlite3 supportrï   rñ   z does not support profilesÚCookieszcould not find z cookies database in "rx   rw   r‰   rŠ   z,SELECT value FROM meta WHERE key = 'version'r   rð   ©rZ   Úmeta_versionÚcookiesrÔ   r›   zBSELECT host_key, name, value, encrypted_value, path, expires_utc, z FROM cookiesrŒ   r�   rŽ   r   ú (z could not be decrypted)rá   r¡   z cookies from Úunencryptedzcookie version breakdown: Únté   zgCould not copy Chrome cookie database. See  https://github.com/yt-dlp/yt-dlp/issues/7271  for more info)(r¢   r   r(   r_   r÷   r¥   r`   r™   r­   r¦   rD   r©   Ú_find_filesr«   r¬   r´   rµ   r¶   r³   rº   r»   Úget_cookie_decryptorÚbytesr¹   Útext_factoryÚ_get_column_namesrS   r¼   r½   r¾   r6   Ú_process_chrome_cookierÄ   Ú_cookie_countsÚcopyÚcloseÚPermissionErrorr   Úerrnor   )rj   rk   rZ   r>   rõ   rÇ   rÈ   rÌ   rÍ   rû   Ú	decryptorÚcolumn_namesÚsecure_columnrm   Úfailed_cookiesÚunencrypted_cookiesrH   rÏ   rÐ   rÑ   ÚlineÚis_encryptedrÕ   Úfailed_messageÚcountsrD   r*   s                              r-   rs   rs   &  sŸ  € Ø
‡K�KÐ*¨<¨.Ð9Ô:åØ�‰Ð5°l°^ð DWð Wô 	Xä!Ó#Ð#ä1°,Ó?€Fà€Ø˜]Ñ+‰Ü	�'Ô	ØˆØ<BÐCVÒ<W¤§¡§¡°Ô 8Ð]dˆˆ}ÒàÐ%Ò&ÜŸ'™'Ÿ,™, v¨mÑ'<¸gÓF‰Kà�L‰L˜L˜>Ð)CÐDÔEØ  Ñ/ˆKä"¤;¨{¸IÀvÓ#NÓOÐØÐ#Ü /°,°Ð?UÐVaÐUbÐbcÐ dÓeÐeØ
‡L�LÐ-Ð.BÐ-CÀ1ÐEÔFä	×	$Ñ	$¨HÔ	5ð 0*¸Øˆð.	*Ü(Ð)=¸vÓFˆFô ˜vŸ~™~Ð.\Ó]×fÑfÓhÐijÑkÓlˆLÜ,Ø�}Ñ% v¨nÑ'=¸vØ¨lô<ˆIô .3ˆF×ÑÔ*Ü,¨V°YÓ?ˆLØ+6¸,Ñ+F™KÈHˆMØ�N‰NÐ_Ð`mÐ_nÐn{Ð|Ô}Ü$Ó&ˆCØˆNØ"#ÐÜ% fÓ-ð +°ØŸ™Ó)�Ü%(¨£ZÐ"Ü(¨Ó/ò +‘G�A�tØ ×&Ñ&¨¸¸3¸¸qÐASÐTWÐ@XÐ'YÔZÜ+AÀ)Ð+SÈdÒ+SÑ(�L &Ù!Ø&¨!Ñ+˜Ø Ù)Ø+¨qÑ0Ð+Ø—N‘N 6Õ*ñ+÷+ð  Ò!Ø#% nÐ%5Ð5MÐ!N‘à!#�Ø�K‰K˜*¤S¨£X J¨n¸\¸NÈ>ÐJZÐ[Ô\Ø×-Ñ-×2Ñ2Ó4ˆFØ$7ˆF�=Ñ!Ø�L‰LÐ5°f°XÐ>Ô?Øð Ð!Ø×!Ñ!×'Ñ'Ô)÷a0*ñ 0*÷&+ð +ûô* ò 	Ü�w‰w˜$Š 5§;¡;°"Ò#4ð D�Ø—‘˜WÔ%Ü# GÓ,Ð,Øûð	ûð Ð!Ø×!Ñ!×'Ñ'Õ)ð "ú÷_0*ð 0*úsX   ÄMÄB$KÇA7KÈ;A,KÊ'MËK	ËKË	L(Ë"AL#Ì#L(Ì(L+Ì+M
Í
MÍMc                 ón  — |j                  «       }|j                  «       }|j                  «       }|j                  «       }| xr |}|r| j                  |«      }|€|d fS |sd }|t        j                  j	                  d||d d|t        |«      |j                  d«      |t        |«      ||dd d i ¬«      fS )Nr   Fr�   r‘   )ÚdecodeÚdecryptr¿   rÀ   rÁ   rÂ   rÃ   )	r  Úhost_keyr   r“   Úencrypted_valuer™   Úexpires_utcrÔ   r  s	            r-   r  r  t  sÄ   € Ø�‰Ó €HØ�;‰;‹=€DØ�L‰L‹N€EØ�;‰;‹=€DØ�9Ò0 €LáØ×!Ñ! /Ó2ˆØˆ=Ø Ð%Ð%ñ ØˆàœŸ™×.Ñ.Ø˜ E°ÀUØ¬$¨x«.ÈX×M`ÑM`ÐadÓMeØ¤$ t£*°YÈÐ]bØ $¨Rð	 /ó 1ð 1ð 1r.   c                   ó   — e Zd ZdZi Zd„ Zy)ÚChromeCookieDecryptoraf  
    Overview:

        Linux:
        - cookies are either v10 or v11
            - v10: AES-CBC encrypted with a fixed key
                - also attempts empty password if decryption fails
            - v11: AES-CBC encrypted with an OS protected key (keyring)
                - also attempts empty password if decryption fails
            - v11 keys can be stored in various places depending on the activate desktop environment [2]

        Mac:
        - cookies are either v10 or not v10
            - v10: AES-CBC encrypted with an OS protected key (keyring) and more key derivation iterations than linux
            - not v10: 'old data' stored as plaintext

        Windows:
        - cookies are either v10 or not v10
            - v10: AES-GCM encrypted with a key which is encrypted with DPAPI
            - not v10: encrypted with DPAPI

    Sources:
    - [1] https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/os_crypt/
    - [2] https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/os_crypt/sync/key_storage_linux.cc
        - KeyStorageLinux::CreateService
    c                 ó   — t        d«      ‚)Nz"Must be implemented by sub classes)ÚNotImplementedError)r)   r  s     r-   r  zChromeCookieDecryptor.decryptª  s   € Ü!Ð"FÓGÐGr.   N)r7   r8   r9   Ú__doc__r  r  r:   r.   r-   r  r  Œ  s   „ ñð6 €NóHr.   r  rú   c                ó¢   — t         j                  dk(  rt        |||¬«      S t         j                  dv rt        | ||¬«      S t	        ||||¬«      S )NrÚ   )rû   )rÙ   rØ   rú   )rÛ   rÜ   ÚMacChromeCookieDecryptorÚWindowsChromeCookieDecryptorÚLinuxChromeCookieDecryptor)Úbrowser_rootÚbrowser_keyring_namer>   rZ   rû   s        r-   r  r  ®  sN   € Ü
‡|�|�xÒÜ'Ð(<¸fÐS_Ô`Ð`Ü	�‰Ð,Ñ	,Ü+¨L¸&È|Ô\Ð\Ü%Ð&:¸FÈGÐbnÔoÐor.   c                   óT   — e Zd Zdddœd„Zej
                  d„ «       Zed„ «       Zd„ Z	y)r#  Nrú   c                ó²   — || _         | j                  d«      | _        | j                  d«      | _        ddddœ| _        || _        || _        |xs d| _        y )Ns   peanutsr.   r   )Úv10Úv11Úother)Ú_loggerÚ
derive_keyÚ_v10_keyÚ
_empty_keyr  Ú_browser_keyring_nameÚ_keyringÚ_meta_version)r)   r%  r>   rZ   rû   s        r-   Ú__init__z#LinuxChromeCookieDecryptor.__init__·  sT   € ØˆŒØŸ™¨
Ó3ˆŒØŸ/™/¨#Ó.ˆŒØ&'°¸AÑ>ˆÔØ%9ˆÔ"ØˆŒØ)Ò.¨QˆÕr.   c                 ó‚   — t        | j                  | j                  | j                  «      }|€d S | j	                  |«      S rN   )Ú_get_linux_keyring_passwordr/  r0  r+  r,  )r)   Úpasswords     r-   Ú_v11_keyz#LinuxChromeCookieDecryptor._v11_keyÀ  s:   € ä.¨t×/IÑ/IÈ4Ï=É=ÐZ^×ZfÑZfÓgˆØÐ'ˆtÐF¨T¯_©_¸XÓ-FÐFr.   c                 ó    — t        | ddd¬«      S )Nó	   saltysaltr   r�   ©ÚsaltÚ
iterationsÚ
key_length©Úpbkdf2_sha1©r5  s    r-   r,  z%LinuxChromeCookieDecryptor.derive_keyÅ  s   € ô ˜8¨,À1ÐQSÔTÐTr.   c                 ó<  — |dd }|dd }|dk(  rS| j                   dxx   dz  cc<   t        || j                  | j                  f| j                  | j
                  dk\  ¬«      S |dk(  r}| j                   d	xx   dz  cc<   | j                  €| j                  j                  d
d¬«       yt        || j                  | j                  f| j                  | j
                  dk\  ¬«      S | j                  j                  d|› d�d¬«       | j                   dxx   dz  cc<   y)aÂ  

        following the same approach as the fix in [1]: if cookies fail to decrypt then attempt to decrypt
        with an empty password. The failure detection is not the same as what chromium uses so the
        results won't be perfect

        References:
            - [1] https://chromium.googlesource.com/chromium/src/+/bbd54702284caca1f92d656fdcadf2ccca6f4165%5E%21/
                - a bugfix to try an empty password as a fallback
        Né   ó   v10r(  r   é   ©Úhash_prefixs   v11r)  z(cannot decrypt v11 cookies: no key foundT©r+   zunknown cookie version: "rx   r*  )r  Ú_decrypt_aes_cbc_multir-  r.  r+  r1  r6  r(   ©r)   r  r’   Ú
ciphertexts       r-   r  z"LinuxChromeCookieDecryptor.decryptË  s#  € ð " " 1Ð%ˆØ$ Q RÐ(ˆ
à�fÒØ×Ñ Ó&¨!Ñ+Ó&Ü)Ø˜TŸ]™]¨D¯O©OÐ<¸d¿l¹lØ ×.Ñ.°"Ñ4ô6ð 6ð ˜ÒØ×Ñ Ó&¨!Ñ+Ó&Ø�}‰}Ð$Ø—‘×$Ñ$Ð%OÐ[_Ð$Ô`ØÜ)Ø˜TŸ]™]¨D¯O©OÐ<¸d¿l¹lØ ×.Ñ.°"Ñ4ô6ð 6ð
 �L‰L× Ñ Ð#<¸W¸IÀQÐ!GÐSWÐ ÔXØ×Ñ Ó(¨AÑ-Ó(Ør.   )
r7   r8   r9   r2  Ú	functoolsÚcached_propertyr6  Ústaticmethodr,  r  r:   r.   r-   r#  r#  ¶  sD   „ Ø@DÐSWô /ð ×ÑñGó ðGð ñUó ðUó
 r.   r#  c                   ó*   — e Zd Zdd„Zed„ «       Zd„ Zy)r!  Nc                 óˆ   — || _         t        ||«      }|€d n| j                  |«      | _        dddœ| _        |xs d| _        y ©Nr   )r(  r*  )r+  Ú_get_mac_keyring_passwordr,  r-  r  r1  )r)   r%  r>   rû   r5  s        r-   r2  z!MacChromeCookieDecryptor.__init__ï  sG   € ØˆŒÜ,Ð-AÀ6ÓJˆØ (Ð 0™°d·o±oÀhÓ6OˆŒØ&'°!Ñ4ˆÔØ)Ò.¨QˆÕr.   c                 ó    — t        | ddd¬«      S )Nr8  ië  r�   r9  r=  r?  s    r-   r,  z#MacChromeCookieDecryptor.derive_keyö  s   € ô ˜8¨,À4ÐTVÔWÐWr.   c                 ó6  — |d d }|dd  }|dk(  rr| j                   dxx   dz  cc<   | j                  €| j                  j                  dd¬«       y t	        || j                  f| j                  | j
                  dk\  ¬	«      S | j                   d
xx   dz  cc<   |S )NrA  rB  r(  r   ú(cannot decrypt v10 cookies: no key foundTrF  rC  rD  r*  )r  r-  r+  r(   rG  r1  rH  s       r-   r  z MacChromeCookieDecryptor.decryptü  s­   € Ø! " 1Ð%ˆØ$ Q RÐ(ˆ
à�fÒØ×Ñ Ó&¨!Ñ+Ó&Ø�}‰}Ð$Ø—‘×$Ñ$Ð%OÐ[_Ð$Ô`Øä)Ø˜TŸ]™]Ð,¨d¯l©lÈ×HZÑHZÐ^`ÑH`ôbð bð ×Ñ Ó(¨AÑ-Ó(ð #Ð"r.   rN   )r7   r8   r9   r2  rL  r,  r  r:   r.   r-   r!  r!  î  s"   „ ó/ð ñXó ðXó
#r.   r!  c                   ó   — e Zd Zdd„Zd„ Zy)r"  Nc                 ó^   — || _         t        ||«      | _        dddœ| _        |xs d| _        y rO  )r+  Ú_get_windows_v10_keyr-  r  r1  )r)   r$  r>   rû   s       r-   r2  z%WindowsChromeCookieDecryptor.__init__  s1   € ØˆŒÜ,¨\¸6ÓBˆŒØ&'°!Ñ4ˆÔØ)Ò.¨QˆÕr.   c           	      óª  — |d d }|dd  }|dk(  rŠ| j                   dxx   dz  cc<   | j                  €| j                  j                  dd¬«       y d}d	}|}|d | }|||  }|| d  }t	        || j                  ||| j                  | j
                  d
k\  ¬«      S | j                   dxx   dz  cc<   t        || j                  «      j                  «       S )NrA  rB  r(  r   rS  TrF  é   r�   rC  rD  r*  )r  r-  r+  r(   Ú_decrypt_aes_gcmr1  Ú_decrypt_windows_dpapir  )	r)   r  r’   rI  Únonce_lengthÚauthentication_tag_lengthÚraw_ciphertextÚnonceÚauthentication_tags	            r-   r  z$WindowsChromeCookieDecryptor.decrypt  s  € Ø! " 1Ð%ˆØ$ Q RÐ(ˆ
à�fÒØ×Ñ Ó&¨!Ñ+Ó&Ø�}‰}Ð$Ø—‘×$Ñ$Ð%OÐ[_Ð$Ô`Øð #ˆLð )+Ð%à'ˆNØ" = LÐ1ˆEØ'¨Ð6OÐ5OÐPˆJØ!/Ð1JÐ0JÐ0KÐ!LÐä#Ø˜DŸM™M¨5Ð2DÀdÇlÁlØ ×.Ñ.°"Ñ4ô6ð 6ð
 ×Ñ Ó(¨AÑ-Ó(ô *¨/¸4¿<¹<ÓH×OÑOÓQÐQr.   rN   )r7   r8   r9   r2  r  r:   r.   r-   r"  r"    s   „ ó/óRr.   r"  c                 óà  — t         j                  dvrt        dt         j                  › �«      ‚| rIt        j                  j                  | «      }t        j                  j                  |«      s£t        d«      ‚t        j                  j                  d«      }t        j                  j                  |«      sZ|j                  d«       t        j                  j                  d«      }t        j                  j                  |«      st        d«      ‚t        |d«      5 }|j                  «       }d d d «       t        |¬	«      }|j                  d
t        |«      › d�«       |S # 1 sw Y   Œ6xY w)N)rÚ   Úioszunsupported platform: z(custom safari cookies database not foundz'~/Library/Cookies/Cookies.binarycookiesz Trying secondary cookie locationzP~/Library/Containers/com.apple.Safari/Data/Library/Cookies/Cookies.binarycookiesz&could not find safari cookies databaseÚrb)r>   r¡   z cookies from safari)rÛ   rÜ   rt   r`   r™   rÞ   r®   r«   r¬   r¯   ÚreadÚparse_safari_cookiesr¢   r½   )rk   r>   Úcookies_pathÚfÚcookies_datarm   s         r-   rq   rq   8  s  € Ü
‡|�|Ð,Ñ,ÜÐ1´#·,±,°Ð@ÓAÐAáÜ—w‘w×)Ñ)¨'Ó2ˆÜ�w‰w�~‰~˜lÔ+Ü#Ð$NÓOÐOô —w‘w×)Ñ)Ð*SÓTˆä�w‰w�~‰~˜lÔ+Ø�L‰LÐ;Ô<ÜŸ7™7×-Ñ-ð  /Aó  BˆLÜ—7‘7—>‘> ,Ô/Ü'Ð(PÓQÐQä	ˆl˜DÓ	!ð   QØ—v‘v“xˆ÷ ô ˜|°FÔ
;€CØ
‡K�K�*œS ›X˜JÐ&:Ð;Ô<Ø€J÷ ð  ús   ÄE$Å$E-c                   ó   — e Zd Zy)ÚParserErrorNrV   r:   r.   r-   ri  ri  R  rW   r.   ri  c                   óL   — e Zd Zd„ Zd„ Zd„ Zdd„Zdd„Zd„ Zdd„Z	dd„Z
dd	„Zy
)Ú
DataParserc                 ó.   — || _         d| _        || _        y )Nr   )Ú_datarÍ   r+  )r)   Údatar>   s      r-   r2  zDataParser.__init__W  s   € ØˆŒ
ØˆŒØˆ�r.   c                 óÒ   — |dk  rt        d|› d�«      ‚| j                  |z   }|t        | j                  «      kD  rt        d«      ‚| j                  | j                  | }|| _        |S )Nr   zinvalid read of ú byteszreached end of input)ri  rÍ   r½   rm  )r)   Ú	num_bytesÚendrn  s       r-   Ú
read_byteszDataParser.read_bytes\  sh   € Ø�qŠ=ÜÐ 0°°¸6ÐBÓCÐCØ�k‰k˜IÑ%ˆØ”�T—Z‘Z“Ò ÜÐ4Ó5Ð5Ø�z‰z˜$Ÿ+™+ cÐ*ˆØˆŒØˆr.   c           	      ól   — | j                  t        |«      «      }||k7  rt        d|› d|› d|› d�«      ‚y )Nzunexpected value: z != rý   ú))rs  r½   ri  )r)   Úexpected_valuer*   r“   s       r-   Úexpect_byteszDataParser.expect_bytesf  sF   € Ø—‘¤ NÓ 3Ó4ˆØ�NÒ"ÜÐ 2°5°'¸¸nÐ=MÈRÐPWÈyÐXYÐZÓ[Ð[ð #r.   c                 ó^   — |rdnd}t        j                  || j                  d«      «      d   S )Nz>Iz<Ié   r   ©ÚstructÚunpackrs  ©r)   Ú
big_endianÚdata_formats      r-   Ú	read_uintzDataParser.read_uintk  ó*   € Ù(‘d¨dˆÜ�}‰}˜[¨$¯/©/¸!Ó*<Ó=¸aÑ@Ð@r.   c                 ó^   — |rdnd}t        j                  || j                  d«      «      d   S )Nz>dz<dé   r   rz  r}  s      r-   Úread_doublezDataParser.read_doubleo  r�  r.   c                 ó–   — g }	 | j                  d«      }|dk(  rdj                  |«      j                  «       S |j                  |«       ŒG)Nr   ó    r.   )rs  r¦   r  r]   )r)   ÚbufferÚcs      r-   Úread_cstringzDataParser.read_cstrings  sH   € ØˆØØ—‘ Ó"ˆAØ�GŠ|Ø—x‘x Ó'×.Ñ.Ó0Ð0à—‘˜aÔ ð r.   c           
      óž   — |dkD  r4| j                   j                  d|› d|› d| j                  |«      ›�«       y |dk  rt        d|› d�«      ‚y )Nr   z	skipping z bytes (z): zinvalid skip of rp  )r+  r¬   rs  ri  )r)   rq  Údescriptions      r-   ÚskipzDataParser.skip|  sZ   € Ø�qŠ=Ø�L‰L×Ñ ¨9¨+°X¸k¸]È#ÈdÏoÉoÐ^gÓNhÐMkÐlÕmØ˜Š]ÜÐ 0°°¸6ÐBÓCÐCð r.   c                 óB   — | j                  || j                  z
  |«       y rN   )rŒ  rÍ   )r)   Úoffsetr‹  s      r-   Úskip_tozDataParser.skip_to‚  s   € Ø�	‰	�&˜4Ÿ;™;Ñ&¨Õ4r.   c                 óN   — | j                  t        | j                  «      |«       y rN   )r�  r½   rm  )r)   r‹  s     r-   Úskip_to_endzDataParser.skip_to_end…  s   € Ø�‰”S˜Ÿ™“_ kÕ2r.   NrI   )Úunknown)r7   r8   r9   r2  rs  rw  r€  r„  r‰  rŒ  r�  r‘  r:   r.   r-   rk  rk  V  s3   „ òò
ò\ó
AóAò!óDó5ô3r.   rk  c           
      óÄ   — t        t        j                  dddddt        j                  j                  ¬«      t        j
                  | ¬«      z   j                  «       «      S )NiÑ  r   r   )Útzinfo)Úseconds)r³   ÚdtÚdatetimeÚtimezoneÚutcÚ	timedeltaÚ	timestamp)r›  s    r-   Ú_mac_absolute_time_to_posixrœ  ‰  s@   € Ü”—‘˜D ! Q¨¨1´R·[±[·_±_ÔEÌÏÉÐ]fÔHgÑg×rÑrÓtÓuÐur.   c                 óØ   — t        | |«      }|j                  dd«       |j                  d¬«      }t        |«      D �cg c]  }|j                  d¬«      ‘Œ }}||j                  fS c c}w )Ns   cookzdatabase signatureT)r~  )rk  rw  r€  ÚrangerÍ   )rn  r>   ÚpÚnumber_of_pagesrO   Ú
page_sizess         r-   Ú_parse_safari_cookies_headerr¢  �  se   € Ü�4˜Ó €AØ‡N�N�7Ð0Ô1Ø—k‘k¨T�kÓ2€OÜ8=¸oÓ8NÖO°1�!—+‘+¨�+Õ.ÐO€JÐOØ�q—x‘xÐÐùò Ps   ¾A'c           	      óJ  — t        | |«      }|j                  dd«       |j                  «       }t        |«      D �cg c]  }|j                  «       ‘Œ }}|dk(  r|j	                  dt        | «      › d�«       y |j                  |d   d«       t        |«      5 }t        |«      D ]Q  \  }}	|j                  d|d›d	|d›�«       |j                  |	d
«       t        | |	d  ||«      }
|j                  |
«       ŒS 	 d d d «       |j                  d«       y c c}w # 1 sw Y   Œ xY w)Ns      zpage signaturer   za cookies page of size z has no cookieszunknown page header fieldrŒ   r�   rŽ   zspace between recordszspace in between pages)rk  rw  r€  rž  r¬   r½   r�  rS   r¾   r6   Ú_parse_safari_cookies_recordrs  r‘  )rn  rm   r>   rŸ  Únumber_of_cookiesrO   Úrecord_offsetsrH   rÑ   Úrecord_offsetÚrecord_lengths              r-   Ú_parse_safari_cookies_pager©  •  s!  € Ü�4˜Ó €AØ‡N�NÐ&Ð(8Ô9ØŸ™›ÐÜ-2Ð3DÓ-EÖF¨�a—k‘k•mÐF€NÐFØ˜AÒØ�‰Ð.¬s°4«y¨k¸ÐIÔJØà‡I�Iˆn˜QÑÐ!<Ô=ä	˜fÓ	%ð (¨Ü )¨.Ó 9ò 	(ÑˆAˆ}Ø×Ñ °°3°°qÐ9JÈ3Ð8OÐPÔQØ�I‰I�mÐ%<Ô=Ü8¸¸m¸nÐ9MÈsÐTZÓ[ˆMØ�L‰L˜Õ'ñ		(÷(ð ‡M�MÐ*Õ+ùò G÷(ð (ús   ¼DÂA DÄD"c                 ó  — t        | |«      }|j                  «       }|j                  dd«       |j                  «       }t        |dz  «      }|j                  dd«       |j                  «       }|j                  «       }|j                  «       }	|j                  «       }
|j                  dd«       t	        |j                  «       «      }t	        |j                  «       «      }	 |j                  |«       |j                  «       }|j                  |«       |j                  «       }|j                  |	«       |j                  «       }|j                  |
«       |j                  «       }|j                  |d
«       t        j                  j                  d||d d|t        |«      |j                  d«      |t        |«      ||dd d i ¬«      }|j                  |«       |S # t        $ r |j                  dd¬	«       |cY S w xY w)Nry  zunknown record field 1r   zunknown record field 2rƒ  zunknown record field 3z;failed to parse Safari cookie because UTF-8 decoding failedTrF  zspace at the end of the recordr   Fr�   r‘   )rk  r€  rŒ  rÂ   rœ  r„  r�  r‰  ÚUnicodeDecodeErrorr(   r¿   rÀ   rÁ   rÃ   rÄ   )rn  rm   r>   rŸ  Úrecord_sizeÚflagsrÔ   Údomain_offsetÚname_offsetÚpath_offsetÚvalue_offsetÚexpiration_dateÚ_creation_dater–   r   r™   r“   rÕ   s                     r-   r¤  r¤  ©  s°  € Ü�4˜Ó €AØ—+‘+“-€KØ‡F�Fˆ1Ð&Ô'Ø�K‰K‹M€EÜ�U˜V‘^Ó$€IØ‡F�Fˆ1Ð&Ô'Ø—K‘K“M€MØ—+‘+“-€KØ—+‘+“-€KØ—;‘;“=€LØ‡F�Fˆ1Ð&Ô'Ü1°!·-±-³/ÓB€OÜ0°·±³ÓA€NðØ	�	‰	�-Ô Ø—‘Ó!ˆà	�	‰	�+ÔØ�~‰~Óˆà	�	‰	�+ÔØ�~‰~Óˆà	�	‰	�,ÔØ—‘Ó ˆð
 ‡I�IˆkÐ;Ô<ä�^‰^×"Ñ"Ø˜ E°ÀUØ¬¨V«È×IZÑIZÐ[^ÓI_Ø¤$ t£*°YÈÐafØ $¨Rð	 #ó 1€Fð
 ‡N�N�6ÔØÐøô ò Ø�‰ÐTÐ`dˆÔeØÒðús   Ã$BG ÇG>Ç=G>c                 óÂ   — |€
t        «       }t        | |«      \  }}t        | |d |«      }|D ]  }t        |j	                  |«      ||«       Œ  |j                  d«       |S )a9  
    References:
        - https://github.com/libyal/dtformats/blob/main/documentation/Safari%20Cookies.asciidoc
            - this data appears to be out of date but the important parts of the database structure is the same
            - there are a few bytes here and there which are skipped during parsing
    NÚfooter)r_   r¢  rk  r©  rs  r‘  )rn  rm   r>   r¡  Ú
body_startrŸ  Ú	page_sizes          r-   rd  rd  Ó  sl   € ð €{Ü Ó"ˆÜ9¸$ÀÓGÑ€J�
Ü�4˜
˜Ð$ fÓ-€AØò Iˆ	Ü" 1§<¡<°	Ó#:¸CÀÕHðIà‡M�M�(ÔØ€Jr.   c                   óÆ   — e Zd ZdZ e«       Z e«       Z e«       Z e«       Z e«       Z	 e«       Z
 e«       Z e«       Z e«       Z e«       Z e«       Z e«       Z e«       Zy)Ú_LinuxDesktopEnvironmentzu
    https://chromium.googlesource.com/chromium/src/+/refs/heads/main/base/nix/xdg_util.h
    DesktopEnvironment
    N)r7   r8   r9   r  r   ÚOTHERÚCINNAMONÚDEEPINÚGNOMEÚKDE3ÚKDE4ÚKDE5ÚKDE6ÚPANTHEONÚUKUIÚUNITYÚXFCEÚLXQTr:   r.   r-   r¹  r¹  ä  sd   „ ññ ‹F€EÙ‹v€HÙ‹V€FÙ‹F€EÙ‹6€DÙ‹6€DÙ‹6€DÙ‹6€DÙ‹v€HÙ‹6€DÙ‹F€EÙ‹6€DÙ‹6�Dr.   r¹  c                   óV   — e Zd ZdZ e«       Z e«       Z e«       Z e«       Z e«       Z	y)Ú_LinuxKeyringz•
    https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/os_crypt/sync/key_storage_util_linux.h
    SelectedLinuxBackend
    N)
r7   r8   r9   r  r   ÚKWALLETÚKWALLET5ÚKWALLET6ÚGNOMEKEYRINGÚ	BASICTEXTr:   r.   r-   rÈ  rÈ  ø  s,   „ ññ ‹f€GÙ‹v€HÙ‹v€HÙ“6€LÙ“�Ir.   rÈ  c                 óf  — | j                  dd«      }| j                  dd«      }|��–t        t        j                  |j	                  d«      «      D �]T  }|dk(  r(d|v rt
        j                  c S t
        j                  c S |dk(  rt
        j                  c S |d	k(  rt
        j                  c S |d
k(  rt
        j                  c S |dk(  r~| j                  dd«      }|dk(  rt
        j                  c S |dk(  rt
        j                  c S |dk(  rt
        j                  c S |j                  d|› d�«       t
        j                  c S |dk(  rt
        j                  c S |dk(  rt
        j                  c S |dk(  rt
        j                   c S |dk(  s�ŒEt
        j"                  c S  |j%                  d|› d�«       |dk(  rt
        j                  S |dv rt
        j                  S |dv rt
        j                  S |dk(  r$d| v rt
        j                  S t
        j&                  S d|v s|dk(  rt
        j                  S |dk(  rt
        j                   S |j%                  d|› d�«       d | v rt
        j                  S d!| v r$d| v rt
        j                  S t
        j&                  S t
        j(                  S )"zy
    https://chromium.googlesource.com/chromium/src/+/refs/heads/main/base/nix/xdg_util.cc
    GetDesktopEnvironment
    ÚXDG_CURRENT_DESKTOPNÚDESKTOP_SESSIONrá   ú:ÚUnityzgnome-fallbackÚDeepinr½  z
X-CinnamonÚKDEÚKDE_SESSION_VERSIONÚ5Ú6Ú4zunknown KDE version: "z". Assuming KDE4ÚPantheonrÅ  rÃ  ÚLXQtz1XDG_CURRENT_DESKTOP is set to an unknown value: "rx   Údeepin)ÚmateÚgnome)Úkde4z
kde-plasmaÚkdeÚxfceÚxubuntuÚukuiz-DESKTOP_SESSION is set to an unknown value: "ÚGNOME_DESKTOP_SESSION_IDÚKDE_FULL_SESSION)rB   r§   ÚstrÚstripÚsplitr¹  r½  rÄ  r¼  r»  rÀ  rÁ  r¿  r¢   rÂ  rÅ  rÃ  rÆ  r¬   r¾  rº  )Úenvr>   Úxdg_current_desktopÚdesktop_sessionÚpartÚkde_versions         r-   Ú_get_linux_desktop_environmentrí    s‰  € ð
 Ÿ'™'Ð"7¸Ó>ÐØ—g‘gÐ/°Ó4€OØÑ&ÜœŸ	™	Ð#6×#<Ñ#<¸SÓ#AÓBó 	5ˆDØ�wŠØ# Ñ6Ü3×9Ñ9Ò9ä3×9Ñ9Ò9Ø˜Ò!Ü/×6Ñ6Ò6Ø˜’Ü/×5Ñ5Ò5Ø˜Ò%Ü/×8Ñ8Ò8Ø˜’Ø!Ÿg™gÐ&;¸TÓB�Ø #Ò%Ü3×8Ñ8Ò8Ø  CÒ'Ü3×8Ñ8Ò8Ø  CÒ'Ü3×8Ñ8Ò8à—K‘KÐ"8¸¸ÐEUÐ VÔWÜ3×8Ñ8Ò8Ø˜Ò#Ü/×8Ñ8Ò8Ø˜’Ü/×4Ñ4Ò4Ø˜’Ü/×4Ñ4Ò4Ø˜”Ü/×4Ñ4Ò4ð=	5ð> 	�‰ÐHÐI\ÐH]Ð]^Ð_Ô`à˜(Ò"Ü'×.Ñ.Ð.Ø	Ð-Ñ	-Ü'×-Ñ-Ð-Ø	Ð2Ñ	2Ü'×,Ñ,Ð,Ø	˜EÒ	!Ø  CÑ'Ü+×0Ñ0Ð0ä+×0Ñ0Ð0Ø	�?Ñ	" o¸Ò&BÜ'×,Ñ,Ð,Ø	˜FÒ	"Ü'×,Ñ,Ð,à�‰ÐDÀ_ÐDUÐUVÐWÔXà! SÑ(Ü'×-Ñ-Ð-Ø	˜sÑ	"Ø  CÑ'Ü+×0Ñ0Ð0ä+×0Ñ0Ð0ä#×)Ñ)Ð)r.   c                 óú  — t        t        j                  | «      }| j                  d|j                  › �«       |t
        j                  k(  rt        j                  }|S |t
        j                  k(  rt        j                  }|S |t
        j                  k(  rt        j                  }|S |t
        j                  t
        j                  t
        j                  fv rt        j                   }|S t        j"                  }|S )aG  
    SelectBackend in [1]

    There is currently support for forcing chromium to use BASIC_TEXT by creating a file called
    `Disable Local Encryption` [1] in the user data dir. The function to write this file (`WriteBackendUse()` [1])
    does not appear to be called anywhere other than in tests, so the user would have to create this file manually
    and so would be aware enough to tell yt-dlp to use the BASIC_TEXT keyring.

    References:
        - [1] https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/os_crypt/sync/key_storage_util_linux.cc
    zdetected desktop environment: )rí  r`   Úenvironr¬   r   r¹  r¿  rÈ  rÉ  rÀ  rÊ  rÁ  rË  r¾  rÆ  rº  rÍ  rÌ  )r>   Údesktop_environmentÚlinux_keyrings      r-   Ú_choose_linux_keyringrò  M  sí   € ô 9¼¿¹ÀVÓLÐØ
‡L�LÐ1Ð2E×2JÑ2JÐ1KÐLÔMØÔ6×;Ñ;Ò;Ü%×-Ñ-ˆð Ðð 
Ô 8× =Ñ =Ò	=Ü%×.Ñ.ˆð Ðð 
Ô 8× =Ñ =Ò	=Ü%×.Ñ.ˆð Ðð 
Ü ×%Ñ%Ô'?×'DÑ'DÔF^×FdÑFdð!ñ 
ô &×/Ñ/ˆð Ðô &×2Ñ2ˆØÐr.   c                 ó  — d}	 | t         j                  k(  rd}d}n;| t         j                  k(  rd}d}n#| t         j                  k(  rd}d}nt	        | «      ‚t        j                  dd	d
d|› �|dgdt        j                  t        j                  ¬«      \  }}}|r|j                  d«       |S |j                  d|j                  «       › d�«       |j                  «       S # t        $ r }|j                  d|› �«       |cY d}~S d}~ww xY w)ag   The name of the wallet used to store network passwords.

    https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/os_crypt/sync/kwallet_dbus.cc
    KWalletDBus::NetworkWallet
    which does a dbus call to the following function:
    https://api.kde.org/frameworks/kwallet/html/classKWallet_1_1Wallet.html
    Wallet::NetworkWallet
    Ú	kdewalletzorg.kde.kwalletdz/modules/kwalletdzorg.kde.kwalletd5z/modules/kwalletd5zorg.kde.kwalletd6z/modules/kwalletd6z	dbus-sendz	--sessionz--print-reply=literalz--dest=zorg.kde.KWallet.networkWalletT)ÚtextÚstdoutÚstderrzfailed to read NetworkWalletzNetworkWallet = "rx   z)exception while obtaining NetworkWallet: N)rÈ  rÉ  rÊ  rË  rt   r   ÚrunÚ
subprocessÚPIPEÚDEVNULLr(   r¬   ræ  re   )	rZ   r>   Údefault_walletÚservice_nameÚwallet_pathrö  rO   Ú
returncodeÚes	            r-   Ú_get_kwallet_network_walletr  j  s  € ð !€NðØ”m×+Ñ+Ò+Ø-ˆLØ-‰KØœ×.Ñ.Ò.Ø.ˆLØ.‰KØœ×.Ñ.Ò.Ø.ˆLØ.‰Kä˜WÓ%Ð%ä %§	¡	Ø˜Ð&=Ø�l�^Ð$ØØ+ð	+
ð
 œZŸ_™_´Z×5GÑ5Gô!IÑˆ��:ñ Ø�N‰NÐ9Ô:Ø!Ð!à�L‰LÐ,¨V¯\©\«^Ð,<¸AÐ>Ô?Ø—<‘<“>Ð!øÜò Ø�‰ÐBÀ1À#ÐFÔGØÕûðús$   „B)C! Â.2C! Ã!	D
Ã*DÃ?D
ÄD
c                 ój  — |j                  d|j                  › �«       t        j                  d«      €|j	                  d«       yt        ||«      }	 t        j                  dd| › d�d| › d�|gt        j                  t        j                  ¬	«      \  }}}|r|j	                  d
|› d�«       y|j                  «       j                  d«      r|j                  d«       y|j                  d«       |j                  d«      S # t        $ r'}|j                  dt!        |«      › �«       Y d }~yd }~ww xY w)Nz,using kwallet-query to obtain password from zkwallet-queryz¯kwallet-query command not found. KWallet and kwallet-query must be installed to read from KWallet. kwallet-query should beincluded in the kwallet package for your distributionr.   z--read-passwordú Safe Storagez--folderz Keys©rö  r÷  z&kwallet-query failed with return code z7. Please consult the kwallet-query man page for detailss   failed to readz@failed to read password from kwallet. Using empty string insteadzpassword foundó   
z!exception running kwallet-query: )r¬   r   ÚshutilÚwhichrD   r  r   rø  rù  rú  rû  ÚlowerrÃ   Úrstripre   r(   r   )r%  rZ   r>   Únetwork_walletrö  rO   rÿ  r   s           r-   Ú_get_kwallet_passwordr  “  s7  € Ø
‡L�LÐ?ÀÇÁ¸~ÐNÔOä‡|�|�OÓ$Ð,Ø�‰ð Mô 	Nð ä0°¸&ÓA€NðÜ %§	¡	ØØÐ"6Ð!7°}ÐEØÐ/Ð0°Ð6Øð	+
ô
 —/‘/¬*×*<Ñ*<ô!>Ñˆ��:ñ Ø�L‰LÐAÀ*Àð NQð Qô Ràà�|‰|‹~×(Ñ(Ð):Ô;Ø—‘Ð_Ô`ð à—‘Ð-Ô.Ø—}‘} UÓ+Ð+øÜò Ø�‰Ð:¼<È»?Ð:KÐLÔMÜûðús%   ÁAD Â/0D Ã !D Ä	D2ÄD-Ä-D2c                 ó”  — t         s|j                  dt        › �«       yt        j                  t        j
                  «       «      5 }t        j                  |«      }|j                  «       D ]3  }|j                  «       | › d�k(  sŒ|j                  «       c cd d d «       S  |j                  d«       	 d d d «       y# 1 sw Y   y xY w)Nzsecretstorage not available r.   r  zfailed to read from keyring)
r
   rD   r	   r·   r¸   Ú	dbus_initÚget_default_collectionÚget_all_itemsÚ	get_labelÚ
get_secret)r%  r>   ÚconÚcolÚitems        r-   Ú_get_gnome_keyring_passwordr  ¾  s·   € ÝØ�‰Ð3Ô4UÐ3VÐWÔXØô
 
×	Ñ	œM×3Ñ3Ó5Ó	6ð ¸#Ü×2Ñ2°3Ó7ˆØ×%Ñ%Ó'ò 	)ˆDØ�~‰~ÓÐ&:Ð%;¸=Ð#IÓIØ—‘Ó(Ñ(÷	ñ ð	)ð 	�‰Ð2Ô3Ø÷÷ ñ ús   Á?B>ÂB>Â"B>Â>Cc                 ó`  — |r	t         |   n
t        |«      }|j                  d|j                  › �«       |t         j                  t         j
                  t         j                  fv rt        | ||«      S |t         j                  k(  rt        | |«      S |t         j                  k(  ry J d|› �«       ‚)NzChosen keyring: zUnknown keyring )rÈ  rò  r¬   r   rÉ  rÊ  rË  r  rÌ  r  rÍ  )r%  rZ   r>   s      r-   r4  r4  Ï  s    € ñ )0Œm˜GÒ$Ô5JÈ6Ó5R€GØ
‡L�LÐ# G§L¡L >Ð2Ô3à”=×(Ñ(¬-×*@Ñ*@Ä-×BXÑBXÐYÑYÜ$Ð%9¸7ÀFÓKÐKØ	”M×.Ñ.Ò	.Ü*Ð+?ÀÓHÐHØ	”M×+Ñ+Ò	+àØ.Ð$ W IÐ.Ó.ˆ5r.   c           
      óZ  — |j                  d«       	 t        j                  dddd| d| › d�gt        j                  t        j
                  ¬«      \  }}}|r|j                  d	«       y |j                  d
«      S # t        $ r'}|j                  dt        |«      › �«       Y d }~y d }~ww xY w)Nz@using find-generic-password to obtain password from OSX keychainÚsecurityzfind-generic-passwordz-wz-az-sr  r  zfind-generic-password failedr  z)exception running find-generic-password: )
r¬   r   rø  rù  rú  rû  r(   r	  re   r   )r%  r>   rö  rO   rÿ  r   s         r-   rP  rP  ã  s­   € Ø
‡L�LÐSÔTðÜ %§	¡	ØÐ0ØØÐ'ØÐ*Ð+¨=Ð9ð;ô —?‘?¬:×+=Ñ+=ô!?Ñˆ��:ñ Ø�N‰NÐ9Ô:ØØ�}‰}˜UÓ#Ð#øÜò Ø�‰ÐBÄ<ÐPQÃ?ÐBSÐTÔUÜûðús   “AA: Á)A: Á:	B*ÂB%Â%B*c                 óä  — t        t        | d|«      «      }|€|j                  d«       y|j                  d|› d�«       t	        |d¬«      5 }t        j                  |«      }ddd«       	 d   d	   }t        j                  |«      }d}|j                  |«      s|j                  d«       yt        |t        |«      d |«      S # 1 sw Y   ŒdxY w# t        $ r |j                  d
«       Y yw xY w)z�
    References:
        - [1] https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/os_crypt/sync/os_crypt_win.cc
    zLocal StateNzcould not find local state filezFound local state file at "rx   rz   r{   Úos_cryptÚencrypted_keyzno encrypted key in Local States   DPAPIzinvalid key)r©   r  rD   r¬   r¯   r°   rc   ÚKeyErrorÚbase64Ú	b64decoderÃ   rZ  r½   )r$  r>   r™   rf  rn  Ú
base64_keyr  r‹   s           r-   rV  rV  õ  sð   € ô
 ”;˜|¨]¸FÓCÓD€DØ€|Ø�‰Ð6Ô7ØØ
‡L�LÐ.¨t¨f°AÐ6Ô7Ü	ˆd˜VÔ	$ð ¨Ü�y‰y˜‹|ˆ÷ðà˜*Ñ% oÑ6ˆ
ô ×$Ñ$ ZÓ0€Mà€FØ×#Ñ# FÔ+Ø�‰�]Ô#ØÜ! -´°F³°Ð"=¸vÓFÐF÷ð ûô
 ò Ø�‰Ð6Ô7Ùðús   ÁCÁ,C ÃCÃC/Ã.C/c                 ó4   — t        j                  d| |||«      S )NÚsha1)ÚhashlibÚpbkdf2_hmac)r5  r:  r;  r<  s       r-   r>  r>    s   € Ü×Ñ˜v x°°zÀ:ÓNÐNr.   c                 óÔ   — |D ]A  }t        t        | ||«      «      }	 |r|dd  j                  «       c S |j                  «       c S  |j	                  dd¬«       y # t        $ r Y Œcw xY w)Né    z\failed to decrypt cookie (AES-CBC) because UTF-8 decoding failed. Possibly the key is wrong?TrF  )r   r   r  r«  r(   )rI  Úkeysr>   Úinitialization_vectorrE  ÚkeyÚ	plaintexts          r-   rG  rG    s„   € Øò ˆÜÔ 5°jÀ#ÐG\Ó ]Ó^ˆ	ð	ÙØ   �~×,Ñ,Ó.Ò.Ø×#Ñ#Ó%Ò%ðð ‡N�NÐqð  ~B€Nô  CØøô "ò 	Ùð	ús   �A´AÁ	A'Á&A'c                 óô   — 	 t        | |||«      }	 |r|dd  j                  «       S |j                  «       S # t        $ r |j                  dd¬«       Y y w xY w# t        $ r |j                  dd¬«       Y y w xY w)Nz[failed to decrypt cookie (AES-GCM) because the MAC check failed. Possibly the key is wrong?TrF  r%  z\failed to decrypt cookie (AES-GCM) because UTF-8 decoding failed. Possibly the key is wrong?)r   rt   r(   r  r«  )rI  r(  r^  r_  r>   rE  r)  s          r-   rY  rY  !  sž   € ðÜ4°ZÀÐFXÐZ_Ó`ˆ	ð
ÙØ˜R˜S�>×(Ñ(Ó*Ð*Ø×ÑÓ!Ð!øô ò Ø�‰Ðtð  AEˆô  	FÙðûô ò Ø�‰Ðuð  BFˆô  	GÙðús%   ‚6 ‘A ¦A ¶AÁAÁA7Á6A7c                 ó"  ‡	— ddl Š	ddlŠ	 G ˆ	fd„d‰	j                  «      }‰	j                  | «      } |‰	j	                  |«      |«      } |«       }‰	j
                  j                  j                  ‰	j                  |«      ddddd‰	j                  |«      «      }|sd}|j                  |«       t        |«      ‚‰	j                  |j                  |j                  «      }‰	j
                  j                  j                  |j                  «       |S )zt
    References:
        - https://docs.microsoft.com/en-us/windows/win32/api/dpapi/nf-dpapi-cryptunprotectdata
    r   Nc                   ó~   •— e Zd ZdW ° j                  j                  fdW ° j                  W ° j                  «      fgZy)ú)_decrypt_windows_dpapi.<locals>.DATA_BLOBÚcbDataÚpbDataN)r7   r8   r9   ÚwintypesÚDWORDÚPOINTERÚc_charÚ_fields_)Úctypess   €r-   Ú	DATA_BLOBr-  :  s1   ø„ Ø™vŸ™×4Ñ4Ð5Ø™vŸ~™~©f¯m©mÓ<Ð=ð?‰r.   r6  z_Failed to decrypt with DPAPI. See  https://github.com/yt-dlp/yt-dlp/issues/10927  for more info)r5  Úctypes.wintypesÚ	StructureÚcreate_string_bufferÚsizeofÚwindllÚcrypt32ÚCryptUnprotectDataÚbyrefrD   r   Ú	string_atr/  r.  Úkernel32Ú	LocalFree)
rI  r>   r6  r‡  Úblob_inÚblob_outÚretr*   Úresultr5  s
            @r-   rZ  rZ  1  sè   ø€ ó Ûö?�F×$Ñ$ô ?ð ×(Ñ(¨Ó4€FÙ˜Ÿ™ fÓ-¨vÓ6€GÙ‹{€HØ
�-‰-×
Ñ
×
2Ñ
2Ø�‰�WÓØØØØØ	Ø�‰�XÓó€Cñ ØsˆØ�‰�WÔÜ˜GÓ$Ð$à×Ñ˜hŸo™o¨x¯©Ó?€FØ
‡M�M×Ñ×$Ñ$ X§_¡_Ô5Ø€Mr.   c                  ó|   — t         j                  j                  dt         j                  j	                  d«      «      S )NÚXDG_CONFIG_HOMEz	~/.config)r`   rï  rB   r™   rÞ   r:   r.   r-   rß   rß   T  s'   € Ü�:‰:�>‰>Ð+¬R¯W©W×-?Ñ-?ÀÓ-LÓMÐMr.   c                 ó¸   — t         j                  j                  |d«      }t        j                  | |«       t        j                  |«      }|j                  «       S )Nztemporary.sqlite)r`   r™   r¦   r  r  r   ÚconnectrÍ   )Údatabase_pathrÌ   Údatabase_copy_pathÚconns       r-   r¶   r¶   X  sB   € äŸ™Ÿ™ fÐ.@ÓAÐÜ
‡K�K�Ð1Ô2Ü�?‰?Ð-Ó.€DØ�;‰;‹=Ðr.   c                 ó”   — | j                  d|› d�«      j                  «       }|D �cg c]  }|d   j                  «       ‘Œ c}S c c}w )NzPRAGMA table_info(ru  r   )rº   r¼   r  )rÍ   Ú
table_nameÚ
table_infoÚrows       r-   r  r  `  sA   € Ø—‘Ð"4°Z°LÀÐ BÓC×LÑLÓN€JØ'1Ö2 ˆC�‰F�M‰M�OÒ2Ð2ùÒ2s   ¨Ac                 ó    — t        | d„ d ¬«      S )Nc                 ó@   — t        j                  | «      j                  S rN   )r`   ÚlstatÚst_mtime)r™   s    r-   rP   z_newest.<locals>.<lambda>f  s   € ¤r§x¡x°£~×'>Ñ'>€ r.   )r(  Údefault)Úmax)Úfiless    r-   r©   r©   e  s   € ÜˆuÑ>ÈÔMÐMr.   c           
   #   ó(  K  — d}t        |«      5 }t        j                  | «      D ]S  \  }}}|D ]H  }|dz  }|j                  d|› d|d›d�«       ||k(  sŒ't        j                  j                  ||«      –— ŒJ ŒU 	 d d d «       y # 1 sw Y   y xY w­w)Nr   r   zSearching for "z": r�   z files searched)rS   r`   Úwalkr6   r™   r¦   )	ræ   Úfilenamer>   rÑ   rH   Ú	curr_rootrO   rW  rG   s	            r-   r  r  i  s›   è ø€ à	€AÜ	˜fÓ	%ð 8¨Ü#%§7¡7¨4£=ò 	8ÑˆI�q˜%Øò 8�Ø�Q‘�Ø×"Ñ" _°X°J¸cÀ!ÀCÀÈÐ#XÔYØ˜8Ó#ÜŸ'™'Ÿ,™, y°$Ó7Ó7ñ	8ñ	8÷8÷ 8ñ 8üs#   ‚B�ABÁ&BÁ=	BÂBÂBc                 ó”   — t        «       }| D ]8  }|D ]  }|j                  |«       Œ |j                  €Œ(|j                  |_        Œ: |S rN   )r_   rÄ   rZ  )ÚjarsÚ
output_jarrm   rÕ   s       r-   rd   rd   u  sT   € Ü#Ó%€JØò /ˆØò 	*ˆFØ×!Ñ! &Õ)ð	*à�<‰<Ñ#Ø"%§,¡,ˆJÕð	/ð
 Ðr.   c                 ó�   ‡ — t        ˆ fd„t        j                  j                  t        j                  j                  fD «       «      S )Nc              3   ó,   •K  — | ]  }|sŒ|‰v –— Œ y ­wrN   r:   )r‡   Úsepr“   s     €r-   rˆ   z_is_path.<locals>.<genexpr>€  s   øè ø€ ÒL Êˆs�eŒ|ÑLùs   ƒ‹	)Úanyr`   r™   ra  Úaltsep)r“   s   `r-   r¥   r¥     s)   ø€ ÜÓL¬¯©¯©´R·W±W·^±^Ð'DÔLÓLÐLr.   c                 ó´   — | t         vrt        d| › d�«      ‚|d gt        ¢­vrt        d|› d�«      ‚|�t        t	        |«      «      rt	        |«      }| |||fS )Nzunsupported browser: "rx   zunsupported keyring: ")ÚSUPPORTED_BROWSERSrt   ÚSUPPORTED_KEYRINGSr¥   r   )rj   rk   rZ   r[   s       r-   r\   r\   ƒ  sq   € ØÔ-Ñ-ÜÐ1°,°¸qÐAÓBÐBØ�tÐ1Ô0Ñ1Ñ1ÜÐ1°'°¸!Ð<Ó=Ð=ØÐœx¬°GÓ(<Ô=Ü˜gÓ&ˆØ˜ '¨9Ð4Ð4r.   c                   óL  ‡ — e Zd ZdZd ej
                  d«      z   Ze ej
                  d«      z   Z ej                  de› d�ej                  «      Z
h d£Zdd	hZ ej                  d
ez   dz   ej                  ej                  z  «      Z ej                  d«      Zˆ fd„Zˆ xZS )ÚLenientSimpleCookiez1More lenient version of http.cookies.SimpleCookiez\w\dz!#$%&'*+-.:^_`|~z(),/<=>?@[]{}ú[z]+>	   úmax-ager™   r–   r›   rž   rœ   r’   ÚhttponlyÚsamesiter›   rk  a>  
        [ ]*                           # Optional whitespace at start of cookie
        (?P<key>                       # Start of group 'key'
        [^ =;]+                        # Match almost anything here for now and validate later
        )                              # End of group 'key'
        (                              # Optional group: there may not be a value.
        [ ]*=[ ]*                        # Equal Sign
        (                                # Start of potential value
        (?P<val>                           # Start of group 'val'
        "(?:[^\\"]|\\.)*"                    # Any doublequoted string
        |                                    # or
        \w{3},\ [\w\d -]{9,11}\ [\d:]{8}\ GMT  # Special case for "expires" attr
        |                                    # or
        [a  ]*     # Any word or empty string
        )                                  # End of group 'val'
        |                                  # or
        (?P<bad>(?:\\;|[^;])*?)            # 'bad' group fallback for invalid values
        )                                # End of potential value
        )?                             # End of optional value group
        [ ]*                            # Any number of spaces.
        ([ ]+|;|$)                      # Ending either at space, semicolon, or EOS.
        z[\x00-\x1F\x7F]c                 ól  •— t        |t        «      st        ‰| �  |«      S d }| j                  j                  |«      D �]s  }|j                  d«      rd }Œ|j                  dd«      \  }}| j                  j                  |«      sd }ŒKd}|j                  d«      r|dd  }d}|j                  «       }|| j                  v rm|€Œ†|€|| j                  vrd }Œ™d}nN| j                  |«      \  }}| j                  j                  |«      r| j!                  |j"                  d «       d }Œê|||<   Œð|rd }Œõ|�{| j%                  |t&        j(                  j+                  «       «      }| j                  |«      \  }	}
| j                  j                  |	«      rd }�ŒX|j-                  ||	|
«       || |<   �Œrd }�Œv y )NÚbadr(  ÚvalFú$r   T)r²   rå  r'   rc   Ú_COOKIE_PATTERNÚfinditerr„   Ú_LEGAL_KEY_RErƒ   rÃ   r  Ú	_RESERVEDÚ_FLAGSÚvalue_decodeÚ_CONTROL_CHARACTER_REÚsearchÚpopr(  rB   r¿   rü   ÚMorselÚset)r)   rn  ÚmorselÚmatchr(  r“   Úis_attributeÚ	lower_keyrO   Ú
real_valueÚcoded_valuer,   s              €r-   rc   zLenientSimpleCookie.load¿  s­  ø€ ä˜$¤Ô$Ü‘7‘< Ó%Ð%àˆØ×)Ñ)×2Ñ2°4Ó8ó 4	ˆEØ�{‰{˜5Ô!Ø�ØàŸ™ U¨EÓ2‰JˆC�Ø×%Ñ%×/Ñ/°Ô4Ø�Øà ˆLØ�~‰~˜cÔ"Ø˜!˜"�g�Ø#�àŸ	™	›ˆIØ˜DŸN™NÑ*Ø�>Øà�=Ø ¨¯©Ñ3Ø!%˜Ø Ø ‘Eà#×0Ñ0°Ó7‘H�E˜1à×1Ñ1×8Ñ8¸Ô?ð Ÿ™ §¡¨TÔ2Ø!%˜Ø à#��s’áØ‘àÐ"ØŸ™ #¤t§|¡|×':Ñ':Ó'<Ó=�Ø*.×*;Ñ*;¸EÓ*BÑ'�
˜Kà×-Ñ-×4Ñ4°ZÔ@Ø!�FÙØ—
‘
˜3 
¨KÔ8Ø"��S“	ð ’ñi4	r.   )r7   r8   r9   r  r‚   ÚescapeÚ_LEGAL_KEY_CHARSÚ_LEGAL_VALUE_CHARSÚcompileÚASCIIrs  rt  ru  ÚVERBOSErq  rw  rc   rJ   rK   s   @r-   rh  rh  �  sÄ   ø„ Ù;ð   §¡Ð+>Ó!?Ñ?ÐØ)¨I¨B¯I©I°oÓ,FÑFÐØ�B—J‘J !Ð$4Ð#5°RÐ8¸"¿(¹(ÓC€Mò
€Ið ˜
Ð#€Fð !�b—j‘jð "ð "ñ""ð%ñ"ð* �X‰X˜Ÿ
™
Ñ"ó+$€Oð2 '˜BŸJ™JÐ'9Ó:Ð÷:ð :r.   rh  c                   ó¼   ‡ — e Zd ZdZdZdZdZ ej                  dd«      Z	dˆ fd„	Z
ed„ «       Zej                  d	d
œd„«       Zd„ Zdd„Zdd„Zd„ Zd„ Zˆ fd„Zˆ xZS )r_   z]
    See [1] for cookie file format.

    1. https://curl.haxx.se/docs/http-cookies.html
    z
#HttpOnly_é   zO# Netscape HTTP Cookie File
# This file is generated by yt-dlp.  Do not edit.

ÚCookieFileEntry)Údomain_nameÚinclude_subdomainsr™   Ú
https_onlyÚ
expires_atr   r“   c                 óz   •— t        ‰| �  d g|¢­i |¤Ž t        |«      rt        j                  |«      }|| _        y rN   )r'   r2  r   r`   ÚfspathrZ  )r)   rZ  ÚargsÚkwargsr,   s       €r-   r2  zYoutubeDLCookieJar.__init__  s7   ø€ Ü‰Ñ˜Ð/ Ò/¨Ò/Ü˜Ô!Ü—y‘y Ó*ˆHØ ˆ�r.   c                 ó   — | rdS dS )NÚTRUEÚFALSEr:   )Úcndns    r-   Ú_true_or_falsez!YoutubeDLCookieJar._true_or_false  s   € áˆvÐ* 7Ð*r.   F©Úwritec             #   ó¨   K  — t        |«      r t        ||rdndd¬«      5 }|–— d d d «       y |r|j                  d«       |–— y # 1 sw Y   y xY w­w)NÚwÚrzutf-8r{   r   )r   r¯   Útruncate)r)   rG   r™  rf  s       r-   r¯   zYoutubeDLCookieJar.open  sT   è ø€ ä˜ÔÜ�d¡5™C¨c¸GÔDð ÈØ’÷ð ñ Ø—‘˜aÔ Ø‹J÷ð üs   ‚A A¥!AÁAÁAc                 óú  — t        j                   «       }| D ]â  }|s|j                  s|s|j                  |«      rŒ%|j                  |j                  }}|€d|}}|j                  dj                  dj                  |j                  | j                  |j                  j                  d«      «      |j                  | j                  |j                  «      t        |j                  d¬«      ||f«      «      «       Œä y )Nrá   z{}
ú	r�   )rU  )r2   r�   Ú
is_expiredr   r“   r™  Úformatr¦   r–   r—  rÃ   r™   r›   r   rœ   )r)   rf  Úignore_discardÚignore_expiresÚnowrÕ   r   r“   s           r-   Ú_really_savezYoutubeDLCookieJar._really_save   sÐ   € Ü�i‰i‹kˆØò 	ˆFÙ#¨¯ªÙ*¨v×/@Ñ/@ÀÔ/EØØ Ÿ+™+ v§|¡|�%ˆDØˆ}ð ! $�e�Ø�G‰G�F—M‘M $§)¡)Ø—‘Ø×#Ñ# F§M¡M×$<Ñ$<¸SÓ$AÓBØ—‘Ø×#Ñ# F§M¡MÓ2Ü˜FŸN™N°BÔ7Ø�eð-ó #ó õ ñ	r.   c                 ób  — |€<| j                   �| j                   }n#t        t        j                  j                  «      ‚| D ]  }|j
                  �Œd|_        Œ | j                  |d¬«      5 }|j                  | j                  «       | j                  |||«       ddd«       y# 1 sw Y   yxY w)zÂ
        Save cookies to a file.
        Code is taken from CPython 3.6
        https://github.com/python/cpython/blob/8d999cbf4adea053be6dbb612b9844635c4dfb8e/Lib/http/cookiejar.py#L2091-L2117 Nr   Tr˜  )
rZ  rt   r¿   rÀ   ÚMISSING_FILENAME_TEXTrœ   r¯   r™  Ú_HEADERr¥  )r)   rZ  r¢  r£  rÕ   rf  s         r-   ÚsavezYoutubeDLCookieJar.save5  s£   € ð ÐØ�}‰}Ð(ØŸ=™=‘ä ¤§¡×!EÑ!EÓFÐFð ò 	#ˆFØ�~‰~Ñ%Ø!"�•ð	#ð �Y‰Y�x tˆYÓ,ð 	A°Ø�G‰G�D—L‘LÔ!Ø×Ñ˜a °Ô@÷	A÷ 	Añ 	Aús   Á-/B%Â%B.c           
      óº  ‡ — |€<‰ j                   �‰ j                   }n#t        t        j                  j                  «      ‚ˆ fd„}t        j                  «       }‰ j                  |«      5 }|D ]  }	 |j                   ||«      «       Œ 	 ddd«       |j                  d«       ‰ j                  ||||«       ‰ D ]   }	|	j                  dk(  sŒd|	_        d
|	_        Œ" y# t        j                  j                  $ rS}|j                  «       › d�d   dv rt        j                  j                  d«      ‚t        d|› d|›d	�«       Y d}~ŒÜd}~ww xY w# 1 sw Y   ŒÇxY w)zLoad cookies from a file.Nc                 ó*  •— | j                  ‰j                  «      r| t        ‰j                  «      d  } | j                  d«      s| j                  «       s| S | j	                  d«      }t        |«      ‰j
                  k7  r+t        j                  j                  dt        |«      › �«      ‚ ‰j                  |Ž }|j                  rLt        j                  d|j                  «      s,t        j                  j                  d|j                  › �«      ‚| S )Nú#rŸ  zinvalid length z[0-9]+(?:\.[0-9]+)?zinvalid expires at )rÃ   Ú_HTTPONLY_PREFIXr½   ræ  rç  Ú
_ENTRY_LENr¿   rÀ   Ú	LoadErrorÚ_CookieFileEntryrŽ  r‚   rƒ   )r  Úcookie_listrÕ   r)   s      €r-   Úprepare_linez-YoutubeDLCookieJar.load.<locals>.prepare_lineR  sß   ø€ Ø�‰˜t×4Ñ4Ô5ØœC × 5Ñ 5Ó6Ð7Ð8�à�‰˜sÔ#¨4¯:©:¬<Ø�ØŸ*™* TÓ*ˆKÜ�;Ó 4§?¡?Ò2Ü—n‘n×.Ñ.°ÄÀ[ÓAQÐ@RÐ/SÓTÐTØ*�T×*Ñ*¨KÐ8ˆFØ× Ò ¬¯©Ð6LÈf×N_ÑN_Ô)`Ü—n‘n×.Ñ.Ð1DÀV×EVÑEVÐDWÐ/XÓYÐYØˆKr.   ú r   z[{"z�Cookies file must be Netscape formatted, not JSON. See  https://github.com/yt-dlp/yt-dlp/wiki/FAQ#how-do-i-pass-cookies-to-yt-dlpz+WARNING: skipping cookie file entry due to z: ú
T)rZ  rt   r¿   rÀ   r§  ÚioÚStringIOr¯   r™  r¯  ræ  r   ÚseekÚ_really_loadrœ   r�   )
r)   rZ  r¢  r£  r²  Úcfrf  r  r   rÕ   s
   `         r-   rc   zYoutubeDLCookieJar.loadJ  sM  ø€ àÐØ�}‰}Ð(ØŸ=™=‘ä ¤§¡×!EÑ!EÓFÐFô	ô �[‰[‹]ˆØ�Y‰Y�xÓ ð 
	 AØò 	�ðØ—H‘H™\¨$Ó/Õ0ñ	÷
	ð 	�‰�Œ
Ø×Ñ˜"˜h¨¸ÔGð ò 	&ˆFà�~‰~ Ó"Ø!%�”Ø!%�•ñ		&øô% —~‘~×/Ñ/ò ØŸ*™*›,˜ qÐ)¨!Ñ,°Ñ5Ü"Ÿn™n×6Ñ6ðhóið iô !Ð#NÈqÈcÐQSÐTXÐS[Ð[]Ð!^Ô_Üûðú÷	
	ð 
	ús7   Á*EÁ1CÂEÃEÃ;A	E	ÅEÅ	EÅEÅEc                 ó¨   — t         j                  j                  t        t	        |«      «      «      }| j                  |«       |j                  d«      S )z-Generate a Cookie HTTP header for a given urlrÁ   )ÚurllibÚrequestÚRequestr   r   Úadd_cookie_headerÚ
get_header)r)   ÚurlÚ
cookie_reqs      r-   Úget_cookie_headerz$YoutubeDLCookieJar.get_cookie_header}  s?   € ä—^‘^×+Ñ+¬M¼,ÀsÓ:KÓ,LÓMˆ
Ø×Ñ˜zÔ*Ø×$Ñ$ XÓ.Ð.r.   c           	      óè   — t        t        j                  «       «      x| j                  _        | _        | j	                  t
        j                  j                  t        t        |«      «      «      «      S )z1Generate a list of Cookie objects for a given url)
r³   r2   Ú_policyÚ_nowÚ_cookies_for_requestr»  r¼  r½  r   r   )r)   rÀ  s     r-   Úget_cookies_for_urlz&YoutubeDLCookieJar.get_cookies_for_urlƒ  sM   € ô ),¬D¯I©I«KÓ(8Ð8ˆ�‰Ô˜DœIØ×(Ñ(¬¯©×)?Ñ)?ÄÌlÐ[^ÓN_Ó@`Ó)aÓbÐbr.   c                 ó€   •— t        j                  t        «      5  t        ‰| �  |i |¤Žcd d d «       S # 1 sw Y   y xY wrN   )r·   Úsuppressr  r'   Úclear)r)   r‘  r’  r,   s      €r-   rÊ  zYoutubeDLCookieJar.clearŠ  s7   ø€ Ü× Ñ ¤Ó*ñ 	2Ü‘7‘= $Ð1¨&Ñ1÷	2÷ 	2ò 	2ús   ›4´=rN   )NTT)r7   r8   r9   r  r­  r®  r¨  ÚcollectionsÚ
namedtupler°  r2  rL  r—  r·   Úcontextmanagerr¯   r¥  r©  rc   rÂ  rÇ  rÊ  rJ   rK   s   @r-   r_   r_   ü  s”   ø„ ñð
 $ÐØ€Jð€Gð .�{×-Ñ-ØØbódÐõ!ð ñ+ó ð+ð ×ÑØ"'ó ó ðòó*Aó*1&òf/òc÷2ð 2r.   r_   )s                   FrI   )NNN)nr  rË  r·   r—  r–  rJ  rã   r"  Úhttp.cookiejarr¿   Úhttp.cookiesrµ  r°   r`   r‚   r  r{  rù  rÛ   r´   r2   Úurllib.requestr»  Úenumr   r   Úaesr   r   r   Údependenciesr	   r
   r   Ú
minicursesr   r   Úutilsr   r   r   r   r   r   r   r   r   r   Úutils._utilsr   Úutils.networkingr   rr   re  r$   rS   rU   rn   r^   rp   r¤   rª   r÷   rs   r  r  r  r#  r!  r"  rq   re   ri  rk  rœ  r¢  r©  r¤  rd  r¹  rÈ  Ú__members__r&  rf  rí  rò  r  r  r  r4  rP  rV  r>  rG  rY  rZ  rß   r¶   r  r©   r  rd   r¥   r\   rü   ÚSimpleCookierh  rÀ   ÚMozillaCookieJarr_   r:   r.   r-   ú<module>rÛ     sA  ðÛ Û Û Û Û Û Û Û Û Û 	Û Û 	Û 	Û Û Û Û 
Û Û Û ß ÷ñ ÷
ñ ÷
 @÷÷ ÷ õ %Ý +â^Ð Ø,°	¸8Ð/DÑDÐ ô=�
ô =ò4ô	�nô 	ò8ð. 8<ÁIÃKð =Ð\`Ðlpô =òIòXò2Qò9òxK*ò\1÷0Hñ HðD QUÐcgô pô5Ð!6ô 5ôp#Ð4ô #ôD%RÐ#8ô %RòPô4	�)ô 	÷03ñ 03òfvò ò,ò('ðT $(±	³ó ô"˜tô ô(	�Dô 	ð #×.Ñ.×3Ñ3Ó5Ð òC*òLò:&òR(òVò"/ò(ò$Gò6Oó
óò  òFNòò3ò
Nò	8òòMó5ôl˜$Ÿ,™,×3Ñ3ô lô^P2˜Ÿ™×8Ñ8õ P2r.   