§
    K——c6x  ã                   ó  — 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dlm	Z	 d dl
mZ  G d„ d¦  «        Zd„ Zd	„ Z G d
„ d¦  «        Z G d„ de¦  «        Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zedk    r e¦   «          dS dS )é    Né   )Ú_debugprint)Úconfig)Úreducec                   óž   — e Zd ZddgZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
d
„ Zd„ Zd„ Zdd„Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zdd„Zdd„Zd„ ZdS )ÚPrinterÚoptionsÚlocalc                 óÊ   — || _         || _        g | _        t          |¦  «        dk    }d}|r | j        di |¤Ž | j        rd}nd}|r|                      ¦   «          d| _        dS )zñ
        @param name: printer name
        @type name: string
        @param connection: CUPS connection
        @type connection: CUPS.Connection object
        @param kw: printer attributes
        @type kw: dict indexed by string
        r   TFN© )ÚnameÚ
connectionÚclass_membersÚlenÚupdateÚis_classÚgetAttributesÚ_ppd)Úselfr   r   ÚkwÚhave_kwÚfetch_attrss         ú9/usr/lib/python3/dist-packages/cupshelpers/cupshelpers.pyÚ__init__zPrinter.__init__   s‰   € ð ˆŒ	Ø$ˆŒØˆÔÝ�r‘(”(˜Q’,ˆØˆØð 	$ØˆDŒKÐÐ˜2ÐÐÐØŒ}ð $Ø"��à#�àð 	"Ø×ÒÑ!Ô!Ð!àˆŒ	ˆ	ˆ	ó    c                 óJ   — | j         �t          j        | j         ¦  «         d S d S ©N)r   ÚosÚunlink©r   s    r   Ú__del__zPrinter.__del__9   s*   € ØŒ9Ð ÝŒI�d”iÑ Ô Ð Ð Ð ð !Ð r   c                 ó   — d| j         z  S )Nz<cupshelpers.Printer "%s">)r   r    s    r   Ú__repr__zPrinter.__repr__=   s   € Ø-°´	Ñ9Ð9r   c                 ó2  — d„ }d}t          |¦  «        }t          j        D ]u}|                     |¦  «        r^ |||d …         ¦  «        }|| j        v rŒ4|dk    rd}t          | |t          | j        t          t          |¦  «        z  ¦  «        ¦  «         Œvd S )Nc                 ó*   — |                       ¦   «         S r   )Úlower)Ústrs    r   Ú_ascii_lowerz+Printer._expand_flags.<locals>._ascii_lowerB   s   € Ø—9’9‘;”;Ðr   ÚCUPS_PRINTER_Úclassr   )	r   ÚcupsÚ__dict__Ú
startswithÚ_flags_blacklistÚsetattrÚboolÚtypeÚgetattr)r   r(   ÚprefixÚprefix_lengthr   Ú	attr_names         r   Ú_expand_flagszPrinter._expand_flags@   sÁ   € ð	 ð 	 ð 	 ð !ˆÝ˜F™œˆõ ”Mð 	?ð 	?ˆDØ�Š˜vÑ&Ô&ð ?à �L  m n nÔ!5Ñ6Ô6ð à Ô 5Ð5Ð5°xØ Ò'Ð'°Z¨å˜˜iÝ˜TœY­µ°tÑ)<Ô)<Ñ<Ñ=Ô=ñ?ô ?ð ?øð	?ð 	?r   c                 ó\  — |                      dd¦  «        | _        | j        t          j        k    | _        |                      dd¦  «        | _        |                      dd¦  «        | _        |                      dd¦  «        | _        |                      dd¦  «        | _        |                      d	d¦  «        | _	        |                      d
d¦  «        | _
        |                      dd¦  «        | _        t          | j        ¦  «        t          k    r| j        g| _        |                      ¦   «          | j        €| j         | _        | `|                      dg ¦  «        | _        t          | j        ¦  «        t          k    r| j        g| _        | j                             ¦   «          || _        dS )zˆ
        Update object from printer attributes.

        @param kw: printer attributes
        @type kw: dict indexed by string
        zprinter-stater   z
device-uriÚ zprinter-infozprinter-is-sharedNzprinter-locationzprinter-make-and-modelzprinter-typezprinter-uri-supportedzmember-names)ÚgetÚstater+   ÚIPP_PRINTER_STOPPEDÚenabledÚ
device_uriÚinfoÚ	is_sharedÚlocationÚmake_and_modelr1   Úuri_supportedÚlistr6   Ú
not_sharedr   ÚsortÚother_attributes)r   r   s     r   r   zPrinter.updateS   so  € ð —V’V˜O¨QÑ/Ô/ˆŒ
Ø”z¥TÔ%=Ò=ˆŒØŸ&š& ¨rÑ2Ô2ˆŒØ—F’F˜>¨2Ñ.Ô.ˆŒ	ØŸšÐ 3°TÑ:Ô:ˆŒØŸšÐ1°2Ñ6Ô6ˆŒØ ŸfšfÐ%=¸rÑBÔBˆÔØ—F’F˜>¨1Ñ-Ô-ˆŒ	ØŸVšVÐ$;¸RÑ@Ô@ˆÔÝ�Ô#Ñ$Ô$­Ò,Ð,Ø"&Ô"4Ð!5ˆDÔØ×ÒÑÔÐØŒ>Ð!Ø!%¤Ð0ˆDŒNØˆOØŸVšV N°BÑ7Ô7ˆÔÝ�Ô#Ñ$Ô$­Ò,Ð,Ø"&Ô"4Ð!5ˆDÔØÔ×ÒÑ"Ô"Ð"Ø "ˆÔÐÐr   c                 óÜ  — | j                              | j        ¦  «        }i | _        i | _        dddgfdg d¢fdœ| _        |                     ¦   «         D �]\  }}|                     d¦  «        r¢|dt          d¦  «         …         }|dv rŒ8| 	                    |d	z   d¦  «        p| j         	                    |d¦  «        pd
}t          |t          ¦  «        rt          d„ |¦  «        }|| j        |<   |d	z   |v r||d	z            }||f| j        |<   Œ½|                     d	¦  «        s1|dk    r+|dk    r%|dk    r|                     d¦  «        s
|| j        |<   �Œ| 	                    dd¦  «        \  | _        | _        | 	                    ddg¦  «        | _        | 	                    dd¦  «        | _        | 	                    ddg¦  «        | _        | 	                    dd
¦  «        pd| _        | 	                    ddg¦  «        | _        d| _        g | _        d|v r|d         | _        d| _        nd|v r|d         | _        d                     | j        ¦  «        | _         | j        di |¤Ž dS )z£
        Fetch further attributes for the printer.

        Normally only a small set of attributes is fetched.  This
        method is for fetching more.
        ÚFalseÚTrueÚnone)rJ   Úsinglezsingle-thickÚdoublezdouble-thick)Ú	landscapezpage-borderz-defaultN)z
job-sheetsúprinter-error-policyúprinter-op-policyznotify-eventszdocument-formatznotify-lease-durationz
-supportedr8   c                 ó   — | dz   |z   S )Nú,r   )ÚxÚys     r   ú<lambda>z'Printer.getAttributes.<locals>.<lambda>‘   s   € °°3±°q±€ r   zjob-sheets-defaultrN   rO   zrequesting-user-name-)rJ   rJ   zjob-sheets-supportedzprinter-error-policy-supportedÚdefaultzprinter-op-policy-supportedTzrequesting-user-name-allowedFzrequesting-user-name-deniedz, r   )r   ÚgetPrinterAttributesr   Ú
attributesrF   Úpossible_attributesÚitemsÚendswithr   r9   Ú
isinstancerC   r   r-   Újob_sheet_startÚjob_sheet_endÚjob_sheets_supportedÚerror_policyÚerror_policy_supportedÚ	op_policyÚop_policy_supportedÚdefault_allowÚexcept_usersÚjoinÚexcept_users_stringr   )r   ÚattrsÚkeyÚvaluer   Ú	supporteds         r   r   zPrinter.getAttributeso   së  € ð ”×4Ò4°T´YÑ?Ô?ˆØˆŒØ "ˆÔà" V¨WÐ$5Ð6Ø#ð &?ð &?ð &?ð @ð$ð $ˆÔ ð  Ÿ+š+™-œ-ð 	3ñ 	3‰JˆC�Ø�|Š|˜JÑ'Ô'ð 3ØÐ,�S ™_œ_Ð,Ð,Ô-�Øð 5ð 5ð 5ð
 à!ŸIšI d¨\Ñ&9¸4Ñ@Ô@ð Ø Ô4×8Ò8¸¸tÑDÔDðàð õ ˜u¥dÑ+Ô+ð AÝ"Ð$8Ð$8¸%Ñ@Ô@�Eà(-�” Ñ%à˜Ñ$¨Ð-Ð-Ø % d¨<Ñ&7Ô 8�IØ6;¸YÐ5G�DÔ,¨TÑ2øØ—l’l LÑ1Ô1ð 3ØÐ-Ò-Ð-ØÐ/Ò/Ð/ØÐ,Ò,Ð,Ø—n’nÐ&=Ñ>Ô>ð -à-2�Ô% cÑ*ùà38·9²9Ø Ð"2ñ44ô 44Ñ0ˆÔ˜dÔ0à$)§I¢IÐ.DÀvÀhÑ$OÔ$OˆÔ!Ø!ŸIšIÐ&<¸fÑEÔEˆÔØ&+§i¢iØ,¨v¨hñ'8ô '8ˆÔ#àŸšÐ#6¸Ñ;Ô;ÐH¸yˆŒØ#(§9¢9Ø)¨I¨;ñ$8ô $8ˆÔ ð "ˆÔØˆÔØ)¨UÐ2Ð2Ø %Ð&DÔ EˆDÔØ!&ˆDÔÐØ*¨eÐ3Ð3Ø %Ð&CÔ DˆDÔØ#'§9¢9¨TÔ->Ñ#?Ô#?ˆÔ ØˆŒÐÐ�uÐÐÐÐÐr   c                 óð   — | j         d                              d¦  «        sdS | j         d         dd…         }|                     d¦  «        d         }|                     d¦  «        d         }|dk    rd}|S )	zc
        Find out which server defines this printer.

        @returns: server URI or None
        r   zipp://Né   ú/ú:zlocalhost.localdomainÚ	localhost)rB   r-   Úsplit)r   Úuris     r   Ú	getServerzPrinter.getServer³   s{   € ð Ô! !Ô$×/Ò/°Ñ9Ô9ð 	Ø�4ØÔ  Ô# A B BÔ'ˆØ�iŠi˜‰nŒn˜QÔˆØ�iŠi˜‰nŒn˜QÔˆØÐ)Ò)Ð)ØˆCØˆ
r   c                 óN  — d}| j         €y	 | j                             | j        ¦  «        | _         t	          j        | j         ¦  «        }n:# t          j        $ r(}|j        \  }}|t          j        k    rd}n‚ Y d}~nd}~ww xY w|€ | j         �t	          j        | j         ¦  «        }|S )z�
        Obtain the printer's PPD.

        @returns: cups.PPD object, or False for raw queues
        @raise cups.IPPError: IPP error
        NF)	r   r   ÚgetPPDr   r+   ÚPPDÚIPPErrorÚargsÚIPP_NOT_FOUND)r   ÚresultÚemargsÚeÚms        r   rt   zPrinter.getPPDÂ   s·   € ð ˆØŒ9ÐðØ œO×2Ò2°4´9Ñ=Ô=�”	Ýœ 4¤9Ñ-Ô-��øÝ”=ð ð ð Øœ‘��AØ�Ô*Ò*Ð*Ø"�F�Fàð �F�F�F�Føøøøðøøøð ˆ>˜dœiÐ3Ý”X˜tœyÑ)Ô)ˆFàˆs   ‹=A	 Á	B ÁA;Á;B c                 ó   — t          |t          ¦  «        rGt          j        t          j        ¦  «        }|dk    r#t          |¦  «                             |d¦  «        }| j                             | j	        ||¦  «         dS )z®
        Set a printer's option.

        @param name: option name
        @type name: string
        @param value: option value
        @type value: option-specific
        ú.N)
r[   ÚfloatÚlocaleÚnl_langinfoÚ	RADIXCHARr'   Úreplacer   ÚaddPrinterOptionDefaultr   )r   r   ri   Ú	radixchars       r   Ú	setOptionzPrinter.setOptionÚ   sq   € õ �u�eÑ$Ô$ð 	=ÝÔ*­FÔ,<Ñ=Ô=ˆIØ˜CÒÐå˜U™œ×+Ò+¨Y¸Ñ<Ô<�ØŒ×/Ò/°´	¸4ÀÑGÔGÐGÐGÐGr   c                 óF   — | j                              | j        |¦  «         dS )zh
        Unset a printer's option.

        @param name: option name
        @type name: string
        N)r   ÚdeletePrinterOptionDefaultr   )r   r   s     r   ÚunsetOptionzPrinter.unsetOptionê   s$   € ð 	Œ×2Ò2°4´9¸dÑCÔCÐCÐCÐCr   Nc                 óÔ   — |r!| j                              | j        ¦  «         dS |r#| j                              | j        |¬¦  «         dS | j                              | j        ¦  «         dS )zÂ
        Set the printer's enabled state.

        @param on: whether it will be enabled
        @type on: bool
        @param reason: reason for this state
        @type reason: string
        ©ÚreasonN)r   ÚenablePrinterr   ÚdisablePrinter©r   ÚonrŒ   s      r   Ú
setEnabledzPrinter.setEnabledó   ss   € ð ð 	:ØŒO×)Ò)¨$¬)Ñ4Ô4Ð4Ð4Ð4àð :Ø”×.Ò.¨t¬yÀÐ.ÑHÔHÐHÐHÐHà”×.Ò.¨t¬yÑ9Ô9Ð9Ð9Ð9r   c                 óÔ   — |r!| j                              | j        ¦  «         dS |r#| j                              | j        |¬¦  «         dS | j                              | j        ¦  «         dS )zÆ
        Set the printer's accepting state.

        @param on: whether it will be accepting
        @type on: bool
        @param reason: reason for this state
        @type reason: string
        r‹   N)r   Ú
acceptJobsr   Ú
rejectJobsr�   s      r   ÚsetAcceptingzPrinter.setAccepting  ss   € ð ð 	6ØŒO×&Ò& t¤yÑ1Ô1Ð1Ð1Ð1àð 6Ø”×*Ò*¨4¬9¸VÐ*ÑDÔDÐDÐDÐDà”×*Ò*¨4¬9Ñ5Ô5Ð5Ð5Ð5r   c                 óF   — | j                              | j        |¦  «         dS )zy
        Set the printer's shared state.

        @param on: whether it will be accepting
        @type on: bool
        N)r   ÚsetPrinterSharedr   )r   r�   s     r   Ú	setSharedzPrinter.setShared  s$   € ð 	Œ×(Ò(¨¬°BÑ7Ô7Ð7Ð7Ð7r   c                 óF   — | j                              | j        |¦  «         dS )zs
        Set the printer's error policy.

        @param policy: error policy
        @type policy: string
        N)r   ÚsetPrinterErrorPolicyr   ©r   Úpolicys     r   ÚsetErrorPolicyzPrinter.setErrorPolicy  s$   € ð 	Œ×-Ò-¨d¬i¸Ñ@Ô@Ð@Ð@Ð@r   c                 óF   — | j                              | j        |¦  «         dS )z{
        Set the printer's operation policy.

        @param policy: operation policy
        @type policy: string
        N)r   ÚsetPrinterOpPolicyr   r›   s     r   ÚsetOperationPolicyzPrinter.setOperationPolicy'  s$   € ð 	Œ×*Ò*¨4¬9°fÑ=Ô=Ð=Ð=Ð=r   c                 óH   — | j                              | j        ||¦  «         dS )z¦
        Set the printer's job sheets.

        @param start: start sheet
        @type start: string
        @param end: end sheet
        @type end: string
        N)r   ÚsetPrinterJobSheetsr   )r   ÚstartÚends      r   ÚsetJobSheetszPrinter.setJobSheets0  s&   € ð 	Œ×+Ò+¨D¬I°u¸cÑBÔBÐBÐBÐBr   c                 ó`  — t          |t          ¦  «        rT|                     ¦   «         }d„ |D ¦   «         }g }|D ]}|                     |¦  «         Œd„ |D ¦   «         }d„ |D ¦   «         }|r"| j                             | j        |¦  «         dS | j                             | j        |¦  «         dS )zÛ
        Set access control list.

        @param allow: whether to allow by default, otherwise deny
        @type allow: bool
        @param except_users: exception list
        @type except_users: string list
        c                 ó8   — g | ]}|                      d ¦  «        ‘ŒS )rQ   )rp   ©Ú.0Úus     r   ú
