
    Dc``]              	       "   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 dZd Zd Z	 d3dZ	  G d de          Zd	 Zd
 Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d dee          Z  G d de          Z! G d de!eee          Z" G d de!ee          Z# G d d e!ee          Z$ G d! d"e          Z% G d# d$e          Z& G d% d&e&          Z' G d' d(e'          Z( G d) d*e&e!ee%e          Z) G d+ d,e(e)          Z* G d- d.e          Z+ G d/ d0e+e'ee%e          Z, G d1 d2e(e,          Z-dS )4    N)_
   c                    | j         sd S 	 |                                 s<t          j        t          d                     t	          j        t                     d S d S # t          t          f$ r t	          j        t                     Y d S t          $ rP}t          j        t          d          t          |          z             t	          j        d           Y d }~d S d }~ww xY w)NAbortingzConfirmation failed: %s   )confirmALCLogerrorr   sysexitBREAK_APT_EXIT_CODEKeyboardInterruptEOFError	Exceptionstr)configfrontendexs      -/usr/share/apt-listchanges/apt_listchanges.pyconfirm_or_exitr   1   s    > !! 	*L:'''H()))))	* 	* x( & & &$%%%%%%   Q011CGG;<<<s   AA *C#
	C#ACC#c                 <   t          j        t          d          | j        |dz             t          j                            d          }d|_        t          j        j        |_	        t          j
                                        }| j        dk    r(t          |                               ||          }d|d<   d|d	<   |                                r|                                r|nt          j                            ||          |d
<   | j        |d<   |                    ||           	 t)          j        g d|                                d           d S # t.          $ r7}t          j        t          d          | j        |dz             Y d }~d S d }~ww xY w)Nz Mailing %(address)s: %(subject)s)addresssubjectzutf-88bithtmlztext/html; charset=utf-8zContent-Typezauto-generatedzAuto-SubmittedSubjectTo)/usr/sbin/sendmailz-oiz-tT)inputcheckz.Failed to send mail to %(address)s: %(errmsg)s)r   errmsg)r	   infor   email_addressemailcharsetCharsetbody_encodingQPheader_encodingmessageMessageemail_formatr   convert_to_htmlisasciiisprintableheaderHeaderset_payload
subprocessrunas_bytesr   warning)r   changesr   r%   r*   r   s         r   mail_changesr8   >   s   
K455$2%' '' ( ( ( m##G,,G"G#m.Gm##%%Gf$$v,,..w@@"< 0G%,__%6%6 M7;N;N;P;P M''',|':':7G'L'L I(GDM)))(:::'BRBRBTBT\`aaaaaa ( ( (qIJJ$*$8#%' '' 	( 	( 	( 	( 	( 	( 	( 	( 	((s   -+E 
F$,FFc                     t           j                            d          s(|r$t          j        t          d          |z             dS | j        s(|r$t          j        t          d          |z             dS dS )Nr   z9The mail frontend needs an installed 'sendmail', using %sFzDThe mail frontend needs an e-mail address to be configured, using %sT)ospathexistsr	   r
   r   r#   )r   replacementFrontends     r   can_send_emailsr>   Y   s    7>>.//  	7LVWW"56 7 7 7u  	7Labb"56 7 7 7u4    c                       e Zd ZdS )EUnknownFrontendN__name__
__module____qualname__ r?   r   rA   rA   j           Dr?   rA   c           
      B   dt          d          z   dz   d                    fdt          dt                              D                       z   t          d          z   }dD ]}	 t	          |                               |          }|s nbt          |          dz
           c S # t          $ r;}t          j	        t          d	          t          |          z             Y d
}~d
}~ww xY wt          j        t          d          | j        z             | j        S )z, Utility function used for testing purposes 
z$Available apt-listchanges frontends: c                 0    g | ]}d |dz   |         fz  S )z	  %d. %s
r   rF   ).0i	frontendss     r   
<listcomp>z$_select_frontend.<locals>.<listcomp>p   s+    XXX!lAaC	!#55XXXr?   r   z*Choose a frontend by entering its number: )r         r   	Error: %sNzUsing default frontend: %s)r   joinrangelen
ttyconfirmttyaskintr   r	   r
   r   r"   r   )r   rN   promptrM   responser   s    `    r   _select_frontendr[   m   s8   A<===DWWXXXXuQI?W?WXXXYYZ;<<=F  3 3	3!&))0088H S]]1_---- 	3 	3 	3L;#b''122222222	3 K.//&/ABBB?s   )$B)B))