<listcomp>z%Printer.setAccess.<locals>.<listcomp>F  s"   € Ð1Ð1Ð1 a�Q—W’W˜S‘\”\Ð1Ð1Ð1r   c                 ó6   — g | ]}|                      ¦   «         ‘ŒS r   )Ústripr¨   s     r   r«   z%Printer.setAccess.<locals>.<listcomp>J  s    € Ð<Ð<Ð<¨!˜AŸGšG™IœIÐ<Ð<Ð<r   c                 ó   — g | ]}|¯|‘ŒS r   r   )r©   Ú_fs     r   r«   z%Printer.setAccess.<locals>.<listcomp>K  s   € Ð<Ð<Ð< 2¸Ð<˜BÐ<Ð<Ð<r   N)r[   r'   rp   Úextendr   ÚsetPrinterUsersDeniedr   ÚsetPrinterUsersAllowed)r   Úallowrd   Úusersrª   s        r   Ú	setAccesszPrinter.setAccess;  sÔ   € õ �l¥CÑ(Ô(ð 	=Ø ×&Ò&Ñ(Ô(ˆEØ1Ð1¨5Ð1Ñ1Ô1ˆEØˆLØð 'ð '�Ø×#Ò# AÑ&Ô&Ð&Ð&Ø<Ð<¨|Ð<Ñ<Ô<ˆLØ<Ð<¨Ð<Ñ<Ô<ˆLàð 	LØŒO×1Ò1°$´)¸\ÑJÔJÐJÐJÐJàŒO×2Ò2°4´9¸lÑKÔKÐKÐKÐKr   Fc                 óú  — g }	 	 g d¢}| j                              |¬¦  «        }n)# t          $ r | j                              ¦   «         }Y nw xY wn# t          j        $ r |cY S w xY w|                     ¦   «         D ]€\  }}	 |d         }||                     d¦  «        dz   d…         }n#  Y Œ3xY w|| j        k    rŒB|rd|v r8|d         dk    r,|                     |¦  «         |�t          |¦  «        |k    r nŒ�|S )	zÊ
        Find out whether jobs are queued for this printer.

        @param only_tests: whether to restrict search to test pages
        @type only_tests: bool
        @returns: list of job IDs
        )újob-idújob-printer-uriújob-name)Úrequested_attributesr¸   rm   r   Nr¹   z	Test Page)
r   ÚgetJobsÚ	TypeErrorr+   rv   rY   Úrindexr   Úappendr   )	r   Ú
only_testsÚlimitÚretÚrÚjobsÚidrg   rq   s	            r   Ú
jobsQueuedzPrinter.jobsQueuedR  sT  € ð ˆð	ð2Ø=Ð=Ð=�Ø”×.Ò.ÀQÐ.ÑGÔG��øÝð 2ð 2ð 2à”×.Ò.Ñ1Ô1���ð2øøøøøõ Œ}ð 	ð 	ð 	ØˆJˆJˆJð	øøøð Ÿš™œð 	ð 	‰IˆB�ðØÐ-Ô.�Ø˜#Ÿ*š* cÑ*Ô*¨QÑ.Ð/Ð/Ô0��øðØ�øøøØ�d”iÒÐØàð Ø˜uÐ$Ð$Ø�zÔ" kÒ1Ð1Ø—
’
˜B‘”�àÐ$­¨c©¬°eÒ);Ð);Ø�EøØˆ
s8   …% ¤A ¥#AÁA Á
AÁA ÁA#Á"A#Â (B)Â)B-c                 ó:  — g }	 	 g d¢}| j                              d|¬¦  «        }n+# t          $ r | j                              d¬¦  «        }Y nw xY wn# t          j        $ r |cY S w xY w|                     ¦   «         D ]�\  }}	 |d         }||                     d¦  «        dz   d…         }n#  Y Œ3xY w|| j        k    rŒB|                     d	t          j	        ¦  «        t          j
        k     rŒq|                     |¦  «         |�t          |¦  «        |k    r nŒž|S )