C.31C))C.c                    t           t          t          t          t          t
          t          t          t          d d d}ddg}| j	        r=t          | t          t          |                                                              }n| j        }|dk    rd S ||v rn.| j        dk    rt!          |           rd}nd S | j        dk    r|dk    st!          | d          sd}n|dk    rt!          | d	          sd	}|d
v rUdt"          j        vrG|                    d          r
|dd          nd	}t)          j        t-          d          d|iz             |dk    rs	 t/          d          }|j        ||<   nX# t2          $ rK}| j        r| j        r
d}d| _        nd	}t)          j        t-          d          ||dz             Y d }~nd }~ww xY w|| _        ||vrt:           ||         | |          S )N)textpagerdebconfmailsysloglogbrowserxterm-pagerxterm-browsergtknonera   rb   rg   rP   r`   r   r]   r^   )rf   rd   re   DISPLAYzxterm-   z1$DISPLAY is not set, falling back to %(frontend)sr   rf   AptListChangesGtkFz|The gtk frontend needs a working python3-gi,
but it cannot be loaded. Falling back to %(frontend)s.
The error is: %(errmsg)s)r   r!   )text_frd	pager_frddebconf_frdmail_frd
syslog_frdlog_frdbrowser_frdxterm_pager_frdxterm_browser_frdselect_frontendr[   sortedlistkeysr   quietr>   r:   environ
startswithr	   r
   r   
__import__gtk_frdImportErrorapt_modefrontend_from_envr   rA   )r   packages_countrN   frontends_no_overridenamerf   r   s          r   make_frontendr      s{   #%(#'!)"1$5
" 
"I 
  tINN4D4D/E/E(F(FGGv~~t $$$ 
		6"" 	DD4 
		6>>!@!@>D 6>>/&'"B"B>D:::yPRPZ?Z?Z#x88E488gDLNOO",t!45 6 6 6 5==D !455"%+	$ D D D? #v'? # "D%*FNN"DQ  : ; ; 04r"B"BC D D D D D D D DD FO99T?6>222s   E/ /
G9AF??Gc                   $     e Zd Z fdZd Z xZS )basec                 V    t                                                       || _        d S N)super__init__r   )selfr   args	__class__s      r   r   zbase.__init__   s$    r?   c                     |S r   rF   r   r]   s     r   _renderzbase._render   s    r?   )rC   rD   rE   r   r   __classcell__r   s   @r   r   r      sG                  r?   r   c                   $     e Zd Z fdZd Z xZS )titledc                 B     t                      j        |  d| _        d S )Nzapt-listchanges output)r   r   titler   r   r   s     r   r   ztitled.__init__   s"    $-


r?   c                     || _         d S r   )r   )r   r   s     r   	set_titleztitled.set_title   s    


r?   )rC   rD   rE   r   r   r   r   s   @r   r   r      sG        . . . . .      r?   r   c                   >     e Zd Z fdZddZd Zd Zd Zd Z xZ	S )	r   c                 Z    t                                          ||           || _        d S r   )r   r   r   )r   r   r   r   s      r   r   zfrontend.__init__   s+    000,r?   r   c                     d S r   rF   r   diffs     r   update_progresszfrontend.update_progress       r?   c                     d S r   rF   r   s    r   progress_donezfrontend.progress_done   r   r?   c                     d S r   rF   r   s     r   display_outputzfrontend.display_output   r   r?   c                     dS NFrF   r   s    r   needs_tty_stdinzfrontend.needs_tty_stdin       ur?   c                     dS NTrF   r   s    r   r   zfrontend.confirm       tr?   r   )
rC   rD   rE   r   r   r   r   r   r   r   r   s   @r   r   r      s        - - - - -               r?   r   c                       e Zd Zd ZdS )rm   c                    dd l }dd l}dt          j        vst          j        d         dk    rd S |                     |j        |j        d          }|                    t          j        d                    |                                }|                                 |	                    ||          }t          j        d          }t          j        |                                d           |                    d	           |                    d
          D ]G}|                                r|                    d|z   d
z              2|                    d           H|                                 |                    d|j                   |                                 |                    d           |                    dd| j                   |                    dd| j                   |                    d           |                    ddd           |                    dd           |                                 |                                 d S )Nr   DEBIAN_FRONTENDpassthroughDEBCONF_PIPE)readwriteapt-listchanges-tmp)prefixi  s   Template: apt-listchanges/info
Type: title
Description: NEWS

Template: apt-listchanges/title
Type: title
Description: ${title}

Template: apt-listchanges/news
Type: note
Description: ${packages_count} packages
rI   z  z .
x_loadtemplatefilezapt-listchanges/infozapt-listchanges/titler   zapt-listchanges/newsr   seenfalsehigh)socketr_   r:   ry   AF_UNIXSOCK_STREAMconnectmakefilecloseDebconftempfileNamedTemporaryFilefchmodfilenor   splitstripflushcommandr   r"   substr   r   settitlefsetr   go)	r   r]   r   dcsockdcfddbtmplines	            r   r   zdebconf_frd.display_output   s   BJ.."*=N2OS`2`2`F}}V^V-?CCRZ/000}}