zo
        Find out whether there are preserved jobs for this printer.

        @return: list of job IDs
        )r·   r¸   ú	job-stateÚ	completed)Ú
which_jobsrº   )rÉ   r¸   rm   r   NrÇ   )r   r»   r¼   r+   rv   rY   r½   r   r9   ÚIPP_JOB_PENDINGÚIPP_JOB_COMPLETEDr¾   r   )r   rÀ   rÁ   rÂ   rÃ   rÄ   rg   rq   s           r   ÚjobsPreservedzPrinter.jobsPreservedw  st  € ð ˆð		ðHØ>Ð>Ð>�Ø”×.Ò.¸;ØEFð /ñ Hô H��øåð Hð Hð Hà”×.Ò.¸;Ð.ÑGÔG���ðHøøøøøõ Œ}ð 	ð 	ð 	ØˆJˆJˆJð	øøøð Ÿš™œð 	ð 	‰IˆB�ðØÐ-Ô.�Ø˜#Ÿ*š* cÑ*Ô*¨QÑ.Ð/Ð/Ô0��øðØ�øøøØ�d”iÒÐØØ—	’	˜;ÝÔ/ñ1ô 1Ý37Ô3IòJð JàØ�JŠJ˜‰OŒOˆOØÐ ¥S¨#¡Y¤Y°%Ò%7Ð%7Ø�øàˆ
s8   … & ¥A ¦%AÁA ÁAÁA ÁA&Á%A&Â(B,Â,B0c                 ó0   — |                       d|¬¦  «        S )zl
        Find out whether test jobs are queued for this printer.

        @returns: list of job IDs
        T)r¿   rÀ   )rÅ   )r   rÀ   s     r   ÚtestsQueuedzPrinter.testsQueuedš  s   € ð �Š¨4°uˆÑ=Ô=Ð=r   c                 ód  — | j                              | j        ¦  «         t          j        ¦   «         5 }	 d}| j                              ||                     ¦   «         ¬¦  «         n_# t          j        $ rM}|j	        \  }|t          j
        t          j        fv rY d}~ddd¦  «         dS t          j        |¦  «        ‚d}~ww xY w|                     d¦  «         d„ |                     ¦   «         D ¦   «         }d}d}|D ]T}|                     d¦  «        r=|                     d¦  «        d	         }	|	| j        k    rd
|dd…         z   ||<   d}|d	z  }ŒU|rÂ|                     d¦  «         |                     d„ |D ¦   «         ¦  «         |                     ¦   «          |                     ¦   «          |                     d¦  «         	 | j                              ||                     ¦   «         ¬¦  «         n!# t          j        $ r Y ddd¦  «         dS w xY w|cddd¦  «         S # 1 swxY w Y   dS )z9
        Set this printer as the system default.
        z/admin/conf/lpoptions)ÚfdNFr   c                 ó8   — g | ]}|                      d ¦  «        ‘ŒS ©zUTF-8)Údecode©r©   Úlines     r   r«   z(Printer.setAsDefault.<locals>.<listcomp>¶  s$   € ÐGÐGÐG¨t�d—k’k 'Ñ*Ô*ÐGÐGÐGr   zDefault ú r   zDest é   Tc                 ó8   — g | ]}|                      d ¦  «        ‘ŒS rÒ   )ÚencoderÔ   s     r   r«   z(Printer.setAsDefault.<locals>.<listcomp>Å  s$   € ÐHÐHÐH¸ §¢¨GÑ 4Ô 4ÐHÐHÐHr   )r   Ú
setDefaultr   ÚtempfileÚTemporaryFileÚgetFileÚfilenor+   Ú	HTTPErrorrw   ÚHTTP_NOT_FOUNDÚHTTP_AUTHORIZATION_CANCELEDÚseekÚ	readlinesr-   rp   Ú
writelinesÚtruncateÚflushÚputFile)
r   ÚfÚresourcer{   ÚsÚlinesÚchangedÚirÕ   r   s
             r   ÚsetAsDefaultzPrinter.setAsDefault¢  s¾  € ð 	Œ×"Ò" 4¤9Ñ-Ô-Ð-õ Ô#Ñ&Ô&ð $	¨!ð)Ø2�Ø”×'Ò'¨°Q·X²X±[´[Ð'ÑAÔAÐAÐAøÝ”>ð )ð )ð )Ø”v‘�Ø�Ô,­dÔ.NÐOÐOÐOØ ˜5˜5˜5ð$	ð $	ð $	ñ $	ô $	ð $	ð $	ð $	õ ”n aÑ(Ô(Ð(øøøøð)øøøð �FŠF�A‰JŒJˆJØGÐG°q·{²{±~´~ÐGÑGÔGˆEØˆGØˆAØð ð �Ø—?’? JÑ/Ô/ð àŸ:š: sÑ+Ô+¨AÔ.�DØ˜tœyÒ(Ð(à#*¨T°!°"°"¬XÑ#5˜˜a™Ø"&˜Ø˜‘F�Aøàð 	!Ø—’˜‘
”
�
Ø—’ÐHÐHÀÐHÑHÔHÑIÔIÐIØ—
’
‘”�Ø—’‘
”
�
Ø—’˜‘
”
�
ð!Ø”O×+Ò+¨X¸!¿(º(¹+¼+Ð+ÑFÔFÐFÐFøÝ”~ð !ð !ð !Ø ðE$	ð $	ð $	ñ $	ô $	ð $	ð $	ð $	ðB!øøøð ðI$	ð $	ð $	ð $	ñ $	ô $	ð $	ð $	ð $	ð $	ð $	ð $	øøøð $	ð $	ð $	ð $	ð $	ð $	se   ³H%µ0A&Á%H%Á&CÁ5#B=ÂH%Â)B=Â=CÃDH%Ç.G6Ç5H%Ç6HÈH%ÈHÈH%È%H)È,H)r   )FN)Ú__name__Ú
__module__Ú__qualname__r.   r   r!   r#   r6   r   r   rr   rt   r†   r‰   r‘   r•   r˜   r�   r    r¥   rµ   rÅ   rÌ   rÎ   rî   r   r   r   r   r      sˆ  € € € € € Ø! 7Ð+Ððð ð ð4!ð !ð !ð:ð :ð :ð?ð ?ð ?ð&#ð #ð #ð8Bð Bð BðHð ð ðð ð ð0Hð Hð Hð Dð Dð Dð:ð :ð :ð :ð"6ð 6ð 6ð 6ð"8ð 8ð 8ðAð Að Að>ð >ð >ð	Cð 	Cð 	CðLð Lð Lð.#ð #ð #ð #ðJ!ð !ð !ð !ðF>ð >ð >ð >ð,ð ,ð ,ð ,ð ,r   r   c                 ó  — |                       ¦   «         }|                      ¦   «         }|                     ¦   «         D ]B\  }}t          || fi |¤Ž}|||<   ||v r&||         |_        |j                             ¦   «          ŒC|S )z—
    Obtain a list of printers.

    @param connection: CUPS connection
    @type connection: CUPS.Connection object
    @returns: L{Printer} list
    )ÚgetPrintersÚ
getClassesrY   r   r   rE   )r   ÚprintersÚclassesr   Úprinters        r   ró   ró   Ð  s“   € ð ×%Ò%Ñ'Ô'€HØ×#Ò#Ñ%Ô%€GØ!ŸšÑ)Ô)ð )ð )‰ˆˆgÝ˜$ 
Ð6Ð6¨gÐ6Ð6ˆØ ˆ�‰Ø�7ˆ?ˆ?Ø$+¨D¤MˆGÔ!ØÔ!×&Ò&Ñ(Ô(Ð(øØ€Or   c                 óL  — i }|                       d¦  «        }|D ]^}|                     d¦  «        dk    rŒ|                      dd¦  «        \  }}|                     ¦   «         ||                     ¦   «         <   Œ_d|v r|                     d|d         ¦  «         d|v r|                     d|d         ¦  «         d	|v r|                     d
|d	         ¦  «         dD ]}|                     |d¦  «         Œ|d
         dk    rg |d
<   n|d
                               d¦  «        |d
<   |S )zØ
    Parse an IEEE 1284 Device ID, so that it may be indexed by field name.

    @param id: IEEE 1284 Device ID, without the two leading length bytes
    @type id: string
    @returns: dict indexed by field name
    ú;rn   éÿÿÿÿr   ÚMANUFACTURERÚMFGÚMODELÚMDLzCOMMAND SETÚCMD)	rü   rþ   rÿ   ÚCLSÚDESÚSNÚSÚPÚJr8   rQ   )rp   Úfindr­   Ú
setdefault)rÄ   Úid_dictÚpiecesÚpiecer   ri   s         r   ÚparseDeviceIDr  â  sG  € ð €GØ�XŠX�c‰]Œ]€FØð /ð /ˆØ�:Š:�c‰?Œ?˜bÒ Ð ØØ—k’k # aÑ(Ô(‰ˆˆeØ!&§¢¡¤ˆ�—
’
‘”ÑÐØ˜Ð Ð Ø×Ò˜5 '¨.Ô"9Ñ:Ô:Ð:Ø�'ÐÐØ×Ò˜5 '¨'Ô"2Ñ3Ô3Ð3Ø˜ÐÐØ×Ò˜5 '¨-Ô"8Ñ9Ô9Ð9ØHð %ð %ˆØ×Ò˜4 Ñ$Ô$Ð$Ð$Øˆu„~˜ÒÐØˆ�‰ˆà  œ×-Ò-¨cÑ2Ô2ˆ�‰Ø€Nr   c                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )ÚDevicez.
    This class represents a CUPS device.
    c                 óf  — || _         |                     dd¦  «        | _        |                     dd¦  «        | _        |                     dd¦  «        | _        |                     dd¦  «        | _        |                     dd¦  «        | _        |                     d¦  «        }|d         | _        t          |¦  «        d	k    | _
        t          | j        ¦  «        | _        |                     d
¦  «        }|dk    r2| j                             dd¦  «        s||dz   d…         | j        d<   dS dS dS )z~
        @param uri: device URI
        @type uri: string
        @param kw: device attributes
        @type kw: dict
        zdevice-classr8   zdevice-infozdevice-make-and-modelz	device-idzdevice-locationrn   r   r   zserial=rú   r  é   N)rq   r9   Údevice_classr>   rA   rÄ   r@   rp   r1   r   r   r  r  r  )r   rq   r   Ú