ZZTZ..)1FGGG
	#**,,&&&		 
- 
	. 
	. 
	. JJt$$ 	" 	"Dzz|| "		$+,----		&!!!!		


'222		
&'''
('4:>>>
')94;NOOO
+,,,
&888
/000


r?   NrC   rD   rE   r   rF   r?   r   rm   rm      s#        & & & & &r?   rm   c                        e Zd Zd Zd Zd ZdS )rV   c                 $   t           j                                        r?t           j                                        r!t	          |                                          S t          j                    }t          ddd          5 }|	                    |
                    |                     |                                 |                    |                                                                          cd d d            S # 1 swxY w Y   d S )Nz/dev/ttyzrb+r   )	buffering)r   stdinisattystdoutr   rstripALChackssystem_encodingopenr   to_bytesr   
from_bytesreadline)r   rY   encttys       r   rW   zttyconfirm.ttyask  s   9 	*#*"3"3"5"5 	*=='')))&((*eq111 	;SIIcll6**+++IIKKK>>#,,..1188::	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	;s   A5DD	D	c                     |                      dt          d          z             }|dk    p0t          j        t	          j        t          j                  |          S )Nzapt-listchanges: zDo you want to continue? [Y/n] rJ   )rW   r   researchlocalenl_langinfoYESEXPR)r   rZ   s     r   r   zttyconfirm.confirm)  sS    ;;2Q7X5Y5YYZZ2~ 56+=fn+M+M+3"5 "5 	5r?   c                     | j         j        S r   )r   r   r   s    r   r   zttyconfirm.needs_tty_stdin-  s    {""r?   N)rC   rD   rE   rW   r   r   rF   r?   r   rV   rV     sA        ; ; ;5 5 5# # # # #r?   rV   c                       e Zd ZddZd ZdS )simpleprogressr   c                     | j         j        dk    rd S t          | d          s-d| _        t	          j        t          d          dz              d S d S )Nr   message_printedReading changelogsz...)r   rx   hasattrr   r	   r"   r   r   s     r   r   zsimpleprogress.update_progress1  s`    ;q  Ft.// 	9#$D K.//%788888	9 	9r?   c                     d S r   rF   r   s    r   r   zsimpleprogress.progress_done9  r   r?   Nr   rC   rD   rE   r   r   rF   r?   r   r   r   0  s7        9 9 9 9    r?   r   c                       e Zd ZdS )rn   NrB   rF   r?   r   rn   rn   <  rG   r?   rn   c                       e Zd Zd ZdS )prepend_titlec                 n    | j         j        s|S | j        dz   t          | j                  dz  z   dz   |z   S )NrI   -z

)r   r   r   rU   r   s     r   r   zprepend_title._render@  sE    {! 	KzD C
OOc$9: 	r?   N)rC   rD   rE   r   rF   r?   r   r   r   ?  s#            r?   r   c                       e Zd Zd ZdS )rk   c                     t           j                            t          j                                        |                     |                               d S r   )r   r   r   r   r   	as_stringr   r   s     r   r   ztext_frd.display_outputG  sA    
133==dll4>P>PQQRRRRRr?   Nr   rF   r?   r   rk   rk   F  s(        S S S S Sr?   rk   c                       e Zd Zd ZdS )ro   c                    dd l }|                    |j                   |                     t          j                                        |                     |                               |                                 d S )Nr   )facility)ra   openlog
LOG_DAEMONr   r   r   r   closelog)r   r]   ra   s      r   r   zsyslog_frd.display_outputK  sm     1222h.00::4<<;M;MNNOOOr?   Nr   rF   r?   r   ro   ro   J  s#            r?   ro   c                       e Zd Zd ZdS )rp   c           	         t          j                                        |                     |                    }t	          | j        j        d          5 }| j        j        rt          j	        | j        j                  | _
        t          j        |                                 t          j        ||                                 |                                           }|                    |           |j        dk    r9t'          t)          d          t+          |j                  t.          dz            n|                    |           d d d            d S # 1 swxY w Y   d S )Na)r   r   
preexec_fnenv)r   r   -Command %(cmd)s exited with status %(status)dcmdstatus)r   r   r   r   r   r   rb   filtershlexr   r   r3   Popenget_commandPIPEget_preexec_fnget_environcommunicate
returncodeOSErrorr   r   r   r  r   )r   r]   outputfprocesss        r   r   zlog_frd.display_outputS  s   )++55dll46H6HII$+/3'' 	 1{!  ${4;+=>>$*$$&&joa#2244$:J:J:L:L   ##&#111%**!!$S"T"T,/,=,=$P$P#Q R R R + 	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 s   C9EE!ENr   rF   r?   r   rp   rp   R  s#                 r?   rp   c                       e Zd ZddZd ZdS )fancyprogressr   c                 \   |sd S t          | d          sd| _        d| _        | xj        |z  c_        t          d          d| j        dz  | j        z  z  z   }t          |          | _        t          j                            |dz              t          j        	                                 d S )Nprogressr   r   z... %d%%d   )
r   r  line_lengthr   r   rU   r   r   r   r   )r   r   r   s      r   r   zfancyprogress.update_progressd  s     	FtZ(( 	!DM D%&&t}s7JTM`7`)aat99
%%%
r?   c                 >   t          | d          rt          j                            d| j        z  dz              t          j                            t          d          dz   t          d          z   dz              t          j                                         d S d S )Nr   r  r   z... DonerI   )r   r   r   r   r  r   r   r   s    r   r   zfancyprogress.progress_doneq  s    4'' 	JS4#33d:;;;JQ344v=&		IDPQQQJ	 	r?   Nr   r   rF   r?   r   r  r  c  s7               r?   r  c                   H     e Zd Z fdZd Zd Zd Zd Zd Zd Z	d Z
 xZS )	
runcommandc                 ^     t                      j        |  d| _        d| _        d | _        d S )NTrJ   )r   r   waitsuffixr   r   s     r   r   zruncommand.__init__x  s0    $	r?   c                    | j         st          j                    dk    rd S t          j        d| j        |                                           }	 |                    | j        	                    | 
                    |                               |                                 |                     |                                           t          j        |                                          j        }t!          j        d           t%          j        |                                 |j        gz   |                                 |                                           }|                                 }|dk    r4t1          t3          d          t5          |j                  |dz            t9          dd	          D ]G}|t          j        |                                          j        k    r nt!          j        d
           H|                     |           n# |                     |           w xY w| j         st=          j        d           d S d S )Nr   r   )r   r$  dirg?)r  r  r  r  r   r   g      ?) r#  r:   forkr   r   r$  
get_tmpdirr   r   r   r   r   fchown_tmpfiler   fstatst_atimetimesleepr3   r  r  r   r  r  r  r   r   r   rT   _close_temp_filer   r   )r   r]   r   atimer  r  rM   s          r   r   zruncommand.display_output  s    y 	RWYY!^^F)1Ft{`d`o`o`q`qrrr	'IIdh''T(:(:;;<<<IIKKK

---HSZZ\\**3E JsOOO &t'7'7'9'9SXJ'FSWSfSfShShnrn~n~  oA  oA  B  B  BG\\^^F{{a OPP(+GL(9(9V L LM N N N 1b\\    BHSZZ\\22;;;E
3!!#&&&&D!!#&&&&y 	HQKKKKK	 	s   F6H H3c                 R    	 |                                  d S # t          $ r Y d S w xY wr   )r   FileNotFoundError)r   r   s     r   r.  zruncommand._close_temp_file  s:    	IIKKKKK  	 	 	DD	s    
&&c                     | j         S r   )r   r   s    r   r  zruncommand.get_command  
    |r?   c                     d S r   rF   r   r   s     r   r)  zruncommand.fchown_tmpfile  r   r?   c                     d S r   rF   r   s    r   r(  zruncommand.get_tmpdir  r   r?   c                     d S r   rF   r   s    r   r  zruncommand.get_preexec_fn  r   r?   c                     d S r   rF   r   s    r   r  zruncommand.get_environ  r   r?   )rC   rD   rE   r   r   r.  r  r)  r(  r  r  r   r   s   @r   r!  r!  w  s            & & &P                r?   r!  c                   B     e Zd Z fdZd Zd Zd Zd Zd Zd Z	 xZ
S )runcommand_drop_privsc                 2    t                      j        |  |                                 | _        |                                 | _        | j        j        r?| j        r:t          j        t          d          | j        j
        | j        dz             d S d S d S )Nz2Found user: %(user)s, temporary directory: %(dir)s)userr&  )r   r   _find_user_pw_user_pw_find_tmpdir_tmpdirr   debugr	   r   pw_namer   s     r   r   zruncommand_drop_privs.__init__  s    $**,,((**; 	L 	LLOPP#}4T\JJK L L L L L	L 	L 	L 	Lr?   c                 l    | j         r,t          j        || j         j        | j         j                   d S d S r   )r>  r:   fchownpw_uidpw_gidr5  s     r   r)  z$runcommand_drop_privs.fchown_tmpfile  s=    = 	JIfdm2DM4HIIIII	J 	Jr?   c                     | j         S r   )r@  r   s    r   r(  z runcommand_drop_privs.get_tmpdir  r3  r?   c                 $      j         sd S  fd}|S )Nc                     	 t          j        j        j                   t          j        j        j                   d S # t          $ r<} t          j        t          d          t          |           z             Y d } ~ d S d } ~ ww xY w)NrR   )r:   setgidr>  rF  setuidrE  r   r	   r
   r   r   )r   r   s    r   preexecz5runcommand_drop_privs.get_preexec_fn.<locals>.preexec  s    7	$-.///	$-.///// 7 7 7Q{^^c"gg56666666667s   <A 
B1BB)r>  )r   rL  s   ` r   r  z$runcommand_drop_privs.get_preexec_fn  s2    } 	4	7 	7 	7 	7 	7 r?   c                     | j         sd S t          j        }| j         j        |d<   | j         j        |d<   dD ]}| j         j        ||<   | j        rdD ]}| j        ||<   |S )NHOMESHELL)USERNAMEUSERLOGNAME)TMPDIRTMPTEMPDIRTEMP)r>  r:   ry   pw_dirpw_shellrB  r@  )r   newenvenvvars      r   r  z!runcommand_drop_privs.get_environ  s~    } 	4-v-0w5 	3 	3F!]2F6NN< 	.> . .!%vr?   c           	         t          j                    dk    rd S d }dD ]}|t           j        v r	 t           j        |         }|                                st	          j        |          nt	          j        |          } nC# t          $ r5}t          t          d          |t          |          dz            |d }~ww xY w|r	|j        r|S t          j        t          d                     d S )Nr   )APT_LISTCHANGES_USER	SUDO_USERrP  z9Error getting user from variable '%(envvar)s': %(errmsg)s)rZ  r!   z1Cannot find suitable user to drop root privileges)r:   getuidry   isdigitpwdgetpwnamgetpwuidr   RuntimeErrorr   r   rE  r	   r6   )r   pwdatarZ  r<  r   s        r   r=  z#runcommand_drop_privs._find_user_pw  s   9;;!4G 	Y 	YF##Y:f-D7;||~~]S\$///3<X\K]K]FE  Y Y Y&q)d'e'e5;s2ww*O*O(P Q QVXYY $  	fm 	MqLMMNNNts   AA??
B>	0B99B>c                 H   | j         sd S t          j                    }t          j        t          j        z  t          j        z  }t          j        | j         j        d           	 t          j	        ||          r|t          j
        d           S |g}|                    d          rd|dd         t          | j         j                  z   }t          j	        ||          r|t          j
        d           S |                    |           |dk    rBd}t          j	        ||          r|t          j
        d           S |                    |           t          t          d          | j         j        t          |          dz            # t          j
        d           w xY w)Nr   z/0z/tmpzJNone of the following directories is accessible by user %(user)s: %(dirs)s)r<  dirs)r>  r   
gettempdirr:   R_OKW_OKX_OKsetreuidrE  accessrK  endswithr   appendrc  r   rB  )r   tmpdirflagschecked_tmpdirss       r   r?  z"runcommand_drop_privs._find_tmpdir  s   } 	4$&&"'!BG+
DM(!,,,	y'' & IaLLLL%  &hOt$$ /"DM,@(A(AA9VU++ "! IaLLLL  &&v...9VU++ "! IaLLLL  &&v...q "?  @  @*.-*?*-o*>*>"@ "@ @ A A A
 IaLLLLs    #F AF 53F =AF F!)rC   rD   rE   r   r)  r(  r  r  r=  r?  r   r   s   @r   r:  r:    s        L L L L LJ J J  	 	 	    *      r?   r:  c                   *     e Zd Z fdZd Zd Z xZS )xtermc                      t                      j        |  t          j        | _        d| _        t          j        | j        	                    dd                    | _
        d S )NFrt  zx-terminal-emulator)r   r   r:   P_NOWAITmoder#  r
  r   r   getrt  r   s     r   r   zxterm.__init__  sM    $K		[:O!P!PQQ


r?   c                 6    | j         d| j        dgz   | j        z   S )Nz-Tz-e)rt  r   r   r   s    r   r  zxterm.get_command  s    zT4:t44t|CCr?   c                     dS r   rF   r   s    r   r   zxterm.needs_tty_stdin!  r   r?   )rC   rD   rE   r   r  r   r   r   s   @r   rt  rt    s^        R R R R RD D D      r?   rt  c                   *     e Zd Z fdZd Zd Z xZS )rl   c                      t                      j        |  |                                  t          j        | j                            dd                    | _        d| _        t          j
                    | _        d S )Nr^   zsensible-pagerz.txt)r   r   _setup_less_variabler
  r   r   rx  r   r$  r   r   r   r   s     r   r   zpager_frd.__init__&  sf    $!!###{4;??7<L#M#MNN+--r?   c                     dt          d          z  }t          j                            dd          }|s|t          j        d<   d S d|v sd|v r|dz  }d|v sd	|v r|d
z  }|dz   |z   t          j        d<   d S )Nz	-P?e(%s)$zpress q to quitLESSrJ   Ez--QUIT-Az -+EFz--quit-iz -+Fr  )r   r:   ry   rx  )r   rY   lesss      r   r}  zpager_frd._setup_less_variable-  s    q!2333z~~fb)) 	!'BJvF $;;*,,FND$;;*,,FND!CZ&0
6r?   c                     dS r   rF   r   s    r   r   zpager_frd.needs_tty_stdin>  r   r?   )rC   rD   rE   r   r}  r   r   r   s   @r   rl   rl   %  sV        . . . . .1 1 1"      r?   rl   c                       e Zd ZdS )rr   NrB   rF   r?   r   rr   rr   A  rG   r?   rr   c                   L   e Zd Z ej        dej                  Z ej        dej                  ZdZ ej        dej                  Z	 ej        dej                  Z
dZ ej        d          ZdZ ej        d	          Zd
Z ej        d          Zd Zd Zd Zd Zd ZdS )r   z(?:lp:?\s+\#\d+(?:,\s*\#\d+)*)z(?P<linktext>#(?P<bugnum>\d+))z@<a href="https://launchpad.net/bugs/\g<bugnum>">\g<linktext></a>zE(?:closes:\s*(?:bug)?\#?\s?\d+(?:,\s*(?:bug)?\#?\s?\d+)*|(?<!">)#\d+)z(?P<linktext>#?(?P<bugnum>\d+))z=<a href="https://bugs.debian.org/\g<bugnum>">\g<linktext></a>z#\bC(VE|AN)-(19|20|21)\d\d-\d{4,7}\bzH<a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=\g<0>">\g<0></a>zs([a-zA-Z0-9_\+\-\.]+)@(([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)z <a href="mailto:\g<0>">\g<0></a>zf(ht|f)tps?\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&;%\$#\=~])*c                 V    |                      |           |                     |          S r   )r   r   )r   r   r]   s      r   r-   zhtml.convert_to_htmlU  s&    u||D!!!r?   c                 ~    |                     dd                               dd                               dd          S )N&z&amp;<z&lt;>z&gt;)replacer   s     r   _html_encodezhtml._html_encodeY  s6    ||C))11#v>>FFsFSSSr?   c                 T                          |          } j                             fd|          } j                             fd|          } j                             j        |          } j                             j        |          }|                    |           d S )Nc                 j    j                             j        |                     d                    S Nr   )	lp_bug_resub
lp_bug_fmtgroupmr   s    r   <lambda>z#html._render_text.<locals>.<lambda>^  s+    4>3E3EdoWXW^W^_`WaWa3b3b r?   c                 j    j                             j        |                     d                    S r  )bug_rer  bug_fmtr  r  s    r   r  z#html._render_text.<locals>.<lambda>_  s$    aggVWjj0Y0Y r?   )	r  lp_bug_stanza_rer  bug_stanza_recve_recve_fmtemail_re	email_fmtr   )r   htmltextr]   s   `  r   _render_textzhtml._render_text\  s      &&$(()b)b)b)bdhii!%%&Y&Y&Y&Y[_``{t|T22}  66tr?   c           	         d}| j                             |          D ]}|                     ||||                                                    |                                }|                                }|d         dv r|d d         }|dz  }|                    d|d|                     |          d           |                     |||d                     d S )Nr   rf  ).,;?'r   z	<a href="z">z</a>)url_refinditerr  startendr  r   r  )r   r  r   prevposmatchurls         r   _render_linezhtml._render_lined  s    [))$// 	R 	REhWU[[]]-B(CDDDiikkG++--C2w444#2#h1NNNCCC9J9J39O9O9O9OPQQQQ(DN33333r?   c                    t          j                    }|                    d           |                    | j                   |                    d           |                    d          D ]-}|                     ||           |                    d           .|                    d           |                                S )Nzs<html>
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>z6</title>
        </head>

        <body>
        <pre>rI   z</pre></body></html>)ioStringIOr   r   r   r  getvalue)r   r]   r  r   s       r   r   zhtml._renderp  s    ;==  	 	 	 	tz"""  	 	 	 JJt$$ 	! 	!Dh---NN4    -...  """r?   N)rC   rD   rE   r   compileIr  r  r  r  r  r  r  r  r  r  r  r-   r  r  r  r   rF   r?   r   r   r   D  s        "rz"CRTJJ!rz"CRTJJIZJBJgikimnnMBJA24HHFTGBJEFFF_Grz  Q  R  RH3IRZ  B  C  CF" " "T T T  
5 
5 
5# # # # #r?   r   c                   $     e Zd Z fdZd Z xZS )rq   c                      t                      j        |  t          j        | j                            dd                    | _        d| _        t          j	                    | _
        d S )Nrc   zsensible-browserz.html)r   r   r
  r   r   rx  r   r$  r   utf8_encodingr   r   s     r   r   zbrowser_frd.__init__  sT    ${4;??9>P#Q#QRR)++r?   c                     dS r   rF   r   s    r   r   zbrowser_frd.needs_tty_stdin  r   r?   )rC   rD   rE   r   r   r   r   s   @r   rq   rq     sG        , , , , ,      r?   rq   c                       e Zd ZdS )rs   NrB   rF   r?   r   rs   rs     rG   r?   rs   r   ).r   r:   r   r,  r3   r   email.messager$   email.headeremail.charsetr  r`  r
  r   r	   r   r   r   r   r8   r>   r   rA   r[   r   objectr   r   r   rm   rV   r   rn   r   rk   ro   rp   r  r!  r:  rt  rl   rr   r   rq   rs   rF   r?   r   <module>r     s  4 


 				 				                   				 



              ( ( (2+   &	 	 	 	 	y 	 	 	  $N3 N3 N3`    6       T       v   *' ' ' ' '( ' ' 'R# # # # # # # #$
 
 
 
 
T 
 
 
	 	 	 	 	~x 	 	 	    F   S S S S S}nj( S S S                m^X      "    D   (C C C C C C C CJY Y Y Y YJ Y Y Yv    !       
M:}h   8	 	 	 	 	eY 	 	 	?# ?# ?# ?# ?#6 ?# ?# ?#B    $-z=(   	 	 	 	 	{ 	 	 	 	 	r?   