uri_piecesrê   s        r   r   zDevice.__init__  s  € ð ˆŒØŸFšF >°2Ñ6Ô6ˆÔØ—F’F˜=¨"Ñ-Ô-ˆŒ	Ø ŸfšfÐ%<¸bÑAÔAˆÔØ—&’&˜ bÑ)Ô)ˆŒØŸšÐ0°"Ñ5Ô5ˆŒà—Y’Y˜s‘^”^ˆ
Ø ”]ˆŒ	Ý˜J™œ¨Ò*ˆŒõ % d¤gÑ.Ô.ˆŒà�HŠH�YÑÔˆØ�Š7ˆ7˜4œ<×+Ò+¨T°"Ñ5Ô5ˆ7Ø!$ Q¨¡U V V¤ˆDŒL˜ÑÐÐð ˆ7ˆ7ˆ7r   c                 ó   — d| j         z  S )Nz<cupshelpers.Device "%s">)rq   r    s    r   r#   zDevice.__repr__  s   € Ø,¨t¬xÑ7Ð7r   c                 ó  — |€dS | j         |j         k    r|j         rdS dS | j        }|dk    rb| j                             d¦  «        dk    rd}nA| j                             d¦  «        dk    rd	}n | j                             d
¦  «        dk    rd}|dk    r2| j                             ¦   «                              d¦  «        dk    rd}|j        }|dk    rb|j                             d¦  «        dk    rd}nA|j                             d¦  «        dk    rd	}n |j                             d
¦  «        dk    rd}|dk    r2|j                             ¦   «                              d¦  «        dk    rd}| j         sÖ||k    rÐ|dk    rdS |dk    rdS |dk    rdS |dk    rdS |dk    rdS |dk    rdS |dk    rdS |dk    rdS |dk    rdS |dk    rdS |dk    rdS |dk    rdS |dk    rdS |dk    rdS |d	k    rdS |d	k    rdS |dk    rdS |dk    rdS |dk    rdS |dk    rdS |dk    rdS |dk    rdS |dk    rdS |dk    rdS |dk    rdS |dk    rdS t          | j        ¦  «        t          |j        ¦  «        k     }|s| j        |j        k     }|S )z9
        Compare devices by order of preference.
        NTFÚdnssdz._ipprú   Údnssdiz._pdl-datastreamÚdnssdsz	._printerÚdnssdlÚusbÚfaxÚusbfaxÚserialÚparallelÚhpÚhpfaxÚippsÚippÚsocketÚlpd)r   r1   rq   r  r&   r0   rÄ   r>   )r   ÚotherÚstypeÚotypery   s        r   Ú__lt__zDevice.__lt__!  sN  € ð ˆ=Ø�4àŒ=˜EœNÒ*Ð*ØŒ~ð Ø�tØ�5à”	ˆØ�GÒÐØŒx�}Š}˜WÑ%Ô%¨Ò+Ð+Ø ��Ø”—’Ð1Ñ2Ô2°bÒ8Ð8Ø ��Ø”—’˜{Ñ+Ô+¨rÒ1Ð1Ø �Ø�EŠ>ˆ>ØŒx�~Š~ÑÔ×$Ò$ UÑ+Ô+¨rÒ1Ð1Ø �Ø”
ˆØ�GÒÐØŒy�~Š~˜gÑ&Ô&¨"Ò,Ð,Ø ��Ø”—’Ð 2Ñ3Ô3°rÒ9Ð9Ø ��Ø”—’ Ñ,Ô,°Ò2Ð2Ø �Ø�EŠ>ˆ>ØŒy�ŠÑ Ô ×%Ò% eÑ,Ô,°Ò2Ð2Ø �àŒ}ð 6	 %¨5¢. .ð ˜Ò Ð Ø�tØ˜Ò Ð Ø�uØ˜
Ò"Ð"Ø�tØ˜
Ò"Ð"Ø�uØ˜Š}ˆ}Ø�uØ˜Š}ˆ}Ø�tØ˜ÒÐØ�uØ˜ÒÐØ�tØ˜Ò Ð Ø�uØ˜Ò Ð Ø�tØ˜ŠˆØ�uØ˜ŠˆØ�tØ˜Š~ˆ~Ø�uØ˜Š~ˆ~Ø�tØ˜Ò Ð Ø�uØ˜Ò Ð Ø�tØ˜Ò Ð Ø�uØ˜Ò Ð Ø�tØ˜Ò Ð Ø�uØ˜Ò Ð Ø�tØ˜Š~ˆ~Ø�uØ˜Š~ˆ~Ø�tØ˜Š~ˆ~Ø�uØ˜Š~ˆ~Ø�tØ˜Ò Ð Ø�uØ˜Ò Ð Ø�tÝ�d”g‘”¥ e¤h¡¤Ò/ˆØð 	,Ø”Y ¤Ò+ˆFàˆr   N)rï   rð   rñ   Ú__doc__r   r#   r&  r   r   r   r  r  ÿ  sP   € € € € € ðð ð-ð -ð -ð48ð 8ð 8ð^ð ^ð ^ð ^ð ^r   r  c                   ó   — e Zd Zd„ Zd„ ZdS )Ú_GetDevicesCallc                 óÀ   — d|v r1|                      d¦  «        | _        | j        |d<    |j        di |¤ŽS d | _         |j        di |¤Ž}|                      ||¦  «        S )NÚreply_handlerr   )r9   Ú_client_reply_handlerÚ_reply_handlerÚ
getDevices)r   r   Úkwdsry   s       r   Úcallz_GetDevicesCall.call‚  s}   € Ø˜dÐ"Ð"Ø)-¯ª°?Ñ)CÔ)CˆDÔ&Ø$(Ô$7ˆD�Ñ!Ø(�:Ô(Ð1Ð1¨DÐ1Ð1Ð1à%)ˆÔ"Ø&�Ô&Ð/Ð/¨$Ð/Ð/ˆØ×"Ò" J°Ñ7Ô7Ð7r   c                 óà   — |                      ¦   «         D ]9\  }}t          |fi |¤Ž}|||<   |j        dk    r|j        dk    r|j        |_        Œ:| j        r|                      ||¦  «         d S |S )Nr8   )rY   r  r>   rA   r,  )r   r   Údevicesrq   ÚdataÚdevices         r   r-  z_GetDevicesCall._reply_handlerŒ  sŒ   € Ø Ÿš™œð 	4ð 	4‰IˆC�Ý˜CÐ(Ð( 4Ð(Ð(ˆFØ!ˆG�C‰LØŒ{˜bÒ Ð  VÔ%:¸bÒ%@Ð%@Ø(.¬�Ô%øàÔ%ð 	Ø×&Ò&¨
°GÑ<Ô<Ð<Ð<Ð<àˆNr   N)rï   rð   rñ   r0  r-  r   r   r   r)  r)  �  s2   € € € € € ð8ð 8ð 8ð
ð 
ð 
ð 
ð 
r   r)  c                 óJ   — t          ¦   «         }|                     | |¦  «        S )zÕ
    Obtain a list of available CUPS devices.

    @param connection: CUPS connection
    @type connection: cups.Connection object
    @returns: a list of L{Device} objects
    @raise cups.IPPError: IPP Error
    )r)  r0  )r   r   Úops      r   r.  r.  ˜  s#   € õ 
Ñ	Ô	€BØ�7Š7�J Ñ#Ô#Ð#r   c                 ó°   — |                       |¦  «         |                      |¦  «         |                      ¦   «         €|                      |¦  «         dS dS )a  
    Set a new printer enabled, accepting jobs, and (if necessary) the
    default printer.

    @param connection: CUPS connection
    @type connection: cups.Connection object
    @param name: printer name
    @type name: string
    @raise cups.IPPError: IPP error
    N)r�   r“   Ú
getDefaultrÚ   )r   r   s     r   ÚactivateNewPrinterr9  ¤  sb   € ð ×Ò˜dÑ#Ô#Ð#Ø×Ò˜4Ñ Ô Ð ð ×ÒÑÔÐ'Ø×Ò˜tÑ$Ô$Ð$Ð$Ð$ð (Ð'r   c           
      ó€  ‡— ˆfd„Šˆfd„} || ¦  «        D ]¦}|j         dk    rŒ|                     |j         ¦  «        }|r||j        |j        k    rl|j        }|j        D ]]}|d         |k    rO|                     |j         |¦  «         t          dt          |j         ¦  «        ›dt          |¦  «        ›�¦  «         Œ^Œ§dS )zª
    Copy default options between PPDs.

    @param ppd1: source PPD
    @type ppd1: cups.PPD object
    @param ppd2: destination PPD
    @type ppd2: cups.PPD object
    c                 óv   •— | j         d d …         }| j        D ] }|                      ‰|¦  «        ¦  «         Œ!|S r   )r	   Ú	subgroupsr°   )Úgroupr	   ÚgÚgetPPDGroupOptionss      €r   r?  z*copyPPDOptions.<locals>.getPPDGroupOptions¿  sJ   ø€ Ø”-   Ô"ˆØ”ð 	2ð 	2ˆAØ�NŠNÐ-Ð-¨aÑ0Ô0Ñ1Ô1Ð1Ð1Øˆr   c              3   óD   •K  — | j         D ]} ‰|¦  «        D ]}|V — ŒŒd S r   )ÚoptionGroups)Úppdr=  Úoptionr?  s      €r   ÚiteratePPDOptionsz)copyPPDOptions.<locals>.iteratePPDOptionsÅ  sM   øè è € ØÔ"ð ð ˆØ,Ð,¨UÑ3Ô3ð ð �Øˆ\ˆ\ˆ\ˆ\ððð r   Ú
PageRegionÚchoicezset z = N)ÚkeywordÚ
findOptionÚuiÚ	defchoiceÚchoicesÚ
markOptionr   Úrepr)Úppd1Úppd2rD  rC  Ú
new_optionri   rF  r?  s          @r   ÚcopyPPDOptionsrQ  ¶  s  ø€ ðð ð ð ð ðð ð ð ð ð
 $Ð# DÑ)Ô)ð 
Að 
AˆØŒ>˜\Ò)Ð)ØØ—_’_ V¤^Ñ4Ô4ˆ
Øð 	A˜&œ) Z¤]Ò2Ð2ØÔ$ˆEØ$Ô,ð Að A�Ø˜(Ô# UÒ*Ð*Ø—O’O JÔ$6¸Ñ>Ô>Ð>Ý�Kµ$¸
Ô8JÑ2KÔ2KÐ2KÐ2KÝ26¸±,´,°,ð"@ñ Aô Að Aøøð
Að 
Ar   c                 ód  — d}g d¢}|D ]
}||k    rd}Œ	 t          d¦  «        }|D ]ª}|                     d¦  «        rŒ|                     ¦   «                              ¦   «                              d¦  «        rd}ŒT|                     ¦   «                              ¦   «                              d¦  «        rd}Œ�|                     ¦   «         dk    r nŒ«|                     ¦   «          n#  Y nxY w	 |                      d	|¦  «         t          d
|z  ¦  «         dS #  t          d|z  ¦  «         Y dS xY w)zØ
    Set the PPD page size according to locale.

    @param ppd: PPD
    @type ppd: cups.PPD object
    @param language: language, as given by the first element of
    locale.setlocale
    @type language: string
    ÚA4)ÚCÚPOSIXÚenÚen_USÚen_CAÚfr_CAÚLetterz/etc/papersizeú#Úa4Úletterr8   ÚPageSizezset PageSize = %sz*Failed to set PageSize (%s not available?)N)Úopenr-   r­   r&   ÚcloserL  r   )rB  ÚlanguageÚsizer]  Úeachrè   rÕ   s          r   ÚsetPPDPageSizerd  Ö  sd  € ð €DØ>Ð>Ð>€FØð ð ˆØ�tÒÐØˆDøðÝÐ"Ñ#Ô#ˆØð 	ð 	ˆDØ�Š˜sÑ#Ô#ð ØØ�zŠz‰|Œ|×!Ò!Ñ#Ô#×.Ò.¨tÑ4Ô4ð Ø��Ø—’‘”×#Ò#Ñ%Ô%×0Ò0°Ñ:Ô:ð Ø��Ø—’‘” Ò#Ð#Ø�ð $à	�Š‰	Œ	ˆ	ˆ	øðØˆøøøðJØ�Š˜
 DÑ)Ô)Ð)ÝÐ(¨4Ñ/Ñ0Ô0Ð0Ð0Ð0øðJÝÐAÀDÑHÑIÔIÐIÐIÐIÐIøøøs   •CC& Ã&C*Ã.(D ÄD/c                 ó"  ‡— d d„}g Šˆfd„}dx}}|                       d¦  «        }|�r¹|j                             dd¦  «        }|                     dd	¦  «        }|                     d
d¦  «        }|                     dd¦  «        }|                     d¦  «        dk    s|                     d¦  «        dk    rd}|                     d¦  «        }|D �]}|                     ¦   «                              d¦  «        }	|	D ]Þ}
|
                     ¦   «                              d¦  «        }|d         } ||¦  «        }|s ||¦  «         ŒJt          j                             |¦  «        dk    rqt          |¦  «        }d}d}||k     rX||         }| 
                    |¦  «        r0|t          |¦  «        d…         } ||¦  «        }|s ||¦  «         n|dz  }||k     °XŒß|s n�Œ|s|�s(t          j        d¬¦  «        \  }}t          j        |¦  «         |                      |¦  «         t          j        |dt          j        ¦  «         t          j        |dd¬¦  «        }d}|D ]«}| 
                    |¦  «        r”|t          |¦  «        d…                              ¦   «                              d	¦  «        }	 |                     d¦  «        \  }}}n#  Y ŒrxY w ||t$          j        dz   ¦  «        }|s |t$          j        dz   |z   ¦  «         Œ¬‰S )!z¶
    Check that all relevant executables for a PPD are installed.

    @param ppd: PPD
    @type ppd: cups.PPD object
    @returns: string list, representing missing executables
    ú/usr/bin:/binc                 ó¦  — | dk    rdS |                       d¦  «        }|dk    r
| d |…         } t          | ¦  «        dk    rdS | d         dk    rGt          j        | t          j        ¦  «        rt          d| z  ¦  «         | S t          d	| z  ¦  «         d S |                       d
¦  «        dk    rdS | dv rdS |                     d¦  «        D ]p}|                     t          j        j	        ¦  «        t          j        j	        z   | z   }t          j        |t          j        ¦  «        rt          d|z  ¦  «         |c S Œqt          | ›d|›�¦  «         d S )Nú-Úbuiltinú%rú   r   Útruerm   z	%s: foundz%s: NOT foundú=)'rn   r~   ú[ÚaliasÚbindÚbreakÚcdÚcontinueÚdeclareÚechoÚelseÚevalÚexecÚexitÚexportÚfiÚifÚkillÚletr
   ÚpopdÚprintfÚpushdÚpwdÚreadÚreadonlyÚsetÚshiftÚshoptÚsourceÚtestÚthenÚtrapr1   ÚulimitÚumaskÚunaliasÚunsetÚwaitrn   z: NOT found in )
r  r   r   ÚaccessÚX_OKr   rp   ÚrstripÚpathÚsep)r   r“  ÚpÚ	componentÚfiles        r   Ú	pathcheckz%missingExecutables.<locals>.pathcheck	  sh  € Ø�3Š;ˆ;ð �9à�IŠI�s‰OŒOˆØ�Š7ˆ7Ø˜˜˜”8ˆDÝ�‰:Œ:˜Š?ˆ?Ø�6Ø�Œ7�cŠ>ˆ>ÝŒy˜$¥¤Ñ(Ô(ð Ý˜[¨4Ñ/Ñ0Ô0Ð0Ø�å˜_¨tÑ3Ñ4Ô4Ð4Ø�tØ�9Š9�c‰?Œ?˜bÒ Ð Ø�9Øð 2ð 2ð 2ð �9ØŸš SÑ)Ô)ð 	ð 	ˆIØ×#Ò#¥R¤W¤[Ñ1Ô1µB´G´KÑ?À$ÑFˆDÝŒy˜$¥¤Ñ(Ô(ð Ý˜[¨4Ñ/Ñ0Ô0Ð0Ø���ðõ 	¨d¨d¨d°D°DÐ9Ñ:Ô:Ð:Øˆtr   c                 ó|   •— |                       d¦  «        }|dk    r
| d |…         } ‰                     | ¦  «         d S )Nrj  rú   )r  r¾   )Úexer•  Úexes_to_installs     €r   Úadd_missingz'missingExecutables.<locals>.add_missing/  sB   ø€ à�HŠH�c‰NŒNˆØ�Š7ˆ7Ø�b�q�b”'ˆCà×Ò Ñ$Ô$Ð$Ð$Ð$r   NÚFoomaticRIPCommandLinez&&
r8   z&quot;ú"z&lt;ú<z&gt;ú>ú(rú   ú&rù   ú|rÖ   r   Úgsr   z-sIjsServer=T)ÚtextÚrtzutf-8)Úencodingz*cupsFilter:z/filter:/usr/lib64/cups/filterz/filter/)rf  )ÚfindAttrri   rƒ   r  rp   r­   r   r“  Úbasenamer   r-   rÛ   Úmkstempr   ÚwriteFdÚlseekÚSEEK_SETÚfdopenr   Úcupsserverbindir)rB  r˜  rœ  rš  ÚexepathÚattrÚcmdlineÚpipesÚpipeÚcmdsÚcmdrw   ÚargnÚargiÚsearchÚargÚtmpfdÚtmpfnamerè   rÕ   ÚmimetypeÚcostr›  s                         @r   ÚmissingExecutablesr¿  þ  sŠ  ø€ ð"ð "ð "ð "ðH €Oð%ð %ð %ð %ð %ð Ð€Cˆ'Ø�<Š<Ð1Ñ2Ô2€DØñ ,à”*×$Ò$ f¨bÑ1Ô1ˆØ—/’/ 8¨SÑ1Ô1ˆØ—/’/ 6¨3Ñ/Ô/ˆØ—/’/ 6¨3Ñ/Ô/ˆØ�LŠL˜#ÑÔ "Ò$Ð$Ø�LŠL˜#ÑÔ "Ò$Ð$àˆGð —’˜sÑ#Ô#ˆØð 	ñ 	ˆDØ—:’:‘=”=×&Ò&¨Ñ,Ô,ˆDØð "ð "�Ø—y’y‘|”|×)Ò)¨3Ñ/Ô/�Ø˜1”g�Ø#˜) S™/œ/�Øð Ø�K Ñ%Ô%Ð%Øõ
 ”7×#Ò# WÑ-Ô-°Ò5Ð5Ý ™:œ:�DØ�DØ+�FØ š+˜+Ø" 4œj˜ØŸ>š>¨6Ñ2Ô2ð "Ø"%¥c¨6¡l¤l m mÔ"4˜CØ&/ i°¡o¤o˜GØ#*ð 2Ø + ¨SÑ 1Ô 1Ð 1à!à ™	˜ð  š+˜+øð ð à�ñð ð M�cñ Mõ %Ô,°4Ð8Ñ8Ô8Ñˆ�Ý
Œ	�8ÑÔÐØ�Š�UÑÔÐÝ
Œ�%˜�BœKÑ(Ô(Ð(ÝŒI�u˜d¨WÐ5Ñ5Ô5ˆØˆØð 	Mð 	MˆDØ�Š Ñ'Ô'ð MØ�C ™LœL˜M˜MÔ*×0Ò0Ñ3Ô3×9Ò9¸3Ñ?Ô?�ðØ,0¯JªJ¸Ñ,<Ô,<Ñ)�X˜t S SøðØ�Høøøà#˜) SÝ%+Ô%<ð @>ñ &>ñ?ô ?�ð ð MØ�K¥Ô!8¸:Ñ!EÈÑ!KÑLÔLÐLøàÐs   Ê7KËKc                 ó(   — t          | ¦  «        }g |fS )zÔ
    Check that all relevant executables for a PPD are installed.

    @param ppd: PPD
    @type ppd: cups.PPD object
    @returns: string list pair, representing missing packages and
    missing executables
    )r¿  )rB  Úexecutabless     r   ÚmissingPackagesAndExecutablesrÂ  �  s   € õ % SÑ)Ô)€KØ�ÐÐr   c                  ó¨   — t          j        ¦   «         } t          | ¦  «                             ¦   «         D ]}t	          |j        |j        ¦  «         Œd S r   )r+   Ú
Connectionr.  ÚvaluesÚprintrq   r  )Úcr4  s     r   Ú_mainrÈ  �  sQ   € ÝŒÑÔ€Aå˜Q‘-”-×&Ò&Ñ(Ô(ð +ð +ˆÝˆvŒz˜6œ>Ñ*Ô*Ð*Ð*ð+ð +r   Ú__main__)r+   Úpprintr   rÛ   ÚreÚstringr€   r8   r   r   Ú	functoolsr   r   ró   r  r  Úobjectr)  r.  r9  rQ  rd  r¿  rÂ  rÈ  rï   r   r   r   ú<module>rÏ     sÑ  ðð, .Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ðrð rð rð rð rñ rô rð rðhð ð ð$ð ð ð:@ð @ð @ð @ð @ñ @ô @ð @ðDð ð ð ð �fñ ô ð ð.
$ð 
$ð 
$ð%ð %ð %ð$Að Að Að@&Jð &Jð &JðPAð Að AðF
ð 
ð 
ð+ð +ð +ð ˆZÒÐØ	€E�G„G€G€G€Gð Ðr   