
    f j}                    P*   d 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 d Z edej                  Z edej                  Z e            Zdad	 Zd
 Zd ZdYdZdZdZd Z  e!e
j"        dz    e#d          z             Z$d Z%d Z& e&dd          Z' e%dd          Z( G d d          Z) e)            Z*ej+        ,                    d          Z-e-z ee. de-d            ee. dej+        d                     e-dk    rddl-Z-n1ddl/Z/e/j0        1                    de-          2                                Z-e-j3        j4        j5        Z5n&	 ddlm5Z5 n# e6$ r ddl5Z5Y nw xY w e5j7                     d Z8e5j9        Z:d Z;d!Z<e<=                    d"d          =                    d#d          =                    d$d          Z>e;e:e>fZ? e@d% e;A                    d&          D                       ZBe5jC        e5jD        e5jE        fZFeF e@d' e:A                    d&          D                       k    sJ d(eFd)e:            d*d+d,ZGeGZHejI        ejJ                 ZKejI        eL         ZMejI        eN         ZOejP        eQdf         ZRejI        ejS                 ZTejI        eU         ZVd-ZWd.ZXej+        ,                    d/          ZYd0ZZd1Z[d2Z\d3Z]d4 Z^d5 Z_d6 Z`d7 ZadZb G d8 d9          Zc G d: d;          Zd G d< d=          Ze G d> d?          Zf G d@ dA          Zg G dB dC          Zhe(reji        Zj G dD dE          ZkekZl G dF dG          Zm G dH dI          Zn G dJ dK          Zo G dL dM          Zp G dN dO          Zq G dP dQeq          Zr er            Zs G dR dS          Zt G dT dU          ZuddVlmvZv  G dW dX          Zw	 	 	 	 	 	 d[dYZx G dZ d[          ZW G d\ d]          Zy[X G d^ d_          ZX G d` da          Zz G db dc          Z{ G dd de          Z| G df dg          Z} G dh di          Z~ G dj dk          Z G dl dm          Z	 ej        e         Z	 e5j                                        D ]=\  ZZe                    dn          r#e                    do          r0 eeee           >	 de5j        z  e5j        z  e5j        z  e5j        z  e5j        z  e5j        z  Ze5j        dk    sJ ee5j        k    sJ ee5j        k    sJ [[[i Zi Zej        ZdpZi ZeD ]Zeee                                <   dqedr<   dsedt<   duedv<   dwedx<   dyedz<   d{ed|<   d}ed~<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   dZdZdZdZdag adadadZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdez  ez  ez  ez  Zdez  ez  ez  ez  Zdez  ez  ez  ez  ez  ZeZdez  ez  ez  ez  ez  Zdez  ez  ez  ez  ez  Zdez  ez  ez  ez  ez  Zdez  ez  ez  ez  Zdez  ez  ez  ez  ZdZdZdZdadZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZd d d d d d d dZ G d de          Z G d de          Z G d de          Z efe          Z  efe          Z efe          ZdZdZdZdZdÐZdĐZdŐZ	dƐZ
dǐZdȐZdɐZdʐZdːZd̐Zd͐ZdΐZdϐZdАZdѐZdҐZdӐZdԐZdՐZd֐ZdאZdؐZdِZdڐZdېZdܐZdݐZ dސZ!dߐZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4	 ddl5m6Z6m7Z7  e6j8                    Z9e9:                                D ]Z;e7e;         e9e;         d<   [6[7n# e<$ r i Z9Y nw xY wdZ=dZ>d Z?d Z@d ZAd ZBd ZCd ZDd ZEd ZFd ZGd ZHd  ZId ZJd ZKd ZLd ZMd ZNd ZOd ZPdejS        d	e@fd
ZQdejS        d	e@fdZRd ZSd ZTd ZUd ZVd ZWd ZXd ZYd ZZd Z[d Z\d Z]d Z^d Z_d Z`d Zad Zbd Zcd Zdd Zed Zfd  Zgd! Zhd" Zid# Zjd$ Zkd% Zld& Zmd' Znd( Zod) Zpd* Zqd+ Zrd, Zsd- Ztd. Zud/ Zvd0 Zwd1 Zxd2e5jy        d3eQfd4Zzd5e5j{        d2e5jy        d3eQfd6Z|d7 Z}d8 Z~d9 Zd: Zd; Zd< Zd= Zd> Zd? Zd@ ZdA ZdB ZdC ZdD ZdE ZdF ZdG ZdH ZdadI ZdJ ZdK ZdL ZdM ZdN ZdO ZdP ZdQ ZdR ZdS ZdT ZdU ZdV ZdW ZdX ZdY ZdZ Zd[ Zd\ Zd] Zd^ Zd_ Zd` Zda Zdb Zdc Zdd Zde Zdf Zdg Zdh Zdi Zdj Zdk Zdl Zdm Zdn Zdo Zdp Zdq Zdr Zds Zdt Zdu Zdv Zdw Zdx Zdy Zdz Zd{ Zd| ZÐd} ZĐd~ ZŐd ZƐd Zǐd ZȐd Zɐd Zʐd Zːd Z̐dZ͐dZΐdZϐdZАdZѐdZҐdZӐdZԐdZՐdZ֐dZאdZؐdZِdZڐdZېdZܐdZݐdZސdZߐdZdZdZdZdZdZdZdZdZdZd Zd\dZdeTfdZdeWdeUd	e@fdZd5ekdeQd	efdZdej        d	e@fdZdej        d	efdZdej        fdZdej        d	efdZdej        d	efdZdejP        ee@eNdf         deUd	eUfdZd Zd Zd5ekdejS        fdZd Zd Zd Zd ZdeUdejP        ee@df         dedeQd	eUf
dZdeUd	eUfdZd	eUfdZddddÜdeUdeVdedeVd	eUf
dǄZ d]deUdeUdeNdeQd	eNf
dʄZdejJ        d	eLfd̄Zd̈́ Zd΄ Zdτ ZdЄ Zdф Zd҄ Zdӄ Z	dԄ Z
dՄ Zdք Zdׄ Zd؄ Zdل Zdڄ Zdۄ Zd܄ Zd݄ Zdބ Zd߄ Z G d de5j                  Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&de[de[d	eqfdZ' G d de5j(                  Z) G d de5j*                  Z+ G d de5j,                  Z-d Z. G d de5j*                  Z/ G d de5j*                  Z0d	e1fdZ2d^deUdeVfdZ3deUfdZ4d	e@fdZ5d	e@fdZ6dd[d	eQfdZ7d_dZ8d	 Z9d
 Z:d Z;d Z<d Z=d	eUfdZ> G d de?          Z@d ZAd`de[de[de]d	efdZBdeUd	eQfdZCd ZDdade]deQdeQd	efdZEd ZFddddddddZGddddddddZHd  ZId! ZJd" ZKd# ZLd$ ZMd% ZNd& ZOd' ZPd( ZQd) ZRd* ZSd+ ZTd, ZUd- ZVd. ZWd/ ZXdeUd	e{fd0ZYdeUd	e@fd1ZZd2 Z[eFd3k    rd4 Z\n
d5 Z]d6 Z\dZd7Z^dbd8Z_d9eQd	e@fd:Z`d9eQd	e@fd;Zad< Zbd= Zcd> ZddZedZfdZgdZhd?eQd	eUfd@ZidA ZjdB eL            ddB eL            ddCdddD	dEZkddCdddddddddF
dGZl G dH dI          ZmddJlmnZn  eLdK  enjo                                                    D                       Zpe-s$ e5jq        e            e5jr        e           dL Zs ejt        es           enju        Zuenjv        Zvenjw        Zwenjx        Zxenjy        Zyenjl        ec_l        enjz        ec_z        enj{        ek_|        enj}        ek_}        enj~        ek_~        enj        ek_        enj        ek_        enj        ek_        enj        ek_        enj        ek_        enj        ek_        enj        ek_        enj        ek_        enj        ek_        enj        ek_        enj        ek_        enj        ek_        enj        ek_        enj        ek_        enj        ek_        enj        ek_        enj        ek_        enj        ek_        enj        ek_        enj        ek_        ekj        ek_        enj        ek_        enj        e_        enj        eW_        enj        eW_        enj        eW_        enj        eW_        enj        eW_        enj        eW_        enj        eW_        enj        eW_        enj        eW_        enj        eW_        enj        eW_        enj        eW_        enj        eW_        enj        eW_        enj        eW_        enj        eW_        enj        eW_        enj        eW_        enj        eW_        enjl        eW_l        enj        eW_        enj        eW_        enj        eW_        enjz        eW_z        enj        eW_        enj        eW_        enj        eW_        enj        eW_        enj        eW_        enj        eW_        dM eW_        enj        eW_        enj        eW_        enj        eW_        enj        eW_        enj        eW_        ddNlmZ eeW_        enj        e{_        enj        e_         G dO dPe          ZdQ Z	 e;ZdRe; dSe: dTej        d          d&ej        d          dUej         dVej        dWk    rdnd dXZ dS (c  zk
PyMuPDF implemented on top of MuPDF Python bindings.

License:

    SPDX-License-Identifier: GPL-3.0-only
    N   )extrac                    t           j                            |           }||S |                    d          r't	          t          |dd                   dd          S |                    d          rt	          |dd         d          S |                    d	          rt	          |d
d         d          S t          d| d|          )zI
    Returns a stream to use based on environmental variable `name`.
    Nzfd:   wF)modeclosefdzpath:   zpath+:   az&Unrecognised stream specification for z? should match `fd:<int>`, `path:<string>` or `path+:<string>`: )osenvironget
startswithopenint	Exception)namedefaultts      dC:\Users\Terasoftware\OneDrive\Desktop\faahhh\fyndo\fyndo\venv\Lib\site-packages\pymupdf/__init__.py_set_streamr   .   s     	
tA 	O	
e		 OC!""JJS%8888	
g		 OAabbE3	
h		 OAabbE3  N  N  N  IJ  N  N  O  O  	O    PYMUPDF_LOGPYMUPDF_MESSAGEFc                      t           S N_g_log_items r   r   
_log_itemsr!   D   s    r   c                 
    | a d S r   )_g_log_items_active)actives    r   _log_items_activer%   G   s     r   c                      t           d d = d S r   r   r    r   r   _log_items_clearr'   K   s    QQQr    c                 Z   t          j        d          |         }t          j                            |j                  }|j        }|j        }| d| d| d|  } t          rt          
                    |            t          | t                     t                                           dS )z0
    For development/debugging diagnostics.
    r   )context:: fileN)inspectstackr   pathrelpathfilenamelinenofunctionr#   r   appendprint
_g_out_logflush)textcallerframe_recordr3   liner5   s         r   logr>   O   s     =!,,,f5L'//,"788H%D'H222222D22D "D!!!	$Z    r   c                 d    t          | t                     t                                           dS )z
    For user messages.
    r-   N)r7   _g_out_messager9   r:   s    r   messagerB   ^   s/     
$^$$$$r   c                  n    dd l } t          d           t          |                                            d S )Nr   zexception_info:)	tracebackr>   
format_exc)rD   s    r   exception_inforF   f   s=    	r   z
()<>[]{}/%c                     t           j                            |           }||}n"|dk    rd}n|dk    rd}nJ d|  d|            ||k    rt          d	|  d|           |S )
}
    Returns `True`, `False` or `default` depending on whether $<name> is '1',
    '0' or unset. Otherwise assert-fails.
    N1T0Fr   zUnrecognised value for r,   Using non-default setting from )r   r   r   r>   r   r   vrets       r   get_env_boolrO   o   s    
 	
A :	
c :	
c :99D99A99999
g~ =;d;;a;;<<<Jr   c                     t           j                            |           }||}nt          |          }||k    rt	          d|  d|            |S )rH   NrK   r,   )r   r   r   r   r>   rL   s       r   get_env_intrQ      sa    
 	
A !ff
g~ ;9d99a99:::Jr   PYMUPDF_EXCEPTIONS_VERBOSEPYMUPDF_USE_EXTRATc                       e Zd Zd ZdS )_Globalsc                 >    d| _         d| _        d| _        d| _        d S Nr   )no_device_cachingsmall_glyph_heightssubset_fontnamesskip_quad_correctionsselfs    r   __init__z_Globals.__init__   s(    !"#$  !%&"""r   N__name__
__module____qualname__r^   r    r   r   rU   rU      s#        ' ' ' ' 'r   rU   MUPDF_CPPYYz: $MUPDF_CPPYY=z% so attempting to import mupdf_cppyy.z: $PYTHONPATH=
PYTHONPATHmupdf_cppyy)mupdfc                 j    |                      d          }|dk    r
| d|         } t          |           S )z<
    Converts string to int, ignoring trailing 'rc...'.
    rcr   N)findr   )r:   rh   s     r   _int_rcrj      s8     
4B	Qw CRCyt99r   z1.24.5z2024-05-30 00:00:01- r+   c                 ,    g | ]}t          |          S r    rj   .0is     r   
<listcomp>rr      s    KKKq

KKKr   .c                 ,    g | ]}t          |          S r    rn   ro   s     r   rr   rr      s    $P$P$PAWQZZ$P$P$Pr   z8Inconsistent MuPDF version numbers: mupdf_version_tuple=z != VersionFitz=z%gfmtc                    t          | t          t          f          r$d}| D ]}|r|dz  }|t          ||          z  }|S t          dk    rt          j        ||           S || z  S )z
    Returns `value` formatted with mupdf.fz_format_double() if available,
    otherwise with Python's `%`.

    If `value` is a list or tuple, we return a space-separated string of
    formatted values.
    r(   rl   ru   )r         )
isinstancelisttuple	_format_gmupdf_version_tuplerf   fz_format_double)valuerv   rN   rM   s       r   r}   r}      s     %$''  	) 	)A s
9QC((((CC
*, 	)#u555;r   Page_forward_declPoint_forward_declTESSDATA_PREFIXmatrix_like
point_like	quad_like	rect_likec                 F   t          | t                    r| j        rt          d          | j        } t          | t
          j                  r| S t          | t
          j                  r|                                 S | 
J d            J dt          |                       )zz
    Returns document as a mupdf.FzDocument, upcasting as required. Raises
    'document closed' exception if closed.
    document closedNr   document is NoneUnrecognised type(document)=)
rz   Document	is_closed
ValueErrorthisrf   
FzDocumentPdfDocumentsupertypedocuments    r   _as_fz_documentr     s    
 (H%% ! 	0.///=(E,-- 4	He/	0	0 4~~	 4%%%%%33$x..33333r   c                 F   t          | t                    r| j        rt          d          | j        } t          | t
          j                  r| S t          | t
          j                  rt          j        |           S | 
J d            J dt          |                       )z
    Returns document as a mupdf.PdfDocument, downcasting as required. If we
    fail (i.e. document is a mupdf.FzDocument(), <ret>.m_internal will be
    None. Raises 'document closed' exception if closed.
    r   Nr   r   r   )	rz   r   r   r   r   rf   r   r   r   r   s    r   _as_pdf_documentr     s     (H%% ! 	0.///=(E-.. 4	He.	/	/ 4 ***	 4%%%%%33$x..33333r   c                    t          | t                    r| j        } t          | t          j                  r|                                 S t          | t          j                  r| S | 
J d            J dt          |                       )z@
    Returns page as a mupdf.FzPage, upcasting as required.
    Nr   page is NoneUnrecognised type(page)=)rz   Pager   rf   PdfPager   FzPager   pages    r   _as_fz_pager   '  s     $ y$&& 0zz||	D%,	'	' 0	 0!/!!!//$t**/////r   c                    t          | t                    r| j        } t          | t          j                  r| S t          | t          j                  rt          j        |           S | 
J d            J dt          |                       )z
    Returns page as a mupdf.PdfPage, downcasting as required. If we fail (i.e.
    page is a mupdf.FzPage(), <ret>.m_internal will be None.
    Nr   r   r   )rz   r   r   rf   r   r   pdf_page_from_fz_pager   r   s    r   _as_pdf_pager   6  s    
 $ y$&& 0	D%,	'	' 0*4000	 0!/!!!//$t**/////r   c                   B   e Zd Zd Zd Zd Zd Zd Zd ZdJdZ	dKdZ
ed             Zed             Zed             Zed             ZdLdZed             Zd Zed             Zed             Zd Zd Zd ZdMdZd ZdNdZed             Zed             Zed             Zed             Zed              Zed!             Z ed"             Z!ed#             Z"ed$             Z#ed%             Z$ed&             Z%ed'             Z&ed(             Z'd) Z(d* Z)d+ Z*dOd,Z+dPd-Z,d. Z-dQd/Z.d0 Z/dRd1Z0d2 Z1d3 Z2dJd4Z3d5 Z4d6 Z5d7 Z6d8 Z7dJd9Z8ed:             Z9	 	 	 	 	 	 	 	 	 dSd<e:d=e;d>e<d?e:d@e=dAe=dBe=dCe>dDe?fdEZ@dTdFZAeBdG             ZCedH             ZDedI             ZEd
S )UAnnotc                 L    t          |t          j                  sJ || _        d S r   )rz   rf   PdfAnnotr   r]   annots     r   r^   zAnnot.__init__O  s%    5%.11111			r   c                 d    t          | dd          }d| j        d         dt          |          S )Nparentz<>'r   z' annotation on )getattrr   str)r]   r   s     r   __repr__zAnnot.__repr__S  s2    x..*.)A,,,FDDr   c                 *    |                                  S r   )r   r\   s    r   __str__zAnnot.__str__W  s    }}r   c                 :    t          | dd          r	d| _        d S d S )NthisownF)r   r   r\   s    r   _erasezAnnot._eraseZ  s+    4E** 	! DLLL	! 	!r   c                    | j         }t          j        |          t          j        k    rd S t	                      }	 t          j        t          j        |          d          }|j        r-t          d           t          j	        |          }||t          <   t          j        t          j        |          d          }|j        r,t          j        |          }t          |          |t          <   n
d|t          <   t          j        t          j        |          t          d                    }d}|j        rt          j        |          }||t"          <   n&# t$          $ r t&          rt)                       Y d S w xY w|}|s|S | j        |d<   t,                              |           \  }}	}
||d<   |	|d	<   |
|d
<   | j        d         }||d<   |S )NROzIgnoring redaction key '/RO'.OverlayTextr(   Qr   rect
text_colorfontnamefontsizefill)r   rf   pdf_annot_typePDF_ANNOT_REDACTdictpdf_dict_getspdf_annot_obj
m_internalmessage_warning
pdf_to_numdictkey_xrefpdf_to_text_stringJM_UnicodeFromStrdictkey_textpdf_dict_getPDF_NAME
pdf_to_intdictkey_alignr   g_exceptions_verboserF   r   TOOLS	_parse_dacolors)r]   r   valuesobjxrefr:   alignvalr   r   r   r   s               r   _get_redact_valueszAnnot._get_redact_values^  s   	&&%*@@ 	F	%e&9%&@&@$GGC~ , ?@@@',,'+|$%e&9%&@&@-PPC~ */44'8'>'>|$$')|$$U%8%?%?#OOCE~ .(--$)F=!! 	 	 	#8(8(8(8FF	  	JiF).)>)>&
Hh&L"J"J{6"F
s   DE E98E9c                    t           rSt          | j        t          j                  sJ t          j        | j                  }t          |t                    sJ |S d }d }| j        }t          |t          j                  sJ t          j        |          }t          j	        |t          d          t          d                    }t          j        |          rt          j        |          }|r|j        rt          |          }|S )NAPN)g_use_extrarz   r   rf   r   r   Annot_getAPbytesr   pdf_dict_getlr   pdf_is_streampdf_load_streamr   JM_BinFromBuffer)r]   rN   rresr   	annot_objaps          r   _getAPzAnnot._getAP  s     	ty%.99999#DI..CsE*****JACIEuen55555+U33I$i$#OOB"B'' 1+R00 *s~ *$S))Hr   r   c                    	 | j         }t          j        |          }t          j        |          }t          j        |t          d          t          d                    }|j        st          t                    t          j	        |          st          t                    t          |          }|j        st          t                    t          |                                ||d           |rGt          j        |t          d                    }t          j        |t          d          |           d S d S # t"          $ r t$          rt'                       Y d S Y d S w xY w)Nr   r   r   RectBBox)r   rf   r   pdf_annot_pager   r   r   RuntimeErrorMSG_BAD_APNr   JM_BufferFromBytesr   MSG_BAD_BUFFERJM_update_streamdocpdf_dict_get_rectpdf_dict_put_rectr   r   rF   )	r]   buffer_r   r   r   r   apobjr   bboxs	            r   _setAPzAnnot._setAP  s[   	9IE+U33I'//D'HTNNHSMMRRE# 1"K000&.. 1"K000$g..C> 2 .111dhhjj%a888 H.	8F;K;KLL'0@0@$GGGGGH H  	9 	9 	9#8(8(8(8(8(8(8888	9s   D7D= =E#"E#Nc                 
   | j         }|j        sJ t          j        |          }t          j        |          }|                                }t          j        |          }	t          |          \  }
}	 |
dk    s;|	t          j        t          j	        t          j
        t          j        t          j        fvr#t          j        |t          d                     n#|
dk    rt          j        ||d |
                    |dk    rdnd}|	t          j        t          j	        t          j        t          j        t          j        t          j
        t          j        t          j        t          j        t          j        t          j        fvrd}|r#t          j        |t          d          |           t          j        |           t          j        |           d|_        |	t          j        k    r$|
dk    rt          j        ||d |
                    n}|
dk    rwt          j        |                                |
          }t9          |
          D ]}t          j        |||                    t          j        |t          d          |           n:# t>          $ r-}t@          rtC                       tE          d|             d }~ww xY w|dk     s|dk    r|sdS 	 t          j#        t          j        |          t          d          t          d                    }|j        stI          tJ                    t          j&        |t          d	                    }|j        s#t          j'        |t          d	          d
          }t          j(        |                                d          }|dk    ro|dk     rit          j)        |t          d          |           t          j)        |t          d          |           t          j)        |t          d          |           |rFt          j*        |t          d          |           t          j*        |t          d          |           t          j&        |t          d                    }|j        s#t          j'        |t          d          d
          }t          j        |t          d          |           n:# t>          $ r-}t@          rtC                       tE          d|             d }~ww xY wdS )Nr   ICr   Rotatezcannot update annot: Tr   r   	Resourcesry   r   CAcaBM	ExtGStateHz#cannot set opacity or blend mode
: )+r   r   rf   r   r   r   r   JM_color_FromSequencePDF_ANNOT_SQUAREPDF_ANNOT_CIRCLEPDF_ANNOT_LINEPDF_ANNOT_POLY_LINEPDF_ANNOT_POLYGONpdf_dict_delr   pdf_set_annot_interior_colorPDF_ANNOT_CARETPDF_ANNOT_FREE_TEXTPDF_ANNOT_FILE_ATTACHMENTPDF_ANNOT_INKPDF_ANNOT_STAMPPDF_ANNOT_TEXTpdf_dict_put_intpdf_dirty_annotpdf_update_annotresynth_requiredpdf_set_annot_colorpdf_new_arrayrangepdf_array_push_realpdf_dict_putr   r   rF   rB   r   r   r   r   pdf_dict_put_dictpdf_new_dictpdf_dict_put_realpdf_dict_put_name)r]   opacity
blend_mode
fill_colorrotater   r   r   pdftype_nfcolfcol
insert_rotcolrq   er   	resourcesalp0extgs                       r   _update_appearancezAnnot._update_appearance  s   	'//	#U++hhjj$e,,+J77t0	 z 	IU**(-++  	I "Ix~~>>>> I2E4<HHH$k0qJ)*-3'(-+*)(   
 O&	8H3E3EvNNN!5)))"E***#$C 11 D19 D-ud6E6lCCC D)488::u== = =A-sDG<<<<"Ix~~sCCC 	 	 	#8(8(8(80Q00111	
 aK 	7a< 	 	4 	$'..TNNSMM B
 = 1"K000*B0E0EFFI' S!3R+9N9NPQRR	%txxzz155D!| M! M'x~~wGGG'x~~wGGG'HTNNGLLL P'x~~zJJJ'HTNNJOOO%y(;2G2GHHD? U.	8K;P;PRSTThsmmT:::: 	 	 	#8(8(8(8?A??@@@	
 ts2   4HJ
 

K(J<<KG<S 
T	(TT	c                    t          |            | j        }t          j        |          }t          j        |t          d          t          d                    }|j        s1t          t          j        t          j        j	                            }n1t          j
        |t          d                    }t          |          }t          |          |                                 j        z  }||                                 j        z  }|S )zannotation appearance bboxr   r   r   )CheckParentr   rf   r   r   r   r   JM_py_from_rectFzRectFixed_INFINITEr   r   
get_parenttransformation_matrixderotation_matrix)r]   r   r   r   r   r   s         r   apn_bboxzAnnot.apn_bbox  s     	D	'..	 HTNNHSMMJJ} 	(!%,u|/J"K"KLLCC*2x/?/?@@D!$''C3ii$//++AAt  22
r   c                    	 t          |            | j        }t          |t          j                  sJ t          j        t          j        |          t          j        t          j                  }|j	        s t          t          j                              S t          j        |t          j                  }t          |          }t          |          }|S # t          $ r t           rt#                        w xY w)zannotation appearance matrix)r-  r   rz   rf   r   r   r   PDF_ENUM_NAME_APPDF_ENUM_NAME_Nr   JM_py_from_matrixFzMatrixpdf_dict_get_matrixPDF_ENUM_NAME_MatrixMatrixr   r   rF   )r]   r   r   matr   s        r   
apn_matrixzAnnot.apn_matrix  s    	IEeU^44444$'..*) B
 = ;()9)9:::+B0JKKC#C((C++CJ 	 	 	#8(8(8(8	s   BC >C !C7c           
         t          |            | j        }t          j        |          }t          j        |t          d                    }d}|j        r#t          t          j        |                    }|S t          j	        |t          d          t          d          t          d          t          d                    }t          j
        |          rt          j        |          }t          |          D ]}t          j        ||          }t          j
        |          rt          j        |          }t          |          D ]w}	t          j        ||	          }
t          j        |
t          d                    dk    r:t          t          j        t          j        ||	                              }|c c S x|S )zannotation BlendModer   Nr   r   r   r   r   )r-  r   rf   r   r   r   r   r   pdf_to_namer   pdf_is_dictpdf_dict_lenr  pdf_dict_get_valpdf_dict_get_key
pdf_objcmp)r]   r   r   r   r  nrq   obj1mjobj2s              r   	blendmodezAnnot.blendmode7  s    	D	'..	 HTNN;;
> 	*5+<S+A+ABBJ!%%%%  S!! 
	."3''A1XX . .-c155$T** .*400A"1XX . .$5dA>> +D(4..AAQF .):5;LUMcdhjkMlMl;m;m)n)nJ#------. r   c                 L   t          |            | j        d         }|t          j        t          j        t          j        t          j        t          j        t          j        t          j	        fvrt                      S t          j        | j                  }t          |          }|S )zBorder information.r   )r-  r   rf   r  r  r  r  r  r  r  r   r   r   JM_annot_border)r]   atypeaorN   s       r   borderzAnnot.borderW  s     	D	!&)#$)'&  		 66M ++b!!
r   r   c                     t          |            | j        }t          j        t          j        |                    }t          ddd|          }t          j        |||           dS )z!Clean appearance contents stream.r   r   )recurseinstance_formsasciisanitizeN)r-  r   rf   pdf_get_bound_documentr   _make_PdfFilterOptionspdf_filter_annot_contents)r]   rU  r   r!  filter_s        r   clean_contentszAnnot.clean_contentsj  sd    D	*5+>u+E+EFF(1AX`aaa'UG<<<<<r   c                     	 t          |            | j        }t          |t          j                  sJ t          t          j        |                    S # t          $ r t          rt                        w xY w)zColor definitions.)
r-  r   rz   rf   r   JM_annot_colorsr   r   r   rF   r   s     r   r   zAnnot.colorsr  s|    	IEeU^44444"5#6u#=#=>>> 	 	 	#8(8(8(8	s   AA !A6c                 ,   t          |            | j        }t          j        |          }t          j        |          }	 t          |          }|j        snt          j        ||           -t          j        |t          d                     t          j
        |                                t          d                    }t          j        |          }d}t          |dz
  dd          D ]m}t          j        ||          }	t          j
        |	t          d                    }
|	j        sAt          j        |
|          st          j        ||           d}n|r7t          j        |                                t          d          |           dS dS )z*Delete 'Popup' and responding annotations.r   PopupAnnotsr   r   ParentN)r-  r   rf   r   r   JM_find_annot_irtr   pdf_delete_annotr  r   r   r   pdf_array_lenr  pdf_array_getrE  pdf_array_deleter  )r]   r   r   r   	irt_annotannotsrF  foundrq   ops              r   delete_responseszAnnot.delete_responses~  s   D	'..	#E**	4)%00I' "4333		4
 	9hw&7&7888#DHHJJ0B0BCC''qsB## 	 	A#FA..A"1hx&8&899A< #Ay11 &vq111 	Gtxxzz8H+=+=vFFFFF	G 	Gr   c                    t          |            t                      }d}d}d}| j        }t          j        |          }t          j        |          }|t          j        k    rt          t                    t          j	        |t          d          t          d          t          d                    }|j        st          dt                     t          j        |t          d                    }	t          j        |	t          d                    }
|
j        rt          j        |
          }n=t          j        |	t          d                    }
|
j        rt          j        |
          }t          j        |	t          d                    }
|
j        rt          j        |
          }t          j        |t          d	                    }
|
j        rt          j        |
          }t          j	        |t          d
          t          d                    }
|
j        rt          j        |
          }t#          |          |t$          <   t'          |          |t(          <   ||t*          <   ||t,          <   |S )zAttached file information.r   NFSEFFbad PDF: file entry not foundUFDescLengthParamsSize)r-  r   r   rf   r   r   r  	TypeErrorMSG_BAD_ANNOT_TYPEr   r   r   RAISEPYJM_Exc_FileDataErrorr   r   r   JM_EscapeStrFromStrdictkey_filenamer   dictkey_descdictkey_lengthdictkey_size)r]   r   lengthsizedescr   r   r"  streamfsri  r3   s               r   	file_infozAnnot.file_info  s"    	Dff	'..	$U++E33 	1/000$	    	L46JKKK	8D>>::r8D>>22< 	7/22HH"2x}}55A| 7 3A66r8F#3#344< 	/+A..Dvx'9'9::< 	)%a((F(:(:HV<L<LMM< 	'#A&&D!4X!>!>.t44\%^!\
r   c                 V    t          |            | j        }t          j        |          S )zFlags field.)r-  r   rf   pdf_annot_flagsr   s     r   flagszAnnot.flags  s*     	D	$U+++r   c                    t          |            | j        }t          j        |          }t          j        |          }|t          j        k    rt          t                    t          j        |t          d          t          d          t          d                    }|j
        st          dt                     t          j        |          }t          |          }|S )zRetrieve attached file content.rm  rn  ro  rp  )r-  r   rf   r   r   r  rv  rw  r   r   r   rx  ry  r   r   )r]   r   r   r   r  bufr   s          r   get_filezAnnot.get_file  s    D	'..	#E**522 	1/000$YPXY\P]P]^^  	L46JKKK#F++s##
r   c                     t          |            d}| j        }t          j        |          }t          j        |t          d                    }|j        rt          j        |          }|S )z*Get annotation optional content reference.r   OCr-  r   rf   r   r   r   r   r   )r]   ocr   r   r   s        r   get_oczAnnot.get_oc  sc    D	'..	 HTNN;;> 	'!#&&B	r   c                 6   	 t          | d          }n# t          $ ry t          j        | j                  }t          |t          j                  sJ |j        r!t          |	                                          nd }t          ||          }|| _        Y nw xY w|S )Nr   )r   AttributeErrorrf   r   r   rz   r   r   r   r   r   r   )r]   rN   r   r   s       r   r1  zAnnot.get_parent  s    	4**CC 	 	 	'	22DtU]3333304Ix,,,THtX&&CDKKK	 
s    B BBc                    t          |            t          t          t          d}t	          |          t
          u r(|                    |                                d          }|rt          |dz  |dz            }t          |          }|}|st          j                    }t          j        | j        ||t          j        d          |          }t          |          }	|r|	                    ||           |	S )zannotation Pixmap)grayrgbcmykNH   r   )r-  csGRAYcsRGBcsCMYKr   r   r   lowerr<  JM_matrix_from_pyrf   fz_device_rgbpdf_new_pixmap_from_annotr   FzSeparationsPixmapset_dpi)
r]   matrixdpi
colorspacealphacspacesctmcspixrN   s
             r   
get_pixmapzAnnot.get_pixmap  s     	D!%@@
s" 	? Z%5%5%7%7>>J 	0C"HcBh//F'' 	'$&&B-dib%BUVWBXBXZ_``Skk 	"KKS!!!
r   c                 f   t          |            | j        }t          j        |          }t          j        |          }t          j        |t          d                    }|t          j        k    s|j        st          t                    t          j        |t          d                    j        rt          dt                     t                      }t          j        |t          d                    }|j        rt          j        |          |d<   t          j        |t          d                    }|j        rt          j        |          |d<   t          j        |t          d                    }|j        rt          j        |          |d	<   t          j        |t          d
                    }|j        rt          j        |          |d<   t          j        |d          }|j        rt          j        |          |d<   t          j        |          }t'          |          }||d<   |S )zRetrieve sound stream.Soundro  zunsupported sound streamRrateCchannelsBbpsEencodingCOcompressionr  )r-  r   rf   r   r   r   r   PDF_ANNOT_SOUNDr   rv  rw  rx  ry  r   pdf_to_realr   r@  r   r   r   )	r]   r   r   r   soundr   r   r  r  s	            r   	get_soundzAnnot.get_sound  s   D	'..	#E**"9hw.?.?@@5(( 	10@ 	1/000eXc]]33> 	G/1EFFFff 66> 	1+C00CK 66> 	4#.s33C
O 66> 	/)#..CJ 66> 	5#/44C
O!%..> 	8!&!23!7!7C#E**!#&&H
r   c                 L   t          |            t          j                    }||_        | j        }t          j        ||          }t          |          }|                                 }t          |t          j
                  r||_        nt          j        |          |_        |S )zMake annotation TextPage.)r-  rf   FzStextOptionsr  r   FzStextPageTextPager1  rz   weakref	ProxyTyper   proxy)r]   clipr  optionsr   	stextpagerN   rj  s           r   get_textpagezAnnot.get_textpage1  s    D&((	%eW55	y!!OOa*++ 	*CJJ q))CJ
r   c                     t          |            | j        }t          j        t          j        |          t          d                    }|j        rdndS )z Check if annotation has a Popup.r^  TF)r-  r   rf   r   r   r   r   )r]   r   r   s      r   	has_popupzAnnot.has_popup@  sO     	D	 !4U!;!;Xg=N=NOO~0tt50r   c                    t          |            | j        }t                      }t          t	          j        |                    |t          <   t	          j        t	          j        |          t          d                    }t          t	          j
        |                    |t          <   t	          j        t	          j        |          t          d                    }t          t	          j        |                    |t          <   t	          j        t	          j        |          d          }t          t	          j        |                    |t          <   t	          j        t	          j        |          t          d                    }t          t	          j        |                    |t           <   t	          j        t	          j        |          d          }t	          j        |          |t"          <   t	          j        t	          j        |          d          }t          t	          j        |                    |t$          <   |S )zVarious information details.NameTCreationDateMSubjNM)r-  r   r   r   rf   pdf_annot_contentsdictkey_contentr   r   r   r@  dictkey_namer   dictkey_titler   dictkey_creationDatedictkey_modDatedictkey_subject
dictkey_id)r]   r   r   ri  s       r   infoz
Annot.infoH  s    	D	ff01I%1P1PQQOu25998F;K;KLL-e.?.B.BCCL u25998C==II.u/G/J/JKKM  3E : :NKK$5e6Nq6Q6Q$R$R ! u25998C==II01I!1L1LMMO  3E : :FCC$7::O  3E : :DAA+E,DQ,G,GHHJ
r   c                     | j         }t          j        |          }t          j        |t	          d                    }|j        sdS t          j        |          S )z%
        annotation IRT xref
        IRTr   )r   rf   r   r   r   r   r   )r]   r   r   irts       r   irt_xrefzAnnot.irt_xrefj  sS    
 	'//	 )Xe__==~ 	1%%%r   c                 R    t          |            t          j        | j                  S )z-Get 'open' status of annotation or its Popup.)r-  rf   pdf_annot_is_openr   r\   s    r   is_openzAnnot.is_openv  s%     	D&ty111r   c                     | j         }t          j        |          }|t          j        k    rdS t	          t          d          sJ t          j        |          S )zannotation languageNfz_string_from_text_language2)r   rf   pdf_annot_languageFZ_LANG_UNSEThasattrr  )r]   
this_annotlangs      r   languagezAnnot.language|  sX     Y
'
335&& 	Fu=>>>>>24888r   c                     t          |            | j        }t          j        |          sdS t          j        |          }t          j        |          }||fS )zLine end codes.N)r-  r   rf    pdf_annot_has_line_ending_stylespdf_annot_line_start_stylepdf_annot_line_end_style)r]   r   lstartlends       r   	line_endszAnnot.line_ends  s[     	D	5e<< 	F1%88-e44t|r   c                    t          |            | j        }t          |t          j                  sJ |j        sJ t          j        |          }|t          j        k    rt          j        |          }nt          j	        |          }|j        rt          |          nd}|sdS d|_        |                                j                                        |                                 j                                        k    sJ ||j        j        t!          |          <   |j        d         t          j        k    r+t%                      }t&                              ||           |}|S )zNext annotation.NTr   )r-  r   rz   rf   r   r   r   PDF_ANNOT_WIDGETpdf_next_annotpdf_next_widgetr   r   r1  m_internal_valuer   _annot_refsidr   Widgetr   _fill_widget)r]   r  r"  r   r   widgets         r   nextz
Annot.next  sD    	DY
*en55555$$$$$Z00E** 	6(44EE)*55E#.8eElllD 	4~~$55774??;L;L;Q;b;b;d;ddddd*-
r#ww'8A;%00 	XXFsF+++C
r   c                     t          |            | j        }d}t          j        t          j        |          t          j                  }t          j        |          rt          j        |          }|S )zOpacity.r   )r-  r   rf   r   r   PDF_ENUM_NAME_CApdf_is_numberr  )r]   r   opyr   s       r   r  zAnnot.opacity  sf     	D	!4U!;!;U=STTr"" 	(#B''C
r   c                    t          |            t          j        t          j        j                  }| j        }t          j        |          }t          j        |t          d                    }|j        r"t          j	        |t          d                    }t          |          }t          |          |                                 j        z  }||                                 j        z  }|S )zannotation 'Popup' rectangler^  r   )r-  rf   r/  r0  r   r   r   r   r   r   r.  r   r1  r2  r3  )r]   r   r   r   r   r   s         r   
popup_rectzAnnot.popup_rect  s     	D|EL788	'//	 )Xg->->??> 	B*30@0@AADd## 3ii$//++AAt  22
r   c                     t          |            d}| j        }t          j        |          }t          j        |t          d                    }|j        rt          j        |          }|S )zannotation 'Popup' xrefr   r^  r  )r]   r   r   r   r   s        r   
popup_xrefzAnnot.popup_xref  sg     	D	'..	 HW,=,=>>> 	)#C((Dr   c                     t           rt          j        | j                  }nt	          j        | j                  }t          |          }|                                 }||j        z  }|S )zannotation rectangle)	r   r   Annot_rect3r   rf   pdf_bound_annotr   r1  r3  )r]   r   rj  s      r   r   z
Annot.rect  sb      	3#TY//CC'	22C3ii OO 	q""
r   c           	         t          j        | j                  }t          j        |t	          d                    }t          j        |          dk    rt          j        t          j        |d                    t          j        t          j        |d                    t          j        t          j        |d                     t          j        t          j        |d                     fS dS )z6
        annotation delta values to rectangle
        RD   r   r   ry   r   N)rf   r   r   r   r   rc  r  rd  )r]   r   arrs      r   
rect_deltazAnnot.rect_delta  s    
 '	22	 )Xd^^<<$$) 	%u':C'C'CDD%u':C'C'CDD&(;S!(D(DEEE&(;S!(D(DEEE	 	 	r   c                     t          |            | j        }t          j        t          j        |          t          j                  }|j        sdS t          j        |          S )zannotation rotationr   )r-  r   rf   r   r   PDF_ENUM_NAME_Rotater   r   )r]   r   rotations      r   r
  zAnnot.rotation  sZ     	D	%u':5'A'A5C]^^" 	2***r   c                    t          |            |                                 }|j        }|j        }||| z  z  }| j        }t          j        |          }t          j        |t          d          t          d                    }|j	        st          t                    t          |          }t          j        |t          d          |           dS )z1
        Set annotation appearance bbox.
        r   r   r   N)r-  r1  rotation_matrixr2  r   rf   r   r   r   r   r   r   JM_rect_from_pyr   )	r]   r   r   rotr=  r   r   r   r   s	            r   set_apn_bboxzAnnot.set_apn_bbox  s     	D  "(sd
	'..	 HTNNHSMMJJ} 	-,,,t$$HV$4$4d;;;;;r   c                 T   t          |            | j        }t          j        |          }t          j        |t          d          t          d                    }|j        st          t                    t          |          }t          j
        |t          d          |           dS )z!Set annotation appearance matrix.r   r   r<  N)r-  r   rf   r   r   r   r   r   r   r  pdf_dict_put_matrix)r]   r  r   r   r   r=  s         r   set_apn_matrixzAnnot.set_apn_matrix  s    D	'..	 HTNNHSMMJJ} 	-,,,''!"hx&8&8#>>>>>r   c                     t          |            | j        }t          j        |          }t          j        |t          d          |           dS )zSet annotation BlendMode.r   Nr-  r   rf   r   r  r   )r]   r  r   r   s       r   set_blendmodezAnnot.set_blendmode  sH    D	'..		8D>>:FFFFFr   c                    t          |            | j        dd         \  }}|t          j        t          j        t          j        t          j        t          j        t          j        t          j	        fvrt          d| d           dS |t          j        t          j        t          j        t          j	        fvr|dk    rt          d| d           d}t          |          t          ur||||d}|                    d	d           |                    d
d           |                    dd           |                    dd           |d	         d|d	<   |d         d|d<   t          |d         d          r?t          |d                   |d<   |d         D ]}t          |t                     sd|d<    n| j        }	t          j        |	          }
t          j        |
          }t)          |||
          S )zbSet border properties.

        Either a dict, or direct arguments width, style, dashes or clouds.Nry   zCannot set border for ''.r   zCannot set cloudy border for 'r   )widthstyledashescloudsr  r  r  r  __getitem__)r-  r   rf   r  r  r  r  r  r  r  rB   r   
setdefaultr  r|   rz   r   r   r   rV  JM_annot_set_border)r]   rP  r  r  r  r  rN  atnameitemr   r   r!  s               r   
set_borderzAnnot.set_border&  s&    	D	"1"v&)#$)'&  
	 8f8889994&)'&	  	 z CCCCDDD<<t# 	Z$uRXYYF'2&&&'4((((D)))(B''''? 	! F7O( 	"!F86(#]33 	$VH%566F8x(  !$,, '+F8$E 	'//	*I66"FC;;;r   c                 &   t          |            |                                 j        }t          |          t          ur||d}|                    d          }|                    d          }t          j        t          j        t          j	        t          j
        t          j        t          j        f}|g dfv r|                    | j        dd           ns|qt          |d          rt!          |          g}t#          |           t%          |          d	v sJ d
t'          |           d}|                    | j        d|           |r.| j        d         |vrt)          d| j        d         z             dS |g dfv r|                    | j        dd           dS |st          |d          rt!          |          g}t#          |           t%          |          d	v sJ d
t'          |           d}|                    | j        d|           dS dS )z\Set 'stroke' and 'fill' colors.

        Use either a dict or the direct arguments.
        r   stroker   r$  r    r  []N	__float__r   r   r  []r   z0Warning: fill color ignored for annot type '%s'.r   r   )r-  r1  r   r   r   r   rf   r  r  r  r  r  r   xref_set_keyr   r  float
CheckColorlenr}   rB   )r]   r   r$  r   r   fill_annotsss          r   
set_colorszAnnot.set_colorsU  s6   
 	Doo&<<t# 	6"f55Fzz&!!H%%-u/EuG[]b]vx}  yP-0b"X 	0TYT2222 	0v{++ )--vv;;)++++(If%%(((ATYQ/// 	DIaL3 	FSTUVVVFB8 	1TYd33333 	1t[)) %d}tt99	))))&IdOO&&&ATYa00000	1 	1r   c                 \    t          |            | j        }t          j        ||           dS )zSet annotation flags.N)r-  r   rf   pdf_set_annot_flags)r]   r  r   s      r   	set_flagszAnnot.set_flagsy  s0    D	!%/////r   c                 "   t          |            t          |          t          u rp|                    dd          }|                    dd          }|                    dd          }|                    dd          }|                    dd          }d}| j        }t          j        |          }|rt          j        ||           |r|rt          j        ||           |r5t          j	        t          j
        |          t          d          |           |r5t          j	        t          j
        |          t          d          |           |r>t          j        t          j
        |          d	t          j        |                     dS dS dS )
zSet various properties.contentNtitlecreationDatemodDatesubjectr  r  r  )r-  r   r   r   r   rf   pdf_annot_has_authorpdf_set_annot_contentspdf_set_annot_authorpdf_dict_put_text_stringr   r   pdf_dict_putspdf_new_text_string)	r]   r  r5  r6  r7  r8  r9  r   	is_markups	            r   set_infozAnnot.set_info  s   D:: 	hhy$//GHHWd++E88ND99Lhhy$//Ghhy$//GD	.u55	 	9(888 	l 9*5%888 s.u/B5/I/I8TbKcKceqrrr c.u/B5/I/I8TW==Zabbb l#E$7$>$>HabiHjHjkkkkk	l 	ll lr   c                 F   | j         }t          j        |          }t          j        |          }|dk     s*|t          j        |                                          k    rt          t                    t          j        |                                |d          }t          j	        |t          d                    }t          j        t          j        |                    }|dk     rt          t                    t          j        |t          d          |           dS )z)
        Set annotation IRT xref
        r   r   Subtyper  N)r   rf   r   r   pdf_xref_lenr   r   MSG_BAD_XREFpdf_new_indirectr   r   pdf_annot_type_from_stringr@  MSG_IS_NO_ANNOTr  )r]   r   r   r   r   r  subtirt_subts           r   set_irt_xrefzAnnot.set_irt_xref  s     	'//	#U++!8 	,tu1488::>>> 	,l+++$dhhjj$::!3(;(;<<3U5F5M5MNNa< 	/o...Ix<<<<<r   c                     t          |            | j        }|st          j        }nt          j        |          }t          j        ||           dS )zSet annotation language.N)r-  r   rf   r  fz_text_language_from_stringpdf_set_annot_language)r]   r  r  r  s       r   set_languagezAnnot.set_language  sS    DY
 	@&DD5h??D$Z66666r   c                     t          |            | j        }t          j        |          rt          j        |||           dS t          d           dS )zSet line end codes.zbad annot type for line endsN)r-  r   rf   r   pdf_set_annot_line_ending_stylesr   )r]   startendr   s       r   set_line_endszAnnot.set_line_ends  sZ    D	1%88 	<25%EEEEE:;;;;;r   c                     t          |            | j        }t          j        |          }t          j        |t          d          |           dS )zSet /Name (icon) of annotation.r  Nr  )r]   r   r   r   s       r   set_namezAnnot.set_name  sJ    D	'..		8F+;+;TBBBBBr   c                     t          |            | j        }t          j        |          }|s$t          j        |t          d                     dS t          t          j        |          ||           dS )z Set / remove annotation OC xref.r  N)r-  r   rf   r   r  r   JM_add_oc_objectrV  )r]   r  r   r   s       r   set_oczAnnot.set_oc  ss    D	'..	 	Uy(4..99999U9)DDiQSTTTTTr   c                     t          |            | j        }t          |dd          st          j        |d           dS t          j        ||           |dk     rt          j        |          }d|_        dS dS )zSet opacity.              ?r   N)r-  r   _INRANGErf   pdf_set_annot_opacityr   transparency)r]   r  r   r   s       r   set_opacityzAnnot.set_opacity  s    D	c** 	'q111F#E7333S= 	"'..D !D	" 	"r   c                 \    t          |            | j        }t          j        ||           dS )z-Set 'open' status of annotation or its Popup.N)r-  r   rf   pdf_set_annot_is_open)r]   r  r   s      r   set_openzAnnot.set_open  s0    D	#E733333r   c                     t          |            | j        }t          j        |          }t	          |          }t          j        t          |          |          }t          j        ||           dS )z@
        Create annotation 'Popup' or update rectangle.
        N)r-  r   rf   r   JM_rotate_page_matrixfz_transform_rectr  pdf_set_annot_popup)r]   r   r   pdfpager  r   s         r   	set_popupzAnnot.set_popup  si     	D	&..#G,,#OD$9$93??!%+++++r   c                    t          |            | j        }t          j        |          }t	          |          }t          j        t          |          |          }t          j        |          st          j        |          rt          t                    	 t          j        ||           dS # t          $ r}t          d|            Y d}~dS d}~ww xY w)zSet annotation rectangle.zcannot set rect: NF)r-  r   rf   r   re  rf  r  fz_is_empty_rectfz_is_infinite_rectr   MSG_BAD_RECTpdf_set_annot_rectr   rB   )r]   r   r   rh  r  r   r'  s          r   set_rectzAnnot.set_rect  s    D	&u--#G,,#OD$9$93??!!$$ 	,(A!(D(D 	,l+++	$UA..... 	 	 	+++,,,55555	s   B0 0
C:CCc                 D   t          |            | j        }t          j        |          }|t          j        t          j        t          j        t          j        t          j        t          j	        t          j
        t          j        t          j        t          j        t          j        fvrdS |}|dk     r|dz  }|dk     |dk    r|dz  }|dk    |t          j        k    r|dz  dk    rd}t          j        |          }t          j        |t#          d          |           dS )zSet annotation rotation.Nr   h  Z   r   )r-  r   rf   r   r
  r  r  r  r  r  r  r  r  r  r  r   r  r   )r]   r   r   r   r  r   s         r   set_rotationzAnnot.set_rotation  s$   D	#E**%&)/#$)'&%$  	 FAg 	3JC Ag 	Sj 	3JC Sj 	5,, 	rQ 	C'..	y(8*<*<cBBBBBr   c                 ^   t          |            | j        j        sdS t          j        | j                  }t          j        |          }t          j        t          j        | j                  d          }|j        rt          j        |          r||fS t          j	        |          }|||fS )zannotation typenullIT)
r-  r   r   rf   r   pdf_string_from_annot_typer   r   pdf_is_namer@  )r]   r"  cri  its        r   r   z
Annot.type  s     	Dy# 	6$TY//,U33!4TY!?!?FF| 	u033 	1:q!!q"~r   Tr  r  r   r   r   border_colorr  	cross_outr   c
                 V   t                                            t          |            d }
| j        d         }| j                            dd          }| j                            dd          }| j        d         }||}n| j        d         }d}| j        }|	dk    r=|	dk     r|	d	z  }	|	dk     |	d	k    r|	d	z  }	|	d	k    |t          j	        k    r|	d
z  dk    rd}	|| j
        }t          |d          s| j        }d|cxk    rdk     sn |d}nd}|t          j	        k    rt          |           t          |           t          |           t                              |           \  }}}d}|dk    rd}d}||}d}||}d}|dk    r|}d}|rld}t!          |          dk    rd}n+t!          |          dk    rd}nt!          |          dk    rd} |j        |||d}t                              | |           |                     ||||	          }|du rt)          d           |
|d          } |
|d          }|                                 j        }| }|rDdd                    t1          t2          |                    z   dz   }|                    d          }nd}| j        r| j        \  }} nd \  }} |                                 }!|!                                }"d}#|t          j        k    r;|rd}#|"dd         }"|"\  }$}%}&}'}(|"                    |&           |"                    |%           |"                    |'           |"                    |%           |"                    |(           |"                    d!           |dk    s|d"k    rd}#|dk    r%tA          |                                          d#z   gng })|"D ]R}*|*!                    d$          r|*!                    d%          r|d"k    r
|dd         }*|)                    |*           S|)}"d&                    |"          }!|t          j	        k    r|!"                    d'          }+|!#                    d(          d)z   },|!|+|,         }!| j$        j%        | j$        j&        }.}-|	d*v s|j'        |j(        cxk    rdk    sn |.|-}.}-d+tA          |-|.f                                          z   d,z   }/|/d-z   |!z   }!d}0 |
|d          }1|1rd.}0 |
|d          }2|2r-|dk    r'd!}0tA          |                                          d/z   }nd"x}}2|1r|2rd0}0|0||1z   |2z   |/z   d&z   |0z   d&z   |!z   }!|
|d&z   |!z   }!d}d}#|t          j)        t          j*        fv rd&                    |"dd                   d&z   }!d}#|d"k    r/|t          j)        k    r	|!|z   d1z   }!nA|t          j*        k    r|!d!z   }!n+|t          j)        k    r|!d2z   }!n|t          j*        k    r|!d!z   }!|||!z   }!|!+                    d3d4d          }!d}#|r|                    d          |!z   }!d}#d5|!z   d6z   }!|| z   dk    r|t          j)        t          j*        fv rzdt          j,        t          j-        t          j.        t          j/        t          j0        t          j1        t          j2        t          j3        t          j4        f
}3tk          dt!          |3                    }4d)tm          d| j        d                   z  }5| j$        |5 |5 |5|5fz   }d}#| j7        }6||4v r\tq          |6d                   |z  }7tq          |6d                   |z  }8 |3|         | |7|8d|          }9|!|9                                z  }!| |4v r\tq          |6d7                   |z  }7tq          |6d                   |z  }8 |3|          | |7|8d|          }9|!|9                                z  }!|#rF|r-| 9                    |           | :                    |!d8           n| :                    |!d8           |t          j;        t          j<        t          j=        t          j>        t          j?        t          j*        t          j)        t          j@        t          jA        t          jB        f
vrdS | jC        }:|:dk    rdS | j$        jD        | j$        jE        z   d)z  };|:dk    rt          |t          dd          z
            d9k     rdS | j$        H                    |;|           }<| I                    |<j$                   | J                    t          dd                     dS t          |:          }=| j$        H                    |;|=          }<| 9                    |<j$                   | J                    ||=z             dS ):a"  Update annot appearance.

        Notes:
            Depending on the annot type, some parameters make no sense,
            while others are only available in this method to achieve the
            desired result. This is especially true for 'FreeText' annots.
        Args:
            blend_mode: set the blend mode, all annotations.
            opacity: set the opacity, all annotations.
            fontsize: set fontsize, 'FreeText' only.
            fontname: set the font, 'FreeText' only.
            border_color: set border color, 'FreeText' only.
            text_color: set text color, 'FreeText' only.
            fill_color: set fill color, all annotations.
            cross_out: draw diagonal lines, 'Redact' only.
            rotate: set rotation, 'FreeText' and some others.
        c                 X    t          | |          }|sdS |dz                                   S )zHReturn valid PDF color operator for a given color sequence.
            r   
)	ColorCodeencode)r  codeccs      r   color_stringz"Annot.update.<locals>.color_stringH  s6     2t$$B sI%%'''r   r   r  Nr  r   r$  r   rq  rr  r&  r   /H gs
r(   F   Tr   !{:g} {:g} {:g} rg /{f:s} {s:g} Tf{:g} g /{f:s} {s:g} Tfr  %{:g} {:g} {:g} {:g} k /{f:s} {s:g} Tffr/  )r  r  r  r   zError updating annotation.r  ry  r(  rl   z] 0 d
utf-8r   r      Sr   s    w   ws   RG   
   BT   ETry   rr    s   0 0 s    re   
W
n
   fs    w
   B   b   ss   
S
s
   
S
[] 0 d
   q
s   
Q
r   h㈵>)Kr   update_timing_testr-  r   rP  r   r   r>  rf   r  rK  r  r  r,  r   r   r-  format
_update_dar+  r   r1  r2  joinmapr   r  r  r   
splitlinesr   r6   r}   endswithri   rfindr   r  heightbry  r  r  replace
_le_square
_le_circle_le_diamond_le_openarrow_le_closedarrow_le_butt_le_ropenarrow_le_rclosedarrow	_le_slashr  maxverticesPointro  r   r
  r  r  r  r  r  r  r  r
  tlbrabsr<  morphsetRectr  )>r]   r  r  r   r   r   r{  r  r|  r   r  
annot_typedtbwidthr$  r   r   apnmatopa_codetcolfnamefsizeupdate_default_appearanceda_strrv   r   bfillbstrokep_ctmimatr  line_end_leline_end_rir   ap_tab
ap_updated_LLLRURULntabr=   BTETr   hreopefill_stringstroke_stringle_funcsle_funcs_rangedpointsp1p2leftr  r  quadr=  s>                                                                 r   updatezAnnot.update*  s   8 	  """D	( 	( 	( Yq\
[__Xt,,"--X& 	'DD;v&DR< 	1* # 1* C- # C- U66 6B;!;K 
  	(Jw,, 	#lG 	 	 	 	! 	 	 	 	z 	 HHH22 	/|$$$z"""z"""!&!6!6D% ).%z 1,0) 1!,0) 1 ,0)!| 1 ,0)( 	/t99> B=CCYY!^ B2CCYY!^ BAC#TUe<<<  v...
 %%!	 & 
 
 %< 	=;<<<T3'',vs++!!7v 	388CRLL111I=F]]7++FFF> 	,'+~$K'+$K [[]]
// 	$ 	$!
$*!2r2rb!!!b!!!b!!!b!!!b!!!d###z 	W^ 	!
?EzQ	&))0022U:;;r" & &D}}T** ! }}U++ ,3 ,&ss|KK%%%%F##B22 	B%1$BBrEB9?DI$4qA" 68vx    1    !19aV,,33555>Bk!B&BC&,tS11K (Ls;;M -! -"6**1133g=),, }  Zk)M9B>FLuTWYY e^b(J%153LMM 	#F3B3K((50BJ| 	#!88 #ed*BB5#<< #dB!88 #dBB5#<< #dB 	"BH&6::BJ 	))B.BJb[8# $q( 	$ZE<SUZUn;o-o 	$e.0@)5+>-u~,e.D	)H
 #1c(mm44NC4;w/000A9QB1~-DJ]Fn, $6!9%%,6!9%%,,x,T2r5*MMdkkmm#n, $6":&&-6":&&-,x,T2r4LLdkkmm# 	( (d###BQ''''BQ'''
 %&/#$)'&%$  	 Fm"9 	FY\DIL(A-!8 	6F1aLL())D0 9??1vg..DLL###q!---FSkkyq#&&di   FSL)))))r   c                    t          |            | j        }t          j        |          }t          j        |          }t          j        |          }|t          j        k    rt          t                    t          j	        |t          d          t          d          t          d                    }	|	j        st          dt                     t          j        |t          d                    }
t          |          }|r|j        st!          t"                    |rt%          ||	|d           t          j        |          \  }}t          j        |          }t          j        |	t          d          |           t          j        |	|t          d          t          d                     |rt          j        |	t          d          |           t          j        |
t          d          |           t          j        |	t          d	          |           t          j        |
t          d	          |           t          j        |t          d
          |           |rFt          j        |	t          d	          |           t          j        |
t          d	          |           |rHt          j        |	t          d          |           t          j        |
t          d          |           dS dS )zUpdate attached file.rm  rn  ro  bad PDF: no /EF objectr   DLrt  ru  rq  Contentsrr  N)r-  r   rf   r   rV  r   r  rv  rw  r   r   r   rx  ry  r   r   r   r   r   fz_buffer_storagepdf_new_intr  pdf_dict_putlr=  )r]   r   r3   	ufilenamer  r   r   r!  r   r  r  r   r-  r  ls                  r   update_filezAnnot.update_fileF  s   D	'..	*955#E**522 	1/000$YPXY\P]P]^^  	E-/CDDD	8D>>:: !)) 	.3> 	.n--- 	QS&#q111,S11FC!#&&Avx~~q9998H+=+=x?O?OPPP 	V*68C==(KKK*2x}}hGGG*68D>>8LLL*2x~~xHHH*9hz6J6JHUUU 	J*68D>>9MMM*2x~~yIII 	G*68F3C3CTJJJ*2x/?/?FFFFF	G 	Gr   c                  8    d} t          d          D ]}| |z  } | S )Nr   i0u  )r  )totalrq   s     r   r  zAnnot.update_timing_testq  s,     	 	AQJEEr   c           	         t          |            | j        }t          |t          j                  sJ t          j        |          }t          j        |          }t          j                    }t          j                    }t          j	        |||           t          |          }t          j        ||          }t          j        |t          d                    }|j        s"t          j        |t          d                    }|j        s"t          j        |t          d                    }|j        st          j        |d          }|j        rg }t!          dt          j        |          d          D ]}	t          j        t          j        ||	                    }
t          j        t          j        ||	dz                       }t          j        |
|          }t          j        ||          }|                    |j        |j        f           |S t          j        |d          }|j        rg }t!          t          j        |                    D ]}	g }t          j        ||	          }t!          dt          j        |          d          D ]}t          j        t          j        ||                    }
t          j        t          j        ||dz                       }t          j        |
|          }t          j        ||          }|                    |j        |j        f           |                    |           |S d	S )
zannotation vertex pointsVerticesL
QuadPointsCLr   ry   r   InkListN)r-  r   rz   rf   r   r   r   r9  r/  pdf_page_transformJM_derotate_page_matrix	fz_concatr   r   r   r   r  rc  r  rd  FzPointfz_transform_pointr6   xy)r]   r   r   r   page_ctmdummyderotri  r   rq   r  r  pointres1o1rI  s                   r   r  zAnnot.verticesx  s    	D	%00000'..	#E**>## uh777'--?8U33 y(:*>*>??|PE$6y(3--$P$P|YE$6y(<BXBX$Y$Y|HE$7	4$H$H< 
	 C1e1!44a88 0 0%e&9!Q&?&?@@%e&9!QqS&A&ABBa++0AA

UWeg.////J	955< 	 C5.q1122 	! 	!(A..q%"5b"9"91== 5 5A)%*=b!*D*DEEA)%*=b!A#*F*FGGA!M!Q//E!4UHEEEKK%'57!34444

4    J	 	r   c                 z    t          |            | j        }t          j        t          j        |                    S )zannotation xref number)r-  r   rf   r   r   r   s     r   r   z
Annot.xref  s5     	D	 3E : :;;;r   r   )r   NNr   r   )NNNr   rW   )Nr   NNr   NNNNNNNNNr   )	NNr   NNNNTr   NNNN)Fr`   ra   rb   r^   r   r   r   r   r   r   r+  propertyr4  r>  rK  rP  rZ  r   rk  r  r  r  r  r1  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r
  r  r  r  r!  r0  r3  rA  rK  rO  rT  rV  rY  r`  rc  ri  ro  rs  r   OptStrOptFloatr+  OptSeqboolr   r  r  staticmethodr  r  r   r    r   r   r   r   M  s         E E E  ! ! !% % %N  &9 9 9 9(` ` ` `D   X    X.   X>   X$= = = = 	 	 X	G G G6 / / X/b , , X,  	 	 	     (  @    1 1 X1   XB 	& 	& X	& 2 2 X2
 9 9 X9 	 	 X	   X2   X   X$ 	 	 X	   X&   X + + X+< < <"	? 	? 	?G G G-< -< -< -<^"1 "1 "1 "1H0 0 0l l l l<= = = 7 7 7 7< < <C C CU U U U
" 
" 
"4 4 4	, 	, 	,   C C C C<   X !%#" $"& $!Z* Z*Z*Z* Z* 	Z*
 Z* !Z* Z* Z* Z* Z* Z* Z*x)G )G )G )GV   \ 3 3 X3j < < X< < <r   r   c                   l    e Zd Zd Zd ZddZddZddZddZddZ	dd	Z
ed
             Zd Zd ZdS )Archivec                 x    t                      | _        t          j                    | _        |r | j        |  dS dS )z
        Archive(dirname [, path]) - from folder
        Archive(file [, path]) - from file name or object
        Archive(data, name) - from memory item
        Archive() - empty archive
        Archive(archive [, path]) - from archive
        N)r{   _subarchivesrf   fz_new_multi_archiver   addr]   argss     r   r^   zArchive.__init__  sG     !FF.00	 	DHt	 	r   c                 0    dt          | j                   S )NzArchive, sub-archives: )r-  r  r\   s    r   r   zArchive.__repr__  s    AT->)?)?AAAr   Nc                 <    t          j        | j        ||           d S r   )rf   fz_mount_multi_archiver   )r]   subarchr1   s      r   	_add_archzArchive._add_arch  s    $di$?????r   c                 d    t          j        |          }t          j        | j        ||           d S r   )rf   fz_open_directoryr  r   )r]   folderr1   subs       r   _add_dirzArchive._add_dir  s/    %v..$did;;;;;r   c                     t          |          }t          j        t          j                              }t          j        |||           t          j        | j        ||           d S r   )r   rf   fz_new_tree_archiveFzTreefz_tree_archive_add_bufferr  r   )r]   memoryr   r1   buffr  s         r   _add_treeitemzArchive._add_treeitem  sW    !6**'88(#tT:::$did;;;;;r   c                     |dk    rt          j        |          }nt          j        |          }t          j        | j        ||           d S Nr   )rf   fz_open_zip_archivefz_open_tar_archiver  r   )r]   filepathr"  r1   r  s        r   _add_ziptarfilezArchive._add_ziptarfile  sM    A: 	7+X66CC+X66C$did;;;;;r   c                     t          |          }t          j        |          }|dk    rt          j        |          }nt          j        |          }t          j        | j        ||           d S r'  )r   rf   fz_open_bufferfz_open_zip_archive_with_streamfz_open_tar_archive_with_streamr  r   )r]   r#  r"  r1   r$  r  r  s          r   _add_ziptarmemoryzArchive._add_ziptarmemory  sk    !6**%t,,!8 	A7@@CC7@@C$did;;;;;r   c                 Z	    d } fd}t          |t          j                  rt          |          }t          |t                    rt          j                            |          r5                     ||            |t	          j        |          |d          S t          j        	                    |          rt          |t                    r|dk    sJ d|d            t          |          5 }|                                }ddd           n# 1 swxY w Y                        ||            ||gdd          S t          d	|           ||          rEt          |t                    r
|d|dk    sJ                      ||            ||gdd          S t          |t          j                  rzt!          |d
d          }|1|j                                        }                     |d|           n                     |d|            ||                                |d          S t          |t,          j                  rt!          |j        dd          }|R|j        }t          |t2          j                  s|j        }                     |                                d|           n                     |d|            ||                                |d          S t          |t8                    r#                     ||            |g |d          S t          |t<                    rt?          |          dk    r
|\  }	}
t          |
t                    sJ dtA          |
                       ||	          r                     |	|
|           nt          |	t                    rtt          j        	                    |	          rTt          |	d          5 }|                                }ddd           n# 1 swxY w Y                        ||
|           nJ dtA          |	          d             ||
g|d          S tC          |d          r|D ]} "                    ||           dS tG          dtA          |           d          )a  
        Add a sub-archive.

        Args:
            content:
                The content to be added. May be one of:
                    `str` - must be path of directory or file.
                    `bytes`, `bytearray`, `io.BytesIO` - raw data.
                    `zipfile.Zipfile`.
                    `tarfile.TarFile`.
                    `pymupdf.Archive`.
                    A two-item tuple `(data, name)`.
                    List or tuple (but not tuple with length 2) of the above.
            path: (str) a "virtual" path name, under which the elements
                of content can be retrieved. Use it to e.g. cope with
                duplicate element names.
        c                 P    t          | t          t          t          j        f          S r   )rz   r   	bytearrayioBytesIOr  s    r   is_binary_dataz#Archive.add.<locals>.is_binary_data  s    a%BJ!?@@@r   c                 j   t          || |          }|dk    sj        g k    rj                            |           d S j        d         }|d         dk    s|d         |d         k    rj                            |           d S |d                             |d                    |j        d<   d S )N)rv   entriesr1   treer   rv   r1   r9  )r   r  r6   extend)r9  mountrv   r  ltreer]   s        r   make_subarchz!Archive.add.<locals>.make_subarch  s    sG%@@@Gf} 2 1R 7 2!((11111)"-<6) 2U6]gfo-M 2%,,W55555)$++GI,>???,1D%b)))r   dirr(   z'Need name for binary content, but path=rs   Nr:  zNot a file or directory: r3   r   zipr   r   tarmultiry   zUnexpected type(name)=)r1   rbzUnexpected type(data)=r  zUnrecognised type )$rz   pathlibPathr   r   r1   isdirr  listdirisfiler   readr%  r   zipfileZipFiler   fpgetvaluer0  r+  namelisttarfileTarFilefileobjr4  r5  getnamesr  r  r|   r-  r   r  r  rv  )r]   r5  r1   r7  r>  r  ffr3   rL  datar   r   s   `           r   r  zArchive.add  s   $	A 	A 	A
	2 
	2 
	2 
	2 
	2 gw|,, 	#'llGgs## *	3w}}W%% Jgt,,,#|BJw$7$7uEEE(( J!$,, F F FETEEEF F F']] "aB" " " " " " " " " " " " " " """2t,,,#|TFD&999 !HW!H!HIII^G$$ 	3dC(( BT 6B9=6B 6B 6B .B B B Bw---<f55511 	3w
D99H 8Z((**&&r1d3333$$Xq$777< 0 0 2 2D%@@@11 	3w==H 8_!"bj11 $B&&r{{}}a>>>>$$Xq$777< 0 0 2 2D%@@@)) 	3NN7D)))<D'222gu%% 	C#g,,!*; 	C JD$dC((EE*ET

*E*EEEE~d## 7""4D"9999D#&& 77>>$'' <dD)) &QVVXX& & & & & & & & & & & & & & &&&r4d&;;;66T

666666<f555Wm,, 	C % %t$$$$F AgAAABBBs$   4DDD2PPPc                     | j         S )z'
        List of sub archives.
        )r  r\   s    r   
entry_listzArchive.entry_listM  s    
   r   c                 6    t          j        | j        |          S r   )rf   fz_has_archive_entryr   r]   r   s     r   	has_entryzArchive.has_entryT  s    )49d;;;r   c                 T    t          j        | j        |          }t          |          S r   )rf   fz_read_archive_entryr   r   )r]   r   r$  s      r   
read_entryzArchive.read_entryW  s$    *DIt<<&&&r   r   )r`   ra   rb   r^   r   r  r  r%  r+  r0  r  r  rV  rZ  r]  r    r   r   r  r    s          B B B@ @ @ @< < < << < < << < < << < < <g g g gR ! ! X!< < <' ' ' ' 'r   r  c                      e Zd Zd Zd Zd Zd Zd Zd ZdKdZ	d	 Z
d
 Zd ZdLdZd ZdMdZdKdZd ZdNdZd Zd Zd ZdKdZdKdZd Zd Zd Zd Zd Zed             Zd Zd Z d  Z!d! Z"d" Z#e$d#             Z%d$ Z&d% Z'd& Z(d' Z)d( Z*e$d)             Z+e$d*             Z,e$d+             Z-e$d,             Z.e$d-             Z/d. Z0d/ Z1e$d0             Z2d1 Z3d2 Z4d3 Z5dOd5Z6d6 Z7d7 Z8d8 Z9d9 Z:d: Z;dOd;Z<d< Z=d= Z>d> Z?d? Z@d@ ZAdA ZBdB ZC	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dPdCZDdD ZEdQdFZFdG ZGdH ZHe$dI             ZIe$dJ             ZJe	ZKe	ZLe	ZMdS )RXmlc                     | S r   r    r\   s    r   	__enter__zXml.__enter__^      r   c                     d S r   r    r  s     r   __exit__zXml.__exit__a      r   c                    t          |t          j                  r	|| _        d S t          t                    r/t          j        |          }t          j        |          | _        d S J dt          |                       )Nr   zUnsupported type for rhs: )rz   rf   FzXmlr   r   fz_new_buffer_from_copied_datafz_parse_xml_from_html5r   )r]   rhsr$  s      r   r^   zXml.__init__d  st    sEK(( 	?DIII 	?7==D5t<<DIII>>499>>>>>r   c                 4    fdd}g } | ||          }|S )Nc           	         | | j         r(|                    |d| j         df           | j        } 1|                    |d| j         f           |                                                                 D ]#\  }}|                    |d| d| df           $| j        }|r |||dz             }|                    |d| j         f           | j        } | |S )N"(=z 'r   r   ))is_textr6   r:   r  tagnameget_attributesitemsfirst_child)nodert  shiftkrM   child	show_nodes         r   rz  z%Xml._get_node_tree.<locals>.show_noden  s    !< LL%)9TY)9)9)9!:;;;9De%7%7%78999 //117799 9 9DAqLL%Q!!78888( ?%IeUEAI>>Ee%7%7%78999y  ! Lr   r   r    )r]   rw  rt  rz  s      @r   _get_node_treezXml._get_node_treem  s@    	 	 	 	 	  	$u--r   c                 Z    |                      d          }|                     |           |S )zAdd bulleted list ("ul" tag)ulcreate_elementappend_childr]   ry  s     r   add_bullet_listzXml.add_bullet_list  .    ##D))%   r   c                     |                      d          }|||v r| S |                     d           ||}n|d|z   z  }|                     d|           | S )z5Set some class via CSS. Replaces complete class spec.classNrl   get_attribute_valueremove_attributeset_attribute)r]   r:   clss      r   	add_classzXml.add_class  sy    &&w// 	ts{ 	Kg&&& 	CC3:C7C(((r   Nc                    |                      d          }t          |          t          u r(|                    |                     |                     |                                 }|| }|                    |           | S )zAdd a "code" tagr  r  r   r   r  create_text_nodespan_bottomr]   r:   ry  prevs       r   add_codezXml.add_code  s    ##F++:: 	<t44T::;;;!! 	D%   r   c                 Z    |                      d          }|                     |           |S )z!Add monospaced lines ("pre" node)prer~  r  s     r   add_codeblockzXml.add_codeblock  .    ##E**%   r   c                 Z    |                      d          }|                     |           |S )zAdd description list ("dl" tag)dlr~  r  s     r   add_description_listzXml.add_description_list  r  r   c                 Z    |                      d          }|                     |           |S )zAdd "div" tagdivr~  r  s     r   add_divisionzXml.add_division  r  r   r   c                     |t          dd          vrt          d          | j        }d| }|                     |          }|dvr|                     |           |S | j                            |           |S )zAdd header tagr      zHeader level must be in [1, 6]r  )h1h2h3h4h5h6rj  )r  r   rr  r  r  r   )r]   levelthis_tagnew_tagry  s        r   
add_headerzXml.add_header  s    a# 	?=>>><e++##G,,DD 	e$$$L  '''r   c                 Z    |                      d          }|                     |           |S )zAdd horizontal line ("hr" tag)hrr~  r  s     r   add_horizontal_linezXml.add_horizontal_line  r  r   c                 T   |                      d          }||                    d|            ||                    d|            ||                    dd|            ||                    d|            |                    d|            |                     |           |S )	zAdd image node (tag "img").imgNr  r  r  zfloat: r   src)r  r  r  )r]   r   r  r  imgfloatr   ry  s          r   	add_imagezXml.add_image  s    ##E** 	5E444 	7V+666 	?)=8)=)=>>> 	5E444Ed9---%   r   c                 4   |                      d          }t          |t                    s|}|                    d|           |                    |                     |                     |                                 }|| }|                    |           | S )zAdd a hyperlink ("a" tag)r   href)r  rz   r   r  r  r  r  )r]   r  r:   ry  r  s        r   add_linkzXml.add_link  s    ##C(($$$ 	DFD)))40066777!! 	D%   r   c                     | j         dvrt          d| j                   |                     d          }|                     |           |S )z8Add item ("li" tag) under a (numbered or bulleted) list.)olr}  zcannot add list item toli)rr  r   r  r  r  s     r   add_list_itemzXml.add_list_item  sQ    <|+ 	F6EEE##D))%   r   c                     |                      d          }|dk    r#|                    dt          |                     ||                    d|           |                     |           |S )zAdd numbered list ("ol" tag)r  r   rR  Nr   )r  r  r   r  )r]   rR  numtypery  s       r   add_number_listzXml.add_number_list  st    ##D))19 	5U444 	1000%   r   c                     |                      d          }| j        dk    r|                     |           n| j                            |           |S )zAdd "p" tagrj  )r  rr  r  r   r  s     r   add_paragraphzXml.add_paragraph  sV    ##C((<3 	,e$$$$K$$U+++r   c                 Z    |                      d          }|                     |           |S Nspanr~  r  s     r   add_spanzXml.add_span  s.    ##F++%   r   c                     |                      d          }|||v r| S |                     d           ||}n|d|z   z  }|                     d|           | S )z;Set some style via CSS style. Replaces complete style spec.r  N;r  )r]   r:   r  s      r   	add_stylezXml.add_style  sy    ((11 	 	Kg&&& 	 EES4ZE7E***r   c                    |                      d          }t          |          t          u r(|                    |                     |                     |                                 }|| }|                    |           | S )zAdd a subscript ("sub" tag)r  r  r  s       r   add_subscriptzXml.add_subscript      ##E**:: 	<t44T::;;;!! 	D%   r   c                    |                      d          }t          |          t          u r(|                    |                     |                     |                                 }|| }|                    |           | S )zAdd a superscript ("sup" tag)supr  r  s       r   add_superscriptzXml.add_superscript  r  r   c                 X   |                                 }t          |          }|                                 }|| }t          |          D ]^\  }}|                    |                     |                     ||dz
  k     r(|                    |                     d                     _| S )z"Add text. Line breaks are honored.Nr   r  )r  r-  r  	enumerater  r  r  )r]   r:   lines
line_countr  rq   r=   s          r   add_textzXml.add_text%  s    !!ZZ
!! 	D '' 	= 	=GAtd33D99::::>! =!!$"5"5d";";<<<r   c                 D    t          j        | j        |j                   d S r   )rf   fz_dom_append_childr   r  s     r   r  zXml.append_child3  s    !49ej99999r   c                     |                      d          }|                    |           |                                 }|| }|                    |           |S r  )r  r  r  r  )r]   r  r  r  s       r   append_styled_spanzXml.append_styled_span6  s^    ""6**u!! 	D$r   c                 N    t          t          j        | j                            S r   )r_  rf   fz_dom_bodyr   r\   s    r   bodytagzXml.bodytag?  s    E%ty11222r   c                 R    t          j        | j                  }t          |          S r   )rf   fz_dom_cloner   r_  r]   rN   s     r   clonez	Xml.cloneB  s      $),,Cyyr   c                     t          |           t          u r| S t          |           t          u rdt          |            dS t          |           t          t
          fv rdt	          |            S | S )Nzrgb(rp  r  )r   r   r   sRGB_to_rgbr|   r{   )colors    r   
color_textzXml.color_textF  sv    ;;# 	L;;# 	0/+e,,////;;5$-' 	('u'''r   c                 P    t          t          j        | j        |                    S r   )r_  rf   fz_dom_create_elementr   )r]   tags     r   r  zXml.create_elementP  s    E/C@@AAAr   c                 P    t          t          j        | j        |                    S r   )r_  rf   fz_dom_create_text_noder   r]   r:   s     r   r  zXml.create_text_nodeS  s    E149dCCDDDr   c                     |                                  }|D ]7}t          d|d         z  |d                             dd          z              8dS )z)Print a list of the node tree below self.z  r   r   r  \nN)r{  rB   r  )r]   rt  r   s      r   debugz	Xml.debugV  s`    ##%% 	C 	CDD47NT!W__T5%A%AABBBB	C 	Cr   c                 j    t          j        | j        |||          }|j        rt	          |          S d S r   )rf   fz_dom_findr   r   r_  r]   r  attmatchrN   s        r   ri   zXml.find\  s:    Ce<<> 	99	 	r   c                 j    t          j        | j        |||          }|j        rt	          |          S d S r   )rf   fz_dom_find_nextr   r   r_  r  s        r   	find_nextzXml.find_nexta  s:    $dic5AA> 	99	 	r   c                     t          j        | j                  rd S t          j        |           }|j        rt          |          S d S r   )rf   fz_xml_textr   fz_dom_first_childr   r_  r  s     r   ru  zXml.first_childf  sL    di(( 	F&--> 	99	 	r   c                 >    |sJ t          j        | j        |          S r   )rf   fz_dom_attributer   r]   keys     r   r  zXml.get_attribute_valueo  s     


%ty#666r   c                     t          j        | j                  rd S t                      }d}	 t          j        | j        |          \  }}|r|sn|||<   |dz  }-|S Nr   r   )rf   r  r   r   fz_dom_get_attribute)r]   resultrq   r   r  s        r   rs  zXml.get_attributess  sw    di(( 	F	149a@@HC c FCLFA	 r   c                 D    t          j        | j        |j                   d S r   )rf   fz_dom_insert_afterr   r]   rv  s     r   insert_afterzXml.insert_after  s    !49di88888r   c                 D    t          j        | j        |j                   d S r   )rf   fz_dom_insert_beforer   r  s     r   insert_beforezXml.insert_before  s    "DIty99999r   c                 (   |                                 }t          |          }t          |          D ]^\  }}|                     |                     |                     ||dz
  k     r(|                     |                     d                     _| S )Nr   r  )r  r-  r  r  r  r  )r]   r:   r  r  rq   r=   s         r   insert_textzXml.insert_text  s    !!ZZ
 '' 	= 	=GAtd33D99::::>! =!!$"5"5d";";<<<r   c                     | j         duS )zCheck if this is a text node.NrA   r\   s    r   rq  zXml.is_text  s     y$$r   c                 6    | j         }|dS 	 |j        }|s|S |})zReturn last child node.N)ru  r  )r]   ry  r  s      r   
last_childzXml.last_child  s<       	4	:D E		r   c                 d    t          j        | j                  }|j        rt	          |          S d S r   )rf   fz_dom_nextr   r   r_  r  s     r   r  zXml.next  s4    ++> 	99	 	r   c                 d    t          j        | j                  }|j        rt	          |          S d S r   )rf   fz_dom_parentr   r   r_  r  s     r   r   z
Xml.parent  s4    !49--> 	99	 	r   c                 d    t          j        | j                  }|j        rt	          |          S d S r   )rf   fz_dom_previousr   r   r_  r  s     r   previouszXml.previous  s4    #TY//> 	99	 	r   c                 8    t          j        | j                   d S r   )rf   fz_dom_remover   r\   s    r   removez
Xml.remove  s    TY'''''r   c                 B    |sJ t          j        | j        |           d S r   )rf   fz_dom_remove_attributer   r  s     r   r  zXml.remove_attribute  s&    


%ty#66666r   c                 N    t          t          j        | j                            S r   )r_  rf   fz_xml_rootr   r\   s    r   rootzXml.root  s    E%ty11222r   c                    d}t          |t                    r|}nJ|t          k    rd}n<|t          k    rd}n.|t          k    rd}n |t
          k    rd}nt          d|          ||z  }|                     |           | S )z Set text alignment via CSS styleztext-align: %sr  centerrightjustifyzUnrecognised align=)rz   r   TEXT_ALIGN_LEFTTEXT_ALIGN_CENTERTEXT_ALIGN_RIGHTTEXT_ALIGN_JUSTIFYr   r  )r]   r   r:   r   s       r   	set_alignzXml.set_align  s    uc"" 	7AAo% 		7AA'' 	7AA&& 	7AA(( 	7AA5U55666axtr   c                 D    |sJ t          j        | j        ||           d S r   )rf   fz_dom_add_attributer   )r]   r  r   s      r   r  zXml.set_attribute  s(    


"DIsE:::::r   c                 `    d|                      |          z  }|                     |           | S )z"Set background color via CSS stylezbackground-color: %s)r  r  r]   r  r:   s      r   set_bgcolorzXml.set_bgcolor  s/    &)?)??tr   Tc                 H    |rd}nd}d|z  }|                      |           | S )zSet bold on / off via CSS styleboldnormalzfont-weight: %sr  r]   r   r:   s      r   set_boldzXml.set_bold  s9     	CCC 3&%%%r   c                 `    d|                      |          z  }|                     |           | S )zSet text color via CSS stylez	color: %s)r  r  r!  s      r   	set_colorzXml.set_color  s1    dooe444%%%r   c                 :    d| }|                      |           | S )z(Set number of text columns via CSS stylez	columns: r&  )r]   colsr:   s      r   set_columnszXml.set_columns  s(    !4!!%%%r   c                 :    d|z  }|                      |           | S )z"Set font-family name via CSS stylezfont-family: %sr&  )r]   fontr:   s      r   set_fontzXml.set_font  s%     4'%%%r   c                 t    t          |          t          u rd}nd}d| | }|                     |           | S )z Set font size name via CSS styler(   pxzfont-size: )r   r   r  )r]   r   r2  r:   s       r   set_fontsizezXml.set_fontsize  sL    >>S  	BBB+X+r++%%%r   c                     | j         }|                    dd|          rt          d| d          |                     d|           | S )zSet a unique id.Nr  zid 'z' already exists)r  ri   r   r  )r]   uniquer  s      r   set_idz
Xml.set_id	  sX     y99T4(( 	><F<<<===4(((r   c                 H    |rd}nd}d|z  }|                      |           | S )z!Set italic on / off via CSS styleitalicr%  zfont-style: %sr&  r'  s      r   
set_italiczXml.set_italic
	  s9     	CCC#%%%%r   c                 :    d| }|                      |           | S )z>Set inter-line spacing value via CSS style - block-level only.z-mupdf-leading: r  )r]   leadingr:   s      r   set_leadingzXml.set_leading	  s&    +'++tr   c                 :    d| }|                      |           | S )z,Set inter-letter spacing value via CSS stylezletter-spacing: r&  r]   spacingr:   s      r   set_letter_spacingzXml.set_letter_spacing	  s(    +'++%%%r   c                 :    d| }|                      |           | S )z6Set line height name via CSS style - block-level only.zline-height: r;  )r]   
lineheightr:   s      r   set_lineheightzXml.set_lineheight 	  s&    +z++tr   c                 :    d|z  }|                      |           | S )zSet margin values via CSS stylezmargins: %sr&  r'  s      r   set_marginszXml.set_margins&	  s%    s"%%%r   c                 :    d| }|                      |           | S )zSet opacity via CSS stylez	opacity: r&  )r]   r  r:   s      r   r`  zXml.set_opacity,	  s(    $7$$%%%r   c                 4    d}|                      |           | S )z$Insert a page break after this node.zpage-break-after: alwaysr;  r  s     r   set_pagebreak_afterzXml.set_pagebreak_after2	  s    )tr   c                 4    d}|                      |           | S )z%Insert a page break before this node.zpage-break-before: alwaysr;  r  s     r   set_pagebreak_beforezXml.set_pagebreak_before8	  s    *tr   c                    | j         }|                                }||                    |           ||                    |           ||                    |           ||                    |           ||                    |           ||                    |           ||                    |           ||	                    |           |	|
                    |	           |
|                    |
           ||                    |           ||                    |           ||                    |           ||                                 ||                                 ||                    |           ||                     |           ||                     |           g }|                    d          }||                    |           |j        }|r1|                    |                    d                     |j        }|1|                     dd                    |                     |                                 | S )zaSet any or all properties of a node.

        To be used for existing nodes preferrably.
        Nr  r  )r  r  r  r"  r(  r*  r-  r0  r3  set_text_indentr9  r=  rA  rD  rF  rI  rK  set_word_spacingr6  r  r  r6   ru  r  r  r  )r]   r   bgcolorr$  r  columnsr/  r   indentr8  r<  letter_spacingrC  marginspagebreak_afterpagebreak_beforeword_spacingunqidr  r  tempstyles	top_stylery  s                           r   set_propertieszXml.set_properties>	  s   2 y  "" 	"NN5!!! 	&W%%% 	 MM$ 	"NN5!!! 	&W%%% 	 MM$ 	(h''' 	)  ((( 	$OOF### 	&W%%% 	4##N333 	,
+++ 	&W%%% 	'$$&&& 	(%%''' 	0!!,/// 	KK 	 NN3,,W55	 	%MM)$$$  	&MM%33G<<===%E  	& 	7CHHV$4$4555r   c                 :    d| }|                      |           | S )z;Set text indentation name via CSS style - block-level only.ztext-indent: r;  )r]   rQ  r:   s      r   rM  zXml.set_text_indent	  s&    'v''tr   	underlinec                 :    d|z  }|                      |           | S )Nztext-decoration: %sr&  r'  s      r   set_underlinezXml.set_underline	  s%    $s*%%%r   c                 :    d| }|                      |           | S )z*Set inter-word spacing value via CSS stylezword-spacing: r&  r?  s      r   rN  zXml.set_word_spacing	  s(    )))%%%r   c                     | }| j         }|dS |j        r|j        }|n|j        ||j        dk    rdS 	 ||S |j        dv s|j        r|j        }|j        dk    r
|}|j        }n|S 4)z$Find deepest level in stacked spans.Nr  T)r   r  r  body)r  rq  r  rr  r  ru  )r]   r   ry  s      r   r  zXml.span_bottom	  s     	4m 	NE  m 	  	EMV3 	4
	 } 99 U] 
}& )
	r   c                 4    t          j        | j                  S r   )rf   
fz_xml_tagr   r\   s    r   rr  zXml.tagname	  s    +++r   c                 4    t          j        | j                  S r   )rf   r  r   r\   s    r   r:   zXml.text	  s     $),,,r   r   r  r  r   NT)NNNNNNNNNNNNNNNNNN)r]  )Nr`   ra   rb   ra  rd  r^   r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  ri   r  r  ru  r  rs  r  r   r  rq  r  r  r   r  r  r  r  r  r  r"  r(  r*  r-  r0  r3  r6  r9  r=  rA  rD  rF  r`  rI  rK  r[  rM  r_  rN  r  rr  r:   add_varadd_sampadd_kbdr    r   r   r_  r_  \  s.           ? ? ?  ,    	 	 	 	                          
  	 	 	 		 	 	 	  : : :  3 3 3     \B B BE E EC C C  
  
   X7 7 7  9 9 9: : :   % % X% 	 	 X	   X
   X
   X
( ( (7 7 7 3 3 X3  &; ; ;                                  !'J J J JX     
    2 , , X, - - X- GHGGGr   r_  c                   L    e Zd Zd Zd Zd Zed             Zed             ZdS )
Colorspacec                    t          |t          j                  r	|| _        dS |t          k    r*t          j        t          j        j                  | _        dS |t          k    r*t          j        t          j        j                  | _        dS |t          k    r*t          j        t          j        j	                  | _        dS t          j        t          j        j	                  | _        dS )z!Supported are GRAY, RGB and CMYK.N)
rz   rf   FzColorspacer   CS_GRAY
Fixed_GRAYCS_CMYK
Fixed_CMYKCS_RGB	Fixed_RGB)r]   r"  s     r   r^   zColorspace.__init__	  s    ue011 		IDIIIg 	I*5+=+HIIDIIIg 	I*5+=+HIIDIIIf_ 	I*5+=+GHHDIII*5+=+GHHDIIIr   c                 6    d| j                  }d|d| j        S )N)r(   GRAYr(   RGBCMYKzColorspace(CS_z) - )rF  r   r]   r  s     r   r   zColorspace.__repr__	  s#    +DF3+,11dii88r   c                 4    t          j        | j                  S r   )rf   fz_colorspace_namer   r\   s    r   _namezColorspace._name	  s    '	222r   c                 4    t          j        | j                  S )zSize of one pixel.)rf   fz_colorspace_nr   r\   s    r   rF  zColorspace.n	       $TY///r   c                 *    |                                  S )zName of the Colorspace.r|  r\   s    r   r   zColorspace.name	  s     zz||r   N)	r`   ra   rb   r^   r   r|  r  rF  r   r    r   r   rl  rl  	  sz        I I I9 9 93 3 3 0 0 X0   X  r   rl  c                       e Zd Zd ZdS )DeviceWrapperc                    t          |t          j                  r|\  }|| _        d S t          |t          d           r|\  }}t          |          }t          j        |          r-t          j        t          j                    |          | _        d S t          j	        t          j                    ||          | _        d S t          |t          j
                  r|\  }t          j        |          | _        d S t          |t          j        d           r5|\  }}t          j        |          }	t          j        ||	          | _        d S t          d|          )Nz%Unrecognised args for DeviceWrapper: )
args_matchrf   FzDevicer   r  JM_irect_from_pyfz_is_infinite_irectfz_new_draw_devicer9  fz_new_draw_device_with_bboxFzDisplayListfz_new_list_devicer  r  fz_new_stext_devicer   )
r]   r  devicepmr  r   r  tpr  optss
             r   r^   zDeviceWrapper.__init__	  s?   tU^,, 	OGFDIIIvt,, 	OHB#T**D)400 \!4en6F6FKK			!>@P@PRTVZ[[			u233 	OCB0"55DIIIu0$77 	OIB'//D12t<<DIIIMTMMNNNr   Nr_   r    r   r   r  r  	  s(        O O O O Or   r  c                   F    e Zd Zd Zd Zd
dZddZed             Zd	 Z	dS )DisplayListc                 D    t          |           t          urd S d| _        d S NF)r   r  r   r\   s    r   __del__zDisplayList.__del__	  s"    Dzz[(0&&r   c                 H   t          |          dk    rAt          |d         t          j                  r!t          j        |d                   | _        d S t          |          dk    r/t          |d         t          j                  r|d         | _        d S J d|            )Nr   r   zUnrecognised args=)r-  rz   rf   r/  r  r   r  s     r   r^   zDisplayList.__init__	  s    t99> 	.ja%,?? 	.+DG44DIIIYY!^ 	.
47E4G H H 	.QDIII--d-----r   Nr   c                     t          |t                    r|j        }n#t          j        t          j        j                  }t          | j        ||||d           }d|_        |S NT)rz   rl  r   rf   rn  rt  JM_pixmap_from_display_listr   )r]   r  r  r  r  r   s         r   r  zDisplayList.get_pixmap
  s[    j*-- 	J#JJ+E,>,HIIJ)$)VZPTVZ[[
r   r   c                 |    t          j                    }||_        t          j        | j        |          }d|_        |S )z#Make a TextPage from a DisplayList.T)rf   r  r  r  r   r   )r]   r  stext_optionsr   s       r   r  zDisplayList.get_textpage
  s8    ,..#	=99
r   c                 p    t          t          j        | j                            }t	          |          }|S r   )r.  rf   fz_bound_display_listr   r   r]   r   s     r   r   zDisplayList.rect
  s,    e9$)DDEE3ii
r   c                     t          j        | j        |j        t	          |          t          |          t          j                               d S r   )rf   fz_run_display_listr   r  r  r  FzCookie)r]   dwrH  areas       r   runzDisplayList.run
  sL    !		!!$$%%  	 	 	 	 	r   )NNr   N)r   )
r`   ra   rb   r  r^   r  r  r  r   r  r    r   r   r  r  	  s          . . .         X
    r   r  c                      e Zd ZdefdZddZd Zd Zddefd	Z	ddZ
defdZdefdZd Zd Zd Zd Zd Zdej        eef         defdZddZd Zd Zd ZddZd ZdefdZddededed ed!ed"efd#Zd$ Zd% Z d& Z!d' Z"d( Z#dd)Z$d* Z%d+ Z&d, Z'dd0Z(d1 Z)d2 Z*d3 Z+d4 Z,dd5Z-e.d6             Z/dd7Z0dd9Z1d: Z2d; Z3d<d<d=d>ed?eddfd@Z4e.dA             Z5dB Z6dC Z7ddDZ8ddEedFefdGZ9dH Z:ddEefdIZ;dJ Z<	 	 	 ddKedLej=        dMe>dNe>dOe>ddfdPZ?defdQZ@dej        eef         fdRZAdej        eef         deBfdSZCdej        eef         deDfdTZEdeFfdUZG	 	 	 	 ddej        eef         dLeHdMe>dNe>dOe>ddfdVZIddWZJdX ZK	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd\ZLd] ZMdd^ZNdd_ZOd` ZPda ZQdb ZRdc ZSddEeddedeFfdeZTddEeddedeFfdfZUdEedeFfdgZVdh ZWdi ZXdj ZY	 	 	 	 	 	 	 	 ddkZZ	 	 	 	 	 	 	 	 	 ddlZ[e.dm             Z\e.dn             Z]e.do             Z^e.dp             Z_e.dq             Z`e.dr             Zads Zbdt Zcdu Zddv Zedw Zfdx Zgdy Zhdz Zidd{Zjd| Zkd} Zle.d~             Zme.d             Znd ZoddZpd Zqd Zrd Zse.deDfd            ZtddEedFefdZue.d             ZvddZwe.d             Zxd Zyd Zze.d             Z{d Z|d Z}d Z~e.defd            Ze.defd            Zej        j        dk     rej        j        Znej        j        e         ZddedededefdZd ZddZe.d             Zd ZdedefdZddZd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZd Zd Zd ZddZddZddZdeDdefdZdefdZdefdZd ZddZddZddZe.d             Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZe.d             Zd Zd Zd Zd ZddZd Zd ZddZd Zd Zd Zd ZdZ e.d           ZeZeZdS )r   returnc                 ~   t          |          t          u r|| j        k     rdS dS t          |          t          t          fvst          |          dk    rdS |\  }}	 t          |t                    r|dk     s|| j        k    rdS 	 t          |t                    r|dk     s||                     |          k    rdS dS )NTFry   r   )	r   r   
page_countr|   r{   r-  rz   chapter_countchapter_page_count)r]   locchapterpnos       r   __contains__zDocument.__contains__,
  s    99 	T_$ t599UDM) 	SXX] 	5	!'3//	Q;	 d00	
 5	!#s++	7	 $11':::	
 5tr   Nc                    | j         st          d          t          |          t          u r|                     |          S t          |          t
          t          t          fv r|                     |          S t          |          t          urt          d          | j
        }|j        r|j        nd}|j        r|j        n|}|j        r|j        nd}|dk     r||z  }|dk     ||k    rt          d          |dk     r||z  }|dk     ||k    rt          d          |                     t          |||                    S )N	is no PDFzbad argument typer   r   bad page number(s))is_pdfr   r   r   delete_pager{   r|   r  delete_pagesslicer  rR  stopstep)r]   rq   pcrR  r  r  s         r   __delitem__zDocument.__delitem__B
  si   { 	*[)))77c> 	'##A&&&77tUE** 	($$Q'''77% 	20111_7)'qvvR&qvvQai 	RKE ai 	B; 	31222Qh 	BJD Qh 	"9 	31222  udD!9!9:::r   c                     | S r   r    r\   s    r   ra  zDocument.__enter__Y
  rb  r   c                 .    |                                   d S r   closer  s     r   rd  zDocument.__exit__\
      

r   r   rq   c                     t          |t                    r5 fdt          |                    t	                                D             S t          |t
                    sOt          |t                    r,t	          |          dk    rt          d |D                       sJ d|d            | vrt          d| d           	                    |          S )Nc                      g | ]
}|         S r    r    )rp   rI  r]   s     r   rr   z(Document.__getitem__.<locals>.<listcomp>a
  s    BBBDGBBBr   ry   c              3   @   K   | ]}t          |t                    V  d S r   )rz   r   rp   r  s     r   	<genexpr>z'Document.__getitem__.<locals>.<genexpr>b
  s0      RqRqjkS]^_adSeSeRqRqRqRqRqRqr   zInvalid item number: i=rs   page z not in document)
rz   r  r  indicesr-  r   r|   all
IndexError	load_pager]   rq   s   ` r   r  zDocument.__getitem___
  s    a 	CBBBBUAIIc$ii,@,@%ABBBB!S!! 	.jE&:&: 	.s1vv{ 	.sRqRqopRqRqRqOqOq 	. 	.----	. 	. 	.D= 	:8Q888999~~a   r      c                    t           }da 	 d| _        d| _        d| _        d| _        g | _        i | _        i | _        i | _        t          j	                    | _
        t          |t          j                  r|}	|	| _        d| _        	 |a dS |rt!          |          t"          u rn[t%          |d          rt#          |          }n;t%          |d          r|j        }n#t)          dt!          |          d|d	          |t!          |          t*          u r|| _        nt!          |          t.          u rt+          |          | _        nUt!          |          t0          j        u r|                                | _        n t)          d
t!          |          d	          | j        }|s|sd}nd| _        |r| j        
d}
|| _        n	d}
d| _        |
rht8          j                            |          sd| d}t?          |          t8          j                             |          sd| d}tC          |          |
r6t8          j        "                    |          dk    rtG          d|d	          t!          | j                  t*          u r'tI          | j                  dk    rtG          d          |}|}tK          |          }t          j&        |          s|j'        |j(        z
  }|j)        |j*        z
  }|rt          |t*                    sJ |}tV          r)t          j,        |          }t          j-        |          }n4t          j.        t          j/        |          tI          |                    }|}|s|}t          j0        ||          }n|r|sV	 t          j1        |          }n# td          $ r2}tf          dk    rti                       tC          d|d	          |d}~ww xY wt          j5        |          }|r/|j6        r	 tn          dk    rgt          j8        |          }t          j8                    }t          j9        d          }t          j:        |j6        |j;        |j;        |j;                  }nt          j:        |j6        |          }nB# td          $ r5}tf          dk    rti                       tC          d|d|d	          |d}~ww xY wt          j<        |          }n~tn          dk     r6|j=        r.t          j>        |          }t          j?        |j=        |          }n=J t          t                    t          j                    }t          j<        |          }|dk    r|dk    rt          jB        ||||           n+t          jC        |          rt          jB        |ddd           |}|| _        d| _D        | jD        rt          F                                | _G        | jH        rd| _        n| I                                 |r'|J                                K                    d          s|rgd|J                                v rQ	 | L                                }n;# td          $ r.}tf          dk    rti                       tC          d          |d}~ww xY wt          rNt          | j        t          j                  | _        | j        rt          jO        | _P        nt          jQ        | _P        |a dS # |a w xY w)aV  Creates a document. Use 'open' as a synonym.

        Notes:
            Basic usages:
            open() - new PDF document
            open(filename) - string or pathlib.Path, must have supported
                    file extension.
            open(type, buffer) - type: valid extension, buffer: bytes object.
            open(stream=buffer, filetype=type) - keyword version of previous.
            open(filename, fileype=type) - filename with unrecognized extension.
            rect, width, height, fontsize: layout reflowable document
            on open (e.g. EPUB). Ignored if n/a.
        r   FNTabsoluter   zbad filename: type(filename)=z
 filename=rs   zbad stream: type(stream)=r!  r(   zno such file: 'r   z' is no filez!Cannot open empty file: filename=zCannot open empty stream.r   zFailed to open file r   rx   z	 as type i  iX  r  svgcannot open broken document)RJM_mupdf_show_errorsr   is_encryptedmetadata	FontInfos	Graftmaps
ShownPagesInsertedImagesr  WeakValueDictionary
_page_refsrz   rf   r   r   this_is_pdfr   r   r  r   rv  r   r  r3  r4  r5  rM  r|  r   r1   existsFileNotFoundErrorrH  FileDataErrorgetsizeEmptyFileErrorr-  r  rl  x1x0y1y0re   rh  r-  fz_open_memorypython_buffer_datafz_open_document_with_streamfz_open_documentr   r   rF   ll_fz_recognize_documentr   r~   FzStream	FzArchivell_fz_document_open_fn_callr   r   open_with_streamfz_open_file$fz_document_open_with_stream_fn_callr   MSG_BAD_FILETYPEfz_layout_documentfz_is_document_reflowabler   r   gen_id	_graft_id
needs_passinit_docr  r  convert_to_pdfr   r   page_count_pdfpage_count2page_count_fz)r]   r3   r  filetyper   r  r  r   JM_mupdf_show_errors_oldpdf_document	from_filemsgr   r  r   ry  r   rT  magicr   r'  handleraccelarchiver!  r   r  s                              r   r^   zDocument.__init__h
  s   $ $8  j	< %DN %D %D#DM!DN!DN!DO#%D&:<<DO(E$566 '(	#' x $<   m  QtH~~4 Q:.. Qx==6** Q#= Oh O O8 O O OPPP #<<5( E"(DKK&\\Y. E"'--DKK&\\RZ/ E"(//"3"3DKK#$C4<<$C$C$CDDD  %H %$H"  DK   	%

!	
 -w~~h// -7H777C+C00011 -4h444C',,, NRW__X66!; N$%L%L%L%LMMMDK  E) Cc$+.>.>!.C C$%ABBBAA%%A,Q//  D14KD14K A0!&%00000  	U#BAFFG /99DD !/0H0K0KSQRVVTTD  %$E
 8EE )0# %@]"'"8"B"BCC( ] ] ]3a7LN<L<L<L"/0Tx0T0T0T"U"U[\\] #("@"J"J" @&| -!z':g'E %i161I1I050@0@27/$2G2G.3.O07060A050@070B	/2 /2 /4.OQXQ]_g.h.h'0 !z !z !z';a'?$TNDTDTDT*78qx8q8qdl8q8q8q*r*rxy$y!z ',&6&<&<#6#@ !-'.'? %z/4/A8/L/L.3.XZaZrtx.y.y$,H",.>"?"??+--C*3//C1u <Q <(aH====055 <(c3;;;DDI  DL| R!&? $(,D%%MMOOO  R 0 0 9 9% @ @ RH RQVZbZhZhZjZjQj RR //11$ R R R/!3H8H8H8H+,IJJPQQR  ;#-ty%:K#L#L # ;',';D$$',':D$#;   #; ;;;;s   A:\ 
L\ N0 .\ 0
O,:-O''O,,!\ BR \ 
S%0SSE>\ Y. -\ .
Z&8)Z!!Z&&A\ \c                     | j         S r   )r  r\   s    r   __len__zDocument.__len__(  s
    r   c                     | j         rdnd}| j        &| j        dk    r|d| j        z  z   S |d| j        dz   S |d| j        | j        fz  z   S )Nzclosed r(   zDocument(<new PDF, doc# %i>)z
Document('z')z!Document('%s', <memory, doc# %i>))r   r  r   r  r]   rH  s     r   r   zDocument.__repr__+  sn    /IIR; 	7yB K9DNJJJ149996666$)T^9TTTTr   c           	         | j         s| j        rt          d          t          |           }|sdS t	          j        t	          j        |          t          d          t          d          t          d          t          d                    }|j        rt	          j	        |          st          d          t	          j        |          }t          ||          }t	          j        |||           dS )zAdd new form font.document closed or encryptedNRootAcroFormDRFontzPDF has no form fonts yet)r   r  r   r   rf   r   pdf_trailerr   r   rA  r   pdf_new_nameJM_pdf_obj_from_strr  )r]   r   r/  r!  fontsrx  rM   s          r   _addFormFontzDocument._addFormFont3  s    > 	=T. 	=;<<<t$$ 	F#!3''  $$     	=u'8%'@'@ 	= ;<<<%%d++E1a(((((r   c                 
   | j         s| j        rt          d          g }t          |           }|s|S t	          j        t	          j        |          t          d                    }t	          j        |t          d                    }|j        s|S t	          j        |t          d                    }t          ||          }t          |          }t	          j        |          }t	          j        ||           t	          j        |t          d                     t          |          D ]*}t          ||          \  }	}
t	          j        ||
           +|                    |           |}|                                  |S )zDelete the TOC.r  r	  OutlinesFirst)r   r  r   r   rf   r   r  r   r   JM_outline_xrefsr-  r   pdf_delete_objectr  r  JM_INT_ITEMr6   r  )r]   xrefsr!  r  olrootfirst
xref_countolroot_xrefrq   r  r   r   s               r   _delToCzDocument._delToCG  sn   > 	=T. 	=;<<<t$$ 	L!%"3C"8"8(6:J:JKK#D(:*>*>??  	L"68G+<+<== ..ZZ
&v..[1114*!5!5666z"" 	/ 	/A!%++GAt#C....[!!!
r   c                     t          |           }t          j        ||           |j        j        rt          j        |j                   d S d S r   )r   rf   pdf_delete_pager   rev_page_mapll_pdf_drop_page_tree)r]   r  r!  s      r   _delete_pagezDocument._delete_pageg  sR    t$$sC(((>& 	9'88888	9 	9r   c                     t          |           }t          |           t          |dt          j        |          dz
            st          t                    t          j        ||           dS )zDelete object.r   N)r   
ASSERT_PDFr]  rf   rD  r   rE  r  r]   r   r!  s      r   _deleteObjectzDocument._deleteObjectm  se    t$$3a!3C!8!8!:;; 	,l+++T*****r   c           	         t          |           }t          j        t          j        |          t	          d          t	          d          t	          d          t	          d                    }t          j        |d|z  dz             }t          j        |t	          d          t	          d                    }t          j        |          }t          |          }|S )Nr	  NamesEmbeddedFilesry   r   rn  ro  )r   rf   r   r  r   rd  r   r   )r]   idxr!  namesentryfilespecr  conts           r   _embeddedFileGetzDocument._embeddedFileGetu  s    t$$#!#&&  !!))!!  #E1S5733&uhtnnhsmmLL#H--$$r   r   c                     |                                  }dt          |          z  }||v r|                    |          }n0|t          t	          |                    v r|}nt          |          |S )Nz '%s' not in EmbeddedFiles array.)embfile_namesr   indexr  r-  r   )r]   r   	filenamesr  r*  s        r   _embeddedFileIndexzDocument._embeddedFileIndex  sv    &&((	03t99<9 	"//$''CCU3y>>*** 	"CCS//!
r   c           	         t          |           }t          |           t          |          }|j        st	          t
                    t          j        t          j        |          t          d          t          d          t          d          t          d                    }t          j
        |          st          j        t          j        |          t          d                    }	t          j        |d          }t          j        |	|t          d          t          d          t          d                     t          |||||d          }
t          j        t          j        |
t          d          t          d                              }t          j        |t          j        |                     t          j        ||
           |S )Nr	  r(  r)  r   r   rn  ro  )r   r$  r   r   rv  r   rf   r   r  r   pdf_is_arrayr   r  r  JM_embed_filer   pdf_array_pushr?  )r]   r   r   r3   r  r  r!  rT  r+  r  	fileentryr   s               r   _embfile_addzDocument._embfile_add  s   t$$3!'** 	-^,,,#!#&&  !!))!!  !%(( 		%e&7&<&<hv>N>NOOD'Q//EW%%_--W%%   "#tXy$JJ	#Ix~~x}}MM  	UE$=d$C$CDDDUI...r   c           	      :   t          |           }t          j        t          j        |          t	          d          t	          d          t	          d          t	          d                    }t          j        ||dz              t          j        ||           d S )Nr	  r(  r)  r   )r   rf   r   r  r   re  )r]   r*  r!  r+  s       r   _embfile_delzDocument._embfile_del  s    t$$#!#&&  !!))!!  	ucAg...uc*****r   c           	         t          |           }d}d}t          j        |          }t          j        |t	          d          t	          d          t	          d          t	          d                    }t          j        |d|z  dz             }t          j        |t	          d                    }	|	j        rt          j        |	          }||d<   t          j	        t          j        |t	          d	                              }
t          |
          |t          <   t          j	        t          j        |t	          d
                              }
t          |
          |t          <   t          j	        t          j        |t	          d                              }
t          |
          |t          <   d}d}t          j        |t	          d          t	          d	                    }t          j        |          }t          j        |t	          d                    }|j        rt          j        |          }t          j        |t	          d                    }|j        rt          j        |          }nKt          j        |t	          d          t	          d                    }|j        rt          j        |          }||t           <   ||t"          <   |S )Nr   r	  r(  r)  ry   r   CI
collectionro  rq  rr  r   rn  rs  r  rt  ru  )r   rf   r  r   r   rd  r   r   r   r   rz  r{  dictkey_ufilenamer   r|  r   r~  r}  )r]   r*  infodictr!  r   ci_xreftrailerr+  ri  cir   len_r  r9  s                 r   _embfile_infozDocument._embfile_info  s^   t$$#C((#  !!))!!  quQw//8D>>22= 	+&r**G!('(:1hsmm(L(LMM%8%>%>!"'(:1htnn(M(MNN&9$&?&?"#'(:1hv>N>N(O(OPP!24!8!8'8D>>8C==II		**y(8*<*<==< 	'#A&&Dy(4..99< 	)!!$$BB#Ix/A/A8FCSCSTTA| )%a((!##' r   c           	         t          |           }t          |           t          j        t          j        |          t          d          t          d          t          d          t          d                    }t          j        |          rqt          j        |          }t          d|d          D ]M}t          t          j
        t          j        ||                              }|                    |           LdS dS )z Get list of embedded file names.r	  r(  r)  r   ry   N)r   r$  rf   r   r  r   r6  rc  r  rz  r   rd  r6   )r]   rN  r!  r+  rF  rq   r   s          r   _embfile_nameszDocument._embfile_names  s    t$$3#!#&&  !!))!!  e$$ 	%#E**A1a^^ % %)0!/q99  
 $$$$	% 	%% %r   c           	      `   t          |           }d}t          j        t          j        |          t	          d          t	          d          t	          d          t	          d                    }t          j        |d|z  dz             }	t          j        |	t	          d          t	          d                    }
|
j        st          d	t                     t          |          }|r"|j        r|j        st          t                    |j        r|r|j        rt          ||
|d           t          j        |          \  }}t          j        |          }t          j        |
t	          d
          |           t          j        |
|t	          d          t	          d                     t          j        |
          }|r#t          j        |	t	          d          |           |r#t          j        |	t	          d          |           |r#t          j        |	t	          d          |           |S )Nr   r	  r(  r)  ry   r   rn  ro  r  r  rt  ru  rq  rr  )r   rf   r   r  r   rd  r   rx  ry  r   rv  r   r   r  r  r  r  r   r=  )r]   r*  r   r3   r  r  r!  r   r+  r,  r-  r   r-  r  r  s                  r   _embfile_updzDocument._embfile_upd  s   t$$#!#&&  !!))!!  #E1S5733&uhtnnhsmmLL" 	E-/CDDD )) 	-w) 	-#. 	-^,,,> 	Sg 	S'*< 	SS(C333,S11FC!#&&Ax$;;;!Xh-?-?&AQAQRRR)) 	K*5(3--JJJ 	M*5(4..)LLL 	J*5(62B2BDIIIr   c           	          | j         rt          d          t          rt          j        | j        |          S t          |           }d}d}d}d}t          j        t          j	        |          t          d                    }|j        sdS t          j        |t          d                    }|j        sdS t          j        |t          d	                    }	|	j        sdS g }
t          |	|
          }
t          |
          }t          |          }|sdS ||k    rt          d
          t          |          D ]}t!          |
|                   }||         }|d         }t#          |t$                    st          d          |
|         |t&          <   t          j        ||          }t          j        t          j        |t          d                              }|dk    rd||<   n|dk    rd||<   n|dk    r
d||<   d||<   t          j        t          j        |t          d                              }|dk     rd||<   n|dk    rd||<   t          j        |t          d                    }t          j        |          rt          j        |          dk    r~t          j        t          j        |d                    t          j        t          j        |d                    t          j        t          j        |d                    f}||t4          <   d}t          j        |t          d                    }|j        rt          j        |          s0t          j        |t          d          t          d                    }t          j        |          r?t          j        |          dk    r't          j        t          j        |d                    }t9          |          ||<   ||d<   |||<   dS )z4Add color info to all items of an extended TOC list.r   zoomr$  r8  collapser	  Nr  r  z$internal error finding outline xrefsr   zneed non-simple TOC formatro  r   Try   Countr   Fr  DestADr
   r  )r   r   r   r   Document_extend_toc_itemsr   r   rf   r   r  r   r   r  r-  r  r  r   rz   r   r   pdf_load_objectr   r6  rc  r  rd  dictkey_colorr   r+  )r]   rt  r!  rL  r$  r8  rM  r  r  r  r  rF  rH  rq   r   r   itemdictbmr  countr&  r  zr   s                           r   _extend_toc_itemszDocument._extend_toc_items#  s   > 	0./// 	F2DIuEEEt$$!%"3C"8"8(6:J:JKK 	F#D(:*>*>??  	F"68G+<+<== 	F ..JJJJ 	F6 	FDEEE q %	 %	AuQx==D8DAwHh-- @ ">???%*1XH\"&sD11B$e&8Xc]]&K&KLLEz &#'  ! &!%! &#' !%$e&8Xg=N=N&O&OPPEqy +%)"" +%*"$R#77C!#&& 05+>s+C+Cq+H 0)%*=c1*E*EFF)%*=c1*E*EFF)%*=c1*E*EFF
 +0'A$R&)9)9::C> L);C)@)@ L)"hsmmXc]]KK!#&& C5+>s+C+Cq+H C%e&9#q&A&ABB"1XXHTNDGE!HHK%	 %	r   r   c                 J    t          |          }|| j        v r
| j        |= dS dS )z&Remove a page from document page dict.N)r  r  )r]   r   pids      r   _forget_pagezDocument._forget_pagei  s6    hh$/! 	%$$$	% 	%r   r   bfnameextorderinglimitr*  c                    t          |           }|}|dk     rd}t          |          d|f |dk    r1t          j        |          \  }	}
}t          j        d |	|
|d          }nrt          j        |          \  }	}
|	rt          j        ||	|
dd          }n@t          ||          }|j        st          d|z            t          j	        d ||d          }g }t          |          D ]j}t          j        ||          }t          j        ||d          }|dk    r|}|dk    r|                    ||f           S|                    |df           k|S )N   zpdf=r   z font at xref %d is not supportedr[  )r   r$  rf   fz_lookup_cjk_fontfz_new_font_from_memoryfz_lookup_base14_fontJM_get_fontbufferr   r   fz_new_font_from_bufferr  fz_encode_characterfz_advance_glyphr6   )r]   r   r]  r^  r_  r`  r*  r!  mylimitrT  r  r2  r/  r  wlistrq   glyphadvs                     r   _get_char_widthszDocument._get_char_widthsp  s   t$$S= 	G3C""q= 	H % 8 B BD$0tT5!LLDD4V<<JD$ H4VT4ANN'T22~ O#$F$MNNN4T3QGGw 	, 	,A-dA66E(ua88C1} qy ,ucl++++ucl++++r   c           	         t          |           }t          |           g }t          j        d          }t          j        t          j        |          t          d          |          }|j        s|S t          j        t          j	        |t          d                              }|j        rt          ||           |S t          j        t          j        |t          d          t          d                              }|j        rt          ||           |S t          j        t          j	        |t          d                              }|j        rt          j        |          s|S t          j        |          }t          |          D ]Y}t          j        t          j	        t          j        ||                    t          d                    }t          ||           Z|S )N
PageLabelsr	  NumsKids)r   r$  rf   r  r   r  r   r   pdf_resolve_indirectr   JM_get_page_labelsr6  rc  r  rd  )	r]   r!  rh   
pagelabelsr   numskidsrF  rq   s	            r   _get_page_labelszDocument._get_page_labels  s   t$$3'55
!5#4S#9#98F;K;KZXX~ 	I)5+=sHVDTDT+U+UVV? 	r4(((I)5+>sHVDTDTV^_eVfVf+g+ghh? 	r4(((I)5+=sHVDTDT+U+UVV 	e&8&>&> 	I%%q 	) 	)A-&(;D!(D(DEEV$$ D r4((((	r   c                     	 t          j        | j        |          S # t          $ r t          dk    rt                       Y dS w xY w)zGet metadata.ry   r(   )rf   fz_lookup_metadata2r   r   r   rF   r  s     r   _getMetadatazDocument._getMetadata  sT    	,di=== 	 	 	#a'<N,<,<,<22	s    #AAc                    | j         s| j        rt          d          t          |           }t	          |           t          j        t          j        |          t          d                    }t          j        |t          d                    }|j	        st          j
        |d          }t          j        |t          d          t          d                     t          j        ||          }t          j        |t          d          |           t          j        |t          d                    }t          j        |          S )z/Get xref of Outline Root, create it if missing.r  r	  r  r  Type)r   r  r   r   r$  rf   r   r  r   r   r  r  pdf_add_objectr   )r]   r!  r  r  ind_objs        r   _getOLRootNumberzDocument._getOLRootNumber  s   > 	=T. 	=;<<<t$$3!5#4c#:#:HV<L<LMM#T8J+?+?@@  	E'a00F(8(8(::N:NOOO*C88Ghz&:&:GDDD'x
/C/CDDF(((r   c                    t          |           }|sdS g }t          j        t          j        |          t	          d                    }|j        rxt          j        |          }t          |          D ]T}t          j        ||          }t          j	        |          }t          j        |          }|                    |           U|S )zGet PDF file id.NID)r   rf   r   r  r   r   rc  r  rd  r   binasciihexlifyr6   )	r]   r!  idlistidentityrF  rq   ri  r:   hex_s	            r   _getPDFfileidzDocument._getPDFfileid  s    t$$ 	F%e&7&<&<htnnMM 	$#H--A1XX $ $'!44/22'--d####r   c                    | j         s| j        rt          d          | j        }t	          |           }t          |t          j                  rt          j        |          nt          j	        |          }|}|dk     r||z  }|dk     ||k    rt          t                    t          j        ||          }t          j        |t          j                  }g }	g }
|j        rt          |||	|d|
           |	S )z,List fonts, images, XObjects used on a page.r  r   )r   r  r   r   r   rz   rf   r   pdf_count_pagesfz_count_pagesMSG_BAD_PAGENOpdf_lookup_page_objpdf_dict_get_inheritablePDF_ENUM_NAME_Resourcesr   JM_scan_resources)r]   r  whatr   r!  	pageCountrF  pagerefrsrclistetracers              r   _getPageInfozDocument._getPageInfo  s   > 	=T. 	=;<<<it$$2<S%BS2T2TsE)#...Z_ZnorZsZs	!e 	NA !e 		> 	.n---+C33-gu7TUU? 	Ac4a@@@r   c                     t          |           }t          |           |s|st          t                    t	          |d||dddddd
  
        }|S )z;
        Utility: insert font from file or binary.
        Nr   r   )r   r$  r   MSG_FILE_OR_BUFFERJM_insert_font)r]   fontfile
fontbufferr!  r   s        r   _insert_fontzDocument._insert_font  s^     t$$3 	2
 	20111sD(J1aArRRr   c                     | j         }t          |t          j                  sJ 	 t          j        |          }n*# t
          $ r t          dk    rt                       Y dS w xY wt          |          S )zLoad first outline.r   N)	r   rz   rf   r   fz_load_outliner   r   rF   Outline)r]   r   r  s      r   _loadOutlinezDocument._loadOutline  s    i3 011111	&,,BB 	 	 	#a'<N,<,<,<FF	 ||s   : #A! A!c                 B    | j         rt          d          J d            )z)Make an array page number -> page object.r   r   z_make_page_map() is no-op)r   r   r\   s    r   _make_page_mapzDocument._make_page_map  s*    > 	0.///.....r   c                    t          |           }d}t          |           t          ||          \  }}}	t          j        |t          d                    }
t          ||          \  }}}t          j        |t          d                    }|r|}n|dz   }t          j        |
|          }|s)|dk    r#t          j        |t          d          |           t          j        |||           |dk    r|}|j	        rqt          j
        |t          d                    }t          j        |t          d          |dz              t          j        |t          d                    }|j	        q|st          j        |
|	           |}|j	        rqt          j
        |t          d                    }t          j        |t          d          |dz
             t          j        |t          d                    }|j	        qn|r{|}|j	        rqt          j
        |t          d                    }t          j        |t          d          |dz              t          j        |t          d                    }|j	        qn4|	|k     rt          j        |
|	           nt          j        |
|	dz              |j	        j        rt          j        |j	                   |                                  dS )z"Move or copy a PDF page reference.r   rr  r   r`  rN  N)r   r$  pdf_lookup_page_locrf   r   r   rE  r  pdf_array_insertr   pdf_dict_get_intr  re  r   r!  _reset_page_refs)r]   r  nbbeforecopyr!  samepage1parent1i1kids1page2parent2i2kids2posr   rW  s                     r   _move_copy_pagezDocument._move_copy_page
  s   t$$3 1#s;;w"GXf-=-=>>0#r::w"GXf-=-=>> 	CCq&C ..  	D	 	Dx'9'97CCCuc22219 	;F# I.8I8IJJ&0A0A519MMM+VXh5G5GHH # I  M&r222 ' M!2FHW<M<MNNE*FHW4E4EuqyQQQ"/(9K9KLLF ' M
  
; ' M!2FHW<M<MNNE*FHW4E4EuqyQQQ"/(9K9KLLF ' M
 8 ;*E26666*E26:::>& 	9'888r   r   S  J  c                 T   | j         s| j        rt          d          t          rt	          j        | j        |||           nt          |           }t          |t          j
                  sJ t          j        t          j        j                  }||_        ||_        t          j                    }|dk     rt          t                     t          j        |d          }t          j        ||d||          }t          j        |||           |                                  | |         S )zMake a new PDF page.r  r   r   r   )r   r  r   r   r   _newPager   r   rz   rf   r   r/  
Fixed_UNITr  r  FzBufferr  pdf_add_new_dictpdf_add_pagepdf_insert_pager  )	r]   r  r  r  r!  mediaboxcontentsr(  page_objs	            r   r  zDocument._newPageC  s   > 	=T. 	=;<<< 	7NDIsE6::::"4((Cc5#455555|EL$;<<HHK HK~''HRx 2 .111 .sA66I)3!YQQH!3X666 	Cyr   c                 D    t          |           }t          ||           d S r   )r   _remove_dest_range)r]   numbersr!  s      r   _remove_links_tozDocument._remove_links_to\  s%    t$$3(((((r   c                    t          |           }t          j        ||d          }t          j        |t	          d                     t          j        |t	          d                     t          j        |d          }t          d          D ]}t          j        |d           t          j        |t	          d          |           d S )Nr   rO  rP  r   皙?r  )	r   rf   rF  r  r   r  r  r  r  )r]   r   r!  r   r  rq   s         r   _remove_toc_itemzDocument._remove_toc_item`  s    t$$%c433D(6"2"2333D(3--000#S!,,q 	3 	3A%uc2222D(3--77777r   c                     t          | dd          rdS d | j                                        D             }|D ]}|r|                                 d}| j                                         dS )z,Invalidate all pages in document dictionary.r   TNc                     g | ]}|S r    r    rp   rj  s     r   rr   z-Document._reset_page_refs.<locals>.<listcomp>o  s    555q555r   )r   r  r   r   clear)r]   pagesr   s      r   r  zDocument._reset_page_refsk  s    4d++ 	F55DO2244555 	 	D r   c                    t          |           }t          |           t          j        d          }t          j        t          j        |          t          d                    }t          j        ||           t          j        |t          j	        |d          |t          d                     | 
                                }|                     |d          }|                    dd|z            }|                     ||           d S )	Nrp  r	  r   rq  T
compressedz/Nums[]z	/Nums[%s])r   r$  rf   r  r   r  r   r  r  r  pdf_catalogxref_objectr  update_object)r]   labelsr!  ru  r  r   r:   s          r   _set_page_labelszDocument._set_page_labelsv  s    t$$3'55
!%"3C"8"8(6:J:JKK4,,,D%"5c1"="=z8TZK[K[\\\!!66||I{V';<<4&&&&&r   c                    t          |           }t          j        ||d          }|r#t          j        |t	          d          |           |rUt          j        |t	          d                     t          ||          }	t          j        |t	          d          |	           t          j        |t	          d          |           |rht          j	        |d          }
t          d          D ]}||         }t          j        |
|            t          j        |t	          d          |
           n$|"t          j        |t	          d                     |t          j        |t	          d	                    j        rbt          j        |t	          d	                    }|dk     r|d
u s
|dk    r2|du r0|dz  }t          j        |t	          d	          |           dS dS dS dS dS )zB
        "update" bookmark by letting it point to nowhere
        r   TitlerO  rP  ro  r   r  NrN  FTr   )r   rf   rF  r=  r   r  r  r  r  r  r  r  r   r   r  )r]   r   actionr6  r  rM  r  r!  r   r   ry  rq   r  s                r   _update_toc_itemzDocument._update_toc_item  s    t$$%sD!44 	L*D(72C2CUKKK 	:hv&6&6777%sF33ChsmmS999hsmmU;;; 	5#S!,,A1XX 1 1!H)1a0000hsmmQ7777 	5hsmm444 	H!4'):):;;F H*D(72C2CDDE Hh%/ HQU Hx4?O HRA*D(72C2CQGGGGG	H 	HH HH H H Hr   c           	         t          |           }|sdS t          j        t          j        |          t	          d          t	          d          t	          d          t	          d                    }t                      }|j        rt          j        |          rot          j        |          }t          |          D ]K}t          j
        ||          }|                    t          t          j        |                               L|S )z&Get list of field font resource names.Nr	  r
  r  r  )r   rf   r   r  r   r{   r   rA  rB  r  rD  r6   r   r@  )r]   r!  r  r  rF  rq   r  s          r   	FormFontszDocument.FormFonts  s     t$$ 	F#!#&&  $$     	F 1% 8 8 	F"5))A1XX F F*5!44.u/@/C/CDDEEEEr   c                     t          |           }t          |           t          ||||           t          j        |j                   dS )zAdd a new OC layer.N)r   r$  JM_add_layer_configrf   ll_pdf_read_ocgr   )r]   r   creatoronr!  s        r   	add_layerzDocument.add_layer  sG    t$$3S$444s~.....r   r   c                 L   d}t          |           }t          |           t          j        |d          }t          j        |t          d          t          d                     t          j        |t          d          |           t          j        |t          d          d          }	|s#t          j        |	t          d                     n^t          |t                    s"J d	t          |          d
t                      t          j        |	t          j        |                     t          j        |t          d          d          }
t          j        d          }t          j        |
|d          }t          j        |t          d          d           |r$t          j        |t          d          |           n#t          j        |t          d          d           t          j        ||          }t!          |          }t          j        |t          d                    }t          j        ||           |dk    r{t          j        |t          d                    }t          j        |          st'          t(                    t          j        ||          }|j        st'          t(                    n"t          j        |t          d                    }t          j        |t          d                    }|j        s#t          j        |t          d          d          }t          j        ||           |rMt          j        |t          d                    }|j        s#t          j        |t          d          d          }nLt          j        |t          d                    }|j        s#t          j        |t          d          d          }t          j        ||           t          j        |j                   t          j        |          }|S )zAdd new optional content group.r   r   r}  OCGr  Intentry   Viewz)fixme: intent is not a str. type(intent)= type=UsageCreatorInfoCreatorPyMuPDFrC  ArtworkOCGsr   ConfigsrQ  Orderr   ONOFF)r   r$  rf   r  r  r   r=  pdf_dict_put_arrayr8  rz   r   r   r  r  r  r~  JM_ensure_ocpropertiesr   r6  r   MSG_BAD_OC_CONFIGrd  r   r  r   )r]   r   configr  intentusager   r!  ocgintentsuse_forci_namecre_infoindocgocpr   cfgs                    r   add_ocgzDocument.add_ocg  s   t$$3 $S!,,3 0 0(5//BBB&sHV,<,<dCCC*30B0BAFF 	F (6*:*:;;;;FC(( 	FLLT&\\LLTLLLLL  %*<V*D*DEEE)#x/@/@!DD$]33*7GQ??&x)1D1DiPPP 	N#Hhy.A.A5IIII#Hhy.A.A9MMM%c3// %S)) hv&6&677S&)))B; 	9$S(9*=*=>>C%c** 5 "3444%c622C> 5 "34445 $S(3--88C hw&7&788~ 	F*30A0A1EECS&))) 	G$S(4..99C> G.sHTNNAFF#C%99C> G-c8E??AFFS&))) 	cn---''r   c                     | j         rt          d          t          j        | j        |          }|r)d| _        d| _        |                                  d| _        |S )zDecrypt document.r   FT)r   r   rf   fz_authenticate_passwordr   r  r  r   )r]   passwordr   s      r   authenticatezDocument.authenticate  s`    > 	0.///,TYAA 	  %D %DMMOOODL
r   c                 P    t          |           }|sdS t          j        |          S )z-Check whether incremental saves are possible.F)r   rf   pdf_can_be_saved_incrementallyr]   r!  s     r   can_save_incrementallyzDocument.can_save_incrementally  s-    t$$ 	53C888r   T)rg  widgetsrg  r	  c                    t          |           }|st          d          t          j        |t	          |          t	          |                     dS )a  Convert annotations or fields to permanent content.

        Notes:
            Converts annotations or widgets to permanent page content, like
            text and vector graphics, as appropriate.
            After execution, pages will still look the same, but no longer
            have annotations, respectively no fields.
            If widgets are selected the PDF will no longer be a Form PDF.

        Args:
            annots: convert annotations
            widgets: convert form fields

        	not a PDFN)r   r   rf   pdf_bake_documentr   )r]   rg  r	  r!  s       r   bakezDocument.bake  sN     t$$ 	*[)))S[[#g,,?????r   c                 `    | j         rt          d          t          j        | j                  S )zNumber of chapters.r   )r   r   rf   fz_count_chaptersr   r\   s    r   r  zDocument.chapter_count)  s0     > 	0.///&	222r   c                     | j         rt          d          t          j        | j                  }|dk     s||k    rt          d          t          j        | j        |          }|S )zPage count of chapter.r   r   zbad chapter number)r   r   rf   r  r   fz_count_chapter_pages)r]   r  chaptersr  s       r   r  zDocument.chapter_page_count0  sm    > 	0.///*DI66Q; 	4'X- 	42333,diAAr   c                     t          | dd          rt          d          t          | d          r| j        rd| _        |                                  d| _        i | _        d| _        dS )zClose document.r   Tr   _outlineN)r   r   r  r  r  r   r  r   r\   s    r   r  zDocument.close:  sv    4d++ 	0.///4$$ 	! 	! DM ! 			r   c                    | j         s| j        rt          d          | j        }|}|}t	          j        |          }|dk     rd}||dz
  k    r|dz
  }|dk     r|dz
  }||dz
  k    r|dz
  }t          t                    }t          ||||          }	t          t                    }
t          ||
          D ]}t          t          |                     |	S )z[Convert document to a PDF, selecting page range and optional rotation. Output bytes object.r  r   r   )r   r  r   r   rf   r  r-  JM_mupdf_warnings_storeJM_convert_to_pdfr  rB   )r]   	from_pageto_pager   fz_docrL  r  srcCountlen0r   len1rq   s               r   r  zDocument.convert_to_pdfL  s   > 	=T. 	=;<<<'//6 	B1 	AB6 	AB1 	AB*++B77*++tT"" 	5 	5A.q134444
r   r  toc                    | j         rt          d          t          |           }|t          |          vs|t          d|          vrt          d          d}d}|dk    r|dz
  }d}|                     ||||          S )zCopy a page within a PDF document.

        This will only create another reference of the same page object.
        Args:
            pno: source page number
            to: put before this page, '-1' means after last page.
        r   r   r  r   r   r   r   r-  r  r  r]   r  r  r  r  r  s         r   	copy_pagezDocument.copy_pagec  s     > 	0.///YY
5,,,	3U2z222	3 12228 	aBF##CVT:::r   c                    | j         s| j        rt          d          t          |           }t	          j        t	          j        |          t          d                    }|j        r$t	          j	        |t          d                     dS dS )zDelete XML metadata.r  r	  MetadataN)
r   r  r   r   rf   r   r  r   r   r  )r]   r!  r  s      r   del_xml_metadatazDocument.del_xml_metadata|  s    > 	=T. 	=;<<<t$$!5#4c#:#:HV<L<LMM? 	<hz&:&:;;;;;	< 	<r   c                    | j         st          d          | j        rt          d          | j        }|dk     r||z  }|dk     ||k    rt          d          |                                 }|                                 }t          |          D ]/\  }}|d         |dz   k    r|                     ||                    0|                     t          |f                     | 
                    |           |                                  dS )z% Delete one page from a PDF.
        r  r   r   r  ry   r   N)r  r   r   r  get_tocget_outline_xrefsr  r  r  	frozensetr"  r  )r]   r  r  tocol_xrefsrq   r   s          r   r  zDocument.delete_page  s/    { 	*[)))> 	0.///_
Ag 	:C Ag 	 * 	31222 llnn))++ ~~ 	3 	3GAtAw#'! 3%%hqk222i//000#r   c                 b   | j         st          d          | j        rt          d          | j        }dx}}|r|rt          d          |                    dd          }|                    dd          }|dk     r||z  }|dk     |dk     r||z  }|dk     ||cxk    r|k     sn t          d          t          t          ||d	z                       }nt          |          d
k    s|g k    rt          d          t          |          d
k    r|\  }}t          |          t          u rt          |          t          u st          d          ||k    r||}}||cxk    r|k     sn t          d          t          t          ||d	z                       }nO|d         }t          |          t          t          t          t
          fvrt          d          t          |          }t          t          t          t          |                              }|g k    rt          d           dS |                                 |d         dk     s|d         |k    rt          d          t          |          }|                                 }	t#          |                                           D ]-\  }
}|	|
         d
         d	z
  |v r|                     |           .|                     |           t+          |          D ]}
|                     |
           |                                  dS )a	  Delete pages from a PDF.

        Args:
            Either keywords 'from_page'/'to_page', or two integers to
            specify the first/last page to delete.
            Or a list/tuple/range object, which can contain arbitrary
            page numbers.
        r  r   r   z*cannot mix keyword and positional argumentr  r  r   r  r   ry   z need 1 or 2 positional argumentszboth arguments must be intz$need int or sequence if one argumentznothing to deleteN)r  r   r   r  r   r|   r  r-  r   r   r{   r  setrB   sortr)  r'  r  r(  r  r  reversedr"  r  )r]   r  kwr  r  r   r  r   frozen_numbersr*  rq   r   s               r   r  zDocument.delete_pages  s    { 	*[)))> 	0.///_

A 	# O !MNNN{B''Ay"%%Aa%  Z a%  a%  Z a%   7 7 7 7J 7 7 7 7 !5666E!QUOO,,GG4yy1} E
 E !CDDD4yyA~ #1Q3 C477c> C$%ABBBq5  aqAA ; ; ; ;
 ; ; ; ;$%9:::aQ00G773tU";; M$%KLLL((s3G--..b= 	'(((F1:> 	3WR[J6 	31222"7++llnn !7!7!9!9:: 	, 	,GAt1vay1}. ,%%d+++n---'"" 	! 	!Aa    r   r   r   r3   r  r  c                    |                                  }dt          |          z  }||v rt          |          ||}||}||}|                     |||||          }t	                      }	|                     |dd           |                     |dt          |	                     |                     |dt          |	                     |S )a\  Add an item to the EmbeddedFiles array.

        Args:
            name: name of the new item, must not already exist.
            buffer_: (binary data) the file content.
            filename: (str) the file name, default: the name
            ufilename: (unicode) the file name, default: filename
            desc: (str) the description.
        zName '%s' already exists.Nr   r3   r  r  r}  z/EmbeddedFileParams/CreationDateParams/ModDate)r1  r   r   r:  get_pdf_nowr*  get_pdf_str)
r]   r   r   r3   r  r  r3  r  r   dates
             r   embfile_addzDocument.embfile_add  s      &&((	)CII59 	"S//! 	H 	! I 	D  !# !   }}$888$ 5{47H7HIII$ 0+d2C2CDDDr   c                 D    t          |                                           S )zGet number of EmbeddedFiles.)r-  r1  r\   s    r   embfile_countzDocument.embfile_count	  s    4%%''(((r   c                 V    |                      |          }|                     |          S )aT  Delete an entry from EmbeddedFiles.

        Notes:
            The argument must be name or index of an EmbeddedFiles item.
            Physical deletion of data will happen on save to a new
            file with appropriate garbage option.
        Args:
            item: name or number of item.
        Returns:
            None
        )r4  r<  r]   r   r*  s      r   embfile_delzDocument.embfile_del  s+     %%d++  %%%r   c                 V    |                      |          }|                     |          S )zGet the content of an item in the EmbeddedFiles array.

        Args:
            item: number or name of item.
        Returns:
            (bytes) The file content.
        )r4  r/  r=  s      r   embfile_getzDocument.embfile_get  s+     %%d++$$S)))r   c                    |                      |          }d|                                 |         i}|                     ||          }|                     |d          \  }}|dk    r||d<   |                     |d          \  }}|dk    r||d<   |                     |d          \  }}|dk    r;t	          j        |                                                                          |d<   |S )	zGet information of an item in the EmbeddedFiles array.

        Args:
            item: number or name of item.
        Returns:
            Information dictionary.
        r   r4  ru  r7  r5  r8  zParams/CheckSumchecksum)r4  r1  rF  xref_get_keyr  r  r  decode)r]   r   r*  rA  r   r   r8  md5s           r   embfile_infozDocument.embfile_info'  s     %%d++D..0056!!#x00##D*?@@4; 	,'+H^$##D*:;;4; 	'"&HY""4):;;3; 	K#+#3CJJLL#A#A#H#H#J#JHZ r   c                 4    g }|                      |           |S )z#Get list of names of EmbeddedFiles.)rH  )r]   r3  s     r   r1  zDocument.embfile_names=  s!    	I&&&r   c                     |                      |          }|                     |||||          }t                      }|                     |dt	          |                     |S )a  Change an item of the EmbeddedFiles array.

        Notes:
            Only provided parameters are changed. If all are omitted,
            the method is a no-op.
        Args:
            item: number or name of item.
            buffer_: (binary data) the new file content.
            filename: (str) the new file name.
            ufilename: (unicode) the new filen ame.
            desc: (str) the new description.
        r3  r5  )r4  rJ  r6  r*  r7  )	r]   r   r   r3   r  r  r*  r   r8  s	            r   embfile_updzDocument.embfile_updC  sq    & %%d++  !# !   }}$ 0+d2C2CDDDr   c           
         t          |           }t          |           t          j        ||          }t          j        |t          d                    }t          j        |t          d                    }t          j        |t          d                    rt          j        |                              d          sZt          j        |t          d                    }|j	        rt          j
        |          r#t          j        |t          d                    }	n|}	t          ||          }
|
dk    r"|s t          ||          }t          |          }nd}|sRt          t          j        |	                    t          |
          t          t          j        |                    |f}nt           t          t          j        |	                    t"          t          |
          t$          t          t          j        |                    t&          |i}n#|sd	}nt           d
t"          d
t$          d
t&          di}|S )zD
        Get a font by xref. Returns a tuple or dictionary.
        r}  rC  r  CIDFontTypeBaseFontr  n/ar   )r(   r(   r(   r   r(   )r   r$  rf   rS  r   r   pdf_name_eqr@  r   r   pdf_is_nullJM_get_fontextensionrf  r   rz  r   r  dictkey_extdictkey_typer  )r]   r   	info_onlynamedr!  r   r"  subtypebasefontbnamer^  r   bytes_rh   s                 r   extract_fontzDocument.extract_fontb  s   
 t$$3#C.."3(8(899$S(9*=*=>>eXf%5%566 %	)733>>}MM%	 )#x
/C/CDDH& !%*;H*E*E !*30@0@AA &sD11Ce| I +C66)'22 +E,=e,D,DEE)#..)%*;G*D*DEE	 %&9%:KE:R:R&S&S#%6s%;%;$&78I'8R8R&S&S'	  $ %b#R$b'	 	r   c                 V   | j         s| j        rt          d          t          |           }d}d}t	          |           t          |dt          j        |          dz
            st          t                    t          j	        ||d          }t          j
        |t          d                    }t          j        |t          d                    st          d          t          j        |t          d          t          d                    }|j        rt          j        |          }t          j        |          r"t          j        }t          j        |          }d	}	t'          |          r"t          j        }t          j        |          }d
}	t          j        |          }|t          j        k    rNt          j        |          }t          j        |          \  }
}t          j        |          }t3          |          }	|t          j        k    rd}t          j        ||          }t          j        |j                  }|r|j        j        t          j        t          j        t          j         t          j!        t          j"        fvrG|j        j        }t3          |          }	t          j#        t          j$        |j%                            }nHt          j&        |t          j'        t          j(                            }d}	nt          j)        |          }t          j*        |          \  }}|+                                }|,                                }|-                                }|.                                }t          j/        |0                                          }tc                      }|	|td          <   ||tf          <   ||th          <   ||tj          <   ||tl          <   ||tn          <   ||tp          <   ||tr          <   ||tt          <   tw          |          |tx          <   |S )z(Get image by xref. Returns a dictionary.r  r   r   rC  Imageznot an imageSMaskMaskjpxjb2Npng)=r   r  r   r   r$  r]  rf   rD  rE  rF  r   r   rN  pdf_dict_getar   r   pdf_is_jpx_imageFZ_IMAGE_JPXr   JM_is_jbig2_imageFZ_IMAGE_JBIG2pdf_load_raw_streamFZ_IMAGE_UNKNOWNr  fz_recognize_image_formatJM_image_extensionpdf_load_imagell_fz_compressed_image_bufferparamsr   FZ_IMAGE_RAWFZ_IMAGE_FAXFZ_IMAGE_FLATEFZ_IMAGE_LZWFZ_IMAGE_RLDr  ll_fz_keep_bufferbufferfz_new_buffer_from_image_as_pngFzColorParamsfz_default_color_paramsfz_new_image_from_bufferfz_image_resolutionr   r  rF  bpcr{  r  r   rQ  dictkey_smaskdictkey_widthdictkey_heightdictkey_colorspacedictkey_bpcdictkey_xresdictkey_yresdictkey_cs_namer   dictkey_image)r]   r   r!  img_typesmaskr   rU  ri  r   r^  r  ry  r  ll_cbufxresyresr  r  r  ry  cs_namerh   s                         r   extract_imagezDocument.extract_image  s   > 	=T. 	=;<<<t$$3a!3C!8!8!:;; 	,l+++$S$22$S(9*=*=>> (7*;*;<< 	.n---Xg%6%68H8HII< 	($Q''E!#&& 	)H',,CCS!! 	+H',,CC',,u-- 	/+C00C*3//DAq6q99H$X..Cu-- 	6C&sC00C9#.IIG +**,**4  #>.(22nU%<W^%L%LMM;+E,IJJ  055C.s33
dUUWW
ggii*3>>+;+;<<VVK"M"M$N",K L L&O-c22M	r   r   F  c                 R    |                      |||||||||	|
|||||||||          S )z8
        Save PDF using some different defaults
        )garbagecleandeflatedeflate_imagesdeflate_fontsincrementalrT  expandlinearpretty
encryptionpermissionsowner_pwuser_pw	no_new_idpreserve_metadatause_objstmscompression_effort)save)r]   r3   r  r  r  r  r  r  rT  r  r  r  r  r  r  r  r  r  r  r  s                       r   ez_savezDocument.ez_save  sX    2 yy-+'%'!#"3'#5'    	r   c                     | j         s| j        rt          d          t          j        | j        |          }|j        |j        fS )z-Find new location after layouting a document.r  )r   r  r   rf   fz_lookup_bookmark2r   r  r   )r]   rV  locations      r   find_bookmarkzDocument.find_bookmark  sI    > 	=T. 	=;<<<,di<<..r   c                 $   t          |           }t          j        |          }	 t          |           t	          |d|dz
            rt	          |d|dz
            st          t                    t          j        t          j        ||                    }t          j	        |          }t          j
        |t          d                    }|j        rt          j        |          }t          j        ||          }	t          |          D ]7}
t          j        ||
          }t          j
        |t          d                    }t          j        |t          d                    r]t          j        |d          j        rxt          j	        t          j        |                    }t          j        |          }t          j        |||           t          j        ||d          }t          j        |t          d                     t          j        |t          d                     t          j        |	|           9t          j        |t          d          |	           t3          |          }|j        rot          j        |t          j        d	          t          j                    d          }t;          |||d           t          j        |t          d
          |           t          j        |          }t          j        |||           t          j        ||d          }t          j        |||           t          j        |j                   n# t          j        |j                   w xY w|                                   dS )zMake a full page duplicate.r   r   r   r_  rC  r^  r  P    r  N)!r   rf   r  r$  r]  r   r  rs  r  pdf_deep_copy_objr   r   r   rc  r  r  rd  rN  r   pdf_create_objectpdf_update_objectrF  r  r8  r  JM_read_contentspdf_add_streamrh  PdfObjr   r  r!  r  )r]   r  r  r!  r  r  r  
old_annotsrF  
new_annotsrq   ri  rU  copy_or   r   r  s                    r   fullcopy_pagezDocument.fullcopy_page  s0   t$$*C00
1	9sOOOS!Z!^44 2#BJN;;2 !.111.0I3PS0T0TUUE+U33E+UHX4F4FGGJ $ K'44"0#q99
q > >A+Z;;A#0!Xi5H5HIIG('8G3D3DEE ! *Au55@ ! "4e6PRS6T6TUUF 2C88D+S$???"3S$BBF&0A0ABBB&>>>(*f===="E8H+=+=zJJJ #E**C ~ K /e6Z\`6a6achcocqcqstuu #xa888"E8J+?+?JJJ *C00D#S$666*Cq99E!3E222'8888E'8888s   LM M9c                    t          |           }t          |           t          j        t          j        |          t          d          t          d                    }|j        sdS |dk    r#t          j        |t          d                    }n5t          j        t          j        |t          d                    |          }|j        st          t                    t          |          }|S )z,Content of ON, OFF, RBGroups of an OC layer.r	  OCPropertiesNr   rQ  r  )r   r$  rf   r   r  r   r   r   rd  r   r  JM_get_ocg_arrays)r]   r  r!  r  r   rh   s         r   	get_layerzDocument.get_layerU  s    t$$3!!3''  (( 
 ~ 	FR< 	$c8C==99CC%&Xi-@-@AA C ~ 	1/000$$	r   c                    t          |           }t          |           t          j        |          }|dk    rft          j        t          j        |          t          d          t          d          t          d                    }t          j        |          sd}g }t          j                    }t          |          D ]=}t          j
        |||           ||j        |j        d}|                    |           >|S )zShow optional OC layers.r   r	  r  r  r   )numberr   r  )r   r$  rf   pdf_count_layer_configsr   r  r   r6  PdfLayerConfigr  pdf_layer_config_infor   r  r6   )r]   r!  rF  r   rh   r  rq   r   s           r   
get_layerszDocument.get_layersl  s   t$$3)3//6 	%%s++V$$^,,Y''	 C %s++ #%%q 	 	A'a666 I#| D
 IIt	r   c                     | j         s| j        rt          d          t          |           }d}t	          |           t          |           t          j        |          }|S )zMake new xref.r  r   )r   r  r   r   r$  ENSURE_OPERATIONrf   r  )r]   r!  r   s      r   get_new_xrefzDocument.get_new_xref  se    > 	=T. 	=;<<<t$$3&s++r   c           	         t          j        d          }t          |           }t          |           t          j        t          j        t          j        |          t          d                    t          d          t          d                    }t                      }t          j	        |          s|S t          j
        |          }t          |          D ]}t          j        ||          }t          j        |          }t          j        t          j        |t          d                              }	t          j        |t          d          |t          d                    }
d}|
j        rt          j        |
          }t#                      }t          j        |t          d	                    }|j        rt          j        |          r(|                    t          j        |                     nt          j	        |          rvt          j
        |          }t          |          D ]R}t          j        ||          }t          j        |          r'|                    t          j        |                     St          j        |t          j                    ||          }|	|| |d
}|}|||<   |S )z&Show existing optional content groups.r  r	  r  r  r  r  rC  Nr  )r   r  r  r  )rf   r  r   r$  r   r   r  r   r   r6  rc  r  rd  r   r   r   r@  r{   rx  r6   pdf_is_ocg_hiddenr  )r]   rD  r!  ocgsrh   rF  rq   r  r   r   r   r  r  r  rH  rI  ri  hiddenr   rX  s                       r   get_ocgszDocument.get_ocgs  sx   //t$$3""E$5s$;$;Xf=M=MNN((   
 VV!4(( 	I&&q 	 	A%tQ//C#S))D+U-?hvFVFV-W-WXXD%sHW,=,=r8ICVCVWWCE~ 0)3//ffG'hx.@.@AAF  C$f-- CNNE$5v$>$>????'00 C+V44A"1XX C C!/;; ,a00 C#NNE,=q,A,ABBB,c5<>>5#NNF %$*"	 D DBII	r   c                 v   g }t          |           }|s|S t          j        t          j        |          t	          d                    }|j        s|S t          j        |t	          d                    }|j        s|S t          j        |t	          d                    }|j        s|S t          ||          }|S )z!Get list of outline xref numbers.r	  r  r  )r   rf   r   r  r   r   r  )r]   r  r!  r  r  r  s         r   r(  zDocument.get_outline_xrefs  s    t$$ 	L!%"3C"8"8(6:J:JKK 	L#D(:*>*>??  	L"68G+<+<== 	L ..r   fullc                 2   | j         s| j        rt          d          | j        sdS t	          |          t
          ur4	 |j        }n+# t          $ r t                       t          d          w xY w| 	                    |d          }|du rd |D             S |S )z1Retrieve a list of fonts used on a page.
        r  r    zneed a Page or page numberr   Fc                 "    g | ]}|d d         S Nr   r    rp   rM   s     r   rr   z+Document.get_page_fonts.<locals>.<listcomp>       (((qAcrcF(((r   )
r   r  r   r  r   r   r  r   rF   r  r]   r  r  r   s       r   get_page_fontszDocument.get_page_fonts  s     > 	=T. 	=;<<<{ 	299C 	??j ? ? ?    !=>>>? Q''5= 	)((C((((
s   A (A.c                     | j         s| j        rt          d          | j        sdS |                     |d          }|du rd |D             S |S )z2Retrieve a list of images used on a page.
        r  r    ry   Fc                 "    g | ]}|d d         S r  r    r  s     r   rr   z,Document.get_page_images.<locals>.<listcomp>  r  r   r   r  r   r  r  r  s       r   get_page_imageszDocument.get_page_images  sp     > 	=T. 	=;<<<{ 	2Q''5= 	)((C((((
r   c                 ~    | j         s| j        rt          d          | j        sdS |                     |d          }|S )z4Retrieve a list of XObjects used on a page.
        r  r    r   r  )r]   r  r   s      r   get_page_xobjectszDocument.get_page_xobjects  sP     > 	=T. 	=;<<<{ 	2Q''
r   c                    t          |           }|sdS t          j        t          j        |          t	          d          t	          d          t	          d                    }d}|j        rt          j        |          }|S )zGet the /SigFlags value.r   r	  r
  SigFlags)r   rf   r   r  r   r   r   )r]   r!  sigflagssigflags       r   get_sigflagszDocument.get_sigflags  s    t$$ 	2&!#&&  $$$$	   	1&x00Gr   c                    d}t          |           }|j        rBt          j        t          j        |          t          d          t          d                    }|r+|j        r$t          j        |          }t          |          }nd}|S )zGet document XML metadata.Nr	  r$  r(   )r   r   rf   r   r  r   r   JM_UnicodeFromBuffer)r]   xmlr!  r$  rh   s        r   get_xml_metadatazDocument.get_xml_metadata  s    t$$> 	%%c**V$$Z(( C
  	3> 	(--D%d++BBB	r   c                 P     j         rt          d                                            _        t	           fdddddddd	d
ddd
                                D                        _                             d          dk    rd n                     d           j        d<   d S )Nz,cannot initialize - document still encryptedc                 D    g | ]\  }}|                     |          fS r    )r{  )rp   rx  rM   r]   s      r   rr   z%Document.init_doc.<locals>.<listcomp>  s=       58Qq4,,Q//0  r   r  z
info:Titlezinfo:Authorzinfo:Subjectzinfo:Keywordszinfo:Creatorzinfo:Producerzinfo:CreationDatezinfo:ModDatezinfo:Trapped)
r  r6  authorr9  keywordsr  producerr7  r8  trappedr  None)r  r   r  r  r   rt  r  r{  r\   s   `r   r  zDocument.init_doc  s     	MKLLL))++   %-$0%2&4'6&4'6+>&4&4= = $egg     /3.?.?.M.Mv.U&zdd[_[l[lmy[z[zl###r   c
                    d}
t          |t                    rH|j        j        dk    rt          t          |          }t          d|                                          }
n't          |t
                    r|}
nt          |          }
|
st          d          |
j        s$|
	                                }t          d|          }
| 
                    |
||||||||		  	        S )z
        Insert an arbitrary supported document to an existing PDF.

        The infile may be given as a filename, a Document or a Pixmap.
        Other paramters - where applicable - equal those of insert_pdf().
        Nr   r`  zbad infile parameterr!  )r  r  start_atr   linksrg  show_progressfinal)rz   r  r  rF  r  r   tobytesr   r  r  
insert_pdf)r]   infiler  r  r  r   r  rg  r  r  r  pdfbytess               r   insert_filezDocument.insert_file.  s    " ff%% 	# "Q& /v..5&.."2"233CC)) 	#CC6""C 	53444z 	,))++H5(++C#!+  
 
 
	r   c                    | j         s| j        rt          d          | j        |j        k    rt          d          |}|dk     r| j        }t          |          |cxk    rdk    rin nft          j                            |j	                  }|sd}t          j                            | j	                  }|sd}t          d|d|d           |j        }| j                            |d          }
|
t          |           }
|
| j        |<   t          r$t          | j        |j        ||||||||	|
           nt#          |           }t#          |          }t%          j        |           }t%          j        |j                  }|}|}|}t)          |d          }t+          ||d	z
            }|dk     r|d	z
  }t+          ||d	z
            }|dk     r|}t+          ||          }|j        r|j        st/          d
          t1          |           t3          ||||||||||

  
         |                                  |r|                     ||||           |	d	k    rd| j        |<   dS dS )a,  Insert a page range from another PDF.

        Args:
            docsrc: PDF to copy from. Must be different object, but may be same file.
            from_page: (int) first source page to copy, 0-based, default 0.
            to_page: (int) last source page to copy, 0-based, default last page.
            start_at: (int) from_page will become this page number in target.
            rotate: (int) rotate copied pages, default -1 is no change.
            links: (int/bool) whether to also copy links.
            annots: (int/bool) whether to also copy annotations.
            show_progress: (int) progress message interval, 0 is no messages.
            final: (bool) indicates last insertion from this source PDF.
            _gmap: internal use only

        Copy sequence reversed if from_page > to_page.r  z'source and target cannot be same objectr   z
memory PDFzInserting 'z' at 'r   Nr   zsource or target not a PDF)r  r  r  )r   r  r   r  r  r-  r   r1   basenamer   rB   r  r   Graftmapr   extra_FzDocument_insert_pdfr   r   rf   r  r  minr   rv  r  JM_merge_ranger  	_do_links)r]   docsrcr  r  r  r   r  rg  r  r  _gmapsainnameoutnameisrtpdfoutpdfsrcoutCountr  rL  r  s                        r   r  zDocument.insert_pdfY  s   B > 	=T. 	=;<<<>V-- 	HFGGG6 	!Bv;; 	B 	B 	B 	B 	B 	B 	B 	B 	BW%%fk22F &%g&&ty11G '&G@AAA ""4.. 	)TNNE#(DN4  *	d'IK!    &d++F%f--F+D11H+FK88H BBB RBRA&&BAv "\RA&&BAv R""B$ ?F,= ?!=>>>V$$$662r2vufm]bccc 	 	\NN6yGXZN[[[A: 	(#'DN4   	( 	(r   c                 f    t          |           }|j        sdS t          j        |          }|rdndS )NFT)r   r   rf   pdf_has_unsaved_changesr]   r!  r   s      r   is_dirtyzDocument.is_dirty  s=    t$$~ 	5)#..#tte#r   c                 Z    t          |           }|j        rt          j        |          S dS )z9
        Check whether we have a linearized PDF.
        F)r   r   rf   pdf_doc_was_linearizedr  s     r   is_fast_webaccesszDocument.is_fast_webaccess  s1    
 t$$> 	5/444ur   c                 x   t          |           }|j        sdS d}	 t          j        t          j        |          t          j        t          j        t          j                  }t          j        |          rt          j	        |          }n&# t          $ r t          rt                       Y dS w xY w|dk    r|S dS )z Either False or PDF field count.Fr   r   )r   r   rf   r   r  PDF_ENUM_NAME_RootPDF_ENUM_NAME_AcroFormPDF_ENUM_NAME_Fieldsr6  rc  r   r   rF   )r]   r!  rW  fieldss       r   is_form_pdfzDocument.is_form_pdf  s     t$$~ 	5	(%c**,0.	 F !&)) 4+F33 	 	 	#8(8(8(855	 A: 	Lus   A/B B/.B/c                     t          | j        t          j                  rdS t          j        | j        j                  rd}nd}|S )zCheck for PDF.TF)rz   r   rf   r   ll_pdf_specificsr   r  s     r   r  zDocument.is_pdf  sK     di!233 	4
 !$)"677 	CCC
r   c                 p    | j         rt          d          t          t          j        |                     S )z Check if document is layoutable.r   )r   r   r  rf   r  r\   s    r   is_reflowablezDocument.is_reflowable   s6     > 	0.///E3D99:::r   c                 f    t          |           }|j        sdS t          j        |          }|rdS dS )zCheck whether PDF was repaired.FT)r   r   rf   pdf_was_repairedr  s      r   is_repairedzDocument.is_repaired  sB     t$$~ 	5"3'' 	4ur   c                    | j         s| j        rt          d          d}d}t          |           }t	          |           t          j        |          }t          j        |          }t          |          t          |          dS )z(Show if undo and / or redo are possible.r  r   )undoredo)	r   r  r   r   r$  rf   pdf_can_undopdf_can_redor  )r]   r  r  r!  s       r   journal_can_dozDocument.journal_can_do  s    > 	=T. 	=;<<<t$$3!#&&!#&&T

DJJ777r   c                     | j         s| j        rt          d          t          |           }t	          |           t          j        |           dS )zActivate document journalling.r  N)r   r  r   r   r$  rf   pdf_enable_journalr  s     r   journal_enablezDocument.journal_enable  sT    > 	=T. 	=;<<<t$$3 %%%%%r   c                     | j         s| j        rt          d          t          |           }|j        o|j        j        }|S )z Check if journalling is enabled.r  )r   r  r   r   r   journal)r]   r!  enableds      r   journal_is_enabledzDocument.journal_is_enabled&  sH    > 	=T. 	=;<<<t$$.;S^%;r   c                    | j         s| j        rt          d          t          |           }t	          |           t          |t                    rt          j        ||           n8t          |          }t          j
        |          }t          j        ||           |j        j        st          dt                     dS dS )zLoad a journal from a file.r  z!Journal and document do not matchN)r   r  r   r   r$  rz   r   rf   pdf_load_journalr   r-  pdf_deserialise_journalr   r  rx  ry  )r]   r3   r!  r   stms        r   journal_loadzDocument.journal_load.  s    > 	=T. 	=;<<<t$$3h$$ 	4"31111$X..C&s++C)#s333~% 	P8:NOOOOO	P 	Pr   c                     | j         s| j        rt          d          t          |           }t	          |           t          j        ||          }|S )z#Show operation name for given step.r  )r   r  r   r   r$  rf   pdf_undoredo_step)r]   r  r!  r   s       r   journal_op_namezDocument.journal_op_name=  sT    > 	=T. 	=;<<<t$$3&sD11r   c                     | j         s| j        rt          d          d}t          |           }t	          |           t          j        |          \  }}||fS )zShow journalling state.r  r   )r   r  r   r   r$  rf   pdf_undoredo_state)r]   stepsr!  rh   s       r   journal_positionzDocument.journal_positionF  s`    > 	=T. 	=;<<<t$$3,S11	E5yr   c                     | j         s| j        rt          d          t          |           }t	          |           t          j        |           dS )zMove forward in the journal.r  T)r   r  r   r   r$  rf   pdf_redor  s     r   journal_redozDocument.journal_redoP  R    > 	=T. 	=;<<<t$$3str   c                 D   | j         s| j        rt          d          t          |           }t	          |           t          |t                    rt          j        ||           dS t          |          }t          j
        ||           |                                 dS )zSave journal to a file.r  N)r   r  r   r   r$  rz   r   rf   pdf_save_journalJM_new_output_fileptrpdf_write_journalfz_close_output)r]   r3   r!  outs       r   journal_savezDocument.journal_saveY  s    > 	=T. 	=;<<<t$$3h$$ 	""311111'11C#C---!!!!!r   c                    | j         s| j        rt          d          t          |           }t	          |           |j        j        st          d          |rt          j	        ||           dS t          j
        |           dS )zBegin a journalling operation.r  zJournalling not enabledN)r   r  r   r   r$  r   r  r   rf   pdf_begin_operationpdf_begin_implicit_operation)r]   r   r!  s      r   journal_start_opzDocument.journal_start_opf  s    > 	=T. 	=;<<<t$$3~% 	; 9::: 	4%c400000.s33333r   c                     | j         s| j        rt          d          t          |           }t	          |           t          j        |           dS )zEnd a journalling operation.r  N)r   r  r   r   r$  rf   pdf_end_operationr  s     r   journal_stop_opzDocument.journal_stop_ops  sT    > 	=T. 	=;<<<t$$3$$$$$r   c                     | j         s| j        rt          d          t          |           }t	          |           t          j        |           dS )zMove backwards in the journal.r  T)r   r  r   r   r$  rf   pdf_undor  s     r   journal_undozDocument.journal_undo{  r+  r   c                     t          |           }|sdS t          j        |          }|t          j        k    rdS t          dk     r
J d            t          j        |          S )zDocument language.N)r      r  r   znot implemented yet)r   rf   pdf_document_languager  r~   r  )r]   r!  r  s      r   r  zDocument.language  sp     t$$ 	F*3//5&& 	F+ 	,+++++24888r   c                 |    | j         rt          d          t          j        | j                  }|j        |j        fS )z Id (chapter, page) of last page.r   )r   r   rf   fz_last_pager   r  r   )r]   last_locs     r   last_locationzDocument.last_location  s?     > 	0.///%di00..r   c                    t          |           }t          |           t          j                    }t          j        |          }g }t          |          D ]h}t          j        |||           |j        dk    rd}n|j        dk    rd}nd}||j        |j	        ||j
        |j        d}|                    |           i|S )z-Show OC visibility status modifiable by user.r   checkboxry   radioboxlabel)r  r:   depthr   r  locked)r   r$  rf   PdfLayerConfigUipdf_count_layer_config_uir  pdf_layer_config_ui_infor   r:   rH  selectedrI  r6   )r]   r!  r  rF  rh   rq   r"  r   s           r   layer_ui_configszDocument.layer_ui_configs  s    t$$3%''+S11q 	 	A*CD999yA~  "a  " I!Z!-"k D IIdOOOO	r   c                    | j         s| j        rt          d          | j        }t	          j        |          sdS |}|}t          |          }t	          j        |          s|j        |j	        z
  }|j
        |j        z
  }|dk    s|dk    rt          d          t	          j        ||||           |                                  |                                  dS )z Re-layout a reflowable document.r  Nr[  zbad page size)r   r  r   r   rf   r  r  rl  r  r  r  r  r  r  r  )	r]   r   r  r  r   r   r   r  r   s	            r   layoutzDocument.layout  s    > 	=T. 	=;<<<i.44 	FD!!(++ 	qtAqtA8 	/qCx 	/o... #q!X666r   c                    | j         s| j        rt          d          |d}|| vrt          d          t          |          t          u r|dk     r| j        }|dk     r||z  }|dk     t          |t                    rt          j        | j	        |          }n |\  }}t          j
        | j	        ||          }t          ||           }d|_        | |_        || j        t          |          <   t!          j                    |_        ||_        |S )zLoad a page.

        'page_id' is either a 0-based page number or a tuple (chapter, pno),
        with chapter number and page number within that chapter.
        r  Nr   zpage not in documentT)r   r  r   r   r   r  rz   rf   fz_load_pager   fz_load_chapter_pager   r   r   r  r  r  r  r  r  )r]   page_idnpr   r  pagenumr   s          r   r  zDocument.load_page  s,    > 	=T. 	=;<<< 	G$ 	53444==C 	GaK 	BA+ 2 A+ gs## 	K%di99DD&GW-di'JJD4
#&3 !577

r   c                 *   | j         rt          d          | j        }t          j        dd          }t          j        |          }|dk     r||z  }|dk     ||k    rt          t                    t          j        ||          }|j        |j	        fS )zConvert pno to (chapter, page).r   r   r   )
r   r   r   rf   fz_make_locationr  r  fz_location_from_page_numberr  r   )r]   r  this_docr  r  s        r   location_from_page_numberz"Document.location_from_page_number  s    > 	0.///9$R,,)(33
Ag 	:C Ag 	* 	.n---03??{CH$$r   c                     | j         s| j        rt          d          t          j        | }t          j        | j        j        |                                          }|S )z.Make a page pointer before layouting document.r  )	r   r  r   rf   
FzLocationll_fz_make_bookmark2r   r   internal)r]   r  marks      r   make_bookmarkzDocument.make_bookmark  sV    > 	=T. 	=;<<<$)49+?PPr   c                    |                                  }|dk    rdS |                     |d          }|d         dk    ri S |d         dk    rEt          |d                                         d                   }|                     |d          }n|d         d	k    r	|d         }nd}||dd
         dk    r|dd         dk    si S dddd}|d
d                             d          }|dd         D ]S}	 |                                \  }}n-# t
          $ r  t          dk    rt                       |cY c S w xY w|dk    rd||<   T|S )zReturn the PDF MarkInfo value.r   NMarkInforu  r   r   Tr  r   ry   <<r  >>FMarkedUserPropertiesSuspects/true)r  rC  r   splitr  r   r   rF   )r]   r   rh   r   validrM   r  r   s           r   markinfozDocument.markinfo  s    !!19 	4tZ00a5F? 	Ia5F? 	r!u{{}}Q'((D""4D"99CCUf_ 	Q%CCC 	s2A2w$ 	3rss8t3C 	I EuMM!B$iooc""QRR 	" 	"AWWYY
UU   '!+@0@0@0@  "!c
s   9D%D;:D;c                    | j         rt          d          t          |           }|t          |          vs|t          d|          vrt          d          d}d}|dk    r|dz
  }d}|                     ||||          S )zMove a page within a PDF document.

        Args:
            pno: source page number.
            to: put before this page, '-1' means after last page.
        r   r   r  r   r   r   r!  s         r   	move_pagezDocument.move_page  s     > 	0.///YY
uZ((( 	3BeB
6K6K,K 	312228 	aBF##CVT:::r   c                     | j         S r   r  r\   s    r   r   zDocument.name-  s
    zr   c                    | j         sdS t          |           }d}d}t          j        t          j        |          d          }t          j        ||          }t          j        |          rt          j        |          }|r!t          j        ||t          j	                   n t          j        ||t          j
                   ||dk    S |S )z"Get/set the NeedAppearances value.Nr   NeedAppearanceszRoot/AcroFormr   )r  r   rf   pdf_dict_getpr  r   pdf_is_boolpdf_to_boolr>  PDF_TRUE	PDF_FALSE)r]   r   r!  oldvalappkeyformapps          r   need_appearanceszDocument.need_appearances1  s     	4t$$""!#&&  !$//S!! 	,&s++F 	?fen====feo>>> 	Q;r   c                     | j         rt          d          t          | j        t          j                  r| j        n| j                                        }t	          j        |          }|S )zIndicate password required.r   )r   r   rz   r   rf   r   r   fz_needs_password)r]   r   rN   s      r   r  zDocument.needs_passI  s]     > 	0./// *49e6F G G^499TY__M^M^%x00
r   c                    | j         s| j        rt          d          t          |          t          u rd|f}|| vrt          d          t          |          | j        k    rdS t          |           }|d         }t          |t                    st          t          t                     |}|d         }|}t          j        ||          }t          j        ||          }|j        |j        fS )z!Get (chapter, page) of next page.r  r   page id not in documentr    r   )r   r  r   r   r   r|   rC  r   rz   rx  MSG_BAD_PAGEIDPyExc_ValueErrorrf   rX  fz_next_pager  r   )r]   rT  rZ  r   r  r  r  next_locs           r   next_locationzDocument.next_locationR  s    > 	=T. 	=;<<<==C 	#'lG$ 	86777>>T// 	2"4((qk#s## 	6N$4555qk$Wc22%x55..r   c                    t           rt          j        | j        |          S t	          | j        t
          j                  r!t          j        | j                  }| j        }n(t          j        | j                  }t          |           }|dk     r||z  }|dk     ||k    rt          t                    t          j        ||          }t          |          }|S rW   )r   r   page_annot_xrefsr   rz   rf   r   r  r  r   r   r  r  JM_get_annot_xref_list)r]   rF  r  r  r  rg  s         r   r  zDocument.page_annot_xrefsg  s     	9)49a888di!233 	2.ty99J9LL-di88J+D11L!e 	OA !e 	z> 	.n---,\1=='11r   c                    | j         rt          d          t          r|                     |           S t	          | j        t          j                  rt          j        | j                  S t          j	        | j                  S )zNumber of pages.r   )
r   r   r   r  rz   r   rf   r   r  r  r\   s    r   r  zDocument.page_county  sv     > 	0./// 	*##D)))ty%"233 	5'333($)444r   c                    | j         rt          d          | j        }t          j        |          }|}|dk     r||z  }|dk     t          |           }||k    rt          t                    t          |           t          j        ||          }t          |          }t          |          }t          |          }|S )z2Get CropBox of page number (without loading page).r   r   )r   r   r   rf   r  r   r  r$  r  
JM_cropboxr.  r   )	r]   r  rZ  r  rF  r!  r  cropboxr   s	            r   page_cropboxzDocument.page_cropbox  s    > 	0.///9)844
!e 	OA !e 	t$$
? 	.n---3+S!44W%%g&&3ii
r   c                     t          |          t          u r| j        }|dk     r||z  }|dk     d|f}|| vrt          d          |\  }}t	          j        ||          }t	          j        | j        |          }|S )z&Convert (chapter, pno) to page number.r   r  )r   r   r  r   rf   rX  fz_page_number_from_locationr   )r]   rT  rU  r  r  r  page_ns          r   page_number_from_locationz"Document.page_number_from_location  s    ==C 	#BA+ 2 A+ 'lG$ 	86777$gs333TYDDr   c                    t           rt          j        | j        |          S | j        rt          d          t          j        | j                  }|}|dk     r||z  }|dk     t          |           }d}||k    rt          t                    t          |           t          j        t          j        ||                    }|S )zGet xref of page number.r   r   )r   r   	page_xrefr   r   r   rf   r  r   r  r$  r   r  )r]   r  r  rF  r!  r   s         r   r  zDocument.page_xref  s     	4?DIs333> 	0.///)$)44
!e 	OA !e 	t$$
? 	.n---3 9#q A ABBr   c                     |                                  }|dk    rdS |                     |d          }|d         dk    rdS |d         dk    r|d         dd         S dS )z)Return the PDF PageLayout value.
        r   N
PageLayoutru  
SinglePager   r   r  rC  r]   r   rh   s      r   
pagelayoutzDocument.pagelayout  sw     !!19 	4t\22a5F? 	 <a5F? 	a59|r   c                     |                                  }|dk    rdS |                     |d          }|d         dk    rdS |d         dk    r|d         dd         S dS )z'Return the PDF PageMode value.
        r   NPageModeru  UseNoner   r   r  r  s      r   pagemodezDocument.pagemode  sw     !!19 	4tZ00a5F? 	9a5F? 	a59yr   )r   	   rR  r  r  c              #   N  K   |pd}|dk     r|| j         z  }|dk     |t          | j                   vrt          d          ||| j         k    r|n| j         }|dk    rt          d          |||k    rd}nd}t          |||          D ]}|                     |          V  dS )z}Return a generator iterator over a page range.

        Arguments have the same meaning as for the range() built-in.
        r   zbad start page numberNzarg 3 must not be zeror   r   )r  r  r   r  )r]   rR  r  r  r  s        r   r  zDocument.pages  s       
ai 	%T_$E ai 	%do... 	64555 XDDO,CXtt 19 	75666 	t| d++ 	( 	(C>>#&&''''	( 	(r   c                     t          |           }d}|s|S t          j        t          j        |          t	          d                    }t          j        |          }|S )zGet xref of PDF catalog.r   r	  )r   rf   r   r  r   r   )r]   r!  r   r  s       r   r  zDocument.pdf_catalog  s[    t$$ 	K!%"3C"8"8(6:J:JKK%%r   c                 2    |                      d||          S )zGet PDF trailer as a string.r   )r  rT  )r  )r]   r  rT  s      r   r  zDocument.pdf_trailer  s    zGGGr   c                    | j         rdS | j        }t          j        |          }|j        rt          j        |          S d}t          j        |t          j                  s|t          j        z  }t          j        |t          j	                  s|t          j
        z  }t          j        |t          j                  s|t          j        z  }t          j        |t          j                  s|t          j        z  }|S )zDocument permissions.r   l    )r  r   rf   pdf_document_from_fz_documentr   pdf_document_permissionsfz_has_permissionFZ_PERMISSION_PRINTPDF_PERM_PRINTFZ_PERMISSION_EDITPDF_PERM_MODIFYFZ_PERMISSION_COPYPDF_PERM_COPYFZ_PERMISSION_ANNOTATEPDF_PERM_ANNOTATE)r]   r   r!  perms       r   r  zDocument.permissions  s      	1Y1#66 > 	71#666 &sE,EFF 	/%..D&sE,DEE 	0%//D&sE,DEE 	.%--D&sE,HII 	2%11Dr   c                 *   | j         s| j        rt          d          t          |          t          u rd|f}|| vrt          d          |dk    rdS |\  }}t          j        ||          }t          j        | j        |          }|j	        |j
        fS )z%Get (chapter, page) of previous page.r  r   r  r  r    )r   r  r   r   r   rf   rX  fz_previous_pager   r  r   )r]   rT  r  r  r  prev_locs         r   prev_locationzDocument.prev_location  s     > 	=T. 	=;<<<==C 	#'lG$ 	86777v 	2$Wc22)$)S99..r   c                    i }|j         }|j                                        D ]
\  }}|||<   |j        j        j        }|j                                        }d|_        |                                 d}t          	                    d           | 
                    |          }|                                D ]\  }}||         }||j        |<   |dk    rn4|j                                        }	|	|k    sJ d|d|dd|	d            |S )zMake a fresh copy of a page.Nd   r   z	refs_old=z m_internal_old=z#xz m_internal_new=)r  r  rt  r   r   refsr  r   r   store_shrinkr  )
r]   r   r  r  rx  rM   refs_oldm_internal_oldr   m_internal_news
             r   reload_pagezDocument.reload_page.  sH   
k$**,, 	 	DAqJqMM4 9',3355	3~~c"" $$&& 	( 	(DAqqME"'DQq= 
	M
  "Y7799N!^3 M MLxLL>LLLLLLM M Mr   c                    |s|rdS dS 	 t          j        | j        |          \  }}}n+# t          $ r t          rt                       |rY dS Y dS w xY w|r|j        |j        f||fS t          j        | j        |          }|||fS )aM  Calculate internal link destination.

        Args:
            uri: (str) some Link.uri
            chapters: (bool) whether to use (chapter, page) format
        Returns:
            (page_id, x, y) where x, y are point coordinates on the page.
            page_id is either page number (if chapters=0), or (chapter, pno).
        )r   r   r   r   )r   r   r   )	rf   fz_resolve_linkr   r   r   rF   r  r   r  )r]   urir  r  xpypr  s          r   resolve_linkzDocument.resolve_linki  s      	 &%~8	/	3??KCRR 	 	 	#8(8(8(8 &%~~88		
  	3K*B220C@@B{s   ) !AAc                    	
 t           d          r j        S  fdt           j                  D             
d 		
fdfd}t	          j                   }t	          j        t	          j        |          d          }i }t	          j        d          }t	          j	        ||          }|
                                r |||           t	          j        ||          }|
                                r |||           | _        |S )af  Convert the PDF's destination names into a Python dict.

        The only parameter is the pymupdf.Document.
        All names found in the catalog under keys "/Dests" and "/Names/Dests" are
        being included.

        Returns:
            A dcitionary with the following layout:
            - key: (str) the name
            - value: (dict) with the following layout:
                * "page":  target page number (0-based). If no page number found -1.
                * "to": (x, y) target point on page - currently in PDF coordinates,
                        i.e. point (0,0) is the bottom-left of the page.
                * "zoom": (float) the zoom factor
                * "dest": (str) only occurs if the target location on the page has
                        not been provided as "/XYZ" or if no page number was found.
            Examples:
            {'__bookmark_1': {'page': 0, 'to': (0.0, 541.0), 'zoom': 0.0},
            '__bookmark_2': {'page': 0, 'to': (0.0, 481.45), 'zoom': 0.0}}

            or

            '21154a7c20684ceb91f9c9adc3b677c40': {'page': -1, 'dest': '/XYZ 15.75 1486 0'}, ...
        _resolved_namesc                 <    i | ]}                     |          |S r    )r  )rp   rq   r]   s     r   
<dictcomp>z*Document.resolve_names.<locals>.<dictcomp>  s'    KKKqdnnQ''KKKr   c                     t          j        d          }t          j        |          }t          j        || dd           |                                 t          |          S )z1Return string version of a PDF object definition.   r   r   )rf   fz_new_bufferFzOutputpdf_print_objr0  r  )r   rs  outputs      r   
obj_stringz*Document.resolve_names.<locals>.obj_string  sX    (--F^F++FQ222""$$$'///r   c                 4   ddd}|                                  rt          j        |           } |                                 r 	|           }n5|                                 r 	t          j        | d                    }n|S |                    dd          dd         }|                    d          }|dk     r||d	<   |S |d
|         }||d
         }||d	<   |                    d          rQ|d	= |	                                dd
         }t          t          t          |                    \  }}}||f|d<   ||d<   d|v r?
                    t          |	                                d                   d          |d<   nt          |          |d<   |S )z3Generate value of one item of the names dictionary.r   r(   )r   destrQ  ru  rJ   r   rj  r  Nz/XYZr  rL  0 Rr   r   )pdf_is_indirectrf   rs  r6  rA  r   r  ri   r   rl  r|   r  r+  r   r   )r   
templ_dictarrayr*  subvalarr_tr  r  rX  r  
page_xrefss            r   	get_arrayz)Document.resolve_names.<locals>.get_array  s   "$b11J""$$ 6055!! ""
3"" ""
5#6sC#@#@AA!! MM&#..qt4E **S//CQw "%*
6"!!4C4[F#$$KE!&Jv '' 'v&abb)E5 1 1221a$%q6
4 %&
6"  1%/^^Cq8I4J4J2%N%N
6""%([[
6"r   c                 D   t          j        |          }t          |          D ]z}t          j        ||          }t          j        ||          }|                                r|                                }nt          d| d           d}|r |          | |<   {dS )zyGenerate name resolution items for pdf_dict.

            This may be either "/Names/Dests" or just "/Dests"
            zkey z is no /NameN)rf   rB  r  rD  rC  rx  r@  rB   )	dest_dictpdf_dict
name_countrq   r  r   dict_keyr  s          r   	fill_dictz)Document.resolve_names.<locals>.fill_dict  s     +H55J :&& 
9 
9,Xq99,Xq99??$$ $"00HH21222333#H 9*3)C..Ih'
9 
9r   r	  Dests)r  r  r  r  rf   r  r   r  r  r   rA  pdf_load_name_tree)r]   r  r!  catalogr  dests	old_destsr:  r  r  r  s   `       @@@r   resolve_nameszDocument.resolve_names  sX   2 4*++ 	(''KKKKE$/4J4JKKK
	0 	0 	0&	 &	 &	 &	 &	 &	P	9 	9 	9 	9 	9, 1$77 %e&7&<&<fEE	 "7++ &w66	  "" 	,Ii+++ 'U33 	'Ii&&&(r   c                 Z   | j         s| j        rt          d          t          |          t          u rnWt          |d          rt	          |          }n7t          |d          r|j        }nt          |d          st          d          || j        k    r|st          d          | j        dk     rt          d          |r!| j        |k    s| j        rt          d	          |rt          |          d
k    s|r"t          |          d
k    rt          d          t          |           }t          j                    }||_        ||_        ||_        ||_        ||_        |	|_        ||_        ||_        |
|_        ||_        ||_        ||_        ||_        ||_        ||_        ||                    |           n||                    |           ||                    |           ||_        ||_        ||_         d}tC          |           d|j"        _#        tI          |           |dk    rtK          |           tM          |t                    rt          j'        |||           dS tQ          |          }t          j)        |||           |*                                 dS )z/Save PDF to file, pathlib.Path or file pointer.r  r   r   seek)filename must be str, Path or file objectz$save to original must be incrementalr   zcannot save with zero pageszincremental needs original file(   z"password length must not exceed 40Nr   )+r   r  r   r   r   r  r   r  r  r-  r   rf   PdfWriteOptionsdo_incrementaldo_asciido_compressdo_compress_imagesdo_compress_fontsdo_decompress
do_garbage	do_pretty	do_lineardo_cleando_sanitizedont_regenerate_iddo_appearance
do_encryptr  opwd_utf8_set_valueupwd_utf8_set_valuedo_preserve_metadatado_use_objstmsr  r$  r   r  JM_embedded_cleanJM_ensure_identityrz   pdf_save_documentr.  pdf_write_documentr0  )r]   r3   r  r  r  r  r  r  rT  r  r  r  
appearancer  r  r  r  r  r  r  r  r!  r  r1  s                           r   r  zDocument.save  s   4 > 	=T. 	=;<<<>>S  	JXv&& 	J8}}HHXv&& 	J}HH6** 	JHIIIty  	E 	ECDDD?Q 	<:;;; 	DyH$ D D !BCCC 	Cs7||b( 	CH 	CX9K 	CABBBt$$$&&)""0!.#! "+'$& 	.$$X.... 	.$$W--- 	.$$W---$5!)"43*+'#> 	$s###h$$ 	"#C488888'11C$S#t444!!!!!r   c                    | j         rt          d          t          |          t          u rnGt	          |d          rt          |          }n't	          |d          r|j        }nt          d          || j        k    rt          d          t          |           }t          |           t          j	        ||           dS )z.Save a file snapshot suitable for journalling.zdoc is closedr   r   r  zcannot snapshot to originalN)
r   r   r   r   r  r   r   r$  rf   pdf_save_snapshot)r]   r3   r!  s      r   save_snapshotzDocument.save_snapshotV  s    > 	._--->>S  	JXv&& 	J8}}HHXv&& 	J}HHHIIIty  	<:;;;t$$3X.....r   c                 P    |                      | j        dt          j                  S )z Save PDF incrementallyT)r  r  )r  r   rf   PDF_ENCRYPT_KEEPr\   s    r   saveIncrzDocument.saveIncrh  s    yyAWyXXXr   c                 6   | j         s| j        rt          d          | j        st          d          t	          |d          st          d          t          t          |                     }t          |          dk    s"t          |          |vst          |          |vrt          d          t          |           }t          dk    rt          j        ||           n"t          j        |t          |                     |                                  dS )	z,Build sub-pdf with page numbers in the list.r  r  r  zsequence requiredr   r  r  N)r   r  r   r  r  r  r-  r  r  r   r~   rf   pdf_rearrange_pages2r   rearrange_pages2r|   r  )r]   pylistevalid_ranger!  s       r   selectzDocument.selectl  s$   > 	=T. 	=;<<<{ 	*[)))w.. 	20111CII&&LLA 	37||;.	37||;.	3 1222 t$$ ') 	8&sG4444 "3g777 	r   c                     t          |           }t          |           |st          j        }nt          j        |          }t          j        ||           dS r  )r   r$  rf   r  rM  pdf_set_document_language)r]   r  r!  r  s       r   rO  zDocument.set_language  sU    t$$3 	@&DD5h??D'T222tr   c                 |   | j         rt          d          t          |                                                                           }|t                      k    rt          d          |rrt          |          t          t          fvrt          d          t          |                              |          }|t                      k    rt          d|z            |rrt          |          t          t          fvrt          d          t          |                              |          }|t                      k    rt          d|z            |rrt          |          t          t          fvrt          d          t          |                              |          }|t                      k    rt          d|z            |rt          |          t          t          fvrt          d	          |D ]w}	t          |	          t          t          fvrt          d
|	z            t          |	                              |          }|t                      k    rt          d|z            x|r<t          |          
                                }|dk    rd}|dvrt          d          t          |           }
t          |
           t          j        t          j        |
          t!          d          t!          d                    }|j        sdS |dk    r#t          j        |t!          d                    }n5t          j        t          j        |t!          d                    |          }|j        st          t(                    t+          ||||||           t          j        |
j                   dS )z5Set the PDF keys /ON, /OFF, /RBGroups of an OC layer.r   z document has no optional contentzbad type: 'on'zbad OCGs in 'on': %szbad type: 'off'zbad OCGs in 'off': %szbad type: 'locked'zbad OCGs in 'locked': %szbad type: 'rbgroups'zbad RBGroup '%s'zbad OCGs in RBGroup: %s	UNCHANGED	Unchanged)r  r  r  zbad 'basestate'r	  r  Nr   rQ  r  )r   r   r-  r  keysr   r{   r|   
differencer   upperr   r$  rf   r   r  r   r   r   rd  r  JM_set_ocg_arraysr  )r]   r  	basestater  offrbgroupsrI  r  r/  r  r!  r  r   s                r   	set_layerzDocument.set_layer  s   > 	0.///4==??''))**355= 	A?@@@ 	=Bxxe}, 3 !1222B""4((ACEEz = !7!!;<<< 	>Cyyu- 4 !2333C##D))ACEEz > !81!<=== 	AF||D%=0 7 !5666F&&t,,ACEEz A !;a!?@@@ 	DH~~dE]2 9 !7888 D DAww4-/ =$%7!%;<<<FF%%d++: D$%>%BCCCD  	4I,,..IK' ('	 :: 4 !2333t$$3!!3''  (( 
 ~ 	FR< 	$c8C==99CC%&Xi-@-@AA C ~ 	1/0003	2sHfEEEs~.....r   c                 x   t          t                    rAfd|                                 D             }|g k    rt          d d          |d         t	          |           }|sJ |dk    rt          j        |           dS |dk    rt          j        |           dS t          j        |           dS )z$Set / unset OC intent configuration.c                 8    g | ]}|d          k    |d         S )r:   r  r    )rp   uir  s     r   rr   z0Document.set_layer_ui_config.<locals>.<listcomp>  s,    ]]]r6
V\H\]bl]]]r   z	bad OCG 'r  r   r   ry   N)	rz   r   rN  r   r   rf   pdf_toggle_layer_config_uipdf_deselect_layer_config_uipdf_select_layer_config_ui)r]   r  r  r  r!  s    `   r   set_layer_ui_configzDocument.set_layer_ui_config  s     fc"" 	]]]]T-B-B-D-D]]]F| 9 !7V!7!7!7888AYFt$$


Q; 	:,S&99999q[ 	:.sF;;;;;,S&99999r   rn  c                    |                                  }|dk    rt          d          |rt          |t                    sdS dddd}t	          |                                                              |                                          sXdt	          |                                                              |                                           }t          |          d}|                    |           |	                                D ]K\  }}t          |                                          }|dvrt          d| d	| d
          |d| d| z  }L|dz  }|                     |d|           dS )zSet the PDF MarkInfo values.r   r  Frf  zbad MarkInfo key(s): rd  )rk  falsezbad key value 'z': 'r   rj  rl   re  rc  T)r  r   rz   r   r-  r  
issupersetr  r  rt  r   r  r*  )r]   rn  r   rm  badkeyspdfdictr  r   s           r   set_markinfozDocument.set_markinfo  s   !!19 	*[))) 	z(D99 	5 EuMM5::<<  ++HMMOO<< 	&]c(--//.B.B.M.Mejjll.[.[]]GW%%%X++-- 	) 	)JCe**""$$E-- F !D3!D!DE!D!D!DEEE(3(((((GG4$
G444tr   r  c                 \   d}|                                  }|dk    rt          d          |st          d          |d         dk    r
|dd         }|D ]I}|                                |                                k    r|                     |dd|             d	S Jt          d          )
zSet the PDF PageLayout value.)r  	OneColumnTwoColumnLeftTwoColumnRightTwoPageLeftTwoPageRightr   r  zbad PageLayout valuerj  r   Nr  Tr  r   r  r*  )r]   r  rm  r   rM   s        r   set_pagelayoutzDocument.set_pagelayout  s    m!!19 	*[))) 	53444a=C 	(#ABBJ 	 	A!!QWWYY. !!$g!gg>>>tt /000r   r  c                 \   d}|                                  }|dk    rt          d          |st          d          |d         dk    r
|dd         }|D ]I}|                                |                                k    r|                     |dd|             d	S Jt          d          )
zSet the PDF PageMode value.)r  UseOutlines	UseThumbs
FullScreenUseOCUseAttachmentsr   r  zbad PageMode valuerj  r   Nr  Tr,  )r]   r  rm  r   rM   s        r   set_pagemodezDocument.set_pagemode  s    `!!19 	*[))) 	31222A;# 	$|H 	 	A~~17799, !!$
GGG<<<tt -...r   c                 D   | j         s| j        rt          d          t          |           }t	          |           t          j        t          j        |          t          d                    }|j	        st          t          t                     t          j        |                    d                    }t          j        |t          d                    }|j	        rt          |||d           d	S t          j        ||t          j                    d          }t          j        |t          d          t          d                     t          j        |t          d          t          d                     t          j        |t          d          |           d	S )
z"Store XML document level metadata.r  r	  r  r$  r   r}  rC  XMLN)r   r  r   r   r$  rf   r   r  r   r   rx  MSG_BAD_PDFROOTry  rh  r  r   r  r  r  )r]   r  r!  r  r   r  s         r   set_xml_metadatazDocument.set_xml_metadata  s_   > 	=T. 	=;<<<t$$3!5#4c#:#:HV<L<LMM 	<_&:;;;2HOOG4L4LMM $(<(<==> 	Ac3Q/////&S%,..!DDCXf%5%5x
7K7KLLLXi%8%8(5//JJJhz&:&:C@@@@@r   c                    t          |           }t          |           t          j        t          j        |          t          d          t          d          t          d                    }t          j        |          rt          j        |          s|dk     rdS t          t                    |dk     rdS t          j
        ||           |r/t          j        |           t          j        |j                   dS dS )zActivate an OC layer.r	  r  r  r   Nr   )r   r$  rf   r   r  r   r6  rc  r   MSG_BAD_OC_LAYERpdf_select_layer_configpdf_set_layer_config_as_defaultr  r   )r]   r  
as_defaultr!  cfgss        r   switch_layerzDocument.switch_layer2  s   t$$3"!3''  ((##	  !4(( 	00CT0J0J 	0z .///A: 	F%sF333 	313777!3>22222	3 	3r   c                    | j         s| j        rt          d          t          |           }t	          |           t          j        |          }t          |d|dz
            st          dt          t                     t          |           t          ||          }t          j        |||           |rt          t          |                     dS dS )z!Replace object definition source.r  r   bad xrefN)r   r  r   r   r$  rf   rD  r]  rx  rE  r  r  r  r  JM_refresh_linksr   )r]   r   r:   r   r!  xreflennew_objs          r   r  zDocument.update_objectG  s    > 	=T. 	=;<<<t$$3$S))a++ 	@J.>???%c400T7333 	2l40011111	2 	2r   c                    | j         s| j        rt          d          t          |           }t	          j        |          }|dk     s||k    rt          t                    t	          j        ||d          }t	          j        |          st          t                    t          |          }|st          t                    t          ||||           d|_        dS )zReplace xref stream part.r  r   r   N)r   r  r   r   rf   rD  rE  rF  rA  MSG_IS_NO_DICTr   rv  r   r   dirty)	r]   r   r  newcompressr!  rC  r   r   s	            r   update_streamzDocument.update_streamW  s    > 	=T. 	=;<<<t$$$S))!8 	,tg~ 	,l+++$S$22 %% 	.n--- (( 	-^,,,c3111			r   c                 Z    t          |           }|j        rt          j        |          S dS )z1
        Count versions of PDF document.
        r   )r   r   rf   pdf_count_versionsr  s     r   version_countzDocument.version_counti  s1    
 t$$> 	1+C000qr   c                     ddl m}  |            }|                     ||||
||||||||	||||||||           |                                S )Nr   r5  )r  r  r  r  r  r  r  r  rT  r  r  r  r  r  r  r  r  r  r  )r4  r5  r  rM  )r]   r  r  r  r  r  r  rT  r  r  r  r  r  r  r  r  r  r  r  r  r5  bios                         r   writezDocument.writes  s    , 	gii		#%-+'%'!"3'#5) 	 	
 	
 	
, ||~~r   c                 ^    t          |            | j                            | j                  S zPDF xref number of page.r-  r   r  r  r\   s    r   r   zDocument.xref  *     	D{$$T[111r   c                 h   t          |           }t          |           t          j        |          }t	          |d|dz
            s|dk    rt          t                    |dk    rt          j        ||          }nt          j        |          }|j	        sdS t          j
        ||          }|j	        sdS d}t          j        |          rd}dt          j        |          z  }n%t          j        |          rd}nt          j        |          rd	}nt          j        |          rd
}dt          j        |          z  }nt          j        |          rd}nt          j        |          rd}d}nt          j        |          rd}t          j        |          rd}nkd}nht          j        |          rd}dt          j        |          z  }n:t          j        |          r$d}t1          t          j        |                    }nd}| t5          |dd          }	t7          |	          }||fS )z+Get PDF dict key value of object at 'xref'.r   r   r   )ru  ru  Nr   %i 0 Rr  r   r   z%ir+  ru  r  rk  r!  r   z/%sstringunknown)r   r$  rf   rD  r]  r   rE  rS  r  r   rt  r  r   r6  rA  
pdf_is_intr   pdf_is_realrO  ru  rv  rx  r@  pdf_is_stringr   r   JM_object_to_bufferr  )
r]   r   r  r!  rC  r   subobjr:   r   r   s
             r   rC  zDocument.xref_get_key  s]   t$$3$S))a++ 	,
 	,l+++!8 	)'T22CC#C((C~ 	$##$S#..  	$## (( 	De.v666DD'' 	DDv&& 	DDf%% 	D%*6222DDv&& 	DDv&& 	DDDv&& 	D (( v&& 	D5,V444DD (( 	D$U%=f%E%EFFDDD 	-%fa33C',,Dd|r   c                    t          |           }t          |           t          j        |          }t	          |d|dz
            s|dk    rt          t                    |dk    rt          j        ||          }nt          j        |          }t          j	        |          }g }|dk    r|S t          |          D ]>}t          j        t          j        ||                    }|                    |           ?|S )zFGet the keys of PDF dict object at 'xref'. Use -1 for the PDF trailer.r   r   r   )r   r$  rf   rD  r]  r   rE  rS  r  rB  r  r@  rD  r6   )	r]   r   r!  rC  r   rF  rh   rq   r  s	            r   xref_get_keyszDocument.xref_get_keys  s    t$$3$c**a++ 	,
 	,l+++!8 	*'d33CC#S))C$$6 	Iq 	 	A#U%;S!%D%DEECIIcNNNN	r   c                     | j         s| j        rt          d          |                     |d          d         dk    rdS dS )zCheck if xref is a font object.r  r}  r   z/FontTFr   r  r   rC  r]   r   s     r   xref_is_fontzDocument.xref_is_font  sQ    > 	=T. 	=;<<<T6**1-8 	4ur   c                     | j         s| j        rt          d          |                     |d          d         dk    rdS dS )z!Check if xref is an image object.r  rC  r   z/ImageTFrb  rc  s     r   xref_is_imagezDocument.xref_is_image  sQ    > 	=T. 	=;<<<T9--a0H< 	4ur   c                 l    t          |           }|sdS t          t          j        ||                    S )z!Check if xref is a stream object.F)r   r  rf   pdf_obj_num_is_streamr%  s      r   xref_is_streamzDocument.xref_is_stream   s7    t$$ 	5E/T::;;;r   c                     | j         s| j        rt          d          |                     |d          d         dk    rdS dS )z Check if xref is a form xobject.r  rC  r   z/FormTFrb  rc  s     r   xref_is_xobjectzDocument.xref_is_xobject  sQ    > 	=T. 	=;<<<T9--a0G; 	4ur   c                 T    d}t          |           }|rt          j        |          }|S )zGet length of xref table.r   )r   rf   rD  )r]   rC  r!  s      r   xref_lengthzDocument.xref_length  s1    t$$ 	.(--Gr   c                     | j         rt          d          t          rt          j        | j        |||          }|S t          |           }t          |           t          j	        |          }t          |d|dz
            s|dk    rt          t                    |dk    rt          j        ||          }nt          j        |          }t          t          j        |          ||          }t!          |          }	|	S )z#Get xref object source as a string.r   r   r   r   )r   r   r   r   r  r   r   r$  rf   rD  r]  rE  rS  r  r]  rs  JM_EscapeStrFromBuffer)
r]   r   r  rT  rN   r!  rC  r   r   r:   s
             r   r  zDocument.xref_object  s    > 	0./// 	#TYj%HHCJt$$3$S))a++ 	,
 	,l+++!8 	)'T22CC#C((C!%"<S"A"A:uUU%c**r   c           	         | j         rt          d          |r@t          |t                    r+t                              |          t                      dhfvrt          d          t          |t                    r@|r>|d         dk    rAt                              |dd                   t                      k    rt          d          t          |           }t          |           t          j
        |          }t          |d|dz
            s|dk    rt          t                    |dk    rt          j        ||          }nt          j        |          }t          |||          }|j        sdS |dk    rt          j        |||           dS t          j        |          }t'          |          D ]>}	t          j        |t          j        ||	          t          j        ||	                     ?dS )	z&Set the value of a PDF dictionary key.r   rj  z	bad 'key'r   r   Nzbad 'value'r   )r   r   rz   r   INVALID_NAME_CHARSintersectionr-  r   r$  rf   rD  r]  rE  rS  r  JM_set_object_valuer   r  rB  r  r  rD  rC  )
r]   r   r  r   r!  rC  r   rD  rF  rq   s
             r   r*  zDocument.xref_set_key+  s   > 	0./// 	**S#.. 	*2D2Q2QRU2V2V_b_d_dgjfk^l2l 	*[)))%%% 	,U 	,eAh#o 	,J\JiJijopqprprjsJtJtx{x}x}J} 	,]+++t$$3$S)) a++ 	,
 	,l+++2: 	)'T22CC#C((C%c366! 	F2: 		#Cw77777"7++A1XX  ".w::.w::    r   c                    | j         s| j        rt          d          t          |           }t	          |           t          j        |          }t          |d|dz
            s|dk    rt          t                    |dk    rt          j	        ||d          }nt          j
        |          }d}t          j        |          r$t          j        ||          }t          |          }|S )zGet decompressed xref stream.r  r   r   r   N)r   r  r   r   r$  rf   rD  r]  rE  rF  r  r   pdf_load_stream_numberr   r]   r   r!  rC  r   r   r   s          r   xref_streamzDocument.xref_streamR  s    > 	=T. 	=;<<<t$$3$c**a++ 	,
 	,l+++19 	*(#tQ77CC#S))C$$ 	'.T::C #&&Ar   c                    | j         s| j        rt          d          t          |           }t	          |           t          j        |          }t          |d|dz
            s|dk    rt          t                    |dk    rt          j	        ||d          }nt          j
        |          }d}t          j        |          r$t          j        ||          }t          |          }|S )z&Get xref stream without decompression.r  r   r   r   N)r   r  r   r   r$  rf   rD  r]  rE  rF  r  r   pdf_load_raw_stream_numberr   rv  s          r   xref_stream_rawzDocument.xref_stream_rawe  s    > 	=T. 	=;<<<t$$3$c**a++ 	,
 	,l+++19 	*(#tQ77CC#S))C$$ 	'2C>>C #&&Ar   c                 j   t          |           }t          |           t          j        t          j        |          t          d                    }|j        st          t          t                     t          j        |t          d                    }d}|j        rt          j
        |          }|S )z"Get xref of document XML metadata.r	  r$  r   )r   r$  rf   r   r  r   r   rx  r7  ry  r   )r]   r!  r  r  r   s        r   xref_xml_metadatazDocument.xref_xml_metadatax  s    t$$3!5#4c#:#:HV<L<LMM 	<_&:;;; $(<(<==> 	*#S))Dr   )r   r  r  __dict__c                     | j         S r   )r  r\   s    r   <lambda>zDocument.<lambda>  s    DM r   )r  Nr  )NNNNr   r   r  r  r  NN)r   r  r  NNr   NN)r   r   NN)r   r   r   )r   )r   r   N)r   FTTTFFFFFr   r  NNTr   r   r   F)r   r   r   r   TTr   r   )	r   r   r   r   r   r   r   r   Nr   )Nr   r   r  r  rW   )r   r   r   r   r   r   r   r   r   r   r   r   r   r  NNr   r   r   )NNNNN)r   Nr   r   )FFFFFFFFFFFFr   r  NNr   r   r   )r`   ra   rb   r  r  r  ra  rd  r   r  r^   r  r   r   r  r  r"  r&  r/  typingUnionr4  r:  r<  rF  rH  rJ  rY  r   r\  rn  rx  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r"  r%  r  r  
ByteStringr  r9  r;  r>  r   r@  r   rF  r{   r1  OptBytesrI  rY  r  r  r  r  r  r  r  r  r(  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r#  r'  r*  r2  r6  r9  r<  r  rC  rN  rP  r  r[  ra  rn  rp  r   r}  r  r  r  r  r  r  r  r  r  sysimplementationversioncollectionsabcIterable
_pages_retOptIntr  r  r  r  r  r  r  r  r  r  r  r  rO  r  r  r%  r-  r4  r8  r?  r  rJ  rM  rQ  r   rC  r`  rd  rf  ri  rk  rm  r  r*  rw  rz  r|  	__slots__outliner  	is_streamr    r   r   r   r   *
  s       4    ,; ; ; ;.    ! !S ! ! ! !~< ~< ~< ~<@    U# U U U U) ) )(  @9 9 9+ + +  	v|CH'= 	# 	 	 	 	   @
+ 
+ 
+- - -^% % %*" " " "HD D DL% % % % % S # C 3 WZ ad    >  @  ) ) )$     (
 
 
 
	 	 	/ / /7  7  7 r   2) ) )	8 	8 	8	  	  	 ' ' 'H H H H8   X(/ / / /E E E EN
 
 
9 9 9 &*4 @ @ @d @D @D @ @ @ @( 3 3 X3    $   .; ;S ;c ; ; ; ;2< < <   s        4@  @  @ J ##& &&&& & 	&
 & & & & &P)s ) ) ) )&S#X 6 & & & &	*S#X 6 	*5 	* 	* 	* 	*c3h!7 D    ,t      $"# ,sCx(  	
     >0 0 0 0dP P Pj  )- - - -^/ / /7  7  7  7 r   .  4	 	 	* * *X  $ # T T    $
 
3 
d 
d 
 
 
 
S T         "{ { {0 ) ) ) )\ l( l( l( l(^ $ $ X$   X   X,   X ; ; X;   X
8 
8 
8& & &  P P P      " " "4 4 4 4% % %   
9 
9 X
9 / / X/  4   (  <% % %   $    X:; ;S ;c ; ; ; ;(   X   0   X/ / /*  $ 	5 	5 X	5  *    $ C    X #    X !F* 4 _-

 _-d3
( (6 (v (6 (T^ ( ( ( (6  H H H H   X0/ / / 9 9 9 9 9 9v   4y y y|  +V" V" V" V"p/ / /$Y Y Y     <   @/ @/ @/ @/D: : : :$T d    .1 1 1 1 1 /S / / / / A A A&3 3 3 3*2 2 2 2    $   X   ). . . .` 2 2 X2
1 1 1f  (    < < < <       (% % %N  &  &   CIh1122GGIIIr   r   c                   4    e Zd Zd Zd Zd	dZd Zd Zd ZdS )
DocumentWriterc                     | S r   r    r\   s    r   ra  zDocumentWriter.__enter__  rb  r   c                 .    |                                   d S r   r  r  s     r   rd  zDocumentWriter.__exit__  r  r   r(   c                    t          |t                    rn7t          |d          rt          |          }nt          |d          r|j        }t          |t                    r,t	          j        ||t          j        j                  | _        d S t          |          }t	          j        ||t          j        j	                  | _        |
                                dk    sJ t          | j        d          sJ d S )Nr  r   r   _out)rz   r   r  r   rf   FzDocumentWriterPathType_PDFr   r.  OutputType_PDFr  )r]   r1   r  r1  s       r   r^   zDocumentWriter.__init__  s    tS!! 	dJ'' 	::DDdF## 	9DtS!! 	/.gu?U?bccDIII (..C.We>T>cddDI''))Q....DIv.......r   c                 v    t          |          }t          j        | j        |          }t	          |          }|S r   )r  rf   fz_begin_pager   r  )r]   r  	mediabox2r  device_wrappers        r   
begin_pagezDocumentWriter.begin_page  s6    #H--	$di;;&//r   c                 8    t          j        | j                   d S r   )rf   fz_close_document_writerr   r\   s    r   r  zDocumentWriter.close  s    &	22222r   c                 8    t          j        | j                   d S r   )rf   fz_end_pager   r\   s    r   end_pagezDocumentWriter.end_page  s    49%%%%%r   Nr(   )	r`   ra   rb   ra  rd  r^   r  r  r  r    r   r   r  r    ss            / / / /.  3 3 3& & & & &r   r  c                   ~   e Zd Zd Z	 	 	 	 	 	 	 	 	 	 ddZd Zd Zed	             Zed
             Z	ed             Z
ddZed             Zed             Zd dZd!dZed             Zd Zd dZed             Zed             Zed             Zed             Zed             Zed             ZddZd Zd ZdS )"r  c                 6    t          |           t          urd S d S r   )r   r  r\   s    r   r  zFont.__del__  s$    ::T! 	4	 	r   Nr   r   r   c                 "   |rmt          |d          r|                                }n$t          |t                    rt	          |          }t          |t                    st          d          t          |t                    r|                                }d|v sd|v sd|v rt          d           |dv rd}n|	                    d	          rd
}n|	                    d          rd}nq|	                    d          rd}nY|t                                          v rdd l}|                    |          }d }~n!|dk     rt                              ||          }t!          j        |          }t%          |||||||||	|

  
        }|| _        d S )NrM  zbad type: 'fontbuffer'rj  \rs   z!Warning: did you mean a fontfile?)cjkchina-tchina-tsr   china-sr   korear   japanry   )r  rM  rz   r3  r   r   r   r  rB   r   fitz_fontdescriptorsr  pymupdf_fontsmyfontBase14_fontdictr   rf   rM  JM_get_fontr   )r]   r   r  r  scriptr  r_  is_bold	is_italicis_serifembedfname_lowerr  r  r/  s                  r   r^   zFont.__init__  s     	;z:.. /'0022

J	22 /":..
j%00 ; !9:::h$$ 	C"..**Kk! =T[%8 =C;<N =;<<<<< C''	22 C''00 C''00 	C 4 9 9 ; ;; C$$$$*11+>>
!MA C*..xBB1(;;8XvtXIx8 8 			r   c                     d| j         z  S )Nz
Font('%s')r   r\   s    r   r   zFont.__repr__  s    di''r   c                     J d            )Nr   zHNot implemented because implementation requires FT_Get_First_Char() etc.r    )r]   r  s     r   _valid_unicodeszFont._valid_unicodes  s    \\\\\r   c                 4    t          j        | j                  S )z Return the glyph ascender value.)rf   fz_font_ascenderr   r\   s    r   ascenderzFont.ascender       %di000r   c                 4    | j                                         S r   )r   fz_font_bboxr\   s    r   r   z	Font.bbox  s    y%%'''r   c                     t          j        t          j        | j        j        j                            }t          j        |          S r   )rf   r  rr  r   r   rs  fz_buffer_extract_copy)r]   r   s     r   rs  zFont.buffer  s5    .%"949;O;V"W"WXX+W555r   r  c           	      D   t          j        |          }g }|D ]}	t          |	          }
|r(t          j        | j        |
          }|dk    r| j        }nt          j        | j        |
||          \  }}|                    |t          j        |||          z             |S )z@Return tuple of char lengths of unicode 'text' under a fontsize.r   )rf   rM  ordfz_encode_character_scr   !fz_encode_character_with_fallbackr6   ri  )r]   r:   r   r  r  wmode
small_capsr  rh   chry  gidr/  s                r   char_lengthszFont.char_lengths  s    1(;; 	K 	KBBA `249a@@!8 %9D!CDIqRXZ^__	TIIh!7c5!I!IIJJJJ	r   c                 4    t          j        | j                  S )z!Return the glyph descender value.)rf   fz_font_descenderr   r\   s    r   	descenderzFont.descender  s     &ty111r   c                 p   t          j        | j        j                  }|sd S t	          |t           j                  sJ t          r|j        gfd} |d          } |d          } |d          } |d          } |d          } |d          } |d          }	 |d          }
 |d          } |d          } |d          } |d          } |d          }t          r|n|j        t          r|n|j        t          r|n|j	        t          r|n|j
        t          r|n|j        t          r|n|j        t          r|	n|j        t          r|
n|j        t          r|n|j        t          r|n|j        t          r|n|j        t          r|n|j        t          r|n|j        t          r|n|j        dS )Nc                 F    d         d| z  dz
  z  }d         | z	  d<   |S r  r    )bitsrN   rM   s     r   r  zFont.flags.<locals>.b*  s/    dqDy!m,tt|!
r   r   )monoserifr$  r8  
substitutestretchz	fake-boldzfake-italicopentypezinvalid-bboxr  zcjk-langr  znever-embed)rf   ll_fz_font_flagsr   r   rz   fz_font_flags_tre   is_monor  r  r  ft_substitute
ft_stretch	fake_boldfake_italichas_opentypeinvalid_bboxr  cjk_langr  never_embed)r]   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rM   s                   @r   r  z
Font.flags   s   "49#788 	F1e344444 	A     addGqttHaddG!IAaDDM1J!I!A$$K1Q44L1Q44LqttHAaDDE!A$$K+6 EAI,7 GQZ+6 EAI-8 I		ak1< Q!/.9 K

q|-8 I		ak/: M0; O0; O,7 BQU,7 GQZ)4 A!'/: M  	r   c                     t          j        |          }|r(t          j        | j        |          }|dk    r| j        }nt          j        | j        |||          \  }}t          j        |||          S )z2Return the glyph width of a unicode (font size 1).r   )rf   rM  r  r   r  ri  )	r]   chr_r  r  r  r  r  r  r/  s	            r   glyph_advancezFont.glyph_advanceL  sv    1(;; 	_.ty$??Cax !y?	4QWY]^^IC%dC777r   c                 $   t          j        |          }|r(t          j        | j        |          }|dk    r| j        }nt          j        | j        |||          \  }}t          t          j        ||t          j                                        S )z1Return the glyph bbox of a unicode (font size 1).r   )rf   rM  r  r   r  r   fz_bound_glyphr9  )r]   charr  r  r  r  r  r/  s           r   
glyph_bboxzFont.glyph_bboxW  s    1(;; 	`.	4@@Cax !y?DRXZ^__ICE($U^5E5EFFGGGr   c                 $    | j         j        j        S r   )r   r   glyph_countr\   s    r   r  zFont.glyph_countb  s    y#//r   c                      t          |          S )z$Return the unicode for a glyph name.)glyph_name_to_unicoderY  s     r   r  zFont.glyph_name_to_unicodef  s    $T***r   c                     |r4t          j        |          }t          j        | j        |||          \  }}n7|rt          j        | j        |          }nt          j        | j        |          }|S )z0Check whether font has a glyph for this unicode.)rf   rM  r  r   r  rh  )	r]   chrr  r  fallbackr  r  r  r/  s	            r   	has_glyphzFont.has_glyphj  ss     	@5h??D?	3PVX\]]IC @249cBB/	3??
r   c                 4    t          j        | j                  S r   )rf   fz_font_is_boldr   r\   s    r   r  zFont.is_boldv  s    $di000r   c                 4    t          j        | j                  S r   )rf   fz_font_is_italicr   r\   s    r   r  zFont.is_italicz  s    &	222r   c                 4    t          j        | j                  S r   )rf   fz_font_is_monospacedr   r\   s    r   is_monospacedzFont.is_monospaced~  s    *DI666r   c                 4    t          j        | j                  S r   )rf   fz_font_is_serifr   r\   s    r   r  zFont.is_serif  s    %ty111r   c                     dS r  )r   rf   r  r   re   cppyygbl"mupdf_mfz_font_flags_ft_substituter  ll_fz_font_t3_procspdf_font_writing_supported)r]   r/  r  r  r  s        r   is_writablezFont.is_writable  s    tr   c                 8    t          j        | j                  }|S r   )rf   fz_font_namer   r  s     r   r   z	Font.name  s     ++
r   c                 j   | j         }t          j        |          }d}	t          |t                    st          t                    |D ]d}
t          |
          }|rt          j        ||          }|dk    r|}nt          j	        ||||          \  }}|	t          j
        |||          z  }	e|	|z  }	|	S )z1Return length of unicode 'text' under a fontsize.r   )r   rf   rM  rz   r   rv  MSG_BAD_TEXTr  r  r  ri  )r]   r:   r   r  r  r  r  thisfontr  rh   r  ry  r  r/  s                 r   text_lengthzFont.text_length  s    91(;;$$$ 	+\*** 	; 	;BBA _28Q??!8 $#D!CHaQWY]^^	T%(sE:::BB
h	r   c                      t          |          S )z$Return the glyph name for a unicode.)unicode_to_glyph_name)r]   r  s     r   r	  zFont.unicode_to_glyph_name  s    $R(((r   c                     g S )z5
        list of valid unicodes of a fz_font
        )r  r  buffer_infor  sortedr-  )r]   r  gccpr  s        r   valid_codepointszFont.valid_codepoints  s	     	r   )
NNNr   Nr   r   r   r   r   )r  Nr   r   r   )Nr   r   r   )Nr   r   )r`   ra   rb   r  r^   r   r  r  r  r   rs  r  r  r  r  r  r  r  r  r  r  r  r  r	  r   r
	  r	  r	  r    r   r   r  r    sS          1 1 1 1f( ( (] ] ] 1 1 X1 ( ( X( 6 6 X6    2 2 X2 ) ) X)V	8 	8 	8 	8	H 	H 	H 	H 0 0 X0+ + +
 
 
 
 1 1 X1 3 3 X3 7 7 X7 2 2 X2   X$   X
   &) ) )/ / / / /r   r  c                       e Zd Zd Zd ZdS )r  c                 D    t          |           t          urd S d| _        d S r  )r   r  r   r\   s    r   r  zGraftmap.__del__  s%    DzzX% 	Fr   c                     t          |          }t          |           t          j        |          }|| _        d| _        d S r  )r   r$  rf   pdf_new_graft_mapr   r   )r]   r   dstmap_s       r   r^   zGraftmap.__init__  s<    s##3&s++	r   N)r`   ra   rb   r  r^   r    r   r   r  r    s2          
    r   r  c                      e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
ed	             Zed
             Zed             Zedefd            Zed             Zed             Zed             ZddZddZd Zed             ZdZdS )Linkc                 .    |                                   d S r   )r   r\   s    r   r  zLink.__del__  s    r   c                 L    t          |t          j                  sJ || _        d S r   )rz   rf   FzLinkr   )r]   r   s     r   r^   zLink.__init__  s%    4.....			r   c                 N    t          |            dt          | j                  z   S Nzlink on r-  r   r   r\   s    r   r   zLink.__repr__  %    DC,,,,r   c                 N    t          |            dt          | j                  z   S r	  r 	  r\   s    r   r   zLink.__str__  r!	  r   c                     t          |          }|sd S t          j        ||d          }|j        sd S t	          |          }|S rW   )r   rf   rF  r   rM  r]   r   r   r!  link_objr  s         r   _borderzLink._border  sR    s## 	F)#tQ77" 	FH%%r   c                     t          |          }|sd S t          j        ||d          }|j        st	          t
                    t          |          }|S rW   )r   rf   rF  r   r   rE  r\  r$	  s         r   _colorszLink._colors  s[    s## 	F)3a88" 	,l+++X&&r   c                 "    d | _         d| _        d S r  )r   r   r\   s    r   r   zLink._erase  s    r   c                     t          |          }|sd S t          j        ||d          }|j        sd S t	          |||          }|S rW   )r   rf   rF  r   r  )r]   rP  r   r   r!  r%	  r  s          r   
_setBorderzLink._setBorder  sV    s## 	F)#tQ77" 	FX66r   c                 V    |                      | j        j        j        | j                  S r   )r&	  r   r   r   r\   s    r   rP  zLink.border       ||DK.3TY???r   c                 V    |                      | j        j        j        | j                  S r   )r(	  r   r   r   r\   s    r   r   zLink.colors	  r-	  r   c                 f   t          | d          r| j        t          d          | j        j        j        s| j        j        j        rt          d          | j        j        }| j        s| j                            d          rd}n|                    | j                  }t          | ||          S )z Create link destination details.r   Norphaned object: parent is Noner  #)
r  r   r   r   r  is_externalr  r   r  linkDest)r]   r   r  s      r   r  z	Link.dest  s     4"" 	@t{ 	@>???;' 	=4;+=+J 	=;<<<k  	-tx22377 	-CC""48,,Cc3'''r   r  c                     t          |            | j        j        }|j        sdS |                    | j        d          }|d         dk    rt          |d                   S dS )Nr   ro  r   ru  )r-  r   r  rC  r   r   )r]   r   r  s      r   r  z
Link.flags  se    Dk z 	1TY,,Q46> 	qt99qr   c                     t          |            t          rt          j        | j                  S | j        }|j        r|j        j        sdS t          t          j	        |j        j                            S )zFlag the link as external.F)
r-  r   r   Link_is_externalr   r   r  r  rf   fz_is_external_linkr]   	this_links     r   r2	  zLink.is_external(  sp     	D 	6)49555I	# 	9+?+C 	5U.	0D0HIIJJJr   c                 :   | j         j        sdS t          |            	 | j                                         }|j        sdS t          |          }|rd|_        | j	        |_	        ||j	        j
        t          |          <   | j        dk    rd | j	                                        D             }d | j	                                        D             }|                    | j                  }||dz            |_        ||dz            |_        nd|_        d|_        |S )z
Next link.Nr   Tc                 J    g | ] }|d          t           j        k    |d         !S r   r   rf   PDF_ANNOT_LINKr  s     r   rr   zLink.next.<locals>.<listcomp>E  s.    fffq1QVQeIefadfffr   c                 J    g | ] }|d          t           j        k    |d         !S )r   ry   r=	  r  s     r   rr   zLink.next.<locals>.<listcomp>F  s-    dddQqtuOcGcdAaDdddr   r   r(   )r   r   r-  r   r   	Link_nextr  r	  r   r   r  r  r   annot_xrefsr2  )r]   r   
link_xrefslink_idsr*  s        r   r  z	Link.next3  s    y# 	4D	# )..""C~ 	4Cjj 	CKCJ.1CJ"2c77+y1} ffDK,C,C,E,Efff
dd$+*A*A*C*Cddd &&ty11%cAg.!#'*
r   c                     t          |            | j        r| j        j        st          d          | j        sJ | j        j        sJ t	          | j                                                  }t          |          }|S )zRectangle ('hot area').z"self.this.m_internal not available)r-  r   r   r   r.  r   r   r  s     r   r   z	Link.rectO  s     	D y 	C	 4 	CABBByy####ty~~//003ii
r   Nr   c                     t          |          t          ur|||d}|                     || j        j        j        | j                  S )N)r  r  r  )r   r   r+	  r   r   r   )r]   rP  r  r  r  s        r   r!  zLink.set_border]  sE    <<t# 	H$uGGFvt{'9'>	JJJr   c                    t          |            | j        j        }t          |          t          ur||d}|                    d          }|                    d          }|t          d           |g dfv r|                    | j        dd           dS t          |d	          rt          |          g}t          |           t          |          d
v sJ dt          |           d}|                    | j        d|           dS )zSet border colors.r#  r   r$  Nz!warning: links have no fill colorr    r  r%  r&  r'  r(  r)  )r-  r   r   r   r   rB   r*  r   r  r+  r,  r-  r}   )r]   r   r$  r   r   r/  s         r   r0  zLink.set_colorsb  s   Dk <<t# 	6"f55Fzz&!!H%% 	97888b"X 	TYT222F6;'' 	%Fmm_F66{{i''''$	&!!$$$C+++++r   c                    t          |            | j        j        }|j        st          d          t	          |          t
          urt          d          |                    | j        dt          |                     d S )Nr  zbad 'flags' valuero  )	r-  r   r  r   r   r   r*  r   r   )r]   r  r   s      r   r3  zLink.set_flagsv  sy    Dk z 	*[)))E{{c! 	20111CU444tr   c                 z    t           rt          j        | j                  S | j        }|j        r|j        j        ndS )zUri string.r(   )r   r   link_urir   r   r  r8	  s     r   r  zLink.uri  s>      	->$),,,I	+4+?Gy#''RGr   r   )Nr   NNr  )r`   ra   rb   r  r^   r   r   r&	  r(	  r   r+	  r  rP  r   r  r   r  r2	  r  r   r!  r0  r3  r  r   r    r   r   r	  r	    s           - - -- - -         @ @ X@ @ @ X@ ( ( X( S    X K K XK   X6   XK K K K
, , , ,(   H H XH DDDr   r	  c                       e Zd Zd Zd Zd Zd Zd ZddddddddZd	 Z	d
 Z
d Zd Zd Zd Zd Zd Zd Zd Zd ZddZed             Zd Zd Zd Zd Ze	ZeZeZdS )r<  c                 X    t          j        t          d | D                                 S )Nc                     g | ]}||z  S r    r    rp   ry  s     r   rr   z"Matrix.__abs__.<locals>.<listcomp>      000aac000r   mathsqrtsumr\   s    r   __abs__zMatrix.__abs__  )    y00400011222r   c           
         t          |d          rDt          | j        |z   | j        |z   | j        |z   | j        |z   | j        |z   | j        |z             S t          |          dk    rt          d          t          | j        |d         z   | j        |d         z   | j        |d         z   | j        |d         z   | j        |d         z   | j        |d	         z             S 
Nr&  r   Matrix: bad seq lenr   r   ry   r   r  r
   
r  r<  r   r  ry  r  r'  r  r-  r   r  s     r   __add__zMatrix.__add__      1k"" 	>$&1*dfqj$&1*&1*dfqj$&1*> > >q66Q; 	42333dfqtmTVad]DFQqTM&1Q4-!A$1G G 	Gr   c                 X    t          |           t          |           cxk    odk    nc  S rW   r  r  r\   s    r   __bool__zMatrix.__bool__  3    IIT////a////00r   c                 t    t          |d          sdS t          |          dk    ot          | |z
            du S )Nr  Fr   r  r-  r  )r]   r=  s     r   __eq__zMatrix.__eq__  s?    sI&& 	53xx1}:dSj!1!1U!::r   c                 Z    | j         | j        | j        | j        | j        | j        f|         S r   r   r  ry  r  r'  r  r  s     r   r  zMatrix.__getitem__  s&    ?BBr   Nrc	  c                   |s,dx| _         x| _        x| _        x| _        x| _        | _        nt          |          dk    rt          d          t          |          dk    r<t          t          |          \  | _         | _        | _        | _        | _        | _        nt          |          dk    rqt          |d         t          j                  rn|d         j         | _         |d         j        | _        |d         j        | _        |d         j        | _        |d         j        | _        |d         j        | _        nt          |d         d          rt          j        |d                   }t!          t          j        |          d          }	t!          t          j        |          d          }
|	x| _         | _        |
| _        |
 | _        dx| _        | _        nJt          t          |d                   \  | _         | _        | _        | _        | _        | _        nt          |          dk    st          |          d	k    r`|d         dk    rTt          |d                   ddt          |d                   ddf\  | _         | _        | _        | _        | _        | _        nt          |          d	k    r`|d         dk    rTd
t          |d                   t          |d                   d
ddf\  | _         | _        | _        | _        | _        | _        nt          d          ||| _         ||| _        ||| _        ||| _        ||| _        |	|| _        dS dS )a  
        Matrix() - all zeros
        Matrix(a, b, c, d, e, f)
        Matrix(zoom-x, zoom-y) - zoom
        Matrix(shear-x, shear-y, 1) - shear
        Matrix(degree) - rotate
        Matrix(Matrix) - new copy
        Matrix(sequence) - from 'sequence'
        Matrix(mupdf.FzMatrix) - from MuPDF class wrapper for fz_matrix.
        
        Explicit keyword args a, b, c, d, e, f override any earlier settings if
        not None.
        r[  r   rW	  r   r   r&     ry   r   r\  zMatrix: bad argsN)r   r  ry  r  r'  r  r-  r   r  r+  rz   rf   r9  r  rP	  radiansroundcossin)r]   r   r  ry  r  r'  r  r  thetac_s_s              r   r^   zMatrix.__init__  s     	1BEEDFETVEdfEtvEYY] 	12333YY!^ 	1=@=M=M:DFDFDFDFDFDFFYY!^ 	1$q'5>22 Uaaaaaaa+.. 	UT!W--48E??A..48E??A.."$$"%%ADUDQRGATAT>YY!^ 	1s4yyA~ 	1$q'Q, 	1=B47^^S%Q..#s>3:DFDFDFDFDFDFFYY!^ 	1Q1 	1=@d1gd1gS#>>:DFDFDFDFDFDFF /000 &QDF&QDF&QDF&QDF&QDF&QDFFF&&r   c                 L    t                      }|                    |            |S )zCalculate inverted matrix.)r<  invert)r]   m1s     r   
__invert__zMatrix.__invert__  s    XX
		$	r   c                     dS )Nr   r    r\   s    r   r  zMatrix.__len__      qr   c           	          t          |d          rDt          | j        |z  | j        |z  | j        |z  | j        |z  | j        |z  | j        |z            S t          dd          }|                    | |          S )Nr&  r   )	r  r<  r   r  ry  r  r'  r  concat)r]   rH  ro	  s      r   __mul__zMatrix.__mul__  sx    1k"" 	>$&1*dfqj$&1*&1*dfqj$&1*> > >Aa[[yyq!!!r   c                 r    t          | j         | j         | j         | j         | j         | j                   S r   )r<  r   r  ry  r  r'  r  r\   s    r   __neg__zMatrix.__neg__  s2    tvgw$&46'DF7KKKr   c                 X    t          |           t          |           cxk    odk    nc  S rW   r\	  r\   s    r   __nonzero__zMatrix.__nonzero__  r^	  r   c                      t          |           S r   )r<  r\   s    r   __pos__zMatrix.__pos__  s    d||r   c                 @    dt          t          |                     z   S )Nr<  r   r|   r\   s    r   r   zMatrix.__repr__  s    #eDkk****r   c                     t          |          }|dk    r|| _        nU|dk    r|| _        nG|dk    r|| _        n9|dk    r|| _        n+|dk    r|| _        n|dk    r|| _        nt          d          d S )Nr   r   ry   r   r  r
   index out of range)r+  r   r  ry  r  r'  r  r  r]   rq   rM   s      r   __setitem__zMatrix.__setitem__  s    !HH!V 	3aTVV!V 	3aTVV!V 	3aTVV!V 	3aTVV!V 	3aTVV!V 	3aTVV1222r   c           
         t          |d          rDt          | j        |z
  | j        |z
  | j        |z
  | j        |z
  | j        |z
  | j        |z
            S t          |          dk    rt          d          t          | j        |d         z
  | j        |d         z
  | j        |d         z
  | j        |d         z
  | j        |d         z
  | j        |d	         z
            S rV	  rX	  r  s     r   __sub__zMatrix.__sub__  rZ	  r   c           	      f   t          |d          rVt          | j        dz  |z  | j        dz  |z  | j        dz  |z  | j        dz  |z  | j        dz  |z  | j        dz  |z            S t          |          d         }|st          d          t          dd          }|
                    | |          S Nr&  r\  r   zmatrix not invertible)r  r<  r   r  ry  r  r'  r  util_invert_matrixZeroDivisionErrorrt	  )r]   rH  ro	  m2s       r   __truediv__zMatrix.__truediv__  s    1k"" 	G$&2+a-"QA&2+a-"QAG G G""1% 	=#$;<<<Aa[[yyr"""r   c                     t          |          t          |          cxk    rdk    sn t          d          t          ||          \  | _        | _        | _        | _        | _        | _        | S )z.Multiply two matrices and replace current one.r   rW	  )	r-  r   util_concat_matrixr   r  ry  r  r'  r  )r]   onetwos      r   rt	  zMatrix.concat  sz    3xx3s88 	4 	4 	4 	4q 	4 	4 	4 	423339KCQT9U9U6r   c                     |t          |           }nt          |          }|d         dk    rdS |d         \  | _        | _        | _        | _        | _        | _        dS )z}Calculate the inverted matrix. Return 0 if successful and replace
        current one. Else return 1 and do nothing.
        Nr   r   )r	  r   r  ry  r  r'  r  )r]   r  r	  s      r   rn	  zMatrix.invert  sd      	*$T**CC$S))Cq6Q; 	19<Q6qr   c                     t          | j                  t          k     rt          | j                  t          k     p9t          | j                  t          k     ot          | j                  t          k     S )z,True if rectangles are mapped to rectangles.)r  r  EPSILONry  r   r  r\   s    r   is_rectilinearzMatrix.is_rectilinear+  sR     DFg%?#df++*? >[[7"<s46{{W'<	>r   c                    t          |          }|dk     r|dz  }|dk     |dk    r|dz  }|dk    t          d|z
            t          k     rnt          d|z
            t          k     r8| j        }| j        }| j        | _        | j        | _        | | _        | | _        nBt          d|z
            t          k     r5| j         | _        | j         | _        | j         | _        | j         | _        nt          d|z
            t          k     r7| j        }| j        }| j         | _        | j         | _        || _        || _        nt          j        |          }t          j	        |          }t          j
        |          }| j        }| j        }||z  || j        z  z   | _        ||z  || j        z  z   | _        | |z  || j        z  z   | _        | |z  || j        z  z   | _        | S )z2Calculate pre rotation and replace current matrix.r   rq  g     V@g     f@g     p@)r+  r  r	  r   r  ry  r  rP	  rf	  ri	  rh	  )r]   rj	  r   r  radr/  ry  s          r   	prerotatezMatrix.prerotate1  s   eai%#eai%sl(ESLEesl(q5y>>G# "	(( 	(AAVDFVDFRDFRDFF') 	(fWDFfWDFfWDFfWDFF') 	(AAfWDFfWDFDFDFF ,u%%CAAAAUQZ'DFUQZ'DFBFQZ'DFBFQZ'DFr   c                     t          |          }t          |          }| xj        |z  c_        | xj        |z  c_        | xj        |z  c_        | xj        |z  c_        | S )z1Calculate pre scaling and replace current matrix.r+  r   r  ry  r  )r]   sxsys      r   prescalezMatrix.prescale\  sY    2YY2YY""""r   c                 
   t          |          }t          |          }| j        | j        }}| xj        || j        z  z  c_        | xj        || j        z  z  c_        | xj        ||z  z  c_        | xj        ||z  z  c_        | S )z2Calculate pre shearing and replace current matrix.r	  )r]   r  rM   r   r  s        r   preshearzMatrix.preshearf  s|    !HH!HHvtv1!df*!df*!a%!a%r   c                     t          |          }t          |          }| xj        || j        z  || j        z  z   z  c_        | xj        || j        z  || j        z  z   z  c_        | S )z5Calculate pre translation and replace current matrix.)r+  r'  r   ry  r  r  r  )r]   txtys      r   pretranslatezMatrix.pretranslateq  s_    2YY2YY"tv+TV++"tv+TV++r   r   )r`   ra   rb   rS	  rY	  r]	  ra	  r  r^   rp	  r  ru	  rw	  ry	  r{	  r   r	  r	  r	  rt	  rn	  r  r	  r	  r	  r	  r	  __inv____div__normr    r   r   r<  r<    s       3 3 3G G G1 1 1; ; ;
C C C !% 5' 5' 5' 5' 5'n    " " "L L L1 1 1  + + +
 
 
G G G# # #      > > X>
) ) )V  	 	 	   GGDDDr   r<  c                   0    e Zd ZdZd Zd Zd Zd Zd ZdS )IdentityMatrixz"Identity matrix [1, 0, 0, 1, 0, 0]c                      t          d          S )N)r   r   r   r   r   r   )hashr\   s    r   __hash__zIdentityMatrix.__hash__  s    M"""r   c                 >    t                               | dd           d S )Nr\  )r<  r^   r\   s    r   r^   zIdentityMatrix.__init__  s    c3'''''r   c                     dS )Nz,IdentityMatrix(1.0, 0.0, 0.0, 1.0, 0.0, 0.0)r    r\   s    r   r   zIdentityMatrix.__repr__  s    ==r   c                 Z    |dv rd| j         |<   d S |dv rd| j         |<   d S || j         |<   d S )Nadr\  bcefr[  )r}  )r]   r   r   s      r   __setattr__zIdentityMatrix.__setattr__  sP    4< 	("%DM$V^ 	("%DM$"'DM$r   c                       t          d          )NzIdentity is readonly)NotImplementedError)r  s    r   	checkargszIdentityMatrix.checkargs  s    !"8999r   N)	r`   ra   rb   __doc__r	  r^   r   r	  r	  r    r   r   r	  r	  ~  se        ,,# # #( ( (> > >( ( (: : : : :r   r	  c                       e Zd ZdZddZdS )r3	  z#link or outline destination detailsNc           	      	    |j         }| }d _        d _        d _        d _        d _        t           _        t          dd           _	        t                       _        d _        |j         _        t          dd           _        |j         _         fd}|rY j                            d          s?d|d         dz    dt#          |d                    d	t#          |d
                     _        |j         rd _        t$           _         j        sd _        t           _        |r" j        r j                            dd           _         j                            d          rt(           _        t+          j        d j                  }|rt/          |                    d                    dz
   _        t          t3          |                    d                    t3          |                    d                               _	         j        t4          z  t6          z   _        nt+          j        d j                  }|r+t/          |                    d                    dz
   _        nt8           _        t+          j        d j                  }|sJ |rh|rf|                    d          }|                                                    |           _         j        t                       _        | j        d<   n? | j        dd                     _        n!t8           _         | j                   _        |j         rO j        snF j                            d          r j        dd           _         j                            d          r j        d
d           _        d _        d _        t>           _         j                             d          }	tC          |	          d
k    rr|	d                             d          rWtD           _        |	d          _        t/          |	d                              d          d         dd                    dz
   _        n0d j        v rd _        t$           _        nd _        t>           _        tG           j        t                    sJ d S )Nr(   r   Fc                     j         dd                              d          }t                      }|D ];}|                    d          }|dk    r||dz   d          ||d |         <   6d ||<   <|S )Nr   &ro  r   )r  rl  r   ri   )r  rt  rN   r   eqr]   s        r   uri_to_dictz&linkDest.__init__.<locals>.uri_to_dict  s    HQRRL&&s++E&&C % %YYs^^7 %%)"Q$%%[CSbS	NN $CIIJr   r1	  z#page=r   z&zoom=0,,ry   r   z	&zoom=nanz&zoom=0z7^#page=([0-9]+)&zoom=([0-9.]+),(-?[0-9.]+),(-?[0-9.]+)$r   r  z^#page=([0-9]+)$z^#nameddest=(.*)	nameddestzfile:r
   z//zpage=r	  r+   T)$r2	  r  	file_specr  is_mapis_uri	LINK_NONEkindr  ltr   rT  
new_windowr   rC  r  r   r}   LINK_URIr  	LINK_GOTOr  r  r   groupr+  LINK_FLAG_L_VALIDLINK_FLAG_T_VALID
LINK_NAMEDr  r   LINK_LAUNCHrl  r-  
LINK_GOTORrz   )
r]   r   rlinkr   isExtisIntr	  rH  rT  ftabs
   `         r   r^   zlinkDest.__init__  sI   		
	1++VV
H	1++7		 		 		 		 		  	b,,S11 	baa1aaia6I6IaaIV[\]V^L_L_aaDH? 	!DI DIx 	"DI!DI 	3TX 	3x''Y??DHx""3'' 3%	HVX\X`aa C #AGGAJJ! 3DI#E1771::$7$7qwwqzz9J9JKKDG!%.?!?BS!SDJJ!3TX>>A C$'

OOa$7		$.	H%7BB'# 	C 	C$%GGAJJE)1)?)?)A)A)E)Ee)L)LDJ#z 4 .2VV
6;DJ{33)4TXabb\)B)BDJJ&	([22
? 	(8 ($$W-- (!%!"">,,T22 8%)^ABB%7DN#'	~++C00t99> GAw))'22 G$.	)-a$'Qc(:(:1(=abb(A$B$BQ$F	 ("$		"'	$*d+++++++r   r   r`   ra   rb   r	  r^   r    r   r   r3	  r3	    s4        --W, W, W, W, W, W,r   r3	  c                   d    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
ed	             Zd
 Zd Zd ZdS )r  z6
    Class describing a PDF form field ("widget")
    c                    d | _         d| _        d| _        d | _        d | _        d | _        d | _        d | _        d | _        d| _	        d| _
        d| _        d | _        d | _        d | _        d | _        d| _        d| _        d| _        d| _        d| _        d| _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d| _        d S )NSr   r   r   r   Helvr(   )r{  border_styleborder_widthborder_dasheschoice_values	rb_parent
field_namefield_labelfield_valuefield_flagsfield_display
field_typefield_type_stringr  button_caption	is_signedr   	text_fonttext_fontsizetext_maxlentext_format_text_dar  script_strokescript_formatscript_changescript_calcscript_blurscript_focusr   r   r\   s    r   r^   zWidget.__init__  s     !!!%"#!!! 				r   c                 (    d| j          d| j         dS )NzWidget:(field_type=z script=rp  )r	  r  r\   s    r   r   zWidget.__repr__  s#     TT%;SST[SSSSr   c                     | j         s	d| _         dS d}|D ];}| j                                         |                                k    r
|| _          dS <d| _         dS )zAEnsure text_font is from our list and correctly spelled.
        r	  N)CourTiRor	  ZaDb)r	  r  )r]   valid_fontsr  s      r   _adjust_fontzWidget._adjust_font$  sr     ~ 	#DNF6 	 	A~##%%2 !"  r   c           	         | j         t          dd          vrt          d          | j         t          j        k    r| j        dvrt          | d          r| j        j        }|                    | j	        d          \  }}|dk    r}t          t          t          |dd                             d	d
                                                              }|D ],}|| j	        k    r|                    |dd           %dS dS dS dS dS )z Any widget type checks.
        r   re	  zbad field type)FOffr   zParent/Kidsr  r   r  r(   ASz/OffN)r	  r  r   rf   PDF_WIDGET_TYPE_RADIOBUTTONr	  r  r   rC  r   r|   r  r   r  rl  r*  )r]   r   	kids_type
kids_valuer  r   s         r   _checkerzWidget._checker2  sH    ?%1++- 	/-... ?e?? 		=DDT\jDj 		=ovw{  ~F  pG  pG 		= +$C$'$4$4TY$N$N!IzG# =c#z!B$'7'?'?b'I'I'O'O'Q'QRRSS! = =Dty( =((tV<<<		= 		= 		= 		= 		= 		=
= == =r   c                    | j         sdS d}d}d}| j                                         }t          |          D ]\  }}|dk    rA||dz
           dd         }t          ||dz
                     }dx||<   x||dz
  <   ||dz
  <   L|d	k    r't          ||dz
                     g}dx||<   ||dz
  <   y|d
k    r5d ||dz
  |         D             }dx||<   x||dz
  <   x||dz
  <   ||dz
  <   || _        || _        || _        d| _         dS )zExtract font name, size and color from default appearance string (/DA object).

        Equivalent to 'pdf_parse_default_appearance' function in MuPDF's 'pdf-annot.c'.
        Nr	  r   r	  Tfry   r   r(   grgc                 ,    g | ]}t          |          S r    r+  rp   r  s     r   rr   z$Widget._parse_da.<locals>.<listcomp>]      666AuQxx666r   r   )r	  rl  r  r+  r	  r	  r   )r]   r/  r  r&  datrq   r   s          r   r   zWidget._parse_daG  sn   
 } 	Fm!!## ~~ 	 	GAtt| 1q5z!""~c!a%j))/11A1QqSC!Hs{ c!a%j))+$&&AQqSt| 66QU1W666:<<A<QqS<C!Hs1Q3x "r   c                 n   | j         j        s| j         j        rt          d          | j        st          d          | j        dk    rd| _        t          | j                   t          | j                   | j	        sd| _	        t          | j	                   | j
        sd| _
        | j        sd| _        | j                                        dd         | _        | j        t          j        t          j        t          j        fv }| j        sd| _        n*t)          | j                  t*          urt          d          |s| j        sd| _        n*t)          | j                  t*          urt          d	          |s| j        sd| _        n*t)          | j                  t*          urt          d
          |s| j        sd| _        n*t)          | j                  t*          urt          d          |s| j        sd| _        n*t)          | j                  t*          urt          d          |s| j        sd| _        n*t)          | j                  t*          urt          d          |s| j        sd| _        n*t)          | j                  t*          urt          d          |                                  dS )z$Validate the class entries.
        zbad rectzfield name missingUnnamedNr	  r   r   zscript content must be a stringz$script_calc content must be a stringz&script_change content must be a stringz&script_format content must be a stringz&script_stroke content must be a stringz$script_blur content must be a stringz%script_focus content must be a string)r   is_infiniteis_emptyr   r	  r	  r,  r{  r  r   r	  r	  r	  r  r	  rf   PDF_WIDGET_TYPE_BUTTONPDF_WIDGET_TYPE_CHECKBOXr	  r  r   r   r	  r	  r	  r	  r	  r	  r	  )r]   btn_types     r   	_validatezWidget._validatef  s    I! 	)y!	) Z((( 	31222y( 	$#D4$%%%4?### 	('DO4?###  	" !D! 	#!"D -3355ac: ?,.1' 
 { 	@DKK$+c) 	@>???  	E4+ 	E#D$"##3. 	ECDDD 	G4- 	G!%D$$%%S0 	GEFFF 	G4- 	G!%D$$%%S0 	GEFFF 	G4- 	G!%D$$%%S0 	GEFFF 	E4+ 	E#D$"##3. 	ECDDD 	F4, 	F $D$#$$C/ 	FDEEEr   c                 &   | j         dvrdS t          | d          r| j        j        }ndS | j        }ddd}|                    |d          }|d         dk    rfg }|d         d	d
         }|                    d          dd         }|D ]/}|                    |                                d                    0||d<   |d         dk    rg }t          |d                             d          d                   }|                    |          }|                    d          dd         }|D ]/}|                    |                                d                    0||d<   |                    |d          }	|	d         dk    rfg }
|	d         d	d
         }	|	                    d          dd         }|D ]/}|
                    |                                d                    0|
|d<   |	d         dk    rg }
t          |	d                             d          d                   }|                    |          }	|	                    d          dd         }|D ]/}|
                    |                                d                    0|
|d<   |S )a	  Return the on/off state names for button widgets.

        A button may have 'normal' or 'pressed down' appearances. While the 'Off'
        state is usually called like this, the 'On' state is often given a name
        relating to the functional context.
        ry   r
   Nr   )r%  downzAP/Nr   r   r   ry   r  rj  r%  r   rl   zAP/Dr
  )	r	  r  r   r   rC  rl  r6   r   r  )r]   r   r   statesAPNnstatesapntr  nxrefAPDdstatesapdtdxrefs                r   button_stateszWidget.button_states  s    ?&( 	44"" 	+$CCFy $//tV,,q6V 	'Ga&2,C99S>>!""%D - -qwwyy|,,,,&F8q6V 	'GAS))!,--E//%((C99S>>!""%D - -qwwyy|,,,,&F8tV,,q6V 	%Ga&2,C99S>>!""%D - -qwwyy|,,,,$F6Nq6V 	%GAS))!,--E//%((C99S>>!""%D - -qwwyy|,,,,$F6Nr   c                     | j         j        S r   )_annotr  r\   s    r   r  zWidget.next  s    {r   c                     | j         dvrdS | j         dk    rdS |                                 }|t                      }|                                D ]}||         D ]}|dk    r|c c S t	          d           dS )a  Return the "On" value for button widgets.
        
        This is useful for radio buttons mainly. Checkboxes will always return
        "Yes". Radio buttons will return the string that is unequal to "Off"
        as returned by method button_states().
        If the radio button is new / being created, it does not yet have an
        "On" value. In this case, a warning is shown and True is returned.
        r
  Nry   Yesr	  z(warning: radio button has no 'On' value.T)r	  r
  r   r  rB   )r]   bstaterx  rM   s       r   on_statezWidget.on_state  s     ?&( 	4?a 	5##%% 	VVF 	 	AAY  : HHHHH 	:;;;tr   c                 D    t                               | j                   dS )z.Reset the field value to its default.
        N)r   _reset_widgetr
  r\   s    r   resetzWidget.reset  s      	DK(((((r   c                    |                                   |                                  d| _        t          | j                  dk    rd| j        z   }nEt          | j                  dk    rd| j        z   }n"t          | j                  dk    r
d| j        z   } |j        | j        | j        | j        d| _        | j        rt          | j
                   t                              | j
        |            d| _        d	S )
z*Reflect Python object in the PDF.
        r(   r   r  r   r  r  r  r  N)r

  r	  r	  r-  r   r  r	  r	  r	  util_ensure_widget_calcr
  r   _save_widget)r]   rv   s     r   r  zWidget.update  s	    	 !!Q& 	J5ECC!!Q& 	J*T]:CC!!Q& 	J9DMIC"
DOt~&*&8: : :  	1#DK000 	4;---r   N)r`   ra   rb   r	  r^   r   r	  r	  r   r

  r
  r  r  r
  r 
  r  r    r   r   r  r    s         # # #J8 8 8  = = =*  >E E EN/ / /b     X   .) ) )
    r   r  )_extrac                       e Zd Zd Zed             Zd Zed             Zed             Zed             Z	ed             Z
ed             Zed	             Zed
             Zed             Zed             ZdgZdS )r  c                     || _         d S r   )r   r]   r  s     r   r^   zOutline.__init__!  s    			r   c                 $    t          | dd          S )zoutline destination detailsNr3	  r\   s    r   r  zOutline.dest$  s     dD)))r   c                 $    t          | d|          S )zo
        Like `dest` property but uses `document` to resolve destinations for
        kind=LINK_NAMED.
        Nr)
  )r]   r   s     r   destinationzOutline.destination)  s    
 dH---r   c                 h    | j         }|                                }|j        sd S t          |          S r   )r   r
  r   r  )r]   r  down_ols      r   r
  zOutline.down0  4    Y''))! 	Fwr   c                     t           rt          j        | j                  S | j        }|j        sdS |j        j        }|dS t          j        |          S r  )r   r$
  Outline_is_externalr   r   r  rf   r7	  )r]   r  r  s      r   r2	  zOutline.is_external8  s]     	: -ty999Y} 	5m 	5(---r   c                 &    	 | j         j        j        S r   )r   r   r  r\   s    r   r  zOutline.is_openG  s    	09'//r   c                 h    | j         }|                                }|j        sd S t          |          S r   )r   r  r   r  )r]   r  next_ols      r   r  zOutline.nextM  r.
  r   c                 0    	 | j         j        j        j        S r   )r   r   r   r\   s    r   r   zOutline.pageU  s    	29',11r   c                 $    | j         j        j        S r   )r   r   r6  r\   s    r   r6  zOutline.title[  s    y#))r   c                 :    | j         }|j        sd S |j        j        S r   )r   r   r  r'
  s     r   r  zOutline.uri_  s#    Y} 	4}  r   c                 $    | j         j        j        S r   )r   r   r  r\   s    r   r  z	Outline.xf      y#%%r   c                 $    | j         j        j        S r   )r   r   r  r\   s    r   r  z	Outline.yj  r8
  r   r   N)r`   ra   rb   r^   r  r  r+
  r
  r2	  r  r  r   r6  r  r  r  r  r    r   r   r  r    sC          * * X*. . .     X  . . X. # # X#
     X  % % X%
 * * X* ! ! X! & & X& & & X& 	IIIr   r  c                 r   t          j                    }| |_        ||_        ||_        ||_        |rrt          t           j                  sJ nt          j                     G fddt           j                  } |            }|	                    |
                                           ||_        |S )z4
    Returns a mupdf.PdfFilterOptions instance.
    c                   (     e Zd Z fdZd Z xZS )'_make_PdfFilterOptions.<locals>.Factoryc                 ~    t                                                       |                                  | _        d S r   )r   r^   use_virtual_filtersopts)r]   	__class__r?
  s    r   r^   z0_make_PdfFilterOptions.<locals>.Factory.__init__  s6      """'')))"


r   c           	      d    	 t          j        |||||| j                                                  S r   )r>   r?
  r_  rf   ll_pdf_new_sanitize_filter)r]   ctxr   chainstruct_parents	transformr  s          r   filterz._make_PdfFilterOptions.<locals>.Factory.filter  s>    	9 7&!
++--  r   )r`   ra   rb   r^   rG
  __classcell__)r@
  r?
  s   @r   Factoryr<
    sM        # # # # # #      r   rI
  )rf   PdfFilterOptionsrR  rS  rT  	no_updaterz   PdfSanitizeFilterOptionsPdfFilterFactory2add_factoryr_  _factory)	rR  rS  rT  rK
  rU  r?
  rY  rI
  factorys	        `   r   rW  rW  q  s     $&&GGO+GGM!G (#  	5eU%CDDDDDD244E	 	 	 	 	 	 	e- 	 	 	2 '))G,,..///"Nr   c                      e Zd Zd Zd Zd Zd ZddZ	 	 	 	 	 	 	 dd	Zd
 Z	d Z
d ZddZd ZddZddZd Zd Zd Zd Zd Zd ZdedefdZd ZddZ	 	 	 ddZd Zd  Zdd!Zd" Zd# Z d$ Z!dd%Z"d& Z#d' Z$dd(Z%d)e&de'fd*Z(d+e)de'fd,Z*	 	 	 dd)e&d-e+j,        d.e-d/ed0ed1ede'fd2Z.	 	 	 	 	 	 	 dd+e)d3e-d4e/d5ed6e0d7e0d8e0d9e1d:e1de'fd;Z2	 	 dde'fd<Z3d=e4de'fd>Z5d?e&d@e&de'fdAZ6dBe4de'fdCZ7dBe4de'fdDZ8d+e)de'fdEZ9	 	 	 	 	 	 	 dd3ed5ed4e/d9e1dGe0d7e0dHe:de'fdIZ;	 	 	 	 dde'fdJZ<dd+e)dKe1de'fdLZ=dde'fdMZ>dd)e&d3e-d1e-de'fdOZ?dde'fdPZ@dQeAde'fdRZBdS ZCdT ZDddUZEeFdV             ZGeFdW             ZHdX ZIddYZJeFdZ             ZKeFd[             ZLd\ ZMd] ZNeFdeOfd^            ZPdd_ZQeFd`             ZReFda             ZSeFdb             ZTddcZUdddZVde ZWddfZXddhe:de4fdiZYdj ZZ	 ddle/dme/de4fdnZ[ddoZ\ddpZ]ddqZ^de4fdrZ_ddsZ`	 ddtead+e)de-fduZbddve)dwe1ddxfdyZcdz Zdd{ Ze	 	 dd}ZfeFd~             ZgeFd             ZhddZide+jj        e-e1f         de'fdZkd Zld ZmeFd             ZneFd             Zod Zpd ZqeFd             ZreFdeOfd            Zsd Ztd Zud Zvd Zwd ZxddZyd Zzd Z{d Z|eFd             Z}eFd             Z~ddZd ZeFd             Z eFeId          ZdS )r   c                 ~   t          |t          j        t          j        f          sJ d|             || _        d| _        d | _        d| _        t                      | _	        || _
        |j        rEt          |t          j                  r|j        j        j        | _        d S |j        j        | _        d S d | _        d S )Nz	page is: Tr(   )rz   rf   r   r   r   r   
last_point	draw_contr   r  r   r   r   r  )r]   r   r   s      r   r^   zPage.__init__  s    $u} =>>RR@RD@R@RRRR	66? 	4// 5"o3:"o4DKKKr   c                 *    |                                  S r   )r   r-  r   r   r  r  r  ry  s     r   r   zPage.__repr__  s    ||~~r   c                 X   t          | dd           }t          | j        j        t          j                  r| j        j        j        j        }n| j        j        j        }d| }|rE| j        j	        }| j        j
        d| j        j        fz  }|dk    rd| j        j        z  }|d| z  }|S )Nr   r  z<memory, doc# %i>r(   z<new PDF, doc# %i> of )r   rz   r   r   rf   pdf_pager   r  r   r   r  r  )r]   r   r  rN   r  s        r   r   zPage.__str__  s    x..di*EN;; 	1Y)/6FFY)0Ff 	 A{! C'4;+@*BBBw A(4;+@@:!::C
r   c                    t           r)t          j        | j        t	          |                    }nFt           rct          | j        t          j                  r| j        }nt          j        | j                  }t          j        |t	          |                    }n| 	                                }t          j
        |t          j                  }|rt	          |          }t          j        |          }t          j        |j        |j        |j        |j        z   |j        z
  |j        |j        z   |j        z
            }t          j        ||           t          j        |           t-          |d           |S NrP  )r   r   _add_caret_annotr   JM_point_from_pyrz   rf   r   r   	_pdf_pagepdf_create_annotr
  pdf_annot_rectr/  r  r  r  r  r  r  rn  r  JM_add_annot_id)r]   r  r   r   rj  r   s         r   r[
  zPage._add_caret_annot  s:    	(*DI7G7N7NOOEE 	( 49em44 ?y2DI>>*D2B52I2IJJEE>>##D*41FGGE 3$U++(//Lac13:+<acADj14>OPP(222"5)))E3'''r   Nc                 B   |                                  }|r|n|}|r|n|}	t          |          }
t          |           t          |          }|j        st          t                    t          j        |t          j	                  }t          j
        |          }t          j        |
j        |
j        |
j        |j        z   |j        z
  |
j        |j        z   |j        z
            }t          j        ||           t          j        }t          j        ||           |rt          j        ||           t-          |                                ||||	d          }t          j        t          j        |          t5          d          |           t          j        t          j        |          t5          d          |           t          j        |           t          j        ||           t          j        ||           t;          |d           t=          |          S )Nr   rm  r  rP  )r]
  r\
  r$  r   r   rv  r   rf   r^
  r  r_
  fz_make_rectr  r  r  r  r  r  rn  PDF_ANNOT_IS_PRINTr2  pdf_set_annot_icon_namer7  r   r  r   r   r=  r  r`
  r   )r]   r  r   r3   r  r  iconr   ufr  rj  filebufr   r   r  r   s                   r   _add_file_annotzPage._add_file_annot  s   ~~#1YY&DDhU##4$W--! 	-^,,,&tU-LMM ''qsACqtad):AC!$J<MNN ***(!%/// 	7)%666DHHJJ2q!DD5.u55x~~sKKK&u':5'A'A8JCWCWYabbbu%%% ***!%///s###U||r   r  r   c
                    |                                  }
t          |          \  }}t          |          \  }}t          |          }t          j        |          st          j        |          rt          t                    t          j        |
t          j	                  }t          j
        |          }t          j        ||           t          j        ||           t          j        |t          d          |	           t          j        |t          d          |           |dk    rt          j        ||d |                    t!          |||||           t          j        |           t%          |d           t'          |          }|                                }|                    d          }|                    d          dz   }|||         }|d         |d         z
  }|d         |d	         z
  }|	d
v r||}}dt/          ||f           d                                }|dz   |z   }d }d}t3          |d                                          }|r|dz  }d}t3          |d                                          }|r	|dz  }d}d}|r|rd}|||z   |z   |z   dz   |z   dz   |z   }|                    |           |S )Nr   r   r   rP  r  r  ry   r   r   )rr  ir  z0 0 z rer  r   r  r  r  ry  s   1 w
r  r  )r]
  r  r  rf   rl  rk  r   rm  r^
  r  r   r;  rn  r  r   r  JM_make_annot_DAr  r`
  r   r   ri   r  r}   r  r  r   )r]   r   r:   r   r   r   r  r{  r   r   r   r#  r$  ntcolr  r   r   r   r   r   r  r  r   r  r  r  r  r  r  s                                r   _add_freetext_annotzPage._add_freetext_annot  s    ~~+J77t+J77tD!!$Q'' 	,5+A!+D+D 	,l+++&e.GHH'//	$eT222 %+++	8H+=+=vFFF	8C==%@@@19 	<%ud6E6l;;; 	tXx@@@&&&s###Ell ZZ\\WWU^^XXe__q 2YGDGOGDGO^# 	aqA*Iq!f%%***1133+"
C007799 	5 KC!,44;;== 	U"MFC 	= 	C 	V+%5:UBSH5PSUUB

2
r   c                    t          j        | j                  }t          |           t	          |          st          t                    t          j                    }t          j        |t          j	        d          |           t          j
        |          }t          j        |t           j                  }t          j        |          }t          |          }t          j        |                                |          }t#          |          D ]}	||	         }
t          |
          }t          j        |                                d|z            }t#          |          D ]}|
|         }t	          |          rt%          |          dk    rt          t                    t          j        t)          |          |          }t          j        ||j                   t          j        ||j                   t          j        ||           t          j        |t5          d          |           t          j        |           t9          |d           t;          |          S )Nr   ry   r  rP  )rf   r   r   r$  PySequence_Checkr   MSG_BAD_ARG_INK_ANNOTr9  r  r/  fz_invert_matrixr^
  r  r   r-  r  r   r  PySequence_Sizer  r\
  r  r  r  r8  r  r   r  r`
  r   )r]   r{   r   r  inv_ctmr   r   n0inklistrI  sublistn1r$  rq   rj  r  s                   r   _add_ink_annotzPage._add_ink_annotO  s   *49554%% 	53444n u|A<<<(--&tU-@AA'..	YY%dhhjj"55r 	2 	2A1gGWB(QV<<F2YY ; ;AJ'** =oa.@.@A.E =$&;<<<01A!1D1DgNN)&%':::)&%':::: &11119hy&9&97CCCu%%%s###U||r   c                 f   |                                  }t          |           t          j        |t          j                  }t          |          }t          |          }t          j        |||           t          j        |           t          |d           |j	        sJ t          |          S rZ
  )r]
  r$  rf   r^
  r  r\
  pdf_set_annot_liner  r`
  r   r   )r]   r  r  r   r   r   r  s          r   _add_line_annotzPage._add_line_annotp  s    ~~4&tU-ABBR  R   1---u%%%s###U||r   c                    |                                  }t          |          dk     rt          t                    t	          j        ||          }|D ]M}t          |          dk    rt          t                    t          |          }t	          j        ||           Nt	          j	        |           t          |d           t          |          S )Nry   rP  )r]
  r-  r   MSG_BAD_ARG_POINTSrf   r^
  rq
  r\
  pdf_add_annot_vertexr  r`
  r   )r]   r  r  r   r   rj  r  s          r   _add_multilinezPage._add_multiline|  s    ~~v;;? 	20111&tZ88 	5 	5A""a' 6 "4555$Q''E&ue4444u%%%s###U||r   c                 *   |                                  }g d}d}	t          j        |t          j                  }
t	          |          }t          j        |          }t          j        |
|           |rt          |          \  }	}t          j        |	                                |	          }t          |	          D ]}t          j        |||                    t          j        t          j        |
          t          d          |           |rt          j        t          j        |
          dt          j        |                     t          j        t          j        |
          t          d          |           t          j        t          j        |
          t          d          |           t          j        |
           t)          |
d           t          j        |
j                  }
t          j        |
          }
t1          |
          S )N)r   r   r   r   r   r   r   DAr   rP  )r]
  rf   r^
  r   JM_quad_from_pyfz_rect_from_quadrn  r  r  r   r  r  r  r   r   r>  r?  r=  r  r  r`
  ll_pdf_keep_annotr   r   r   )r]   r  r:   r  r   r   r   r   r$  r#  r   qr   r  rq   s                  r   _add_redact_annotzPage._add_redact_annot  s   ~~}}&tU-CDDD!!#A&& *** 	P/55KE4%dhhjj%88C5\\ 8 8)#tAw7777u25998D>>3OOO 	U'..!-d33  
 *5+>u+E+ExPT~~W]^^^"5#6u#=#=x}}eTTTu%%%s###'(899&&U||r   c                    |                                  }t          |          }t          j        |          st          j        |          rt          t                    t          j        ||          }t          j        ||           t          j	        |           t          |d           |j        sJ t          |          S rZ
  )r]
  r  rf   rl  rk  r   rm  r^
  rn  r  r`
  r   r   )r]   r   r  r   r   r   s         r   _add_square_or_circlezPage._add_square_or_circle  s    ~~D!!$Q'' 	,5+A!+D+D 	,l+++&tZ88 ***u%%%s###U||r   c                     |                                  }t          d          t          d          t          d          t          d          t          d          t          d          t          d          t          d          t          d	          t          d
          t          d          t          d          t          d          t          d          g}t          |          }|d         }t          |           t	          |          }t          j        |          st          j        |          rt          t                    t          |d|dz
            r||         }t          j        |t
          j                  }t          j        ||           	 t          d          }t          j        t          j        |          t          d          |           n$# t           $ r t"          rt%                        w xY wt          j        |t          j        t          j        |          t          d                               t          j        |           t-          |d           t/          |          S )NApprovedAsIsConfidentialDepartmentalExperimentalExpiredFinal
ForCommentForPublicReleaseNotApprovedNotForPublicReleaseSold	TopSecretDraftr   r   r  rP  )r]
  r   r-  r$  r  rf   rl  rk  r   rm  r]  r^
  r  rn  r  r   r   r   rF   r;  pdf_dict_get_namer  r`
  r   )	r]   r   stampr   stamp_idrF  r   r   r   s	            r   _add_stamp_annotzPage._add_stamp_annot  s9   ~~$$  ((((((##!!&&+,,''.//  %%!!  MM{4D!!$Q'' 	,5+A!+D+D 	,l+++E1ac"" 	#E?D&tU-BCC ***	  Au25998F;K;KTRRRR 	 	 	#8(8(8(8	 	$'(;E(B(BHVDTDTUU	 	 	 	u%%%s###U||s   AG" "!Hc                 J   |                                  }t          |          }t          |           t          j        |t          j                  }t          j        |          }t          j        |j        |j	        |j        |j
        z   |j        z
  |j	        |j        z   |j        z
            }t          j        ||           t          j        ||           |rt          j        ||           t          j        |           t%          |d           t'          |          S rZ
  )r]
  r\
  r$  rf   r^
  r  r_
  rb
  r  r  r  r  r  r  rn  r;  rd
  r  r`
  r   )r]   r  r:   re
  r   rj  r   r   s           r   _add_text_annotzPage._add_text_annot  s    ~~e$$4&tU-ABB ''qsACqtad):AC!$J<MNN ***$UD111 	7)%666u%%%s###U||r   c                     t          |            | j        j        st          d          t	          | ||          }|sd S t          j        |           |_        || j        t          |          <   |S )Nr  )	r-  r   r  r   Page__add_text_markerr  r  r  r  )r]   quadsr  r   s       r   _add_text_markerzPage._add_text_marker  sr    D{! 	*[)))#D%<< 	4]4((
$'C!
r   c                    t          |            t          r0t          j        | j        _        t          j        | j        |          S t          j        | j                  }t          |          }|dk     rdS d}t          |           t          |t                    st          d          t          j        |                                t!          d                    j        s5t          j        |                                t!          d          |           t          j        |                                t!          d                    }|j        sJ d|d|j                    t'          |          D ]}||         }t)          |          }|st+          d|           ,	 t          j        |                                t1          |                                |                    }t          j        |                                t          j        |          d	          }	t          j        ||	           # t8          $ r* t:          rt=                       t+          d
|z             Y w xY wdS )z&Add links from list of object sources.r   Nr   zbad 'linklist' argumentr_  zlcount=z annots.m_internal=z"skipping bad link / annot item %i.r   z#skipping bad link / annot item %i.
)r-  r   r   Page_addAnnot_FromStringr@
  _addAnnot_FromStringr   rf   r   r-  r$  rz   r|   r   r   r   r   r   r  r  JM_StrAsCharrB   r~  r   r  rF  r   r8  r   r   rF   )
r]   linklistr   lcountrq   rg  txtpyr:   r   r  s
             r   r
  zPage._addAnnot_FromString  sL   D 	H272PDN/149hGGG*4955XA: 	F 	4(E** 	97888!488::x/A/ABBM 	N$dhhjj(82D2DfMMM#TXXZZ(1C1CDD CC"CV"C"Cv/@"C"CCCCv 	D 	DAQKE&&D <a@@@D,dhhjj:Mtxxzz[_:`:`aa0$((**e>NPU>V>VXYZZ$fg6666 D D D'<N,<,<,<>BCCCCCD	D 	Ds   &BH==1I10I1c                     |                                  }|                                }t          ||||          }|j        st	          d          t          |d           t          |          S )Nzcannot create widgetW)r]
  r   JM_create_widgetr   r   r`
  r   )r]   r	  r	  r   r!  r   s         r   
_addWidgetzPage._addWidget  sg    ~~hhjj dJ
CC 	8 6777s###U||r   c                     |                                  }t          j                    }d|_        ||_        ||_        ||_        t          |           t          j        |	                                ||          }|S rW   )
r]
  rf   PdfRedactOptionsblack_boxesr:   image_methodline_artr$  pdf_redact_pager   )r]   r:   imagesgraphicsr   r  successs          r   _apply_redactionszPage._apply_redactions'  sl    ~~%''	" 4'

D$??r   c                     |                                   	 | j                            |            n# t          $ r t	                       Y nw xY wd | _        d| _        d | _        d | _        d S r  )_reset_annot_refsr   r\  r   rF   r   r  r   r\   s    r   r   zPage._erase2  s       	K$$T**** 	 	 	D	 			s   1 AAc                 8   t          |           }t          j        |                                t          j                  }t          j        |                                t          j                  }t          | j                  }t          j        |||          S )a  Count missing graphic state pushs and pops.

        Returns:
            A pair of integers (push, pop). Push is the number of missing
            PDF "q" commands, pop is the number of "Q" commands.
            A balanced graphics state for the page will be reached if its
            /Contents is prepended with 'push' copies of string "q
"
            and appended with 'pop' copies of "
Q".
        )	r   rf   r   r   r  PDF_ENUM_NAME_Contentsr   r    pdf_count_q_balance_outparams_fn)r]   r   r   r.  r!  s        r   _count_q_balancezPage._count_q_balance>  s     D!! HHJJ)
 
 !HHJJ(
 
 t{++ 5c3EEEr   r  r  c                    ||dk    rd S | j         }|                    |d          }d|v sd|v st          d          i }|                                 D ]
\  }}|||<   ||                                v r||         S d}d|z  }||                                v r |dz  }d|z  }||                                v  |                     ||           |S )	Nr   Tr  	/Type/OCG
/Type/OCMDzbad optional content: 'oc'zMC%ir   )r   r  r   _get_resource_propertiesr  r   _set_resource_property)	r]   r  r   checkpropsrj  r  rq   mcs	            r   _get_optional_contentzPage._get_optional_contentV  s    	q 	4kt44u$ 	;(= 	;9:::1133 	 	DAqE!HH 	9aZELLNN" 	FA!B ELLNN" 	 	##B+++	r   c                     |                                  }t          |           t          |                                          }|S )z/
        page list Resource/Properties
        )r]
  r$  JM_get_resource_propertiesr   )r]   r   rh   s      r   r
  zPage._get_resource_propertiesm  s;     ~~4'

33	r   c                    t           r2t          j        | j        |||          }t	          j        |          }|S | j        }t	          j        |          }t          |          }|t	          j        |          nt          |          }t          |          }	t	          j        |          }t	          j
        ||          }
t          j        rt	          j        |
t          j                   t          |t          j                  rnIt          |t          j                  r|                                }nJ dt'          |                      t	          j        ||
|	t	          j                               t	          j        |
           |S )Nr   r   )r   r   page_get_textpager   rf   r  r  r  fz_bound_pager  r  _globalsrX   fz_enable_device_hintsFZ_NO_CACHErz   r   r   r   r   fz_run_pager  fz_close_device)r]   r  r  r  ll_tpagetpager   r  r   r  devs              r   _get_textpagezPage._get_textpagev  sZ    	.ty$vNNH%h//ELy&u--t$$,0Su"4(((od>S>S''!$'''w77% 	B(#u/@AAAdEL)) 	4em,, 	4::<<DD33d4jj33333$S%.*:*:;;;c"""r   r   r   c                    t          j                    }|                                 }|                                }|
}|}|}d}d}d}d}d}d}|dk    rt          j        ||d          }t          j        t          j        |t          d          t          d                              }t          j        t          j        |t          d          t          d                              }||z   dk    rt          t                    d}d}d}d}n,|rt          |          }d}n|rt          j        |          }d}|rx|j        }|                                }|                                }t          j        |          }|} |                    | d           }!|!1|!}t          j        |                                |d          }d}d}d}n|                                dk    r't          j        |t          j                              }"nt          j        |t          j                    t          j                    t          j        d           t          j                    d          }#d|#_        d |#_        t          j        |#t          j                              }$t          j        ||$          }"d}d}|rt          j                    }%t4          rt          j        |%|           n*t          j        |%|j        j        |j        j                   |rVt          |          }t4          rt          j        |%|           n*t          j        |%|j        j        |j        j                   t          j         |%          }tC          |          } |                    | d           }!|!|!}t          j        |                                |d          }t          j        t          j        |t          d          t          d                              }t          j        t          j        |t          d          t          d                              }d}d}n@t          j"        |          }"|"                                }|"                                }|sd}|rtF          dk    rt          j$        |"          }&|&j        st          d          |"%                                }'|"                                }(t          j&        |"          \  })}*t          j"        |          }$t          j'        |||'|(|)|*ddtQ                      tQ                      |&|$          }"nt          j)        |"j                  }&|&st          d          |"%                                }'|"                                }(t          j&        |"          \  })}*t          j"        |          }$tU          j+        |||'|(j        |)|*dd|&|$j        
  
        }+t          j        |+          }+d |"_        |+}"|rCt          j,        ||"          }|	rt[          |||	           t          j.        |          }||| <   d}|rlt          j/        |0                                t          d	                    },|,j        s5t          j1        |0                                t          d	          d
          },t          j2        |,t          d                    }-|-j        s#t          j1        |,t          d          d
          }-tg          |||||          }.t          j4        |-||           t          j5        d          }/dtm          |.j7        |.j8        |.j9        |.j:        |.j;        |.j<        f           d| d}0t          j=        |/|0           t}          ||0                                |/|           |r||fS |d fS )Nr   r   Widthr
  Heightr  r  z#uncompressed image cannot have maskr   ry   XObject2   
q
z cm
/z Do
Q
)?rf   r  r]
  r   rF  r   ra  r   r   MSG_IS_NO_IMAGEr   fz_read_filer   r   r  fz_md5_pixmap2r   r  fz_new_image_from_pixmapFzImagefz_convert_pixmaprn  FzDefaultColorspacesru  r  FzMd5re   fz_md5_update_bufferfz_md5_updater   rT  r-  fz_md5_final2r   rw  r~   fz_compressed_image_bufferry  rx  $fz_new_image_from_compressed_buffer2r{   rk  r   #fz_new_image_from_compressed_bufferpdf_add_imagerX  r   r  r   r  r   calc_image_matrixr>  r  r}   r   r  ry  r  r'  r  fz_append_stringJM_insert_contents)1r]   r3   pixmapr  imaskr  overlayr   keep_proportionr  r  r  r   r  _imgnamedigestsmaskbufr   r!  r   r  img_xref	rc_digestdo_process_pixmapdo_process_streamdo_have_imaskdo_have_imagedo_have_xrefrefimgbufarg_pixdigestmd5_pyrX  imager  maskstatecbuf1ry  r  r  r  zimgr(  xobjectr=  nresr/  s1                                                    r   _insert_imagezPage._insert_image  s   
 .""~~ hhjj	!8 	*(dA66C %"5sHW<M<MxX[}}"]"]^^A %"5sHX<N<NPXY\P]P]"^"^__A1uz 3 /222 ! !MMM  *+F33$%!! *"/99F()% "	" kG		A		A)'22FF;;vt,,D ",TXXZZ1EE$%! ! !==??a' J!:7EMOOTTEE0#!.00!.00!6t<<!/11 B  !BH$(BM 9"emooNND!:7DIIE$%! ! 	& KMME Z*E6::::#E6+<+A6CTCXYYY `,U33 `.w????'w/A/FHZH^___(//F6]]F;;vt,,D &,TXXZZ1EE$e&93@Q@QS[\_S`S`&a&abb$e&93@R@RT\]`TaTa&b&bcc ! !6v>>GGIIGGII &$%M N	"g- M 8%@@' M$&KLLLiikk"--//
"6u==
d5g>>B" , ;U=MNN M$&KLLLiikk"--//
"6u==
d5g>> @"-  }T**" $(  	%c511C / c2...',,H&GFOI 	?6txxzz8KCXCXYYI' Z!3DHHJJ@U@UWXYY	(HY4G4GHHG% U1)Xi=P=PRSTT#Aq$HHC3777&r**Dg	35#%suce"LMMggU]gggA"4+++sDHHJJg>>> 	"W$$T>!r   c                    |                                  }t          |           |                                }t          |||||||||	|

  
        }t	          j        |                                t          d                    }t	          j        |t          d                    }|j	        sXt	          j
        |d          }t	          j        |                                |t          d          t          d                     t          |d          \  }}|st          d          t	          j        ||d          }t	          j        |||           |S )Nr   r  r
   r   zcannot insert font)r]
  r$  r   r  rf   r  r   r   r   r   r  r  r  r   rF  r>  )r]   r   r]  r  r  
set_simpler*  r  r  r  r_  r   r!  r   r(  r  r  r   font_objs                      r   _insertFontzPage._insertFontn  s1   ~~4hhjjsFHZSRWY^`hjrss2DHHJJ@U@UVV	"9hv.>.>?? 	\&sA..E

E8K3H3H(SYJZJZ[[[eQ''4 	6 4555)#tQ77E8X666r   c                     |                                  }t          |           |dk    rt          ||          }nt          ||          }|rt	          |          nd S rW   )r]
  r$  JM_get_annot_by_nameJM_get_annot_by_xrefr   )r]   r   r   r   r   s        r   _load_annotzPage._load_annot  s`    ~~419 	5(t44EE(t44E$.uU|||$.r   c           	      T    t          || j        |||||          }t          |          S r   )JM_pixmap_from_pager   r  )r]   r   r  r  r  rg  r  r  s           r   _makePixmapzPage._makePixmap  s)    !#ty#r5&$OOc{{r   c                 p   t          j        t           j        j                  }t          j        | j                  }|j        rOt          j        |                                |          }t          j        |          rt          j	        |          }t          j
        |          rd S t          |          S r   )rf   r/  r0  r   r   r   r   r   r6  pdf_to_rectrl  r.  )r]   boxtyper   r   r   s        r   
_other_boxzPage._other_box  s    |U\899*DI66? 	.%txxzz7;;C!#&& .(--$d++ 	Ft$$$r   c                     t          | j        t          j                  r| j        S t          j        | j                  S )zi
        Returns self.this as a mupdf.PdfPage using pdf_page_from_fz_page() if
        required.
        )rz   r   rf   r   r   r\   s    r   r]
  zPage._pdf_page  s5    
 di// 	9*49555r   c                 8    | j                                          dS )z,Invalidate / delete all annots of this page.N)r  r  r\   s    r   r
  zPage._reset_annot_refs  s         r   c                    |dk    r
|dk    r|d S t          t          t          |d          dz                      }|dk    rd}t          t          t          |d          dz                      }|dk    rd}d||fz  }|sd S t          j        | j                  }t          |           t          j        |                                t          d                    }|j
        s5t          j        |                                t          d          d          }t          j        |t          d                    }	|	j
        s#t          j        |t          d          d          }	t          j        |	          }
t          |
          D ]5}t          j        |	|          }t          j        |          }||k    r|c S 6t          j        |                                d	          }t          j        |t          d
          |           t          j        |t          d          |           t          j        |	||           |S )Nr   r   r  c   zfitzca%02i%02ir   ry   r   r   r   r   )r   rg	  r  rf   r   r   r$  r   r   r   r   r  rB  r  rD  r@  r  r   r  r>  )r]   gstater   r   rK  tCAtcar   r(  r*  rF  rq   r   r   opas                  r   _set_opacityzPage._set_opacity  s%   7 	rQw 	9 	F%Bc)**++#: 	C%B

S())**#: 	C!S#J. 	F*49554&txxzz8K3H3HII	# 	V/

H[<Q<QSTUUI!)Xk-B-BCC 	P*9h{6K6KQOODt$$q 	 	A'a00B$R((Dv~  Q//Xd^^R888Xd^^R888D&#...r   c           
      n   | j         }|t          d          |j        st          d          d}||vrt          d          t          |          }| j        }t          |d         |j        |d         z
  |d         |j        |d         z
            }|j        |j        cxk    r|j        cxk     r|j        k    r-n n*|j        |j        cxk    r|j        cxk     r|j        k    sn t          | d	          |	                    | j
        |d
t          t          |                     d           d S )Nr0	  r  )CropBoxBleedBoxTrimBoxArtBoxzbad boxtyper   r   ry   r   z not in MediaBoxr(  r)  )r   r   r  r   r  r  r  r  r  r*  r   r}   r|   )r]   r  r   r   valid_boxesmbs         r   _set_pageboxzPage._set_pagebox  s   k 	@>???z 	*[)))B+% 	,]+++Dzz]DGRUT!W_d1grutAwGG 	; 	; 	; 	;47 	; 	; 	; 	;be 	; 	; 	; 	; 	; 	; 	; 	; 	;47 	; 	; 	; 	;VXV[ 	; 	; 	; 	;999:::G-J5;;1G1G-J-J-JKKKKKr   c                     |                                  }t          |           t          |                                ||           d S r   )r]
  r$  JM_set_resource_propertyr   )r]   r   r   r   s       r   r
  zPage._set_resource_property  s?    ~~4 T488888r   c	                    t          |          }	t          |          }
|}t          j        | j                  }|                                }|                                }t          |           t          ||||j                  }|st          j	        |          }t          j
        |d          }t          j        |d|           t          j
        |d          }t          j        |t          d          |           t          j        d          }t          j        |d           t          j        ||	|
||          }|dk    r#t#          |t          j        |          |           t          j        |t          d                    }t          j        |t          d                    }|j        s#t          j        |t          d          d          }t          j        |||           t          j        d          }t          j        |d	           t          j        ||           t          j        |d
           t/          ||||           |S )Nr
   fullpager
     z/fullpage Dor   r   r
  z q /z Do Q )r  r  rf   r   r   r   r   r  JM_xobject_from_pager   r  r>  r  r   r  r
  pdf_new_xobjectrX  rs  r  r   r   r  r
  )r]   
fz_srcpager
  r  r   r  r  graftmapr
  r  r=  rc_xrefr
  tpagerefr  xobj1subres1subresr   xobj2r(  r  s                         r   _show_pdf_pagezPage._show_pdf_page  s   !$''''+DI6699;;    %VZx}MM 	.&u--G $VQ//GZ777#FA..68I#6#6@@@!"%%sN333%fgsFCHH6 	LVU%?%F%FKKK 28Xk=R=RSS	#Ix	/B/BCC  	P,Y8K8KQOOFFHe444
 "2&&tV,,,tX...tX...68T7;;;r   r  c                 ,   t          |           }	 |                     |          }|dk    r|                     |           n!# |dk    r|                     |           w w xY wt          |          }t	          | |           t          |d          sJ |S )zAdd a 'Caret' annotation.r   r   )annot_preprocessr[
  rs  r   annot_postprocessr  )r]   r  old_rotationr   s       r   add_caret_annotzPage.add_caret_annot   s    '--	0))%00Eq  0!!,/// q  0!!,////0u$&&&x(((((   A A r   c                     t          |           }	 |                     |t          j                  }|dk    r|                     |           n!# |dk    r|                     |           w w xY wt          | |           |S )z*Add a 'Circle' (ellipse, oval) annotation.r   )r7  r
  rf   r  rs  r8  r]   r   r9  r   s       r   add_circle_annotzPage.add_circle_annot'       '--	0..tU5KLLEq  0!!,/// q  0!!,////0$&&&    A A+r   r3   r  r  re
  c                     t          |           }	 |                     ||||||          }|dk    r|                     |           n!# |dk    r|                     |           w w xY wt          | |           |S )z"Add a 'FileAttachment' annotation.)r  r  re
  r   )r7  rh
  rs  r8  )	r]   r  r   r3   r  r  re
  r9  r   s	            r   add_file_annotzPage.add_file_annot2   s     (--
	0((' )  E q  0!!,/// q  0!!,////0$&&&s   A A&r:   r   r   r{  r   r  r   r   c
                     t          |           }
	 |                     |||||||||		  	        }|
dk    r|                     |
           n!# |
dk    r|                     |
           w w xY wt          | |           |S )zAdd a 'FreeText' annotation.)r   r   r{  r   r  r   r   r   )r7  rl
  rs  r8  )r]   r   r:   r   r   r{  r   r  r   r   r9  r   s               r   add_freetext_annotzPage.add_freetext_annotK   s     (--	0,,%%!-))! - 
 
E q  0!!,/// q  0!!,////0$&&&s   A A)c                     |t          | |||          }nt          |          }|                     |t          j                  }|S )zAdd a 'Highlight' annotation.NrR  r  r  )get_highlight_selectionCheckMarkerArgr
  rf   PDF_ANNOT_HIGHLIGHT)r]   r
  rR  r  r  r
  rN   s          r   add_highlight_annotzPage.add_highlight_annotl   sN      	&'E4PPPAAu%%A##Au'@AA
r   handwritingc                     t          |           }	 |                     |          }|dk    r|                     |           n!# |dk    r|                     |           w w xY wt          | |           |S )znAdd a 'Ink' ('handwriting') annotation.

        The argument must be a list of lists of point_likes.
        r   )r7  rw
  rs  r8  )r]   rK  r9  r   s       r   add_ink_annotzPage.add_ink_annotv   s    
 (--	0''44Eq  0!!,/// q  0!!,////0$&&&r;  r  r  c                     t          |           }	 |                     ||          }|dk    r|                     |           n!# |dk    r|                     |           w w xY wt          | |           |S )zAdd a 'Line' annotation.r   )r7  rz
  rs  r8  )r]   r  r  r9  r   s        r   add_line_annotzPage.add_line_annot   s    '--	0((R00Eq  0!!,/// q  0!!,////0$&&&   A A!r  c                     t          |           }	 |                     |t          j                  }|dk    r|                     |           n!# |dk    r|                     |           w w xY wt          | |           |S )zAdd a 'Polygon' annotation.r   )r7  r~
  rf   r  rs  r8  r]   r  r9  r   s       r   add_polygon_annotzPage.add_polygon_annot   s    '--	0''0GHHEq  0!!,/// q  0!!,////0$&&&r@  c                     t          |           }	 |                     |t          j                  }|dk    r|                     |           n!# |dk    r|                     |           w w xY wt          | |           |S )zAdd a 'PolyLine' annotation.r   )r7  r~
  rf   r  rs  r8  rR  s       r   add_polyline_annotzPage.add_polyline_annot   s    '--	0''0IJJEq  0!!,/// q  0!!,////0$&&&r@  c                     t          |           }	 |                     |t          j                  }|dk    r|                     |           n!# |dk    r|                     |           w w xY wt          | |           |S )z&Add a 'Square' (rectangle) annotation.r   )r7  r
  rf   r  rs  r8  r=  s       r   add_rect_annotzPage.add_rect_annot   r?  r@  Tr   r|  c	                    d}	|rt          |           t          |           |sd}|sd}|sd}t          |d          r|||f}t          |          dk    r
|dd         }d}
 |
j        |||d}	|d	}|r2t          |d          r|||f}t          |          dk    r
|dd         }t	          |           }	 |                     |||	||
          }|dk    r|                     |           n!# |dk    r|                     |           w w xY wt          | |           |r|                                	                                dd         }|\  }}}}}|
                    |           |
                    |           |
                    |           |
                    |           |
                    |           |
                    d           d                    |          }|                    |d           |S )zAdd a 'Redact' annotation.Nr	  r  r	  r&  r   r  r  r   r   r   )r:   r  r   r   r   r   r  r  )r,  r  r-  r  r7  r
  rs  r8  r   r  r6   r  r   )r]   r  r:   r   r   r   r   r   r|  r  rv   r9  r   r  r  r  r  r  r  r   s                       r   add_redact_annotzPage.add_redact_annot   sn     	$tz""" "!  '&
z;// B(*jA
:" ,'^
5CSZx8DDDF !  $4-- . $-Dt99q= $8D'--	0**4d6" + / /E q  0!!,/// q  0!!,////0$&&&  
	 \\^^..00"5F &Ar2r2MM"MM"MM"MM"MM"MM$F##BLLQs   9C/ /Dc                     |t          | |||          }nt          |          }|                     |t          j                  S )zAdd a 'Squiggly' annotation.NrF  )rG  rH  r
  rf   PDF_ANNOT_SQUIGGLYr]   r
  rR  r  r  r
  s         r   add_squiggly_annotzPage.add_squiggly_annot   sJ      	&'E4PPPAAu%%A$$Q(@AAAr   r
  c                     t          |           }	 |                     ||          }|dk    r|                     |           n!# |dk    r|                     |           w w xY wt          | |           |S )z$Add a ('rubber') 'Stamp' annotation.r   )r7  r
  rs  r8  )r]   r   r
  r9  r   s        r   add_stamp_annotzPage.add_stamp_annot   s    '--	0))$66Eq  0!!,/// q  0!!,////0$&&&rP  c                     |t          | |||          }nt          |          }|                     |t          j                  S )zAdd a 'StrikeOut' annotation.NrF  )rG  rH  r
  rf   PDF_ANNOT_STRIKE_OUTr]  s         r   add_strikeout_annotzPage.add_strikeout_annot!  sH     	&'E4PPPAAu%%A$$Q(BCCCr   Notec                     t          |           }	 |                     |||          }|dk    r|                     |           n!# |dk    r|                     |           w w xY wt          | |           |S )z&Add a 'Text' (sticky note) annotation.)re
  r   )r7  r
  rs  r8  )r]   r  r:   re
  r9  r   s         r   add_text_annotzPage.add_text_annot!  s    '--	0((4(@@Eq  0!!,/// q  0!!,////0$&&&s   A A#c                     |t          | |||          }nt          |          }|                     |t          j                  S )zAdd a 'Underline' annotation.NrF  )rG  rH  r
  rf   PDF_ANNOT_UNDERLINEr]  s         r   add_underline_annotzPage.add_underline_annot!  sH     	&'E4PPPAAu%%A$$Q(ABBBr   r  c                    t          |            | j        }|j        st          d          |                                 |                     |j        |j                  }|sdS d|_        t          j
        |           |_        || j        t          |          <   |j        |_        ||_        |                                 |S )zAdd a 'Widget' (form field).r  NT)r-  r   r  r   r

  r
  r	  r	  r   r  r  r  r  r
  r  )r]   r  r   r   s       r   
add_widgetzPage.add_widget !  s    Dkz 	*[))) 163DEE 	4}T**&+E#r   c                 z    	 t          |            |                                 }|j        sg S t          |          S )z.
        page get list of annot names
        )r-  r]
  r   JM_get_annot_id_listr]   r   s     r   annot_nameszPage.annot_names2!  sA     	>D~~ 	I#D)))r   c                      t          |           S )zH
        List of xref numbers of annotations, fields and links.
        )JM_get_annot_xref_list2r\   s    r   rA	  zPage.annot_xrefs=!  s     't,,,r   c              #   B  K   t           j        t           j        t           j        ft	          d          s!fd|                                 D             }n!fd|                                 D             }|D ]"}|                     |          }d|_        |V  #dS )a   Generator over the annotations of a page.

        Args:
            types: (list) annotation types to subselect from. If none,
                   all annotations are returned. E.g. types=[PDF_ANNOT_LINE]
                   will only yield line annotations.
        r  c                 4    g | ]}|d          v|d         S r<	  r    )rp   r   
skip_typess     r   rr   zPage.annots.<locals>.<listcomp>M!  s+    VVVAqt:?UV1Q4VVVr   c                 H    g | ]}|d          v |d          v|d         S r<	  r    )rp   r   rt  typess     r   rr   zPage.annots.<locals>.<listcomp>O!  s<    hhhAqtu}hQRSTQU]gQgh1Q4hhhr   TN)rf   r>	  PDF_ANNOT_POPUPr  r  rA	  
load_annot_yielded)r]   rv  rA	  r   r   rt  s    `   @r   rg  zPage.annotsC!  s       *E,A5CYZ
um,, 	iVVVV)9)9););VVVKKhhhhh)9)9););hhhK 	 	DOOD))EENKKKK	 	r   c                     |                      d          }|| j        S | j        }t          |d         |j        |d         z
  |d         |j        |d         z
            S )z
The ArtBoxr"  Nr   r   ry   r   r  r  r  r   r  r]   r   r$  s      r   artboxzPage.artboxU!  s\     x(( 	 <]DGRUT!W_d1grutAwGGGr   c                     |                      d          }|| j        S | j        }t          |d         |j        |d         z
  |d         |j        |d         z
            S )zThe BleedBoxr   Nr   r   ry   r   r{  r|  s      r   bleedboxzPage.bleedbox^!  s\     z** 	 <]DGRUT!W_d1grutAwGGGr   c                    t          |            t          | j                  }t          j        |          }t          |          }|j        r| j        j        rv| j	        }|j
        |j        }}| j        dvr||}}t          dd||          }t                              d                                          d         }t!          |           |S )zGet page rectangle.)r      r   F)r 
  r   )r-  r   r   rf   r
  r   r
  r   r  r  r  r  r
  r   mupdf_warningsr  rB   )r]   r   r   cbr   r  r  s          r   boundz
Page.boundg!  s    D49%%!$''3ii? 	t{1 	B8RYqA}H, !1q!Q""C&&U&33>>@@DCCLLL
r   c                     |s| j         s|                                  t          j        | j                  }|j        sd S t          d|          }t          j        |                                ||           d S )Nr   )rR  rU  )	
is_wrappedwrap_contentsrf   r   r   r   rW  pdf_filter_page_contentsr   )r]   rU  r   rY  s       r   rZ  zPage.clean_contentsy!  s{     	! 	!   *DI66 	F(XFFF&

D'BBBBBr   c                     t          |            |                                 }|j        st          j        | j                  }n!t          |                                          }t          |          }|S )zThe CropBox.)	r-  r]
  r   rf   r
  r   r  r   r   )r]   r   r   s      r   r  zPage.cropbox!  sd     	D~~ 	)%di00CCTXXZZ((C3ii
r   c                     | j         j        S r   )r  r  r\   s    r   cropbox_positionzPage.cropbox_position!  s    |r   c                    t          |            t          |           |                                 }	 t          |j                  }|snt	          j        ||j                   2t	          j        |j                  }t	          j        ||j                   t          |          }|r<d|_        t          j
        |           |_        ||j        j        t          |          <   |                                 |S )z!Delete annot and return next one.r   T)r-  r]
  ra  r   rf   rb  r  r   r   r  r  r   r  r  r   )r]   r   r   rf  	nextannotr   s         r   delete_annotzPage.delete_annot!  s    DE~~	9)%*55I "4888	9 (44	tUZ000I 	2CK t,,CJ.1CJ"2c77+
r   c                 x    t                      t          t                    sdS  fd}t          j         j                  }|j        s
 |            S t                   }|dk     r
 |            S t          j        |	                                t          d                    }|j        s
 |            S t          j        |          }|dk    r
 |            S d}t          |          D ]1}t          j        t          j        ||                    }||k    r n2||k    r
 |            S t          j        ||           t          j        |                                |           t          j        |	                                t          d          |           t'          |            |            S )zDelete a Link.Nc                      d         dk    rd S 	 d         } j         |          }|                                 d S # t          $ r t          dk    rt	                       Y d S w xY w)Nr   r   r  r   )r  r   r   r   rF   )linkidlinkobjlinkdictr]   s     r   finishedz"Page.delete_link.<locals>.finished!  s    1$,ff!$*62        '!+@0@0@0@s   )< #A#"A#r   r_  r   )r-  rz   r   rf   r   r   r   r   r   r   r   rc  r  r   rd  re  r  r   r  rB  )	r]   r  r  r   r   rg  rE  oxrefrq   s	   ``       r   delete_linkzPage.delete_link!  s   D8T** 	F		 		 		 		 		 		 *DI66 	8::%!8 	8::#TXXZZ(1C1CDD  	8::"F++19 	8:: 	 	A$e&961&E&EFFEu}  5= 	8::***T222DHHJJ(:(:FCCC$xzzr   c                 *   t           r&t          t          j        | j                            S |                                 }|j        s0t          t          j        t          j        j	                            S t          t          |                    S )zReflects page de-rotation.)r   r<  r   Page_derotate_matrixr   r]
  r   rf   r/  UNITr  )r]   rh  s     r   r3  zPage.derotation_matrix!  sv      	B%4di@@AAA..""! 	;%,u|'899:::-g66777r   c                 N   | j         }|j         }t          |t          j                  sJ t          j                    }||_        t          |          }t          j        ||          }t          j        |||t          j	                               t          j
        |           d S r   )r   rz   rf   r  r  r  r  r  r
  r  r
  )	r]   r
  r  r  r   r  r  r  r
  s	            r   extend_textpagezPage.extend_textpage!  s    yZ2u011111&((''nR))4c5>+;+;<<<s#####r   c                    t          |            |                                 }|sdS t          j        |          }|j        sdS t          |          }d|_        t          j        |           |_	        || j
        t          |          <   |S )zFirst annotation.NT)r-  r]
  rf   pdf_first_annotr   r   r   r  r  r   r  r  )r]   r   r   r   s       r   first_annotzPage.first_annot!  s     	D~~ 	F%d++ 	FEll]4((
$'C!
r   c                 *    |                                  S )z$
        First link on page
        )
load_linksr\   s    r   
first_linkzPage.first_link!  s    
    r   c                 t   t          |            d}|                                 }|sdS t          j        |          }|j        sdS t          |          }d|_        t          j        |           |_	        || j
        t          |          <   t                      }t                              ||           |}|S )zFirst widget/field.r   NT)r-  r]
  rf   pdf_first_widgetr   r   r   r  r  r   r  r  r  r   r  )r]   r   r   r   r  s        r   first_widgetzPage.first_widget"  s     	D~~ 	F&t,, 	FEll]4((
$'C!3'''
r   c                 v   t          |            | j        }|dk    r|                     d           | j        }g }|rdnd}t	          ||          }t          j        ||t          j                    t          j                               t          j	        |           |dk    r|                     |           |S )Nr   TF)
r-  r
  rs  r   JM_new_bbox_devicerf   r
  r9  r  r
  )r]   layersr9  r   rh   
inc_layersr
  s          r   get_bboxlogzPage.get_bboxlog"  s    D}1 	!a   y#.TT
 "j114en&6&68H8HIIIs###1 	,l+++	r   c                 \   t          |            | j        }|dk    r|                     d           | j        }t	          |t
          j                  rt          j        |          }t	          |t
          j                  sJ d| j                    |rdnd}t          j        |          }t          rt          j        ||||          }nt                      }t          |          s|t          |||          }	nt          |||          }	t          j        ddddd|j                  |	_        t          j        ||	t          j                    t          j                               t          j        |	           |dk    r|                     |           t          |          s|dS |S )z3Extract vector graphics ("line art") from the page.r   z
self.this=TFNr   r   )r-  r
  rs  r   rz   rf   r   r   r
  r   r   get_cdrawingsr{   callableJM_new_lineart_device_Devicer9  r  ptmr
  r  r
  )
r]   extendedcallbackmethodr9  r   clipsprectrh   r
  s
             r   r  zPage.get_cdrawings&"  s   D}1 	!a   ydEM** 	&<%%D$-->>$)>>> +e#D)) 
	'$T8XvFFBBB!! FV F28UFKK22ufEEnQ1b!UX>>CGdC)9)95>;K;KLLL!#&&&1 	,l+++H 	 	F	r   c                    t          |            g }t          j        | j                  }|                                }t          j        |t          j                  }t          j        |          ret          j        |          }t          |          D ]@}t          j
        ||          }t          j        |          }|                    |           An0|j        r)t          j        |          }|                    |           |S )zGet xrefs of /Contents objects.)r-  rf   r   r   r   r   r
  r6  rc  r  rd  r   r6   r   )	r]   rN   r   r   r  rF  rq   icontr   s	            r   get_contentszPage.get_contentsE"  s    D*4955hhjj%c5+GHHh'' 	#H--A1XX ! !+Ha88'..

4    !   	#H--DJJ
r   c                     t          |            |rt          j        | j                  }nt          j        | j                  }t          |          S )z|
        Make a DisplayList from the page for Pixmap generation.

        Include (default) or exclude annotations.
        )r-  rf   fz_new_display_list_from_pager   &fz_new_display_list_from_page_contentsr  )r]   rg  r  s      r   get_displaylistzPage.get_displaylistW"  sM     	D 	I4TY??BB=diHHB2r   Fr  c                    d}|                      |          }t          t          |                    D ]<}||         }|d                             d          st	          |d                   |d<   nt	          |d                   |d<   |d         dk    r|d         }g }|D ]}|d	         }	|d
d         }
|	dk    r1dt	          |
d	                                                   |
d
         f}n;|	dk    rdt          |
d	                   f}nt          |	gd |
D             z             }|                    |           ||d<   |d         dv r|D ]}|	                    |          ||<   |||<   >|S )a<  Retrieve vector graphics. The extended version includes clips.

        Note:
        For greater comfort, this method converts point-likes, rect-likes, quad-likes
        of the C version to respective Point / Rect / Quad objects.
        It also adds default items that are missing in original path types.
        )
	closePathr   r  r  lineCaplineJoinr  stroke_opacityfill_opacityeven_odd)r  r   r  r   scissorr	  rt  r   r   Nr  quc                 ,    g | ]}t          |          S r    r  ro   s     r   rr   z%Page.get_drawings.<locals>.<listcomp>"  s    -E-E-E1eAhh-E-E-Er   r  )r  r  r-  r   r   	normalizeQuadr|   r6   r   object)r]   r  allkeysr   rq   npathrt  newitemsr   cmdrestrx  DrawpathDrawpathlistget_linearts                  r   get_drawingszPage.get_drawingsd"  s      ( 33s3xx 	 	AFE=++F33 : $U6] 3 3f#'i(8#9#9i V}g% *g! 	* 	*Dq'C8Dt G $d47mm&=&=&?&?aI G $d47mm4$cU-E-E-E-E-E%EFFOOD))))!)gV}
* ,  , ,A$yy||E!HHCFF
r   c           	      F   | j         }|dk    rt          S | j        }|dk    r2t          dddd|j        |j        z
  |j        z
  |j        z
  d          }n\|dk    r2t          ddddd|j        |j        z
  |j        z
  |j        z
            }n$t          ddddd|j        z  d|j        z            }|| j        z  }t          t          |                    dz   }|                    d          }t                              | |d          }|d	v r8|\  }}}	}
||_        ||_        |
|_        |	|_        |                     |           |                     d           | }|                                 D ]!}|j        |z  }|                    |           "|                                 D ]<}|d
         |z  }|                     |           ||d
<   |                     |           =|                                 D ]'}|j        |z  }||_        |                                 (|S )z;Set page rotation to 0 while maintaining visual appearance.r   rr  r   r  r  z cm utf8Fr  from)r
  Identityr  r<  r  r  r  r  r3  r}   r|   r  r   _insert_contentsset_mediaboxrs  rg  r   ro  	get_linksr  insert_linkr	  r  )r]   r  r$  mat0r=  r  r  r  r  r  r  r   r   linkr  s                  r   remove_rotationzPage.remove_rotation"#  sD   m!8 	 ]"9 	>!Q1bebembe&;be&CQGGDDCZ 	>!Q1a)>)FGGDD!Q1b25j"ru*==D T++c

##f,jj  ""4e44 ) 	"NBBBEBEBEBEb!!!!d[[]] 	 	E
S ANN1NN$$ 	# 	#DVs"AT"""DLT""""llnn 	 	Fc!AFKMMOOOO
r   r   x_tolerancey_tolerancec                    t          |            | j        |t          |          ||||                                 }fd}fd|D             }t	          d |D             d           }g }|r|d         
 }	d}
|
r_d	}
t          t          |          d
z
  dd          D ]9} |||         |	          r%|	||         j        z  }	|	||         j        z  }	||= d}
:|
_|	                    |	           |d= t	          t          |          d           }|t	          t          |          d           }fd|D             S )a  Join rectangles of neighboring vector graphic items.

        Args:
            clip: optional rect-like to restrict the page area to consider.
            drawings: (optional) output of a previous "get_drawings()".
            x_tolerance: horizontal neighborhood threshold.
            y_tolerance: vertical neighborhood threshold.

        Notes:
            Vector graphics (also called line-art or drawings) usually consist
            of independent items like rectangles, lines or curves to jointly
            form table grid lines or bar, line, pie charts and similar.
            This method identifies rectangles wrapping these disparate items.

        Returns:
            A list of Rect items, each wrapping line-art items that are close
            enough to be considered forming a common vector graphic.
            Only "significant" rectangles will be returned, i.e. having both,
            width and height larger than the tolerance values.
        Nc                    | j         | j        k    r| j        | j         fn| j         | j        f\  }}| j        | j        k    r| j        | j        fn| j        | j        f\  }}|j         |j        k    r|j        |j         fn|j         |j        f\  }}|j        |j        k    r|j        |j        fn|j        |j        f\  }}		 	 ||
z
  k     s||
z   k    s||z
  k     s	||	z   k    rdS dS )zDetect whether r1, r2 are "neighbors".

            Items r1, r2 are called neighbors if the minimum distance between
            their points is less-equal delta.

            Both parameters must be (potentially invalid) rectangles.
            r   FTr  r  r  r  )r1r2rr1_x0rr1_x1rr1_y0rr1_y1rr2_x0rr2_x1rr2_y0rr2_y1delta_xdelta_ys             r   are_neighborsz,Page.cluster_drawings.<locals>.are_neighborss#  s    02uru}PbeRU^^25"%.NFF/1uru}PbeRU^^25"%.NFF/1uru}PbeRU^^25"%.NFF/1uru}PbeRU^^25"%.NFFFW,, FW,, FW,,	
 FW,, u tr   c                     g | ]^}	 	 |d         j         j         k    |d         j        j        k    0|d         j        j        k    F|d         j        j        k    \|_S )r   r   r  r  r  r  )rp   rj  pareas     r   rr   z)Page.cluster_drawings.<locals>.<listcomp>#  s     
 
 

 &	(	

 &	(
 &	(
 &	(

 
 
r   c                     g | ]
}|d          S r  r    r  s     r   rr   z)Page.cluster_drawings.<locals>.<listcomp>#  s    222q6222r   c                     | j         | j        fS r   r  r  r   s    r   r  z'Page.cluster_drawings.<locals>.<lambda>#  s    14, r   r  r   TFr   r   c                     | j         | j        fS r   r  r  s    r   r  z'Page.cluster_drawings.<locals>.<lambda>#  s    ad| r   c                     | j         | j        fS r   r  r  s    r   r  z'Page.cluster_drawings.<locals>.<lambda>#  s    !$ r   c                 @    g | ]}|j         k    |j        k    |S r    r  r  )rp   r   r  r  s     r   rr   z)Page.cluster_drawings.<locals>.<listcomp>#  s1    QQQa'(9Qah>PQQQQr   )r-  r   r   r  r	  r  r-  r  r  r6   r-  )r]   r  drawingsr  r  r  pathsprects	new_rectsr   repeatrq   r  r  r  s               @@@r   cluster_drawingszPage.cluster_drawingsS#  s   . 	D	 	JJE 	+((**H	 	 	 	 	 	6
 
 
 

 
 
 22E2228N8NOOO	
  	E
AF &s6{{Q266 & &A$}VAY22 &VAY\)VAY\)"1I!%  & Qq	CKK-C-CDDDF  	E  3y>>/E/EFFF	QQQQQ9QQQQr   c                 b    t          |            | j                            | j        |          S )z)List of fonts defined in the page object.r  )r-  r   r  r  r]   r  s     r   	get_fontszPage.get_fonts#  s-    D{))$+D)AAAr   c           	         t          |            | j        }|j        s|j        rt	          d          t          dddd          }t                      }|r||f}n|}t                    t          t          fv r.t          d                   t          urt	          d          }njfd|                    | j        d          D             }t          |          dk    r	|d         }n'|g k    rt	          d          t	          d	z            |d         }	|	dk    s|du r>	 |                     ||
          d         S # t          $ r t!                       |cY S w xY w|                                 }
t%          |
          }t'          |          s|S |D ]}|d         |d         k    rt)          |d                   }|j        }|dk    r|} nt          t-          |j        |j                            }t3          |j        |j        z
            }t3          |j        |j        z
            }t          d|z  ddd|z  dd          }||z   }||f} |}|S )zGet rectangle occupied by image 'name'.

        'name' is either an item of the image list, or the referencing
        name string - elem[7] of the resp. item.
        Option 'transform' also returns the image transformation matrix.
        r  r   r   z!need item of full page image listc                 ,    g | ]}|d          k    |S )r  r    )rp   rq   r   s     r   rr   z'Page.get_image_bbox.<locals>.<listcomp>#  s)    YYYQDTUVWTXLYqYYYr   Tr   zbad image namez!found multiple images named '%s'.)rF
  )r-  r   r   r  r   r   r<  r   r{   r|   r   r  r  r-  get_image_rectsr   rF   r]
  JM_image_reporterr  r  r   util_hor_matrixlllrr  r}  ur)r]   r   rF
  r   inf_rectnull_matrh   r   imglistr   rX
  r   rM   r
  r   hmr  r   m0rH  s    `                  r   get_image_bboxzPage.get_image_bbox#  s    	Dk= 	=C, 	=;<<<1b"%%88 	H%BBB::$& 	MR>>S( F !DEEEDDYYYY#"5"5dk4"H"HYYYG7||q  MqzB M !1222 !Dt!KLLLBx19 	 	T) 	  ++DI+FFqII           >>##))Cyy 	I 	 	AttBx QqT

A6DA~ ad3344BAD14K  AAD14K  AAq!QUAq11Br'
AB
s   &E E E c                 b    t          |            | j                            | j        |          S )z*List of images defined in the page object.r  )r-  r   r  r  r  s     r   
get_imageszPage.get_images#  s-    D{**4;T*BBBr   c                     g }|                                  D ]H\  }}| j                            |d          }d|v rd}nd|v rd}n0|                    |||f           I|S )zGet OCGs and OCMDs used in the page's contents.

        Returns:
            List of items (name, xref, type), where type is one of "ocg" / "ocmd",
            and name is the property name.
        Tr  r
  r  r
  ocmd)r
  r   r  r6   )r]   rh   pnamer   r:   octypes         r   get_oc_itemszPage.get_oc_items#  s     88:: 	- 	-KE4;**4D*AADd" % IIudF+,,,,	r   c                 Z   t          |            t          j        | j                  }t	          |          }|}|dk    rt          j        nt          j        }t          j        ||          }t          j        d          }t          j	        |          }t          j
        ||j        |j        z
  |j        |j        z
  |d          }	t          j        | j        |	|t          j                               t          j        |	           |                                 t'          |          }
|
S )zMake SVG image from page.r      )r-  rf   r
  r   r  FZ_SVG_TEXT_AS_PATHFZ_SVG_TEXT_AS_TEXTrf  r  r  fz_new_svg_devicer  r  r  r  r
  r  r
  r0  ro  )r]   r  text_as_pathr  r  tboundstext_optionr   r1  r
  r:   s              r   get_svg_imagezPage.get_svg_image$  s
   D&ty11''3?13Dce//%Jc)'377!$''nS!!%
7:%
7:%  	$)S#u~/?/?@@@c"""%c**r   r   c                     |}||                                  }n#t          |d          | k    rt          d          |                    |          }|~|S )Nr   znot a textpage of this page)r  r   r   extractTextbox)r   r   textpager  rh   s        r   get_textboxzPage.get_textbox($  sm    
  	<""$$BBR""d* 	<:;;;t$$ 		r   r  r  r  c                    t          |            |t          dd          }| j        }|dk    r|                     d           	 |                     |||          }|dk    r|                     |           n!# |dk    r|                     |           w w xY wt          |          }t          j        |           |_        |S )Nr   r   )r  r  )	r-  r<  r
  rs  r
  r  r  r  r   )r]   r  r  r  r9  r&  s         r   r  zPage.get_textpage7$  s    D 	"Aq\\F}1 	!a   	0))$eF)KKHq  0!!,/// q  0!!,////0H%%!---s   A9 9Bc                    t          |            | j        }|dk    r|                     d           | j        }g }t          rt          j        |          }nt          |          }t          j        |          }t          j	        ddddd|j
                  |_        t          j        ||t          j	                    t          j                               t          j        |           |dk    r|                     |           |S Nr   r   r   )r-  r
  rs  r   r   r   JM_new_texttrace_devicerf   r
  r9  r  r  r
  r  r
  )r]   r9  r   rh   r
  r  s         r   get_texttracezPage.get_texttraceG$  s    D}1 	!a   y 	./33CC)"--C#D)).Aq"a::$U^%5%5u~7G7GHHHc"""1 	,l+++	r   c                 ^    t          |            | j                            | j                  S )z,List of xobjects defined in the page object.)r-  r   r  r  r\   s    r   get_xobjectszPage.get_xobjects\$  s(    D{,,T[999r   helvc                    | j         }|t          d          d}|                    d          r
|dd          }t                              |          }	|	t                      k    rt          d|	           t          | |          }
|
1|
d         }t          ||          r|S |                    |           |S t          
                    |                                d           }d}d}g d}g d}	 |                    |          }d}n)# t          $ r t          dk    rt                       Y nw xY w|dk     rB	 |                    |          }d}n)# t          $ r t          dk    rt                       Y nw xY w|                                t                                           v rdd l}|                    |          }~|`t)          |          t*          u r|}nIt-          |d	          rt+          |          }n)t-          |d
          r|j        }nt          d          d }|                     ||||||||||
  
        }|s|S |d         }|d         }t          ||          r|S |                    ||           |S )Nr0	  r   rj  r   zbad fontname chars r   )r  r  r  r  )r  china-ssjapan-skorea-sr  r   zbad fontfile)fontdict)r   r   r   rq  rr  r-  	CheckFontCheckFontInfoget_char_widthsr  r   r  r2  r   r   rF   r  r  r  r  r   r   r  r   r	  )r]   r   r  r  r  r  r  r   r*  	inv_charsr/  r   r]  r  
CJK_number
CJK_list_n
CJK_list_sr  fontfile_strr   r4  s                        r   insert_fontzPage.insert_fonta$  s   k 	@>???s## 	$|H&33H==	 	@>9>>???x(( 	7DS$'' %%%K !$$X^^%5%5t<<
===
CCC
	#))(33JEE 	 	 	#a'<N,<,<,<D	
 > 	'--h77
   '!+@0@0@0@
 >>388::: 	    &--h77J  
	 H~~$ 1':.. 1"8}}6** 1'} 000Lxz:WZ$eXzC C  	J1vq6d## 	K 	D8444s$   5D #D32D3=E #E;:E;c                 2    |                                  dk    S )z3Check if /Contents is in a balanced graphics state.r  )r
  r\   s    r   r  zPage.is_wrapped$  s     $$&&&00r   c                     t          j        | j                  }|j        sdS t          j        |                                t          d                    }|j        sdS t          j        |          S )zPage language.NLang)rf   r   r   r   r  r   r   pdf_to_str_buf)r]   rh  r  s      r   r  zPage.language$  sh     -di88! 	F-gkkmmXf=M=MNN 	F#D)))r   c              #   \   K   |                                  }|D ]}|
|d         |v r|V  dS )z Generator over the links of a page.

        Args:
            kinds: (list) link kinds to subselect from. If none,
                   all links are returned. E.g. kinds=[LINK_URI]
                   will only yield URI links.
        Nr	  )r  )r]   kinds	all_linksr  s       r   r  z
Page.links$  sR       NN$$	 	 	D V 5 	 	r   identc                 P   t          |            t          |          t          u rd}|}n*t          |          t          u r|}d}nt	          d          |                     ||          }|s|S d|_        t          j        |           |_	        || j
        t          |          <   |S )zLoad an annot by name (/NM key) or xref.

        Args:
            ident: identifier, either name (str) or xref (int).
        r   Nz&identifier must be a string or integerT)r-  r   r   r   r   r  r   r  r  r   r  r  )r]   rE  r   r   r   s        r   rx  zPage.load_annot$  s     	D;;# 	GDDD%[[C 	GDDDEFFFtT** 	J]4((
$'C!
r   c                    t          |            t          j        | j                  }|j        sdS t          |          }d|_        t          j        |           |_	        || j
        t          |          <   d|_        d|_        | j	        j        rE|                                 }d |D             }|r"|d         }|d         |_        |d         |_        nd|_        d|_        |S )zGet first Link.NTr   r(   c                 >    g | ]}|d          t           j        k    |S r  r=	  r  s     r   rr   z#Page.load_links.<locals>.<listcomp>$  s)    FFF111E)EFQFFFr   ry   )r-  rf   fz_load_linksr   r   r	  r   r  r  r   r  r  r   r  rA	  )r]   r   r  link_ids       r   r  zPage.load_links$  s    D!49--~ 	FCjj]4((
$'C!; 		$$&&EFFFFFE $("1: CHCF
r   c                 d   t          |            t          j        | j                  }t	          |           t          ||          }|}|s|S d|_        t          j        |           |_	        || j
        t          |          <   t                      }t                              ||           |}|S )zLoad a widget by its xref.T)r-  rf   r   r   r$  JM_get_widget_by_xrefr   r  r  r   r  r  r  r   r  )r]   r   r   r   r   r  s         r   load_widgetzPage.load_widget%  s    D*DI664%tT22 	J]4((
$'C!3'''
r   c                     t          |            |                                 }|j        st          j        | j                  }n!t          |                                          }t          |          S )zThe MediaBox.)	r-  r]
  r   rf   r
  r   JM_mediaboxr   r   )r]   r   r   s      r   r  zPage.mediabox%  s`     	D~~ 	,&	22DD

++DDzzr   c                 J    t          | j        j        | j        j                  S r   )r  r  r  r  r\   s    r   mediabox_sizezPage.mediabox_size!%  s    T]%t}'7888r   c                 6    t                               |           S )z7All /Contents streams concatenated to one bytes object.)r   _get_all_contentsr\   s    r   read_contentszPage.read_contents,%  s    &&t,,,r   c                 j    t          |            | j        }|                    |           }|| _        dS )z-Refresh page after link/annot/widget updates.N)r-  r   r  r   )r]   r   r   s      r   refreshzPage.refresh0%  s3    Dkt$$			r   c                     t          |            t          | j        t          j                  r| j        nt          j        | j                  }|j        sdS t          |          S )zPage rotation.r   )r-  rz   r   rf   r   r   r   JM_page_rotationrn  s     r   r
  zPage.rotation8%  s\     	D&ty%-@@ltyyeFabfbkFlFl 	1%%%r   c                 P    t          t                              |                     S )zReflects page rotation.)r<  r   _rotate_matrixr\   s    r   r  zPage.rotation_matrixA%  s      e**400111r   c                     t          |            t          j        | j        |j        t          |          t          j                               dS )z=Run page through a device.
        dw: DeviceWrapper
        N)r-  rf   r
  r   r  r  r  )r]   r  rH  s      r   r  zPage.runF%  sD     	D$)RY0A!0D0DenFVFVWWWWWr   c                 .    |                      d|          S )zSet the ArtBox.r"  r%  r]   r   s     r   
set_artboxzPage.set_artboxM%  s      4000r   c                 .    |                      d|          S )zSet the BleedBox.r   r]  r^  s     r   set_bleedboxzPage.set_bleedboxQ%  s      T222r   c                 v   t          |            | j        }|j        rt          d          |j        st          d          |t          d|                                          vrt          d          |                    |          st          d          |                    | j	        dd|z             dS )	z-Set object at 'xref' as the page's /Contents.r   r  r   rA  zxref is no streamr  rW  N)
r-  r   r   r   r  r  rm  ri  r*  r   )r]   r   r   s      r   set_contentszPage.set_contentsU%  s    Dk= 	0.///z 	*[)))uQ 1 1222 	)Z(((!!$'' 	20111J4@@@@@r   c                 .    |                      d|          S )z,Set the CropBox. Will also change Page.rect.r  r]  r^  s     r   set_cropboxzPage.set_cropboxc%        D111r   c                    t          |            t          j        | j                  }t	          |           |s6t          j        |                                t          d                     dS t          j        |          }t          t          d          sJ t          j
        |j        t          d          t          j        |                     dS )zSet PDF page default language.r@  r  N)r-  rf   r   r   r$  r  r   r   rM  r  r=  r  )r]   r  rh  r  s       r   rO  zPage.set_languageg%  s    D-di887 		w{{}}hv.>.>?????5h??D5"ABBBBB*KV$$7==    r   c                 
   t          |            |                                 }t          |           t          |          }t	          j        |          st	          j        |          rt          t                    t	          j	        |
                                t          d          |           t	          j        |
                                t          d                     t	          j        |
                                t          d                     t	          j        |
                                t          d                     t	          j        |
                                t          d                     dS )zSet the MediaBox.MediaBoxr  r"  r   r!  N)r-  r]
  r$  r  rf   rk  rl  r   rm  r   r   r   r  )r]   r   r   r  s       r   r  zPage.set_mediaboxw%  s'   D~~4"4(("8,, 	,,X66	, l+++Xj-A-A8LLLDHHJJ(;(;<<<DHHJJ(:(:;;;DHHJJ(<(<===DHHJJ(;(;<<<<<r   c                     t          |            t          j        | j                  }t	          |           t          |          }t          j        |                                t          d          |           dS )zSet page rotation.r   N)	r-  rf   r   r   r$  JM_norm_rotationr  r   r   )r]   r
  r   r  s       r   rs  zPage.set_rotation%  sh    D*DI664x((

HX,>,>DDDDDr   c                 .    |                      d|          S )zSet the TrimBox.r!  r]  r^  s     r   set_trimboxzPage.set_trimbox%  rf  r   c                    t          |            t          j                    }|                                 }|j        st          |          S t          j        t          j        j                  }t          j        |||           t          |          }| j	        dz  dk    rt          |          }nt          ddddd| j        j                  }|S )zPage transformation matrix.rq  r   r   r   )r-  rf   r9  r]
  r   r8  r/  r  r  r
  r<  r  r  )r]   r  r   r  r   s        r   r2  zPage.transformation_matrix%  s     	Dn~~ 	*$S)))< 788 x555$$=3!# 	>++CCAq"a)<==C
r   c                     |                      d          }|| j        S | j        }t          |d         |j        |d         z
  |d         |j        |d         z
            S )zThe TrimBoxr!  Nr   r   ry   r   r{  r|  s      r   trimboxzPage.trimbox%  s\     y)) 	 <]DGRUT!W_d1grutAwGGGr   c              #      K   d |                                  D             }|D ]&}|                     |          }|	|j        |v r|V  'dS )a    Generator over the widgets of a page.

        Args:
            types: (list) field types to subselect from. If none,
                    all fields are returned. E.g. types=[PDF_WIDGET_TYPE_TEXT]
                    will only yield text fields.
        c                 J    g | ] }|d          t           j        k    |d         !S r<	  )rf   r  )rp   r   s     r   rr   z Page.widgets.<locals>.<listcomp>%  s-    [[[AaDEDZ<Z[![[[r   N)rA	  rM  r	  )r]   rv  widget_xrefsr   r  s        r   r	  zPage.widgets%  su       \[d&6&6&8&8[[[  	 	D%%d++F  1U : 	 	r   c                     |                                  \  }}|dk    r!d|z  }t                              | |d           |dk    r&d|z  dz   }t                              | |d           dS dS )z,Ensure page is in a balanced graphics state.r   r  Fs   
Qr  TN)r
  r   r  )r]   pushpopprependr6   s        r   r  zPage.wrap_contents%  s    ))++	c!8 	9tmG""4%8887 	7c\E)F""466666	7 	7r   c                 ^    t          |            | j                            | j                  S rS  rT  r\   s    r   r   z	Page.xref%  rU  r   zpage rectangle)r   r  )r  NNNNr   r   r  r  r   )Nr   N)NNNNNr   r   r   r   r   r   r   r   NN)r   r   N)Nr   r   N)r   Nr   r   NNNr  )NNr  r   NNT)rd  r  r   Nr  )NNr   r   r'  )r/  NNFr   r   )r`   ra   rb   r^   r   r   r[
  rh
  rl
  rw
  rz
  r~
  r
  r
  r
  r
  r
  r
  r
  r
  r   r
  r  r  r
  r
  r
  r  r	  r  r  r  r]
  r
  r  r%  r
  r5  r   r   r:  r   r>  r  r  r   rB  r+  r
  r   rD  rJ  r{   rM  rO  rS  rU  rW  r  rZ  r^  r`  rc  rf  ri  r  rk  ro  rA	  rg  r  r}  r  r  rZ  r  r  r  r  r<  r3  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r#  r   r'  r  r,  r.  r=  r  r  r  r  rx  r  rM  r  rQ  rT  rV  r
  r  r  r_  ra  rc  re  rO  r  rs  rm  r2  rp  r	  r  r   r   r    r   r   r   r     s          2 2 2  "  2   > < < < <|  B
 
 
     :
 
 
( ( ( (T     !D !D !DF  	 	 	
 
 
F F F0 6    .     4 GKJK59]" ]" ]" ]"~  (/ / /   	% 	% 	%6 6 6! ! !       DL L L*9 9 9
5 5 5 5nZ E    	Y 	5 	 	 	 	   $  & 	
       :  ""& $ $   	
  !        B 59*. 38    %    	 	 	 	 	 	 		 	 	 	 	 		 	% 	 	 	 		9 	 	 	 	 	 " $!: : : 	:
 : : : : : : : : :| B B B B B B	 	I 	c 	 	 	 	 	D DSX D D D D	 	J 	c 	 	QV 	 	 	 	C CSX C C C C E    $	* 	* 	*- - -   $ H H XH H H XH  $C C C C 
 
 X
   X  .* * *X 86 8 8 8 X8	$ 	$ 	$ 	$   X ! ! X!   X&       >  $   | |T |D | | | ||/ / /d VW^R ^R5:^RMR^R	^R ^R ^R ^R@B B B B
> > > >@C C C C
d    &   6   	     # S]       *: : :
 FJ78Q Q Q Qf 1 1 X1 * * X*   S#X 6 5    .  6  &   X 9 9 X9- - -   & & X& 2 2 2 2 X2X X X1 1 13 3 3A A A2 2 2    = = = E E E2 2 2   X$ H H XH   "7 7 7 2 2 X2
 8E/000DDDr   r   c                   V   e Zd Zd Zd Zd Zd Zd Zed             Z	d5dZ
d6d
Zd7dZed             Zd Zed             Zd Zed             Zd7dZed             Zed             Zed             Zed             Zd8dZd9dZd Zd Zd Zedefd            Zed              Zed!             Zd:d#Z d;d$Z!d<d&Z"d' Z#d( Z$d) Z%d* Z&d+ Z'ed,             Z(ed-             Z)d. Z*ed/             Z+d0 Z,ed1             Z-ed2             Z.ed3             Z/ed4             Z0e+Z1eZ2dS )=r  c                    	 t          |t          t          j        ft          j        t          j        t          t          t          f          rF|\  }}d}t          j	        |t          |          t          j        d          |          }|| _        nt          |t          t          j        ft          j        t          j        t          t          t          ft          t          f          rE|\  }}}t          j	        |t          |          t          j        d          |          }|| _        n+t          |t          t          j        t          d          ft           t          j        f          r|\  }}t%          |t                    r|j        }n|t          j        d          }t%          |t                     r|j        }t          j        |          j        st+          d          |j        rTt          j        ||t          j                    t          j        d          t          j                    d          | _        
nt          j        |          | _        | j        j        st5          t6                    	nt          |t           t          j        ft           t          j        f          r|\  }}t%          |t                     r|j        }t%          |t                     r|j        }|}|}	|j        s0t          j        |	          }
|
j        st5          t6                    nt          j        ||	          }
|
| _        	nt          |t           t          j        ft:          t          ft:          t          fd          s<t          |t           t          j        ft:          t          ft:          t          f          rOt<          dk     rJ d|d            t?          |          dk    r%|\  }}}t          j        t          j                   }n|\  }}}}t          |          }|\  }}}}t%          |t                     r|j        n|}t          |          }t          j!        |          s>t          j"        ||#                                |$                                |||          }nYt          j"        ||#                                |$                                ||t          j        t          j                             }|| _        nGt          |tJ          t           t          j        f          r6|d         d	k    r*|\  }}t%          |t                     r|j        }|| _        nt          |t           t          j        ft          df          rx|d         }t?          |          d
k    r|d         nd}t%          |t                     r|j        n|}tM          |dd          st+          d          t          j        |          }|j        s|st+          d          t          j                    }t          j'        |          }t          j(        |          }t          j)        |          }t          j*        |||||          }|j        j#        |j        _#        |j        j$        |j        _$        |j        j+        |j        _+        |j        j,        |j        _,        	 t          j-        |j        |j        |           || _        nHt          |t          j        t          ft          t          dt          t          f          rd|\  }}}}$}t%          |t                    r#|j        }t%          |t          j                  sJ t          j5        |          }||z   |z  }%t          j                    }t          j*        |||||          }t%          |$tl          tn          f          r$t          j8        |$          }&t?          |$          }nPts          |$          }'|'j        st+          d          t          j:        |'          \  }}(t          j8        |$          }&|%|z  |k    r!t+          d|d|d|d|d|%d|          t          j;        |j        |&           || _        nt          |d          r|\  })d}*ty          |)d          r+|)=                                }+|+rt          j>        |+          },nty          |)|*          r|)j?        }+|+rt          j>        |+          },not%          |)tJ                    rt          j>        |)          },nEts          |)          }'|'j        r|'j        j        st+          d          t          j@        |'          },t          jA        |,t          j        t          t          t          t                    t          jD        |,E                                dd|,F                                dd                    \  }}}t          jG        |,          \  }-}.|-|j        _+        |.|j        _,        || _        nt          |t          t          jI        ft                    r|\  }/}0t          |/          }1t          |1           t          jL        |1          }2tM          |0d|2dz
            st+          t                    t          jN        |1|0d          }3t          jO        |3t          d                    }4t          jQ        |4t          d                    sXt          jQ        |4t          d                    s6t          jQ        |4t          d                    st+          t                    t          jS        |1|3          },t          jA        |,t          j        t          t          t          t                    t          jD        |,E                                dd|,F                                dd                    \  }5}}|5| _        n/d}6|D ]}7|6dt          |7           d|7 dz  }6t          |6          d| _U        dS ) a  
        Pixmap(colorspace, irect, alpha) - empty pixmap.
        Pixmap(colorspace, src) - copy changing colorspace.
        Pixmap(src, width, height,[clip]) - scaled copy, float dimensions.
        Pixmap(src, alpha=1) - copy and add or drop alpha channel.
        Pixmap(filename) - from an image in a file.
        Pixmap(image) - from an image in memory (bytes).
        Pixmap(colorspace, width, height, samples, alpha) - from samples data.
        Pixmap(PDFdoc, xref) - from an image at xref in a PDF document.
        r   Nz"source colorspace must not be Noner   r   r>  re	  zCannot handle args=zY because fz_scale_pixmap() and fz_scale_pixmap_cached() are not declared in MuPDF headersr   rawry   zbad alpha valuez'cannot drop alpha for 'NULL' colorspace   zbad samples datazbad samples length w=z h= alpha=z n=z stride=z size=r   resolvebad image datarC  r[  Alpha
Luminosityz+Unrecognised args for constructing Pixmap:
    r,   r  )Vr  rl  rf   rn  r/  FzIrectIRectr   r|   fz_new_pixmap_with_bboxr  r  r   r   r  r   r  FzPixmaprz   fz_pixmap_colorspacer   r   r
  r
  ru   fz_new_pixmap_from_alpha_channelr   MSG_PIX_NOALPHA!fz_new_pixmap_from_color_and_maskr+  r~   r-  fz_infinite_irectr  fz_scale_pixmapr  r  r   r]  fz_pixmap_colorantsfz_pixmap_widthfz_pixmap_heightfz_new_pixmapr  r  ll_fz_pixmap_copyfz_pixmap_samples_memoryviewr  striderF  r  fz_samples_setfz_samples_getr~  r   r3  r  r   r  ll_fz_pixmap_copy_rawr  r   fz_new_image_from_filer   rw  fz_get_pixmap_from_imageFZ_MIN_INF_RECTFZ_MAX_INF_RECTr9  r   r  rx  r   r   r   r$  rD  rE  rF  r   r   rN  r
  rj  r   _memory_view)8r]   r  r  r   r  r  spixmpixspmmpmr	  r   r  r   r  src_pixr  sepsrF  src_viewpm_viewr  tptrsptr	pm_stridepm_npm_alpha
src_stridesrc_nr  r  pm_isrc_irq   src_pix_alpharI  samplesr  samples2r   ry  	imagedatar   r  r  r  r  r   r   r!  rC  r
  r"  r  r:   args8                                                           r   r^   zPixmap.__init__%  sA   H	# U/0u}eT5A  E	#
 HBE.r3CD3I3I5K^_`KaKachiiBDIIU/0u}eT5Ad  {	# #OBe.r3CD3I3I5K^_`KaKachiiBDIIz5+=tDzzJVUZUcLdee q	#HB"j)) .W .'--$'' !y-d33> H "FGGG} 9!3*,,2488+-- 		 "BDII	y+ 9&8889 vu~68PQQ W	#JD$$'' !y$'' !yCC? H<SAA~ 9&8889 =c3GGDII7%s|UYZZ F	#vu~6uclSSF	# #Z/ L L  L4  L  L  L  L  L  L4yyA~ .!
a}U%<==#' aD'--#D!Q#-dF#;#;EdiiG#D))D-d33 |*7GIIKKaQRTXYY*7GIIKKaQRTYTabgbyTzTz{{DIIcFEN#;<< p	#aEAQ p	#EAr"f%% WDIIvu~6dDD i	# 7D"4yyA~4DGG1E#-dF#;#;EdiiGE1a(( 5 "3444+G44B= M M "KLLL&((D)'22A%g..A&w//A$RAtU;;B%02BMO%02BMO!(!3!8BM!(!3!8BM72 '8JANNNh DIIu1:>S$QTVZP[\\ Y	#'+$B1gu"j)) :W!"e&899999%b))A%i1_F&((D$RAtU;;B7UI$677 	= 3G<<7||(11~ :$&89991#66a 3G<<zT! c "a"a"aQ"a"a%"a"a1"a"aPV"a"aZ^"a"abbb'AAADIId## ?	#JIDy),, :!))++ >6u==CD)) 
:! >6u==CIs++ :29==(33~ 8S^-? 8$&67774S99
 5M/?OUdeeNCEEGGQ35577AqAA HB1
 2377JD$!%BM!%BMDIIx)9:C@@ 	#IC"3''CsOOO(--GD!WQY// 0 ,///(dA66C&sHY,?,?@@E%eXg->->?? 3!-eXg5F5FGG3!-eXl5K5KLL3 !/222&sC00C 6M/?OUdeeN35577Aq#%%''1a@@ ICA
 DII BD 4 43tCyy33C3333T"""
 !r   c                     | j         S r   )r  r\   s    r   r  zPixmap.__len__&  s
    yr   c                     t          |           t          urd S | j        r*d| j        j        j        j        d| j        d| j        dS ddd| j        d| j        dS )NzPixmap(z, rp  r  )r   r  r  r   r   r   irectr  r\   s    r   r   zPixmap.__repr__&  s    DzzV#+VV? 	K 	K+/?+?+J+O+O+OQUQ[Q[Q[]a]g]g]ghh	K ,2664:::tzzzJJr   c                    | j         }t          j        |          |                                z  }t          j        |          }t          j        |          }|dk    rt          j        ||           n|dk    rt          j        ||           n|dk    rt          j        ||           n|dk    rt          j	        ||           nq|dk    rt          j
        ||           nU|dk    r:t          dk     rt          j        |||           n-t          j        |||d           nt          j        ||           |                                 t          |          }|S )	z!
        Pixmap._tobytes
        r   ry   r   r
   r   r  r  r   )r   rf   fz_pixmap_strider  r  r  fz_write_pixmap_as_pngfz_write_pixmap_as_pnmfz_write_pixmap_as_pamfz_write_pixmap_as_psdfz_write_pixmap_as_psr~   fz_write_pixmap_as_jpegr0  r   )r]   format_jpg_qualityr  r  r   r1  barrays           r   _tobyteszPixmap._tobytes&  so    Y%b))BDDFF2!$''nS!!\ 	2E8bAAAA\ 
	2E8bAAAA\ 		2E8bAAAA\ 	2E8bAAAA\ 	2E7R@@@@\ 	2"W, G-c2{CCCC-c2{AFFFF(b111!#&&r   c                    | j         }|dk    rt          j        ||           d S |dk    rt          j        ||           d S |dk    rt          j        ||           d S |dk    rt          j        ||           d S |dk    rt          j        ||           d S |dk    rt          j        |||           d S t          j        ||           d S )Nr   ry   r   r
   r   r  )r   rf   fz_save_pixmap_as_pngfz_save_pixmap_as_pnmfz_save_pixmap_as_pamfz_save_pixmap_as_psdfz_save_pixmap_as_psfz_save_pixmap_as_jpeg)r]   r3   r  r  r  s        r   	_writeIMGzPixmap._writeIMG'  s   Y\ 	FE7HEEEEE\ 	FE7HEEEEE\ 	FE7HEEEEE\ 	FE7HEEEEE\ 	FE6r8DDDDD\ 	FE8X{SSSSS!7HEEEEEr   c                 4    t          j        | j                  S )z$Indicates presence of alpha channel.)rf   fz_pixmap_alphar   r\   s    r   r  zPixmap.alpha'  r  r   Nc                     |t          j        | j                   dS |t          j        | j        |           dS t	          | j        |t          |                     dS )z*Fill all color components with same value.N)rf   fz_clear_pixmapr   fz_clear_pixmap_with_valueJM_clear_pixmap_rect_with_valuer  )r]   r   r   s      r   
clear_withzPixmap.clear_with '  sk     	V!$),,,,, 	V,TY>>>>>+DIu>Nt>T>TUUUUUr   r   c                     | j         }t          ||          }|st          t                    |st	          |          S |S )z-
        Return count of each color.
        )r   JM_color_countr   MSG_COLOR_COUNT_FAILEDr-  )r]   r   r  r  rh   s        r   color_countzPixmap.color_count)'  sI     YR&& 	8 6777 	88O	r   c                 
   d}d}|| j         t          |          v r| j         }|                     d|                                          D ]\  }}||z  }||k    r|}|}|sdt	          dg| j        z            fS ||z  |fS )z/Return most frequent color and its usage ratio.r   NT)r   r  r   r~  )r  r   r  rt  r   rF  )r]   r  	allpixelscntpixelrW  maxpixels          r   color_topusagezPixmap.color_topusage5'  s    	 	
d4jj 8 	:D ,,Dd,CCIIKK 	! 	!LE5Is{ !  	.ucUTV^,,--i**r   c                 N    t          t          j        | j                            S )zPixmap Colorspace.)rl  rf   r  r   r\   s    r   r  zPixmap.colorspaceD'  s     %4TY??@@@r   c                 F   | j         }|j         }t          j        |          st          d          |                                |                                k    rt          d          t          j        ||t          |          t          j        d                     dS )zCopy bbox from another Pixmap.z'cannot copy pixmap with NULL colorspacez%source and target alpha must be equalN)r   rf   r  r   r  fz_copy_pixmap_rectr  r
  )r]   r  r   r  r  s        r   r  zPixmap.copyI'  s    Y()'22 	IGHHH88::( 	GEFFF!"g/?/E/EuGabfGgGghhhhhr   c                 R    t          j        | j                  }t          |          S )zMD5 digest of pixmap (bytes).)rf   r
  r   r   r  s     r   r
  zPixmap.digestS'  s"     "49--Szzr   c                     t          j        | j                  st          d           dS t          j        | j        |           dS )z=Apply correction with some float.
        gamma=1 is a no-op.zcolorspace invalid for functionN)rf   r  r   r   fz_gamma_pixmap)r]   gammas     r   
gamma_withzPixmap.gamma_withY'  sH     )4955 	=>>>Fty%00000r   c                 4    t          j        | j                  S )zThe height.)rf   r  r   r\   s    r   r  zPixmap.ha'  r  r   c                    | j         }t          j        |          st          d           dS t	          |          }t          j        |          rt          j        |          }t          t          ||                    S )z Invert the colors inside a bbox.zignored for stencil pixmapF)	r   rf   r  r   r  r  fz_pixmap_bboxr  JM_invert_pixmap_rect)r]   r   r  r   s       r   invert_irectzPixmap.invert_irectf'  sy    Y)"-- 	89995T""%a(( 	*$b))A)2q11222r   c                 R    t          j        | j                  }t          |          S )zPixmap bbox - an IRect object.)rf   r  r   JM_py_from_irectr  s     r   r  zPixmap.irectq'  s$     "49--%%%r   c                 4    t          j        | j                  S )zCheck if pixmap is monochrome.)rf   fz_is_pixmap_monochromer   r\   s    r   is_monochromezPixmap.is_monochromew'  s     ,di888r   c                    | j         }|                                }|                                |                                z  |z  }d } ||d|          }t	          |||          D ]} ||||          }||k    r dS dS )z5
        Check if pixmap has only one color.
        c                     t                      }t          |          D ]-}|                    t          j        | ||z                        .|S r   )r{   r  r6   rf   r  )r  offsetrF  rN   rq   s        r   _pixmap_read_samplesz0Pixmap.is_unicolor.<locals>._pixmap_read_samples'  sK    &&C1XX ? ?

5/F1H==>>>>Jr   r   FT)r   rF  r   r  r  )r]   r  rF  rW  r  sample0r  samples           r   is_unicolorzPixmap.is_unicolor|'  s    
 YDDFF!#	 	 	
 '&Aq11Qq)) 	 	F))2vq99F  uutr   c                     t           r#d }t          |          | j        _        | j        S t	          j        | j                  S )zThe size of one pixel.c                 4    t          j        | j                  S r   )r   pixmap_nr   r\   s    r   n2zPixmap.n.<locals>.n2'  s    ~di000r   )r   r  r@
  rF  rf   fz_pixmap_componentsr   )r]   r  s     r   rF  zPixmap.n'  sE      	1 1 1'||DN6M)$)444r   r   c                    t           s|st          d          t          j                    }||_        |r|                    |           |r|                    |           | j        }t          |t                    rt          j
        ||d|           dS t          |          }t          j        |||           |                                 dS )z4
        Save pixmap as an OCR-ed PDF page.
        'No OCR support: TESSDATA_PREFIX not setr   N)r   r   rf   FzPdfocrOptionsrI  language_set2datadir_set2r   rz   r   fz_save_pixmap_as_pdfocrr.  fz_write_pixmap_as_pdfocrr0  )r]   r3   rI  r  tessdatar  r  r1  s           r   pdfocr_savezPixmap.pdfocr_save'  s      	Jx 	JHIII$&&  	*))) 	)x(((ih$$ 	"*C1dCCCCC'22C+S#t<<<!!!!!r   Tengc                     t           s|st          d          ddlm}  |            }|                     ||||           |                                S )a  Save pixmap as an OCR-ed PDF page.

        Args:
            compress: (bool) compress, default 1 (True).
            language: (str) language(s) occurring on page, default "eng" (English),
                    multiples like "eng+ger" for English and German.
            tessdata: (str) folder name of Tesseract's language support. Must be
                    given if environment variable TESSDATA_PREFIX is not set.
        Notes:
            On failure, make sure Tesseract is installed and you have set the
            environment variable "TESSDATA_PREFIX" to the folder containing your
            Tesseract's language support data.
        r  r   rO  )rI  r  r  )r   r   r4  r5  r  rM  )r]   rI  r  r  r5  rP  s         r   pdfocr_tobyteszPixmap.pdfocr_tobytes'  sl      	Jx 	JHIIIgiix(XVVV||~~r   c                    	 ddl m} n# t          $ r t          d            w xY w| j        }|d}n8|j        dk    r| j        dk    rdnd}n|j        dk    r| j        dk    rd	nd
}nd}|                    || j        | j	        f| j
                  }d|                                vr| j        | j        f|d<    |j        |i | dS )zWrite to image file using Pillow.

        Args are passed to Pillow's Image.save method, see their documentation.
        Use instead of save when other output formats are desired.
        r   )r[  zPIL/Pillow not installedNr  r   LAr   rw  RGBArx  r  )PILr[  ImportErrorrB   r  rF  r  	frombytesr  r  r  r  r  r  r  )r]   r  kwargsr[  cspacer   r  s          r   pil_savezPixmap.pil_save'  s   	!!!!!!! 	 	 	.///	  	DDX] 	*/333tDDX] 	 J!O755DDDoodTZ$=t|LL% 	3!Y	2F5M$!&!!!!!s   	 $c                 l    ddl m}  |            } | j        |g|R i | |                                S )zConvert to binary image stream using pillow.

        Args are passed to Pillow's Image.save method, see their documentation.
        Use instead of 'tobytes' when other output formats are needed.
        r   rO  )r4  r5  r  rM  )r]   r  r  r5  	bytes_outs        r   pil_tobyteszPixmap.pil_tobytes'  sU     	GII	i1$111&111!!###r   c                    t           r t          j        | j        j        ||          S 	 |dk     s0|| j        j        j        k    s|dk     s|| j        j        j        k    rt          t          t                     | j        j        j
        }| j        j        j        }||z  ||z  z   }t          | j        |||z                      }|S )zXGet color tuple of pixel (x, y).
        Last item is the alpha if Pixmap.alpha is true.r   )r   r   pixmap_pixelr   r   r   r  rx  MSG_PIXEL_OUTSIDEr  rF  r  r|   
samples_mv)r]   r  r  rF  r  rq   rN   s          r   r  zPixmap.pixel'  s      	B%di&:AqAAA	9q5	9	,..	9 q5	9 	,..		9 %'7888I "%,QJQT_a1f-..
r   r  c                 .    | j         }t          |          S r   )r  r   )r]   mvs     r   r  zPixmap.samples (  s    _bzzr   c                 4    t          j        | j                  S )z,
        Pixmap samples memoryview.
        )rf   r  r   r\   s    r   r  zPixmap.samples_mv(  s    
 1$)<<<r   c                 4    t          j        | j                  S r   )rf   fz_pixmap_samples_intr   r\   s    r   samples_ptrzPixmap.samples_ptr(  s    *49555r   _   c                    ddddddddddd
}t          |          t          u rn7t          |d          rt          |          }nt          |d	          r|j        }|,t          j                            |          \  }}|dd
         }|                    |                                d
          }|4t          d| dt          |                                                     | j        r|dv rt          d|z            | j        r&| j        j        dk    r|dv rt          d|z            |dk    r |                     | j        | j                   |                     |||          S )zOutput as image in format determined by filename extension.

        Args:
            output: (str) only use to overrule filename extension. Default is PNG.
                    Others are JPEG, JPG, PNM, PGM, PPM, PBM, PAM, PSD, PS.
        r   ry   r   r
   r   r  )
r`  pnmpgmppmpbmpampsdpsjpgjpegr  r   NImage format  not in ry   r   r  z'%s' cannot have alphar   ry   r  zunsupported colorspace for '%s')r   r   r  r   r   r1   splitextr   r  r   r|   r  r  r  rF  r  r  r  r  )r]   r3   r  r  valid_formatsr  r^  r*  s           r   r  zPixmap.save(  s      >>S  	%Xz** 	%8}}HHXv&& 	%}H 	W%%h//FAsWF55 	\ZVZZU=CUCUCWCW=X=XZZ[[[: 	@#* 	@5>???? 	It014 	I	9I 	I>GHHH!8 	/LLDI...~~h[999r   c                    | j         }d}d}|                                dk    rt          t                    t	          j        |          }t	          j        |          }	t	          j        |          }
|	|
z  |dz   z  }g d}g d}d}d}|rNt          |t          t          f          r2t          |          |k    rt          |          D ]}||         ||<   d}|rNt          |t          t          f          r2t          |          |k    rt          |          D ]}||         ||<   d}t                      }d}|r`t          |t          t          f          r|}t          |          }nJ dt          |                       ||	|
z  k     rt          d          	 t	          j        ||||t	          j        |          |j        ||||
  
         dS )	a  Set alpha channel to values contained in a byte array.
        If omitted, set alphas to 255.

        Args:
            alphavalues: (bytes) with length (width * height) or 'None'.
            premultiply: (bool, True) premultiply colors with alpha values.
            opaque: (tuple, length colorspace.n) this color receives opacity 0.
            matte: (tuple, length colorspace.n)) preblending background color.
        r   r   r   r   r   r   z!unexpected type for alphavalues: zbad alpha valuesr~  c                 ,    | |z  dz   }||dz  z  }|dz  S )N   rb  r    )r   r  r  s      r   	fz_mul255z#Pixmap.set_alpha.<locals>.fz_mul255(  s%    ECKQ#X Cxr   N)r   r  r   r  rf   r  r  r  rz   r{   r|   r-  r  r   r3  r   Pixmap_set_alpha_helperr  r   r  r  )r]   alphavaluespremultiplyopaquematter  r  rH  rF  r   r  balenr   rO  zero_outbgroundrq   rT  data_lenrx  rI  data_fixr1  s                          r   	set_alphazPixmap.set_alpha9(  s    i99;;! 	/o...%c**!#&&"3''A1,, 	j$77 	CKK1<L 	1XX & &"1Iq		H 	Z66 	3u::? 	1XX & &"1X

Gww 	6 +y'9:: R"{++QQd;>O>OQQQQQ!a% 6 "4555.	),d33N    r   r`  c                    ddddddddddddd}|                     |                                d	          }|4t          d
| dt          |                                                     | j        r|dv rt          d          | j        r#| j        j        dk    r|dv rt          d          |dk    r |                     | j	        | j
                   |                     ||          }|S )zA
        Convert to binary image stream of desired type.
        r   ry   r   r  r
   r   r  )r`  r  r  r   r!  r"  tgatpicr#  r$  r%  r&  Nr'  r(  r)  z'{output}' cannot have alphar*  z%unsupported colorspace for '{output}')r   r  r   r|   r  r  r  rF  r  r  r  r  )r]   r  r  r,  r*  r  s         r   r  zPixmap.tobytes(  s)   
   55 	\ZVZZU=CUCUCWCW=X=XZZ[[[: 	=#* 	=;<<<? 	Ft014 	F	9I 	FDEEE!8 	/LLDI...sK00r   c                 D    | j         }||j        _        ||j        _        dS )z"Set resolution in both dimensions.N)r   r   r  r  )r]   r  r  r  s       r   r  zPixmap.set_dpi(  s#    Y!!r   c                 D    | j         }||j        _        ||j        _        dS )zSet top-left coordinates.N)r   r   r  r  )r]   r  r  r  s       r   
set_originzPixmap.set_origin(  s    Yr   c                 l   t           r!t          j        | j        j        |||          S | j        }t          |d|                                dz
            r&t          |d|                                dz
            st          t                    |
                                }t          |          D ]/}||         }t          |dd          st          t                    0t          j        |          }||z  ||z  z   }	 t          |          D ]!}|                    ||z   ||                    "dS )zSet color of pixel (x, y).r   r   r~  N)r   r   	set_pixelr   r   r]  r   r  r   r  rF  r  MSG_BAD_COLOR_SEQrf   r  r  r  r  )	r]   r  r  r  r  rF  rI  rq   r  s	            r   rD  zPixmap.set_pixel(  s7    	F?49#7AuEEEY1bddffqj)) 	1!Q
1K1K 	1/000DDFFq 	5 	5AaAAq#&& 5 "34445',,QJQ		3 1XX 3 3!!!a%q22223 3r   c                 F   | j         }|                                }g }t          |          D ]D}||         }t          |dd          st	          t
                    |                    |           Et          |          }t          |||          }t          |          }|S )z Set color of all pixels in bbox.r   r~  )
r   rF  r  r]  r   rE  r6   r  JM_fill_pixmap_rect_with_colorr  )	r]   r   r  r  rF  ry  rI  rq   rh   s	            r   ro  zPixmap.set_rect(  s    YDDFFq 	 	AaAAq#&& 5 "3444HHQKKKK%%*2q$77!WW	r   c                 v    |dk     rt          d           dS t          j        | j        |           d| _        dS )zgDivide width and height by 2**factor.
        E.g. factor=1 shrinks to 25% of original size (in place).r   zignoring shrink factor < 1N)r   rf   fz_subsample_pixmapr   r  )r]   factors     r   shrinkzPixmap.shrink(  sG     A: 	8999F!49f555 r   c                     t           dk    rt          j        | j                  S | j        }|                                |                                z  |                                z  S )zPixmap size.r|  )r~   rf   fz_pixmap_sizer   rF  r   r  )r]   r  s     r   r  zPixmap.size(  sT     *, 	5($)444 Yttvv''r   c                 4    | j                                         S )z%Length of one image line (width * n).)r   r  r\   s    r   r  zPixmap.stride(  s     y!!!r   c                     | j         r| j         j        dk    rt          d           dS t          j        | j        ||          S )z/Tint colors with modifiers for black and white.r   z(warning: colorspace invalid for functionN)r  rF  rB   rf   fz_tint_pixmapr   )r]   blackwhites      r   	tint_withzPixmap.tint_with)  sH     	$/"3a"7 	>???F#TYu===r   c                 4    t          j        | j                  S )z
The width.)rf   r  r   r\   s    r   r   zPixmap.w
)  r  r   c                     |j         st          d          t          |          }|j        |j        |j        |j        g}t          j        | j	        |||          }t          |          S )z!Return pixmap from a warped quad.zquad must be convex)	is_convexr   r
  r}  r  r  r  rf   fz_warp_pixmapr   r  )r]   r  r  r  r
  r  r	  s          r   warpzPixmap.warp)  s_    ~FZ0E%F%FFD!!4qtQT*"DIvufEEs||r   c                 4    t          j        | j                  S )zx component of Pixmap origin.)rf   fz_pixmap_xr   r\   s    r   r  zPixmap.x)        +++r   c                 4    | j                                         S )zResolution in x direction.)r   r  r\   s    r   r  zPixmap.xres)       y~~r   c                 4    t          j        | j                  S )zy component of Pixmap origin.)rf   fz_pixmap_yr   r\   s    r   r  zPixmap.y!)  r[  r   c                 4    | j                                         S )zResolution in y direction.)r   r  r\   s    r   r  zPixmap.yres&)  r]  r   r  ry  r   )r   NN)Tr  N)Nr  )Nr   NN)r`  r  )3r`   ra   rb   r^   r  r   r  r  r  r  r  r  r  r  r  r
  r  r  r  r  r  r  rF  r  r  r  r  r  r   r  r  r  r  r<  r  r  rB  rD  ro  rK  r  r  rS  r   rX  r  r  r  r  r  r  r    r   r   r  r  %  s       X! X! X!t  K K K  0F F F 0 0 X0V V V V
 
 
 
+ + + + A A XAi i i   X
1 1 1 1 1 X1	3 	3 	3 	3 & & X&
 9 9 X9   X& 
5 
5 X
5" " " "(   *" " ":	$ 	$ 	$  $ u    X = = X= 6 6 X6': ': ': ':R] ] ] ]~   <" " "  3 3 32  ! ! ! ( ( X( " " X"> > > 0 0 X0   , , X,     X  , , X,     X  EFFFr   r  c                       e Zd Zd Zd Zd Zd Zd Zd Zdddd	Z	d
 Z
d Zd Zd Zd Zd Zd Zd Zd Zed             Zd Zd Zed             ZeZeZdS )r  c                 d    t          j        | j        | j        z  | j        | j        z  z             S r   )rP	  rQ	  r  r  r\   s    r   rS	  zPoint.__abs__2)  s'    y$&46DF?:;;;r   c                     t          |d          r t          | j        |z   | j        |z             S t	          |          dk    rt          d          t          | j        |d         z   | j        |d         z             S Nr&  ry   Point: bad seq lenr   r   r  r  r  r  r-  r   r]   rj  s     r   rY	  zPoint.__add__5)  u    1k"" 	1!TVaZ000q66Q; 	31222TVad]DFQqTM222r   c                 X    t          |           t          |           cxk    odk    nc  S rW   r\	  r\   s    r   r]	  zPoint.__bool__<)  r^	  r   c                 t    t          |d          sdS t          |          dk    ot          | |z
            du S )Nr  Fry   r`	  rg  s     r   ra	  zPoint.__eq__?)  s=    q)$$ 	51vv{6tD1H~~66r   c                 *    | j         | j        f|         S r   r  r  r  s     r   r  zPoint.__getitem__D)  s    ""r   c                 :    t          t          |                     S r   r	  r|   r\   s    r   r	  zPoint.__hash__G)      E$KK   r   Nrl  c                   |sd| _         d| _        nKt          |          dk    rt          d          t          |          dk    r5t	          |d                   | _         t	          |d                   | _        nt          |          dk    r|d         }t          |t          j        t          j        f          r|j         | _         |j        | _        nt          |d          du rt          d          t          |          dk    rt          d          t	          |d                   | _         t	          |d                   | _        nt          d          ||| _         |	|| _        d	S d	S )
z
        Point() - all zeros
        Point(x, y)
        Point(Point) - new copy
        Point(sequence) - from 'sequence'

        Explicit keyword args x, y override earlier settings if not None.
        r[  ry   re  r   r   r  FzPoint: bad argsN)
r  r  r-  r   r+  rz   rf   r  fz_pointr  )r]   r  r  r  r  s        r   r^   zPoint.__init__J)  sY     	3DFDFFYY] 	31222YY!^ 	347^^DF47^^DFFYY!^ 	3QA!emU^<== 	%1m,,5 8$%6777q66Q; ;$%9:::qtqt1222&QDF&QDFFF&&r   c                     dS Nry   r    r\   s    r   r  zPoint.__len__l)  rr	  r   c                     t          |d          r t          | j        |z  | j        |z            S t          |           }|                    |          S Nr&  )r  r  r  r  rF
  )r]   rH  rj  s      r   ru	  zPoint.__mul__o)  sK    1k"" 	1!TVaZ000$KK{{1~~r   c                 :    t          | j         | j                   S r   )r  r  r  r\   s    r   rw	  zPoint.__neg__u)  s    dfWtvg&&&r   c                 X    t          |           t          |           cxk    odk    nc  S rW   r\	  r\   s    r   ry	  zPoint.__nonzero__x)  r^	  r   c                      t          |           S r   r  r\   s    r   r{	  zPoint.__pos__{)      T{{r   c                 @    dt          t          |                     z   S )Nr  r}	  r\   s    r   r   zPoint.__repr__~)      U4[[))))r   c                 z    t          |          }|dk    r|| _        n|dk    r|| _        nt          d          d S )Nr   r   r	  )r+  r  r  r  r	  s      r   r	  zPoint.__setitem__)  sI    !HH!V 	3aTVV!V 	3aTVV1222tr   c                     t          |d          r t          | j        |z
  | j        |z
            S t	          |          dk    rt          d          t          | j        |d         z
  | j        |d         z
            S rd  rf  rg  s     r   r	  zPoint.__sub__)  rh  r   c                    t          |d          r&t          | j        dz  |z  | j        dz  |z            S t	          |          d         }|st          d          t          |           }|                    |          S r	  )r  r  r  r  r	  r	  rF
  )r]   rH  ro	  rj  s       r   r	  zPoint.__truediv__)  s|    1k"" 	7"QA666""1% 	=#$;<<<$KK{{2r   c                    | j         | j         z  | j        | j        z  z   }|t          k     rt          dd          S t	          j        |          }t          t          | j                   |z  t          | j                  |z            S )z&Unit vector with positive coordinates.r   )r  r  r	  r  rP	  rQ	  r  r]   r/  s     r   abs_unitzPoint.abs_unit)  sm     FTVOdftvo-w; 	1::IaLLS[[1_c$&kkAo666r   c                    t          |          dk    st          d          |d         }t          |          dk    rt          |          }n2t          |          dk    rt          |          }nt          d          t          |          dk    r	|d         }nd}dd	d
dd}||         d         ||         d         z  }t	          |          t          u rt          | |z
            |z  S t          |j        |j                  }||j        z  }| |v rdS | j        |j	        k    rh| j
        |j        k    r|                     |j        |          S | j
        |j        k    r|                     |j        |          S | j        |j	        z
  |z  S |j        | j        cxk    r|j	        k    r7n n4| j
        |j        k    r| j
        |j        z
  |z  S |j        | j
        z
  |z  S | j
        |j        k    r|                     |j        |          S | j
        |j        k    r|                     |j        |          S |j        | j        z
  |z  S )z.Return distance to rectangle or another point.r   z$at least one parameter must be givenry   r  z$arg1 must be point-like or rect-liker   r2  )r\  r\  )r\        R@)gRQ@r  )gffffff9@r  )r2  incmmmr[  )r-  r   r  r   r   r  top_leftbottom_rightr  r  r  r  distance_tor  	top_rightr  bottom_left)r]   r  r  unitur  r   s          r   r  zPoint.distance_to)  sn   4yy1} 	ECDDDGq66Q; 	EaAAVVq[ 	EQAACDDDt99q= 	7DDD(+   dGAJ4#77e 	%tax==1$$ QZ((19 	36AD= 	+v~ +''===14 +''T:::**TTV 	+ 	+ 	+ 	+qt 	+ 	+ 	+ 	+ 	+v~ +**tv**v~ +''t<<<14 +''
D999tv**r   c                     t          |          dk    rt          d          t          | |          \  | _        | _        | S )z7Replace point by its transformation with matrix-like m.r   rW	  )r-  r   util_transform_pointr  r  r  s     r   rF
  zPoint.transform)  s?    q66Q; 	42333-dA66r   c                     | j         | j         z  | j        | j        z  z   }|t          k     rt          dd          S t	          j        |          }t          | j         |z  | j        |z            S )zUnit vector of the point.r   )r  r  r	  r  rP	  rQ	  r  s     r   r  z
Point.unit)  sa     FTVOdftvo-w; 	1::IaLLTVaZ!,,,r   )r`   ra   rb   rS	  rY	  r]	  ra	  r  r	  r^   r  ru	  rw	  ry	  r{	  r   r	  r	  r	  r  r  r  rF
  r  r	  r	  r    r   r   r  r  0)  sq       < < <3 3 31 1 17 7 7
# # #! ! ! !%  '  '  '  '  'D    ' ' '1 1 1  * * *  3 3 3   7 7 X70+ 0+ 0+d   - - X- GDDDr   r  c                   .   e Zd Zd Zd Zd Zd Zd Zd Zd Z	ddddd	d
Z
d Zd Zd Zd Zd Zd Zd Zd Zd Zed             Zed             Zed             Zed             Zd Zed             Zd ZeZ ed           Z ed           ZdS )r  c                     | j         rdS t          | j        | j        z
            t          | j        | j        z
            z  S Nr[  )r
  r  r}  r  r  r\   s    r   rS	  zQuad.__abs__)  s>    = 	347TW$%%DGdg,=(>(>>>r   c                 ^   t          |d          r2t          | j        |z   | j        |z   | j        |z   | j        |z             S t          |          dk    rt          d          t          | j        |d         z   | j        |d         z   | j        |d         z   | j        |d         z             S Nr&  r  Quad: bad seq lenr   r   ry   r   r  r  r}  r  r  r  r-  r   r]   r
  s     r   rY	  zQuad.__add__)      1k"" 	L!TWq[$'A+tw{KKKq66Q; 	20111DGadNDGadNDGadNDGaPQdNSSSr   c                     | j          S r   r
  r\   s    r   r]	  zQuad.__bool__)      =  r   c                    	 |                                 }n*# t          $ r t          dk    rt                       Y dS w xY w|dk    rt	          ||           S |dk    rdS t          |          rFt          |          j        rdS t	          |d d         |           ot	          |dd          |           S t          |          r-t          d          D ]}t	          ||         |           s dS dS dS )Nr   Fry   r  T)
r  r   r   rF   util_point_in_quad	CheckRectr   r
  	CheckQuadr  )r]   r  r  rq   s       r   r  zQuad.__contains__)  s"   			AA 	 	 	#a'<N,<,<,<55	 6 	/%a...6 	5Q<< 	WAww t%aeT22V7I!ABB%QU7V7VVQ<< 	1XX ! !)!A$55 ! 55!4us    #>>c                     t          |d          sdS t          |          dk    oC| j        |d         k    o2| j        |d         k    o!| j        |d         k    o| j        |d         k    S Nr  Fr  r   r   ry   r   )r  r-  r}  r  r  r  )r]   r  s     r   ra	  zQuad.__eq__*  sy    tY'' 	54yyA~ 
GtAw GtAwGtAw GtAw		
r   c                 B    | j         | j        | j        | j        f|         S r   r}  r  r  r  r  s     r   r  zQuad.__getitem__*      $'473A66r   c                 :    t          t          |                     S r   rn  r\   s    r   r	  zQuad.__hash__*  ro  r   Nr  c                (   |s*t                      x| _        x| _        x| _        | _        nt          |          dk    rt          d          t          |          dk    r0t          t           |          \  | _        | _        | _        | _        n&t          |          dk    r|d         }t          |t          j
                  ro|| _        t          |j                  t          |j                  t          |j                  t          |j                  f\  | _        | _        | _        | _        nt          |d          du rt          d          t          |          dk    rt          d          t          t           |          \  | _        | _        | _        | _        nt          d          |t          |          | _        |t          |          | _        |t          |          | _        |t          |          | _        dS dS )	z
        Quad() - all zero points
        Quad(ul, ur, ll, lr)
        Quad(quad) - new copy
        Quad(sequence) - from 'sequence'

        Explicit keyword args ul, ur, ll, lr override earlier settings if not
        None.
    
        r  r  r   r   r  FzQuad: bad argsN)r  r}  r  r  r  r-  r   r  rz   rf   FzQuadr   r  )r]   r}  r  r  r  r  r  s          r   r^   zQuad.__init__*  s     	/49GG;DG;dg;$''YY] 	/0111YY!^ 	/14UD1A1A.DGTWdgtwwYY!^ 	/QA!U\** C	5:14[[%++uUVUY{{\abcbf\g\g5g2$'477M**e3 C !1222Q1 C !455558]]2$'477-.../eBiiDG/eBiiDG/eBiiDG/eBiiDGGG//r   c                     dS Nr  r    r\   s    r   r  zQuad.__len__A*  rr	  r   c                 N    t          |           }|                    |          }|S r   )r  rF
  )r]   rH  r
  s      r   ru	  zQuad.__mul__D*  s!    JJKKNNr   c                 V    t          | j         | j         | j         | j                   S r   )r  r}  r  r  r  r\   s    r   rw	  zQuad.__neg__I*  &    TWHtwh47(;;;r   c                     | j          S r   r  r\   s    r   ry	  zQuad.__nonzero__L*  r  r   c                      t          |           S r   )r  r\   s    r   r{	  zQuad.__pos__O*      Dzzr   c                 @    dt          t          |                     z   S )Nr  r}	  r\   s    r   r   zQuad.__repr__R*      E$KK((((r   c                     |dk    rt          |          | _        n`|dk    rt          |          | _        nE|dk    rt          |          | _        n*|dk    rt          |          | _        nt          d          d S Nr   r   ry   r   r	  )r  r}  r  r  r  r  r	  s      r   r	  zQuad.__setitem__U*  s~    !V 	3uQxxTWW!V 	3uQxxTWW!V 	3uQxxTWW!V 	3uQxxTWW1222tr   c                 ^   t          |d          r2t          | j        |z
  | j        |z
  | j        |z
  | j        |z
            S t          |          dk    rt          d          t          | j        |d         z
  | j        |d         z
  | j        |d         z
  | j        |d         z
            S r  r  r  s     r   r	  zQuad.__sub__^*  r  r   c                     t          |d          rd|z  }n&t          |          d         }|st          d          t          |           }|                    |          }|S )Nr&  r\  r   zMatrix not invertible)r  r	  r	  r  rF
  )r]   rH  imr
  s       r   r	  zQuad.__truediv__e*  si    1k"" 	AaBB#A&&q)B A'(?@@@JJKKOOr   c                    t          | j        | j                  }| j        |z  }| j        |z  }|j        |j        z  dk    rdS t          | j        | j                  }| j        |z  }| j        |z  }|j        |j        z  dk    rdS dS )zCheck if quad is convex and not degenerate.

        Notes:
            Check that for the two diagonals, the other two corners are not
            on the same side of the diagonal.
        Returns:
            True or False.
        r   FT)planish_liner}  r  r  r  r  )r]   rH  r  r  s       r   rV  zQuad.is_convexp*  s     $'**Wq[Wq[4"$;? 	5$'**Wq[Wq[4"$;? 	5tr   c                 B    | j         t          k     p| j        t          k     S )zsCheck whether all quad corners are on the same line.

        This is the case if width or height is zero.
        )r  r	  r  r\   s    r   r
  zQuad.is_empty*  s     zG#<t{W'<<r   c                     | j         j        S )z(Check whether this is the infinite quad.)r   r
  r\   s    r   r
  zQuad.is_infinite*  s     y$$r   c                 t   t          | j        | j        | j                  }t	          |dz
            t
          k    rdS t          | j        | j        | j                  }t	          |dz
            t
          k    rdS t          | j        | j        | j                  }t	          |dz
            t
          k    rdS dS )zCheck if quad is rectangular.

        Notes:
            Some rotation matrix can thus transform it into a rectangle.
            This is equivalent to three corners enclose 90 degrees.
        Returns:
            True or False.
        r   FT)util_sine_betweenr}  r  r  r  r	  r  )r]   sines     r   is_rectangularzQuad.is_rectangular*  s     !$'47;;tax==7" 	5 $'47;;tax==7" 	5 $'47;;tax==7" 	5tr   c                     | j         rt                      S t          dd                              |j        |j                  }| | z  |z  |z  }|S )zSMorph the quad with matrix-like 'm' and point-like 'p'.

        Return a new quad.r   )r
  INFINITE_QUADr<  r	  r  r  )r]   rj  rH  deltar
  s        r   r  z
Quad.morph*  sT      	# ??"q!))!#qs33E6MA%r   c                    t                      }t          | j        j        | j        j        | j        j        | j        j                  |_        t          | j        j        | j        j        | j        j        | j        j                  |_	        t          | j        j        | j        j        | j        j        | j        j                  |_        t          | j        j        | j        j        | j        j        | j        j                  |_        |S r   )r   r  r}  r  r  r  r  r  r  r  r  r  r  r]   r   s     r   r   z	Quad.rect*  s    FF479dgiDGI>>479dgiDGI>>479dgiDGI>>479dgiDGI>>r   c                     t          |d          rn"t          |          dk    rt          d          | xj        |z  c_        | xj        |z  c_        | xj        |z  c_        | xj        |z  c_        | S )z1Replace quad by its transformation with matrix m.r&  r   rW	  )r  r-  r   r}  r  r  r  r  s     r   rF
  zQuad.transform*  sy    1k"" 	4VVq[ 	423331111r   c                     t          t          | j        | j        z
            t          | j        | j        z
                      S r   )r  r  r}  r  r  r  r\   s    r   r  zQuad.<lambda>*  2    3s47TW+<'='=s47TWCT?U?U#V#V r   c                     t          t          | j        | j        z
            t          | j        | j        z
                      S r   )r  r  r}  r  r  r  r\   s    r   r  zQuad.<lambda>*  r  r   )r`   ra   rb   rS	  rY	  r]	  r  ra	  r  r	  r^   r  ru	  rw	  ry	  r{	  r   r	  r	  r	  r  rV  r
  r
  r  r  r   rF
  r	  r  r  r    r   r   r  r  )  s       ? ? ?
T T T! ! !  *
 
 
7 7 7! ! ! "&$4D !0 !0 !0 !0 !0F    
< < <! ! !  ) ) )  T T T	 	 	   X* = = X= % % X%   X0     X
 
 
 GXVVWWEXVVWWFFFr   r  c                      e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	d	d	d	d	d	d
dZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zed             Zed             Zd Zed             Zd Zd Zd Zd Zed             Zed             Z ed              Z!d! Z"d" Z#d# Z$ed$             Z%d% Z&ed&             Z'ed'             Z(d( Z)d) Z*ed*             Z+eZ,eZ-eZ. ee&          Z/e'Z0e(Z1d	S )+r   c                 `    | j         s| j        rdS | j        | j        z
  | j        | j        z
  z  S r  )r
  r
  r  r  r  r  r\   s    r   rS	  zRect.__abs__*  s8    = 	D, 	3$'!dg&788r   c                 ^   t          |d          r2t          | j        |z   | j        |z   | j        |z   | j        |z             S t          |          dk    rt          d          t          | j        |d         z   | j        |d         z   | j        |d         z   | j        |d         z             S Nr&  r  Rect: bad seq lenr   r   ry   r   r  r   r  r  r  r  r-  r   rg  s     r   rY	  zRect.__add__*  r  r   c                     t          |d          st          d          t          |          }t          |           }|                    |          S )Nr  bad operand 2)r  r   r   	intersectr]   r  r  r   s       r   __and__zRect.__and__*  sH    q)$$ 	._---!WWJJ{{2r   c                 X    t          |           t          |           cxk    odk    nc  S rW   r\	  r\   s    r   r]	  zRect.__bool__*  r^	  r   c                    t          |d          r|t          |           v S t          |          }|dk    rt          ||           S |dk    rt	                      }	 t          |          }n=# t          $ r0 t          dk    rt                       t          |          j
        }Y nw xY w| j        |j        cxk    o|j        cxk    o
| j        k    nc o*| j        |j        cxk    o|j        cxk    o
| j        k    nc S dS )Nr&  ry   r  r   F)r  r|   r-  util_is_point_in_rectINFINITE_RECTr   r   r   rF   r  r   r  r  r  r  )r]   r  r  r   s       r   r  zRect.__contains__*  s0   1k"" 	$d##FF6 	2(D1116 	8A!GG ! ! !'!+@0@0@0@GGL! Gqt6666qt6666tw6666 7Gqt6666qt6666tw66668us   A, ,7B&%B&c                 t    t          |d          sdS t          |          dk    ot          | |z
            du S )Nr  Fr  r`	  r^  s     r   ra	  zRect.__eq__*  s?    tY'' 	54yyA~<$td{"3"3u"<<r   c                 B    | j         | j        | j        | j        f|         S r   r  r  r  r  r  s     r   r  zRect.__getitem__*  r  r   c                 :    t          t          |                     S r   rn  r\   s    r   r	  zRect.__hash__+  ro  r   Np0r  r  r  r  r  c          
          t          |||||||d\  }}}}t          |          | _        t          |          | _        t          |          | _        t          |          | _        dS )aa  
        Rect() - all zeros
        Rect(x0, y0, x1, y1)
        Rect(top-left, x1, y1)
        Rect(x0, y0, bottom-right)
        Rect(top-left, bottom-right)
        Rect(Rect or IRect) - new copy
        Rect(sequence) - from 'sequence'
    
        Explicit keyword args p0, p1, x0, y0, x1, y1 override earlier settings
        if not None.
        r  N)util_make_rectr+  r  r  r  r  r]   r  r  r  r  r  r  r  s           r   r^   zRect.__init__+  sa     ($2"rVXYYYBB********r   c                     dS r  r    r\   s    r   r  zRect.__len__+  rr	  r   c                     t          |d          r2t          | j        |z  | j        |z  | j        |z  | j        |z            S t          |           }|                    |          }|S ru  )r  r   r  r  r  r  rF
  )r]   rH  r   s      r   ru	  zRect.__mul__+  s`    1k"" 	L!TWq[$'A+tw{KKKJJKKNNr   c                 V    t          | j         | j         | j         | j                   S r   )r   r  r  r  r  r\   s    r   rw	  zRect.__neg__"+  r  r   c                 X    t          |           t          |           cxk    odk    nc  S rW   r\	  r\   s    r   ry	  zRect.__nonzero__%+  r^	  r   c                    t          |d          st          d          t          |           }t          |          dk    r|                    |          S t          |          dk    r|                    |          S t          d          )Nr  r  ry   r  )r  r   r   r-  include_pointinclude_rect)r]   r  r   s      r   __or__zRect.__or__(+  s    q)$$ 	._---JJq66Q; 	&??1%%%q66Q; 	%>>!$$$)))r   c                      t          |           S r   r   r\   s    r   r{	  zRect.__pos__2+  r  r   c                 @    dt          t          |                     z   S )Nr   r}	  r\   s    r   r   zRect.__repr__5+  r  r   c                     t          |          }|dk    r|| _        n9|dk    r|| _        n+|dk    r|| _        n|dk    r|| _        nt          d          d S r  )r+  r  r  r  r  r  r	  s      r   r	  zRect.__setitem__8+  sq    !HH!V 	3qTWW!V 	3qTWW!V 	3qTWW!V 	3qTWW1222tr   c                 ^   t          |d          r2t          | j        |z
  | j        |z
  | j        |z
  | j        |z
            S t          |          dk    rt          d          t          | j        |d         z
  | j        |d         z
  | j        |d         z
  | j        |d         z
            S r  r  rg  s     r   r	  zRect.__sub__B+  r  r   c                 <   t          |d          r>t          | j        dz  |z  | j        dz  |z  | j        dz  |z  | j        dz  |z            S t          |          d         }|st          d|           t          |           }|                    |          }|S )Nr&  r\  r   zMatrix not invertible: )	r  r   r  r  r  r  r	  r	  rF
  )r]   rH  r  r   s       r   r	  zRect.__truediv__I+  s    1k"" 	X"Q"Q"QRTUVWWW""1% 	C#$Aa$A$ABBBJJKKOOr   c                 6    t          | j        | j                  S zBottom-left corner.r  r  r  r\   s    r   r  zRect.bottom_leftS+       TWdg&&&r   c                 6    t          | j        | j                  S zBottom-right corner.r  r  r  r\   s    r   r  zRect.bottom_rightX+  r  r   c                 ,    |                      |          S )z.Check if containing point-like or rect-like x.)r  ry  s     r   containszRect.contains]+        ###r   c                 <    t          d| j        | j        z
            S rW   r  r  r  r\   s    r   r  zRect.heighta+      1dg'(((r   c                     t          |          dk    rt          d          t          | |          \  | _        | _        | _        | _        | S )zExtend to include point-like p.ry   re  )r-  r   util_include_point_in_rectr  r  r  r  rg  s     r   r  zRect.include_pointe+  sH    q66Q; 	31222-Ga-P-P*$'47r   c                    t          |          dk    rt          d          t          |          }|j        s| j        r4t          t          t
          t
          f\  | _        | _        | _        | _	        nm|j
        r| S | j
        r4|j        |j        |j        |j	        f\  | _        | _        | _        | _	        n)t          | |          \  | _        | _        | _        | _	        | S )zExtend to include rect-like r.r  r  )r-  r   r   r
  r  r  r  r  r  r  r
  util_union_rectr  s     r   r  zRect.include_rectl+  s    q66Q; 	20111GG= 	JD, 	J1@/Sbds1s.DGTWdgtwwZ 	JK] 	J12qtQT141G.DGTWdgtww1@q1I1I.DGTWdgtwr   c                    t          |          dk    st          d          t          |          }|j        r| S | j        r4|j        |j        |j        |j        f\  | _        | _        | _        | _        nm|j        r4|j        |j        |j        |j        f\  | _        | _        | _        | _        n2| j        r| S t          | |          \  | _        | _        | _        | _        | S )z)Restrict to common rect with rect-like r.r  r  )
r-  r   r   r
  r  r  r  r  r
  util_intersect_rectr  s     r   r  zRect.intersect{+  s    1vv{ 	20111GG= 		NK 	N12qtQT141G.DGTWdgtwwZ 	N12qtQT141G.DGTWdgtww] 	NK1DT11M1M.DGTWdgtwr   c                     t          |          }| j        s| j        s|j        s|j        rdS t          |           }|                    |          j        rdS dS )z4Check if intersection with rectangle x is not empty.FT)r   r
  r
  r  r  s       r   
intersectszRect.intersects+  sb    !WW= 	D, 	 	r~ 	5JJ;;r??# 	5tr   c                 B    | j         | j        k    p| j        | j        k    S z True if rectangle area is empty.r  r\   s    r   r
  zRect.is_empty+  !     w$'!7TW%77r   c                 ~    | j         | j        cxk    o
t          k    nc o| j        | j        cxk    o
t
          k    nc S )z'True if this is the infinite rectangle.r  r  r  r  r  r  r\   s    r   r
  zRect.is_infinite+  O     w$'4444_4444^DG9^9^9^9^9^9^9^9^^r   c                 B    | j         | j        k    o| j        | j        k    S zTrue if rectangle is valid.r  r\   s    r   is_validzRect.is_valid+  !     w$'!8dg&88r   c                 b    | j         rt                      S | j                            ||          S zGMorph with matrix-like m and point-like p.

        Returns a new quad.r
  r  r  r  r]   rj  rH  s      r   r  z
Rect.morph+  /      	# ??"yq!$$$r   c                 X    t          j        t          d | D                                 S )Nc                     g | ]}||z  S r    r    rM	  s     r   rr   zRect.norm.<locals>.<listcomp>+  rN	  r   rO	  r\   s    r   r	  z	Rect.norm+  rT	  r   c                     | j         | j        k     r| j         | j        c| _        | _         | j        | j        k     r| j        | j        c| _        | _        | S )z*Replace rectangle with its finite version.r  r\   s    r   r  zRect.normalize+  Q    7TW 	0#wDGTW7TW 	0#wDGTWr   c                 N    t          | j        | j        | j        | j                  S z!Return Quad version of rectangle.r  r  trblr  r\   s    r   r  z	Rect.quad+        DGTWdgtw777r   c                 :    t          t          |                     S )zReturn the IRect.)r  util_round_rectr\   s    r   rg	  z
Rect.round+  s    _T**+++r   c                 6    t          | j        | j                  S zTop-left corner.r  r  r  r\   s    r   r  zRect.top_left+  r  r   c                 6    t          | j        | j                  S zTop-right corner.r  r  r  r\   s    r   r  zRect.top_right+  r  r   c           	      J   t          |          }| j        s| j        s|j        s|j        rt          d          t	          dddd| j         | j                   t	          |j        | j        z  |j        | j        z            z  t	          dddd|j        |j                  z  S z+Return matrix that converts to target rect.z'rectangles must be finite and not emptyr   r   	r   r
  r
  r   r<  r  r  r  r  r  s     r   torectzRect.torect+  s     GG 	Ht} 	H 	H 	HFGGG1aAx$'22QWtz)18dk+ABBCQ1aqt,,-	
r   c                     t          |          dk    st          d          t          | |          \  | _        | _        | _        | _        | S )z1Replace with the transformation by matrix-like m.r   rW	  )r-  r   util_transform_rectr  r  r  r  r  s     r   rF
  zRect.transform+  sH    1vv{ 	42333-@q-I-I*$'47r   c                 <    t          d| j        | j        z
            S rW   r  r  r  r\   s    r   r  z
Rect.width+  r  r   )2r`   ra   rb   rS	  rY	  r  r]	  r  ra	  r  r	  r^   r  ru	  rw	  ry	  r  r{	  r   r	  r	  r	  r  r  r  r  r  r  r  r  r  r
  r
  r  r  r	  r  r  rg	  r  r  r(  rF
  r  r	  r  r  r  r  r  r    r   r   r   r   *  s(       9 9 9
T T T  1 1 1  "= = =
7 7 7! ! ! "&$4DTd     &    < < <1 1 1* * *  ) ) )  T T T   ' ' X' ' ' X'$ $ $ ) ) X)      "   8 8 X8 _ _ X_ 9 9 X9% % %3 3 3   8 8 X8, , , ' ' X' ' ' X'

 

 

   ) ) X) G	B	BHUOOE	B	BBBr   r   c            %       
   e Zd ZdZdefdZdCdeddfdZd	ed
ededefdZ	dede
fdZd	ed
edefdZd	ed
efdZdej        eef         fdZdefdZdefdZdefdZ	 dCdedede
defdZ	 dDd	ed
efd Z	 dDd	ed
ed!e
fd"Z	 	 	 	 	 	 	 	 	 	 	 	 dEd'e
d(ed)ed*ed+ed,ed-ed.ed/ed0e
d1e
d2eddfd3Zed4             Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dFded7ej        e ef         d8e
d9e!d:e d;ed<ed=ed(ed)ed>ed?e
d@ed.ed1e
d0e
d2edef$dAZ"dB Z#dS )GShapezCreate a new shape.r   c                    t          |           || _        |j        | _        | j        j        st          d          |j        j        | _        |j        j	        | _
        |j        j	        | _	        |j        j        | _        |j        | _        | j         | _        d| _        d| _        d| _        d | _        d | _        d S )Nr  r(   )r-  r   r   r   r  r   rQ  r  r  r  r  r  r2  pctmipctmrT
  	text_cont	totalcontrS
  r   rn  s     r   r^   zShape.__init__+  s    D	;x 	*[)))(*')
&(&(.	iZ
			r   Tr
  r  Nc                 r   t          | j                   | xj        | j        z  c_        | j                                        | _        | j        dk    rAt
                              | j        d|          }t          j        | j	        || j                   d| _
        d| _        d| _        d| _        d| _        dS )z
        Update the page's /Contents object with Shape data. The argument
        controls whether data appear in foreground (default) or background.
        r   r  Nr(   )r-  r   r3  r2  r  r   r  rf   pdf_update_streamr   rS
  r   rT
  )r]   r
  r   s      r   commitzShape.commit,  s    
 	DI$.(..00>S  	D))$)T7CCD#DHdDNCCC	r   r  r  p3p4c                    t          |          }t          |          }t          |          }t          |          }| j        |k    s7t          || j        z            }| xj        t          |           dz  c_        t          t          || j        z            t          || j        z            z   t          || j        z            z             }| xj        t          |           dz  c_        |                     |           |                     |           |                     |           |                     |           || _        | j        S )z#Draw a standard cubic Bezier curve. m
 c
)r  rS
  JM_TUPLEr1  rT
  r}   r{   
updateRect)r]   r  r  r7  r8  r  s         r   draw_bezierzShape.draw_bezier,  s*    2YY2YY2YY2YY2% 	7BO,,DNN46666NNR$*_--R$*_0E0EERRVR\_H]H]]^^Yt__2222r   r  radiusc                     |t           k    st          d          t          |          }||dfz
  }|                     ||dd          S )z*Draw a circle given its center and radius.zradius must be postiver   rq  F)
fullSector)r	  r   r  draw_sector)r]   r  r?  r  s       r   draw_circlezShape.draw_circle1,  sT     	75666vvqk!CEBBBr   c                     d}t          |          }t          |          }t          |          }|||z
  |z  z   }|||z
  |z  z   }|                     ||||          S )z4Draw a curve between points using one control point.7.SQ?)r  r>  )r]   r  r  r7  kappak1k2s          r   
draw_curvezShape.draw_curve9,  sj     2YY2YY2YY27e##27e##BB///r   c                    t          |          }t          |          }| j        |k    sQ| xj        t          t	          || j        z                      dz   z  c_        || _        |                     |           | xj        t          t	          || j        z                      dz   z  c_        |                     |           || _        | j        S )zDraw a line between two points.r:   l
)r  rS
  rT
  r}   r<  r1  r=  )r]   r  r  s      r   	draw_linezShape.draw_lineH,  s    2YY2YY2% 	 NNidj(A(ABBVKKNN DOOOB)HR$*_$=$=>>GGr   tetrac                 H   t          |          dk    rt          d          t          |d         d          rt          |          j        }nt          |          }|j        |j        |j        z
  dz  z   }|j        |j        |j        z
  dz  z   }|j	        |j        |j	        z
  dz  z   }|j        |j	        |j        z
  dz  z   }| j
        |k    s<| xj        t          t          || j        z                      dz   z  c_        || _
        |                     ||j	        |           |                     ||j        |           |                     ||j        |           |                     ||j        |           |                     |j                   || _
        | j
        S )z"Draw an ellipse inside a tetrapod.r  zinvalid arg lengthr   r&        ?r:  )r-  r   r  r   r  r  r}  r  r  r  rS
  rT
  r}   r<  r1  rI  r=  r   )r]   rM  r
  mtmrr$  mls          r   	draw_ovalzShape.draw_ovalV,  s|   u::? 	3122258[)) 	U AAUATQTAD[C''TQTAD[C''TQTAD[C''TQTAD[C''2% 	!NNidj(A(ABBVKKNN DOAD"%%%AD"%%%AD"%%%AD"%%%r   r  c           
         t          |          D ]\  }}|dk    ro| j        t          |          k    sV| xj        t	          t          t          |          | j        z                      dz   z  c_        t          |          | _        nB| xj        t	          t          t          |          | j        z                      dz   z  c_        |                     |           t          |d                   | _        | j        S )z%Draw several connected line segments.r   r:  rK  r   )r  rS
  r  rT
  r}   r<  r1  r=  )r]   r  rq   rj  s       r   draw_polylinezShape.draw_polylinen,  s    f%% 	 	DAqAv V5883 /NNiqDJ9N0O0O&P&PSY&YYNN&+AhhDO)HU1XX
5J,K,K"L"Lv"UUOOAr
++r   r  c                     t          |          }|                     |j        |j        |j        |j        |j        g          S )zDraw a Quad.)r  rU  r}  r  r  r  )r]   r  r
  s      r   	draw_quadzShape.draw_quad|,  s6    JJ!!14qtQT14"@AAAr   r   c                     t          |          }t          t          |j        | j        z            |j        |j        gz             }| xj        t          |          dz   z  c_        | 	                    |           |j
        | _        | j        S )zDraw a rectangle.z re
)r   r<  r{   r  r1  r  r  rT
  r}   r=  r  rS
  )r]   r   r   r  s       r   	draw_rectzShape.draw_rect,  sw    JJQTDJ.//17AH2EEFF)D//G33$r   r  betarA  c                 r   t          |          }t          |          }d }d }d }t          j        |           }t          j        t          j        d|                    dz  }	t          j        t          j        d|                    }
|
dz  }t	          |          dt          j        z  k    r%||	z  }t	          |          dt          j        z  k    %| j        |k    s5| xj         |t          || j	        z                      z  c_        || _        t          dd          }|}|}||z
  }t	          |          }|t          k    st          d	          |                     ||          }t	          |          t	          |
          k    r|j        t          j        ||
z             |z  z   }|j        t          j        ||
z             |z  z   }t          ||          }|j        t          j        ||z             |z  t          j        |          z  z   }|j        t          j        ||z             |z  t          j        |          z  z   }t          ||          }d
t          j        |          z
  dz  dz  t	          ||z
            z  }|t	          ||z
            z  }|||z
  |z  z   }|||z
  |z  z   }| xj         |t          t#          || j	        z            t#          || j	        z            z   t#          || j	        z            z                       z  c_        ||
z  }||
z  }|}t	          |          t	          |
          k    t	          |          dk    r|dz  }|j        t          j        ||z             |z  z   }|j        t          j        ||z             |z  z   }t          ||          }|j        t          j        ||z             |z  t          j        |          z  z   }|j        t          j        ||z             |z  t          j        |          z  z   }t          ||          }d
t          j        |          z
  dz  dz  t	          ||z
            z  }|t	          ||z
            z  d
t          j        |          z
  z  }|||z
  |z  z   }|||z
  |z  z   }| xj         |t          t#          || j	        z            t#          || j	        z            z   t#          || j	        z            z                       z  c_        |r| xj         |t          || j	        z                      z  c_        | xj         |t          || j	        z                      z  c_        | xj         |t          || j	        z                      z  c_        || _        | j        S )zDraw a circle sector.c                 *    t          | |f          dz   S )Nr:  r}   r   r  s     r   l3zShape.draw_sector.<locals>.l3,      aV$$v--r   c                 2    t          | |||||f          dz   S )Nr;  r]  rc	  s         r   l4zShape.draw_sector.<locals>.l4,  s"    aAq!Q/00699r   c                 *    t          | |f          dz   S )NrK  r]  r^  s     r   l5zShape.draw_sector.<locals>.l5,  r`  r   rq  r   rr  ry   r   zradius must be positiver   r  r   MbP?)r  rP	  rf	  copysignr  pirS
  rT
  r<  r1  r	  r   horizontal_angler  rh	  r  ri	  r{   )r]   r  r  rZ  rA  r_  rb  rd  betarw360w90w45r   r  r  r	  r	  alfaq1q2r  r  r  kappahrF  cp1cp2beta2s                               r   rB  zShape.draw_sector,  so    ve	. 	. 	.	: 	: 	:	. 	. 	.dU##|DM#u5566"=l4=U3344Ag%jj1tw;& 	TME %jj1tw;& 	5( 	$NNbb%$**<!=!=>>>NN#DO!QKKE!ffW} 	86777$$VU33%jj3s88# 	txs
++c11Btxs
++c11Bb"Atxs
++c1DHSMMAABtxs
++c1DHSMMAABb"A$(3--'1,q03q1u::=FSQZZ'Eq1uo%Cq1uo%CNNbbS4:%&&cDJ.>)?)??$q4:~BVBVV" "   NN SLECKDA# %jj3s88# 	& u:: 	AIEtxu--33Btxu--33Bb"Atxu--3dhuooEEBtxu--3dhuooEEBb"A$(5//)Q.2SQZZ?FSQZZ'1tx+>?Eq1uo%Cq1uo%CNNbbS4:%&&cDJ.>)?)??$q4:~BVBVV" "   NN  	;NNbb%$**<!=!=>>>NNNNbb&4:*=!>!>???NNNNbb!dj.!9!9:::NNr   ry   c                    t          |          }t          |          }||z
  }t          |          }dt          t          |d|z  z  d                    z  }|dk     rt	          d          ||z  }t          t                              ||                    }| }	d}
g }t          d|          D ]h}|dz  dk    rt          ||
           |z  }n0|dz  dk    rt          ||
          |z  }nt          |d          |z  }|	                    ||	z             i|g|z   |gz   }t          |          }d}|dz   |k     r=|                     ||         ||dz            ||dz                       |dz  }|dz   |k     =|S )z#Draw a squiggly line from p1 to p2.r  r   points too closegh?3OP@r   r   ry   )r  r  r   rg	  r   r<  r   _hor_matrixr  r6   r-  rI  )r]   r  r  breadthr	  r	  r  r$  r  i_matrx  r  rq   rj  s                 r   draw_squigglezShape.draw_squiggle,  s    2YY2YYG!ff#eC1w;/334447 	1/0003Y))"b1122q# 	% 	%A1uz %!aRLL2%Q! %!QKK"$!QKK"$MM!e)$$$$"%&kk!eck 	OOF1Iva!e}fQUmDDDFA !eck 	 	r   rw  c                 J   t          |          }t          |          }||z
  }t          |          }dt          t          |d|z  z  d                    z  }|dk     rt	          d          ||z  }t          t                              ||                    }| }	g }
t          d|          D ]U}|dz  dk    rt          |d          |z  }n|dz  dk    rt          |d          |z  }n=|
	                    ||	z             V| 
                    |g|
z   |gz              |S )z%Draw a zig-zagged line from p1 to p2.r  r   ru  r   r   r   )r  r  r   rg	  r   r<  r   rv  r  r6   rU  )r]   r  r  rw  r	  r	  r  r$  r  rx  r  rq   rj  s                r   draw_zigzagzShape.draw_zigzag,  sA    2YY2YYG!ff#eC1w;/334447 	1/0003Y))"b1122q# 	% 	%A1uz !RLL2%Q! !QKK"$MM!e)$$$$B4&=B4/000	r   r   r  r   Fr  r  r   r  r  r  r  r  r  r  r  r  c           
         | j         dk    rdS |dk    rd}n|d}t          |d          }t          |d          }| j                            |          }|d|z  | j         z   | _         d}nd}| j                            ||
          }|d	|z  | j         z   | _         |d
k    r&|dk    r | xj         t          |          dz   z  c_         |dk    rd|z  | j         z   | _         |dk    rd|z  | j         z   | _         |dvrd|z  | j         z   | _         |	r| xj         dz  c_         d| _        || xj         |z  c_         |Z| xj         |z  c_         |$|s| xj         dz  c_         nE| xj         dz  c_         n4|s| xj         dz  c_         n!| xj         dz  c_         n| xj         dz  c_         | xj         |z  c_         t          |          r}t          d
ddd
|d         j	        | j	        z   | j
        |d         j        z
  | j        z
            }| |d
         z  |z  }t          t          |          | j         z             dz   | _         | xj        d| j         z   dz   z  c_        d| _         d| _        dS )zFinish the current drawing segment.

        Notes:
            Apply colors, opacity, dashes, line style and width, or
            morphing. Also whether to close the path
            by connecting last to first point.
        r(   Nr   ry  r  /OC /%s BDC
EMC
r   r   /%s gs
r    w
z%i J
z%i j
)Nr(   [] 0z%s d
zh
zB
zB*
zf
zf*
zS
 cm
r
  Q
)rT
  r  r   r
  r  r}   rS
  
CheckMorphr<  r  r  r  r<  r3  )r]   r  r  r   r  r  r  r  r  r  r  r  r  	color_strfill_stroptcontemcr  ro	  r=  s                       r   finishzShape.finish-  s   , >R 	FA: 	EE 	E eS))	T3'')11"55 	,w6GDNCCC	&&.\&JJ 	A'%/$.@DNA: 	8%1* 	8NNi..77NNa< 	A%/$.@DNq= 	B%04>ADN++ 	@%.?DN 	#NNe#NN"DO 	(NNi'NN 	$NNh&NN 	- -NNe+NNNNNf,NNN -NNe+NNNNNf,NNNNNe#NN#e 	Q1aE!HJ/uQxz1IDF1R B #a.2%C&x}}t~'EFFPDN'DN2U::r   c                    t          || z
            j        }t          j        t	          |j                            }|j        dk     r,|j        dk    rt          j        |z
   }nt          j        |z
  }n|j        dk    rn| }|S )zReturn the angle to the horizontal for the connection from C to P.
        This uses the arcus sine function and resolves its inherent ambiguity by
        looking up in which quadrant vector S = P - C is located.
        r   )r  r  rP	  asinr  r  r  rg  )r  r  r	  rm  s       r   rh  zShape.horizontal_angleu-  s     !a%LLyQS""37 		sax &4(w~sax ur   r  r/  r   r   rC  r   r  r  r  render_moder	  r   c           
      	   t          |          sdS t          |          t          t          fvr|                                }n|}t          |          dk    sdS t          |          }	 t          d d                    |          D                       }n# t          $ r t                       Y dS w xY w|}|                    d          r
|dd          }| j                            ||||          }t          | j        |          }|d         }|d         }|d         }|d	         }|d
         }|d         }|r||z  }n||z
  dk    r|dz  }n|||z
  z  }|dk    r| j                            ||dz             }n|d         }g }|D ]2} |r|dvrd }!n|}!|                    t%          | |!||                     3|}t'          |	d          }"t'          |
d          }#|
s|dk    r|	}
t'          |	d          }#t)          |          }$|}%|%dz  dk    rt+          d          |%dk     r|%dz  }%|%dk     |%dz  }%d }&d }'d}(d})d}*| j        }+| j        },|$rlt1          dddd|d         j        | j        z   |+|d         j        z
  | j        z
            }-|- |d         z  |-z  }.t7          t9          |.                    dz   }/nd}/|+|j        z
  | j        z
  }0|j        | j        z   }1|0}2|%dk    r:|+|j        z
  | j        z
  }1|j         | j        z
  }0|/|(z  }/|,t;          |0          z
  }2n|%dk    r7|+ |j        z   | j        z   }1|j        | j        z   }0|/|)z  }/t;          |0          }2nJ|%dk    rD|j         | j        z
  }1|+ |j        z   | j        z   }0|/|*z  }/t;          |j        | j        z             }2| j                            |          }3|3d|3z  }4d}5ndx}4}5| j                            ||           }6|6d}6nd!|6z  }6 |&|4|6|/|1|0||          }7|dk    r|7d"|z  z  }7|dk    r|7t7          |          d#z   z  }7|	|7|"z  }7|
|7|#z  }7|7|d         z  }7d}8t          |          dk    r|7 |'|          z  }7n|7d$z  }7tA          dt          |                    D ]-}9|2|k     r n$|9dk    r|7d%z  }7|7||9         d$z   z  }7|2|z  }2|8dz  }8.|7d&|5z  z  }7| xj!        |7z  c_!        |8S )'Nr   c                 ,    g | ]}t          |          S r    r  rM	  s     r   rr   z%Shape.insert_text.<locals>.<listcomp>-  s    :::a3q66:::r   rl   rj  r   )r   r  r  r  r_  simpler   r  r  333333?r~  glyphs)SymbolZapfDingbatsry  r  rr  zbad rotate valuerq  c                 H    d|  | d| dt          ||f           d| d| dS )Nr
  zBT
%1 0 0 1 z Tm
/rl   z Tf r]  r   r  ry  r  r'  r  r	  s          r   r  z#Shape.insert_text.<locals>.<lambda>-  sH    -oQ-o-o-o-o-o9VWYZU[K\K\-o-ode-o-ohi-o-o-o r   c                 (    dt          |            dS )NzTJ
0 -z TD
r]  r   s    r   r  z#Shape.insert_text.<locals>.<lambda>-  s    8Yq\\888 r   z0 1 -1 0 0 0 cm
z0 -1 1 0 0 0 cm
z-1 0 0 -1 0 0 cm
r  r(   r  r  r}  r~  r  r  z%i Tr z w TJz
T* z
ET
%sQ
)"r  r   r{   r|   r  r-  r  r  r  r   rF   r   r   r=  r6  r   r7  r6   getTJstrr  r  r   r  r  r<  r  r  r}   r<  r  r
  r  r  r2  ):r]   r  r   r   rC  r   r  r  r  r  r   r  r	  r   r  r  r  r  r:   maxcoder  r   fontinfor4  r_  r  r]  r  r  lheightr  tabr   r	  r  r  morphingr  templ1templ2cmp90cmm90cm180r  r  ro	  r=  r  topr  spacer  bdcr  r  r  nlinesrq   s:                                                             r   r  zShape.insert_text-  s8   * G}} 	1==u- 	%%''DDD4yy1} 	1e	::388D>>:::;;GG 	 	 	11	
 C   	!""IEy$$!!%	 %   !400A;J'(#&!J'[)	 	8+GG	!Q& 	8nGG(Y"67GS= 	(X--dGaK@@FFh'F 	9 	9A &(BB JJx1fh778888eS))	T3'' 	-q( 	-D ,,He$$8q= 	1/000Ag 	3JC Ag 	Cioo88##$
  	1aE!HJ$7%(*9Ltv9UVVB#a.2%C8C==))G3BBBuw'w"9 	*EG#df,D7(TV#C%KBCHH$EECZ 
	*7UW$tv-D'DF"C%KBHHEECZ 	*G8df$D'EG#df,C%KB$&())E)11"55 	!G+CCCNC#	&&.\&JJ 	'EE&Evc5"dCAA? 	+H{**D1 	4Il++e33D 	ID 	HD
 	Qt99q= 	FF7OO#DDDLDq#d))$$ 	 	Aw 1u  DGdN"DWEaKFF## 	$s   +,B B43B4c                    | j         @t          |          dk    rt          ||          | _         d S t          |          | _         d S t          |          dk    rt          |          }t	          | j         j        |j                  | j         _        t	          | j         j        |j                  | j         _        t          | j         j
        |j                  | j         _
        t          | j         j        |j                  | j         _        d S t          |          }t	          | j         j        |j                  | j         _        t	          | j         j        |j                  | j         _        t          | j         j
        |j
                  | j         _
        t          | j         j        |j                  | j         _        d S rs  )r   r-  r   r  r  r  r  r  r  r  r  r  ry  s     r   update_rectzShape.update_rect=.  s:   9 	71vv{ $ AJJ			 GG			1vv{ 7!HH"49<55	"49<55	"49<55	"49<55	GG"49<66	"49<66	"49<66	"49<66	r   rg  )ry   )r   r  Nr   r   NFNTr   r   r   )r  Nr/  Nr   r   NNr   r   r   Nr   r   r   )$r`   ra   rb   r	  r   r^   r  r6  r   r>  r+  rC  rI  rL  r  r  r   r   rS  r{   rU  rW  rY  rB  ry  r{  r
  r   r  r  r  rh  r   r	  r  r  r    r   r   r.  r.  +  s_       T    ( d d    .  	
    0C* Ce C C C C00 0 	0 0 0 0J J    v|Iy,@A    0D    Bi B B B B
i      $K KK K 	K
 K K K Kb 	# ## # # # #R 	   	   >  !" ""#$%Y YY Y 	Y
 Y Y Y Y Y Y  Y "Y Y Y Y Y Yv   \. !#'"#   "# $%"#%r rr \#t),r 	r
 !r r r r r r r r  r r r  "!r"  #r$ %r& 'r r r rh7 7 7 7 7r   r.  c                       e Zd ZddZd Zed             Zed             Zd Z	dd	Z
dd
Zd Zd ZddZedd            Zedd            ZddZ G d d          Zd dZd!dZd"dZd"dZdS )#Storyr(   Nr  c                 x   t          j        |                    d                    }|r$t          |t                    st	          |          }|r|j        nt          j        d           }t          t           d          rt          j        ||||          | _        d S t          j	        ||||          | _        d S )Nr  FzStoryS)
rf   rh  r  rz   r  r   r  r  r  FzStory)r]   htmluser_cssemr  r   archs          r   r^   zStory.__init__T.  s    6G8L8LMM 	':gw77 	'g&&G&Bw||EOT,B,B5*%% 	D2tDDDIIIw"dCCDIIIr   c                 N   | j         }d}|                    ddd          }|r|j        }t          |          dk    rM|d         dk    rA|d         dv r7|                    d          }|s d| }|                    d|           |dz  }|                    ddd          }|dS dS )	zt
        Look for `<h1..6>` items in `self` and adds unique `id`
        attributes if not already present.
        r   Nry   r  r   123456r  h_id_)rb  ri   rr  r-  r  r  r  )r]   domrq   r  r   attrid_s          r   add_header_idszStory.add_header_ids^.  s    
 iHHT4&& 		.9D4yyA~ $q'3, 47h3F ,,T22 %!++COOD#...FAD$--A  		. 		. 		. 		. 		.r   c                 x   t          | t                    r| }nt          d|           }t                      }|D ]'}|j        dz  r|j        r|j        |v r|||j        <   (|D ]U}|j        dz  rG|j        r?t                      }t          |j                  |d<   |j                            d          r|j        dd         }	 ||         }nA# t          $ r4}	t          dk    rt                       t          d| d|           |	d}	~	ww xY w	 t          |d<   |j        \  }
}}}t          |
|          |d<   |j        dz
  |d<   nK|j                            d          rt"          |d<   |j        dd         |d<   nt$          |d<   |j        |d<   ||j        dz
                               |           W|S )a  
        Adds links to PDF document.
        Args:
            document_or_stream:
                A PDF `Document` or raw PDF content, for example an
                `io.BytesIO` instance.
            positions:
                List of `ElementPosition`'s for `document_or_stream`,
                typically from Story.element_positions(). We raise an
                exception if two or more positions have same id.
        Returns:
            `document_or_stream` if a `Document` instance, otherwise a
            new `Document` instance.
        We raise an exception if an `href` in `positions` refers to an
        internal position `#<name>` but no item in `postions` has `id =
        name`.
        r!  r   r  r1	  NzNo destination with id=z, required by position_from: r   z"add_pdf_links(): making link from:zadd_pdf_links():    zadd_pdf_links(): to:r	  r  r   zname:r
   r   r  )rz   r   r   
open_closer  r  r   r   r   r   r   rF   r   r>   r	  r  page_numr	  r	  r  )document_or_stream	positionsr   id_to_positionpositionposition_fromr  	target_idposition_tor'  r  r  r  r  s                 r   add_pdf_linkszStory.add_pdf_linksq.  s-   & ((33 	;)HH'9::H
 ! 	< 	<H#a' <X[ <;.0 <3;NHK0 ' (	G (	GM(1, &G-2D &G vv#M$677V %0055 9 - 2122 6IE&4i&@$ E E E/!3H8H8H8H*+|Y+|+|mz+|+|}}  DE  EE
B
 $-DL%0%5NBB "'r2DJ#.#7!#;DLL %)44W== 9'1V'4'9!""'=V'/V&3&8U /!34@@FFFs   C
D/D

Dc                 R    |                                  }|                                S r   )r   r  r]   r  s     r   rb  z
Story.body.  s    mmoo{{}}r   c                 R    t          j        | j                  }t          |          S r   )rf   fz_story_documentr   r_  r  s     r   r   zStory.document.  s     %ty11Cyyr   c                     t          |          }|r|j        nt          j        d           }t          j        | j        ||           d S r   )r  r   rf   r  fz_draw_story)r]   r  r  ctm2r
  s        r   drawz
Story.draw.  sF     &))#>fkk)>)>TYT22222r   c                    t                    t          u rU                                D ]?}t          |          t          u r|                                st          d| d          @ni t                    rj        j        dk    rt          d          fd}t          j
        | j        |           dS )zU
        Trigger a callback function to record where items have been placed.
        zinvalid key 'r   r   z@callback 'function' must be a callable with exactly one argumentc                     G d d          } |            }| j         |_         | j        |_        | j        |_        t          | j                  |_        | j        |_        | j        |_        | j        |_        | j	        |_	        r+
                                D ]\  }}t          |||            |           d S )Nc                       e Zd ZdS )=Story.element_positions.<locals>.function2.<locals>.Position2Nr`   ra   rb   r    r   r   	Position2r  .  s        r   r  )rH  headingr  r.  r   r:   r  rectangle_numrect_numr  rt  setattr)r  r  	position2rx  rM   r  r5   s        r   	function2z*Story.element_positions.<locals>.function2.  s           !	I&nIO ( 0I#;IL,X];;IN%]IN#+#6I !)!7I%]IN . JJLL . .DAqY1----Hi     r   N)r   r   r  r   isidentifierr   r  __code__co_argcountrf   fz_story_positionsr   )r]   r5   r  rx  r  s    ``  r   element_positionszStory.element_positions.  s     :: 	YY[[ ; ;Q3 ;1>>+;+; ;$%9Q%9%9%9:::;; D!! 	aX%6%Ba%G 	a_```	! 	! 	! 	! 	! 	!  	 $)Y77777r   c                     t          |          }t          j                    }t          j        | j        ||          }|t          |          fS r   )r  rf   r/  fz_place_storyr   r.  )r]   wherefilledmores       r   placezStory.place.  sC    ''#TYv>>_f----r   c                 8    t          j        | j                   d S r   )rf   fz_reset_storyr   r\   s    r   r 
  zStory.reset.  s    di(((((r   c                 (   d }dd}t          dddd          }	  |||          \  }}	}
|dz  }|rdz  |                     |	          \  }}rfd}|                     |           |r|rK|r$|r |||d           |                                 |                    |          }|r |||d           |                     ||
           |s$|r |||d           |                                 n|                     d |
           |sd S )Nr   r   c                 ,    | _          |            d S r   )r  )r  r  
positionfns    r   positionfn2z Story.write.<locals>.positionfn2	/  s#     )1H%Jx(((((r   )r   r  r  r  r  r  )r]   writerrectfnr  pagefnr
  r  r  r  r   r  r  r  r  s      `         @r   rQ  zStory.write.  s   aAq!! 	"(&6":":HdCMH A::t,,LD& 4) ) ) ) ) )
 &&{333 % ; *! ?"F8XsA>>>))) ++X66C ;x3:::		3$$$ & <(C;;;OO%%%		$$$$ A 	r   Tc	                    t                      d }		 |	}
 |          }	d|	|
k    rd|	}t          ||||          }|r|                                 t                      fd}|                    r| nd |||           rd S w)Nr   FTc                 X                         |            rr |            d S d S d S r   r6   )r  r  r  stables    r   r  z+Story.write_stabilized.<locals>.positionfn25/  sP      *** )j )Jx((((() ) ) )r   )r{   r  r  rQ  )r  	contentfnr  r  r  r  r  r  r  r5  content_prevcontent2storyr  r  r  s        `        @@r   write_stabilizedzStory.write_stabilized#/  s    FF		"Li++GF,& H(Hb'::E '$$&&&I) ) ) ) ) ) )
 KK$.FF$	    3	r   c                 &   t          j                    }t          |          }	g fd}
t                              |	| ||||
|||	  	         |	                                 |                    d           t                              |          S )Nc                 P                         |            r |            d S d S r   r  r  r  r  s    r   r  z6Story.write_stabilized_with_links.<locals>.positionfn2I/  ?    X&&& %
8$$$$$% %r   r   )r4  r5  r  r  r  r  r  r  )r  r  r  r  r  r  r  r  r  r  r  r  s       `      @r   write_stabilized_with_linksz!Story.write_stabilized_with_linksC/  s     ''		% 	% 	% 	% 	% 	%
 	vy&(BU[]dftuuuA""69555r   c                    t          j                    }t          |          }g fd}|                     ||||           |                                 |                    d           t                              |          S )Nc                 P                         |            r |            d S d S r   r  r  s    r   r  z+Story.write_with_links.<locals>.positionfn2X/  r  r   )r  r  r   )r4  r5  r  rQ  r  r  r  r  )r]   r  r  r  r  r  r  r  s     `    @r   write_with_linkszStory.write_with_linksS/  s    ''		% 	% 	% 	% 	% 	%
 	

66k&
IIIA""69555r   c                        e Zd ZdZddZd ZdS )Story.FitResulta  
        The result from a `Story.fit*()` method.
        
        Members:
        
        `big_enough`:
            `True` if the fit succeeded.
        `filled`:
            From the last call to `Story.place()`.
        `more`:
            `False` if the fit succeeded.
        `numcalls`:
            Number of calls made to `self.place()`.
        `parameter`:
            The successful parameter value, or the largest failing value.
        `rect`:
            The rect created from `parameter`.
        Nc                 Z    || _         || _        || _        || _        || _        || _        d S r   
big_enoughr  r  numcalls	parameterr   )r]   r  r  r  r  r  r   s          r   r^   zStory.FitResult.__init__u/  s0    (DO DKDI$DM&DNDIIIr   c                 f    d| j          d| j         d| j         d| j         d| j         d| j         S )Nz big_enough=z filled=z more=z
 numcalls= parameter= rect=r  r\   s    r   r   zStory.FitResult.__repr__}/  sk    )4? ) )#{) )!Y) ) "&) ) #'.	) )
 "Y) )r   r  )r`   ra   rb   r	  r^   r   r    r   r   	FitResultr  b/  sA        	 	$	 	 	 		 	 	 	 	r   r  re  Fc                    
 fd
t          t          t          f          sJ t          t          t          f          sJ  G fdd          } |            r 
dj        dj        d                                             
fd}
 fd	d
 }j        2r 
d            |j        d          }		  |	          sn|	dz  }	n0 j                  r r 
dj        d            |            S j        2r 
d            |j        d          }		  |	          rn|	dz  }	n7 j                  s'd_        r 
dj        d            |            S r 
dj        dj        d           	 j        j        z
  |k     r
 |            S j        j        z   dz  }	 |	           ;)aB  
        Finds optimal rect that contains the story `self`.
        
        Returns a `Story.FitResult` instance.
            
        On success, the last call to `self.place()` will have been with the
        returned rectangle, so `self.draw()` can be used directly.
        
        Args:
        :arg fn:
            A callable taking a floating point `parameter` and returning a
            `pymupdf.Rect()`. If the rect is empty, we assume the story will
            not fit and do not call `self.place()`.

            Must guarantee that `self.place()` behaves monotonically when
            given rect `fn(parameter`) as `parameter` increases. This
            usually means that both width and height increase or stay
            unchanged as `parameter` increases.
        :arg pmin:
            Minimum parameter to consider; `None` for -infinity.
        :arg pmax:
            Maximum parameter to consider; `None` for +infinity.
        :arg delta:
            Maximum error in returned `parameter`.
        :arg verbose:
            If true we output diagnostics.
        c                 4    sJ t          d|             d S )Nzfit(): rB   )r:   verboses    r   r>   zStory.fit.<locals>.log/  s)    NNN$d$$%%%%%r   Nc                       e Zd Z fdZdS )Story.fit.<locals>.Statec                     | _         | _        d | _        d | _        d | _        d| _        r| _        | _        d S d S rW   )pminpmaxpmin_resultpmax_resultr  r  pmin0pmax0)r]   r  r  r  s    r   r^   z!Story.fit.<locals>.State.__init__/  sS     	 	#' #' " ! &!%DJ!%DJJJ& &r   Nr_   )r  r  r  s   r   Stater  /  s8        	& 	& 	& 	& 	& 	& 	& 	& 	&r   r  zstarting. state.pmin= state.pmax=rs   c            
      4   j         9j        j         k    r!r d            j                   } | sJ j        }n.j        rj        nt                              j                  }r& dj        dj        dj         d|           |S )NzCCalling update() with pmax, because was overwritten by later calls.)r  zfinished. state.pmin0=z state.pmax0=r  z: returning result=)	r  last_pr  r  r  r  r  r  r  )r  r  r>   r   r  r  s     r   rN   zStory.fit.<locals>.ret/  s    z n<5:- & dbccc!'
!3!3J%%%%*.3.?m**U__^c^l_EmEm caaaaauzaaX^aabbbMr   c                     |           }t          |t                    sJ dt          |          d|            |j        r1d}t                              | 	j                  }
r d           np                    |          \  }}	xj        dz  c_        | }t                              ||	j        | ||          }
r d	j        d	d
|d| d|d	           |r| 	_        |	_	        n| 	_
        |	_        | 	_        |S )a  
            Evaluates `more, _ = self.place(fn(parameter))`. If `more` is
            false, then `rect` is big enought to contain `self` and we
            set `state.pmax=parameter` and return True. Otherwise we set
            `state.pmin=parameter` and return False.
            ztype(rect)=r
  F)r  r  z9update(): not calling self.place() because rect is empty.r   )r  r  r  r  r   r  zupdate(): called self.place(): z>2dz: more=r	  rs   )rz   r   r   r
  r  r  r  r  r  r  r  r  r  )r  r   r  r  r  r  fnr>   r]   r   r  s         r   r  zStory.fit.<locals>.update/  s^    2i==DdD))CC+Cd4jj+C+CD+C+CCCC} o"
9u~VV VCTUUU#zz$//f!#!%X
%!!&"+!#- )    oCm%.mmmPTmmXammeimmmnnn +&
$*!!&
$*!$ELr   c                 8    | | dk    r|S || z  dk    rd| z  S |  S )z
            Returns same sign as `direction`, larger or smaller than `p` if
            direction is positive or negative respectively.
            Nr   ry   r    )rj  	directions     r   oppositezStory.fit.<locals>.opposite/  s>    
  !AqD !  1}q  1u2Ir   zfinding pmin.r   r   ry   zstate.pmin=z is big enough.zfinding pmax.z No solution possible state.pmax=z$doing binary search with state.pmin=)rz   r   r+  r  r  r 
  )r]   r  r  r  r  r  r  rN   r!  r  r>   r   r  s   ```` `    @@@r   fitz	Story.fit/  s   8	& 	& 	& 	& 	& $e--====$e--====
	& 
	& 
	& 
	& 
	& 
	& 
	& 
	& 
	& 
	& 
	& 
	&  	;C9UZ995:999:::

	 	 	 	 	 	 	 	#	 #	 #	 #	 #	 #	 #	 #	 #	J		 		 		 : 	-,--- R00Ivi(( Q	 vej!! @CC ?5: ? ? ?@@@suu: 	-,--- R00I6)$$ Q	 6%*%% !
GCC F
 F F FGGGsuu QCCPEJPP%*PPPQQQ	zEJ&. suuej0A5IF9		r   r   c                 n   	
 |\  }}|z
  
|z
  		
fd}|                      |||||          S )ao  
        Finds smallest value `scale` in range `scale_min..scale_max` where
        `scale * rect` is large enough to contain the story `self`.

        Returns a `Story.FitResult` instance.

        :arg width:
            width of rect.
        :arg height:
            height of rect.
        :arg scale_min:
            Minimum scale to consider; must be >= 0.
        :arg scale_max:
            Maximum scale to consider, must be >= scale_min or `None` for
            infinite.
        :arg delta:
            Maximum error in returned scale.
        :arg verbose:
            If true we output diagnostics.
        c                 @    t          | z  z   | z  z             S r   r  )scaler  r  r  r  s    r   r  zStory.fit_scale.<locals>.fn60  s)    BU5[ 0"uV|2CDDDr   r"  )r]   r   	scale_min	scale_maxr  r  r  r  r  r  r  r  r  s            @@@@r   	fit_scalezStory.fit_scale0  sq    * BBRb	E 	E 	E 	E 	E 	E 	E 	ExxIy%AAAr   r  c                 \   	
 |\  
|z   		
fd}|                      |||||          S )a  
        Finds smallest height in range `height_min..height_max` where a rect
        with size `(width, height)` is large enough to contain the story
        `self`.

        Returns a `Story.FitResult` instance.

        :arg width:
            width of rect.
        :arg height_min:
            Minimum height to consider; must be >= 0.
        :arg height_max:
            Maximum height to consider, must be >= height_min or `None` for
            infinite.
        :arg origin:
            `(x0, y0)` of rect.
        :arg delta:
            Maximum error in returned height.
        :arg verbose:
            If true we output diagnostics.
        c                 .    t          | z             S r   r  )r  r  r  r  s    r   r  zStory.fit_height.<locals>.fnR0  s    BBvI...r   r&  )r]   r  
height_min
height_maxoriginr  r  r  r  r  r  s           @@@r   
fit_heightzStory.fit_height:0  sV    , B%Z	/ 	/ 	/ 	/ 	/ 	/ 	/xxJ
E7CCCr   c                 \   	
 |\  	|z   
	
fd}|                      |||||          S )a  
        Finds smallest width in range `width_min..width_max` where a rect with size
        `(width, height)` is large enough to contain the story `self`.

        Returns a `Story.FitResult` instance.
        Returns a `FitResult` instance.

        :arg height:
            height of rect.
        :arg width_min:
            Minimum width to consider; must be >= 0.
        :arg width_max:
            Maximum width to consider, must be >= width_min or `None` for
            infinite.
        :arg origin:
            `(x0, y0)` of rect.
        :arg delta:
            Maximum error in returned width.
        :arg verbose:
            If true we output diagnostics.
        c                 .    t          | z             S r   r  )r  r  r  r  s    r   r  zStory.fit_width.<locals>.fnn0  s    B5"---r   r&  )r]   r  	width_min	width_maxr.  r  r  r  r  r  r  s           @@@r   	fit_widthzStory.fit_widthV0  sV    , B&[	. 	. 	. 	. 	. 	. 	.xxIy%AAAr   )r(   Nr  Nr   r  )Nr  NNNT)NNre  F)r   Nre  F)r   Nr  re  F)r`   ra   rb   r^   r  r  r  r  rb  r   r  r  r  r 
  rQ  r  r  r   r  r"  r)  r/  r4  r    r   r   r  r  R.  s       D D D D. . .& R R \Rh   X  3 3 3 3
8 8 8 8>. . .) ) )% % % %N    \> 6 6 6 \66 6 6 6# # # # # # # #JU U U UnB B B B8D D D D8B B B B B Br   r  c                       e Zd Zd Zd Zd ZddZd Zddefd	Z	de
fd
ZddZdde
fdZddefdZdde
fdZd Zdde
fdZd ZddZde
fdZde
fdZd Zed             ZddZeZdS )r  c                    t          |t          j                  r"|d         }t          j        |          | _        n:t          |t          j                  r|d         | _        nt          d|           d| _        d | _        d S )Nr   Unrecognised args: T)r  rf   r/  r  r   r   r   r   )r]   r  r  s      r   r^   zTextPage.__init__u0  s~    dEL)) 	:AwH)844DIIe/00 	:QDII8$88999r   c                 x   | j         }t          j        d          }t          j        |          }|dk    rt          j        ||d           nJ|dk    rt          j        ||d           n-|dk    rt          j        ||d           nt          ||           |                                 t          |          }|S )Nr  r   r   r   r  )
r   rf   r  r  fz_print_stext_page_as_htmlfz_print_stext_page_as_xmlfz_print_stext_page_as_xhtmlJM_print_stext_page_as_textr0  ro  )r]   r  
this_tpager   r1  r:   s         r   _extractTextzTextPage._extractText0  s    Y
!$''nc"" a< 	9-c:qAAAA\ 	9,S*a@@@@\ 	9.sJBBBB'Z888%c**r   c                 2    t          | j        ||           d S r   )JM_make_textpage_dictr   )r]   	page_dictr}  s      r   _getNewBlockListzTextPage._getNewBlockList0  s    diC88888r   Fc                 d    | j         j        | j         j        d}|                     ||           |S )Nr  )r   r  r  rB  )r]   r}  rA  s      r   _textpage_dictzTextPage._textpage_dict0  s4    "io9IJJ	i---r   c                    t           rt          j        | j                  S d}| j        }t	          j        |j        j                  }t	          j        d          }g }|D ]|}|dz  }t	          j        t          j        j	                  }|j        j
        t          j        k    rt	          j        |           d}d}	|D ]}
|dz  }t	          j        t          j        j	                  }|
D ]r}t          |
|          }t          ||          st	          j        |          s7t!          ||j        j                   |j        j        }	t	          j        ||          }s|	dk    r)t	          j        |          st	          j        |d           t	          j        ||          }t+          |          }nt          ||j        j                  st	          j        |          r|                                }|                                }dt	          j        |          |                                |                                |                                fz  }t	          j        |t	          j        |j        j                            }t	          j        |          s<|j        |j        |j        |j         |||j        j
        f}|!                    |           ~|S )z*Return a list with text block information.r   r  r   r   
   z+<image: %s, width: %d, height: %d, bpc: %d>)"r   r   extractBLOCKSr   rf   r/  r   r  r  Fixed_EMPTYr   FZ_STEXT_BLOCK_TEXTfz_clear_bufferJM_char_bboxJM_rects_overlaprl  JM_append_runery  fz_union_rectrk  fz_append_bytero  r   i_imager  r{  r   r  ry  r  r  r  r  r6   )r]   block_nr=  tp_rectr   r  block	blockrectline_n	last_charr=   linerectr  cbboxr:   r  r  litems                     r   rG  zTextPage.extractBLOCKS0  s    	2&ty111Y
,z4=>>!$'' +	$ +	$EqLGU\%=>>I$(AA `%c***	! I IDaKF$|EL,DEEH" H H ,T2 6 6 0% @ @ %(-(A'(J(J% %&sBMO<<<$&MO	#(#6x#G#G B 6u/Eh/O/O 6,S"555 % 3Ix H HII-c22"7E,<,ABB 	`099	` mmoo^^%%D044#''))H  "/	5<HXH];^;^__	))44 
$!!!!(- U###r   Nr  c                     |                      d          }||j        |d<   |j        |d<   |du r$|d         }|                    d 	           ||d<   |S )
z>Return page content as a Python dict of images and text spans.Fr}  Nr  r  Tblocksc                 :    | d         d         | d         d         fS Nr   r   r   r    r  s    r   r  z&TextPage.extractDICT.<locals>.<lambda>0      qy|QvYq\&B r   r  rD  r  r  r.  r]   r  r.  r   r\  s        r   extractDICTzTextPage.extractDICT0  sq    !!e!,, 	&8CLICM4< 	#]FKKBBKCCC"CM
r   c                 ,    |                      d          S )z%Return page content as a HTML string.r   r>  r\   s    r   extractHTMLzTextPage.extractHTML0  r  r   r   c           	      ^   d}| j         }g }|D ]}|dz  }|j        j        t          j        k    r#|                                }d}t          dk    r-t          j        |          }|r|                                }d}n/t          j	        |j                  }|rt          j
        |          }|rt          j        t          t          t          t                    }	t          j        |	          sJ t          j        |                                dd|                                dd          }
t          j        ||	|
          \  }}}t          j        |          }t)          |          }|dk    r>|                                |                                z  |                                z  }t          j        t          j        |j        j                            }t3                      }||t4          <   t7          |j        j                  |t:          <   t=          |                                          |t@          <   |                                |tB          <   |                                |tD          <   t          j#        |          |tH          <   t          j%        |          |tL          <   |'                                |tP          <   |)                                |tT          <   |+                                |tX          <   ||tZ          <   |r||d<   |.                    |           |S )z*Return a list with image meta information.r   r   r   r  Nr
  )/r   r   r   rf   rI  rP  r~   r
  fz_compressed_buffer_sizerk  ll_fz_compressed_buffer_sizer  r  r  r  r9  r   r  r  r
  r   rF  rn  ll_fz_keep_colorspacer  r   dictkey_numberr.  r   dictkey_bboxr8  i_transformdictkey_matrixr{  r|  r~  r}  r{  r  r  r  r  r  ry  r~  r~  r6   )r]   hashesrQ  r=  rh   rS  r  img_size
compr_buffr   rH  r  r   r  r
  r  
block_dicts                    r   extractIMGINFOzTextPage.extractIMGINFO0  s   Y
 '	" '	"EqLG$(AA --//CH"g- N"=cBB
 &)CCEEH!%J"@PP
 N$A*MMH ;M/?OUdee1!44444N35577Aq#%%''1a@@!:31EE	Q-c22vq= ;"uuww035577:H#E$?@Y$Z$Z[[BJ*1J'(78H8M(N(NJ%*;E<M<M<O<O*P*PJ'),J&*-%%''J'.3.CB.G.GJ*++0+CB+G+GJ((+

J%(+

J%'*wwyyJ$(0J% /(.
H%IIj!!!!	r   c                    ddl ddl}|                     d          } G fdd|j                  }||j        |d<   |j        |d<   |d	u r$|d
         }|                    d            ||d
<   |                    |d|d          }|S )z.Return 'extractDICT' converted to JSON format.r   NFr[  c                       e Zd Z fdZdS )'TextPage.extractJSON.<locals>.b64encodec                     t          |          t          t          fv r'                    |                                          S d S r   r   r   r3  	b64encoderD  r]   r/  base64s     r   r   z/TextPage.extractJSON.<locals>.b64encode.default1  E    77ui00 8!++A..557778 8r   Nr`   ra   rb   r   r{  s   r   ry  rv  1  .        8 8 8 8 8 8 8r   ry  r  r  Tr\  c                 :    | d         d         | d         d         fS r^  r    r_  s    r   r  z&TextPage.extractJSON.<locals>.<lambda>#1  r`  r   r  r	  r+   r   
separatorsr  rQ  r{  jsonrD  JSONEncoderr  r  r.  dumpsr]   r  r.  r  r   ry  r\  r{  s          @r   extractJSONzTextPage.extractJSON1  s    !!e!,,	8 	8 	8 	8 	8 	8 	8( 	8 	8 	8
  	&8CLICM4< 	#]FKKBBKCCC"CMjj1jMM
r   c                     |                      d          }||j        |d<   |j        |d<   |du r$|d         }|                    d            ||d<   |S )	zCReturn page content as a Python dict of images and text characters.Tr[  Nr  r  r\  c                 :    | d         d         | d         d         fS r^  r    r_  s    r   r  z)TextPage.extractRAWDICT.<locals>.<lambda>11  r`  r   r  ra  rb  s        r   extractRAWDICTzTextPage.extractRAWDICT)1  sq    !!d!++ 	&8CLICM4< 	#]FKKBBKCCC"CM
r   c                    ddl ddl}|                     d          } G fdd|j                  }||j        |d<   |j        |d<   |du r$|d	         }|                    d
            ||d	<   |                    |d|d          }|S )z1Return 'extractRAWDICT' converted to JSON format.r   NTr[  c                       e Zd Z fdZdS )*TextPage.extractRAWJSON.<locals>.b64encodec                     t          |          t          t          fv r'                    |                                          S d S r   rx  rz  s     r   r   z2TextPage.extractRAWJSON.<locals>.b64encode.default<1  r|  r   Nr}  r~  s   r   ry  r  ;1  r  r   ry  r  r  r\  c                 :    | d         d         | d         d         fS r^  r    r_  s    r   r  z)TextPage.extractRAWJSON.<locals>.<lambda>E1  r`  r   r  r  r   r  r  r  s          @r   extractRAWJSONzTextPage.extractRAWJSON51  s    !!d!++	8 	8 	8 	8 	8 	8 	8( 	8 	8 	8
  	&8CLICM4< 	#]FKKBBKCCC"CMjj1jMM
r   c                 z    t          |          }t          |          }t          j        | j        ||d          }|S rW   )r\
  rf   fz_copy_selectionr   )r]   pointapointbr   r  rh  s         r   extractSelectionzTextPage.extractSelectionJ1  s9    V$$V$$'	1a;;r   c                     |du r|                      d          S |                                 dd         }|                    d            d                    d |D                       S )z%Return simple, bare text on the page.Fr   Nc                 "    | d         | d         fS )Nr   r   r    r_  s    r   r  z&TextPage.extractText.<locals>.<lambda>U1  s    1Q41, r   r  r(   c                     g | ]
}|d          S )r  r    )rp   r  s     r   rr   z(TextPage.extractText.<locals>.<listcomp>V1  s    ---!---r   )r>  rG  r.  r  )r]   r.  r\  s      r   extractTextzTextPage.extractTextP1  su    5= 	($$Q'''##%%aaa(..///ww--f---...r   c                     | j         }t          |t          j                  sJ t	          |          }t          ||          }t          |          }|S r   )r   rz   rf   r  r  JM_copy_rectangle PyUnicode_DecodeRawUnicodeEscape)r]   r   r=  r  rh  rh   s         r   r%  zTextPage.extractTextboxX1  sP    Y
*e&788888t$$!*d33-e44	r   c                    t           rt          j        | j        |          S d}d}t	          j        t          j        j                  }| j        }t	          j        |j        j                  }d}t	          j	        d          }g }|D ]Y}	|dz  }|	j        j
        t          j        k    r#d}
|	D ]0}|
dz  }
d}t	          j        |           d}|D ]}t          ||          }t          ||          st	          j        |          s7t!          |j        j        |          }|rI|dk    rZt	          j        |          st'          |||||
|          \  }}t	          j        |           d}t)          ||j        j                   |dz  }t	          j        |t          ||                    }|r+t	          j        |          st'          |||||
|          \  }}d}2[|S )z)Return a list with text word information.r   r   N@   r   )r   r   extractWORDSr   rf   r/  rH  r   r  r  r   rI  rJ  rK  rL  rl  JM_is_word_delimiterry  rk  JM_append_wordrM  rN  )r]   
delimitersbuflenrQ  wbboxr=  rR  r  r$  rS  rU  r=   word_nr  rX  word_delimiters                   r   r  zTextPage.extractWORDS`1  s!    	=%di<<<U\566Y
,z4=>>"2&&  	  	EqLG$(AA F  !%d+++ O OB(r22E,We<< !$)$=g$F$F! !%9"-/:%V%VN% !!Q; %$$5e<< h,:5$wX^`f,g,gMFE-d333!" "4999aKF!/|D"7M7MNNEE `%"8"?"? `$25$wPVX^$_$_MFE78 r   c                 ,    |                      d          S )z&Return page content as a XHTML string.r  re  r\   s    r   extractXHTMLzTextPage.extractXHTML1  r  r   c                 ,    |                      d          S )z$Return page content as a XML string.r   re  r\   s    r   
extractXMLzTextPage.extractXML1  r  r   c                     | j         }t          j        |j        j                  }t          j        |          }d|_        |S )zTextPage current poolsize.N)r   rf   Poolr   poolfz_pool_size)r]   r
  r  r  s       r   poolsizezTextPage.poolsize1  s:    	z%*/00!4((r   c                 h    | j         }|j        j        }t          |          }t	          |          }|S )zPage rectangle.)r   r   r  r.  r   )r]   r=  r  r   s       r   r   zTextPage.rect1  s3     Y
(1h''3ii
r   r   c                    t          | j        |          }|s|S t          |          }t          |          D ])}t	          ||                   }|r|||<   |j        ||<   *|r|S d}||dz
  k     rO||         }||dz            }	|j        |	j        k    s
||	z  j        r|dz  }<||	z  ||<   ||dz   = |dz  }||dz
  k     O|S )z)Locate 'needle' returning rects or quads.r   r   )JM_search_stext_pager   r-  r  r  r   r  r
  )
r]   needlehit_maxr
  r   rt  rq   r
  v1v2s
             r   searchzTextPage.search1  s   "49f55 	JCu 	  	 ASVA  AA 	J%!)m 	QBQUBu~ "r'!3 Q"WCFAE
QJE %!)m 	 
r   r  r  r  r   )r   r   )r`   ra   rb   r^   r>  rB  rD  rG  r   rc  r   rf  rs  r  r  r  r  r  r%  r  r  r  r  r  r   r  extractTEXTr    r   r   r  r  s0  s       	 	 	  *9 9 9   
5 5 5n
 
$ 
 
 
 
$S $ $ $ $- - - -^ #    ,
 
T 
 
 
 
 S    *  / / / / / /  . . . .`$c $ $ $ $$C $ $ $ $     X   4 KKKr   r  c                   J    e Zd ZddZed             ZddZdd	Zd
 ZddZ	dS )
TextWriterr   Nc                    t          j                    | _        || _        || _        t          |          | _        t          ddddd| j        j                  | _	        | j	         | _
        t                      | _        d| j        _        t                      | _        d| j        _        t                      | _        d| _        dS )z;Stores text spans for later output on compatible PDF pages.r   r   r   z'Position following last text insertion.zAccumulated area of text spans.TN)rf   fz_new_textr   r  r  r   r   r<  r  r  ictmr  rS
  r	  	text_rectr-  
used_fontsr   )r]   	page_rectr  r  s       r   r^   zTextWriter.__init__1  s    %''	
OO	!Q2q$)*:;;XI	''"K!B%%r   c                     t          t          j        | j        t          j        d           t          j                                        }t          |          }|S r   )r.  rf   fz_bound_textr   FzStrokeStater9  r   r  s     r   _bboxzTextWriter._bbox1  sF    u2DIu?RSW?X?XZ_ZhZjZjkkll3ii
r   r  r   c           
      6   t          |          | j        z  }|t          d          }|j        s	 t          d|j        z            |r9|                     |          }d                    t          |                    }d}t!          j        |          }	t%          |          }
t!          j        |dd||
j        |
j                  }d}d}|dk    r&t!          j        | j	        |j	        ||||||	          }n t/          | j	        |j	        ||||||	          }t1          |          }t          |dd                   | j        z  | _        | j        | j        z  | _        | j        | j        f}|j        d         dk    r| j                            |           |S )z8Store 'text' at point 'pos' using 'font' and 'fontsize'.Nr/  r   z{font.this.m_internal.name=}z {font.this.m_internal.t3matrix=}z{font.this.m_internal.bbox=}z#{font.this.m_internal.glyph_count=}z&{font.this.m_internal.use_glyph_bbox=}z#{font.this.m_internal.width_count=}z%{font.this.m_internal.width_default=}z"{font.this.m_internal.has_digest=}zUnsupported font {font.name=}zAUnsupported font cppyy.gbl.mupdf_font_name(font.this.m_internal)=zUnsupported font '%s'.r(   r  r  r   ) r  r  r  r	  r>   re   r  r 	  mupdf_font_namer   r   r   r   	clean_rtlr  r/  rf   rM  r\
  fz_make_matrixr  r  fz_show_stringJM_show_string_csr8  r  rS
  r  r  r  r  r  )r]   r  r:   r/  r   r  right_to_leftr  r  r  rj  trm
markup_dirr  r   s                  r   r6   zTextWriter.append1  s   Cjj49$ 	 <<D 	Ca 5	ABBB 	>>$''D778D>>**DM1(;;S!!"8Q8QS!#FF
? 	n&	49c4P]_ikoppCC#TY	3e]\fhlmmC$$BCC//DH4dh.ndo-:f" 	&O%%%
r   Fc           	          |dz  }|D ]-}|                      ||||||           |xj        |z  c_        .| j        | j        fS )Nr  )r/  r   r  r  )r6   r  r  rS
  )	r]   r  r:   r/  r   r  r  r  ry  s	            r   appendvzTextWriter.appendv2  sc    S. 	 	AKKQTH!j  : : :EEWEEE~t..r   c                 F   |s|S |                     d          }g }t          t          |                    D ]t}||         }t          |          dk     sWt          d |D                       dk    s:d                    t          |                    ||<   |                    |           ug }t          t          |                    D ]}|g k    r|                    ||                    $||         |d         dz   k    rWt          |          dk    r:t          ||d         |d         dz                      ||d         |d         dz   <   ||         g}||         |d         dz   k    r|                    ||                    d                    |          }|S )	a)  Revert the sequence of Latin text parts.

        Text with right-to-left writing direction (Arabic, Hebrew) often
        contains Latin parts, which are written in left-to-right: numbers, names,
        etc. For output as PDF text we need *everything* in right-to-left.
        E.g. an input like "<arabic> ABCDE FG HIJ <arabic> KL <arabic>" will be
        converted to "<arabic> JIH GF EDCBA <arabic> LK <arabic>". The Arabic
        parts remain untouched.

        Args:
            text: str
        Returns:
            Massaged string.
        rl   ry   c                 ,    g | ]}t          |          S r    r  rM	  s     r   rr   z(TextWriter.clean_rtl.<locals>.<listcomp>+2  s    &9&9&9!s1vv&9&9&9r   r~  r(   r   r   r   )rl  r  r-  r  r  r/  r6   )r]   r:   wordsr*  rq   r   idx2s          r   r  zTextWriter.clean_rtl2  s     	K

3s5zz"" 	 	AaAFFQJ #&9&9q&9&9&9":":S"@ 778A;;//a

1 s3xx 	$ 	$Arz $CF####Q$r(Q,& $t99q= 4<d1gR1455 5E$q'DHqL01 AxQ48a<' $CF###xxr   r   c	                 <   t          |           t          | j        |j        z
            dk    rt          d          |dt	          |          t
          t          fvs8t	          |d                   t          ust	          |d                   t          urt          d          ||t          d          t          |dd          |d	k    r| j
        }|| j        }	 |                                }	d}
|dk    r|dk     r|}
d}g d
}|rt          |          \  }}|dk    rt          j                    }n-|dk    rt          j                    }nt          j                    }t%          |	           t          j        |	                                d          }t          j        d          }t          j        |	                                t          j                    ||          }t          j        || j        t          j                    |||
t          j        t          j                             t          j        |           t;          |	|          }t=          |          }||f}|}|d         }|d         }|\  }}|                                }|                     |          }|d|z  }d}ndx}}dg}|r|!                    |           |j"        }|j#        dv r|j        j$        |j        j%        z
  }nd}|j&        }tO          |          s|j(        dk    s|dk    r=|!                    dtS          |j*        |j+        |j(        z   |z
  f           d           |rM|d         | j,        z  } t          dd          -                    | j*        | j+                  }| |d         z  |z  }|s|r2|!                    tS          t]          |                    dz              |D ]"}!|!/                    d          r|!dk    r.|!                    |!           |!                    d|z             M|!/                    d          r9ta          |!1                                d         dd                   |z   }"d|"z  }!nr|!/                    d          r|!1                                }#te          |#d                   }$|dk    r|$dz  }%nd}%|!                    tS          |%          dz              ta          |#d         dd                   |z   }&d3                    d|&z  g|#dd         z             }!n|!/                    d           r*|!                    |!4                    d!d"                     n}|!/                    d#          r*|!                    |!4                    d#d$                     n>|!/                    d%          r)|!                    |!4                    d%d&                     |!                    |!           $|r|!                    |           |!                    d'           d(3                    |          5                    d)          }tl          7                    |||*           d}| j8        D ]}&ts          ||&           |S )+a  Write the text to a PDF page having the TextWriter's page size.

        Args:
            page: a PDF page having same size.
            color: override text color.
            opacity: override transparency.
            overlay: put in foreground or background.
            morph: tuple(Point, Matrix), apply a matrix with a fixpoint.
            matrix: Matrix to be used instead of 'morph' argument.
            render_mode: (int) PDF render mode operator 'Tr'.
        re  zincompatible page rectNr   r   z%morph must be (Point, Matrix) or Nonez$only one of matrix, morph is allowedr&  r   r.  r   r  r
   r  z/OC /%s BDCEMCr(   r
  r  r  z cmr  z%i Trz gsz	/Alp%i gs Tf皙?z wry   rl   z/F%iz rgr	  RGz gz Gz kz Kr  r  r  )r
  ):r-  r  r   r   r   r|   r{   r  r<  r   r  r  r]
  r  rf   r  fz_device_cmykfz_device_grayr$  r  r   r  pdf_new_pdf_devicer9  fz_fill_textr   ru  rv  r
  JM_merge_resourcesro  r  r
  r6   r  r
  r  r  r  r  r  r}   r  r  r  r	  r<  r  r   rl  r+  r  r  r  r   r  r  repair_mono_font)'r]   r   r  r  r
  r  r  r  r  rh  r  ncol	dev_colorr  r(  r  r
  max_numscont_stringr  r   r5  max_alpmax_fontold_cont_linesr  r  r  new_cont_linesr  r  r$  rj  r=   alprX  r  r   r/  s'                                          r   
write_textzTextWriter.write_textB2  s    	Dty49$%%, 	75666 	JUE4=0 JE!H~~U2JE!H~~V3J !!HIII 	E% 	ECDDD7K.. 	#'R- 	#lG 	JE$	nn&&GE!|  !  D$I ?"7">">iqy 4"022

 4"133

"133
w*7;;==!<<I*400H*GKKMM5>;K;KYX`aaCIN$$'(EFF   !3''' *7I>>H0(;;K,FCq6a&$ ++--,,R00 	')CCCNC# 	'!!#&&&"=I% 	I$ty6EEE]88 	[ruz 	[UaZ 	[!!"YYbdRUlU>R7S-T-T"Y"Y"YZZZ 	/a49$A1aLL--ac1377EVeAh&.F 	GF 	G!!)HV,<,<"="="EFFF" 	( 	(D}}U## t| %%d+++%%g&;<<<}}U## @$**,,q/!""-..8"S(u%% @zz||d1g!# AAA%%illT&9:::47122;''(2xx$$qrr( :;;u%% @%%dll4&>&>????t$$ @%%dll4&>&>????t$$ @%%dll4&>&>???!!$'''' 	'!!#&&&e$$$))N++227;;tWg>>>O 	) 	)DT4((((
r   rf  )Nr  Nr   r   )Nr  NF)Nr   r   NNr   r   )
r`   ra   rb   r^   r  r  r6   r  r  r  r    r   r   r  r  1  s           "   X
* * * *X/ / / /, , ,\E E E E E Er   r  c                      e Zd ZdZd Zd Zd Zd Zd Zdddddddd	Z	d
 Z
d Zd Zd Zd Zd Zd Zd Zd Zed             Zed             Zed             Zd Zd Zd Zd Zed             Zed             Zed             Zd Zd Zd Z ed              Z!ed!             Z"ed"             Z#ed#             Z$d$ Z%d% Z&ed&             Z'eZ(eZ)e#Z*e$Z+dS )'r  a  
    IRect() - all zeros
    IRect(x0, y0, x1, y1) - 4 coordinates
    IRect(top-left, x1, y1) - point and 2 coordinates
    IRect(x0, y0, bottom-right) - 2 coordinates and point
    IRect(top-left, bottom-right) - 2 points
    IRect(sequ) - new from sequence or rect-like
    c                 \    t                               | |                                          S r   )r   rY	  rg	  rg  s     r   rY	  zIRect.__add__2  "    ||D!$$**,,,r   c                 \    t                               | |                                          S r   )r   r  rg	  ry  s     r   r  zIRect.__and__2  r  r   c                 8    t                               | |          S r   )r   r  ry  s     r   r  zIRect.__contains__2  s      q)))r   c                     t          |d          sdS t          |          dk    oC| j        |d         k    o2| j        |d         k    o!| j        |d         k    o| j        |d         k    S r  )r  r-  r  r  r  r  r  s     r   ra	  zIRect.__eq__2  sn    q)$$ 	51vv{jtw!A$j47ad?jtwRSTURVj[_[bfghifj[jjr   c                 B    | j         | j        | j        | j        f|         S r   r  r  s     r   r  zIRect.__getitem__2  r  r   Nr  c          
      Z    t          |||||||d\  | _        | _        | _        | _        d S )Nr  )util_make_irectr  r  r  r  r  s           r   r^   zIRect.__init__2  s7    -<trVX]_dfkm-n-n-n*$'4777r   c                     dS r  r    r\   s    r   r  zIRect.__len__2  rr	  r   c                 \    t                               | |                                          S r   )r   ru	  rg	  r  s     r   ru	  zIRect.__mul__2  r  r   c                 V    t          | j         | j         | j         | j                   S r   )r  r  r  r  r  r\   s    r   rw	  zIRect.__neg__2  s&    dgXx$'DG8<<<r   c                 \    t                               | |                                          S r   )r   r  rg	  ry  s     r   r  zIRect.__or__2  s"    {{4##))+++r   c                      t          |           S r   )r  r\   s    r   r{	  zIRect.__pos__2  ry  r   c                 @    dt          t          |                     z   S )Nr  r}	  r\   s    r   r   zIRect.__repr__2  r{  r   c                     t          |          }|dk    r|| _        n9|dk    r|| _        n+|dk    r|| _        n|dk    r|| _        nt          d          d S r  )r   r  r  r  r  r  r	  s      r   r	  zIRect.__setitem__2  sq    FF!V 	3qTWW!V 	3qTWW!V 	3qTWW!V 	3qTWW1222tr   c                 \    t                               | |                                          S r   )r   r	  rg	  rg  s     r   r	  zIRect.__sub__3  r  r   c                 \    t                               | |                                          S r   )r   r	  rg	  r  s     r   r	  zIRect.__truediv__3  s$    a((..000r   c                 6    t          | j        | j                  S r  r  r\   s    r   r  zIRect.bottom_left
3  r  r   c                 6    t          | j        | j                  S r  r  r\   s    r   r  zIRect.bottom_right3  r  r   c                 <    t          d| j        | j        z
            S rW   r  r\   s    r   r  zIRect.height3  r  r   c                 D    | j                             |          }|j        S )z$Extend rectangle to include point p.)r   r  r  )r]   rj  r   s      r   r  zIRect.include_point3  s    y&&q))zr   c                 D    | j                             |          }|j        S )z(Extend rectangle to include rectangle r.)r   r  r  )r]   r   r   s      r   r  zIRect.include_rect3  s    y%%a((zr   c                 \    t                               | |                                          S )z4Restrict rectangle to intersection with rectangle r.)r   r  rg	  r  s     r   r  zIRect.intersect"3  s"    ~~dA&&,,...r   c                 8    t                               | |          S r   )r   r  ry  s     r   r  zIRect.intersects&3  s    tQ'''r   c                 B    | j         | j        k    p| j        | j        k    S r  r  r\   s    r   r
  zIRect.is_empty)3  r  r   c                 ~    | j         | j        cxk    o
t          k    nc o| j        | j        cxk    o
t
          k    nc S )zTrue if rectangle is infinite.r  r\   s    r   r
  zIRect.is_infinite.3  r	  r   c                 B    | j         | j        k    o| j        | j        k    S r  r  r\   s    r   r  zIRect.is_valid33  r  r   c                 b    | j         rt                      S | j                            ||          S r  r  r  s      r   r  zIRect.morph83  r  r   c                 X    t          j        t          d | D                                 S )Nc                     g | ]}||z  S r    r    rM	  s     r   rr   zIRect.norm.<locals>.<listcomp>A3  rN	  r   rO	  r\   s    r   r	  z
IRect.norm@3  rT	  r   c                     | j         | j        k     r| j         | j        c| _        | _         | j        | j        k     r| j        | j        c| _        | _        | S )z)Replace rectangle with its valid version.r  r\   s    r   r  zIRect.normalizeC3  r  r   c                 N    t          | j        | j        | j        | j                  S r  r  r\   s    r   r  z
IRect.quadK3  r  r   c                      t          |           S r   r  r\   s    r   r   z
IRect.rectP3  s    Dzzr   c                 6    t          | j        | j                  S r   r!  r\   s    r   r  zIRect.top_leftT3  r  r   c                 6    t          | j        | j                  S r#  r$  r\   s    r   r  zIRect.top_rightY3  r  r   c           	      J   t          |          }| j        s| j        s|j        s|j        rt          d          t	          dddd| j         | j                   t	          |j        | j        z  |j        | j        z            z  t	          dddd|j        |j                  z  S r&  r'  r  s     r   r(  zIRect.torect^3  s    GG 	Ht} 	H 	H 	HFGGGq!QDG8dgX664:-qx$+/EFFGAq!QT14001	r   c                 \    t                               | |                                          S r   )r   rF
  rg	  r  s     r   rF
  zIRect.transformi3  s"    ~~dA&&,,...r   c                 <    t          d| j        | j        z
            S rW   r,  r\   s    r   r  zIRect.widthl3  r  r   ),r`   ra   rb   r	  rY	  r  r  ra	  r  r^   r  ru	  rw	  r  r{	  r   r	  r	  r	  r  r  r  r  r  r  r  r  r
  r
  r  r  r	  r  r  r   r  r  r(  rF
  r  r  r  r  r  r    r   r   r  r  2  s        - - -- - -* * *k k k
7 7 7 "&$4DTd o o o o o  - - -= = =, , ,  * * *  - - -1 1 1 ' ' X' ' ' X' ) ) X)  
  
/ / /( ( ( 8 8 X8 _ _ X_ 9 9 X9% % %3 3 3   8 8 X8   X ' ' X' ' ' X'	 	 	/ / / ) ) X) 
B	B	B	BBBr   r  )PDF_UCDN_SCRIPT_PDF_ENUM_NAME_)CourierCourier-ObliqueCourier-BoldCourier-BoldOblique	HelveticaHelvetica-ObliqueHelvetica-BoldHelvetica-BoldObliqueTimes-RomanTimes-Italic
Times-BoldTimes-BoldItalicr  r  r  r/  r  heitr  hebor  hebir  courr  coitr  cobor  cobir  tiror  tibor  tiitr   tibir  symbr  zadbr  i   ifitzry   r   r  r
   re	         r  r   r  r  rF  r  r     r0  Color	ColorBurn
ColorDodgeDarken
Difference	Exclusion	HardLightHueLightenr  MultiplyNormalOverlay
SaturationScreen	Softlightc                 :    d|  dt          |||f           d| dS )Nz<</A<</S/GoTo/D[z	 0 R/XYZ z	]>>/Rect[]/BS<</W 0>>/Subtype/Link>>r]  )r   r  ry  r  r'  s        r   r  r  4  sM      (D!  (D  (DiQRTUWXPYFZFZ  (D  (Def  (D  (D  (D r   c                     d|  d| dS )Nz<</A<</S/GoTo/Dz>>/Rect[rB  r    r^  s     r   r  r  4  s    YYY1YYY r   c                 F    d|  dt          |||f           d| d| d| dS )Nz<</A<</S/GoToR/D[z /XYZ z]/F<</F()/UF()/Type/Filespec>>>>/Rect[rB  r]  r  s          r   r  r  4  so      /l!  /l  /l9VWYZ\]U^K_K_  /l  /lij  /l  /lqr  /l  /l  NO  /l  /l  /l r   c                     d|  d| d| dS )Nz<</A<</S/GoToR/Dz/F(	)>>/Rect[rB  r    r   r  ry  s      r   r  r  4  s"    "eQ"e"e1"e"eq"e"e"e r   c                     d|  d| d| dS )Nz<</A<</S/Launch/F<</F(rE  rF  rB  r    rI  s      r   r  r  4  s#    "}1"}"}1"}"}_`"}"}"} r   c                     d|  d| dS )Nz<</A<</S/URI/URI(rH  rB  r    r^  s     r   r  r  4  s    ZZZAZZZ r   c                     d|  d| dS )Nz<</A<</S/GoTo/D(z)/Type/Action>>/Rect[rB  r    r^  s     r   r  r  4  s    gggggg r   )goto1goto2gotor1gotor2launchr  rT  c                       e Zd ZdZdS )r  z0Raised for documents with file structure issues.Nr`   ra   rb   r	  r    r   r   r  r  4  s        ::Dr   r  c                       e Zd ZdZdS )r  zRaised if file does not exist.NrS  r    r   r   r  r  4  s        ((Dr   r  c                       e Zd ZdZdS )r  z5Raised when creating documents from zero-length data.NrS  r    r   r   r  r  4  s        ??Dr   r  r   r  r   r\  ry  ry  charsr  r  r5  r7  zcs-namedar  r  r  r?  effectr^  r3   r   r  r/  rl  r  r  r
  rt  r  r  rF
  r8  r   r  r.  r   r  r  spansr$  r  r9  r:   r6  r   r  r  r  r   r  r  )fontdescriptorsfontbuffersloader(      gq=
ףp?r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  )r0        ?)!   Zd;O?)"   7A`?)#   rO  )$    rh?)%   -?)&   gL7A`?)'   jt?)r  ra  ))   ra  )*   rO  )+   rf  ),   r_  )-   rf  ).   r_  )/   n?)0   rO  )1   rO  )r
  rO  )3   rO  )4   rO  )5   rO  )6   rO  )7   rO  )8   rO  )9   rO  ):   rs  );   rs  )<   rf  )=   rf  )>   rf  )?   g"~j?)r  rf  )A   v?)B   MbX?)C   r  )D   g/$?)E   Zd;O?)F   "~j?)G   粝K?)r  r  )I   ra  )J   x&1?)K   r  )L   ʡE?)M   g r?)N   r  )O   r  )P   ~jt?)Q   gʡE?)R   gn?)S   gl?)T   r  )U   Gz?)V   rk  )W   r  )X   gp=
ף?)Y   q=
ףp?)rr  r  )[   ra  )\   gV-?)]   ra  )^   uV?)r  rO  )`   rO  )a   r  )b   rf  )r  rf  )r  V-?)e   rk  )f   y&1?)g   M?)h   r  )i   uV?)j   r  )k   rf  )l   rf  )m   ;On?)n   r  )o   rf  )p   rf  )q   r  )r   rf  )s   r  )t   rk  )u   r  )v   rc  )w   r  )x   gZd;O?)y   r  )z   r  ){   Q?)|   皙?)}   r  )~   rf  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  r]  )   r_  )   gףp=
?)   gV-?)   rf  )   gK7A`?)   rc  )   rO  )   jt?)   r  )   r  )   r  )   y&1?)   rc  )   r  )   /$?)   r  )   g?)   rf  )   r  )   rf  )r  rf  )   r  )   r  r]  )   rf  )   rf  )   rf  )   rf  )   r   )   r  )   r   )   r  )   tV?)   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   rc  )   rc  )   rc  )   rc  )   rc  )   rc  )   rc  )   r  )   rc  )   HzG?)   r  )   g{Gz?)   r  )   rf  )   rf  )   rc  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   x&?)   rc  )   ~jt?)   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  )   r  r]  )   r  )   gK7?)   r  )   r  )   r  )   r  )   rf  )   r  )   r  )   r  )   r  )   r  )   r  )   r  r]  (   r^  K7?r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  )r0  rs  )r`  ^I+?)rb  gn?)rd  r3  )re  g\(\?)rg  g5^I?)ri  sh|??)rj  r  )r  Zd;O?)rl  r  )rm  gQ?)rn  g?5^I?)ro  rf  )rp  g\(\?)rq  x&?)rr  gB`"?)rt  r6  )ru  g=
ףp=?)r
  r3  )rv  g)\(?)rw  gOn?)rx  Mb?)ry  '1Z?)rz  gʡE?)r{  gDl?)r|  r  )r}  RQ?)r~  }?5^I?)r  gT㥛 ?)r  r  )r  gDl?)r  gv/?)r  gX9v?)r  g/$?)r  r  )r  r2  )r  r2  )r  r  )r  gK7A`?)r  g rh?)r  &1?)r  r  )r  r4  )r  gx?)r  r  )r  rh  )r  r;  )r  d;O?)r  gK7?)r  g+?)r  gA`"?)r  g+?)r  r  )r  MbX?)r  g=
ףp=?)r  E?)r  r  )r  r=  )rr  r:  )r  9v?)r  g-?)r  gm?)r  g;On?)r  g;On?)r  gGz?)r  r4  )r  r4  )r  r?  )r  gCl?)r  ʡE?)r  g?5^I?)r  r  )r  gv/?)r  rc  )r  r5  )r  gQ?)r  r5  )r  V-?)r  r8  )r  r7  )r  r7  )r  r:  )r  r:  )r  %C?)r  rB  )r  r2  )r  gJ+?)r  gx&1?)r  gDl?)r  g|?5^?)r  g(\?)r  J+?)r  rC  )r  K7A`?)r  rD  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  r1  )r  gCl?)r   rh?)r  rE  )r  gQ?)r  r  )r  r9  )r  r9  )r  r>  )r  g
ףp=
?)r  gh|?5?)r  gx&1?)r  r2  )r  r2  )r  r2  )r  r2  )r  r2  )r  r2  )r  r2  )r  r2  )r  r2  )r  r2  )r  r2  r1  )r  r2  )r  r2  )r  r2  )r  r2  )r  r2  )r  r2  )r  r2  )r  r2  )r  r2  )r  r2  )r  r2  )r  r2  )r  r2  )r  r2  )r  r2  )r  r2  )r  r2  )r  r2  )r  r2  )r  r2  )r  r2  )r  r2  )r  r2  )r  r2  )r   r2  )r  r2  )r  r2  )r  r2  )r  gS㥛?)r  g7A`?)r  gK7A?)r  gZd;O?)r	  V-?)r
   rh?)r  rF  )r  gK7A`?)r  Dl?)r  V-?)r  rI  )r  g㥛 ?)r  rA  )r  g"~?)r  rG  )r  rG  )r  gMbX?)r  g(\?)r  gn?)r  goʡ?)r  gK7A?)r  獗n?)r  rJ  )r  X9v?)r  rK  )r   r@  )r!  r@  )r"  +?r1  )r#  rL  )r$  r9  )r%  gʡE?)r&  y&1?)r'  gGz?)r(  rM  )r)  "~j?)r*  gl?)r+  rN  )r,  r<  )r-  rA  )r.  rH  )r/  g
ףp=
?r1  r1  c                     g }t          |          D ]-}|                    t          j        | ||z                        .t	          |          S r   )r  r6   rf   r  r   )r
  r  rF  rN   rq   s        r   _read_samplesrP  6  sP     CAYY ? ?

E(&&1*==>>>>#;;r   c                     || k    o| |k    S r   r    )rM   lowhighs      r   r]  r]  6  s    !8!T	!r   c           
         t          j        |           }t          |          D ]:}|}||v r
t          j        | |          }t          j        |t          d                    }|j        sIt          j        |          }t          |dz
  dd          D ]}t          j        ||          }	t          j	        t          j        |	t          d                    t          d                    s[t          j        |	t          d                    }
t          j        |	t          d                    }|
j        ret          j	        t          j        |
t          d                    t          d	                    st          j        |
t          d
                    }d}t          j
        |          r+t          j        |d          }t          j        | |          }nXt          j        |          rDt          j        |                                 t          j        |                    \  }}}|j        }|dk     r|}||v rt          j        ||           ɐ<d S )Nr_  r   r   rC  r	  rP  rO  r	  GoTorQ  r   )rf   r  r  r  r   r   r   rc  rd  rN  r6  pdf_lookup_page_numberr\  r  r   r   r   re  )r!  r  	pagecountrq   rv
  r  rg  rE  rI  ri  r  r  r  targetr  r  s                   r   r  r  6  sA   %c**I9 3 3= 	+S!44#Whx.@.@AA  	"6**taxR(( 	3 	3A#VQ//A$e&8!Xi=P=P&Q&QS[\bScScdd 'HSMM::F%q(6*:*:;;D  B(%*<fhsmm*T*TV^_eVfVfgg )68C==AAC!4(( $,dA662C@@$d++ $!&!6		UE]_cEdEd!e!e!QmQw BW} 3&222+	33 3r   c                     t          | t          j        t          j        f          sJ dt	          |           d|             | j        st          t                    d S )Nztype(cond)=z cond=)rz   rf   r   r   r   r   r   MSG_IS_NO_PDF)conds    r   r$  r$  "7  sd    dU]E,=>??YYAYDJJAYAYRVAYAYYYY? '&&&' 'r   c                  N    t          t          t          t          t                    S r   )r  r  r  r    r   r   EMPTY_IRECTr]  (7      /?OTTTr   c                  (    t                      j        S r   )
EMPTY_RECTr  r    r   r   
EMPTY_QUADra  ,7  s    <<r   c                  N    t          t          t          t          t                    S r   )r   r  r  r    r   r   r`  r`  07      /?SSSr   c                 B    t          |           st          d          d S )Nz No journalling operation started)JM_have_operationr   r!  s    r   r  r  47  s+    S!! <:;;;< <r   c                  N    t          t          t          t          t                    S r   )r  r  r  r    r   r   INFINITE_IRECTrh  97  r^  r   c                  (    t                      j        S r   )r  r  r    r   r   r  r  =7  s    ??r   c                  N    t          t          t          t          t                    S r   )r   r  r  r    r   r   r  r  A7  rc  r   c                 f    t          | t          j                  sJ t          j        |           }|S )z3
    Turn fz_buffer into a Python bytes object
    )rz   rf   r  r  )r   rN   s     r   r   r   E7  s1     gu~.....

&w
/
/CJr   c                     | dS t          | t                    sJ dt          |                       |                     dd          }d}|D ]}|t	          |          z  }|S )Nr(   ztype(c)=r  surrogateescape)rz   r   r   r  r  )ry  r  rN   bbs       r   rz  rz  N7  sy    & 	 ra,,}$q''}},,,	*++A
C  s2wwJr   c                    t          | t          t          f          r| }nt          | d          rz|                                 }t          |t
                    r|                    d          }t          |t          t          f          st          dt          |                     nt          j
                    S t          j        |          S )z
    Make fz_buffer from a PyBytes, PyByteArray or io.BytesIO object. If a text
    io.BytesIO, we convert to binary by encoding as utf8.
    rM  r  z&.getvalue() returned unexpected type: )rz   r   r3  r  rM  r   r  r   r   rf   r  rh  )r  rT  s     r   r   r   k7  s    
 &5),-- 	 		$	$    dC   	(;;w''D$	 233 	SQT$ZZQQRRR	S ~/555r   c                 N    t          |           sd S t          | |                   S r   )rn
  r+  )r   r*  s     r   JM_FLOAT_ITEMrq  }7  s'    C   tS??r   c                 |    |t          |           k     r(| |         }t          |t          t          f          rd|fS dS )Nr   rf  )r-  rz   r   r+  )r   r*  rX  s      r   r  r  7  sA    
SXX~ 3xdS%L)) 	d7N7r   c                    d}d}d}	d}
|
r|}n|}d}|}t          |          }t          j        |          }t          |          }t          j        ||          }t          j        ||          }t          j        |          }t          j        |           }|j        r>t          j	        |          t          j	        |          k    rt          j
        |          }||k    r	t          j        |          }|j        rt          j        |          }||	k    r3t          |          D ]"}t          j        ||t          j                   #nt          |          D ]"}t          j        ||t          j                   #nnt          j        |          rt          j        d          }nE|j        r>t          j	        |          t          j	        |          k    rt          j        d          }t          j        ||||          }|rt          j        |           nt          j        |d           t          j        ||          }|r:t          j        ||t          j                    t          j                               n9t          j        ||t          j                    t          j                               t          j        |           |S )zf
    Pixmap creation directly using a short-lived displaylist, so we can support
    separations.
    r   r   ry   TNr~  )r  rf   r
  r  fz_intersect_rectrf  fz_round_rectfz_document_output_intentr   r~  fz_keep_colorspacefz_page_separationsfz_count_separationsr  fz_set_separation_behaviorFZ_SEPARATION_SPOTFZ_SEPARATION_COMPOSITEfz_page_uses_overprintfz_new_separationsr  r  r  r  r
  r9  r  fz_run_page_contentsr
  )r   r   r  r  r  rg  r  
SPOTS_NONESPOTS_OVERPRINT_SIM
SPOTS_FULLFZ_ENABLE_SPOT_RENDERINGspotsr  r  r  r   rclipr   oirF  rq   r  r
  s                          r   r  r  7  s   
 JJ# #DJs##Ft$$DD!!E"4//D"400Dt$$D 
	(	-	-B	} 6 $$(=b(A(AA 	61"55J 
 /(..? 	/*400A
" ]q X XA4T1e>VWWWWX q ] ]A4T1e>[\\\\])$// 		/ +A..DD] 	/u4R88E<QR\<]<]] 	/
 +A..D

'
D$
F
FC 4c""""(d333

"63
/
/C R$U^%5%5u~7G7GHHHH"4en.>.>@P@PQQQ	#Jr   c                     | S r   r    r6  s    r   r
  r
  7  s    Hr   ri  r  c                 >    t          t          d |                     S )Nc                 L    t          |           dk    rt          | d          ndS )Ng-C6?r
   r   r  rg	  r6  s    r   r  zJM_TUPLE.<locals>.<lambda>7  !    c!ffnCuQ{{{! r   r|   r  ri  s    r   r<  r<  7      CCQGGHHHr   c                 >    t          t          d |                     S )Nc                 L    t          |           dk    rt          | d          ndS )Nre  r   r   r  r6  s    r   r  zJM_TUPLE3.<locals>.<lambda>7  r  r   r  r  s    r   	JM_TUPLE3r  7  r  r   c                     | dS t          | t                    r|                     d          } t          | t                    sJ dt	          |           d|             | S )Nr(   r  ztype(s)=z s=)rz   r   rD  r   r   r/  s    r   r   r   7  sl     r!U HHVa111$q''11Q11111Hr   c                    t          | t          j                  sJ t          j        |           }t          j        |           }t          |          }d}	 t           d| | }||vrn|dz  }t          |          }t          j        |t          |                    }t          j
        |d|           d|                                j        _        dS )z
    Add a unique /NM key to an annotation or widget.
    Append a number to 'stem' such that the result is a unique name.
    r   r   rk   r  N)rz   rf   r   r   r   rm  JM_annot_id_stemr
  pdf_new_stringr-  r>  r   r   r  )	r   stemr   r   r+  rq   stem_idresponser   s	            r   r`
  r`
  7  s    
 eU^,,,,,''D#U++I &&E	A%111a11% 		Q	
 G$$H3x==99D		4...-.DHHJJ***r   c                    t          j        | |d          }t          j        |          st          t          t
                     t          j        |t          d                    }t          j        |t          d                    dk    s&t          j        |t          d                    dk    r%t          j	        |t          d          |           dS t          t          t
                     dS )z1
    Add OC object reference to a dictionary
    r   r}  r  OCMDr  N)
rf   rF  rA  rx  MSG_BAD_OC_REFr  r   r   rE  r  )r!  r
  r   indobjr"  s        r   rX  rX  7  s     #Cq11FV$$ 2 0111vx'7'788E00A5 2x'7'788A=2 	377777 011111r   c                    t                      }d }d}d}d }t          j        | t          d                    }t          j        |          rt          j        t          j        |d                    }t          j        |          dk    rut          j        |d          }t          t          j        |                    D ]>}t          j	        t          j        ||                    }|
                    |           ?t          j        | t          d                    }	|	j        rt          j        t          j        |	t          d                              }t          j        t          j        |	t          d                              }|d	k    rd }t          j        |	t          d
                    }|j        r`t          t          j        |                    D ]>}t          j	        t          j        ||                    }|
                    |           ?t          j        | t          d                    }|j        r4t          j	        t          j        |t          d                              }t                      }
||
t          <   t          |          |
t           <   ||
t"          <   ||
d<   |
S )Nr   Borderry   r  r   BSr
  r	  r(   rQ  BEIr  )r{   rf   r   r   r6  r  rd  rc  r  r   r6   r   r@  r   r{  r|   dictkey_dashesdictkey_style)r   dash_pyr  r  r  r   dashrq   r   bs_or   s              r   rM  rM  8  sW   ffGEEF
C

i(););
<
<C3 %!5#6Q#?#?@@$$) 	%&Q//DE/6677 % %&(;T1(E(EFF$$$$y(4..99D 	%!5#5tXc]]#K#KLL!5#5tXc]]#K#KLLB; 	E $66> 	%E/5566 % %&(;S!(D(DEE$$$$

i$
8
8C
~ L!5#5sHSMM#J#JKK
&&CC '??CCCNJr   c                    t                      }t                      }t                      }t          j        | t          j                  }t          j        |          rbt          j        |          }t          |          D ]>}t          j        t          j	        ||                    }|
                    |           ?||t          <   t          j        | d          }t          j        |          rbt          j        |          }t          |          D ]>}t          j        t          j	        ||                    }|
                    |           ?||t          <   |S )Nr   )r   r{   rf   r   PDF_ENUM_NAME_Cr6  rc  r  r  rd  r6   dictkey_stroker   dictkey_fill)r   r   bcfcri  rF  rq   r&  s           r   r\  r\  48  s)   
&&C	BB9e&;<<A! ""q 	 	A#U%8A%>%>??CIIcNNNNCIt,,A! ""q 	 	A#U%8A%>%>??CIIcNNNNCJr   c                 r   t          | t                    sJ d }d}|                     t                    }|                     t                    }|                     t
                    }|                     d          }t          |          }	t          j        |t          d                     t          j        |t          d                     t          j        |t          d                     |dk     r|	                    t                    }||	                    t                    }||	                    t
                    }|dk     r|	                    d          }t          |t                    rt          |          dk    rot          |          }t          j        ||          }
|D ]}t          j        |
|           t          j        ||
t          d          t          d                     t          j        |t          j        |          t          d          t          d                     |dk    rt!          |          }nt          d          }t          j        ||t          d          t          d                     |dk    rt          j        |t          d          d	           t          j        |t          d                    }t          j        |t          d          t          d
                     t          j        |t          d          |           d S d S )Nr   r  r  r  r  rQ  r
  r	  ry   r  r  )rz   r   r   r{  r  r  rM  rf   r  r   r|   r-  r  pdf_array_push_intr  pdf_new_realJM_get_border_styler  r   r  r  )rP  r   r   r   dashlennwidthndashesnstylencloudsoborderdarrr  s               r   r  r  K8  s   fd#####
CGZZ''Fjj.))GZZ''Fzz8$$G y))G 
	8D>>222		8D>>222		8H#5#5666 z -m,, /++~.. .++}--{ *;;))7E"" MsG}}q'8 Mw--"C11 	/ 	/A$dA....YhtnnhsmmLLL	''TNNSMM	   !| !6**smm	C$#GGG{ =HTNNA>>> )Xd^^<<C#>>>Xc]]G<<<<<	= =r   c                     | dk    rdS d| cxk    rdk    sn | dk    rt          |           S d| cxk    rdk    rn ndS | d	k    rd
| z  S d| z  S )Nr  z\u005cr0     rF  i   i  z\ufffd  z\u%04xz\U%08xr  )r  s    r   make_escaper  8  s    	Rx 	y	r    S    B"H 2ww	2         y	v 2~2~r   c                 J    t          j        | t          |                     dS )zG
    APPEND non-ascii runes in unicode escape format to fz_buffer.
    N)rf   r
  r  )r$  r  s     r   rM  rM  8  s#     
4R11111r   c                     t          |          }|j        |j        |j        |j        ||||f}|                     |           |dz   t          j        t          j        j                  fS )z'
    Functions for wordlist output
    r   )	ro  r  r  r  r  r6   rf   r/  rH  )r  r$  r  rQ  rU  r  r/  rY  s           r   r  r  8  sj     	t$$AHHHH	E 
LLA:u|EL$<====r   c                    t          |           }t          j        |t          d                    }t          j        |          s#t          j        |t          d          d          }t          j        | d          }t          j        |t          d          |           |#t          j        |t          d          |           t          j        |t          d          t          d                     t          j        |t          d	          d          }|snt          j        |t          d
                    }t          |          }	t          |	          D ]^}
d}t          ||
          \  }}|dk    rt          j        | |d          }t          j        ||          rt          j        ||           _t          j        ||           dS )z1
    Add OC configuration to the PDF catalog
    r  r   r
   r  Nr  	BaseStater  r  r  r   )r  rf   r   r   r6  r  r  r=  r  r-  r  r  rF  pdf_array_containsr8  )r!  r   r  r  r  configsrQ  onarrayr  rF  rq   r   r'  inds                 r   r  r  8  s    !#
&
&C #x	':':;;Gw'' I*C)1D1DaHHC##A	"Ax'7'7>>> I&8I+>+>HHH	8K00(5//BBB&8D>>1==G 4!3(8(899GGq 	4 	4AD!"a((GAtAv (#tQ77C's33 4$gs333	'1%%%%%r   c                     t          | |          }t          j        |          }| j        j        s|S |j        |j        |j        j        z   k     r|j        |j        j        z
  |_        |S )z"
    return rect of char quad
    )JM_char_quadrf   r
  r   r  r  r  r  )r=   r  r
  r   s       r   rK  rK  8  sh     	T2A""A?  tadR]''' )tbm((Hr   c                    t          ||          }|t          j        |           t          z  z  }|t          j        |           t
          z  z  }|t          j        |           t          z  z  }|t          j        |           t          z  z  }|S r   )
detect_super_scriptrf   r  TEXT_FONT_ITALICr  TEXT_FONT_SERIFEDr  TEXT_FONT_MONOSPACEDr  TEXT_FONT_BOLD)r/  r=   r  r  s       r   JM_char_font_flagsr  8  s    b))E	U$T**-===E	U#D)),===E	U(..1EEEE	U"4((>99ELr   c                 H   t           r1t          j        t          j        | j        |j                            S t          | t          j                  sJ t          |t          j                  sJ t          j
        r|j        S | j        j        r|j        S t          j        t          j        |j        j                            }t!          |          }t#          |          }|j        j        }||z
  t&          z   }|dk    r.t          j        dk    rt          j        |j        j                  S |j        j        }t          j        |          }|j        |j        z
  }|dk     rd}d}d}t          j        s|dk     r
||z  }||z  }||z
  }||z  |z  }||z  |z  }| j        j        j        }	| j        j        j        }
t          j        |	|
 |
|	dd          }t          j        |	|
|
 |	dd          }|	dk    rd|_        d|_        t          j        dddd|j        j        j         |j        j        j                   }t          j        dddd|j        j        j        |j        j        j                  }t          j        t          j        |j        j                  |          }t          j        ||          }|	dk    rA|j        j        dk    r1||j        _        ||j         _        ||j!        _        ||j"        _        n4| |j        _        | |j         _        | |j!        _        | |j"        _        |j!        j        dk     rd|j!        _        d|j        _        |j"        j        |j!        j        z
  }|t&          k     rst          j#        ||j        j$                  }|rRt          j%        ||| j        j                  }|j!        j        ||z  z   |j"        _        |j"        j        |j         _        t          j        ||          }t          j        ||          }|S )zI
    re-compute char quad if ascender/descender values make no sense
    r   r   re  皙?r\  r   )&r   rf   r  r   r  r   rz   FzStextLineFzStextCharr
  r[   r  r  FzFontll_fz_keep_fontr/  JM_font_ascenderJM_font_descenderr  FLT_EPSILONrY   r  r  r  r?  r  r  r  r  r.  fz_transform_quadr}  r  r  r  rh  ry  ri  )r=   r  r/  ascdscr  asc_dscr   fwidthry  r/  trm1trm2xlate1xlate2r  cwidthrl  s                     r   r  r  8  s     Q |E.OOPPPdE-.....b%+,,,,,% w w<-bm.@AABBD
4
 
 C
D
!
!CMECi+%G!| 049 0|BM.///
 MEd##DWtwF
Tz # w{ GmGmCiG
+
C
+
C
 	AAA2q!Q22D1qb!Q22D	R !!Q1r}/C/E.EH\H^G^__F!!Q1bm.B.DbmFZF\]]F"5<0B#C#CVLLD"4..D 	Av 	$')a- 						D	D	D	D	
 wy1} 		WY"F ")4AA 	"+T5$/:OPPF	FUN2DGI	DGI"4..D"400DKr   c           
        	 t          j        | j                  	t          dk    rt          j        | d          }n	fd} || d          }t          |          }|dk    rdS t          j        	t          d                    }g }t          |          D ]}t          j	        t          j
        ||                    }|dk    rt          j        t          j
        t          j
        ||          d                    t          j        t          j
        t          j
        ||          d                    f}|                    |           t          j        t          j
        ||                    }|                    |           |S )z8
    return list of choices for list or combo boxes
    r  r   c           
         t          j        t          j        | j                  t	          d                    }t          j        |          }g }|s|S t          j        t	          d                    }t          |          D ]}t          j        t          j        ||                    }|dk    rt          j	        t          j        t          j        ||          d                    t          j	        t          j        t          j        ||          d                    f}|
                    |           t          t          j	        t          j        ||                              }|
                    |           |S )NOptry   r   r   )rf   r  r   r   r   rc  r   r  rd  r   r6   r   )	r   	exportvaloptarrrF  r  rq   rH  r   r   s	           r   pdf_choice_widget_optionsz4JM_choice_options.<locals>.pdf_choice_widget_optionsA9  sY   3U5H5T5TV^_dVeVeffF#F++AD '	8E??CCF1XX 
% 
%'(;FA(F(FGG6 %!4U5HI\]cefIgIgij5k5kll!4U5HI\]cefIgIgij5k5kllC KK$$$$+E,DUEXY_abEcEc,d,deeCKK$$$$Kr   Nr  ry   r   )rf   r   r   r~   pdf_choice_widget_options2r-  r   r   r  rc  rd  r   r6   )
r   r  r  rF  r  r  rq   rH  r   r   s
            @r   JM_choice_optionsr  59  s    #UZ00Ig% 4/::
	 	 	 	 	, )(%33T

AAv HUOO<<FEAYY 
 
!4fa!@!@AA6 	,e.A5CVX^`aCbCbde.f.fgg,e.A5CVX^`aCbCbde.f.fggC LL#*E,?,K,KLLCLL#Lr   c                    t          j        |t          j        |                     }|j        |j        z
  }|j        |j        z
  }|dk    s|dk    rdS |                                 }||j        |                                 z
  z  | 	                                |j        | 
                                z
  z  z   }t          j        |                                           dk    rd|z
  }	 |}t          d|          D ]}t          j        | |d           |dz  }t          j        | |d           |dz  }t          j        | |d           |dz  }t          j        | ||           |dz  }|                                 rt          j        | |d           |dz  }||z  }|dk    rn|dz  }dS 	 |}t          |          D ]}t          | 	                                dz
            D ]}	t          j        | ||           |dz  }|                                 rt          j        | |d           |dz  }tt          j        | ||           |dz  }||z  }|dk    rn|dz  }dS )zO
    Clear a pixmap rectangle - my version also supports non-alpha pixmaps
    r   r  r~  r   )rf   fz_intersect_irectr  r  r  r  r  r  r  rF  r  r~  r  r  r  r  )
r  r   r  r   r  destspandestpr/  r  rx  s
             r   r  r  m9  s    	 E$8$>$>??A	qtA	qtAAv a q{{}}Htvvxx(46688qtdffhh+GGE T__..//14 e	A1a[[  $T1a000Q$T1a000Q$T1a000Q$T1e444Q::<< (q#666FAXEAv FA#	$ qq 		 		A46688A:&&  $T1e444Qzz|| $T1c222Q$T1e444Q6 		Q  1r   c                 b   t          | t          t          f          r| d         } t          | t          t          f          sdg fS t          |           dvrdg fS | d d          }t          t          |                    D ]}||         dk     s||         dk    rd||<    t          |          |fS )Nr   r   )r   r   r   r  r   )rz   r   r+  r{   r|   r-  r  )r  rN   rq   s      r   r  r  9  s    %#u&& autUm,, 2v
5zz% 2v
(C3s88__  q6A: 	Q! 	CFs88S=r   c                 H   t                      }d}t          j        |           }t          j        |t          j        t          |                              }|                                 }|j        |j        z
  }|j	        |j
        z
  }|                                 }||z  }	||j
        |                                 z
  z  |j        |                                 z
  |z  z   }
t          | |
|          }d}t          j        |          r|S t!          |          D ]c}t!          d|	|          D ]J}t          | |
|z   |          }||k    r)|}|                    |d           }|||z  }|||<   d}|}E|dz  }K|
|z  }
d|}|                    |          }|||z  }|||<   |S r  )r   rf   r  r  ru  r  r  r  r  r  r  rF  r  r  rP  fz_is_empty_irectr  r   )r  r  rh   r  r  r  r  r  rF  	substrider/  oldpixrq   rI  newpixr  ry  s                    r   r  r  9  s   	B
C "%%E$UE,?PT@U@U,V,VWWEYY[[FHuxEX F
A	I%(RTTVV#$24466(9Q'>>AB1%%F
Cu%% 	F^^  9a(( 	 	A"BAq11F 	FFE4(( 1HC E
q	VE
A qBJIr   c                     t          j        | t           j                  \  }}|r|dk    rdS t          j        t          j        ||                    }t          j        ||           |S )z*
    compress char* into a new buffer
    r   N)rf    fz_new_deflated_data_from_bufferFZ_DEFLATE_BESTr  fz_new_buffer_from_datafz_resize_buffer)inbufferrT  compressed_lengthr  s       r   JM_compress_bufferr  9  sw     $D! D

  $) t
.6t=NOO
P
PC	3 1222Jr   c                    d}t          j                    }| D ]}|j        j        t          j        k    r|D ]t}d}|D ]i}t          ||          }t          ||          rGd}|r|                    d           d}|                    t          |j        j
                             j|rd}u|                                }	|	S )Nr   r   r  )r4  StringIOr   r   rf   rI  rK  rL  rQ  r  ry  rM  )
r   r  need_new_liners  rS  r=   line_had_textr  r   r/  s
             r   r  r  9  s    M[]]F " " E$== 	 	" 	"DM ? ? r**#D!,, ?$%M$ *T***()LLR]_!=!=>>> " !	" 	AHr   c                    t          j                    }d}|}|}||k    rd}|}|}t          |          }|}		 t          |	||          snt          j        | |	          }
t          j        |
          }t          j        ||          \  }}}t          j        |
|t          j                    t          j	                               t          j
        |           d}t          j        |||||          }t          j        |d|           |	|z  }	t          j                    }d|_        d|_        d|_        d|_        d|_        d|_        d|_        d|_        d|_        d|_        d|_        t          j        d          }t          j        |          }t          j        |||           |                                 t          j        |          }t=          |t>                    sJ |S )zx
    Convert any MuPDF document to a PDF
    Returns bytes object containing the PDF, created via 'write' function.
    r   r   Nr  r   i    ) rf   r   rk  r]  rR  r
  pdf_page_writer
  r9  r  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r0  r  rz   r   )r   rL  r  r   r  incrr/  r'  r  rq   r   r  r
  r(  r  r  r  r   r1  ry  s                       r   r  r  :  s   
   FD
A
A	Bw 
6
"
"C
A1a   	!#q))&t,,#(#7#I#I Y$U^%5%5u~7G7GHHHc"""%fhYQQfb(333	T	  ""DDODDDDDDMDDNDMDN

d
#
#C
.

C	VS$///$S))AaHr   c           
         t          j        t          j        t          j        |           d                    }t          j        |t           j                  }t          j        |          }	 t          | ||           t          j        |t          d          |           |t           j
        k    ru|t          t          z  z  }t          j        t          j        |           t          j        |          t          d          t          d          t          d                     t          j        t          j        |           d          }|j        sft          j        | d          }t          j        t          j        |           |t          d          t          d          t          d                     t          j        ||           n# t$          $ r t&          rt)                       t          j        ||           |t           j
        k    rct          j        t          j        |           t          j        |          t          d          t          d          t          d                      w xY w|S )	NzRoot/AcroForm/SigFlagsr  r	  r
  r  zRoot/AcroForm/Fieldsr   Fields)rf   r   rt  r  pdf_create_annot_rawr  r   JM_set_field_typer=  r   PDF_WIDGET_TYPE_SIGNATURESigFlag_SignaturesExistSigFlag_AppendOnlyr  
pdf_new_ntr   r  r8  r   r   rF   rb  r  )	r   r   r   	fieldnameold_sigflagsr   r   r  r{  s	            r   r
  r
  7:  s?   #E$78I#8N8NPh$i$ijjL
 &tU-CDDE#E**I&#y$///&y(3--KKK522 	#'>AS'STH%c**$X..V$$Z((Z((   "5#4S#9#9;QRR 	&sA..D%c**V$$Z((X&&   	T9----   4N$4$4$4tU+++522 	%c**%l33V$$Z((Z((   	 Ls   .E"G B)I:c                 n   t           rt          j        |           S t          |           }t	          j        t	          j        | t          d                              }t	          j        |          st	          j	        |          r|}|j
        |j
        z
  }|j
        |j        z
  }||_        ||_
        |S )z%
    return a PDF page's CropBox
    r  )r   r   r  rO  rf   r  r  r   rl  rk  r  r  )r  r  r  r  r  s        r   r  r  i:  s      *)))8$$H.x)9L9LMM G  )) U-CG-L-L 	wz	!B	wz	!BGJGJNr   c                     t          |           }t          |j        |j        z
            }t          |j        |j        z
            }t          j        ||          }|S r   )r  r  r  r  r  r  rf   fz_make_point)r  r   r   r  r  s        r   JM_cropbox_sizer  }:  sR    hDDGdgADGdgAq!$$DKr   c                 H    t          |           }t          j        |          S )z&
    just the inverse of rotation
    )re  rf   rp
  )r   mps     r   r  r  :  s"     
t	$	$B!"%%%r   c                    d}t          j        | d          }t          j        |t          d          d           t          j        |t          d          d          }t          j        |t          d          |           t          j        |t          d          |           t          j        |t          d          |           t          j        |t          d	          t          d
                     d}	t          j        | t          j        |	          t          j                    d          }
t          j        |t          d          |
           t          | |
||           t          j
        |          \  }}t          j        |
t          d          |           t          j        |
t          d          |           t          j        |
t          d          d          }t          j        |t          d          |           |S )zE
    embed a new file in a PDF (not only /EmbeddedFiles entries)
    r   r   r>  r  rn  ro  rq  rr  r}  Filespecs     r  rs  rt  ru  )rf   r  r  r   r=  r  r  rh  r  r   r  r  )r!  r  r3   r  r  rI  rE  r   efbsr  r  rl  s                r   r7  r7  :  s    D

S!
$
$C	C$333		 htnna	8	8B	"3x@@@	"3	BBB	"3(8(8$???	sHV,,hz.B.BCCC	B044LNN	 	A 
r8C==!,,,S!S(+++%c**GD!	1htnnd333	1hx00$777$Q(:(:A>>F	68F#3#3T:::Jr   c                    t          j        t          j        |           t          d                    }t          j        |t          d                    }|j        r:t          j        |          dk    r"t          j        |t          d                     t          j        |t          d          t          d          t          d                    }|j        r%t          j        |t          d          d           dS dS )	z
    perform some cleaning if we have /EmbeddedFiles:
    (1) remove any /Limits if /Names exists
    (2) remove any empty /Collection
    (3) set /PageMode/UseAttachments
    r	  
Collectionr   r(  r)  r  r3  N)	rf   r   r  r   r   rB  r  r   r  )r!  r  collefiless       r   r  r  :  s     u0#668H8HIID dH\$:$:;;D 95-d33q8 94,!7!7888 W_%%W	 F  Nhz&:&:<LMMMMMN Nr   c                 b    | j         sdS t          j        |           }t          |d          }|S )Nr(   r  errors)r   rf   r  r  )r$  r/  r   s      r   ro  ro  :  s8    ? r$T**A
*1Y
?
?
?CJr   c           	         t          j        t          j        |           t          d                    }|j        st          j        d          }d}|D ]}|t          |          z  }t          j        t          j        |           t          d          d          }t          j        |t          j	        |t          |                               t          j        |t          j	        |t          |                               dS dS )z!
    Store ID in PDF trailer
    r  r/  r(   ry   N)rf   r   r  r   r   
fz_memrnd2r  r  r8  r  r-  )r!  r  rnd0rndrq   s        r   r  r  :  s     
e/44htnn
E
EC> 	I##  	 	A3q66MCC&(93(?(?$QRSSc5#7c#hh#G#GHHHc5#7c#hh#G#GHHHHH	I 	Ir   c                    t          j        t          j        t          j        |           t          d                    t          d                    }|j        r|S t          j        t          j        |           t          d                    }t          j        |t          d          d          }t          j        |t          d          d           t          j        |t          d          d          }t          j        |t          d          d           t          j        |t          d	          d           t          j        |t          d
          d           t          j        |t          d          d           |S )z7
    Ensure OCProperties, return /OCProperties key
    r	  r  ry   r  r   rQ  r
   r  r  r  RBGroups)rf   r   r  r   r   r  r  )r!  r  r  rQ  s       r   r  r  :  s=    
U/0A#0F0FQWHXHXYY[cdr[s[s
t
tC
~ 
e/44hv6F6FGGD

!$(@(@!
D
DC	S(6"2"2A666Xc]]A66A	Q222	Q333	Q 1 11555	Q 4 4a888Jr   c                 ~   | sdS |                      d          rdS |                      d          rdS |                      d          rdS |                      d          rdS |                      d          rd	S |                      d
          rd	S |                      d          rdS |                      d          rdS dS )z'
    Make /DA string of annotation
    r	  Cor	  coTir	  tiSySymbr	  Zar	  zar   r  s    r   JM_expand_fnamer/  :  s     !66t-vvt-vvt-vvt-vvt-vvt-vvt-vvt-vv6r   c                    | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS dS )	z!
    String from widget type
    ButtonCheckBoxRadioButtonTextListBoxComboBox	SignaturerY  )rf   r
  r
  r	  PDF_WIDGET_TYPE_TEXTPDF_WIDGET_TYPE_LISTBOXPDF_WIDGET_TYPE_COMBOBOXr  )wtypes    r   JM_field_type_textr<  ;  s     ,, x.. z11 }** v-- y.. z// {9r   c                    t          | t          j                  sJ t          j        |t          j        |                     }|j        |j        z
  }|j        |j        z
  }|dk    s|dk    rdS | 	                                }||j        | 
                                z
  z  |                                 |j        |                                 z
  z  z   }	 |}t          |          D ]G}t          |                                           D ]#}	t          j        | |||	                    |dz  }$H||z  }|dz  }|dk    rnkdS r  )rz   rf   r  r  r  r  r  r  r  r  r  rF  r  r  r  )
r  r&  r  r   r  r  r  r/  r  rq   s
             r   rG  rG  ;  sI   dEN+++++ E$8$$?$?@@A	qtA	qtAAv a q{{}}Htvvxx(46688qtdffhh+GGE	q 	 	ADFFHH%%  $T1c!f555Q 		Q6 		 1r   c                    t          | t          j                  sJ d}t          j        |           }d}t          j        |           }t          j        |          }	 t          |t          j                  sJ |j        sn]t          j        |          }t          j        |d          }|j        rt          j        ||          sd}nt          j	        |          }|r|S dS )z
    Return the first annotation whose /IRT key ("In Response To") points to
    annot. Used to remove the response chain of a given annotation.
    Nr   r   r  )
rz   rf   r   r   r   r  r   r   rE  r  )r   rf  r   rh  r   irt_annot_objri  s          r   ra  ra  0;  s    
 eU^,,,,,I#E**IE&&D%d++I
4)U^44444# 	+I66u55< 	#Ay11 (33	
4   r   c                 ~    t          | t          j                  sJ t          j        rdS t          j        |           S )3
    need own versions of ascender / descender
    r  )rz   rf   r  r
  r[   r  )r/  s    r   r  r  K;  s=     dEL)))))% s!$'''r   c                     t          | t          j                  sJ t          j        rdS t          j        |           }|S )rA  gɿ)rz   rf   r  r
  r[   r  )r/  rN   s     r   r  r  U;  sA     dEL)))))% t

!$
'
'CJr   c                 d    | dk    s| dk    rdS |sdS t          |           }|D ]}||k    r dS dS )z7Check if ch is an extra word delimiting character.
    r0  r  TFr  )r  r  r  r  s       r   r  r  `;  sd     
Rx 29 t ur77D  9 	44	5r   c                     t          | t          j                  sJ t          j        |           }|                    d          }t
          j        s|dk    s|dk    r|S ||dz   d          S )N+r   r   r   )rz   rf   r  r	  ri   r
  rZ   )r/  r   r/  s      r   JM_font_namerF  n;  sq    dEL)))))d##D		#A  AG qAv A<r   c           	      &   d}t          j        |          }t          |          D ]}t          j        ||          }t          j        ||          }t          j        |          s@t          j        dt          j        |           dt          j        |           d           t          j	        |t           j
                  }	t          j	        |t           j                  }
|
j        rt          j        |
          r t          j	        |t           j                  }n|
}t          j	        |t           j                  }t          j        |          rt          j	        |t           j                  }t          j        |          }d}|rt#          | |          }||t          j        |	          t%          t          j        |                    t          j        |          t          j        |          |f}|                    |           |S )Nr   r   z' is no font dict ( 0 R)rM  )rf   rB  r  rD  rC  rA  fz_warnr@  r   r   PDF_ENUM_NAME_SubtypePDF_ENUM_NAME_BaseFontr   rO  PDF_ENUM_NAME_NamePDF_ENUM_NAME_EncodingPDF_ENUM_NAME_BaseEncodingrP  rz  r6   )r!  dict_fontliststream_xrefrh   rF  rq   refnamer4  rU  rV  r   r  r   r^  r,  s                   r   JM_gather_fontsrS  w;  s   	
B5!!A1XX  (22)%33 ** 	Mou099ooeN^_gNhNhoooppp$Xu/JKK%h0LMM" 	e&7&A&A 	%h0HIIDDD%h0LMMX&& 	V)(E4TUUH)) 	2&sD11C!'**#E$5d$;$;<<!'**!(++ 	Ir   rO  rQ  c           	      >   t          | t          j                  sJ d}t          j        |          }t	          |          D ]}t          j        ||          }t          j        ||          }t          j        |          s@t          j        dt          j	        |           dt          j
        |           d           t          j        |t          d                    }	t          j        |	t          d                    st          j        |t          d                    }
t          j        |t          d                    }|j        rt          j        |          }nt          j                    }|
j        r(t          j        t          j        |
          |          }n#t          j        t          j        j                  }t          j
        |          }|t          j	        |          |t+          |          f}|                    |           |S )	z6
    Store info of a /Form xobject in Python list
    r   r   z' is no form dict (rH  rC  Formr   r<  )rz   rf   r   rB  r  rD  rC  rA  rI  r@  r   r   r   rN  r   pdf_to_matrixr9  rf  r  r/  r0  r.  r6   )r   rO  	imagelistrQ  rh   rF  rq   rR  	imagedictr"  ri  rH  r=  r   r   r,  s                   r   JM_gather_formsrY  ;  s    c5,-----	
B5!!A1XX    (%33*5!44	 ++ 	Mpu099ppeN^_hNiNipppqqq"9hy.A.ABB (8(899 	y(6*:*:;;y(8*<*<==< 	#%a((CC.""C< 	=*E,=a,@,@#FFDD< ;<<D	** !7++%%	 	Ir   r   c                    d}t          j        |          }t          |          D ]}t          j        ||          }t          j        ||          }t          j        |          s@t          j        dt          j        |           dt          j        |           d           t          j	        |t          d                    }	t          j        |	t          d                    st          j        |          }
d}t          j        |t          d          t          d	                    }|j        rt          j        |          }t          j        |t          d
          t          d                    }t          j        |          rt          j        |d          }t          j        d          }t          j        |t          d          t          d                    }t          j        |          r|}t          j        |d          }t          j        |t          d                    s"t          j        |t          d                    r>t          j        |d          }t          j        |          rt          j        |d          }t          j        |t          d          t          d                    }t          j        |t          d          t          d                    }t          j        |t          d          t          d                    }|
|t          j        |          t          j        |          t          j        |          t%          t          j        |                    t%          t          j        |                    t%          t          j        |                    t%          t          j        |                    |f
}|                    |           |S )z/
    Store info of an image in Python list
    r   r   z' is no image dict (rH  rC  r[  r   r\  r]  Filterro  
ColorSpaceCSDeviceN
Separationry   r
  r
  r
  r  BitsPerComponentBPC)rf   rB  r  rD  rC  rA  rI  r@  r   r   r   rN  ra  r   r6  rd  r  r   rz  r6   )r   rO  rW  rQ  rh   rF  rq   rR  rX  r"  r   genr  rY  altcsr  csesr  r  ry  r,  s                        r   JM_gather_imagesre  ;  s^    
BE""A1XX 0  0 (22*5!44	 ++ 	Mpe/88ppeN^_hNiNipppqqq"9hy.A.ABB (9(9:: 		**#Ix/@/@(6BRBRSS 	*"5))C%i(1C1CXc]]SSg&& 	6)'155GQ H\,B,BHTNNSSb!! 	:D$T1--B!"hy&9&9:: :(Xl-C-CDD: +D!44%e,, :!/q99E#Ix/@/@(3--PP$Y0B0BHSMMRR!)X6H-I-I8TY??[[  '' (( %%#E$5b$9$9::#E$5e$<$<==#E$5g$>$>??#E$5g$>$>?? 	Ir   c                 (   t          | t          j                  sJ d}t          j        |           }	 |j        snB|t          j        t          j        |                    k    rd}nt          j        |          }J|st          d|z            |S )z$
    retrieve annot by its xref
    r   r   z$xref %d is not an annot of this page)	rz   rf   r   r  r   r   r   r  r   )r   r   rh  r   s       r   r  r  ;  s     dEM*****E!$''E- 	5#E$7$>$>??? 	E$e,,-  G>EFFFLr   c                 `   t          | t          j                  sJ |sdS d}t          j        |           }	 |j        snZt          j        t          j        t          j        |          d                    \  }}||k    rd}nt          j        |          }b|st          d|z            |S )z*
    retrieve annot by name (/NM key)
    Nr   r   r  z!'%s' is not an annot of this page)
rz   rf   r   r  r   pdf_to_stringr   r   r  r   )r   r   rh  r   r  rE  s         r   r  r  <  s     dEM***** E!$''E, 	,U-@ATUZA[A[]a-b-bcc$8 	E$U++,  D;dBCCCLr   c                 v   g }t          j        |                                 t           j                  }|j        s|S t          t          j        |                    D ]Z}t          j        ||          }t          j        |d          }|j        r'|	                    t          j
        |                     [|S )Nr  )rf   r   r   PDF_ENUM_NAME_Annotsr   r  rc  rd  r   r6   r   )r   r+  rg  rq   r   r   s         r   rm  rm  *<  s    EU-GHHF E'//00  '22	"9d33? 	LL(..   Lr   c                 f   t           rt          j        |           }|S g }t          j        | t          d                    }t          j        |          }t          |          D ]}t          j        ||          }t          j	        |          }t          j        |t          d                    }|j
        sUt          j        t          j        |                    }|t          j        k    rt          j        |d          }	|                    ||t          j        |	          f           |S )zK
    return the xrefs and /NM ids of a page's annots, links and fields
    r_  rC  r  )r   r   r  rf   r   r   rc  r  rd  r   r   rG  r@  PDF_ANNOT_UNKNOWNr   r6   r   )
r  r+  rg  rF  rq   r   r   rU  r"  r  s
             r   r  r  8<  s     ,h77E8H+=+=>>FV$$AAYY 
E 
E'33	++$i)1D1DEE! 	0%2CW2M2MNNE++ 	!9d33tUE$<c$B$BCDDDDLr   c                     |                                  } | j        st                      S t          |                                           S r   )r]
  r   r{   r  r   r   s    r   rq  rq  Q<  s:    >>D? vv!488::...r   c                 N   t           j        }| |S | }|                    d          s|                    d          rt           j        }n|                    d          s|                    d          rt           j        }n|                    d          s|                    d          rt           j        }nm|                    d          s|                    d	          rt           j        }n6|                    d
          s|                    d          rt           j        }|S )z7
    return pdf_obj "border style" from Python str
    Nr  r  r  rQ  rq   r  r  Ur/  r	  )rf   PDF_ENUM_NAME_Sr   PDF_ENUM_NAME_BPDF_ENUM_NAME_DPDF_ENUM_NAME_IPDF_ENUM_NAME_U)r  r   r/  s      r   r  r  X<  s    
C 
A	
c		 Pall3// P%:OCC	
c		 Pall3// P%:OCC	
c		 Pall3// P%:OCC	
c		 Pall3// P%:OCC	
c		Oall3//O%:OCJr   c
                 t  	 	fd}
d}d}|r"t          j        d||d          } |
|          S |r1t          |          }t          j        d||d          } |
|          S |dk    rt          j        |          } |
|          S | rGt          j        |           }|j        r |
|          S t          j        | ||          } |
|          S t          j        ||          \  }}}d}|rt          j	        d|||d          }|j        r |
|          S t          j
        |||||          } |
|          S )z6
    return a fz_font from a number of parameters
    c                     | j         st          t                    | j         j        j        st          j        |            | S r   )r   r   MSG_FONT_FAILEDr  r  rf   fz_set_font_embedding)r/  r  s    r   fertigzJM_get_font.<locals>.fertigw<  sC     	0///$0 	5'e444r   r   Nr   )rf   fz_new_font_from_filer   rg  fz_new_cjk_fontfz_new_base14_fontr   fz_new_builtin_fontfz_lookup_noto_fontrd  fz_load_fallback_font)r   r  r  r  r  r_  r  r  r  r  ry  r2  r/  r   rT  r  s            `      r   r  r  h<  s        ED *D(E1EEvd||  ,,,dCBBvd||"} $X..vd||  '11? 	 6$<<(7IFFvd|| 164@@D$D J,dD$qII vd||&hSSD6$<<r   c                 z   |dk     rdS t          j        | |          }t          j        |t          d                    }|j        rJt          j        t          j        |d                    }t          j        |t          d                    }n"t          j        |t          d                    }|j        st          d           dS |}d}t          j        |t          d                    }|j        r|}t          j        |t          d                    }|j        r|}t          j        |t          d	                    }|j        r|}t          j        |t          d
                    }|j        r%t          j        |          st          d           dS t          j	        |t          d                    rnUt          j	        |t          d                    rn2t          j	        |t          d                    rnt          d           |st          d           dS t          j
        |          S )z@
    Return the contents of a font file, identified by xref
    r   NDescendantFontsr   FontDescriptorz%invalid font - FontDescriptor missingFontFile	FontFile2	FontFile3rC  invalid font descriptor subtypeType1CCIDFontType0COpenTypez6warning: unhandled font type {pdf_to_name(ctx, obj)!r}zwarning: unhandled font type)rf   rS  r   r   r   rs  rd  rB   rx  rN  r   )r   r   ri  desftr   r  s         r   rf  rf  <  s0    ax c4((Aq(+<"="=>>E @()<UA)F)FGG h/?&@&@AA H-=$>$>??> 8999AF

Q 4 4
5
5C
~ 

Q 5 5
6
6C
~ 

Q 5 5
6
6C
~ N hy&9&9::> 	%"3C"8"8 	5666FS(8"4"455 	NsH_$=$=>> 	NsHZ$8$899 	NLMMM ./// (((r   c                    t          j        | t          d          t          d                    }|j        sdS t          j        |          }|dk     rdS g }t          |          D ]k}t          j        ||          }t          j        ||          }t          j        |          }t          j	        |          }|
                    ||f           l|S )z
    Return the items of Resources/Properties (used for Marked Content)
    Argument may be e.g. a page object or a Form XObject
    r   
Propertiesr    r   )rf   r   r   r   rB  r  rD  rC  r@  r   r6   )	r
  
propertiesrF  rh   rq   r  r   ry  r   s	            r   r
  r
  <  s    
 $S(;*?*?,AWAWXXJ  !rz**q5 	2q 	! 	!A(Q77C(Q77C!#&&A#C((DIIq$i    Ir   c                    d}t          j        |           }|j        rJt          j        |          }|t          j        |          k    rd}nt          j        |          }|j        J|st          d| d          t          |          S )z%
    retrieve widget by its xref
    FTzxref z is not a widget of this page)rf   r  r   r   r   r  r   r   )r   r   rh  r   r   s        r   rL  rL  <  s     E"D))E

 .'//	5#Y/// 	E%u-- 
 .  FDDDDEEE%==r   c                    t          j        | j                  }t          j        | j                  }|                                }| }fd}d }t          j        |j                  }|_        |t           j        k    r/t          j        ||          r |dd           n |dd           n |dd            |dt          t          j
        |                                |dt          t          |                               t          j        |          }	 |d	|	           t          j        |t          d
                    }
|
j        r!t          j        |
          } |d|           d}|t           j        k    rt          j        |t          d                    }
|
j        r |dt          j        |
                     t          j        |t          d                    }
|
j        rt          j        |
          }|st          j        |          } |dt          |                      |dt          j        |                     t          j        t          j        |t          d          t          d                              }|dk    rd} |d|           t          j        |t          d          t          d                    }
t          j        |
          rct          j        |
          }dg|z  }t5          |          D ],}t          j        t          j        |
|                    ||<   - |d|            |dt          j        |j                              |dt          j        |j                             t          j        |t          d          t          d                    }
t          j        |
          rct          j        |
          }dg|z  }t5          |          D ],}t          j        t          j        |
|                    ||<   - |d|           t          j        |t          d          t          d                    }
t          j        |
          rct          j        |
          }dg|z  }t5          |          D ],}t          j        t          j        |
|                    ||<   - |d|            |dt?          |                      t          j        t          j         |t          d                               } |d!t          |                     t          j        |t          d          t          d"                    }
|
j        r, |d#t          t          j        |
                                |d$t          j!        |                     "                                 t          j        |t          d%                    }tG          |          } |d&|            |d'tG          t          j        |t          d(          t          d)                                          |d*tG          t          j        |t          d(          t          d+                                          |d,tG          t          j        |t          d(          t          d-                                          |d.tG          t          j        |t          d(          t          d/                                          |d0tG          t          j        |t          d(          t          j$        d1                                          |d2tG          t          j        |t          d(          t          j$        d3                                         dS )4z
    Populate a Python Widget object with the values from a PDF form field.
    Called by "Page.first_widget" and "Widget.next".
    c                 *    t          | |           d S r   r  )r  r   r  s     r   SETATTRz)JM_get_widget_properties.<locals>.SETATTR=  s    U#####r   c                 (    t          | ||           d S r   r  )modr  r   s      r   SETATTR_DROPz.JM_get_widget_properties.<locals>.SETATTR_DROP=  s     	S%     r   r	  TFNr	  r	  r	  TUr	  r`  r	  r	  r	  r	  r  r
  r   r   r	  rQ  r	  r	  r	  MKBGr  BCr{  r	  r
  r	  r   r	  r	  rP  r  r	  AAKr	  ro  r	  Vr	  r  r	  Blr	  Fo)%rf   r   r   r   r   pdf_widget_typer	  r  pdf_signature_is_signedr   pdf_field_border_styler<  pdf_load_field_namer   r   r   r   r	  r   r@  pdf_field_valuepdf_field_displayr  r   r6  rc  r  r   rd  pdf_text_widget_max_lenpdf_text_widget_formatr  r  pdf_field_flagsr   JM_get_scriptr  )r   r  r   r   r!  twr  r  r	  r	  r   rG  fvaluer	  rF  r  rq   r&  rW  r/  sss    `                   r   JM_get_widget_propertiesr  =  s    #EJ//I
++D
((**C	B$ $ $ $ $! ! ! &rw//J"FU44 #(i88 	'GK&&&&GK&&&&T"""L):5;WXa;b;b)c)cdddL,.?@RS]@^@^._._```*955JLz222

Y
7
7C
~ 3(--V]E222FU66 , )Xh-?-?@@> 	FLe.>.D.DEEE HTNN;;> 	,&s++F 2&y11L(9&(A(ABBBL%*A)*L*LMMM$U%8HTNNT\]`TaTa%b%bccLq L666

i$#
G
GC# 1$$C!Gq 	A 	AA#E$7Q$?$?@@AaDDV_a000L(Ebg(N(NOOOL(DRW(M(MNNN

i$$
H
HC# 0$$cAgq 	D 	DA&u':3'B'BCCCFFV\3///

i$$
H
HC# 2$$cAgq 	D 	DA&u':3'B'BCCCFFV^S111L*;E*B*BCCC		!%"@HUYNN"["[	\	\BL%6r%:%:;;;

i$$
H
HC
~ aV-/@AYZ]A^A^/_/_```L(=i(H(HIII  	9hsmm44A	q		BL2&&&L%-i$RUWWXX   L%-i$RUWWXX   L%-i$RUWWXX   L%-i$RUWWXX   L%-i$I[\`IaIabbcc   L%-i$I[\`IaIabbcc    r   c                 6   |dk     rdS t          j        | |          }t          j        |t          d                    }|j        rJt          j        t          j        |d                    }t          j        |t          d                    }n"t          j        |t          d                    }|j        sdS |}t          j        |t          d                    }|j        rdS t          j        |t          d                    }|j        rd	S t          j        |t          d
                    }|j        rt          j        |t          d                    }|j        r%t          j        |          st          d           dS t          j	        |t          d                    rdS t          j	        |t          d                    rdS t          j	        |t          d                    rdS t          dt          j
        |                     dS )zF
    Return the file extension of a font file, identified by xref
    r   rM  r  r   r  r  pfar  ttfr  rC  r  r  cffr  cidr  otfzunhandled font type '%s')rf   rS  r   r   r   rs  rd  rx  rB   rN  r@  )r   r   ri  r  r   s        r   rP  rP  =  s    ax uc4((Aq(+<"="=>>E @()<UA)F)FGG h/?&@&@AA H-=$>$>??> uA

Q 4 4
5
5C
~ u

Q 5 5
6
6C
~ u

Q 5 5
6
6C
~ H hy&9&9::> 	%"3C"8"8 	56665S(8"4"455 	H5sH_$=$=>> 	H5sHZ$8$899 	H5.0A#0F0FGGG5r   c                    t                      }t          j        |           rht          j        |           }t	          |          D ]D}t          j        | |          }t          j        |          }||vr|                    |           E|S )z
    Get OCG arrays from OC configuration
    Returns dict {"basestate":name, "on":list, "off":list, "rbg":list, "locked":list}
    )r{   rf   r6  rc  r  rd  r   r6   )r  list_rF  rq   r   r   s         r   JM_get_ocg_arrays_impr  =  s    
 FFE3 #%%q 	# 	#A%sA..C#S))D5  #T"""Lr   c                 J   t                      }t          j        | t          d                    }t	          |          }|r||d<   t          j        | t          d                    }t	          |          }|r||d<   t          j        | t          d                    }t	          |          }|r||d<   t                      }t          j        | t          d                    }t          j        |          r_t          j        |          }t          |          D ];}t          j	        ||          }t	          |          }|
                    |           <|r||d<   t          j        | t          d	                    }|j        rt          j        |          }||d
<   |S )Nr  r  r  r  LockedrI  r$  r  r  r  )r   rf   r   r   r  r{   r6  rc  r  rd  r6   r   r@  )	confrh   r  r  rF  rq   r   list1r   s	            r   r  r  =  s   	B

dHTNN
3
3C!3''E 4

dHUOO
4
4C!3''E 5	

dHX$6$6
7
7C!3''E 8FFE

dHZ$8$8
9
9C3  %%q 	  	 A%sA..C)3//ELL :

dH[$9$9
:
:C
~  !3'';Ir   c                    t          j        |          }t          d|d          D ]}t          j        t          j        ||                    }t          j        |          }t          j        t          j        ||dz                       }t          |dd          }t          j        |          }t          |t                    sJ |
                    d          }|                     ||f           d S )Nr   ry   r   r  )rf   rc  r  rs  rd  r   r]  fz_buffer_extractrz   r   rD  r6   )	r  rv  rF  rq   r  r  r   r   ry  s	            r   rt  rt  =  s    D!!A1a^^    (%*=dA*F*FGGs##(%*=dAE*J*JKK!#q!,,#C((!U#####HHWsAh   r   c                    | j         sdS t          j        | t          d                    }t          j        |          }|dk    r,t          j        | t          d                    }|j         sdS ndS t          j        |          r"t          t          j        |                    }n:t          j        |          r$t          j	        |          }t          |          }ndS |r|S dS )z
    JavaScript extractor
    Returns either the script source or None. Parameter is a PDF action
    dictionary, which must have keys /S and /JS. The value of /S must be
    '/JavaScript'. The value of /JS is returned.
    Nr	  
JavaScriptJS)r   rf   r   r   r@  r\  r   r   r   r   ro  )r  rI  jjjsr  r   s         r   r  r  =  s     > 3..A		1		B	\ Xd^^44} 	F	 	2 "5#;B#?#?@@		R	 	  #B''',, 
Fr   c                 L    | j         j        rt          j        | d          sdS dS )z(
    Ensure valid journalling state
    r   r   )r   r  rf   r"  rf  s    r   re  re  >  s/     ~ e&=c1&E&E q1r   c                    | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS | t           j	        k    rd	S | t           j
        k    rd
S | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS dS )z/
    return extension for MuPDF image type
    faxr}  flatelzwrldbmpgifr_  r&  r^  jxrr`  r  tiffrM  )rf   rn  rm  ro  rp  rq  FZ_IMAGE_BMPFZ_IMAGE_GIFre  FZ_IMAGE_JPEGrc  FZ_IMAGE_JXRFZ_IMAGE_PNGFZ_IMAGE_PNMFZ_IMAGE_TIFF)r"  s    r   ri  ri  >  s    ""4uu""4uu$$6ww""4uu""4uu""4uu""4uu$$4uu##5vv""4uu""4uu""4uu""4uu##5vv5r   c                 \   t          |t          j                  sJ t          j        t          j        j                  }t          j        t          j        |          |          }t          j        |t                    }|t          |          f}t          
                    |           d S r   )rz   rf   r9  r/  r  r  fz_quad_from_rectg_img_info_matrixJM_py_from_quad
g_img_infor6   )r5  r  r   r
  r   r
  rX  s          r   JM_image_filterr  6>  s    c5>*****U\,--A!8!;!;SAAA$566A###Ddr   c                    | sdS t          |           }|dk     rt          d           dS | }t          j        |          }|t          j        k    rdS |rt          j        ||          }nt          j        ||          }t          j        |          }t          j        |          }t          j	        |          \  }}	t          j
        |          }
t          j        |                                          }t                      }|                                |t          <   |                                |t"          <   |
|d<   t%          |          |t&          <   ||t(          <   |	|t*          <   |                                |t.          <   |                                |t2          <   t5          |          |t6          <   ||t8          <   |r
||t:          <   |S )z
    Return basic properties of an image provided as bytes or bytearray
    The function creates an fz_image and optionally returns it.
    Nre	  r  orientation)r-  rB   rf   rh  rg  rh  fz_new_buffer_from_shared_datarw  fz_image_orientation_matrixrx  fz_image_orientationr{  r  r   r   r{  r  r|  r8  rn  r  r  rF  r}  ry  r~  ri  rQ  r  r  )r  
keep_imagerE  ry  r"  r   r
  r  r  r  r  r  r  s                r   JM_image_profiler  ?>  s   
  t	??Dax !"""tA+Q//E&& t =2At<<2At<<*C00E

+U
3
3C*511JD$,e44K&(8(8(:(:;;GVVF"WWYYFM#ggiiFN(FM/44FN FL FL"'''))F 99;;FK-e44FK&FO '!&Mr   c                 x   |                                  }t          j                    at          j                    }t          j        | |t                      G d dt          j                  } |            }t          dddd|          }g at          j	        || |           t          t                    }g a|S )Nc                   >     e Zd Z fdZedk    rd Z xZS d Z xZS )0JM_image_reporter.<locals>.SanitizeFilterOptionsc                 p    t                                                       |                                  d S r   r   r^   use_virtual_image_filterr]   r@
  s    r   r^   z9JM_image_reporter.<locals>.SanitizeFilterOptions.__init__s>  s1    GG))+++++r   )r   r>  r  c                 N    t          d t          j        |          ||           d S r   r  rf   r9  )r]   rC
  r  r   r
  r  s         r   image_filterz=JM_image_reporter.<locals>.SanitizeFilterOptions.image_filterw>  &    enS&9&94GGGGGr   c                 N    t          d t          j        |          ||           d S r   r  r]   rC
  r  r   r
  s        r   r  z=JM_image_reporter.<locals>.SanitizeFilterOptions.image_filterz>  r  r   )r`   ra   rb   r^   r~   r  rH
  r@
  s   @r   SanitizeFilterOptionsr  r>  s        	, 	, 	, 	, 	, +- 	HH H H H H H HH H H H H H Hr   r  r   )rS  rT  rK
  rU  r?
  )r   rf   r9  r  r/  r  PdfSanitizeFilterOptions2rW  r  r  r|   )r   r   r  r  sanitize_filter_optionsfilter_optionsrh   s          r   r	  r	  k>  s    
((**C((|~~H	T8->???	H 	H 	H 	H 	H ? 	H 	H 	H 4355+)  N J	"C~>>>	z		BJIr   c                  F   t          t          d           } t          t          d           }t          t          d           }t          t          d           }t          t          d           }t          t          d           }t          t          d           }t          t          d           }t          t          d	           }t                      }	||	d
<   t          t          j                  |	d<   t          t          j                  |	d<   t          t          j                  |	d<   t          t          j                  |	d<   t          t          j                  |	d<   t          t          j	                  |	d<   t          t          j
                  |	d<   t          t          j                  |	d<   t          t          j                  |	d<   t          t          j                  |	d<   t          t          j                  |	d<   t          t          j                  |	d<   t          t                     |	d<   t          t          j                  |	d<   | |	d<   ||	d<   ||	d<   ||	d<   ||	d<   ||	d<   ||	d<   ||	d <   t          t          j                  |	d!<   |	S )"NTOFUTOFU_BASE14TOFU_CJKTOFU_CJK_EXTTOFU_CJK_LANG
TOFU_EMOJITOFU_HISTORICTOFU_SILTOFU_SYMBOLbase14cbzepubr  iccr  r^  r  r!  zplotter-cmykz	plotter-gz	plotter-nzplotter-rgbz	py-memoryr  tofuztofu-cjkztofu-cjk-extztofu-cjk-langz
tofu-emojiztofu-historicztofu-silztofu-symbolxps)r  rf   r   r  FZ_ENABLE_CBZFZ_ENABLE_EPUBFZ_ENABLE_HTMLFZ_ENABLE_ICCFZ_ENABLE_IMGFZ_ENABLE_JPXFZ_ENABLE_JSFZ_ENABLE_PDFFZ_PLOTTERS_CMYKFZ_PLOTTERS_GFZ_PLOTTERS_NFZ_PLOTTERS_RGB	JM_MEMORYFZ_ENABLE_SVGFZ_ENABLE_XPS)
	have_TOFUhave_TOFU_BASE14have_TOFU_CJKhave_TOFU_CJK_EXThave_TOFU_CJK_LANGhave_TOFU_EMOJIhave_TOFU_HISTORIChave_TOFU_SILhave_TOFU_SYMBOLrN   s
             r   JM_fitz_configr  >  s9   %eV444I%e];;;%eZ888M%e^<<<%e_===%e\:::O%e_===%eZ888M%e];;;
&&C.CM"5#677CJ"5#788CK"5#788CK"5#677CJ"5#677CJ"5#677CJ"5#566CI"5#677CJ"5#9::C"5#677C"5#677C"5#899C"9ooC"5#677CJ'CK+C
O/C0C-C0C+C
O.C"5#677CJJr   c                    t          j        |t          d                    }t          j        | |t          j                    d          }t          j        |          }t          j        |          r/|rt          j        ||           nt          j        ||d           nt          j	        | d          }|r2|j
        rt          j        ||           t          j        ||           n1t          j        ||           |j
        rt          j        ||           t          j        |t          d          |           |S )ag  
    Insert a buffer as a new separate /Contents object of a page.
    1. Create a new stream object from buffer 'newcont'
    2. If /Contents already is an array, then just prepend or append this object
    3. Else, create new array and put old content obj and this object into it.
       If the page had no /Contents before, just create a 1-item array.
    r  r   r
   )rf   r   r   r  r  r   r6  r8  r  r  r   r  )r!  r  newcontr
  r  newcontsr   carrs           r   r
  r
  >  s5    !'8J+?+?@@H#C%,..!DDHH%%D(## @ 	: 84444"8Xq9999"3** 	5" 5$T8444 x0000 x000" 5$T84447HZ$8$8$???Kr   c
           
         d}
d}d}d}d}d}d}d}d}d}t          |            |	dk    rt          j        |	          \  }}}|r5t          j        d|||d          }
t          j        | |
|	||          }d}d}n|rt          j        |          \  }}|r3t          j        |||dd          }
t          j        | |
|          }d}d}n|rt          j        d||d          }
nGt          |          }|j	        st          t          t                     t          j        d||d          }
|st          j        | |
          }d}nt          j        | |
|          }d}t          j        |          }t!          t          j        t          j        |t'          d                                        }t)          t          j        t          j        |t'          d                                        }|st)          t+          | |                    }t          j        |
          }t          j        |
          }||||t1          |          |	||d	g}|S )
z 
    Insert a font in a PDF
    Nr   r   rM  r   ry   rL  rC  )r   r   r^  r  r_  r  r  )r  rf   rc  rd  pdf_add_cjk_fontre  pdf_add_simple_fontrz  r   r   rx  r  r  rg  pdf_add_cid_fontr   rz  r@  r   r   r   rP  r  r  r  )r!  r]  r  r  r  r*  r  r  r  r_  r/  r   rT  ixrefr2  r  r   r   rI  extor  r  r  r  s                           r   r  r  >  s    D
CDEEF
E	D	DDS"} ?!4X>>dE  ,T4uaHH)#tXueLL
  	=4V<<JD$ 	0tQJJD0dHEEHDFF  H243JJ(44~ B.0@AAA4T3QGG  1#t<< 4S$IIX&&E 153EhPXYcPdPd3e3e f fggDe/1CXxXaObOb1c1cddeeD C !5c5!A!ABB

 
&
&C

!$
'
'Cv,,$  E Lr   c                    t          | t          j                  sJ t          |t          j                  sJ t          j        |t          j        |                     }|j        |j        z
  }|j        |j	        z
  }|dk    s|dk    rdS | 
                                }||j	        |                                 z
  z  |                                 |j        |                                 z
  z  z   }|                                 |                                 z
  }|                                 }	 |}t          |          D ]{}	t          |          D ]7}
t          j        | |          }d|z
  }t          j        | ||           |dz  }8|r0t          j        | |          }|dz  }t          j        | ||           |||z  }|dz  }|dk    rndS )z>
    invert a rectangle - also supports non-alpha pixmaps
    r   r   r~  )rz   rf   r  r  r  r  r  r  r  r  r  r  rF  r  r  r  r  r  )r  r  r   r  r  r  rs
  r  r/  r  rq   r  s               r   r  r  $?  s    tU^,,,,,q%-((((( E$8$$?$?@@A	qtA	qtAAv a q{{}}Htvvxx(46688qtdffhh+GGE	DJJLL	 BJJLLE 		3 		3ABZZ  )4332X$dAr222Q 3)433a$dAr222	Q6 	  1r   c                    t          | t          j                  r| S t          | t                    r-t          j        | j        | j        | j        | j                  } | S t          | t                    rAt          j	        | j        | j        | j        | j                  }t          j        |          }|S t          | t          j	                  rt          j        |           }|S | r"t          |           rt          |           dk    rt          j        t          j                  S g d}t          d          D ]k}| |         ||<   ||          t          j        t          j                  c S ||         t          k     r
t          ||<   ||         t          k    r
t          ||<   lt          j        |d         |d         |d         |d                   S )z>
    PySequence to mupdf.FzIrect. Default: infinite irect
    r  r.  Nr   r   ry   r   )rz   rf   r  r  r  r  r  r  r   r/  rn
  rq
  r  r  r  r  fz_make_irect)r   rN   r  rq   s       r   r  r  G?  s    !U]## !U M14qtQT22!T l14qtQT22mC  
!U\"" mA
 6$Q'' 6?1+=+=+B 6}U4555A1XX # #t!Q4 	:=!899999Q4/! 	#"AaDQ4/! 	#"AaDqtQqT1Q41666r   c                     dS rW   r    )rO  s    r   rd  rd  e?  s    1r   c                    t          j        |           }t          j        |t          d                    }t          j        |          rt          j        |          S t          j        |          }g }t          |          D ]t}t          j        ||          }t          j	        |          rt          j        |d          }|
                    t          t          j        |                               u|S )z 
    ListBox retrieve value
    r  r   )rf   r   r   r   r\  r   rc  r  rd  r6  r6   r   )r   r   r  rF  r  rq   elems          r   JM_listbox_valuer*  q?  s    
 #U++IHSMM::FF## 1'000 	V$$AE AYY K K"FA..t$$ 	1&a00D')A4)H)HIIJJJJLr   c           	         d}|dk     r|dz  }nu|dk    r||d         ddz  }n_|dk    rJ |dk    r$||d         dd	|d         dd	|d         dd
z  }n-||d         dd	|d         dd	|d         dd	|d         ddz  }|dt          |           d	| dz  }t          j        t          j        |           t          j        |           d S )Nr(   r   z0 g r   r	  z g ry   r   rl   z rg z k rj  r  )r/  rf   r=  r   PDF_ENUM_NAME_DA)r   r  r&  r   r   r  s         r   rj
  rj
  ?  s:   
 Cax 	Aw	 A#a&	 A	 A#a&666SV666A66666#a&@@@SV@@@A@@@3q6@@@@@8x((8888888C	"5#6u#=#=u?UWZ[[[[[r   c                 @
   t           rt          j        | ||||          S d }g }t          j        |           t          j        t          j        j                  }t          j        t          j        j                  } G d d          }	 |	            }
 |	            }d }d }|D ]}t          ||          }t          ||          st          j	        |          s8t          t          j        t          j        |j        j                            ||          }t          j        |j        j                  }|j        j        |_        ||_        t'          t          j        t          j        |j        j                                      |_        |j        j        |_        t+          t          j        t          j        |j        j                                      |_        t/          t          j        t          j        |j        j                                      |_        |j        |
j        k    s1|j        |
j        k    s!|j        |
j        k    s|j        |
j        k    r,|
j        dk    r|r||t2          <   d }n+t5          |          |t6          <   t          j        |           t9          |          |t:          <   t=          |          |t>          <   t          j         ||          }|!                    |           d }tE                      }|j        }|j        }|j        dk     rd}d}|j        |tF          <   |j        |tH          <   tK          |j                  |tL          <   |j        |tN          <   ||d<   ||d<    |	|          }
|}|}t          j         ||          }|rtE                      }t9          |j        j                  |t:          <   t=          |          |t>          <   tQ          |j        j)                  |tT          <   |g }|!                    |           tW          ||j        j)                   |r|r||t2          <   d }n+t5          |          |t6          <   t          j        |           t9          |          |t:          <   t=          |          |t>          <   t          j,        |          s*|!                    |           t          j         ||          }d }t          j,        |          s|| tZ          <   n
|| tZ          <   |S )	Nc                       e Zd ZddZd ZdS )$JM_make_spanlist.<locals>.char_styleNc                     |rJ|j         | _         |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        d S d| _         d| _        d| _        d| _        d| _        d| _        d S )Nr   r(   r   r  r  r/  r  r  r  )r]   rj  s     r   r^   z-JM_make_spanlist.<locals>.char_style.__init__?  sr     H	 Y
H	 Y
7H				
	
			r   c                 d    | j          d| j         d| j         d| j         d| j         d| j         S )Nrl   r1  r\   s    r   r   z,JM_make_spanlist.<locals>.char_style.__str__?  sD    i^^$*^^ty^^4:^^^^SWS\^^^r   r   )r`   ra   rb   r^   r   r    r   r   
char_styler/  ?  s<        	 	 	 		_ 	_ 	_ 	_ 	_r   r3  r   re  r  r  r  r  ).r   r   JM_make_spanlistrf   rJ  r/  rH  rK  rL  rl  r  r  r  r   r/  r  r.  r  r  rF  r  r  r  r  r  dictkey_charsro  r   JM_py_from_pointdictkey_originr.  rl  rN  r6   r   r~  dictkey_flagsrz  dictkey_fontrT  r  ry  	dictkey_crM  rk  dictkey_spans)	line_dictr=   r}  r$  rR  	char_list	span_list	span_rect	line_rectr3  	old_styler  r  span_originr  r   r  r.  r  r  	char_dicts                        r   r4  r4  ?  s    K%isD'JJJII	$U\566IU\566I_ _ _ _ _ _ _ _& 
IJLLEDK G2 G2r"" !,, 	1'::	 "5<0EbmFX0Y0Y#Z#Z\`bdeer}344]'
!%,u/DR]EW/X/X"Y"YZZ
m)$U\%2GHZ2[2[%\%\]]	&u|E4I"-J\4]4]'^'^__
J).( (	!;)/1(	!;)/1(	! :/(	!
 ~"  0*3D' $II *@)F)FD&)$///'7'D'D^$%4Y%?%?\"!/	9EE	  $'''66D)C:Dy4 !&D"'+D!4UZ!@!@D"'+D"D $D #
5))II K'	155	 
	2I(8"-:N(O(OIn%&5a&8&8Il##&r}#7#7Ii  	Y''''41111   	("+DII!7!=!=D!$'''/<<^,Y77\%i00 	BT"""+IyAAI!),, -#,	-  #,	- r   c                     |                                  }t          j        |                                          }|                                }|                                }t          j        }t          j        |j                  }|r|j	        j
        }|t          j        k     s|t          j        k    rt          j        }d }|rK|t          j        k    r;t          j        t          j        |j                            }	t!          |          }
n(t          j        |t          j                              }	d}
t'          |	          }||t(          <   ||t*          <   |
|t,          <   ||t.          <   |                                |t2          <   |                                |t6          <   |                                |t:          <   t=          |                                           |t@          <   tC          |          |tD          <   ||tF          <   d S )Nr`  )$rP  rf   r~  r  r   r  rg  rk  r   rl  r   r  re  r  rr  rs  ri  rt  ru  r   r{  r|  rQ  r}  r  r  r  r  ry  r~  r8  rm  rn  r-  r~  r  )rS  rr  r
  rF  r   r  r"  ll_fz_compressed_bufferrX  r  r^  s              r   JM_make_image_blockrF  @  s   MMOOEe..0011A		A		A"E $A%BRSS 4'.3u!! 'Ue.B%B '&F 5E,B#B ne57N7UVVWW ''3E5;N;P;PQQc""F!"J"#J"J&'J"# %

J %

J$yy{{J"3E4E4E4G4G"H"HJ #FJ!'Jr   c           	         t           r't          j        | j        |||j        |j                  S g }t	          j        t          j        j                  }| D ]}t	          j        t	          j        |t	          j        |j        j	                                      rt	          j
        |          sZt                      }t          |||||          }	t	          j        ||	          }|j        j        |t          <   t!          |j        j                  |t$          <   t'          |	          |t(          <   |                    |           t'          |          |t(          <   ||t,          <   d S r   )r   r   JM_make_text_blockr   rf   r/  rH  rk  rt  r   rl  r   r4  rN  r  dictkey_wmoder6  r?  dictkey_dirr.  rl  r6   dictkey_lines)
rS  rr  r}  r$  rR  	line_list
block_rectr=   r<  r@  s
             r   rH  rH  >@  s?    p'(8*c4?\c\noooIel677J $ $"5#:7ELQUQ`QeDfDf#g#ghh 	1'::	 FF	$Yc4II	(Y??
#'?#8	- !1$/2E!F!F	+"1)"<"<	,####.z::J| )J}r   c           	         t           rt          j        | j        ||          S t	          j        d          }g }t	          j        | j        j                  }d}| D ]`}|dz  }t	          j        |t	          j        |j        j	                            s/t	          j
        |          s|j        j        t          j        k    rht	          j
        |          sDt	          j        t	          j        |t	          j        |j        j	                                      rt                      }||t           <   |j        j        |t"          <   |j        j        t          j        k    r2t%          |j        j	                  |t&          <   t)          ||           nt+          |||||           |                    |           b||t.          <   d S )Nr0  r   r   )r   r   r@  r   rf   r  r/  r  fz_contains_rectr   rl  r   FZ_STEXT_BLOCK_IMAGErk  rt  r   rk  rR  r.  rl  rF  rH  r6   dictkey_blocks)	r  rA  r}  text_buffer
block_listrR  rQ  rS  rr  s	            r   r@  r@  U@  s    J*2=)SIII%c**KJl2=122GG & &1&wU=M=R0S0STT 	1'::	$)U-GG	 )'22 	*5+B7ELY^YiYnLoLo+p+pqq	 VV
%,
>"#(#3#8
<  E$>> 	M'6u7G7L'M'MJ|$z2222uj#{GLLL*%%%% *Inr   c           	      F   g d}t          | t          j                  r| S t          | t                    r7t          j        | j        | j        | j        | j        | j        | j	                  S | r"t          |           rt          |           dk    rt          j                    S t          d          D ]2}t          | |          ||<   ||         t          j                    c S 3t          j        |d         |d         |d         |d         |d         |d                   S )	N)r   r   r   r   r   r   r   r   r   ry   r   r  r
   )rz   rf   r9  r<  r   r  ry  r  r'  r  rn
  rq
  r  rq  r/  )rH  r   rq   s      r   r  r  v@  s   A!U^$$ !V <~ac13QS!#qs;;;  $Q''  ?1+=+=+B  ~1XX " "Q""!Q4 	"<>>!!!	">!A$!adAaD!A$!===r   c           	         t          j        t           j        j                  }t          j        t          j        | t          d                              }t          j        |          st          j        |          rd|_        d|_	        d|_
        d|_        t          j        t          j        |j        |j
                  t          j        |j	        |j                  t          j        |j        |j
                  t          j        |j	        |j                            }|j
        |j        z
  dk     s|j        |j	        z
  dk     r#t          j        t           j        j                  }|S )z&
    return a PDF page's MediaBox
    ri  r   d    r   )rf   r/  r  r  r  r   rk  rl  r  r  r  r  fz_minfz_max)r  page_mediaboxr  s      r   rO  rO  @  s0    L!899M *8Xj5I5IJJ H h'' 5+DX+N+N LLhk22Lhk22Lhk22Lhk22	 M 	=++a/ >-"22Q6> U\%<==r   c
                    t           rt          j        | |||||||||	
  
        S |}
d}t          j        ||z
            dz   }||k     r\|}||k    rRt          | |||
||||	           |dz  }|dk    r||z  dk    rt          d| d| d           |dz  }|
dz  }
||k    PdS dS |}||k    rRt          | |||
||||	           |dz  }|dk    r||z  dk    rt          d| d| d           |dz  }|
dz  }
||k    PdS dS )z
    Copy a range of pages (spage, epage) from a source PDF to a specified
    location (apage) of the target PDF.
    If spage > epage, the sequence of source pages is reversed.
    r   r   z	Inserted rW
  z pages.N)r   r   r  rf   fz_absi
page_mergerB   )doc_desdoc_srcspageepageapager   r  rg  r  	graft_map	afterpagecounterr  r   s                 r   r  r  @  s   "  #  	 IGM%%-((1,Eu} em 	wy&%QZ[[[qLGq  AW}%<%A A?G?????@@@AIDNI em 	 	 	 	 	 em 	wy&%QZ[[[qLGq  AW}%<%A A?G?????@@@AIDNI em 	 	 	 	 	r   c                 (   t          j        |                                 t          d                    }t          j        |t          d                    }t          j        |t          d                    }t          j        |t          d                    }t          j        |t          d                    }d}d}t          j        |          r^t          j        |          }	t          j        |          rt          t          j        |                    D ]c}
t          j        t          j        ||
                    }|	                    d          s?t          j
        |dd                   }||k    r|}dn#t          j        |t          d          |	          }|dz  }t          |	          D ]x}
t          j        t          j        ||
                    }t          j
        |dd                   |z   }d| }t          j        ||
          }t          j        |||           yt          j        |          rt          t          j        |                    D ]c}
t          j        t          j        ||
                    }|	                    d	          s?t          j
        |dd                   }||k    r|}dn#t          j        |t          d          d
          }|dz  }t          t          j        |                    D ]x}
t          j        t          j        ||
                    }t          j
        |dd                   |z   }d	| }t          j        ||
          }t          j        |||           y||fS )aW  
    Merge the /Resources object created by a text pdf device into the page.
    The device may have created multiple /ExtGState/Alp? and /Font/F? objects.
    These need to be renamed (renumbered) to not overwrite existing page
    objects from previous executions.
    Returns the next available numbers n, m for objects /Alp<n>, /F<m>.
    r   r   r  r   Alpr   Nr   ro  ry   )rf   r   r   r   rA  rB  r  r@  rD  r   fz_atoir  rC  r>  )r   temp_resr(  	main_extg
main_fonts	temp_extg
temp_fontsr  	max_fontsrF  rq   r  rI  r:   r   r/  s                   r   r  r  @  s\    "488::x/D/DEEI"9h{.C.CDDI#Ix/?/?@@J "8Xk-B-BCCI#Hhv.>.>??JGI ## 6y))Y'' 
	U5-i8899    ')?	1)M)MNN~~e,, M#abb'**w;  G  /	8K;P;PRSTTI1q 	6 	6A#U%;Y%J%JKKCc!""g&&0A99D()Q77C	45555$$ 	Mu)*5566 	 	A$e&<j!&L&LMMD??3'' d122h''A9} 		 ,Y8H8H!LL
NI5%j1122 3 3 %"8*a"H"HIIM$qrr(##i/1ww$Z33Jc2222Yr   c                 p    t                               |            t          rt          d|             dS dS )z!
    redirect MuPDF warnings
    zMuPDF warning: N)r  r6   JM_mupdf_show_warningsrB   rA   s    r   JM_mupdf_warningrq  A  sG     ""4((( *($(()))))* *r   c                 r    t                               |            t          rt          d|  d           d S d S )NzMuPDF error: r  )r  r6   r  rB   rA   s    r   JM_mupdf_errorrs  !A  sH    ""4((( *(((()))))* *r   c                 P    t          | t                    sJ t          | |          S r   )rz   r{   JM_new_bbox_device_Device)rh   r  s     r   r  r  'A  s(    b$$b*555r   c           
          t          | t          j                  sJ t          j        | j        j                  }t          j        d          }| D ]}|j        j        t          j        k    r|D ]{}|D ]T}t          |t          ||                    st          j        |          s5t          j        ||j        j                   Ut          j        |t          d                     |t          j        |t          d                     |S )z1
    make a buffer from an stext_page's text
    rb  r  )rz   rf   r  r/  r   r  r  r   rI  rL  rK  rl  fz_append_runery  rO  r  )r   r   r  rS  r=   r  s         r   JM_new_buffer_from_stext_pagerx  ,A  s    dE-.....<011D

c
"
"C 
1 
1 E$== 		1 5 5 ? ?B,T<b3I3IJJ !$)$=d$C$C! !(bmo>>>>$S#d))4444 c$ii000Jr   c                    |dS t          |          }|dS t          j        |                    d                    }t          j        | |t          j                    d          }t          j        | d          }t          j        |t          d          t          j	        d                     t          j        |t          d          |           |S )z
    make new PDF action object from JavaScript source
    Parameters are a PDF document and a Python string.
    Returns a PDF action object.
    Nr  r   r  r	  r  r  )
r
  rf   rh  r  r  r  r  r  r   r  )r!  r   rT  r   source	newactions         r   JM_new_javascriptr|  AA  s      D 

.t{{6/B/B
C
CC!#sELNNA>>F&sA..I	y(3--1CL1Q1QRRR	y(4..&999r   c                      t          |           S r   )JM_new_output_fileptr_Output)rP  s    r   r.  r.  WA  s    '---r   c                 `    | dk     r| dz  } | dk     | dk    r| dz  } | dk    | dz  dk    rdS | S )zB
    # return normalized /Rotate value:one of 0, 90, 180, 270
    r   rq  rr  r    )r   s    r   rk  rk  [A  se     1* # 1* 
C- # C- {a qMr   c                     t          j        d          }t          j        |          }t          j        || ||           |                                 t          j        |           |S )Nr  )rf   r  r  r  r0  fz_terminate_buffer)r  rI  rT  r   r1  s        r   r]  r]  hA  s`    

c
"
"C
.

C	T8U333	c"""Jr   c                 "   | j         s|S | }|j         rt          j        |          }||v s't          j        |t	          d                    j         rn|                    |           t          j        |t	          d                    }t          j        |          rt          ||          }t          j        |t	          d                    }t          j        |t	          d                    }t          j        |          s|}|j         |S )z
    Return list of outline xref numbers. Recursive function. Arguments:
    'obj' first OL item
    'xrefs' empty Python list
    r}  r  Nextr`  )r   rf   r   r   r   r6   rA  r  )r   r  thisobjnewxrefr  r   s         r   r  r  qA  s    > G

 "G,,e 	u17HV<L<LMMX 	g"GXg->->??e$$ 	4$eU33E$gx/?/?@@#Whx.@.@AA '** 	G 
  Lr   c                     d}t          j        |                                 t           j                  }t          j        |          }t          |          }|S )zE
    return a PDF page's /Rotate value: one of (0, 90, 180, 270)
    r   )rf   r  r   r	  r   rk  )r   r   r   s      r   rX  rX  A  sH     F

($((**e6P
Q
QCc""Ff%%FMr   c                     t          j        t          |d                    }t          j        |          }t          j        t           j                  }t          j        | ||          }|S )zP
    create PDF object from given string (new in v1.14.0: MuPDF dropped it)
    r  )rf   rh  r   r-  	PdfLexbufPDF_LEXBUF_SMALLpdf_parse_stm_obj)r   r  r   r  lexbufr  s         r   r  r  A  sY     25f3E3EFFG!'**F_U344F$S&&99FMr   c                 f   t          | t          j                  sJ |t          j                    }|7t          |t          j                  sJ dt	          |          d|             t          j        |           }t          |          }t          |          }t          j        ||          }t          j	        ||          }t          j
        |          }	t          |t          j                  sJ t          j        ||	||          }
|rt          j        |
           nt          j        |
d           t          j        |          sQt          j        ||
|	          }t          j        | |t          j                    |t          j                               npt          j        ||
          }t          j        | |t          j                    t          j        t          j        j                  t          j                               t          j        |           t1          d|
          S )z
    Version of fz_new_pixmap_from_display_list (util.c) to also support
    rendering of only the 'clip' part of the displaylist rectangle
    Nztype(seps)=r,   r~  r}  )rz   rf   r  r  r   r  r  r  rt  rf  ru  rn  r  r  r  rl  r  r  r9  r  r  r/  r0  r
  r  )r  r  r  r  r  r  r   r  r  r  r  r
  s               r   r  r  A  s    eU011111 %"$$Z:dE,?@@ZZBZT$ZZBZBZTXBZBZZZZ&u--Ds##FD!!E"4//D"400D%%Er5-.....

'E4
?
?C 4c""""(d333$U++ }0eDD!%en.>.>u~GWGWXXXX&vs33!%en.>.>U\Mh@i@ikpkyk{k{|||	#5#r   c                     t          | t          j                  r| S t          | t                    rt          j        | j        | j                  S t          rt          j        |           S t          j        dd          }t          | d          }t          | d          }|||S t          |t                    }t          |t                    }t          |t                    }t          |t                    }t          j        ||          S )zM
    PySequence to fz_point. Default: (FZ_MIN_INF_RECT, FZ_MIN_INF_RECT)
    r   r   )rz   rf   r  r  r  r  r   r   r\
  rq  r  r  r  r  )rj  r  r  r  s       r   r\
  r\
  A  s     !U]## !U '}QS!#&&& *%q)))	q!		BaAaA A 	Q  AQ  AQ  AQ  A=Ar   c                    t           rt          j        | |          S t          | t          j                  sJ t          |t          j                  sJ t	          j        |j        j	                  }d}d}d}d}t          |          D ]X\  }}|j        j        t          j        k    r4t          |          D ]\  }	}
t          |
          D ]\  }}||z  } ||	z  }||z  }Y|D ]}|j        j        t          j        k    r}|D ]z}
d}|
D ]R}t          |
|          }t	          j        |          st          ||          r|j        j        }t#          | |           S|dk    r|dk    rt	          j        | d           {dS )z
    Plain text output. An identical copy of fz_print_stext_page_as_text,
    but lines within a block are concatenated by space instead a new-line
    character (which else leads to 2 new-lines).
    r   r   rF  r  N)r   r   r<  rz   rf   r  r  r/  r   r  r  r   rI  rK  rl  rL  ry  rM  r
  )r   r   r   rV  n_blocksn_linesn_chars	n_blocks2rS  n_lines2r=   n_chars2r  chbboxs                 r   r<  r<  A  s     <0d;;;c5>*****dE-.....<011DIHGG%t,,  	5 E$== 	 "+U"3"3 $ $$$-t$4$4  LHb8#xGI 6 6 E$== 	6 6 6	 7 7B)$33F1$77 7/f==7 %'MO	&sI666? 6y1} 6*35556 6r   c                    t          j        | |          }t          j        |           }|s=|r|j        st          j        | |           n|j        rt          j        ||           dS |j        r|j        st          |          }n"t          t          j        ||                    }||k    rHt          ||          }|j        st          j        | ||           dS t          j        | |||           dS dS )a   
    Create a JavaScript PDF action.
    Usable for all object types which support PDF actions, even if the
    argument name suggests annotations. Up to 2 key values can be specified, so
    JavaScript actions can be stored for '/A' and '/AA/?' keys.
    N)	rf   r   rV  r   r  r  r|  r  r  )r   key1key2r   key1_objr!  r  r{  s           r   JM_put_scriptr  B  s(    !)T22H

&y
1
1C   	/4? 	/y$////  	/x... ? C("5 Cx((u1(DAABB  B%c511	 	By$	:::::	9dDAAAAAB Br   c                 6    | j         | j        | j        | j        fS r   r  r  s    r   r  r  4B      4qtQT!!r   c                 N    | j         | j        | j        | j        | j        | j        fS r   rc	  )rH  s    r   r8  r8  8B  s!    3QS!#qsAC''r   c                     | j         | j        fS r   rl  )rj  s    r   r6  r6  <B  s    38Or   c                     | j         j        | j         j        f| j        j        | j        j        f| j        j        | j        j        f| j        j        | j        j        ffS )z"
    PySequence from fz_quad.
    )r}  r  r  r  r  r  )r
  s    r   r  r  @B  sN    
 TVQTVTVQTVTVQTVTVQTV	 r   c                 6    | j         | j        | j        | j        fS r   r  r  s    r   r.  r.  LB  r  r   c           
      b   t          | t          j                  r| S t          | d          rDt	          |           dk    r1t          | d         d          rt          j        t          |            } t          | t          j                  rt          j        |           S t          | t                    rkt          j	        | j
        j        | j
        j        | j        j        | j        j        | j        j        | j        j        | j        j        | j        j                  S t          j	        dddddddd          }g d}| r/t          | t          t           f          rt	          |           dk    r|S t#          | d          !t          j        t%          |                     S t'          d          D ]H}|t	          |           k    r|c S | |         }t)          |          rt+          |          dk    r|c S t#          |d          ||         _        t#          |d          ||         _        ||         j        ||         j        |c S t-          ||         j        t.                    ||         _        t-          ||         j        t.                    ||         _        t1          ||         j        t2                    ||         _        t1          ||         j        t2                    ||         _        J|d         |_
        |d         |_        |d         |_        |d         |_        |S )	Nr  r  r   r&  r.  ry   r   r   )rz   rf   r  r  r-  r/  r|   r  r  fz_make_quadr}  r  r  r  r  r  r{   rq  r  r  rn
  rq
  r  r  r  r  )r   r
  rj  rq   r   s        r   r
  r
  PB  s   !U\"" q-   $SVVq[ $WQqT;5O5O $L%((#1el## +&***1d !	  	 	1aAq!Q22A		A Jq5$-00 CFFaK Q ;&q'9'9:::1XX / /A; 	HHHd$$ 	(<(<(A 	HHHsA&&!sA&&!Q46 	QqTV 	HHHadfo..!adfo..!adfo..!adfo..!Q4ADQ4ADQ4ADQ4ADHr   c                 R   t          | t          j                  sJ t          |                        t          j        | t          j                  }t          j        |          rt          j        d          }t          t          j	        |                    D ]o}|dk    rt          j
        |d           t          j        ||          }t          j        |          r)t          j        |          }t          j        ||           pn|j        rt          j        |          }|S )zJ
    Read and concatenate a PDF page's /Conents object(s) in a buffer
    r  r   r0  )rz   rf   r  r   r   r
  r6  r  r  rc  rO  rd  r   r   fz_append_bufferr   )r  r  r   rq   r   r  s         r   r  r  }B  s    gu|,,@@g.@@@@!'5+GHHH(## 
.nT""u*84455 	2 	2A1u .$S"---%h22C"3'' 2,S11&sD111	2 
	 .#H--Jr   c                    t          | t          j                  r| S t          | t          j                  rt          j        |           S t          | t                    r+t          j        | j        | j        | j        | j	                  S t          | t                    r+t          j        | j        | j        | j        | j	                  S | r"t          |           rt          |           dk    r#t          j        t          j        j                  S g d}t          d          D ]x}t          | |          ||<   ||         %t          j        t          j        j                  c S ||         t           k     r
t           ||<   ||         t"          k    r
t"          ||<   yt          j        |d         |d         |d         |d                   S )Nr  r.  r   r   ry   r   )rz   rf   r/  r  r   rb
  r  r  r  r  r  rn
  rq
  r0  r  rq  r  r  )r   r  rq   s      r   r  r  B  s   !U\"" !U]## |A!T :!!$adAD999!U :!!$adAD999 9$Q'' 9?1+=+=+B 9|EL7888A1XX # #Q""!Q4 	=< ;<<<<<Q4/! 	#"AaDQ4/! 	#"AaDadAaD!A$!555r   c                     	 | j         |j        k    s0| j        |j        k    s | j        |j         k    s| j        |j        k    rdS dS r  r  r^  s     r   rL  rL  B  sW    tqt|tqt| tqt| tqt|	 q1r   c                    | sdS t          j        |                                 t          d                    }|j        r|                                 }t          j        ||                                           }t          j                    }t          j                    }t          j	        | ||           t          j
        || |||          }t          j        |j                  | j        _        dS dS )z<
    refreshes the link and annotation tables of a page
    Nr_  )rf   r   r   r   r   r   rV  r/  r9  r  pdf_load_link_annotsll_fz_keep_linkr  )r   r   r!  r  rZ  r  r  s          r   rB  rB  B  s      

dhhjj(8*<*<
=
=C
~ Hhhjj-sDHHJJ??>## $x@@@)3c68LL % 5t G GH Hr   c                    | j         st          j                    S t          |           }|dk    rt          j                    S t	          |                                           }|j        }|j        }|dk    rt          j        dddd|d          }n9|dk    rt          j        dddd||          }nt          j        ddddd|          }|S )z*
    calculate page rotation matrices
    r   rr  r   r   r  )	r   rf   r9  rX  r  r   r  r  r  )r   r
  cb_sizer   r  rH  s         r   re  re  B  s     ?  ~%%H1}  ~dhhjj))G	A	A2~ 4 Ar1a33	S 4 Q2q!44 B1a33Hr   c                    t           rt          j        | j        |          S t	          j        | j        j                  }|sd S g } G d d          } |            }d|_        ||_        d|_	        d|_
        t          |           }t	          j        |          }d}t          ||d          |          \  }	}
|	|S |	|z  }	|
|z  }
d}d}| D ]}|j        j        t          j        k    r|D ]}|D ]}|dz  }t	          j        |          s!t#          ||          }t%          ||          s<	 |s||	k    rd}|rJ||
k     rt'          |||           n3d}t          ||d          |          \  }	}
|	|c c c S |	|z  }	|
|z  }
W	 |dz  }||         dk    sJ d|d	||                     |dz  }||         dk    sJ d|d	||                     |dz  }|S )
Nc                       e Zd Zd ZdS )"JM_search_stext_page.<locals>.Hitsc                 F    d| j          d| j         d| j         d| j         S )Nz	Hits(len=z quads=z hfuzz=z vfuzz=)r-  r
  hfuzzvfuzzr\   s    r   r   z*JM_search_stext_page.<locals>.Hits.__str__B  s2    btxbb
bb4:bbVZV`bbbr   N)r`   ra   rb   r   r    r   r   Hitsr  B  s(        	c 	c 	c 	c 	cr   r  r   r  皙?r   r  z	haystack=z haystack_string[haystack]=)r   r   r  r   rf   r/  r  r-  r
  r  r  rx  fz_string_from_bufferfind_stringr   rI  rl  rK  rL  on_highlight_char)r   r  r   r
  r  hitsr   haystack_stringhaystackbeginrS  insiderq   rS  r=   r  r   s                    r   r  r  B  s    C)$/6BBB<011D Ec c c c c c c c 466DDHDJDJDJ+D11G1'::OH_XYY7@@JE3 	XE8OCF	A ' ' E$== 	 !	 !	D  Q066 !$T2..A+D!44 ! ! '#u, '%&F )#c> )-dD"===!%&F)4_XYY5OQW)X)XJE3$ )', !& 1 #x (A"8,4 @ @?x???8#<??@ @ @MHHx(D0 	< 	<;8;;x8;;	< 	< 	<ALr   c           	         t          j        |          rt          j        d           dS 	 t          j        |t           j                  }|dk    r2t          j        |t           j                  }t          | |||           nI|dk    rt          | |||           n0|dk    rt          | |||           n	 t          j	        |           dS t          j
        |          }t          |          D ]}	t          j        ||	          }
t          j        |
          rt          j        |
          }nd}t          j        |
t           j                  }|j        r[|}||vr*|                    |           t%          | |||||           t          j        d            t          j	        |           dS 	 t          j	        |           dS # t          j	        |           w xY w)zP
    Step through /Resources, looking up image, xobject or font information
    z.Circular dependencies! Consider page cleaning.Nr   ry   r   r   )rf   pdf_mark_objrI  r   PDF_ENUM_NAME_XObjectPDF_ENUM_NAME_FontrS  re  rY  pdf_unmark_objrB  r  rC  r   r   r  r   r6   r  )r!  r  r  r  rQ  r  xobjr/  rF  rq   r   sxrefsubrsrcsxref_ts                 r   r  r  %C  s    $ FGGG#!$(CDD19 	%dE,DEEDCuk::::QY 	S${;;;;QY 	Cuk::::( 	T"""""# t$$q 	 	A(q11C"3'' (--(e.KLLG! &( MM'***%sGUD%PPPPM"RSSST"""""	  	T"""""T""""s   B	G
 CG
 2G
 
G c                    |sdS t          |t          t          f          sJ t          |          }|dk    rdS t	          j        |           }t	          j        |          }t	          j        ||          }t          |          D ]}||         }|}t          |t                    rt	          j
        ||           7t          |t          t          f          rt          |          dk    s
J d            |\  }	}
|	r|
s
J d            t	          j        |d          }t	          j
        ||	           t	          j
        ||
           t	          j        |t          d          |           dS )z'
    set ListBox / ComboBox values
    Nr   ry   zbad choice field listr  )rz   r|   r{   r-  rf   r   rV  r  r  r   pdf_array_push_text_stringpdf_array_push_arrayr  r   )r   r  rF  r   r!  r  rq   r   optopt1opt2	optarrsubs               r   JM_set_choice_optionsr  NC  su     uudm,,,,,UAAv #U++I

&	
2
2C #q))F1XX ? ?Ahc3 	?,fc::::sUDM22^sCyyA~^^G^^^^JD$9D99"99992FA>>I,i>>>,i>>>>		8E??F;;;;;r   c                    d}d}d}|t           j        k    rt          d          }t           j        }n|t           j        k    r(t          d          }t           j        }t           j        }n|t           j        k    r)t          d          }t           j        t           j        z  }n|t           j        k    rt          d          }nw|t           j        k    rt          d          }t           j	        }nK|t           j
        k    rt          d          }t           j	        }n|t           j        k    rt          d          }|r#t          j        |t          d          |           |dk    s|dk    rRt          j        |t          d                    }|| z  }||z  }t          j        |t          d          |           dS dS )	z
    Set the field type
    r   NBtnTxChSigFTFf)rf   r
  r   PDF_BTN_FIELD_IS_PUSHBUTTONr	  PDF_BTN_FIELD_IS_RADIOr
  r8  r9  PDF_CH_FIELD_IS_COMBOr:  r  r  r  r  )r   r   r   setbits	clearbitstypenamer  s          r   r  r  jC  s    GIHu++ #E??3	2	2 #E??5	.	/	/ #E??69UU			+	+ 	#D>>	.	. #D>>/			/	/ #D>>-	0	0 #E?? :3999!| :yA~ :%c8D>>::
sHTNND99999	: :r   c                    d}t          j        |           }|                    d          }t          |          }|dz
  }||         }||= t          |          }t          j        | |          }	|	j        s|dk    rd                    |          }
t          j        t          j        | t          |
                              rt          dt          |                    ||dz
  = t          |          }|dk    t          j
        | |t          j        |                     t          j        | |          }	t          j        |	          st          d|          t          j        |	          }||k    rt          d|          t          | dd          }t          |          }d|d|d}d|d	|}|                    ||d          }t#          ||          }|S )
z*
    Set a PDF dict key to some value
    zfitz: replace me!rj  r   r   zpath to '%s' has indirectszcannot insert value for '%s'rn  rp  rl   )rf   rV  rl  r-  rt  r   r  r  r
  r   pdf_dict_putpr?  r\  r   r]  ro  r  r  )r   r  r   
eyecatcherr!  r  rE  rq   skeytestkeyr   rX  r   objstrnullvalnewvalnewstrrD  s                     r   rs  rs  C  s    %J

&s
+
+CIIcNNEu::DqA8Dau::D!#s++G 	 Qh 	A$U%8l1oo%N%NOO R <l4>P>PQQQdQhu::D Qh 	 
S%";J"G"GHHH!#s++Gw'' =6<<<#G,,Dz =6<<<
c1a
(
(C#C((FF !DD***-GGuu%F^^GVQ//F "#v..GNr   c                    |r#t          j        | t          d          |           |Wt          j        | t          d                     |r3t          j        | t          d          d          }t          ||           |Wt          j        | t          d                     |r3t          j        | t          d          d          }t          ||           |Wt          j        | t          d                     |r3t          j        | t          d          d          }t          ||           |t          j        | t          d                     |rst          j        | t          d          d          }t          |          }t          |          D ]3}||         }	t          j        |d          }
t          |
|	           0d S d S d S )Nr  r  r   r  r  r$  )	rf   r  r   r  r  JM_set_ocg_arrays_impr-  r  r  )r  r  r  r  r  rI  r  rF  rq   item0r   s              r   r  r  C  s    Ix'<'<iHHH	 ,D(4..111 	,*D(4..!DDC!3+++
 -D(5//222 	-*D(5//1EEC!3,,, 0D(8"4"4555 	0*D(82D2DaHHC!3/// 3D(:"6"6777 	3*D(:2F2FJJC8}}A1XX 3 3 0#q99%sE22223 3	3 	33 3r   c                     t          j        |           }|D ]-}t          j        ||d          }t          j        | |           .dS )z
    Set OCG arrays from dict of Python lists
    Works with dict like {"basestate":name, "on":list, "off":list, "rbg":list}
    r   N)rf   rV  rF  r8  )r  r  r!  r   r   s        r   r  r  C  sW    
 
&s
+
+C ' '$S$22S#&&&&' 'r   c                    t          j        |           }t          j        ||d          }|j        st	          t
          t                     t          j        | t          d                    }|j        s#t          j	        | t          d          d          }t          j        |t          d                    }|j        s#t          j	        |t          d          d          }t          j
        |t          j        |          |           dS )z
    Insert an item into Resources/Properties (used for Marked Content)
    Arguments:
    (1) e.g. page object, Form XObject
    (2) marked content name
    (3) xref of the referenced object (insert as indirect reference)
    r   r   r   r  N)rf   rV  rF  r   rx  rE  r  r   r   r  r  r  )r
  r   r   r!  r  r(  r  s          r   r'  r'  C  s     
&s
+
+C

 dA
.
.C> 0.///"3(=(=>>I K+C+1F1FJJ	#Ix/E/EFFJ  S,Y8N8NPQRR
	z5#5d#;#;SAAAAAr   c                    t          | t                    r| j        } t          | t          j                  s"J dt          |           dt
                      t          j        |           }t          j        |           }|                                }fd} |d          }|} |d          }t          |          }t          |          }	t          j        ||	          }t          j        | |            |d          }|ryt          |          rjt          |          }
t          j        ||
          }d}t!          |
          D ]}||         }t          j        ||            t          j        ||            |d          }|rt          |          rt          |          }
t          j        ||
          }t!          |
          D ]}t          j        |||                    t          j        ||t+          d	          t+          d
                      |d          }|rt          |          rt          |          }
t          j        ||
          }d}t!          |
          D ]}||         }t          j        ||            t          j        ||t+          d          t+          d                      |d          }|2t-          |          }t          j        |t+          d          |            |d          }|Lt-          |          }t          j        |          }||k    r#t          j        |t+          d          |           |t          j        k    r2 |d          }|}|r#t          j        |t+          d          |            |d          }|}t          j        ||           |t          j        t          j        fv r |d          }t=          | |            |d          }t?          |          }t          j        ||t+          d	          t+          d                      |d          }|}t          j        |t          j         |          t+          d	          t+          d                      |d          }t-          |          }t          j        |t+          d          |           t          j!        |t+          d                     t          j!        |t+          d                      |d          }||t          j        k    r|t          j"        z  }n?|t          j#        k    r|t          j$        z  }n|t          j%        k    r|t          j&        z  }t          j        |t+          d           |            |d!          }t-          |          }|rt          j'        ||            |d"          }tQ          |t+          d#          t          j)                    |            |d$          }tQ          |t+          d%          t+          d&          |            |d'          }tQ          |t+          d%          t+          d(          |            |d)          }tQ          |t+          d%          t+          d*          |            |d+          }tQ          |t+          d%          t+          d,          |            |d-          }tQ          |t+          d%          t          j*        d.          |            |d/          }tQ          |t+          d%          t          j*        d0          |            |d1          }t-          |          }|t          j#        k    r|s<t          j+        ||d2d3           t          j,        |t+          d4          d2           nt          j-        |          }|j.        rPt          j/        |          }t          j+        |||d3           t          j,        |t+          d4          |           nc|r#t          j,        |t+          d4          |           n<|t          j0        k    r|d5u s|d6k    rt          j-        |          }t          j/        |          }t          j+        |||d3           t          j,        |t+          d4          d6           t          j,        |t+          d*          d6           nt          j,        |t+          d4          d2           t          j,        |t+          d*          d2           nU|rSt          j+        |||d3           |t          j        t          j        fv r"t          j!        |t+          d7                     t          j1        |            t          j2        | d3           t          j3        | d3           t          j4        |            dS )8z
    Update the PDF form field with the properties from a Python Widget object.
    Called by "Page.add_widget" and "Annot.update_widget".
    ztype(annot)=r  c                 &    t          | d           S r   )r   )r   r  s    r   GETATTRz)JM_set_widget_properties.<locals>.GETATTR	D  s    vtT***r   r	  r   r  r   r	  r  rQ  r{  r  r  r	  Nr  r	  r  r	  MaxLenr	  r	  r	  r	  r	  r
  r	  r
  DSRCr	  r  r	  r  rP  r	  r  r  r	  ro  r	  r  r	  r  r	  r  r	  r  r	  r	  r   r	  Tr
  r  )5rz   r   r   rf   r   r   r   r   r   r  re  rf  rn  rn
  r-  r  r  r  pdf_field_set_fill_colorr  r  r   r
  r=  r  r8  r  pdf_field_set_displayr9  r:  r  r  r  r  r  r	  r  r
  r  pdf_field_set_button_captionr  r  r  pdf_set_field_valuer  pdf_button_field_on_stater   r@  r
  r  pdf_set_annot_hotpdf_set_annot_activer  )r   r  r   r   r!  r  r   r	  r   rot_matrF  fill_colr&  rq   r  
border_colrG  r   old_namer	  r  r   r	  rW  r	  r   r:   onstater  s    `                           r   JM_set_widget_propertiesr  C  s	   
 5%   
uen--HH/H$u++/H/H/H/HHHH&&D#E**I
((**C+ + + + + GL!!EJ GFOOE5!!D#D))G"411D	UD))) GL!!E <!%(( <JJ&sA..q 	5 	5A(C%h4444&y(;;; GO$$E N!%(( NJJ$S!,,q 	7 	7A$VU1X6666Ivx~~x}}MMM GN##E S!%(( SJJ(a00
q 	7 	7A(C%j#6666Iz8D>>8D>>RRR GM""E IU##&y(4..%HHH GL!!E KE"",Y778 	K*9hsmmTJJJ U// O&& 	O"9hx.@.@+NNNGO$$EA		1--- e3U5STT ,((eU+++ GN##E
e
$
$C		3FFF GN##EL	|,,TNNSMM	   GJE	e		B	"9htnnbAAA	y(4..111	y(4..111 '-((K H77 	=566KK5<< 	=577KK577 	=5<<K	8D>>;GGG G$%%E	e		B	 :*9b999 GHE)Xc]]ELNNEBBB GO$$E)Xd^^Xc]]EBBB GO$$E)Xd^^Xc]]EBBB GO$$E)Xd^^Xc]]EBBB GM""E)Xd^^Xc]]EBBB GM""E)Xd^^U-?-E-EuMMM GN##E)Xd^^U-?-E-EuMMM GM""EDU66 = 	I%c9eQ???#Ix~~uEEEE 5i@@G! I&w//)#y"a@@@'	8D>>2FFFF I'	8D>>4HHH	u5	5 =D= 	FDEM 	F5i@@G"7++B%c9b!<<<#Ix~~uEEE#Ix}}eDDDD#YFFF#YuEEEE 	=%c9dA>>>e<e>[\\ ="9hsmm<<<	%   	E1%%%	ua(((	5!!!!!r   c                    d}|t          |          k     rt          j        ||d                    \  }	}
||	z  }t          j        ||
          }|dk    rt          j        ||
d|          \  }}n|}t          j        | ||||
||||	  	         t          j        |||          }|dk    rt          j        ||d          }nt          j        |d|           }|t          |          k     |S rW   )r-  rf   fz_chartoruner  r  fz_show_glyphri  fz_pre_translate)r:   	user_fontr  r/  r  
bidi_levelr  r  rq   r  ucsr  r/  rm  s                 r   r  r  D  s
    	
A
c!ff* 7$QqrrU++3	Q*9c::!8 	?	3PQS[\\ICDD$S#uj*V^___$T366A: 	7(c155CC(a#66C c!ff* 7 Jr   c                     t          j        |           }|                    d          }|                    t	          d                    }|dk    r
|d |         }|S )Nr  r  r   )rf   r  rD  ri   r  )r$  
buff_bytesr   rX  s       r   r  r  D  s]    -d33J


9

-
-CQAAv "1"gJr   c                 *    t          d|             dS )z
    Generate a warning.
    z	warning: Nr  rA   s    r   r   r   D  s!     r   c                    t          j        |          \  }}|}|dk    rBt          |          }t          |t           j                  sJ t          j        |          \  }}||k     rK|rI|dk    rCt          j        |t           j        t           j                   t          j        | ||d           dS t          j        | ||d           dS )zD
    update a stream object
    compress stream when beneficial
       r   r   N)	rf   r  r  rz   r  r  PDF_ENUM_NAME_FilterPDF_ENUM_NAME_FlateDecoder5  )r   r   r   rI  rE  r  nlenr  s           r   r   r   D  s    
 %g..GD!Dby 0!'**$/////)$//ad{ 6t 6! 6*/	 	 	
 	S$22222S'155555r   c                    t          |t          j                  sJ dt          |                      |dk    rt          j        | |d          }n4t          j        |j                  }|                                }t          j        t          j	        |t          d                              }t          j	        |t          d                    }|j        rt          j        ||          }	nt          j        | |          }	t          |          }
t          j        | |t          j                    t          j        d          |
          }t%          | ||
d           t          j        |t          d          |	           |S )zl
    Make an XObject from a PDF page
    For a positive xref assume that its object can be used instead
    ztype(gmap)=r   ri  r   r   )rz   rf   PdfGraftMapr   rF  r   r   r   r  r  r   r   pdf_graft_mapped_objectpdf_graft_objectr  r,  r9  r  r   r  )r  fsrcpager   gmapr1  srcpagespagerefr  ri  r(  r   s              r   r+  r+  E  sY   
 dE-..@@0@4::0@0@@@@ax D&vtQ77-hm<<;;==$U%CHhWaNbNb%c%cdd*8Xk5J5JKK? 	:5dA>>II.vq99I x((
 %fh8H8H%,WX//[^__Q/// 	5(;"7"7CCCLr   c                 :    t          | t          t          f          S r   )rz   r|   r{   r  s    r   rn
  rn
  &E  s    a%'''r   c                      t          |           S r   )r-  r  s    r   rq
  rq
  *E  s    q66Mr   zbad annot typezbad or missing annot AP/Nz%arg must be seq of seq of float pairszbad seq of pointszbad type: 'buffer'zbad color sequencer  zbad filetypezbad locationzbad config numberzbad layer numberzbad 'oc' referencezbad page idr  zPDF has no rootzrect is infinite or emptyzbad type: 'text'rA  zcolor count failedzneed font file or bufferzcannot create fontzis no annotationzis no imager  zobject is no PDF dictzsource pixmap has no alphazpixel(s) outside imager   c                      t          |           r   )r   )r  excs     r   rx  rx  PE  s     S//r   strictc                     | sdS t          | t                    r|                     d|          }nt          | t                    r
| d d          }|                    d|          }|S )Nr(   r  r  raw_unicode_escape)rz   r   r  r   rD  )r/  r  rh   rN   s       r   r  r  VE  sr     r!S XXfVX,,	Au		 qqqT
))()
8
8CJr   c                     | rct          |           t          t          fvs7t          |           dvs&t	          |           dk     st          |           dk    rt          d          d S d S )Nr'  r   r   z/need 1, 3 or 4 color components in range 0 to 1)r   r{   r|   r-  r  r  r   ry  s    r   r,  r,  bE  s     PGGD%=(	P1vvY&	P 1vvz	P 1vvz		P NOOOP P	P 	Pr   r   r   c                 T    |                                  D ]}|d         |k    r|c S dS )zGReturn an entry in the page's font list if reference name matches.
    r  N)r  )r   r   r  s      r   r5  r5  mE  sF     ^^  Q48 	HHH	 r   c                 :    | j         D ]}||d         k    r|c S dS )z3Return a font info if present in the document.
    r   N)r  )r   r   r  s      r   r6  r6  uE  s=     ]  1Q4< 	HHH	 r   r
  c                     t          |           rt          |           }|j        fS t          |           r| fS | D ]/}t          |          st          |          st	          d          0| S )Nzbad quads entry)r  r   r  r  r   )r
  r   r
  s      r   rH  rH  }E  s}     KKy x 0 0! 	0	! 	0.///Lr   c                    t          |           sdS t          |           t          t          fv rt	          |           dk    st          d          t	          | d                   dk    rt	          | d                   dk    st          d          | d         d         | d         d	         cxk    rdk    sn t          d
          dS )NFry   z$morph must be a sequence of length 2r   r   r   zinvalid morph parm 0r  r
   zinvalid morph parm 1T)r  r   r{   r|   r-  r   r  s    r   r  r  E  s    77 uGGe}$ AQ1 A?@@@!IIN 1s1Q4yyA~ 1/000Q47ad1g 1 1 1 1 1 1 1 1/0004r   c                     d S r   )r  r   r   r   r  s    r   r-  r-  E  s    
Fr   r
  c                     	 t          |           }n*# t          $ r t          dk    rt                       Y dS w xY w|j        S )zkCheck whether an object is convex, not empty  quad-like.

    It must be a sequence of 4 number pairs.
    r   F)r  r   r   rF   rV  )r
  q0s     r   r  r  E  sV    
!WW   !#8(8(8(8uu <    #99r   c                     	 t          |           } n*# t          $ r t          dk    rt                       Y dS w xY w| j        p| j         S )zbCheck whether an object is non-degenerate rect-like.

    It must be a sequence of 4 numbers.
    r   F)r   r   r   rF   r
  r
  r  s    r   r  r  E  s`    
GG   !#8(8(8(8uu 
+am,,r"  r  c                    | sdS t          | d          r| f} t          |            t          |           dk    r(t          | d                   dz   }|dk    r|dz   n|dz   S t          |           d	k    r/t          t	          |                     dz   }|dk    r|d
z   n|dz   S t          t	          |                     dz   }|dk    r|dz   n|dz   S )Nr(   r&  r   r   rl   ry  zG zg r   zRG zrg zK zk )r  r,  r-  r}   r|   )ry  r  r/  s      r   r  r  E  s     rq+ DqMMM
1vv{ 2adOOc!81q4xxT1
1vv{ 4eAhh#%H3q5yy!e)3%((c!ACx-1t88QX-r   c                 (   |                                  t                    fd}	 dk    r5t          j                                        t          d          d           t          j        |          }|D ]&}t          |          }t          j        ||           't          j	        |           t          |d            |             n0# t          $ r# t          rt                        |             Y d S w xY wt          |          S )Nc                      dk    r7t          j                                         t          d                     d S d S )Nr   r   )rf   r  r   r   )rh  r
  s   r   r  z$Page__add_text_marker.<locals>.finalE  sG    q= 	P"7;;==(82D2DhOOOOO	P 	Pr   r   r   rP  )r]
  rX  rf   r  r   r   r^
  r
  pdf_add_annot_quad_pointr  r`
  r   r   rF   r   )	r]   r
  r  r  r   r   r
  rh  r
  s	          @@r   r
  r
  E  s9   nnG((HP P P P P Pq= 	I"7;;==(82D2DaHHH&w
;; 	5 	5D%%A*5!4444u%%%s###   4N$4$4$4 <<s   B'C )DDc                 `    t          | t                    sJ t          t          d|            S )Nr  )rz   r   r   rf   r6  s    r   r   r   E  s1    a5.1..///r   r  c                     |d         }d}t          | j                  D ]\  }}|d         |k    rd} n|r|| j        |<   d S | j                            |           d S )Nr   FT)r  r  r6   )r   r  r   rh  rq   fis         r   UpdateFontInfor+  E  s    7DE3=))  2a5D= 	EE	  #aT"""""r   c                 "   d}t          t          |                    D ]Z}||         }|t          |           k    rt          |t                    rd|v r7 dS |t          | |         |          s dS |dz  }[|t          |           k    rdS dS )z
    Returns true if <args> matches <types>.

    Each item in <types> is a type or tuple of types. Any of these types will
    match an item in <args>. `None` will match anything in <args>. `type(None)`
    will match an arg whose value is `None`.
    r   NFr   T)r  r-  rz   r|   )r  rv  rI  rq   r"  s        r   r  r  E  s     	
A3u:: 
 
aD		> 	%'' DEM uu 	ZQ%?%? 	55	QCII~ u4r   c                     t          |          }t          j        |          }|j        |j        z
  }|j        |j        z
  }|}	|}
|rt          | |          }| |z  }||z  }ndx}}t          ||          }|dk    r|dk    r|}|}|}|dk     r||z  ||z  k    r||z  }	|}
n.|}	||z  }
n&||k    r||z  ||z  k    r||z  }	|}
n|}	||z  }
n|}	|}
t          j	        |j        |j        z   dz  |j        |j        z   dz            }t          j
        dddddd          }t          j        ||          }t          j        |t          j        |	|
                    }t          j        |t          j        |j        |j                            }|S )z*
    # compute image insertion matrix
    r   r   r  ry   g      )r  rf   	fz_rotater  r  r  r  r  r  r  r  r  fz_scalefz_translater  r  )r  r  r  r   keeptrectr  trwtrhr   r  largefwfhsmallr  tmpr=  s                     r   r
  r
  	F  s    BE
/&
!
!C
(UX
C
(UX
CAA E6""U]e^RBKKE{ v} 	Av 8cBh 	eAAAAeAA	r 	8cBh 	eAAAAeAA

X A%X A% C 
q!Q4
6
6C
/#s
#
#C
/#u~a33
4
4C
/#u1#%??
@
@CJr   c                     | j         j        dk    rc| j         j        j        dk    rN| j         j        j        dk    r9|j         j        j        | j         j        j        j        |j         j        dz  z
  k     S dS )Nr   r   r  )r   r  r?  r  r  r.  
first_charr  )r=   r  s     r   r  r  :F  ss    ! gdo&9&;q&@ gT_EXEZ^_E_ g}#%(B(I(KbmN`cfNf(fff1r   c           	          |  dt          |            dt          t          |                      d}t          |           D ]}|d| dz  }|S )Nrl    (z):
r  r  )r   r-  r?  )r  rN   rq   s      r   dir_strr>  @F  s`    
-
-a
-
-CAKK
-
-
-CVV  |a|||Jr   r  r  r_  c                    |                      d          r|                     d          r| S t          |           sdS |rK d                    d | D                       }n!d                    fd| D                       }d|z   dz   S |dk     r"d                    fd	| D                       }nd                    d
 | D                       }d|z   dz   S )a   Return a PDF string enclosed in [] brackets, suitable for the PDF TJ
    operator.

    Notes:
        The input string is converted to either 2 or 4 hex digits per character.
    Args:
        simple: no glyphs: 2-chars, use char codes as the glyph
                glyphs: 2-chars, use glyphs instead of char codes (Symbol,
                ZapfDingbats)
        not simple: ordering < 0: 4-chars, use glyphs not char codes
                    ordering >=0: a CJK font! 4 chars, use char codes as glyphs
    z[<z>]z[<>]Nr(   c                 \    g | ])}t          |          d k     rdt          |          z  nd*S )rb  %02xb7r  rM	  s     r   rr   zgetTJstr.<locals>.<listcomp>\F  s5    TTT!s1vv|EFSVVOOTTTr   c                 v    g | ]5}t          |          d k     rdt          |                   d         z  nd6S )rb  rA  r   rB  r  rp   ry  r  s     r   rr   zgetTJstr.<locals>.<listcomp>_F  sA    TTT!s1vv|E&Q.+++TTTr   r   c                 L    g | ] }d t          |                   d         z  !S )%04xr   r  rD  s     r   rr   zgetTJstr.<locals>.<listcomp>eF  s-    AAAqA!22AAAr   c                 2    g | ]}d t          |          z  S )rF  r  rM	  s     r   rr   zgetTJstr.<locals>.<listcomp>gF  s"    666AQ666r   )r   r  r  r  )r:   r  r  r_  otxts    `   r   r  r  GF  s    t t!4!4 :: v " 	77TTtTTTUUDD77TTTTtTTT D d{T!! !| 8wwAAAADAAABBww6666677$;r   r/  c                 b   t          |           sdS d }d}| D ]}t          |          }|dk    r ||           c S |dk    r|dk     r|dv r|dz  }||z  }?|dk    r	|d	|z  z  }N|d
k    r|dz  }Z|dk    r|dz  }f|dk    r|dz  }r|dk    r|dz  }~|dk    r|dz  }|dz  }d|z   dz   S )a   Return a PDF string depending on its coding.

    Notes:
        Returns a string bracketed with either "()" or "<>" for hex values.
        If only ascii then "(original)" is returned, else if only 8 bit chars
        then "(original)" with interspersed octal strings 
nn is returned,
        else a string "<FEFF[hexstring]>" is returned, where [hexstring] is the
        UTF-16BE encoding of the original.
    z()c                 z    t          ddg          t          | d          z   }d|                                z   dz   S )Nr0  r~  zUTF-16BE<>)r3  hex)r/  r   s     r   make_utf16bez!get_pdf_str.<locals>.make_utf16beyF  s9    sCj!!Ia$<$<<QUUWW}s""r   r(   r~     r  )rn  rp  r  r  z\%03ore	  z\br  z\trF  r  r  z\fr1  z\rz\267rn  rp  )r  r  )r/  rN  r   ry  r  s        r   r7  r7  lF  sL    77 t# # # 	A  VV8 	#<??"""7 	rCx 	$$ T	FA8 	BA 7 	JAA1W 		JAA2X 	JAA2X 	JAA2X 	JAALAA7S=r   c                     t          j        d          } | | S t          j        dk    rd}nd}t           j                            |          r|S 	 ddl}t          j        dk    r|                    dddd	          }|j        	                                }|j
        s|st          d
           dS t           j                            |          }t           j                            |d          }t           j                            |          r|S t          d           dS |                    dddd	          }|j        	                                                                }|j
        st          |          dk    rt          d
           dS d}|                                D ]?}|                                D ](}t#          |                              d          r|} n)@||S t          d           dS )a  Detect Tesseract-OCR and return its language support folder.

    This function can be used to enable OCR via Tesseract even if the
    environment variable TESSDATA_PREFIX has not been set.
    If the value of TESSDATA_PREFIX is None, the function tries to locate
    Tesseract-OCR and fills the required variable.

    Returns:
        Folder name of tessdata if Tesseract-OCR is available, otherwise False.
    r   Nwin32z'C:\Program Files\Tesseract-OCR\tessdataz&/usr/share/tesseract-ocr/4.00/tessdatar   zwhere tesseractr   )shellcapture_outputr
  zTesseract-OCR is not installedFr  z2unexpected: Tesseract-OCR has no 'tessdata' folderzwhereis tesseract-ocrry   z2unexpected: tesseract-ocr has no 'tessdata' folder)r   getenvr  platformr1   r  
subprocessr  stdoutstrip
returncoderB   dirnamer  rl  r-  iterdirr   r  )r   r  rV  r	  r  rZ  sub_responsesub_subs           r   get_tessdatar^  F  s    i 122O 
|w <?;	w~~h  
|w ^^-QqPQ^RR9??$$= 	 	45555'//(++7<<447>>(## 	OHIII5 
/qRS	T	TBy  &&((H	} H* 0111u H ((**  #++-- 	 	G7||$$Z00 "  DEEEur   )CSSr  r   fontcoder_  r  c                    d}t          |          t          urt          d          |d} fdt                                          D             }|g k    rt          d  d          t          |          dk    rt          d	          | }|D ]]}t          |         }|d
         }|d         }	 |d                     }
|                    |
|           |rdnd}|	rdnd}||||||fz  z  }^|S )a  Create @font-face items for the given fontcode of pymupdf-fonts.

    Adds @font-face support for fonts contained in package pymupdf-fonts.

    Creates a CSS font-family for all fonts starting with string 'fontcode'.

    Note:
        The font naming convention in package pymupdf-fonts is "fontcode<sf>",
        where the suffix "sf" is either empty or one of "it", "bo" or "bi".
        These suffixes thus represent the regular, italic, bold or bold-italic
        variants of a font. For example, font code "notos" refers to fonts
        "notos" - "Noto Sans Regular"
        "notosit" - "Noto Sans Italic"
        "notosbo" - "Noto Sans Bold"
        "notosbi" - "Noto Sans Bold Italic"

        This function creates four CSS @font-face definitions and collectively
        assigns the font-family name "notos" to them (or the "name" value).

    All fitting font buffers of the pymupdf-fonts package are placed / added
    to the archive provided as parameter.
    To use the font in pymupdf.Story, execute 'set_font(fontcode)'. The correct
    font weight (bold) or style (italic) will automatically be selected.
    Expects and returns the CSS source, with the new CSS definitions appended.

    Args:
        fontcode: (str) font code for naming the font variants to include.
                  E.g. "fig" adds notos, notosi, notosb, notosbi fonts.
                  A maximum of 4 font variants is accepted.
        CSS: (str) CSS string to add @font-face definitions to.
        archive: (Archive, mandatory) where to place the font buffers.
        name: (str) use this as family-name instead of 'fontcode'.
    Returns:
        Modified CSS, with appended @font-face statements for each font variant
        of fontcode.
        Fontbuffers associated with "fontcode" will be added to 'archive'.
    z1
@font-face {font-family: %s; src: url(%s);%s%s}
z'archive' must be an ArchiveNr(   c                 >    g | ]}|                               |S r    r.  )rp   rx  r`  s     r   rr   z(css_for_pymupdf_font.<locals>.<listcomp>G  s*    RRRq1<<;Q;QRRRRr   zNo font code 'z' found in pymupdf-fonts.r  zfontcode too shortr$  r8  r\  zfont-weight: bold;zfont-style: italic;)r   r  r   r  r  r-  r  )r`  r_  r  r   CSSFONT	font_keysfkeyr/  r$  r8  fbuff	bold_textitalic_texts   `            r   css_for_pymupdf_fontri  F  sI   R DG==G# 97888
  SRRR05577RRRIB OM(MMMNNN
9~~ /-...  > >#D)F|hX  E4   ,08((b	/5=++2w$i===Jr   r   r  c                    |                                 }t                              |d          }d|dk    rt          |dk    rt           t          fd| D                       }||z  S |t                                          v rt          | t          |         ||          S |dv rt          |           |z  S t          d|z            )a  Calculate length of a string for a built-in font.

    Args:
        fontname: name of the font.
        fontsize: font size points.
        encoding: encoding to use, 0=Latin (default), 1=Greek, 2=Cyrillic.
    Returns:
        (float) length of text.
    Nr  r  c                     g | ]>}t          |          d k     rt          |                   d         nd         d         ?S )rb  r   r^  r  rD  s     r   rr   z#get_text_length.<locals>.<listcomp>9G  sD    UUU1c!ffslFA""sAUUUr   )r  r  r  r1  r  r2  r  r3  zFont '%s' is unsupported)
r  r  r   symbol_glyphszapf_glyphsrR	  r  util_measure_stringr-  r   )r:   r   r   r  r  r   r  s         @r   get_text_lengthro  &G  s     ~~H""8T22HF8 >!  UUUUPTUUUVV8|?''))) 
"/(+Xx
 
 	
  	 	 
$ 4yy8##
/(:
;
;;r   r  c                 >   t          |           t          j        u r|                                 }nTt	          | d          r|                                 }n/t          |           t          t          fv r| }nt          d          t          
                    |          S )aG   Return basic properties of an image.

    Args:
        img: bytes, bytearray, io.BytesIO object or an opened image file.
    Returns:
        A dictionary with keys width, height, colorspace.n, bpc, type, ext and size,
        where 'type' is the MuPDF image type (0 to 14) and 'ext' the suitable
        file extension.
    rI  zbad argument 'img')r   r4  r5  rM  r  rI  r   r3  r   r   image_profile)r  r  s     r   rq  rq  PG  s     CyyBJ /	f		 /	cui(	( /-...v&&&r   c                     t           j        t                    sJ t           j                  s j        rK j        J  t           j         j                   j                  }|st          d           d _        dS  fd}t           j        t                    sJ t           j                  }|dk    r
 |            S  j        t                   }|dk    r
 |            S  j        |dz
           }|t                   }|dk    r
 |            S |t                   } j        t                   }||k    r
 |            S 	  j                                        D ]\  }	}
|	|vr|
||	<   d}n'# t          $ r t          rt                       d}Y nw xY w|dk    r%d	|t          <    j                                         dS t          d
            |             dS )aq  
    Append current path to list or merge into last path of the list.
    (1) Append if first path, different item lists or not a 'stroke' version
        of previous path
    (2) If new path has the same items, merge its content into previous path
        and change path["type"] to "fs".
    (3) If "out" is callable, skip the previous and pass dictionary to it.
    Nr   z2calling cdrawings callback function/method failed!c                       j                              j                                                    j                                         d S r   )r1  r6   pathdictr  r  )r
  s   r   r6   zjm_append_merge.<locals>.appendG  s?    s|((**+++r   r/  r   r  r   r  z$could not merge stroke and fill path)rz   r1  r{   r  r  r   rt  rB   r-  rR  dictkey_itemsrt  r   r   rF   r  )r
  respr6   rE  thistyper  prevtype	previtems	thisitemsrx  rM   rh   s   `           r   jm_append_merger{  fG  s/    cgt$$$$$ 
 sz : 	>H 0737CJ//==D 	JHIII     cgt$$$$$sw<<Dqy vxx|\*H3 vxx7DFD\"H3 vxxm$Im,II vxxL&&(( 	 	DAq} Q   4N$4$4$4 
Qw "l6777s   *E3 3!FFc                     | j         s+| j                            |t          |          f           d S | j                            |t          |          | j        f           d S r   )r  r  r6   r.  
layer_name)r
  rC
  r   r  s       r   jm_bbox_add_rectr~  G  sc    : J
D/$"7"7899999
D/$"7"7HIIIIIr   c                     t          j        t           j        j                  }t          j        |                                |          }t          | ||d           d S )Nz
fill-image)rf   r/  r  ll_fz_transform_rectr_  r~  )r
  rC
  r
  r  r  color_paramsr   s          r   jm_bbox_fill_imager  G  sJ    U\,--A"AJJLL#66Ac3<00000r   c                     	 t          | |t          j        t          j        |          d           d S # t          $ r t
          rt                        w xY w)Nzfill-imgmask)r~  rf   r  fz_unit_rectr   r   rF   )r
  rC
  r
  r  r  r  r  r  s           r   jm_bbox_fill_image_maskr  G  sb    #sE$>u?QSV$W$WYghhhhh   4N$4$4$4s	   /3 !Ac	           	          |rdnd}	 t          | |t          j        |d |          d           d S # t          $ r t          rt                        w xY w)NTFz	fill-pathr~  rf   ll_fz_bound_pathr   r   rF   	r
  rC
  r1   r  r  r  r  r  r  s	            r   jm_bbox_fill_pathr  G  sm    *ttUH#sE$:4s$K$K[YYYYY   4N$4$4$4s	   &0 !Ac                     	 t          | |t          j        ||          d           d S # t          $ r t          rt                        w xY w)Nz
fill-shade)r~  rf   ll_fz_bound_shader   r   rF   )r
  rC
  shader  r  r  s         r   jm_bbox_fill_shader  G  s]    #sE$;UC$H$H,WWWWW   4N$4$4$4s	   %) !A
c           	          	 t          | |t          j        |||          d           d S # t          $ r t          rt                        w xY w)Nzstroke-textr~  rf   ll_fz_bound_textr   r   rF   )r
  rC
  r:   r$  r  r  s         r   jm_bbox_stroke_textr  G  `    #sE$:D&#$N$NP]^^^^^   4N$4$4$4	   &* !Ac           	          	 t          | |t          j        |d |          d           d S # t          $ r t          rt                        w xY w)Nz	fill-textr  )r
  rC
  r:   r  r  s        r   jm_bbox_fill_textr  G  s_    #sE$:D$$L$LkZZZZZ   4N$4$4$4r  c           	      R    t          | |t          j        |d |          d           d S )Nzignore-text)r~  rf   r  )r
  rC
  r:   r  s       r   jm_bbox_ignore_textr  G  s+    c3 6tT3 G GWWWWWr   c	           	          	 t          | |t          j        |||          d           d S # t          $ r t          rt                        w xY w)Nzstroke-pathr  )	r
  rC
  r1   r$  r  r  r  r  r  s	            r   jm_bbox_stroke_pathr  G  r  r  c                 P   | j         t                   }t          |          }dgdz  }t          d          D ]W}||dz
  |z            }t	          |d                   }|j        ||dz  <   |j        ||dz  dz   <   t	          |d                   }X|j        |d         k    s|j        |d         k    rdS d| _        t          j	        |d         |d         |d         |d         |d         |d         |d         |d	                   }d
t          |          f}	|	||dz
  <   ||dz
  |= dS )a  
    Check whether the last 4 lines represent a quad.
    Because of how we count, the lines are a polyline already, i.e. last point
    of a line equals 1st point of next line.
    So we check for a polygon (last line's end point equals start point).
    If not true we return 0.
    r   re	  r  r   ry   r   r  r   r
   r  )rt  ru  r-  r  r\
  r  r  	linecountrf   r  r  )
r
  rt  rE  r  rq   r=   rX  lpr
  r   s
             r   jm_checkquadr  G  s;    L-(Eu::D	
aAAYY ) )dQhl#a))6!a%v!a%!)tQx((	tqt| rtqt|  q CM 	1Q41qtQqT1Q41qtQqTJJA/!$$%DE4!8tax$1r   c                    d| _         d}| j        t                   }t          |          }||dz
           }t	          |d                   }t	          |d                   }||dz
           }t	          |d                   }t	          |d                   }		 |j        |j        k    s0|j        |	j        k    s |j        |	j        k    s|j        |j        k    rdS |	j        |j        k     r.t          j        |	j        |	j        |j        |j                  }
d}n-t          j        |j        |j        |j        |j                  }
d}dt          |
          |f}|||dz
  <   ||dz
  |= dS )z}
    Check whether the last 3 path items represent a rectangle.
    Returns 1 if we have modified the path, otherwise 0.
    r   r   r   ry   r   r  )
r  rt  ru  r-  r\
  r  r  rf   rb
  r.  )r
  r  rt  rE  line0r  r  line2r  r}  r   r   s               r   jm_checkrectr  H  sj    CMKL-(Eu::D4!8E	5!9	%	%B	5!9	%	%B 4!8E	5!9	%	%B	5!9	%	%Btrt|trt| trt| trt|	 q 
tbd{ rtRT2466rtRT2466?1%%{3DE4!8tax$1r   c           
      V    |j         }	 |sd S t          | |||||||           |j        }"r   )headjm_trace_text_spanr  )	r
  r:   r"  r  r  r  r  seqnor  s	            r   jm_trace_textr  GH  sC    9D 	ECuc:ueUSSSy	r   c                 H   d}t          |t          j                  sJ t          j        |          }t          |t          j                  sJ t          j        |          }t          |                                          }	t          j        |	                                |          }
t          j
        t          j        dd          |
          }t          j        |j        |j        z  |j        |j        z  z             }t          j        |          }d}t#          |                                          }t%          |                                          }|dk     rd}d}||z  ||z
  z  }||z  ||z
  z  }d}t          j        |                                          }||t(          z  z  }|t          j        |                                          t,          z  z  }|t          j        |                                          t0          z  z  }|t          j        |                                          t4          z  z  }d}t          j                    }t          j        |j        |j        |j         |j        dd          }|j        dk    rd|_        g }t=          |j        j                   D ]}d}|!                    |          j"        dk    rJt          j#        |                                |!                    |          j"        |j        j$                  }||z  }|}|!                    |          j%        dk    r|}t          j        |!                    |          j        |!                    |          j                  }t          j&        ||          }t          j        dddd|j         |j                   }t          j        ||          }t          j        |t          j        dddd|j        |j                            }|j        }||z   }|
j        dk    r|j        dk    s'|j        dk    s|
j'        dk    r&|
j'        |
j(         k    r|j        |z   }|j        |z   }n|j        |z
  }|j        |z
  }t          j)        ||||          } t          j*        | |          } |+                    |!                    |          j%        |!                    |          j"        |j        |j        f| j,        | j-        | j.        | j/        ff           |dk    rt          j0        ||           }| }tc          |          }|sl|sht          j2        |                                ddd          \  }!}t          j#        |                                |!|j        j$                  }||z  }|s|}n|}tg                      }"ti          |          |"d	<   tk          |	          |"d
<   |j        j$        |"d<   ||"d<   |j        j6        |"d<   |j        j7        |"d<   ||"d<   ||"d<   d|"d<   |rzt          j8        t          j9        t          j:        |                    |t          j;                    t          j9                    t          j<                              }#|#dd         }#nd}#| j=        dk    r| j=        }$n|dz  }$|#|"d<   ||"d<   ||"d<   |$|"d<   ||"d<   ||"d<   t}          |          |"d<   | j?        |"d<   ||"d<   ||"d<   | j@        +                    |"           dS )z
    jm_trace_text_span(fz_context *ctx, PyObject *out, fz_text_span *span, int type, fz_matrix ctm, fz_colorspace *colorspace, const float *color, float alpha, size_t seqno)
    Nr   r   re  r  r  r   r0  r?  r/  r  r  bidi_lvlbidi_dirr  r  r   r  r	  r  r  r  r  	linewidth
spacewidthr   r   layerr  rV  )Arz   rf   fz_text_span
FzTextSpan	fz_matrixr9  rF  r/  r  r  fz_transform_vectorr  rP	  rQ	  r  r  fz_normalize_vectorr  r  r  r  r  r  r  r  r  r  r/  r  r  r  r   r-  rt  r  ri  r  r  r  r  ry  rb
  rf  r6   r  r  r  r  rN  r|   r  r   r6  rz  r   r  fz_convert_colorrn  rj  r  ru  r  r.  r}  r1  )%r
  r  r"  r  r  r  r  r  out_fontr   r=  r?  r  	space_advr  r  ascsizedscsizefflagsr  last_adv	span_bboxr  rV  rq   rm  	char_origro	  r  r  r  r  	char_bboxry  	span_dictr  r  s%                                        r   r  r  PH  s    HtU/00000T""DsEO,,,,,
.#

CTYY[[))H /$((**c
*
*C

#E$71$=$=s
C
CCIcecemcecem344E

#C
(
(CI
DIIKK
(
(C
TYY[[
)
)C
Tz  EkS3Y'GEkS3Y'GF&		44D
d)))F
e%tyy{{336FFFF
e$diikk225FFFF
e#TYY[[11NBBFH I

suceceVSUAq
A
AC
u{ EDO'(( ." ."::a==! 	a($))++tzz!}}7H$/J_``Cu::a==" 	I'

1AII	,Y<<	!!Q1y{lY[LII_R%%_R1aIK!U!UVV[#X		' #
		'.1erk		' !		' !$#%		'
 w&Bw&BBw&Bw&B&r2r266	+Ir::	JJqMM%JJqMM%!!
 "!!!		 	 	  q5 	"+IyAAII!II%LLE ! 	!A499;;PRTUWXYYKAx.IIKKO) I
 I %$	 I I(--Iu,X66Iv//IwIw O6Iz!_7Iz Iz!I{ I| 
$"E$?$L$LMM#%%"$$#%%  "1"g
}q !M		DL	 IwIv!Iy'I{(I|Iv(33Iv.IwIwIwGNNIr   c                 4   | r	 t          j        t           j        j                  }t          j                    }t          j        | ||j        d |                                          }n$# t          $ r t          rt                        w xY w|d d         S dS )Nr   r    )
rf   rn  rt  ru  ll_fz_convert_colorr   r_  r   r   rF   )r  r  r  r	  r  s        r   jm_lineart_colorr  H  s     	 #U%7%ABBB$&&B+MKKMM CC  	 	 	#8(8(8(8	 2A2w2s   A%A* *!Bc                 V    t          | j        t                    rg | _        g | _        d S r   )rz   r1  r{   scissorsr
  rC
  s     r   jm_lineart_drop_devicer  I  s(    #'4   CLLLr   c	                 p   |rdnd}	 t          |t          j                  sJ t          j        |          | _        t
          | _        t          | ||           | j        d S d| j        t          <   || j        d<   || j        d<   t          ||          | j        d<   t          | j                  | j        t          <   | j        | j        d<   | j        | j        d<   | j        r| j        | j        d	<   t%          |            | xj        d
z  c_        d S # t&          $ r t(          rt+                        w xY w)NTFr  r  r  r   r  r  r  r   )rz   rf   r  r9  r  trace_device_FILL_PATH	path_typejm_lineart_pathrt  rR  r  r.  pathrectdictkey_rectr  r}  r  rH  r{  r   r   rF   r  s	            r   jm_lineart_fill_pathr  
I  s@     *ttUH300000.#&&.c4(((< 	F &)l#$,j!(-n% !1*e D Df&5cl&C&Cl#!$g!$g9 	/%(YCL'"		Q				   4N$4$4$4s   AD #B/D !D5c           
      ^    	 t          | |d||||| j                   | xj        dz  c_        d S )Nr   z
type(ctx)=z ctx=z
type(dev)=z dev=ztype(text)=z text=z
type(ctm)=z ctm=ztype(colorspace)=z colorspace=ztype(color)=z color=ztype(alpha)=r  ztype(color_params)=z color_params=r   )r>   r   r  r  )r
  rC
  r:   r  r  r  r  r  s           r   jm_lineart_fill_textr  1I  s:    6 #tQZsyIIIIINIIIIr   c           
      \    t          | |d|d d d| j                   | xj        dz  c_        d S )Nr   r   r  r  )r
  r:   r  s      r   jm_lineart_ignore_textr  ?I  s3    #tQT4CI>>>IINIIIIr   c                   6     e Zd Z fdZd Zd Zd Zd Z xZS )Walkerc                     t                                                       |                                  |                                  |                                  |                                  || _        d S r   )r   r^   use_virtual_movetouse_virtual_linetouse_virtual_curvetouse_virtual_closepathr
  )r]   r
  r@
  s     r   r^   zWalker.__init__GI  sl    !!!!!!  """""$$$r   c                 <   	 | j         j        dk    rt          | j                   rd S d| j         _        | j         j        r| j         j        | j         j        k    rsdt          | j         j                  t          | j         j                  f}| j         j        t                   	                    |           | j         j        | j         _        d| j         j        d<   nd| j         j        d<   d| j         _        d S # t          $ r t          rt                        w xY w)Nr   r   r  Fr  T)r
  r  r  havemove	lastpoint
firstpointr6  rt  ru  r6   r   r   rF   )r]   rC
  r   s      r   	closepathzWalker.closepathOI  s   	x!Q& )) F!"DHx  
78%)<< =!1$(2D!E!E!1$(2E!F!FHDH%m4;;DAAA)-)<DH&16!+.. 37!;/ !"DH 	 	 	#8(8(8(8	s   $C: CC: :!Dc                    	 d| j         _        t          j        ||          }t          j        ||          }	t          j        ||          }
t          j        || j         j                  }t          j        |	| j         j                  }	t          j        |
| j         j                  }
t          j        | j         j        |          | j         _        t          j        | j         j        |	          | j         _        t          j        | j         j        |
          | j         _        dt          | j         j	                  t          |          t          |	          t          |
          f}|
| j         _	        | j         j
        t                                       |           d S # t          $ r t          rt                        w xY w)Nr   ry  )r
  r  rf   r  r  r  fz_include_point_in_rectr  r6  r  rt  ru  r6   r   r   rF   )r]   rC
  r  r  x2y2x3y3r  r  r7  r  s               r   curvetozWalker.curvetokI  s|   	!"DH$R,,B$R,,B$R,,B)"dhl;;B)"dhl;;B)"dhl;;B % >tx?PRT U UDH % >tx?PRT U UDH % >tx?PRT U UDH $TX%788$R(($R(($R((E "$DHH}-44e<<<<< 	 	 	#8(8(8(8	s   FF" "!Gc                 l   	 t          j        t          j        ||          | j        j                  }t          j        | j        j        |          | j        _        dt          | j        j                  t          |          f}|| j        _        | j        j	        t                   }|                    |           | j        xj        dz  c_        | j        j        dk    r+| j        j        t          k    rt          | j                   d S d S d S # t           $ r t"          rt%                        w xY w)Nr  r   r  )rf   r  r  r
  r  r  r  r6  r  rt  ru  r6   r  r  r  r  r   r   rF   )r]   rC
  r  r  r  r  rt  s          r   linetozWalker.linetoI  s.   	)5+>q!+D+DdhlSSB % >@QSU V VDH$dh&899$R((E
 "$DHH%}5ELL%   H!#x!Q& '48+=AW+W 'TX&&&&&' ' ' '  	 	 	#8(8(8(8	s   D
D !D3c                    	 	 t          j        t          j        ||          | j        j	                  | j        _
        t          j        | j        j                  r]t          j        | j        j
        j        | j        j
        j        | j        j
        j        | j        j
        j                  | j        _        | j        j
        | j        _        d| j        _        d| j        _        d S # t&          $ r t(          rt+                        w xY w)Nr   zself.dev.pathdict:z.    {type(n)=} {len(n)=} {n!r} {n}: {v!r}: {v}r   )rz   r
  rt  r   r>   rt  rf   r  r  r  r  rl  r  rb
  r  r  r  r  r  r   r   rF   )r]   rC
  r  r  rF  rM   s         r   movetozWalker.movetoI  s    	G	!&!9'1--HL" "DH ($(*;<< $)$6*,*,*,*,	% %! #'("4DH !DH!"DH 	 	 	#8(8(8(8	s   C%C* *!D)	r`   ra   rb   r^   r  r  r  r  rH
  r  s   @r   r  r  EI  st              8  6  *      r   r  c                    	 t          j        t           j        j                  | _        d| _        t          j        dd          | _        t                      | _        g | j        t          <   t          |           }t          j        t          j        t          j        |                    ||j                   | j        t                   s	d| _        dS dS # t          $ r t           rt#                        w xY w)a#  
    Create the "items" list of the path dictionary
    * either create or empty the path dictionary
    * reset the end point of the path
    * reset count of consecutive lines
    * invoke fz_walk_path(), which create the single items
    * if no items detected, empty path dict again
    r   N)rf   r/  r0  r  r  r  r  r   rt  ru  r  fz_walk_pathFzPathll_fz_keep_pathr   r   r   rF   )r
  rC
  r1   walkers       r   r  r  I  s    |U\%@AAq!,,vv')m$ EL)>t)D)DEEvvO`aaa|]+ 	 CLLL	  	    4N$4$4$4s   CC !C9c	                 R   	 t          |t          j                  sJ d| _        t	          |j                  t	          |j                  k    rt	          |j                  | _        t          j        |          | _        t          | _
        t          | ||           | j        d S d| j        t          <   || j        d<   t          ||          | j        d<   | j        |j        z  | j        t           <   |j        |j        |j        f| j        d<   | j        |j        z  | j        d<   d| j        vr
d| j        d<   |j        rt          j        d	          }	t          j        |	d
           t1          |j                  D ]I}
t          j        |j        |
          }t          j        |	t7          | j        |z             d           Jt          j        |	dt7          | j        |j        z                        |	| j        d<   n
d| j        d<   t;          | j                  | j        t>          <   | j         | j        d<   | j!        | j        d<   | j"        r| j#        | j        d<   tI          |            | xj!        dz  c_!        d S # tJ          $ r tL          rtO                        w xY w)Nr   r/  r  r  r  r  r  Frb  z[ rl   z] r  r  r  r  r  )(rz   rf   r  
pathfactorr  r   r  r9  r  trace_device_STROKE_PATHr  r  rt  rR  r  r  r{  	start_capdash_capend_caplinejoindash_lenr  r
  r  floats_getitem	dash_listr}   
dash_phaser.  r  r  r}  r  r  rH  r{  r   r   rF   )r
  rC
  r1   r$  r  r  r  r  r  r$  rq   r   s               r   jm_lineart_stroke_pathr  I  s   0300000su::SU# 	( ZZCN.#&&0c4(((< 	F&)l#*/&'!1:u!E!Eg'*~8H'Hm$ $i 
 %(NV_$Dj!cl* 	.(-CL% ? 	-&,,D"D$///FO,, W W ,f.>BB&3>E;Q1R1R.U.U.UVVVV"D*^y&J[9[/\/\*^*^___&*CL(##&,CL(#&5cl&C&Cl# #W!$g9 	/%(YCL'"		Q				   4N$4$4$4s   B#J 'GJ !J&c                    | j         sd S t          j        |          | _        t          | _        t          | ||           | j        d S d| j        t          <   t          |          | j        d<   d| j        vr
d| j        d<   t          t          |                     | j        d<   | j        | j        d<   | j        | j        d<   t          |            | xj        dz  c_        d S )	Nr  r  r  Fr  r  r  r   )r  rf   r9  r  trace_device_CLIP_PATHr  r  rt  rR  r  r.  compute_scissorrH  r}  r{  )r
  rC
  r1   r  r  r  s         r   jm_lineart_clip_pathr  J  s    9 nS!!CG*CMCd###
| "(CL, $XCL*#,& *$)[!-oc.B.BCCCLICLNCLCIINIIIIr   c                    | j         sd S t          j        |          | _        t          | _        t          | ||           | j        d S d| j        d<   d | j        d<   d| j        vr
d| j        d<   t          t          |                     | j        d<   | j
        | j        d<   | j        | j        d<   t          |            | xj
        d	z  c_
        d S )
Nr  rR  r  r  Fr  r  r  r   )r  rf   r9  r  trace_device_CLIP_STROKE_PATHr  r  rt  r.  r  rH  r}  r{  )r
  rC
  r1   r$  r  r  s         r   jm_lineart_clip_stroke_pathr  !J  s    9 nS!!CG1CMCd###
| #)CL #CL#,& *$)[!-oc.B.BCCCLICLNCLCIINIIIIr   c                 V    | j         sd S t          |            | xj        dz  c_        d S r'  r  r  rH  )r
  rC
  r:   r$  r  r  s         r   jm_lineart_clip_stroke_textr  5J  2    9 CIINIIIIr   c                 V    | j         sd S t          |            | xj        dz  c_        d S r'  r  )r
  rC
  r:   r  r  s        r   jm_lineart_clip_textr  <J  r  r   c                 V    | j         sd S t          |            | xj        dz  c_        d S r'  r  )r
  rC
  r
  r  r  s        r   jm_lineart_clip_image_maskr  CJ  r  r   c                     | j         r| j        sd S t          | j                  }|dk     rd S | j        d= | xj        dz  c_        d S )Nr   r   )r  r  r-  rH  )r
  rC
  rE  s      r   jm_lineart_pop_clipr	  JJ  sW    9 CL s|Dax RIINIIIIr   c                 *    |r	|| _         d S d| _         d S Nr(   r}  )r
  rC
  r   s      r   jm_lineart_begin_layerr  TJ  s      r   c                     d| _         d S r  r  r  s     r   jm_lineart_end_layerr  [J  s    CNNNr   c           	          | j         sd S dt          |          t          |          t          |          t          j        |          || j        | j        d| _        t          |            | xj        dz  c_        d S )Nr	  )r   r   isolatedknockoutrK  r  r  r  r   )	r  r.  r  rf   fz_blendmode_namerH  r}  rt  r{  )r
  rC
  r   r  r  r  rK  r  s           r   jm_lineart_begin_groupr  _J  s}    9 #D))XX0;;Y^	 	CL CIINIIIIr   c                 8    | j         sd S | xj        dz  c_        d S r'  )r  rH  r  s     r   jm_lineart_end_groupr  qJ  s$    9 IINIIIIr   c	           
      \    t          | |d||||| j                   | xj        dz  c_        d S r'  r  )	r
  rC
  r:   r$  r  r  r  r  r  s	            r   jm_lineart_stroke_textr  xJ  s3    #tQZsyIIIIINIIIIr   c	                 >    |j         | _         t          | |           d S r   )r  jm_increase_seqno)	r
  rC
  r1   r$  r  r  r  r  r  s	            r   jm_dev_linewidthr  }J  s"    $CMsC     r   c                 p    	 | xj         dz  c_         d S # t          $ r t          rt                        w xY wr'  )r  r   r   rF   )r
  rC
  vargss      r   r  r  J  sI    		Q				   4N$4$4$4s    !5r  r  c                 x    t          |           } t          |          }t          t          | |                    S )am  Compute matrix which maps line from p1 to p2 to the x-axis, such that it
    maintains its length and p1 * matrix = Point(0, 0).

    Args:
        p1, p2: point_like
    Returns:
        Matrix which maps p1 to Point(0, 0) and p2 to a point on the x axis at
        the same distance to Point(0,0). Will always combine a rotation and a
        transformation.
    )r  r<  r
  )r  r  s     r   r  r  J  s2     
rB	rB/"b))***r   c                   $     e Zd Z fdZd Z xZS )JM_image_reporter_Filterc                 p    t                                                       |                                  d S r   r  r  s    r   r^   z!JM_image_reporter_Filter.__init__J  s1    %%'''''r   c                     t          |t          j                  sJ t          | t          j        |          ||           t
          rdS d S rW   )rz   rf   r  r  r9  re   r  s        r   r  z%JM_image_reporter_Filter.image_filterJ  sQ    #u/////enS114??? 	 1	 	r   )r`   ra   rb   r^   r  rH
  r  s   @r   r   r   J  sG        ( ( ( ( (      r   r   c                   F     e Zd Z fdZeZeZeZ	e
ZeZeZeZeZeZeZ xZS )ru  c                    t                                                       || _        || _        |                                  |                                  |                                  |                                  |                                  | 	                                 | 
                                 |                                  |                                  |                                  d S r   )r   r^   r  r  use_virtual_fill_pathuse_virtual_stroke_pathuse_virtual_fill_textuse_virtual_stroke_textuse_virtual_ignore_textuse_virtual_fill_shadeuse_virtual_fill_imageuse_virtual_fill_image_maskuse_virtual_begin_layeruse_virtual_end_layer)r]   r  r  r@
  s      r   r^   z"JM_new_bbox_device_Device.__init__J  s    ""$$$$$&&&""$$$$$&&&$$&&&##%%%##%%%((***$$&&&""$$$$$r   )r`   ra   rb   r^   r  begin_layerr  	end_layerr  	fill_pathr  stroke_pathr  	fill_textr  stroke_textr  ignore_textr  
fill_shader  
fill_imager  fill_image_maskrH
  r  s   @r   ru  ru  J  s`        % % % % %  )K$I!I%K!I%K%K#J#J-OOOOOr   ru  c                   6     e Zd Z fdZd Zd Zd Zd Z xZS )r~  c                     t                                                       || _        |                                  |                                  |                                  |                                  d S r   )r   r^   rP  use_virtual_writeuse_virtual_seekuse_virtual_telluse_virtual_truncate)r]   rP  r@
  s     r   r^   z%JM_new_output_fileptr_Output.__init__J  sn       !!#####r   c                 8    | j                             ||          S r   )rP  r  )r]   rC
  r  whences       r   r  z!JM_new_output_fileptr_Output.seekJ  s    x}}ff---r   c                 8    | j                                         }|S r   )rP  tell)r]   rC
  rN   s      r   rB  z!JM_new_output_fileptr_Output.tellJ  s    hmmoo
r   c                 4    | j                                         S r   )rP  truncate)r]   rC
  s     r   rD  z%JM_new_output_fileptr_Output.truncateJ  s    x  """r   c                 `    t          j        ||          }| j                            |          S r   )rf   raw_to_python_bytesrP  rQ  )r]   rC
  data_rawdata_lengthrT  s        r   rQ  z"JM_new_output_fileptr_Output.writeJ  s(    (;??x~~d###r   )	r`   ra   rb   r^   r  rB  rD  rQ  rH
  r  s   @r   r~  r~  J  st        $ $ $ $ $. . .  # # #$ $ $ $ $ $ $r   r~  c                 >   | j         t                      | _         t          | j                   }|dk    r:| j         |dz
           }t          |          }t	          j        || j                  }n| j        }| j                             t          |                     |S )zt
    Every scissor of a clip is a sub rectangle of the preceeding clip scissor
    if the clip level is larger.
    Nr   r   )	r  r{   r-  r  rf   rt  r  r6   r.  )r
  num_scissorslast_scissorr  s       r   r  r  J  s    
 | vvs|$$La |LN3!,//)'3<@@,L00111Nr   c                   j     e Zd ZdZ f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eZeZeZe Z!e"Z# xZ$S )r  z?
    LINEART device for Python method Page.get_cdrawings()
    c                    t                                                       |                                  |                                  |                                  |                                  |                                  |                                  |                                  | j	         | j
         | j         |                                  |                                  |                                  |                                  |                                  |                                  |                                  |                                  || _        d| _        d| _        || _        || _        d | _        d| _        d | _        d| _        t;          j                    | _        t;          j                    | _         t;          j                    | _!        t;          j"                    | _#        t;          j"                    | _$        d| _%        t;          j&                    | _        d| _'        d| _(        d| _)        d S Nr   r(   )*r   r^   r%  r&  use_virtual_clip_pathuse_virtual_clip_image_maskuse_virtual_clip_stroke_pathuse_virtual_clip_stroke_textuse_virtual_clip_textr'  r(  r)  r*  r+  r,  use_virtual_pop_clipuse_virtual_begin_groupuse_virtual_end_groupr-  r.  r1  r  rH  r  r  r  r}  r  r  rf   r9  r  r  r  r  r  r  r  r/  r  r  r  )r]   r1  r  r  r@
  s       r   r^   z%JM_new_lineart_device_Device.__init__J  s    	""$$$$$&&&""$$$((***))+++))+++""$$$""$$$$##%%%##%%%((***!!###$$&&&""$$$$$&&&""$$$


>##>##>##-//r   )%r`   ra   rb   r	  r^   r  r1  r  r2  r  clip_image_maskr  	clip_pathr  clip_stroke_pathr  	clip_textr  clip_stroke_textr  r3  r4  r5  r6  r7  r8  r	  pop_clipr  begin_groupr  	end_groupr  r/  r  r0  rH
  r  s   @r   r  r  J  s         1 1 1 1 1j /I0K4O.I5.I5+I+K+K+J+J+O-H0K.I0K.IIIIIr   r  c                   J     e Zd ZdZ fdZeZeZe	Z
eZeZeZeZeZeZeZ xZS )r+  zB
    Trace TEXT device for Python method Page.get_texttrace()
    c                    t                                                       |                                  |                                  |                                  |                                  |                                  |                                  |                                  | 	                                 | 
                                 |                                  || _        d| _        d| _        d| _        d | _        d| _        t#                      | _        t'                      | _        d| _        t-          j                    | _        t-          j                    | _        t-          j                    | _        t-          j                    | _        t-          j                    | _        d| _        d| _         d| _!        d| _"        d S rN  )#r   r^   r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r1  r  rH  r  r  r   rt  r{   r  r  rf   r9  r  r  r  r  r  r/  r  r  r  r  r}  )r]   r1  r@
  s     r   r^   z JM_new_texttrace_device.__init__HK  s{   ""$$$$$&&&""$$$$$&&&$$&&&##%%%##%%%((***$$&&&""$$$



>##>##>##r   )r`   ra   rb   r	  r^   r  r1  r  r2  r  r3  r  r4  r  r5  r6  r7  r8  r  r/  r  r0  rH
  r  s   @r   r+  r+  CK  sk         " " " " "H "I"K$I(K(K"J"J'O(K$IIIIIr   r+  c                      ddl } ddl}|                    |                     d                                                                                    S )#
    Adobe Glyph List function
    r   Ns~  H4sIABmRaF8C/7W9SZfjRpI1useviPP15utzqroJgBjYWhEkKGWVlKnOoapVO0YQEYSCJEIcMhT569+9Ppibg8xevHdeSpmEXfPBfDZ3N3f/t7u//r//k/zb3WJ4eTv2T9vzXTaZZH/NJunsbr4Z7ru7/7s9n1/+6z//8/X19T/WRP7jYdj/57//R/Jv8Pax2/Sn87G/v5z74XC3PmzuLqfurj/cnYbL8aEzyH1/WB/f7h6H4/70l7vX/ry9G47wzK/hcr7bD5v+sX9YM4i/3K2P3d1Ld9z353O3uXs5Dl/7DT7O2/UZ/3Tw9zjsdsNrf3i6exgOm57eTsbbvjv/1w2xTnfDo5fnYdjA3eV0vjt25zXkRJB36/vhKwN+kEw4DOf+ofsLuP3pboewGISO7bAxPkUU+EaUD7t1v++O/3FTCESmcsILgQRuLhDs/w857lz6NsPDZd8dzmtfSP85HO8GcI53+/W5O/br3QkeJa9NERmPKgE2Ue+73vgj97Ded5TH1pPDEFCT4/35RFFtAMORMezXb3dwiioCsYe77rABjjCOjHs/nLs7mx3wuYFYX+HsEQyTfHg/DY/nVxa0rzmnl+6BVQfeegTyemSlOdjqczqJ0J9/evfp7tOH1ed/zj+2d/j+9eOHf7xbtsu75jcw27vFh19/+/jux58+3/304edl+/HT3fz9kq3iw/vPH981Xz5/APR/5p/g9/+Qhb+/3bX/8+vH9tOnuw8f79798uvP7xAcwv84f//5XfvpL/D97v3i5y/Ld+9//Msdgrh7/+Hz3c/vfnn3GQ4/f/iLifja492HFbz+0n5c/ARg3rz7+d3n30ycq3ef3zO+FSKc3/06//j53eLLz/OPd79++fjrh0/tHRIHr8t3nxY/z9/90i7/AxIg1rv2H+37z3effpr//PPN1CIF47Q2LUSdNz+3NjakdvnuY7v4/BcEGb4WyEPI+DMT++nXdvEOn8iWFomaf/ztL8wZhPqp/e8vcAbm3XL+y/xHpPH/xlnDejXKHJTQ4svH9hdK/mF19+lL8+nzu89fPrd3P374sDSZ/qn9+I93i/bTD/D+8wcWxOruy6f2L4jl89xEjkCQaZ9+4Hfz5dM7k33v3n9uP3788uvndx/e/zu8/vThn8ggSDqH56XJ6Q/vTZKRVx8+/sZgmRemIP5y98+fWuAo8vc+z+bMjE/Iu8Vn7RBxIis/q7TevW9//Pndj+37RWuz/AND+ue7T+2/o+zefaKTdzbqf84R7xeTdJYYJLOf7z4xq11N/osp2bt3q7v58h/vKLxzjtrw6Z2rOSbzFj+5rEd7+P84ULxH8/6vO/lj2/6Pu7eX7d3P6C3Y2tb3u+7ua3dkA/yvu+w/JqyV6GeUt0/dy7nb36MjySZ/MUMO3Hz5+LNycsdx54SB5wmN/XJvRh0z/vz1/PaCf4Zhd/rP9dPur/j7eDDtfIV+dX3+r7vz63B36vb9w7AbDn/ddLseown7kr7bbU4YIhD6/03//e7JiM0O669/vbyg1/hPdKLd8WGNPmnXoSs52h5200OGk/WW/fvdl0NvhpHTw3q3Pt59Xe8uCOARA8ydCcX433Z/rjfonfbrnfhP5j9MJtM0mbf4XZT4XT9czt0Pk3S1ALFfPxyHA6g2A3WCz90Pq6qFO+dsskjdtzAB3B+7rwwDeWi/reu0nbcOeMBostv1Dz9MpsuJwzbD+b5DcuGuKR32dFx/pcfGO9oOw7MZlAj64M/9bmOAaTJ/WFuJF0t898eHXfdDNmV4JC77x133J8XONCDiTTWq5JkvNMMLNY9C1ZLNa82RrIki9ULP50AZ/6pczOyn92DSE3IqRSZs7nc2+gmqKMi+O3an/sQkTQOpszcLsBTnsg2gSEf/KskTQ4YaANrFPFn4b/ELIEo/Iu2jQkbg/QEtEJXe1Y6MtWP3sl3/MMlnqf08D4cBaclr5KzEzHTuyXhZPyCXVhkcD0/DoXsmEwEfoWVQqsJ+Sg2eW9qniOGQFqHh3n+XCNMWCMLJ3bc4BPB2vz5CYenXkKjI06Rhu8mSJlSxKmmQX+uHB6g1jC0ztEQ+TRqdISmC6A46TLiH/sfMwBczE0mo4WrXHzoJpUyaKCvglLnpJC1XiEWSBN55eIHcDChLFpQ4TxZrHWkL2mUXwl6YtoN6OLefEmyRLHy7mizwDT1yt1szryqhfCOa1AJJBtKVZFRtCd8WU3pATvFrbr5cHlo6DometzoF0xmAbn3/vF2fgKgcbhbkKCCrCKBYETp0uZt+2siJ5pSGc92+kOVgbLVIOREE/rw+jcJfNGSxGWBysYMmOzxrCU3qelSBOUV1VQCf456kXEGaqB4gykGJUKTJQupBnixZ9NNk+S+2ihS/0kkCjOoD6ccjhCO3niVLKfYW367Y0xY90TIU6MwSVkRfVdMM6HFYsxzpPGobc0NLrV4ky6htQIoOA9rLmWTeIupuh6aRZaij5vPp2LH15zO49PmEMH1niBrcCCWd60KgH00/BmgpkM8t9NzL/mm930scS/j7XYuHlr2MGiXkiwoDQvnESoFVyfKEarx1uSGFA7ehkULobywiRPBNiqgAcbOCo9MFRwtGp1GVn6wSDuzTImllwJ65b2mcAPyAjZxvfcTpHN+2xC0bZboApKt6joBDPZhbIgyyEeD7B7Sx9kZ1qTWqKgeUkvZ66MUI1N4eejGytzeG3kgUP/QumFyVWyD1+EpSja9NICVYYqbrSkvzJV2Xo0WhQfIedV+EsGU0rd23hAogyuUKtNZ7kBjOxTEPBT9LS/CvBlfE32OqDgVzo+JFfWt3uqkhATv4OEhYCFtGXrRhR/jCY7Is4kuCVWavQ0QdiVoDqoiutekS9K0eFjpDy3E8nc75EdVjKGbtgVmg+1KkWtQAVp/hpaPQM1SNl1O/YwryWeEJUS3gUkebwTnzDLP+DdtgG0jtClLrXh86SHu6mQoIb1r5HM1KWjmksEN7xQ9VsjVpEQ1ezvA7gUqMD+97RcpruAv3Le0G8V2Oww/ZBDpq+40xQxPBh2/G6D1BqRSiKq7YJ5TJKjTdJlnpDjptk1U0phVwrbvkabJy/S5Ut1UPnyELqgwIovM1Cm6jCoGgMDERdp6sJJ/K5EeKViU/Nqc/Lutj90OeYwD8UVS6Kb7RNzMrc/sZhqsZmYenfh3EnCc/StfWJj9KniAe0WFSKFE/hpxYWEK0k5TAwIh806Z72+hRd37UjZ50NJBBxu16o3UD+N1iHrjZ7LpRfab42+5KJ5gZH5eX8+WomxFq+Y++BBALJnWqVgGIRywArlFjJgefUXkgf/142NpPKQ84le/KfdtYs1kD2gjLDJ0mP7Hg6uSntEb8P2TFYmW+p/xGo+B3kfK7SX7CQF4ZPE1++lUKGh3sT+tbAx3G5J/WN5WyDIzj5tQ/aecZYrMDKqraT6b8fWshK2gxGcINBb+0hBQ8uuifpPuHY4SlmwhqwU+qg6frKFcRttbIphPQR9WCwJesxfcF85bjZb9bX84siFWEiBYBh98kv1AF3jHTZ8k7PUvMVsm7v0F+TCjefdF4m7wTJWDpvmXIAeBbSrZI3on2gcBCFrWWCAN8BEhYRFXlK5N3elStQapRdRVIP8hQ0huaNirZu6sBmN5NW8wn5kvaoqNFjZgn77qrpQeIFrXXInn3eFw/o62hZ8IU7Z2M0Qv3LREDiNQOJKvXQZEej8mQoT9th+NZO0TxyYCL+ukInW4UZFS14AO1SrX3Jnk36ByH4DIyMjMHO/jMzJfqMEsDhNLI0VCJyIAEUiopfEt7xzj2zk2XU9T0d9GQxPrzbdufT9GgMPWgrwuaWSZ/Y02eJ3+L5nZp8rdQ+VaWkPaJucrfok6uTv42mog1yd+ijEP4kpx58ndG2SR/V0NNkfz976E/WiZ/X99DZ3/uoxF+AtjV1Nx8q8JEqDd7qhkZYwUmB/byYoqG7OuuvwX63cnibJH8XQa0Gt8yoOUlKJ9v0JT/Ho9fZKuWgX7i7/FYPwUQLU2skr9vdTKh0/19q9UBhOgHI0gSjz0QU8+WUGx/jwoFJTAgF5SXemIhmYEhH066cZUEfEE2yc8syEXyM3s9aIU//4yuEtXlZ6815DN87+83Jqfh3OdavsR3yDVyJNdSS8STlByRjPISnlz/szJfgWNp8VoGUoZiqH8/969RViOG35kMcOJsRBqibJwnP0fZCI9+gol2Y79l3IBnya9F8gvza5n8oip+mfxihVqVUD7tt0yJVwRchW+TX0ImZckvekjEGPeLSjJ0nV+iejSdJr9EMkMGEQvfVHGMioqq/cuFhbVI3lPWNnlvynaevPdlOs2T974coS++D+WIye77IGJuibgc0dG8j8uRnqKkTA0tHsrkPSv4rnuk69kyeY+yEBW2Tt6bQmvwGxUa4tGFBv3ofZQBSNjwqnMI8UiOgOmXJJep+5Y5AQCTQ8vkA3NolXzARD8tMvxKqc+TD37AX+buWwIAACXpGM1y0I048Nbwi+C8ioAS+eBzH7J9YK7Bw8aPCTPIE8pgaglRG5YR4KsW6t2HmysAy1oz/LxzmWlUD8Vx8JLgCPXzKWgAH3T/jXRhfPKVrJgYUlSXBcigutDvrXxSsEROTCkjCMiMz1JUDQCnajBhkaqxAhD1zwXoPeodVNIPkQ7Skj6yUDBImU/J3LmllRBtZiHJ0IWlo6x0IfrsahmsVlVtHvWMEcFdKTzwLroNeugP8WICa2u8mMDA9t3T2iWOn7rbd1w/LmCKbejjcDnoalzNLX7uzzutF1ULh3v1BrV031vx8pkQwqZz3VrhQjV6CCNKFtuGJcJ+CXy7FQn0rh9c3zxhZTbfMqVtHSDFTRe+D0CUduDXzrX6WJH2vUThvn0GM8sNoOYxU+9B4iuSX+EZWf+rFMw0+TU0X/B111iUya+R0rwCHaldcwA3p7hzeLXr2/ywCsMccRkI8fevR13P8+RXnf9Qtn49Gac1P3QmkOOSg+//ZnLS5L9DEsrkv6OQwBT3afKR7rPkY6R7LkD7bmCafPS9XVHjW8Ya5MXHEEsFIhpVyFb9RzoBqXOyNrRvkMU8kKIiFJAj1s4QiJqjgL0dmCdIRtjbKlcLknFrTJFEPRoVbfIxyhXwJVf8tw8E/ut0hJ0uLx2tXMBryuQTczFPPq24YzeZYHqP/hJU5qh0Sir31ITU1FM1qcJRufFXOiozVOV5JpTa+zO8mXdJnoncxM4YUpElI+VdlimozLssycu8SxQaKC81OltQXuqS6cu81IUJxUtdVKS81MWSlJe6oJyZl7poQOXisiUlLlekxOWclJe6YPqmIvWMlJe6pNRTL3XJtE+91IWhvNQlZZl6qUtKPfWylCyHqZelNPF5WUrmxFRkYeyFl6Wgv0JykPlZSA4yzwrJQaa9EFmQPmll/ls3EYqw3r/0vsvHAPTJN8XSf0ceSgdKS0BBqAaLzH7YvvITvb/51OsBtYVubaNDutDSa0vIXJTlGzX9jDU6kmtiaN/2WOU8GTmDt7gzhfjR+jzSF2+AVgT05AxBbB9iCIUVzdcQ+zZy0SB5236vlk6Rov7JrLTOUYD9nyIAqkHUa4A7PJ7Ha3DwLn0JXJwZlszn5slndhbT5POaSiyGgM92wQ6p+yzFCzQUHDLsc8j/mSVirR49/+e4/6WnKHfnhpZCWCSfow1iOL+5+Tunw1AEiL07n6KNW8i6dbv3NT7d0LbgJ/WxCRQp8ymDLmlkh4SJqNWgXJIfzwyh4n/WvTemB5+jcoAIesERk97PUEgee6OwNwtDnXrW1npqiPPrQCGr5POxg47h1WhiCDtKH5Sxz6d4Z7EB4gsY4b12O7XkD+brIFSafGFxF8kXmY7M3bfkBwA/uUCxfJHJRY5vKfa5JcJEotGA1INSoxID3aoUIWCl6aPufNEj9RSk0vQXgfQ+llXAJOYsYJKCmcKU2cAkwC7WlMm5NtUpAihpoTxKk4e0MnuYuW9xC0Cr9JiefPGThJX99Gofpn9fRpMEiqknCVB0v4wnCegqvkSThBZ0PElg9mpIZwTy7EpTgYxab6wgmGQIGvGX6zXS1oNK1a3oUjcRZKWo7Cwr2SacF55I2T8Jy+QM03p6298PO+nAcnEgi6lN6jG9ntqMwRuBTb2bwIuEkPkI0mhNnVI0/i/jheQJMd8ikR7MG9bcJdb9WBvga+MTlJGfv2MY+hLNJCoPSFWfJv9goy6Tf4T22ST/UHUHU5N/RBOFDHS02gEHrsdpwIuKCuFG2yd18g9JHHi+rmFK90+KUSX/9KLWWfLPINLCEjJSQ+5/qipSk1QjBKZq/1RJqOvkn77q15Pkn5GIiFNEqpL/oRh18j8h6mXyPzqmBUgd0zz5n2ikz+Ges5tZm/xPFA8ClXjq5DfGM0t+k6506b6lwRPQpY6x5bcgVWuJkCFl8luosSljuOpuVsC06K2hpY+YJr9hHqA714bI5Va3h+B9hqLl/+aLP7efvktZQSi9wzEtQOu6XoGOhkfonL9FuYYsklzDt68wFOByuu+fdAbNHXbLYGJB3q4/n3e6LkNREfiWrzr5F8tpnvwrMq8qQfsRZ5aIGVa1dN8y/K8ASJE5whVZ2s4myb/sonPVmC9ReBztS2aWJf+KWmAF+ub2RE3GDa23BW7VGoi+7XRa5gTGO2qLlKiO0vi7Gafl3Ih0kfxLazqzafKvqGgRsxQtv/2uVFMktEmEvrFe33cYbXZoTzM06bVvLC1Zm+4rnM0mxJ8uv6+P6zPczWtLH/eXZ65RzA1/v0Z3qcC8BXi8yML5JAf9dYD2QwU4RNq0Gncx5hGooqbre2Zlb87D7NfHZ121VxFXBYhhVScUyb8fXob98Dj8kNN+ay2G2Ln7FkvnlQN0vqcO03ZLlcPEENs7igySfPBipgJRZAsZiZO6vJxYQlQ4TEXWNwyxC41qq+SlZoghdqXRyBB5pjlict0kvkZAczefJoKH/T2qelpZyFKT1FFDRLoSKJx3LtkMXCRBYzUABm0XwJQ+Qi7nyAG9pgzuZrN+VnWsIuTqKPJB6aFQ9G7OTfMAB70RguiMSw0ZlidBmxaBWh4WF5G73fNw7FDvcq7srrvgAZE89v2EO/g/QOzCkvVsmtL4aGrIdII+yFqqe7K2xs6enFlFwJHZxFrJeDK11p+ezOyevCdzu7ftyantXjxZ2A7Ok6XdhPdkZbfaPVnbzVpPzqwpnCPzibVj82RqzdY8mdmNAk/mdg3Uk1NrU+bJwhqLebK000xPVnYm4snaWgZ6cma3Wh05ndiJmCdTa9LsycxO/T2Z22m/J6fWLsaThR2kPVnaGbsnK2vw5snaGo94cmZtTBxZTKwxkidTayDrycxaH3kyt1aWnpxao1VPFtZaxJOlHeg9Wdk9fk/WdlPUkzO73ebIcmKnqJ5M7Ua0JzOrLnsyp8WNSFVOSYpUZeEarSMpVS4FWlKqXNJbUqpc0ltSqlxCrihVLiFXlKqQoCpKlUvyK+ZVLsmvmFe5JL8yUknyKyOVJL8yUknyKyOVJL8yUkn51kYqyY2aUuVSvjWlmkrya0o1FZlrSjWV5NeUairJrynVVJJfU6qpJL+mVFNJb02pppLeGaWaSnpnlGoq6Z0ZqSS9MyOVpHdmpJL0zoxUkt6ZkUrSOzNSSXpnlGomCZxRqsInEADJXEhTglMhKVVRCEmpilJISlVUQlKqohaSUhUzISlVMReSUhWNkEYqn8A0NVL5FKWmdU9WQpZ2DuDJyppoerK2xjmORMai8ovMJmMLCcpkbCnJNxlbBZIRVT75NbpNBFUJaUL26a2NVEub3gy5nE1cg8y5MDxx4mO4JWHLrqhyVs6ynAsJ4UvXrkGyVpTlRMicZCrklGQmZEEyF7IkORWyIlkIyYjKUsgZycqRU9aKsqyFNELOhKQYbnAhyZDdeEGSQWVeyCmLsswyIRlUlgvJBGZTIRlyVgjJBGalkExgJkKmTGAmQnKYLjMRksN0mc2FNFKJzJmRaiGkkWoppJGqFdJIJQnkMF3mEyEpVS7p5TBd5pJeDtNlLunlMF3mkl4O02Uu6eUwXeaSXg7TZS7p5TBd5pJeDtNlLunNjVSSXo6t5VSE5NhaTkVIjq3lVITk2FpORUiOreVUhGTrK6ciJOt5ORUh2dzKqUjFwbScilSFEUOkKowYUgqFEUNKoTBiSCkURgwphcKIIaXAwbQsJIEcTMtCEsjBtCwkgZURw+dkwZ6qnE+FZFBVKySDqkshGdSsFpIJnHsxClOfq5mQTFEtjk19nqVCMkXNXEgGtfRCFqYElz6fUQ+ohXrHJUuhaLyQJRNYLHyRoZ2DXE6EpONlKmRJMhOyIhn8MqjlVMgZSRGDWVcsSyFTkpWQGclayJzkTEgjlSShMlI1QhqpFkIaqZZCGqkkvZWRymd7ySG+aCW97EWLVtLLIb5oJb0c4otW0sshvmglvRzii1bSyyG+aCW9HOKLVtLL/rloJb0c4otW0jszUkl60T+vmiyQBUmf/Ap97KqZBpJc6UUrdm7FaiIkxVilQlKMlU9ghQ5q1Ug3UnGYKJqpkExvE7imIpVCMqJGxOAwUTS1kIyoqYRkehsvVc1homgyIVkKTSokS6HJhaRUi+CYUi2CYyPGTEgjhq8bdW7i9XWjnpqIVkIyooWXasZONXN+yzRDB5WlTicHiSLLUjdBK9McXVCWujlXmRY04p9kCyGnJJdCFiRbR7LRYSh3jvO0NCOsczydcSqUUWa/kcHqqldniiRanAG57Y/rp/Vh/UPOk7jraNoPifuwMsL5Sa+XRiBU76bYnKrGR5URdK9iNp5V1MbDeF2IXTpvUlnfMwwz0PSHRyA7h61ogQ4M/517jTZE990mAhcER7ZUTNKNlSaqVP14pWkagSoxdP28PuOvybd5Fsjtevf42m/O2x9WKy5ByDoAR5Fd9+i6THxJMqldgN6sn7rT1iwGvrJpWVdx6uvWgNv1/tvalFIIJB9xRh6ngW0WM4LHYsQZeawt24olwu/WyGyR1aVtzzWYkVjZiDMK3bOfT5fjWnxxLA9w7GU10bxxRVjlmjuqECubCS8oqpDPmc3SP7hIeQqoSdHLFg2Vfdxu1/1xWe9+yDJqDu64PXsdfdx+DlY4bg+mXm6lHrR/6Y6n9WHzAxdWAqmdTRTuV2eN22BPjyw7qFbIHD48aWBK4Hm7PjxvL+ftGhWWRlHAuHaYcVWFn/fH9cNzdza2uJgt1FeoN5lHxnEiq7jmCiN6ml3DytfUxWSiyPLMuba+QRuZuOxsrDDRgg/DGY575m2NNnG4bNbns1/Eo2J1uJy+sjTDYm0A/VpfQHS/BzRcdoACfVmj2ML684TIsTv8kPFAwPploFgv0Uo9s1Bwu0rJ/v7lBbm6qlcrfh6H9cO2OyGXqSSS/lPqTa2B4Yi+74nFwWQZnJ1ht3sT9xDyuO7UQiLbPpEAoJ8/PiAnuRJocpWdj9nbTNvZnJi50YF6RnSjQ2NpOXmNqnk8Dq/3w5n1fTa15GZ92m6GV9oeUI/xkC1NXmQhkCtRXm8i2OWFgAt5c79zgS+ngriwl7kgLujlRBAf8jITyAS89AHbMGZ5IF0gs1mAfChUqD32uu2RGRDRuUNZb4i79ecioAzQoVlATZgOzgN8eXGYS+cWJf2t+xM1hPocES/fJJBIlUq2Q9x+TMYrWARHB3r0qeH6gsclNQ6TFGeKjgJdKQYE//r2Q1bNWgUyKierT4zBJSqXmWfeCmSrxFQQqREuH02hzVJPbEyhFYG8PzHIeS0ISuJ+PQJ9zpUaGB5dHVhIcJL4yiMis0OMTmAKBWGdHvrebm5wr7HVQLRf5jjeTLjStHZogzj2LzRg4+zQEv5Yhmnx9gio0rxSh2mtYoxp1YLLJife8HZ65mgyF2q9456JjKRUDT3nBoY+B60yS0No0WAUgnVjUcuFIAuh0zYKo5ivrkq2pdPb/uU8mCFAdWZoIWcesEAV9/nHPuUcGYaTKfGgjwo5Bs5F6aFTkmrAI9vroeRptdPSQe0kvUNQ5y33B0OgnF5ervRRdPCXW9pihHttMQK1tgjGV2rkWz9Icdk4ugqH2frWH9wM8o0KD4sxqCMTg4oWBlf33KPFjxoNoYDcYyT2RvKFIqOaTNxJkvFbyTq3tOSA4auKWk1In51aAb3gXivCS3KPbBz0doxaBRBVZhiD78N2ZprcRxeb5IaW8QluO+pyp/7PcwcnWyoKGGXLEoF2D+sLO4ospzO9RYhQaRriNdGaZKxLohMGNtYhZ8ajSvOM9EiXRM9qwG4/8r6YrYRzGnYY1DfCmhgZDsMQT2oWaJH3nc5HxqjtMljQ3dmur9xbU4LGQOuRFRQTdLYzCc4h0kCGiYUBg0JvSGjZobahJt9vdb1akvY1xhC6yjgg1BkC9nh7gZLsdVaS1gklvUMurHcPKDVzIh551B82eq4Ine6+V+YCTMEONdtXIJ6SNwBKCHVuQ6R0CAaHl6E/nKHvQEF1SjBn+YbNEcSzzW93pOfpNVd5xqzfscF5uKAYY106/d/4WqtuvuPO69dp+r850CH55PCWO8aipEU/G3jGo2ZmlnnsHs4em7vAjNvrzGnmN9g6a13Om57cFZm5u8Ch/Q7uH9kpZKXPgeDMZd3pjG4kK9nySZrb98bpmireVbqCRyehEUeLOR270EyTLYdn9E0Zs09fU1SBHlBTswJT4/toigdfwz1XNXrXP6ZI9aCrP7J20NUftMw70Gr+CLM8RIuy7oyWgnmrIey5yUnVBPL+TH4egH2/IZIpRPfCyqsfajV2fqHnNAC6klUWtrUTYiwVbeVoFeIE0Y4iSTRDRFko0MqiES1MnehGh8Gu0YAVZ6Ihq++tNBQNipF/E3fbJlGDRCTLCLGxNBFmC2weYVE8cRA2keju3frUsk7CVRvW8iVrLeQMaUpLycKWcriKWc4OJ43RzXCBwm55JXn95imKbu6wGzHk5GECcbCj/ByyiNlYjdzWuiCchiu5UEEvuh3A40W3A9KY/p251Jm5bxM/R3au9VtoQPCYtx+pss4MdureTJfcJg/Uh/LkQVsKloDVOIY58YPc01fh2yuNxLXSaOmgNJLehWPeNcjDhoP3YaP00jrVuMv9icb8GkXkUC9TkPFysv0Lj0M+IMbh0a4lO0uwbFHZT11mCwu5KmIo9GZP3bGjEg3/DfzrpVskQe6kW+JbriLEFOlhfBXhDJDoapklwr2D5F6OO472iMRdQdiYr3AFIenQucGdRNjUnnBpgQDGE5dV+dU/cXGHeZBb+vDoK9lyZRDdvtqJgYbd5nR+49JM5YLRdRNuotM/0PAetMIza0j72mEIXT0cEOoHAZ27U9C3b1NckvPwzLkHJtxpbsjAn1YE/vfLFVeRE82xnm+YCxdkaCvpykR8+3LFBVnfv1yRWUUDa1bDbd9deEbKVA6/LpVVgWMGN2Gkwhj5KGeeEZbL5x6Kw2B12w4ImlM4M8hO5h7xQG2BPjhxnobOA0yku/EQrhnPVSpKh4/S4OBxClwoQX4HjKR36GUUKMQRXbZx3/vL7ty/7N7Q2c0qh6FxgZo56mV34VrjrPD0AL1pZ+pWjs7dobxTnWMalw+MysMedaKYsnQo3DTRTTxblMnofJBrqkuFu74HjW3XUXkzDZk6/Xr3tcM8iOPAIrPQhnfW7whMLMBp0tEiqUXkMBUx1Nbd5Z4TPvt1uvRnJ6yG3DIPbUoe9g/omUOXM0eTjHQ1+HJr6soRpNHHJdgdD+ZoywQjn/nc88TX+vjGbfJUIAk2dc64AqCciH5TWNqqmlTome12xXCZjnkOp1DmsjbuEdqTedxIceNLriBTkA4vEn2Ib1UuvEM/H574wNQS99JCqodtUwtFy0LOp78NT4szjVlundyFK9ngkqS75MxCds1HhxgxXHgNsRd0XZxDUJrD0/HCdJp1c75NMFyOnLA8Hc36E1Qo82DBAILG5o6YL3h5ETQqRzct78ChZuBoHsZmk7XkYs5rVNJA88Q7R09LLhcp2WmgM9JZoHPSeaCnpKdCm9irldA/89JRKhCWbnnhDNQeT77nAf1JIfQHngadSHDtJ15VzKHJ0Z952XJaBZpnbUJmrHidoSlaSzLtqZA/GlLS+pOJS2T52fide/L9nPmaimgfjWcpg0+8b20i6fzEq1cmgWvTIdn2ycop2frpi0mHRPbpN1MqUohfTGQS+j9MaMwF9/QGFYtZIE/rw4m6voZQKR+pXRBDrRtN700ejeBoaTa75utdsTRmy2ba8gYehZvfcKADNvG+DEd7vsF3aqZCBdWL5Q9Pz08BQtbJJBTFcLx863p7FyZChALQnalWcGkGnqHpvXELM6ONvqGMOk4F/HJEIA9vzGDUwrejuVOb+ZiSWrEvX9H0CMS9ZxmHj45VJNwaLafJJlLiSavFqBLkJtgIGNItTZnveImvaYmNl/igRAEd2wtMErdyZsxAomUzjzxxDWSSTdy32bmZZClJtSJWGjosiJFW05+S3tX0x0S8CyuVFG5nl/ty+xlW9CIgrOk5eItA7f628XxnLGVGnLDyd8U/dU88Nek46Zgz8un5AXVAf+z/EFdTBY4C8CxoB3sBZwocuXesOH2VAkfuHctu7Qtaa3Tkw/Mu9xflo9HoyIfjxTlXKnDk3rO2pso6cKLAkXvHYqfUCVgocOTesOImMJ8D00P/dGUBbQbisfP6MNpCmi4CJ8IOvApuZprn8SnIPa8sYPrFCMRM4+XQcZdFjvKYQX5aQ+r7nb8/lfWIy2/XRgrzWwy9KrQcO5DetbnJ0X5b4+LIecP10or1rvZv0XN5RG1Sc1vb54tJ05NPUymUU5RXBLSOsiCAGLnayKNBlaLd8ovJGLMxGzATzsux33ujBJNJPmFcf8k4OiqMnpWGNWHC1c4MWtl9GBzQImShAFGpy+vR/MOqQG6J0W3kRP3l9XAedeOG9h23IXQP6oDQhRog9JGYtW3GFb2pIfpmIxP3Ajm6ifYxskSxM0vpWD0SoiWid6YaQ8tiMOqbfQrm1L2szdJU2GVtrni06zFjmmOqvSrUpo6bOFwQQZPvtn1oOktDh9EDFUPfQoJS0XtHC7LROYjZTeNosbspCdg9pKn9lCsDa8Z1GPbIVsiLn8sJXcHhsrfrbiErV8j/jvdkZxjr40yuEpXHhtBZ7ICQwwTcZhE+MR6/nblD5E/rFyPMnQacJrLXwxMFjogmgSi6cOZvXifx1RNoklUS3TzhWvpUUNc8gk9pzAGK5NSFxNh1qZA+nwc3OYfaven5JhtEW1Xum3P5zDL4wpLdxs0y6NGb6D7EAmE9n7ZmUayYwUO0P4HqEJYqobFtwj30aEPRHBhJPchmBgguomzWfokE3cKAmuW3MsjXCURb01sZC9I7M82fMA/Nt55I5g6LZpLeoVquE89iCuBD1tNFOjo8UUdF9R7U3iBrd1h4zJazQLryrBLfgl2J5wEYFKISt2IkGGxOvDgtzVNP/c4rUluh7GKZq80mQ8/OwGJRkOCavCzzoHMyK/Fvw8YqNMYSO8ZEvzOc1wMS8qyP2LaCurUCRCOqPLzoHEMSzuveLNMii8LSPOTQS/MctvTSPCU3r2kgT75ZzYCNnpQcTS5J2CXgOZ3ffmcjJUdXYzqNVj+LVcIGARE6OWo+w/eReciTJJ1abIdbveS6SDq5ox7+7fq6X29fekCvtQt4ZchRXHG0NYfhuhbV4Hv0uAeD1UutTM3D9i2+Z6GuAMrgObVEOM0914C8+LHSqIyxM43q2zErzZAXP1KNRtde5pojb3tQelVCEFUfuwbX5zGk02eskTPuSY8q6aInPSwtR+Mhf6f3+hFOd2WHAz/63Q/0XJ1YuNf4VsUK/1H2w2u0No/y0YZX8B2dwYfckY07gnOrBnltP8MI74BQKdvWIlK0jD0AbkeLSw52jSGrZql14HKxdAF0mEj7MKpUMN+2MdoIxAa+YXufWUzlhRdH5aSPYIs+4yohXFT/th0uyJfMQzS1sdY3HFMbi2KwGpD/L9verRzkWeZSKl1+NqldGNECqcNUh+/z1SeucpFIyuqVAE59Wjkv/m6sykUu/V02qZwTbwBNcnwWgL5u3DqCzNVmeHUgI+N+1MHn4YBc1JcOGNCf/AehX4nJkbBdt7frlFArOvNkTKgrc4dIRrQekDLOHCIJp59d/8JGl9Go3FMyscky1oKgA+SekLdoKo/IWzTIAP0WTY6+db8xygiXK+23njmhgkZ6Bf2/cAA4je/gaMg5v506kwVwF1myQzY9YmA21x18vLn71vFmxG5dNEfH5g2chh86CkY5ehSH0PhOeRTOwSbHPGHZhRdy0MqGUMKIyN5OmzFp/HzYDSe7WDa3QHgzBoN+DInboo0ZXiFGBvjKMJ/g21+0hVl+F99qhUmCNbZEP+U+o2bnMNGpSkerBrMg1H/FvP3AdGclivWo8w5+dC5PIZFOXB1I7Qox671IjuK3n/xBBnLpLatzfjh9oi5JDEffQUIrtfTVoG0cegF2w/DCq9nmBKkbnpWk7D2vDHArh+mWP8ai1VgGfTZG+xseX6BcSttCZtoZVsUPNRzVpKXU4Ms8VbRCXsqtL0v3LUM8cuaM2M/rxwH9jEwMOXYoPFpvCbwb0LVLP/9bIu6LVG/WAHkVqbtlB1sp2BeExrTeBPzPB7PSxwVT+637hoXD7JpqLiTNuyfcSgu03KnvwWhS4UE5P0MAUzXaDpgeEbMvO3dlf6reeFoZyla8mXGjH3yaEbAqdNrMk0dqqmXyKKsNLb7VUGBoBHDYdj1XhyYz0OetWoVrLRCtwjksWmtrkke9PlMnj0F1LJLH6MWpVfKobF7R2B4jbQjN6XFsBLvMiI1XyJc50dEKOTTVR730gNgxdlASHvt+fMRMZcLfnh8I4HHHD3gyAITpHyPVBtqIg0SzyQSRQQ8y0xq080MBnex2GMeHP63JoCVpw2jNF036nteP9iCwp8Ia+hgLy+iBE5ZVAxYWkud2sThmKC8xWxZ753ZFN8JHvhx33+3tyWRPBWcOO1wO9nSyp4ILh7109giyI4LxuIP4ikxvzyEHOrgiejydzRVMqB7diToTpvmPPeS2Vlck4kfLGLRRy/PCfAUd09JKV24MEOrCVNE3NOW6NXyvKFvfVkeF7pMWSwNo7bdxSFB+LRLrvoXDguprkVs6rhVRq7jWbTTUWkgruBYRta62pKi3C0977da6Fx3PxqqHauvAq7agTDtDu+DBMvMmEb4jlQxtKBwhxFThcXgUexl2GsOjX/eBqvAIXXAv7CnZR3alvM474XPYLN+p+Qr5aGlVvnMDhPLNFX2rfJeG78vX+tbF6ZFQnBaJi3PqsFCcFrlVnFYiXZzWbVScFrq1BFoZji5o61YK2joIBd142he0dS8FbeXRBW0dxH3mUjDpNNMASa9ZWMzVERfQdtSaIZEomAjkuH7g3jFP9kxJHR449ucJTxFiKvukTeRI+gOFBb69tRzxcLZ5viIZL9NjaH3iod5owGlmU6LxgNPMGLI2vasMHSzvSGs1bgFaq3Ck7UuHTW4/dwjJKRCYMDlQ3cHfTgDF7x82iZ5DTJYg/VITkifqA2RRzyEi5DBMl5YIzyEijNFziHDvnkNMzVfggI72CuBSL2EUGWiV5ob0sOcOV3QIq2A4x45vZjDkoAAuHC7IKnfI/vLHRu3CzpbEUVl5kpCXpq5II8A33nkeB9oGVggXRQzt162BY0r3FBld1qT1M49VZhBXsQxb1wUHhMpgAH1/wNwCoxsEWote3SGwsvhY50F9+N5bkwVZ10+KMWE33ppE/m/D5tTcUFphJGInfiXjVE8UIkC9uQAt8UlvLsxJa12a1brfdzt7A4v5DNpPBATVx8FBiwAQbzsg0N1wxvRBXq6QK0NbzzqdOfHK2JgDoF6/gDKnGO6s7ERjaqLG/L1mOE/pLZ5ux5EIXtRsnl7DKso5Uh3e+ITbaBRFC9d7IOhVn/QeSANautOM38G0EI3syOsl7eJPlfjlSxY1P/WyfpnojWLnwN+c6UhfjXJLhpszWwtEcjs/6jZNIh2NLjmUt57wXQWUIo0MR25vAF82Ho+GSPE/HGUJgcms8sBwIVSVQF9VfILKAgUkkEO0mIc+hUdSwdEbFgWScuEEYD/4syDzJkDe5qux2Kk/PLlz5pN8FiC3OUo7zye9/dEw9ON6HzaY2Mu8hf3xWcL5O6b129uPrs7IiA0qUHV1v9fQyU177jwJJ0bpSN91a+lwoy5pddhxSXJkBpIRG/d689ygYf9nRXrUB86nAPuz2mWbJ9vIgmmlaL1MUtPhDrqkXs2ncLymRKRNLRBbqWTpnTFLCSw9K7bcheXGE2vLahXr2mNjudFFKKlgz+vTcRQeqlnEvQ7Spep0eb6MWAVznja9ZqJ65MoKM/Tqyd0pM+v4MgzmEoP79fHenJtvFh62p448vqBIoSbSs7L+ajJFm5udIiTLr5DHMRJs3zR6cJcd3OJRGLTi20zUie6KI3NqU9sFSO+voKy+gvLpFRQiiOCx0BHzSuqIG4vtWN7eq0kVbS7MipBsOkbyyRgJYWt0LLDmXcmrmbG44LhHnKtEb4NN0K7iN53RItSbzuhOgvZaWSK86VwkW/2mM/jRm865oSVkuO7sbW+8UOXMfaTCfkZ2/AoTGw6I3wXNZSpUUFuIbW90sHoVrCIpeo3xYbtG7W3VzCvNOb8O0v9h7rkdL5tZ7Dv3LTXzIuaOj4I3cyOG741HgtSaJxE2Bg2H6Iwr11OPApgplvhHNwI5OhRc6DUqBqpP4tWKjjryJRmXc3Rve14CPIjWyvw7XtQwwVHJ2rGSpSxFQXpPpf3Ur6Ch+Prucn2uqHH46PCMg8cncpYWDidyWguMTuTQmc5V9EvRCXVNRxnCaK2hK/Q+85lOFZGlmtgoIrROB4zbuoOvmrnD4xYOMLrmH/kZ6X4oUH2mpcKgAR32xS0MsNlHJ5RJ6+RrOko+ctPZ7VIX4Wc6U0RWKiLPFBFEd8A4+Q6+Sr7D4+QTPAzP24s3VMoomNvQ9zrzzEAPmnjhQgAUsG+xnWdqmHL4SLMysoJd/ZS0fop+ZuhvA482ObPLgpA7lclqOpxPL7x5ydxdwYIxN1fw0NRW5g3oPHVbQHHJPSjsIqNjtKT7Xl1klcN3dLC2UHRUfOgMoseFsuUyQlxmQeivXE9EOG8vW+508mpC+62tuzw/2ojxDkWpzz2gdspKh/EdrYzHXXrq07OkFxOgJb+VlrRK1KWEdZVoe42MpFucgaC9vB+FcMOAVid9bHDTJvpdlKJMem3lAmH86qExRnIB5Vm9CpzH/tgFRpOoBUea3GJW0PmFx3yluWQLZx5xkCsqUIwpmsnNY5oSlhFqjorlPC8zRs2sZ7WC6hlxuO1/vuzMoRERo4rdHLm3EuTINdfkiCypRikzzxmjwp9CypcR/8+Hbse5ogQ9i/iP3GHFbNL7xqxVczHgHh54c4j4Lm/yJfIR+yhiZVFxbddfg8BZxIH+HbIhysieBxj9syMsgKiwduiOjkHO+oon8cUsFFmILyoU9kvCiRLGYf+B9uHCnsXsc8gSdJaaNYQqkEU18bDehyyJ0u0WnHOaSWiYx+9CgqNoMPI+SI2Z5jHrBVolaoRENovZJ24hBFHicJXpFVId5eSpe+A5JhFoFjN3jyJPlIzT8NB35zeJLxLW9nN8kjNGu6jSRfXgdB4enoWVxqzLJkQUVcjTJbTMOC72o191+1po9itXVKRAY9YwbIQTNbpv3XFgolRtM1Um9G0q01ljAkNVGVaYkNuqxiAtAVeJMbKGoJSwFDUwjKzWFIQSKovDVSC9bVOmMG2KyjJRlpLI7KsnmKCiRvfZshw7jo9jpdTjI6XUwWOltLJwUEodMFJKgYp9I7JC2zeSpcwlQeqVYeR0ZNSJeq4HS7QJPdCxt5Hs5LeOyNIhJtJXhpkowSuzOmRnP35Wj+345r27E417E5II1DYkYPxOC2y0Q73+PU1uqujQ5ftgzAI/5ua5bIkc3V3ewgEL0GIgx6Hg+l3EPDH3dQ7Hm3d1FoY9euIKVS/Sw5EBB/RB3vwPXfbB7IHxfH+KJnXQL7WVkEIdDQrU/cBDBDzFkQbsHNP2CppCaC7Jw8EkAIo+ome0e35ZRhHPfbgVlUF89Rez8BYWkGLAvqTrr7zPqQu3OfX6ofgCIonhHJviYE2iZuZLve+4mEeIt45i9wDYbNhR+7X+xHYKAYrSjApw1JWVJX9l4pU7TNecMRaZeCHBp9N2rfd8IalsJRi+0mTRNXklQEU7U7A+UkDYvRPJjI8svtgjRzccwsFFq8CoL7eeS1slV20p15heQAb+bdufT5H5RuFBOaymmFXyO1XzefJ7dHdKClrt4i1A+i07fusdO0uHDTvQ2tZ6kvzu9fUVv0Vfn1lCFqDQGf+OJno6df5MA3L5d3cMQ8qnWCXxBlYNutuHtdmFoUdXArYGvLoTcGXg8bo4pFQLTTNGsB2dSWuS36NdziVpn0GG0DnkgJBFBOKrWxAgWk3Oo/6/Rz0MCkYaBDJIzyKzhNeEolfByLA+bZ/7yPIyJRwkLEC6ATQnS3fjc9A3nyFsDMOmigE82mcXnpUtABpgZIbVJDcssAw4MlBjpMogyzi5slcz6HjvdkEwvttwCUjneGHokOGkda/BcMfmwVNguhdpFB0NQCUYLy+m15vbz/i+RlRzoG/dcDnsoQfsZbSqUmG8cNXqJaxj1dPAIif4qYVxOq2hU8TcGbjH4dirDp55cdr2mzUm/EMop4mGUcF69kz2CunYzag3XTHvwjVZlFPvoxST5GrrxBTH9Q76KmGwLAYMtztjjnR8jnKWYX33kiI0o2e92N0mz9EFXjPSzmqD32K1gYnvc+h2UGSxkQbZSnGEGvIcm1dOCai9SZRiZJqh6Sg5kCK+8BM5cGWQvEJ1Ys057NaHDROaQoF7jnqXkrQeKQoCvmEarq78Dgi13wBqH7E19Ggj0Tq62kmsDDzuIimhthmlq2AFMTOUtoIggor7fL38WwtnpGsLY6xtzz0j6NuNh0YaN50Oz1u5uhHTWQMMcqtUYYHL2p8pmeQWeQ2epkT2Fzl1wtjsNVMzpgv647O+uYoZqcw8UDsiZR61OFJzNR3VHuRpfxzGG9WFQfddd9YHJFnEgAMNmXt0Gs/j/C5bzxhllcfH7icOl8zm6GGQUQDe4akfTsExcjMertF565VtDPrP6mQrCn18xxNSFg2IyP3rO55QrpENR05aPa8A4ZBkKdHUkKEF54qOygAVaECXE/IV2TSgw1cpqhkYk3s685KA48Y9U466vSJnOPhDxxwqZSwv+R0SgIhOehLHruIc5CflF4yhzDzrBeMpmHp5eK7pKDXI3a8SZgPqNVBtwmMm5SLZaSuGDKSzB4SWsBPDBeJa77R0mCeRfjat4m09eJPTIuHhgKvnT1YLj3/vnZNVfe1ivPfWrqrI0Y1XT1bzaxfXwcy8o2tW41nfe/kEffmVi+tgbD7IYDkleb8x+kTjvsUwZmYQljsfuDKfQdeKgKBtOTjoVh7wV7Is7L0rAZQbchzrztyMM+arAG+6GvPJGil9LbHrYWaxMEVzpf6tiN7Q3BcLE/jzrZBMhhlptuOsX65YL8f6fjuxYHdDsGVde+ZVRAvPuTW1WK7uEPL0zkwnnLtb46tyx5iOT2I7X7RIvd3mnyF3UFuN1RRi1UoQSK/05MhcpfSQI0pPY4n4lHG+BBqrQvBk7VWhCu60vaqjxWsVSLGsy1Eo3aO9clpf9jY38PiYO5JL67EJDwXxS8zGpoEcjt6gLcuWc4NHNmrW59hALXNo8AuV3UDaOs1CsovFWM3xIYyQvDTRXaCAGKK9QzpAtqH3tS877+Ij4CwermWxfsbjHgC+Xo+RaBe60ZyE7kcJ6NER5aacI7rd1wFKb/+gTPLTgHo7ewXdWFFo8xts7xU8axbr1jEyzC+jU4dTJDGMrEukZ3jYcqvJ7dSCPTxRgbcXimWVpw+DMeNbKFpsNDPeqetwc/VYhuox7MJlnxk6zYF7rJMUw6q/QMfsRZmrdVbttE3ie3UyT/OIEeKAE5Tc8A35YM65oD7JaAwh3QML6RT+/NXlPFm706tBiOMsl3Qgl/1TTBlq01XJsPLEBTMJyK1yyZLvFgtYf4ZMzxMeuENF3Os7WtrEL3hSB7Df+p7n1GFuF3jqyGBlunRIdPVuTtAtHDBUfwkMY9N3wFg6XAFDmkq9Ots4nwoW3yNlcLUFTr/cskOn8UrjPNN/MKdXNab2Me8oB8LBnGqm1zsaDYZb550Xpq/vnuNYUHQe1eHXjYV9yLUlx2HWc+LQfrh+oPGpwv1rGyyV/rzuMQnRTmcB9rFVBsJQG4u6CnAka+tw733m6Ctpl4aBrirO6CzAUR6nDvfhzh19lbMTMt7W+0HyqwSiDRlaRUeGDEyTPYFIKQ6nN22jwXz4Q60dNQzmePKu0fO7WU+oYAwvrBSgyPUYivDC3VhLlFEYN1ENRtMRVD9tFjdNDe07bKj4e70aCZ13f7UaiXZ+Q6FoW+t3rJ1MHXqtgSzTwBo/SsKqOZojovfb63WMmt77b7HlGLJSr220qaJ1CbF22NOM9LEPOqkig0ZqwKAektSjZsU0cikoFFjhkOfuEWNLwMsIj3sRz4tRhOSs0iokRs/MkQQz0qlrgaKdgsLwzajVoI5wKe9q+SJz+GjxwsHjyfQ0iRcEWXsIvKCK62lzNfF4NMV23uMlQOgrBo0CwPRxHxnAkdYtT9NRuTLmg7mB2iQCn9pcynF9A6FxhgHcTUWVpdwV1hg8SdLoE17xfezvI0tDdh0AA40uiqP8rnuS2S6zQi0QIL5xi0QskX6Can61QDBDevUCQZ2RVgsEKAi9IsAmenNFgMPFEORZQp5hL7oPQ6FGE4SrIkRJjfYp2of5DiwMMiEEqIR7rYEgIcF0DMSFtRM19ZL6D9XRIRWXh23Qg6HLEXDHNkpk/+UxuEZnd/Fr2I0hAg+ZqtccapSKXnNoNR3lF7LkosqPArob0CcT1peLOsFK6Q7KQp1FSyBu0ARPToE09sRzDZiLBkqTUGCP6BXttd18IM1A3Pt78RgzUOU180utkKBwL2qJBFnydd89hfzFFHevnCM1rzEfwSv/y4SqGdrrQWttNUlM2cwBooNfbZlO8e1VLTrRqpalg6pFWp/2mCeH6ByHpqNhtgBDnr9krDMAodDTRN/kMmlA2lYGBXOSHPzEE2PNIUw8MciHc63LpSXiiSc0skM88aSnaFgtDC0ekDPRbYkINroeUdNRCiFa9wr1/w+rTtuH0A+q0kOU6ATsjLRfWjeEXlp3QFhaJ4Aey+toLEK9TZwn5hYae4SJo8VhPJus4ITGIlcLtSuHj8YAB8fvEuSFR+MwUgvHJtN5adEATC0wHoXK2uORBC7Q2GllwXP/3F3OAWZUutyQ29EFipqOyo0ezXqJ1p+Z/Q71GiUKntO/Cc998SucGbe0ml2tDBCOXNeKvnWJV2b4fgJmfeuj6x4JR9ctEh9dnzksHF23yK2j61YifXTduo3WPCykD6hbRA6oLywpZ8YnnvYH1K17OaBuY9UH1K2D+L6yTDA5oF4GSCKbW8ztlCAgsxoCkeLVEDjTW2B5IKPBA6ULXcDMPqgXcCkMvadeIWGPFY3+4KsRBfFEnW1O2nerhtD9qgNCx0oguEdU0WWZiCq6LFPTUWWmxwOGr/UzzcRVD8prWP0NDTlJ34+wlIdB7aiWydUDg21rwaftBUKK02au0NEZ/ZVh3TqGUt2ZsyRkX/MMfGsZdpkF1tUMpDG88XSmduiNwIrAugqsNbzrRxahmGDU57MA6/5ApWbCRJzVlWwzRfPVJY/4dUAWw1mpSCtFHwZZL8TkIcL90VcTWL8xj/nZAJknZ69itZ7QQZkoeX3wbtcZU7DSAEdeO2kujK2Ni9Pl3t6pVk8tidERKiSB1AJs1NYF8+5VT6kQpOiXkFEpOfCrGzvS619vXYF1ofKHTI2uD0WeRteHajqq6RUZZ72DtLCIX8J0pF7zFChsHxHa37PHejKHE3JFR4cRNEMeIlkl9mIPax3lFFrMMRVq3k0UVmFZAxf8kG/mDh5otPiQee1UkcHsxIDhch2QSh1EqEr5Q2t403pGS9rrGYbQeoYDgp7RJgN1x1Uy+BMU6DSHsOucLZPhfn082jlT4Qlt7jjz4C3j2QbMIByC1iZcZLrjF1NIEF3DmqYe0PILeGUFOrviaFNQw3WHOzJ8ix7ZWkIOd6ymGvALlMtUo0qBXM40w9+JuMw1qk1s0RcN1/emYr6iTSFzCMXr4p3KXqSGlAMmKBGfR4hHGTWvykDqMkDo2oAZ/k2w8Kyun5wn3vqSB/ftt5uc18ng7YtXyDxdHggjMmlB8vQOMgKNDIxXpI8shXlqPyWHG0srQdvcQpKrS0tH+elC9DnZMtjoqJLJPl7EjFF4uLI+hne9wz1Pbm/XI1khp5CdegkQgos9MNTGIb4wk7kcX5hJefbeomWCb8zsaNY6s58pH+Yt7bfet08tZOxb5SrIqrLocUAfoq0vG4ufoebqmlUtHe7MYqFaDHtVnkvK09vEcJbpCHG+AKKVIriwSnKaRO+IG1KpyBXpoCFPAnnrbqc52V4/Nl5RKzpobOgbzIMqU2L2Ni9e5tWQfOx5YzbvW1+Q1Ap1ZYGgTxsgVqdTC+14UR+GqSFWrQ33lmZtUqIVa+My0qsNcutGKJMKrW8bl6JuG3a4Dqp2pFe2jWN36pEym1SL7m3kCjadk2ZGwKvPqSX6Iy+jZA0Vw2v215aQOt0uCakhg+6vTPvpz91tCsFFQ0BRAhWrcGiWNO2iAXmeoVEdN49GXzOViI6Pm/369HDZWaQhct5SIKPgpKhv+n7PNHP01WgAj/5h81XtvuUCKoYyNveeOUz3BmMsWsRFgq0xRRRsWFBboQj0mQboQ4PoQ4X79r0E+w0DqIPybFyRWTdKzT3mwXXPVqh4t3KexE9+TAoBwn7lLGD3u9f11zeCCwE90hjk9DAcO7v3N9w6lNEo2Oe/xvQ43CQvfLZskrys1/uXoDzWBuFZrmATlcGxnmPNQfpetcC3nz4Rf+rMzZ9ZigGBlLnyAoP7SzQPMy7VNIy0XsxOQfdva0wH/CZUxuD0+jaduLPAxkh/9DTNlOzhYRvZQS+YuNFCPMNFxOxOWNHLRKvtTN2xO7gLajD+Chkf3V/mbWCZ94XRWAWwbxgvAqD7KeUuUnxVXKL3zhSmFHwVhH0BuQmAvnjZpcbfrZPNFD1Oz0rx7IPJtULsWZVKITpJrcKjNOkIJVFzDapU6VDse8ulQnS6DM6Z5qZ/NPO/DMCpCyf2Tbmfolt1KUpYkCfl7l+p7GeaamKjiGytiLBF6YDxqXgHX52Kd3h8Kp7gN+UKutmLXp9FQoPCjBLSC6rQhuzNoaj50Qk4uAuXcUynQoVJDrHuW9ilyVF/rN3b2GUORjAzZhHFhxzmib6wlOGOzlUYKceLE01RGzS0fxPO6FJB1v7ozgs6unnB25yRxMcHKOnRPVDMVm2JoHXMPRTVV3EoRkTGHRUBBNO6b612zxxmhwKqhtxZtFg0aqUO1KfxvcNIBh+LtJfMA2rPqDbYCTUFkphZrzNINY4x8G/6B75NisYxN4milcDJ2O9gYAJw4r3XGe/OflFL50ht9EZQQ9r39obQnboDQq9OwLw5XPLD6NNF4s5FXO2zzoUz2mkVxnjte5GMz1hg9HbQaEXbOPUn0qqa1OEsdhe5iSI+4mEktTbgc/P5El4qxlzdABeZnKeMYDiteX++N8eASvpiUs9fyHSV4tzho/Q6OF7/r0qPxnlQWHhkwV1lSbyFPHXAKFucbzMgjkKYKpaEosDRPkDlgjoz+8+hRDAvsvjIOROpGzxD1m2b9KhAmAOvR93YEAj3odEUG/OljQ9XBgnb2IWh7c73hCc6DGk3tUtHqFZnA5Rmn1lSjU6oMtoD5o8vymYONSy6ngX1cuAhzcNTD83sT6pI/rIkSqp5HLSFt4h5ZuQTZhszLy/CYXQ6N0m/iAFfisTpJ6ehvAf60R6OZ+WVuQPch5VLphyasbnkz8wfUgqiHrKbWSpY/vFS6ZfjsLk8mOXaFYnfeXz1q7lFxTC5+N9t/G7BgtBLtzOWgjQkNeQxLJdmgoQF0txgmIPYY7F5pWg7aUE2nEyLrPmhpwQpgV3/nWcOUT/U6ipyJrrNBfFEd7eAVmuEqMhqjXCe/EGtO03+kKM0Nb/3ygCGgDp9l5EcGVmXxK4MjSui46N0DM1f1ea/00lErSPqQVNZFVEzTeW5pjidClRQaTwy1os8/gfPlX0H/l/9XGlUETfWq4T1PT/Xzo+Hjtc6KI1xlfyhl0xRhqKLtZPkD2eCNMdn1DHA3cBTlRjd8REUMUUGNcWA0X2AbWVfe43woGKNuP5+O4unMT7yZbkBM6S7Gsu6mAo08moZ7rCBhWYCjdwaRpyaSqCRW8OQ+mqxOmAj15bj33y1WBOwkWvDifOnFGjk1jLc9f8Wmgg0cmsY/p1XCxUCjdyCIZ3qInG10Ru5IKN8Wiis+U5rTWWFpvJUU6H2emTcejx+1Qg8I24ERHmRj7E2xiTCU9IzpRoL74G0gronQJpVhPjnPRQs2zTBb7RwF1x6z0YeZwuE4T8T6n59Mq+wtoK4W2PThSDRQB+8mlGLw2EbQzKQ5XxJ3bP8zbMe8tHUgVQjYNpY+BbkA5op+mBNdQxgLrr16ZorjEtBWaWBKGVVwvVGqILH6Nz/ArTavZuA9NsbRSKbPjnxjdvwRKyOsCsZxt3IDK4dYcoQbkVWIJcJp2asYqtETdIcrfcNJ0l8NwdpbaI2A61N1DQdWRkgK9ZmQxBjo1nCVIu/KXjOSvSayRj3J7tTQuNOcx8ElYsy0W8spSD9rhamqcdgK4X5bnhLoUVcsVUU2WpHCYPKMZrTzwzt92GKJpByJqdAfnaYQ/L5J6PQQd9qCKGwgsJUChIUJsTdPfGBHTtPZRE6mpsALOg6IGZLYFVi0n1UKwB5asmgk08IjA4eM2BdbgvSb52x49UH5fL0btWucvxTt3fm3NwxMlVeKDoqXwplTrcZiU/b8bBq0Xhcre3IGTNCfz1my8hR27EzZoz8OXYALe0H19qOoYKNfDuOH15rO4oKNnJtOXGyqoCNXFtOGGJrO5AGcOTesWSQre1QGsCRe8uKM6sM2Mi14/iBtrbjqWAj15YjQ21tR1TBRq7JsZ2tXezPeIsdoF6pdJUFaBS7VuVlcXWoyRxeOvIFHW9o3gZSXUNfoQfTCyaYeB3DoXkSA6cfKT9sOEv7GYyhGw3ou0AKMkbXUJiAzv0Dfbi5LATDfHt3tdiQOny02ODg8bJCbuHRTawTi46Pi881HBsNzhxL3DogNpJnf0X0yjxx4fFo1cIJN178gU5g8WjlI18oNA7dxRofZ19acLyOkbt8HZs/urQj5cd+ZIVZMiiurJuh2uyZ2bXs0THJmYOPvXfJgVCvjtSMRXeEmo46QjTXnlZ0PEvJL23ZXxjE7UVZNv06y1UTZ0C0RjeLOFr0RcQJa57ZMheO223ImjaG9Lm1WczSAWVkxbYCKQM/RydfMMs6aqPBAqlx5wzYqBZChYaGHIjmaYgoOj+A0ovOC2g6ynNUI4giJwQgnOj48KOVreWCtNewUhL6Cg1y9bVEqaFH9xIxyOsTopOA+u16BekteAXf2kKc3mD7rcRbPL2lCL7edoX4Z3/KdoZoQ9bPPKH7N/iOzh8gW6PzB5qO8h+hIRij+yjNLbNonLxVTrTnq90l+2Y53InIrw93NskoTycB0TfuBfRWjubJdzP0BkvnZ55wqbLCj1bY6+QkCnvjvrXOWBYAN0GnMqSrcvS7iZWzZk5svJbUMOTNaC2pWQDU+nlt6KCfk9Z3dDBqfQmHpiOrHsYGfRn/b4cLYnzbdq9rA+3DyX4Kuu+ejZaTuu+wnBIjQfXzeNAOiGBK5Btsnlna22RMHb/f8/+dXCmC6h/wS3hmLbfw3gfnaE9ODCmBW7Lv9enM0mHeS2Fp7cRB3oUVRc592hRcuk57qT3oPVUO0I485t1YUWRfxIUh9Cw56VkPSD/rKVP3HVVFBK+mQitQ29c1LVNm9lNf3OmgG2Zzy8ay/PO6qAhhSpVZQu6Yg5Z1iuZYGcWMpEoN7YcK6DpCRs7grUP13u30SIUm0D0Mdt8sd9+jx9nmib+bccL9tFPXqaetckOPmmBmwKs2aN2OGyHK3j9iUdrPNNfEoyKyB0WEebYDxgtEDr5aH3K43j3PkhuPVtBdtBu8JKD6A5RjdK2WpqP+oAVj3z8MO7v41AQyrD4pMFosUrhsmU4N9nXoURs5TjgBZosbeDS2oMp2+m7NLEtGpjEspK/mgnU2MH6GTWUHqHF6aZFggFdq4NYZlYl14Ed1F4B6QLO1iB7jlx4KhnYOik3tKg8G+zoH3bKwc6JqQw/nOsp/h2lzOgeJQd3c0WJS1wrgjeqcFzGjc5HrHTjnJD7EMgmgnGKZKkyOsdQOdIZ4COzxLHflQ3E7baNVs4qAGoVL0vrCtpoAbwSSa/NSh+jnkVaLMoLDnXqrBUvScPSzSPAw0bC+hK9wTyJZtr60D74yDUfRrBK538I64ikMo6TlltzZFUlef2Fo9kCXvXJvlQmTBVodcEDQBwyww1R+px4RMbHoUQRj2/Yhzkx0vduo25xaYNRvlha96jgri497ThaRvtKOgvDYoD0yaL+dmB4x6xLNxH5CVE1pIss00SkidI8OGPe6Dr7qdR0ed7EEo6xiH7rlzceSKlbd3pxvmJmvoCJpOihIGjVfwxlwtriGxU/MFC/LKzT4cLwh1INFaqCgl1lBlAhzDYSgHCzOGkUHV0StvlCj1vZP5jFRqtT8pCnKwsGmTil6dzmsz91ooYU8PZKhhukJeaPpaCRDTvW7i3o7ZmmB6MCzAfe9tc+hijHKKcY+nK6WdKYWHq3oWHRkPdI6MF7lKZNblh/zJDb6KAwdHyilxt6zz48WZmx4o/tLl8ktcxEmkqc82Ef0f4YhyZBqwDTuwnBZBPKWvfqKbD9UGq96WHRAGBQNEA+JpYXCgGiAW8OhEUUPhsZlNBQaRA+EBpBhcGYoGQSXjvRDoHEsA6CJTg9/hh0/MbwS6HLkfsDbBuPwHvU7NnefeWcyQuaCyPhYGciNjojL2XBnK/sZ7TQRs4c3K/epFekZ6oq+bhz1K1p4QeTcDT6pVrIwWDwec0d19O4eyi+6E5KudKvUdNQqIeWw6zcXI6uxtV6/OQW/9ixjzh7zkCdcdBKTZGQk2l+4GIt+T35WNmlIhXUhJNudC80m9lPXPAduzE6w+4yeWVOYPLM2TU6y1IQWbnRSPVlpHPbwwAswpp7a89zs0lF+08vcyw394mHL1w4x2M9nzkV4HslzfEjPTzQSXHnKhNsK9bB+6eGJUXtwd6BxVOqpgf6XmSP3JjTvFDWGzMKTJvCFp5zs3E70oYXzCddJKZ2bcIHRYLYDzWqjd1RpR3ZJ1rqiB++odo68+bHHvZymbF5RQ8zcw5Ueb7Q4HYN1GMolWtKpSHu1yhBarTIAn6TQPTqHbaLxkjPXCYjGj1XUE4uO1+0zC8c9e+mCGNkP5haNR4bSgqO+nU1IrwMiGnsqgs+RMyccFd1BhlI0ZziuG2TpODfaI0RVFmH2Wx38recOCwdz2UmHQ7YcxS4PW6rVNEwjpbsTZHH0pqymo+5kmcSvhxYUhtq9tURLkbgLLyPh0B4ZrHlKC90IqsRGHQg2ZUsE8zZcXtfRvU6LhLbNUAr04dw5yYdneyQjc5Q1VeB7UHJqNyNH2/JaOpjyklbbvhXJ0fvcGbGr17nz5BytCa5IjzTzBUPvmaYoRcvkHC0frhQdnUmegHF+7bqdvuf8vOZBZxP0V6qXc34Y5ZRab6C2IzJoxgYM+ilIe1kn5s1nbZUPhiyDFfjG6Mu3DdBXnMPqV4mMeNDPW6IqGiBe30eVNOjYQp7F+3D1OGTDPLLw1Wl7eDEXjybnsFiWWyK+q6VKgUZWCZRVnX+CLnCOVsYaQ8sCGmTQBw6mqAjdrccG5nSoLimfkxw941ASu3Hp6zzzjPHFAZMFOVcPP1QGDQfcTcC3bjjAAOI5V0E3ZO35cO9ZvSs8U+hI/KlhxbV7VlvwRtRT4VxF3ZJ1fRtChaKJ7sUpFR01CjrcdS9bngvNeGZNSK9TmDh2PSft3WbQd7BNPOOPjksHgcGkK4XTkLeUY8MQRXdpKFEtKUpY2aFTqpZ8KO1sXx1lhp3DhXOKDBfOGTBcOGfIk66GDZpi97UPM+pZY4Fo6kUwOuJQkPa9oiF0t+iA0C8aIPQ7+cTQI/uXBUEuNT1jpBndwViPeNFFjJVm+tX+KLSrKxlRH3QvkzWGHlXTuQGv2ox1O66+jA99Qfdnfzqb+zdyCzzyMGLGd+VA2ieCavtpTnqk9ntkxE/U7KxfzWZnwhlNaIUxnr42yXiX3uSNgUYzU+P0GM+WFoLJPGgSIKmtTB60SqOvhLs2UybEHQ9Z8vPFnCYRdkaMVmOTVZtYb+r8SOUgASYWGMKBktoi6ogJS9Ye2tF302eCnsx7cpzrhens4gY3TDENGyXDeXhuP4NXB6i5+MwiIQczDdyaj7vw/YzcBaAWr50DPUufeSjM0x0Uz9RzD4a5uoNudUhOVD1fd66jGbvDbh0SLy1LT+eda+nnnJMwpZ8L4Cf1zotb7TNHUdoY4t2aJ7NB7RjSU7o06MPkLjg/Tyeprr9E1Y3u5kKdje7m0nQ0dhgGmtFVI514xqiNenzcRLNkPDmoHDJqoHQoz7yFR7Wcoj+xkLNdyR01RORmuNzvnJPSeeARERajXVazUDSDmFrQz+Yciozv9506PEShedIxDBulQ+LBxKAv0YtmlERd/eBOlFDm6FrxCsqtNmApQUerJJBUvwfNNhFdVYX+IrqqStNR2TIgxIPs//NMc9qnrbUca4uIIXdGs0FaXLktPRac1R7a9xsHVQZ67M29Ms3SUGbZjxNVEnw8GB2o8WrutbDShd01hkAzRn+/8ATZwmlgj45m22GCfUSf0Jkb5GiePf0uV7YCl991ok8Uz266sqZMOR+I/i5bImq/70bHhC4CqrWMGwjZHWv3o0uTnGWRB6mn/ZA1803ZqXnSW+zOFeRNdhGC3Efo18SR5cd+/bRBsHziwRC7R16aPrXEkTtAzdwSPMRPa1jagPLZWr4013NO5D7DRCoCwlTKwWEyRSCaNBjAGHZSceNnmmlCc7J7RYRVdAeMN1gcfLXB4vB4g4XgNrrIDrmnVzPQcvUEe7Yi7W/BMIS+lccB4coOAvoE9czQ8RyQ88vrKU3DJn41u2jYEcQa7MQAXoW1lNZhPRKUWCLeOKtG5NHNYKgP0c1gmo46FlSPy/g2D47Sl/F1HosrMDoZjSx67XZflZ7ROEQGWu8kaGm5Q2SwNH4O57ewNZw7RDSGIp9OHSYaYOUBCZkB8WauPONH0D8MqbSjmnSQOQ3kLc3IhOr1IuN1dLNO4bDvIboPmZCjdajaAkGDMkCsP2UWCtqTAW7pTiYpWnMyLiO9ySC3tCYjtNaZjEspSMMO+tLMkV5bMo6lSI0c8m5OY7JQK0PGtVeFHNEfN0bRnCa8RhnxXeR2tXlyMes5GaK9KLM/UuqylxqkuxqtXCYXubwMIYaFFUeEy8saDchKS5VEz4HmyWWzDt1HkYIOt41VlpSzIZDd2yFCRH3b2CKQ3jMmxIJJ9HnAJBlzhQXRVmmAnQDpUkUjdxItS4DqpjAIKTeUQUptJmnI8C4xSH3tD8LR14lBd7i4C8qaif30V860M0uraCmuvqCsbSwdhbi0mFxQtgIdX1DGHNeQzhDk3ZUdMmTUtxSVye3lYXjVt1Ogz7+EO8yQqZKZ6Ogu148YrzyoluQq43J08xOkj1RGlAVX4PytQcVK0eYS7QlTIJD2m2u3uqvJFe4vJ6Jb9xTxnJ/s7cyy9QQlJxdaMRt8u2eRvsgLPCTQiqMtbzQonsg2158tCk/ox4ebMeh1SBO44fgLHzAPc4jcn4bK8DI2xPeYO0kBEaL8ZQKsdT0v37+Mn8qGwnc1/E2L5Gr0m4+xaPBD3UAPtzZW8GrldBXgq1czG5S7f5KY/qP7rCoPSCeA6HVvh6yRboXfusVaOjRZ0le1LgN4y+45wr3FcwRqW2cwbgWSJtdhaEwHkSZf2cWXyVfZSyvwrbfSLB0MlEjrW4or0NwsWJIRtgdyRZbFCAhLkgYMS5KWNKe4oAE3QgWt2GDaz2pC5G0IL7uhZ/sahhkEqXo9qEHRS88YW78q3XI+JTlSLRtiV5rlguhYsVwC1JkzA23ejeDuiu8TzAg6qRYCcBKrngabLCOOPo8yizjhjaI4LAfWAKPbb9vkq5/LIE16WWMFt2iC+uEkNHcL+TrkaV1/iJ3WR31XPObpDvNNRADdTgBGHS+qoJ6rVxDImJjefGe8HTN1UjxTG602yf9isEoPOoB58lU6XVQlP/hVSGxQ+ZHjeiyeoeLogW01TV5ZyFXy6rsVJPl1re4snYHUhzdWoPXhDU1H8i7IkGBqUOM+tG49qAMkeFZ2uAWF+2ou1uMEncF+fbs9hCE169ewU8g4R89ImtBfw0uUYTV9GjNib3WZvKpnhpbJa2i5pSXETB3d8Ksaz2uSaosN85BX1dKhO73q3axZChq+OSbwFuo0RSqixkoHIV+Rnk7dmwrJvKZUwyFNFvTFkAaQRwox0CrAzWWAL2cOh07VHeOFmEn7HZ4qB2i/1278Cstk9T2mDmFqHaHb2huT/GJRRYi7NJzn4LjlZSqRclw7x8PrwV+kY5yEk3g8kn7lRrOXls2kfS+IRX7tRrNTz+b94ryja7SmVX6HL4tRLs2G/m46Zjccab4LxPjzb+PxRl2H9jTYCAZcFhVnLgmnMw0Yy4mTWG0/lr48/7fFu/r7TiStLhnQF7+X0GLsQjNRFHpBfDYBrVuNoaWZQOaoW0ce6SXXWQZa+9Z0pNQhQwbzMMmMH5HdC1noSf1GUIY4pL9GeEbfTLmF/KrPysFV6L1RB98OZqK0Sjj3xHDzpxqB82Xypza3zpJgT4lZ1p+6F4LTqBdqkj+jEx3QCf7kBUpNm0SWjui4xawRmfynkrXNEz4EBD30bb3ehA572ib6tnRouG8yM18mcnF6Rlz1ZFkSXaNuvOmlLNJ68JiC1uOGpqOByDAkmhTUfs3h1e+6UtyroSn3oI7iCozqwgJcrdqXcB7Ko7ZEGCaq5E3P9JG8qIAsLdPgInlTCuB0TtLcCB+GsGUWwFg3ZF6Od4pXxvWtkbCMGaORcB5zxzvNqFgRf7TlDIXk7Xp7GlPwt6vdaegmb7eNKzD+vn3HuALV9e2WccXMBGa3LIezXTcJGYc6oSoi029MU5nncZsmokZbQ16dDq8ZwHG9RRN4Q9sMJhbzCI8fxjI8fXHZlBl5vLmCgwYHKDYETAUbH7VnVXasGGcFOPdhijKDDF55YIm4bYpmaj/9agumUm+91oGRC1rwgvxgdIhY+sMb+mmMFWzD8eYYhYi6G6RtMA9mm48wT1NkmJYZMEzLDBlNsTKH6PsyVk0KMaID4ag0QxC5Zji62deKjnqWkgypDSiwqzuvoe29XV163V6BUT+C/sg8VmLPJ6AgBt1PGmFVh2ZieJNttIxJfgtv72KWJkvgLMmX4alDIe9ZAryXaR5D+oJRlCtt4uZIpR+skDN6sIIoftrBShkGLiQhOvGNIC4qg9EJRAfAS0VHGVyQIVVpAup03z/pPrZxWD+c+8c+ejQDQxp4u/4MPUTDVYBv+ZqRPS7GwoNa7CswKkbGrroVdowX3XuwJ9Xj5HJF2i8Yr5JvHFvnyTd9WA36xjdZRCbPO2/wrS8cIK2MOmuSI6NOBnVt1FkZNBh1Gldjo04G16szXJmhR0e4JgC1jSdD+qN7xIRbHVhFCRs0visQvfW39fEPtSnPGN/M2adlaT9D1xABoXNwcOgeAGhtCSn1S+VVi28ZqWeWcCM1an0KwBp+8tO+sV4tzJcYVjraj9ezPPkWLeAgtpuWk2hS37pbJ6NRAaITtgg/OmFL+mh2rybmK2z/WFrtX5UG8FtSltJ7Sh4Jm0oWiXeVbLB6s8gi0W6RhfSukEXUzo8F9HkXi/jtHUuZZvT7wLfOqAusAngYDg7PJpNFwK0MwFD3ndEakhGdR0ShbDvdnOYEzKK/vko+I6oLj+HcLr3KcG4U3zL5Fh0rQwWOjpWRPgzqPnBUQW0lwoYRDYwQNToRA/fRiRjQ0s/D79gsABOib2GDDQmK7OEReGQPP0/+7a59v0z+H+SUGTTsMAEA)r{  gzip
decompress	b64decoderD  r  )r{  rc  s     r   _get_glyph_textrf  yK  s_     MMMKKK??6++NLP P P P` vxx

aP%r   rY  rq   c                    |                                  }dd l}|                    d          }|                    d|z            }|                    d          }d}d|z  }|dk    r|}	n|dk    r|}	n|d	k    r|}	n|d
k    r|}	n|}	|	S )Nr   a^  
            <!DOCTYPE html>
            <html>
            <head>
            <style>
            body{background-color:gray}
            div{position:relative;background-color:white;margin:1em auto}
            p{position:absolute;margin:0}
            img{position:absolute}
            </style>
            </head>
            <body>
            zP
            <?xml version="1.0"?>
            <document name="%s">
            a  
            <?xml version="1.0"?>
            <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
            <html xmlns="http://www.w3.org/1999/xhtml">
            <head>
            <style>
            body{background-color:gray}
            div{background-color:white;margin:1em;padding:1em}
            p{white-space:pre-wrap}
            </style>
            </head>
            <body>
            r(   z{"document": "%s", "pages": [
r  r  r  xhtml)r  textwrapdedent)
rq   r3   r   ri  r  r  rh  r:   r  r   s
             r   ConversionHeaderrk  RM  s    			AOOO??   D //  	  C OO   E D,x7DF{ 		
f 	
e 	
g Hr   c                     |                                  }d}d}d}d}|}|dk    r|}n|dk    r|}n|dk    r|}n|dk    r|}n|}|S )	Nr(   z]
}z</body>
</html>
z</document>
r  r  r  rh  )r  )rq   r   r:   r  r  r  rh  r   s           r   ConversionTrailerrm  M  s~    			ADDD
CEF{ 		
f 	
e 	
g Hr   c                  .   t           i k    ret                      D ]V} |                     d          r|                     d          \  }}t	          d|dd         z   d          }|t           |<   Wt          t                                                     S rb  r1	  r  0xNr  r/  base)_adobe_unicodesrf  r   rl  r   r|   r  r=   gnameuncry  s       r   adobe_glyph_namesrw  M  s     " '#%% 	' 	'Ds## CJE3D3rr7N,,,A%&OE""%%''(((r   c                  .   t           i k    ret                      D ]V} |                     d          r|                     d          \  }}t	          d|dd         z   d          }|t           |<   Wt          t                                                     S ro  )rs  rf  r   rl  r   r|   r   rt  s       r   adobe_glyph_unicodesry  M  s     " '#%% 	' 	'Ds## CJE3D3rr7N,,,A%&OE""''))***r   c                     t          |            | j        j        st          d          | j        }|dk    r|                     d           |S )zPrepare for annotation insertion on the page.

    Returns:
        Old page rotation value. Temporarily sets rotation to 0 when required.
    r  r   )r-  r   r  r   r
  rs  )r   r9  s     r   r7  r7  M  s[     ; &%%%=Lq !r   r   c                     t          | t                    sJ t          |t                    sJ | |_        || j        t          |          <   d|_        dS )ztClean up after annotation inertion.

    Set ownership flag and store annotation in page annotation dictionary.
    TN)rz   r   r   r   r  r  r   )r   r   s     r   r8  r8  M  sU     tT"""""ue$$$$$EL"'DRYYEMMMr   c                    t          | t                    sJ | dk    s| dk    s| dk    rt          d          S | t          d          k    s&| t          d          k    s| t          d          k    rt          d          S | t          d          k    r5| t          d	          k    r"| t          d          z
  t          d
          z   S | S )Nr  i(   i)   rl   r  	rP  Zr   )rz   r   r  r  s    r   canonr  M  s    a 	Dy AK 1; 3xxCII~ c$ii 1D		> 3xxCHH} 'c#hh '3s88|c#hh&&Hr   c                     t          | t                    sJ t          j        |           \  }}t	          |          }||fS r   )rz   r   rf   r  r  )r/  rF  ry  s      r   chartocanonr  M  s@    aq!!DAqaAa4Kr   c                    t          j        | t          d                    }t          j        t          j        |t          d                    t          d                    r2t	          t          j        |t          d                    |          sdS t          j        | t          d                    }|j        snJt          j        |          rt	          ||          S t          t          j        |d          ||          sdS dS )NrP  r	  rU  rQ  r   rO  r   )	rf   r   r   rN  string_in_names_listr   r\  dest_is_valid_pagerd  )ri  r  page_object_nums
names_listrj  s        r   dest_is_validr  M  s   Ax}}--A"Ax}}55   

 )"Ax}}55 
 qAx//00A< 			a	 	  #Q
333A&&  
 q1r   c                     t          j        |           }|dk    rdS t          |          D ]}||         |k    r dS dS r  )rf   r   r  )r   r  rW  numrq   s        r   r  r  N  s]    

3

C
ax q9  A#% 	11	1r   c                     t          | t                    sJ t          t          |                     D ]'}t	          | |d          |          }|||z  }||fc S (dS )Nr  )rz   r   r  r-  match_string)r/  r  rq   rS  s       r   r  r  N  st    a3q66]]  1QRR5&)) 	1HCc6MMM	 :r   c                     ddl } t          t          | j        dz                                          dd          dt          t          | j        dz            dz                                dd          d} | j        d | j                              }| j        dk    r	|d	|z   z  }n| j        dk     r	|d
|z   z  }n	 |S )z'
    "Now" timestamp in PDF Format
    r   Ni  ry   rJ   r   r  zD:%Y%m%d%H%M%Srk   rE  )timer   r  altzonerjuststrftime	localtime)r  tztstamps      r   r6  r6  N  s     KKKC$%%&&,,Q4444S#$$r)++11!S9999
B T]+^T^-=-=>>F|a #(		 #(Mr   c                       e Zd ZdZd ZdS )ElementPositionzDConvert a dictionary with element position information to an object.c                     d S r   r    r\   s    r   r^   zElementPosition.__init__0N  re  r   Nr	  r    r   r   r  r  -N  s)        NN    r   r  c                      t                      S r   )r  r    r   r   make_story_elposr  4N  s    r   rR  r  r  c                 8   || j         }t          |          }||j        }||j        }|j        |_        |j        |_        |j        s|j        rg S | 	                    dd|          d         }g }|D ]j}t          |d                   }|j        s|j        r&|d         D ];}t          |d                   }|j        s|j        r&|
                    |           <k|g k    r|S |                    d 	           |                    d          }	|	j        |j        z
  d
|	j        z  k    rEt          |j        |	j        |	j                  }
|
j        s|
j        s|                    d|
           n|                    d|	           |g k    r|S |                                }|j        |j        z
  d
|j        z  k    rDt          |j        |j        |j                  }
|
j        s|
j        s|
                    |
           n|
                    |           |S )a  Return rectangles of text lines between two points.

    Notes:
        The default of 'start' is top-left of 'clip'. The default of 'stop'
        is bottom-reight of 'clip'.

    Args:
        start: start point_like
        stop: end point_like, must be 'below' start
        clip: consider this rect_like only, default is page rectangle
    Returns:
        List of line bbox intersections with the area established by the
        parameters.
    Nr   r   )r  r  r\  r   r  c                     | j         S r   )r  )r   s    r   r  z)get_highlight_selection.<locals>.<lambda>gN  s     r   r  r  )r   r   r  r  r  r  r  r
  r
  get_textr6   r.  rv  r  r  insert)r   rR  r  r  r\  r  r  r   r=   bboxfr   bboxls               r   rG  rG  8N  s[      y::D  wgDGfDG} ( 	 ]]ad   F E  AfI 	t} 	gJ 	 	DV%%D 4= LL		 { 	JJ''J((( IIaLLEx%'S5<// %(EH--
 	am 	LLAQ{  IIKKEvC%,.. 4658,,
 	am 	LLOOOULr   c                    t           i k    rbt                      D ]S}|                    d          r|                    d          \  }}t	          |dd         d          }|t           |<   Tt                               | d          S )rb  r1	  r  Nr  r/  rq  i  )rs  rf  r   rl  r   r   )r   r=   ru  rv  ry  s        r   r  r  N  s     " '#%% 	' 	'Ds## CJE3CG"%%%A%&OE""tU+++r   c                     |j         |j         z
  }|j        |j        z
  }t          j        || j         z  || j        z  z             S r   r  r  rf   fz_absr?  r   r  dxdys        r   hdistr  N  =    	
qsB	
qsB<SU
R#%Z/000r   r   r   r   r   r,  rowsc                    t          |           } | j        s| j        rt          d          | j        }| j        |z  }| j        |z  }|d|df}d|d|f}t          ||j        |z   |j        |z             }|g}	t          d|          D ]}
||z  }|	
                    |           |	g}t          d|          D ]A}
||
dz
           }	g }|	D ]}|
                    ||z              |
                    |           B|S )a  Return a list of (rows x cols) equal sized rectangles.

    Notes:
        A utility to fill a given area with table cells of equal size.
    Args:
        rect: rect_like to use as the table area
        rows: number of rows
        cols: number of columns
    Returns:
        A list with <rows> items, where each item is a list of <cols>
        PyMuPDF Rect objects of equal sizes.
    z!rect must be finite and not emptyr   r   )r   r
  r
  r   r  r  r  r  r  r  r6   )r   r,  r  r  r  r  delta_hdelta_vr   rowrq   rectsnrows                r   
make_tabler  N  s8    ::D} >( ><===	B[4FJEa"G&!V$GRrtf}--A #C1d^^  	W

1 EE1d^^  AEl 	% 	%AKKG$$$$TLr   c                    t          j        | j                  }t          j        |          }t          j        d          }t          j        t          j        |          t          d          t          d                    }t          j        ||          }t          j	        |          st          j
        ||d          }t          j        |          }d}t          j        |          }t          |          D ]3}	t          j        t          j        ||	                    }
||
k    rd} n4|s+t          j        |t          j        ||d                     dS dS )zL
    Ensure that widgets with /AA/C JavaScript are in array AcroForm/CO
    r  r	  r
  ry   r   r   N)rf   r   r   rV  r  r   r  r   r   r6  r  rc  r   r  rd  r8  rF  )r   r   r!  
PDFNAME_COacror  rF  rh  r   rq   r
  s              r   r"
  r"
  N  sX    #EJ//I

&y
1
1C#D))Jc""VZ   D 
	D*	-	-Bb!! ;%dJ::BAEI&&D1XX   !4R!;!;<<5= 	EE	  GR!7T1!E!EFFFFFG Gr   r  c                     d d fd} |            \  }}	}
}|  |           \  }}	| |          \  }
}||}||}	||}
||}||	|
|fS )a  
    Helper for initialising rectangle classes.
    
    2022-09-02: This is quite different from PyMuPDF's util_make_rect(), which
    uses `goto` in ways that don't easily translate to Python.

    Returns (x0, y0, x1, y1) derived from <args>, then override with p0, p1,
    x0, y0, x1, y1 if they are not None.

    Accepts following forms for <args>:
        () returns all zeros.
        (top-left, bottom-right)
        (top-left, x1, y1)
        (x0, y0, bottom-right)
        (x0, y0, x1, y1)
        (rect)

    Where top-left and bottom-right are (x, y) or something with .x, .y
    members; rect is something with .x0, .y0, .x1, and .y1 members.

    2023-11-18: we now override with p0, p1, x0, y0, x1, y1 if not None.
    c                     t          | t          t          f          r#t          |           dk    r| d         | d         fS t          | t          t
          j        t
          j        f          r| j        | j	        fS dS )Nry   r   r   r  )
rz   r{   r|   r-  r  rf   r  rq  r  r  )r  s    r   get_xyzutil_make_rect.<locals>.get_xyN  sk    sT5M** 	"sCyyA~ 	"q63q6>!sUEM5>BCC 	 5#%<zr   c                 P   t          | t                    r| S t          | t                    r| j        | j        fS t          | t
          t          t          j        t          j	        f          r| j
        | j        | j        | j        fS t          | t          t          f          s| f} | S r   )rz   r|   r  r  r  r   r  rf   r/  fz_rectr  r  r  r  r{   r  s    r   
make_tuplez"util_make_rect.<locals>.make_tupleN  s    q%   	Hq%   	*38OT5%,FGG 	*4qtQT))1tUm,, 	Ar   c                     t                    dk    rdS t                    dk    rd         } t          | t          t          f          rt          |           dk    r| \  }}g ||R S t          | t          t          f          rEt          |           dk    r2| \  }}} |          } |          } |          }g |||R }|S  |           } | S t                    dk    r# d                    d                   z   S t                    dk    r] d                   \  }}||fdk    r||d         d         fS  d                   \  }	}
|	|
fdk    rd         d         |	|
fS n1t                    dk    rd         d         d         d         fS t	          d           )	Nr   r.  r   ry   r   r  r  r7  )r-  rz   r{   r|   r   )r  r  r  r   r  ry  rN   r  r  r  r  r  r  r  s              r   handle_argsz#util_make_rect.<locals>.handle_argsO  s   t99> 	6:YY!^ 	6q'C3u..  399>  BxRxx3u.. 399> 1aJqMMJqMMJqMM qj1jqjj
*c""CJYY!^ 
	6647##ffd1g&6&666YY!^ 	6VT!W%%FBBx<' 02tAwQ//VT!W%%FBBx<' 0AwQR//0YY!^ 	67DGT!Wd1g555t55666r   r    )r  r  r  r  r  r  r  r  ret_x0ret_y0ret_x1ret_y1r  r  s         `     @@r   r  r  N  s    .  	 	 	7 7 7 7 7 7 7: &1[]]"FFFF	3	3	#	#	#	#666))r   c           
          t          || |||||d\  }}}	}
d } ||          } ||          } ||	          }	 ||
          }
|||	|
fS )Nr  c                 $    t          |           }|S r   )r   )r  rN   s     r   convertz util_make_irect.<locals>.convert,O  s    !ff
r   )r  )r  r  r  r  r  r  r  r   r  ry  r  r  s               r   r  r  *O  sy    $2"rbQQQJAq!Q   	

A

A

A

AaA:r   c                 ^    t          t          j        t          |                               S r   )r  rf   ru  r  r  s    r   r  r  6O  s#    E/0E0EFFGGGr   c                     t           rt          j        | |          S t          t	          j        t          |           t          |                              S r   )r   r   r*  r.  rf   rf  r  r  )r   r  s     r   r*  r*  :O  sJ     8($77752?43H3HJ[\bJcJcddeeer   c                 z    t          t          j        t          |           t          |                              S r   )r.  rf   rt  r  r  r  s     r   r  r  @O  s:    #####   r   c                 `    t          j        t          |           t          |                    S r   )rf   fz_is_point_inside_rectr\
  r  )rj  r   s     r   r  r  IO  s-    ( ##""  r   c                 z    t          t          j        t          |           t	          |                              S r   )r.  rf   r  r  r\
  )r   rj  s     r   r  r  OO  s:    *"" ##   r   c                 h    t          |           }t          |          }t          j        ||          S r   )r\
  r
  rf   fz_is_point_inside_quad)r  r   rj  r
  s       r   r  r  XO  s/    AA(A...r   c                 z    t          t          j        t          |           t	          |                              S r   )r6  rf   r  r\
  r  )r  r  s     r   r  r  ^O  s:    $ ''!&))   r   c                 z    t          t          j        t          |           t          |                              S r   )r.  rf   rN  r  r  s     r   r  r  gO  s:    ####   r   c                 z    t          t          j        t          |           t          |                              S r   )r8  rf   r  r  )ro	  r	  s     r   r	  r	  pO  s9    O!"%%!"%%   r   c                 H   	 t'          |           }|j        }||j
        z  |j        |j	        z  z
  }|t           j        j         k     s|t           j        j        k    rt          j                    }d|z  }|j
        |z  |_        |j         |z  |_        |j	         |z  |_	        ||z  |_
        |j         |j        z  |j        |j	        z  z
  }|j         |j        z  |j        |j
        z  z
  |_        ||_        d|j        |j        |j	        |j
        |j        |j        ffS dS )Nr   ztype(matrix)=r,   r   )r   r    )rz   r|   r{   rf   r9  r  r<  r   r  ry  r  r'  r  r   rp
  r  r  
float_infoepsilonr  )r  rN   r  r   detr	  rdets          r   r	  r	  yO  s   =( F
#
#CA
ce)cecem
#C
cn$$$ 
=cn.D(D 
=n3wDUFSUNSUSU]*.35#%suce<<<5r   c                     t          j        |          }d}d}|t          |           k     rt          j        | |d                    \  }}||z  }|t           j        k    rt          j        |          }n9|t           j        k    rt          j        |          }nt          j        |          }|dk     rd}t          j	        ||          }	t          j
        ||	d          }
||
z  }|t          |           k     ||z  }|S )Nr   r^  )rf   r|  r-  r  PDF_SIMPLE_ENCODING_GREEKfz_iso8859_7_from_unicodePDF_SIMPLE_ENCODING_CYRILLICfz_windows_1251_from_unicodefz_windows_1252_from_unicoderh  ri  )r:   r   r   r  r/  r   r  r   ry  r	  r  rN   s               r   rn  rn  O  s   #H--D	A
C
D		/ "4:..1qu66 	6/22AA;; 	62155AA2155Aq5 	A%dA..#D!Q//	R D		/  h,CJr   c                    t          |           }t          |          }t          |          }t          j        t          j        |j        |j        z
  |j        |j        z
                      }t          j        dddd|j         |j                   }t          j        |j        |j         |j        |j        dd          }t          j        ||          }t          j        ||          }t          j        |          }|j        S )Nr   r   )	r\
  rf   r  r  r  r  r  r  r  )	r  r  r   ry  rj  r
  r/  ro	  r	  s	            r   r  r  O  s    AAA!%"5acACiqs"K"KLLA		aAq13$	5	5B		acAC4ac1a	8	8B	R	 	 B B''A!!$$A3Jr   c                    t          |           }t          |          }t          j        t          j        |j        |j        z
  |j        |j        z
                      }t          j        dddd|j         |j                   }t          j        |j        |j         |j        |j        dd          }t          t          j        ||                    S )z
    Return the matrix that maps two points C, P to the x-axis such that
    C -> (0,0) and the image of P have the same distance.
    r   r   )	r\
  rf   r  r  r  r  r  r8  r  )r  r  ry  rj  r/  ro	  r	  s          r   r
  r
  O  s    
 	AA 	!%"5acACiqs"K"KLLA		aAq13$	5	5B		acAC4ac1a	8	8BU_R44555r   c                 Z   d}d}|}t          | |d                    \  }}||z  }t          ||d                    \  }}||z  }||k    r|}|t          d          k    r6	 t          | |d                    \  }}||z  }|t          d          k    rn4nt          | |d                    \  }}||z  }|t          d          k    r6	 t          ||d                    \  }}||z  }|t          d          k    rn4nt          ||d                    \  }}||z  }||k    |dk    rd n|S )Nr   rl   )r  r  )	h0rs
  r  rF  r'  r  hcdelta_nncs	            r   r  r  O  s}   	A	A	Abf%%KGRLAbf%%KGRLA
( S> 	)"QRR&11WS> 	 %bf--KGRLAS> 	)"QRR&11WS> 	 %bf--KGRLA' ( ( 7!44!r   c                 D   | sJ t          |t          j                  sJ t          |t          j                  sJ |j        j        | j        z  }|j        j        | j        z  }t          ||          }| j	        dk    r| j
        | j	        dz
           }t          |          }	 t          |j        j        |j        |j                  |k     rt!          |j        j        |j        |j                  |k     rt          |j        j        |j        |j                  |k     rVt!          |j        j        |j        |j                  |k     r-|j        |_        |j        |_        | j
        d         |k    sJ d S | j
                            |           | xj	        dz  c_	        d S r*  )rz   rf   r  r  r   r  r  r  r  r-  r
  r
  r  r?  r  r  vdistr  r}  r6   )r  r=   r  r  r  ch_quadr  rS  s           r   r  r  O  s   KKKdE-.....b%+,,,,,M+EM+E4$$Gx!| z$(Q,'d##		$/-svwzBBUJ		$/-svwzBBUJ		 $/-svwzBBUJ		 $/-svwzBBUJ			 ZCFZCF:b>S((((FJgHHMHHHHr   c                    t           rt          j        | |||||||          S t          d          t          d          t          d          t          d          t          d          t          d          t          d          t          d          t          d	          g	}t	          j        ||          }	t	          j        | d
          }
t	          j        |
t          d          t          d                     t          t          |                    D ]X}t	          j
        |	||                   }|j        r4t	          j        |
||         t	          j        |j        |                     Y|rt	          j        |	t          d                    }t	          j        |          }|dk    rt	          j        |
t          d          |          }t          |          D ]}t	          j        ||          }|j        rt	          j        |          s4t	          j        |d          j        rOt	          j        |t          d                    }t	          j        |t          d                    rt	          j        |t          d                    rt	          j        |t          d                    rt	          j        d           t	          j        |t          d                    rt	          j        |t          d                     t	          j        |t          d                     t	          j        |j        |          }t	          j        | t	          j        |          d          }t	          j        ||           |dk    r#t	          j        |
t          d          |           t	          j        | |
          }t	          j        | ||           dS )z
    Deep-copies a source page to the target.
    Modified version of function of pdfmerge.c: we also copy annotations, but
    we skip some subtypes. In addition we rotate output.
    r  r   ri  r  r   r!  r"  r   UserUnitr  r}  r   r_  r   r  rC  r	  r^  r  zskipping widget annotationr  r   N)r   r   r]  r   rf   r  r  r  r  r-  r  r   r  r   r   rc  r  rd  rA  r   rN  rI  r  rF  r   r8  r  r~  r  )r^  r_  	page_frompage_tor   r  copy_annotsrc  known_page_objspage_refrA  rq   r   r  rF  r  ri  rU  r  r   r
  s                        r   r]  r]  P  s     n'9gvuVaclmmm 	

O ()<<H "7A..I	y(6"2"2HV4D4DEEE C(()) s s,h8JKK> 	s	?1+=u?\]f]kmp?q?qrrr  9'8H3E3EFF
,,q5 	919hx>P>PRSTTJ1XX 9 9'Q77| 5+<Q+?+? &511< ,a)1D1DEE$gx/?/?@@ $gx/@/@AA $gx/A/ABB M#?@@@$Whx.@.@AA "Ax'8'8999"Ax}}5556	JJ.9I69R9RTUVV$j%8888 | G	8H+=+=vFFF


3
3C 
7GS11111r   c                 J    t          |           \  }}t          dd||          S )zReturn a Rect for the paper size indicated in string 's'. Must conform to the argument of method 'PaperSize', which will be invoked.
    r[  )
paper_sizer   )r/  r  r  s      r   
paper_rectr  VP  s'     qMMME6S%(((r   c                 "   |                                  }d}|                    d          rd}|dd         }|                    d          r
|dd         }t                                          |d          }|dk    r|S |d         |d	         fS )
zReturn a tuple (width, height) for a given paper format string.

    Notes:
        'A4-L' will return (842, 595), the values for A4 landscape.
        Suffix '-P' and no suffix return the portrait tuple.
    rj  z-lr  Nr  z-pr  r   r   )r  r  paper_sizesr   )r/  r  r  rh   s       r   r  r  ]P  s     7799DA}}T CRCy}}T CRCy			4	*	*BCx 	qE2a5>r   c                      i ddddddddd	d
dddddddddddddddddddddd d!d"i d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdO
S )Pa6  Known paper formats @ 72 dpi as a dictionary. Key is the format string
    like "a4" for ISO-A4. Value is the tuple (width, height).

    Information taken from the following web sites:
    www.din-formate.de
    www.din-formate.info/amerikanische-formate.html
    www.directtools.de/wissen/normen/iso.htm
    a0)P	  i*  a1)  r  a10)r  r  a2)  r  a3)r  r  a4)r  r  a5)  r  a6)*  r  a7)r  r  a8)   r  a9)r  r  b0)  i  b1)  r  b10)r  r  b2)  r  b3)  r	  b4)  r  b5)  r  b6)b  r  rB  )r+  r  b8)r  r+  b9)r  r  c0)'
  i]  c1)-  r  c10)r  r  c2)  r  c3)  r  c4)  r  c5)  r  c6)C  r   c7)r  r"  c8)r  r  c9)r  r  zcard-4x6)i   i  )rq  i  )i)  i  )i
  i  )i  rV  )rW  i  )rV  i  )rV  i  )rV  rW  )i  i  )i`  i  )
zcard-5x7
commercial	executiveinvoiceledgerlegalzlegal-13lettermonarchztabloid-extrar    r    r   r   r  r  qP  s   -
l-
l-
 	y-
 	l	-

 	k-
 	j-
 	j-
 	j-
 	j-
 	j-
 	j-
 	l-
 	l-
 	y-
 	l-
  	l!-
" 	k#-
 -
$ 	j%-
& 	j'-
( 	j)-
* 	j+-
, 	j--
. 	l/-
0 	l1-
2 	y3-
4 	l5-
6 	k7-
8 	j9-
: 	j;-
< 	j=-
> 	j?-
@ 	jA-
B 	jC-
D 	JE-
 -
F  $Y-
 -
 -
 -
r   r|  c                 ,    t          j        | |          S r   )rf   r  )r   r  s     r   r  r  P  s    (f555r   c                    t          |t          j                  sJ t          |t                    rt	          |          dk    sJ t          |t                    rt	          |          dk    sJ t          |t                    r3t	          |          dk    r t          |d         t          j                  sJ d }g }	 	 t          j        |t          d                    }t          j        |          }|dk    rt          d          |	                    |           t          j
        |          rt          d          t          |          D ]}	t          j        ||	          }
t          j        |
t          d                    }|j        r#t          j        |t          d                    }nOt          j        |
t          d                    j        o't          j        |
t          d                    j         }|rCt          j        |
t          d	                    }|d         |k     r|
} n|dxx         |z  cc<   |j        r$t          j        |t          d
                     }n(t          j        |
t          d                    j         }|r*t          j        dt          j        |           d           |d         dk    r||d<   |	|d<   |
} n|dxx         dz  cc<   ||j        |	|k     snG	 t          t	          |          dd          D ]}	t          j        ||	dz
                       nC# t          t	          |          dd          D ]}	t          j        ||	dz
                       w xY w|S )Nr   r   rr  zmalformed page treezcycle in page treer}  Pagesri  rN  r   znon-page object in page tree (rp  r   )rz   rf   r  r{   r-  r   r   rc  r   r6   r  r  rd  r   rN  r  rI  r@  r  )r   rv  skipparentpindexphitr0   rw  rE  rq   kidr"  r   rW  s                 r   pdf_lookup_page_loc_impr5  P  s   $-----$%%8#d))q.888&$''<CKK1,<<<<'4((gS\\Q->g:gVWjZ_ZfCgCgggg7	23)$0@0@AA*D1119 ;#$9::: T"""%t,, ;#%9:::t ) )A-tQ77C!.Xf5E5EFFE' "!-uhw6G6GHH !& 2C&9I9I J J U !b(-(:C*AUAU(V(V(a$a   ) % 6Xg=N=N O O GeO -#&D!E GGGu,GGGG + ^$)$5uhv>N>N$O$O OAA$)$6Xj=Q=Q$R$R$] ]A j!M+hEL]_dLeLe+h+h+hiii7a< ))-GAJ()F1I"%C!E GGGqLGGGG   AH g3f 3u::q"-- 2 2$eAaCj11112U3u::q"-- 2 2$eAaCj11112 
s    IM A Nc                    t          j        t          j        |           t          d                    }t          j        |t          d                    }|g}|j        st          d          t          j                    g}dg}t          | ||||          }|d         }|d         }|d         }|j        st          d|z  dz             |||fS )zA
        Copy of MuPDF's internal pdf_lookup_page_loc().
        r	  r/  zcannot find page treer   z cannot find page %d in page treer   )rf   r   r  r   r   r   r  r5  )r   r  r  rv  r0  r1  r2  r3  s           r   r  r  P  s     !5#4c#:#:HV<L<LMM!4'):):;;x 	53444<>>"%c4wGGAw!*~ 	K>GIJJJGV##r   c                     J d            )zH
    Returns description of mupdf.PdfObj (wrapper for pdf_obj) <o>.
    r   zuse mupdf.pdf_debug_obj() ?)rf   r6  rc  r  rd  pdfobj_stringru  array_get_boolrA  rB  rD  r   pdf_is_embedded_fileembedded_file_namer  rZ  r   rb  rx  r@  rO  r[  r  r   r\  rh  )ri  prefixrN   r  rq   oor  r   s           r   r8  r8  Q  s     ,++++r   c                 ~   j         d         sdS | j        }|                                 }fd|D             }|g k    rdS t          |          }t	          t                              d          dz                      }|D ]7}t                              |||          st          dj
        |fz             8dS )a  Repair character spacing for mono fonts.

    Notes:
        Some mono-spaced fonts are displayed with a too large character
        distance, e.g. "a b c" instead of "abc". This utility adds an entry
        "/W[0 65535 w]" to the descendent font(s) of font. The float w is
        taken to be the width of 0x20 (space).
        This should enforce viewers to use 'w' as the character width.

    Args:
        page: pymupdf.Page object.
        font: pymupdf.Font object.
    r  Nc                     g | ]Q}|d          j         k    |d                             d          .|d                             d          I|d         RS )r   r  ro  r
   r  r   )r   r   )rp   r  r/  s     r   rr   z$repair_mono_font.<locals>.<listcomp>JQ  sr       aDDI #$A$//#"6"6 <=Q4??:;V;V	!  r   r0  i  z$Cannot set width for '%s' in xref %i)r  r   r  r-  r   rg	  r  r   set_font_widthr>   r   )r   r/  r   rP  r  r  r   s    `     r   r  r  8Q  s     :f t
+C~~H     E
 { JJEt))"--46677E L L##Cu55 	L6$)T9JJKKKL Lr   srgbc                 `    t          |           }|d         dz  |d         dz  |d         dz  fS )a  Convert sRGB color code to a PDF color triple.

    There is **no error checking** for performance reasons!

    Args:
        srgb: (int) RRGGBB (red, green, blue), each color in range(255).
    Returns:
        Tuple (red, green, blue) each item in intervall 0 <= item <= 1.
    r   g     o@r   ry   )r  )rA  r   s     r   sRGB_to_pdfrC  XQ  s6     	DAQ4%<1qte|33r   c                 H    | dz	  }| |dz  z
  dz	  }| |dz  z
  |dz  z
  }|||fS )a  Convert sRGB color code to an RGB color triple.

    There is **no error checking** for performance reasons!

    Args:
        srgb: (int) RRGGBB (red, green, blue), each color in range(255).
    Returns:
        Tuple (red, green, blue) each item in intervall 0 <= item <= 255.
    r/  re	  r    )rA  r   r	  r  s       r   r  r  fQ  sC     	
A	b	aARAF#Aq!9r   c                     |rt          j        |          nd}t          j        |           }t          d|d          D ]0}t          j        t          j        ||                    |k    r dS 1dS )Nr   ry   r   )rf   rc  r   r  rd  )rj  r  rF  str_rq   s        r   r  r  vQ  s{    ,6=Z(((AA#Q''D1a^^  #U%8*a%H%HIITQ 	11	1r   c                 V   d}d}|}d}|j         rt          | ||||          }	t          ||||          s3|	dk    rt          j        |t          d                    }
|
j         s*|j         r"t          j        |t          d                     np|j         rGt          j        |t          d          |
           t          j        |
t          d          |           n"t          j        |
t          d                     |
}nt          j        |t          d                     t          j        |t          d                     t          j        |t          d                    }n4|r|j         s|}|}t          j        |t          d                    }|dz  }|j         |||fS )z'
    Returns (count, first, prev).
    Nr   r  PrevrO  rP  r   )r   strip_outlinesr  rf   r   r   r  r  )r   outlinesr  r  r  r  rW  currentr  r  r  s              r   strip_outlinerL  Q  s    EEGD

  C*6F
SSWj2BJOO 	Qw H )'8F3C3CDD ? C*4&1A1ABBB_ ?&tXf-=-=tDDD&tXf-=-=tDDDD&tXf-=-=>>> "7HV,<,<==="7HSMM:::,Whv6F6FGG    0  D((62B2BCCGQJE? 
 B %r   c                    |j         sdS t          j        |t          d                    }|j         sd}nt	          | ||||          \  }}}|dk    rgt          j        |t          d                     t          j        |t          d                     t          j        |t          d                     nt          j        t          j        |t          d                              }t          j        |t          d          |           t          j        |t          d          |           t          j        |t          d          t          j        |dk    r|n|                      |S )Nr   r  LastrN  )	r   rf   r   r   rL  r  r   r  r  )	r   rJ  r  r  r  r  r  last	old_counts	            r   rI  rI  Q  s]    qx'):):;;E ^'UJ@PR\]]E4	Qw i8Xg%6%67778Xf%5%56668Xg%6%67777$U%7(7BSBS%T%TUU	8Xg%6%6>>>8Xf%5%5t<<<8Xg%6%68IPY\]P]Jf""dfcf8g8ghhhIr   r  c                 D   t           i k    r{t                      D ]l}|                    d          r|                    d          \  }}|                                }|D ]%}t	          |dd         d          }|t           |<   &mt                               | d          S )rb  r1	  r  Nr  r/  rq  z.notdef)_adobe_glyphsrf  r   rl  r   r   )r  r=   r   rv  unclry  s         r   r	  r	  Q  s      (#%% 	( 	(Ds## 

3ID#99;;D ( (BQBb)))#'a  ( R+++r   c                     |j         |j         z
  }|j        |j        z
  }t          j        || j        z  || j         z  z             S r   r  r  s        r   r  r  Q  r  r   r    single)	pagefn_argspagefn_kwargsinitfninitfn_argsinitfn_kwargsr  r  concurrency_statsc       	            |
rt          j                     }|dk    rO|r ||i | t                      }t          |           }|D ]#} ||g|R i |}|                    |           $n2ddlm} ||
rt          j                     }t          |           5 }t          |          }t          t          |                    }ddd           n# 1 swxY w Y   |
r)t          j                     |z
  }t          |dd           |
rt          j                     }|dk    r|	                    | ||||||||	|

  
        }n3|dk    r|
                    | ||||||||	|

  
        }nJ d
|d            |
r)t          j                     |z
  }t          |dd           |
r)t          j                     |z
  }t          |dd           |S )a  
    Returns list of results from `pagefn()`, optionally using concurrency for
    speed.
    
    Args:
        path:
            Path of document.
        pagefn:
            Function to call for each page; is passed (page, *pagefn_args,
            **pagefn_kwargs). Return value is added to list that we return. If
            `method` is not 'single', must be a top-level function - nested
            functions don't work with concurrency.
        pagefn_args
        pagefn_kwargs:
            Additional args to pass to `pagefn`. Must be picklable.
        initfn:
            If true, called once in each worker process; is passed
            (*initfn_args, **initfn_kwargs).
        initfn_args
        initfn_kwargs:
            Args to pass to initfn. Must be picklable.
        pages:
            List of page numbers to process, or None to include all pages.
        method:
            'single'
                Do not use concurrency.
            'mp'
                Operate concurrently using Python's `multiprocessing` module.
            'fork'
                 Operate concurrently using custom implementation with
                 `os.fork()`. Does not work on Windows.
        concurrency:
            Number of worker processes to use when operating concurrently. If
            None, we use the number of available CPUs.
        _stats:
            Internal, may change or be removed. If true, we output simple
            timing diagnostics.
    
    Note: We require a file path rather than a Document, because Document
    instances do not work properly after a fork - internal file descriptor
    offsets are shared between the parent and child processes.
    rU  r   )_apply_pagesNz.2fzs: count pages.r  forkr   zUnrecognised method=rs   zs: work.z	s: total.)r  r{   r   r6   r(   r^  r-  r  r>   _multiprocessing_fork)r1   r  rV  rW  rX  rY  rZ  r  r  r[  r\  t0rN   r   r   r   r^  r   	num_pagess                      r   apply_pagesrd  Q  s   p  Y[[ <$ 	2FK1=111ffD>> 	 	Dt;k;;;];;AJJqMMMM	 	#""""" 	/  IKK$ /8MM	U9--../ / / / / / / / / / / / / / /  /IKK!Oq----... 		AT> 	1//!! CC v 	1$$!! CC 10f000000 	$	aA1""""### !IKK"q   Js   ,CCC)
r  r  r[  optionr  r  r&  r.  r  r\  c       
   	      l    t          ||||||	          }t          | t          j        |||||
          S )ag  
    Returns list of results from `Page.get_text()`, optionally using
    concurrency for speed.
    
    Args:
        path:
            Path of document.
        pages:
            List of page numbers to process, or None to include all pages.
        method:
            'single'
                Do not use concurrency.
            'mp'
                Operate concurrently using Python's `multiprocessing` module.
            'fork'
                 Operate concurrently using custom implementation with
                 `os.fork`. Does not work on Windows.
        concurrency:
            Number of worker processes to use when operating concurrently. If
            None, we use the number of available CPUs.
        option
        clip
        flags
        textpage
        sort
        delimiters:
            Passed to internal calls to `Page.get_text()`.
    )re  r  r  r&  r.  r  )rW  r  r  r[  r\  )r   rd  r   r  )r1   r  r  r[  re  r  r  r&  r.  r  r\  	args_dicts               r   r  r  \R  s[    X !  I M##   r   c                      e Zd ZdZd Zed             Zed             Zed/d            Zed             Z	ed             Z
ed	             Zed
             Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zd Zed             Zed             Zed0d            Zed1d            Zed1d            Zed             Zed/d            Zed              Z ed!             Z!ed1d"            Z"ed#             Z#ed$             Z$ed0d%            Z%ed1d&            Z&ed1d'            Z'ed1d(            Z(ed)             Z)ed*             Z*ed+             Z+ed,             Z,ed1d-            Z-d.Z. e/            Z0dS )2r   zU
    We use @staticmethod to avoid the need to create an instance of this class.
    c                     t          | t          j                  rt          t	          |                     S t          t          j                              S r   )rz   rf   r   r8  r  r9  r   s    r   _derotate_matrixzTOOLS._derotate_matrixR  sC    dEM** 	7$%<T%B%BCCC$U^%5%5666r   c                 Z   t          | |          }t          | j                  |_        | j        |_        | j        |_        | |_        |j        sd |_        |j        sd |_        |j        sd |_        |j	        sd |_	        |j
        sd |_
        |j        sd |_        |j        sd |_        |S r   )r  r   r   r   r   r
  r  r	  r	  r	  r	  r	  r	  )r   r  r   s      r   r  zTOOLS._fill_widgetR  s    &uf555:&&j} 	! FM# 	(#'F # 	(#'F # 	(#'F ! 	&!%F! 	&!%F" 	'"&F
r   c                     t          j        | j                  } t          |                                           }t          |          }|S r   )rf   r   r   r  r   r   )r   r   r  s      r   rS  zTOOLS._get_all_contentsR  s;    *4955txxzz**!3''r   r   c                     |                                  }t          |           t          |          }t          |                                |                                ||          }|S )zDAdd bytes as a new /Contents object for a page, and return its xref.)r]
  r$  r   r
  r   r   )r   r  r
  rh  contbufr   s         r   r  zTOOLS._insert_contentsR  sV     ..""7$W--!'++--QQr   c                    | j         d         }| j        d         }|sd}d                    t          t          |                    dz   }|r|}n| j        d         }|sd}d                    t          t          |                    dz   }|}	|}
t          t          |	|
                    }| }|	|z  }|
|z  }d	| j        cxk    rd
k     rn nd}nd}||||||||fS )as  Get common parameters for making annot line end symbols.

        Returns:
            m: matrix that maps p1, p2 to points L, P on the x-axis
            im: its inverse
            L, P: transformed p1, p2
            w: line width
            scol: stroke color string
            fcol: fill color store_shrink
            opacity: opacity string (gs command)
        r  r$  r	  rl   z RG
r   rY  z rg
r   r   r  r(   )rP  r   r  r  r   r<  r
  r  )r   r  r  r  r   scscolr  r$  np1np2rH  r  r  r  r  s                   r   _le_annot_parmszTOOLS._le_annot_parmsR  s     L!\(# 	BxxC%%/ 	&BBf%B 	BxxC%%/?3,,--R!G!G 	 	 	 	 	 	 	 	 	GGG"aAtT722r   c                 D   t                               | |||          \  }}}}}	}
}}d}|t          d|	          z  }|r|n|}|d| dz  fz   |z  }|d|dz  fz   |z  }d||j        |j        fz  }|d|j        |j        fz  z  }|t          |	          dz   z  }||
dz   z  }|S )	zaMake stream commands for butt line end symbol. "lr" denotes left (False) or right point.
        r   r   r          @
q
%s%f %f m
%f %f l
r  s
Q
r   rt  r  r  r  r}   )r   r  r  r  r  rH  r  r  r  r   rq  r$  r  rw  r  r  r  botr   s                      r   r  zTOOLS._le_buttR  s     /4.C.CE2rS].^.^+2q!QdGC1IINAAAr"u:~#Aqt9}"7CE35"99
kSUCEN**
illV##
dXo	r   c                    t                               | |||          \  }}}}}	}
}}d}|t          d|	          z  }|r
||dz  dfz
  n	||dz  dfz   }t          ||          | | ||fz   }d|z   t                               |j        |z  |j        |z  |j        |z  |j        |z            z   }|t          |	          dz   z  }||
|z   dz   z  }|S )zcMake stream commands for circle line end symbol. "lr" denotes left (False) or right point.
              @r   rv  r   zq
r  b
Q
)
r   rt  r  r   _oval_stringr  r  r  r  r}   )r   r  r  r  r  rH  r  r  r  r   rq  r$  r  rw  r  r  r   r   s                     r   r  zTOOLS._le_circleS  s     /4.C.CE2rS].^.^+2q!QdGC1II2A2q	MMQ!B$]AJJ1"qb!Q'W_u11!$)QTBYr	STSWZ\S\]]]
illV##
dTkH$$	r   c                    t                               | |||          \  }}}}}	}
}}d}|t          d|	          z  }|r
||dz  dfz   n	||dz  dfz
  }|r|d|z  | fz   n
|d|z  | fz   }|r
|d|z  |fz   n	|d|z  |fz   }||z  }||z  }||z  }d||j        |j        fz  }|d|j        |j        fz  z  }|d|j        |j        fz  z  }|t          |	          d	z   z  }||
|z   d
z   z  }|S )ziMake stream commands for closed arrow line end symbol. "lr" denotes left (False) or right point.
        r}  r   rv  r   r  ry   rw  rx  r  r~  rz  r   r  r  r  r  rH  r  r  r  r   rq  r$  r  rw  r  r7  r   s                    r   r  zTOOLS._le_closedarrowS  sG    /4.C.CE2rS].^.^+2q!QdGC1II 3Q!B$]]a1R4)m "6R2a4!*__acA2Y!4R2a4)^^rQqS!H}
b
b
b7BD"$"77
kRT24L((
kRT24L((
illV##
dTkH$$	r   c                    t                               | |||          \  }}}}}	}
}}d}|t          d|	          z  }|r
||dz  dfz
  n	||dz  dfz   }t          ||          | | ||fz   }|j        |j        |j        z
  dz  z   |z  }d||j        |j        fz  }|j        |j        |j        z
  dz  z   |z  }|d|j        |j        fz  z  }|j        |j	        |j        z
  dz  z   |z  }|d|j        |j        fz  z  }|j	        |j        |j	        z
  dz  z   |z  }|d|j        |j        fz  z  }|t          |	          dz   z  }||
|z   d	z   z  }|S )
zdMake stream commands for diamond line end symbol. "lr" denotes left (False) or right point.
        r}  r   rv  r   rO  q
%s%f %f m
rx  r  r~  )r   rt  r  r   r  r  r  r  r  r  r}   r   r  r  r  r  rH  r  r  r  r   rq  r$  r  rw  r  r  r   rj  r   s                      r   r  zTOOLS._le_diamond(S  s    /4.C.CE2rS].^.^+2q!QdGC1II2A2q	MMQ!B$]AJJ1"qb!Q'TQTAD[C''2-!#qs 33TQTAD[C''2-
kqsACj((TQTAD[C''2-
kqsACj((TQTAD[C''2-
kqsACj((
illV##
dTkH$$	r   c                    t                               | |||          \  }}}}}	}
}}d}|t          d|	          z  }|r
||dz  dfz   n	||dz  dfz
  }|r|d|z  | fz   n
|d|z  | fz   }|r
|d|z  |fz   n	|d|z  |fz   }||z  }||z  }||z  }d||j        |j        fz  }|d|j        |j        fz  z  }|d|j        |j        fz  z  }|t          |	          d	z   z  }||
d
z   z  }|S )zgMake stream commands for open arrow line end symbol. "lr" denotes left (False) or right point.
        r}  r   rv  r   r  ry   rw  rx  r  S
Q
rz  r  s                    r   r  zTOOLS._le_openarrow>S  sB    /4.C.CE2rS].^.^+2q!QdGC1II 3Q!B$]]a1R4)m "6R2a4!*__acA2Y!4R2a4)^^rQqS!H}
b
b
b7BD"$"77
kRT24L((
kRT24L((
illV##
dXo	r   c                    t                               | |||          \  }}}}}	}
}}d}|t          d|	          z  }|r
|d|z  dfz
  n	|d|z  dfz   }|r|d|z  | fz   n
|d|z  | fz   }|r
|d|z  |fz   n	|d|z  |fz   }||z  }||z  }||z  }d||j        |j        fz  }|d|j        |j        fz  z  }|d|j        |j        fz  z  }|t          |	          dz   z  }||
|z   d	z   z  }|S )
zoMake stream commands for right closed arrow line end symbol. "lr" denotes left (False) or right point.
        r}  r   ry   r   r  rw  rx  r  r~  rz  r  s                    r   r  zTOOLS._le_rclosedarrowRS  sG    /4.C.CE2rS].^.^+2q!QdGC1II1Q!A#q\\Q!A#q\!6R1Q3)^^rRTA2J 4R1Q3(]]bBqD!9n
b
b
b7BD"$"77
kRT24L((
kRT24L((
illV##
dTkH$$	r   c                    t                               | |||          \  }}}}}	}
}}d}|t          d|	          z  }|r
||dz  dfz
  n	||dz  dfz   }|r|d|z  | fz   n
|d|z  | fz   }|r
|d|z  |fz   n	|d|z  |fz   }||z  }||z  }||z  }d||j        |j        fz  }|d|j        |j        fz  z  }|d|j        |j        fz  z  }|t          |	          d	z   z  }||
|z   d
z   z  }|S )zmMake stream commands for right open arrow line end symbol. "lr" denotes left (False) or right point.
        r}  r   g      @r   ry   r  rw  rx  r  r  rz  r  s                    r   r  zTOOLS._le_ropenarrowfS  sG    /4.C.CE2rS].^.^+2q!QdGC1II 3Q!B$]]a1R4)m!6R1Q3)^^rRTA2J 4R1Q3(]]bBqD!9n
b
b
b7BD"$"77
kRT24L((
kRT24L((
illV##
dTkH$$	r   c                    t                               | |||          \  }}}}}	}
}}dt          d|	          z  dz  }|r|n|}t          |j        |z
  |j        d|	z  z
  |j        |z   |j        d|	z  z             }|j        |z  }|j        |z  }d||j        |j        fz  }|d|j        |j        fz  z  }|t          |	          dz   z  }||
dz   z  }|S )	zbMake stream commands for slash line end symbol. "lr" denotes left (False) or right point.
        g(y?r   r\  ry   rw  rx  r  ry  )	r   rt  r  r   r  r  r  r  r}   )r   r  r  r  r  rH  r  r  r  r   rq  r$  r  rwr  r   r  r{  r   s                      r   r  zTOOLS._le_slashzS  s     /4.C.CE2rS].^.^+2q!QdGc!Qii#%NAAr13Q;b!#A+>>dRidRi7CE35"99
kSUCEN**
illV##
dXo	r   c                    t                               | |||          \  }}}}}	}
}}d}|t          d|	          z  }|r
||dz  dfz
  n	||dz  dfz   }t          ||          | | ||fz   }|j        |z  }d||j        |j        fz  }|j        |z  }|d|j        |j        fz  z  }|j        |z  }|d|j        |j        fz  z  }|j	        |z  }|d|j        |j        fz  z  }|t          |	          dz   z  }||
|z   dz   z  }|S )	zcMake stream commands for square line end symbol. "lr" denotes left (False) or right point.
        r}  r   rv  r   r  rx  r  r~  )r   rt  r  r   r  r  r  r  r  r  r}   r  s                      r   r  zTOOLS._le_squareS  s=    /4.C.CE2rS].^.^+2q!QdGC1II2A2q	MMQ!B$]AJJ1"qb!Q'D2I!#qs 33D2I
kqsACj((D2I
kqsACj((D2I
kqsACj((
illV##
dTkH$$	r   c                    d }d}| || z
  dz  z   }| || z
  dz  z   }|||z
  dz  z   }|||z
  dz  z   }	|| |z
  |z  z   }
|| |z
  |z  z   }|||z
  |z  z   }|||z
  |z  z   }|||z
  |z  z   }|	||	z
  |z  z   }|	||	z
  |z  z   }|||z
  |z  z   }d|j         |j        fz  }| ||
||          z  }| ||||          z  }| ||||	          z  }| ||||          z  }|S )zQReturn /AP string defining an oval within a 4-polygon provided as points
        c                 X    d}|| j         | j        |j         |j        |j         |j        fz  S )Nz%f %f %f %f %f %f c
rl  )rj  r
  r   r  s       r   bezierz"TOOLS._oval_string.<locals>.bezierS  s+    'AQS!#qsAC555r   rE  rO  z%f %f m
rl  )r  r  r7  r8  r  rF  rR  morQ  muol1ol2or1or2ur1ur2ul1ul2r   s                      r   r  zTOOLS._oval_stringS  so   	6 	6 	6 27c/!27c/!27c/!27c/!BGu$$BGu$$BGu$$BGu$$BGu$$BGu$$BGu$$BGu$$BD"$<'
ffS#r"""
ffS#r"""
ffS#r"""
ffS#r"""	r   c                    t           rt          j        | j                  }nd } ||           }|sdS d}d}d}|                                }t          |          D ]\  }}|dk    rA||dz
           dd          }t          ||dz
                     }d	x||<   x||dz
  <   ||dz
  <   L|d
k    r't          ||dz
                     g}d	x||<   ||dz
  <   y|dk    r5d ||dz
  |         D             }d	x||<   x||dz
  <   x||dz
  <   ||dz
  <   |dk    r=d ||dz
  |         D             }d	x||<   x||dz
  <   x||dz
  <   x||dz
  <   ||dz
  <   |||f}|S )Nc                 
   | j         }t          |t          j                  sJ t          j        |          }t          j        |          }	 t          j        |t          d                    }|j        sRt          j	        |          }t          j
        |t          d          t          d          t          d                    }t          j        |          }n&# t          $ r t          rt                       Y d S w xY w|S )Nr
  r	  r
  )r   rz   rf   r   r   rV  r  r   r   r  r   r   r   r   rF   )r   r  this_annot_objr!  rW  rC  r  s          r   Tools__parse_daz(TOOLS._parse_da.<locals>.Tools__parse_daS  s    "Z
!*en=====!&!4j!A!A2NCC7RVXXB= ""'"3C"8"8"0 ( 0 0 ( 4 4 (" "
 #5b99FF    +@0@0@0@FF s   BC D ?D )r  r(   r   r	  r  r	  r	  ry   r   r(   r	  r	  c                 ,    g | ]}t          |          S r    r	  r 
  s     r   rr   z#TOOLS._parse_da.<locals>.<listcomp>S  r
  r   r   rx  c                 ,    g | ]}t          |          S r    r	  r 
  s     r   rr   z#TOOLS._parse_da.<locals>.<listcomp>S  r
  r   r  )r   r   Tools_parse_dar   rl  r  r+  )	r   r   r  r/  r  r&  r
  rq   r   s	            r   r   zTOOLS._parse_daS  s     	)&
33CC  & "/%((C 	! =iikk ~~ 	 	GAtt| 1q5z!""~c!a%j))/11A1QqSC!Hs{ c!a%j))+$&&AQqSt| 66QU1W666:<<A<QqS<C!Hs1Q3xs{ 66QU1W666EGGAGQqSGC!HGs1Q3x#ac(
 D% 
r   c                     | }t          j        |          }t          j        |          }t          j        ||           d S r   )rf   r   rV  pdf_field_reset)r   r  r  r!  s       r   r
  zTOOLS._reset_widgetS  s@    
,Z88*>::c>22222r   c                     |                                  }|j        s t          t          j                              S t          t          |                    S r   )r]
  r   r8  rf   r9  re  )r   rh  s     r   rZ  zTOOLS._rotate_matrixS  sI    ..""! 	7$U^%5%5666 !6w!?!?@@@r   c                 &    t          | |           d S r   )r  )r   r  s     r   r#
  zTOOLS._save_widgetT  s     /////r   c                    t           rt          j        | j        |           d S 	 | j        }t	          |t
          j                  sJ t          j        t          j        |          t          d          |           t          j
        t          j        |          t          d                     t          j
        t          j        |          t          d                     n&# t          $ r t          rt                       Y d S w xY wd S )Nr
  r  r  )r   r   Tools_update_dar   rz   rf   r   r=  r   r   r  r   r   rF   )r   r  r  s      r   r  zTOOLS._update_daT  s     	!5:v66666"Z
!*en=====.u/B:/N/NPXY]P^P^`fggg"5#6z#B#BHTNNSSS"5#6z#B#BHTNNSSSS   '<N,<,<,< Fs   C C& &D	D	c                  $    t           dz  a t           S r'  )TOOLS_JM_UNIQUE_IDr    r   r   r  zTOOLS.gen_idT  s     	a!!r   c                  ,    t          j                     dS )z(
        Empty the glyph cache.
        N)rf   fz_purge_glyph_cacher    r   r   glyph_cache_emptyzTOOLS.glyph_cache_emptyT  s    
 	"$$$$$r   r   c                 "    t          | |          S )z5
        Metadata of an image binary stream.
        )r  )r  r  s     r   rq  zTOOLS.image_profile"T  s    
  
333r   Nc                 2    | t          |           at          S )z;
        Set MuPDF error display to True or False.
        )r  r  r  s    r   mupdf_display_errorszTOOLS.mupdf_display_errors)T  s      	,#'88 ##r   c                 2    | t          |           at          S )z>
        Set MuPDF warnings display to True or False.
        )r  rp  r  s    r   mupdf_display_warningszTOOLS.mupdf_display_warnings3T  s      	.%)"XX"%%r   c                      t           j        S )z"Get version of MuPDF binary build.)rf   
FZ_VERSIONr    r   r   mupdf_versionzTOOLS.mupdf_version=T  s     r   c                     t          j                     d                    t                    }| rt                                           |S )zN
        Get the MuPDF warnings/errors with optional reset (default).
        r  )rf   fz_flush_warningsr  r  r   reset_mupdf_warnings)r 
  rN   s     r   r  zTOOLS.mupdf_warningsBT  sD     	!!!ii011 	)&&(((
r   c                  "    t                      ad S r   )r{   r  r    r   r   r  zTOOLS.reset_mupdf_warningsNT  s     #'&&r   c                 .    t          j        |            dS )z*
        Set anti-aliasing level.
        N)rf   fz_set_aa_level)r  s    r   set_aa_levelzTOOLS.set_aa_levelST  s    
 	e$$$$$r   c                 j    | t           S t          |           dz   }|dk    rd}| d d         a t           S )Nr   r
  )r  r-  )r  rE  s     r   set_annot_stemzTOOLS.set_annot_stemZT  sF      	$##4yy1}"9 	D9r   c                    t          |           }|sdS t          j        ||          }t          j        |t	          d                    }t          j        |          rt          j        |          }t          |          D ]}t          j        ||          }t          j	        |d          }	t          j
        |	t          j        d                     t          j
        |	t          j        d                     t          j
        |	t          j        |                     t          j        |t	          d          |	           dS )NFr  r   r   r  r
  T)r   rf   rS  r   r   r6  rc  r  rd  r  r8  r  r  )
r   r   r  r!  r/  dfontsrF  rq   dfontwarrays
             r   r@  zTOOLS.set_font_widtheT  s%   s## 	5$S$//#D(3D*E*EFFf%% 	A#F++A1XX A A+FA66,S!44$VU->q-A-ABBB$VU->u-E-EFFF$VU->u-E-EFFF"5(3--@@@@tr   c                 .    t          j        |            dS )z6
        Set the graphics minimum line width.
        N)rf   fz_set_graphics_min_line_width)min_line_widths    r   set_graphics_min_line_widthz!TOOLS.set_graphics_min_line_widthwT  s    
 	,^<<<<<r   c                     | r8t           j        rt          j                     dS t          dt                     dS t           j        rt          j                     dS dS )z!Set ICC color handling on or off.zMuPDF built w/o ICC supportN)rf   r  fz_enable_iccrx  r  fz_disable_iccr  s    r   set_icczTOOLS.set_icc~T  so      	#" I#%%%%%67GHHHHH  	# """""	# 	#r   c                 P    | t          |           t          _        t          j        S )z!Set / unset MuPDF device caching.)r  r
  rX   r  s    r   set_low_memoryzTOOLS.set_low_memoryT  s#      	2)-bH&))r   c                     | >t          |           t          _        t          rt	          j        t          j                   t          j        S )z Set / unset small glyph heights.)r  r
  rY   r   r   set_small_glyph_heightsr  s    r   r  zTOOLS.set_small_glyph_heightsT  sA      	L+/88H( L-h.JKKK++r   c                 P    | t          |           t          _        t          j        S )zK
        Set / unset returning fontnames with their subset prefix.
        )r  r
  rZ   r  s    r   set_subset_fontnameszTOOLS.set_subset_fontnamesT  s#    
  	1(,RH%((r   c                      t          t          j                    t          j                    t          j                              S )z,
        Show anti-aliasing values.
        )r
  r:   graphics_min_line_width)r   rf   fz_graphics_aa_levelfz_text_aa_levelfz_graphics_min_line_widthr    r   r   show_aa_levelzTOOLS.show_aa_levelT  s?    
  577-//*/*J*L*L   	r   c                      dS )z)
        MuPDF store size limit.
        Nr    r    r   r   store_maxsizezTOOLS.store_maxsizeT  	     tr   c                 z    | dk    rt          j                     dS | dk    rt          j        d| z
             dS dS )z7
        Free 'percent' of current store size.
        r  r   N)rf   fz_empty_storefz_shrink_store)percents    r   r  zTOOLS.store_shrinkT  sU    
 c> 	 """1Q; 	2!3=11111	2 	2r   c                      dS )z+
        MuPDF current store size.
        Nr    r    r   r   
store_sizezTOOLS.store_sizeT  r  r   c                 P    | t          |           t          _        t          j        S )zA
        Set ascender / descender corrections on or off.
        )r  r
  r[   r  s    r   unset_quad_correctionszTOOLS.unset_quad_correctionsT  s#    
  	6-1"XXH*--r   r.  r  r  r   )1r`   ra   rb   r	  rj  r  r  rS  r  rt  r  r  r  r  r  r  r  r  r  r  r   r
  rZ  r#
  r  r  r  rq  r  r  r  r  r  r  r  r@  r  r  r  r  r  r  r  r  r  r  r  r  fitz_configr    r   r   r   r   R  s        7 7 7   \.   \    \ #3 #3 \#3J   \   \   \&   \*   \&   \&   \&   \   \*   \8 4 4 \4l 3 3 \3 A A \A 0 0 \0   " " \"
 % % \% 4 4 4 \4 $ $ $ \$ & & & \&     \  	 	 	 \	 ) ) \) % % \%       \    \" = = \= # # # \# * * * \* , , , \, ) ) ) \)   \   \ 2 2 \2   \ . . . \.  .""KKKr   r   )utilsc                 <    g | ]\  }\  }}}||d z  |d z  |d z  ffS )r~  r    )rp   rx  r   r	  r  s        r   rr   rr   T  sJ     	
 	
 	
9Aq! S!c'1s7+,	
 	
 	
r   c                  |    t          j                     t          j        d            t          j        d            d S r   )rf   r  fz_set_warning_callbackfz_set_error_callbackr    r   r   _atexitr  T  s9    		!$'''	%%%%%r   c                 *    t          j        |           S r   )r  r.  r6  s    r   r  r  KU  s    A r   )find_tablesc                       e Zd ZdS )FitzDeprecationNr  r    r   r   r  r  ZU  s        Dr   r  c                  l   t          j        dt                     dd} | t           _        dd} |t          dd            |t          d            |t          dd	            |t          d
            |t          d            |t          dd            |t          d            |t          dd            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          dd            |t          d            |t          d            |t          dd            |t
          d            |t
          dd            |t          d            |t          d            |t          dd             |t          d!            |t          d"            |t          d#d$            |t          d%d&            |t          d'd(            |t          d)d*            |t          d+d,            |t          d-d.            |t          d/d0            |t          d1d2            |t          d3            |t          d4            |t          d5            |t          d6            |t          d7            |t          d8d9            |t          d:d;            |t          d<d=            |t          d>            |t          d?            |t          d@dA            |t          dBdC            |t          dDdE            |t          dF            |t          dG            |t          dHdI            |t          dJ            |t          dKdL            |t          dMdN            |t          dO            |t          dP            |t          dQ            |t          dR            |t          dS            |t          dT            |t          dU            |t          dV            |t          dW            |t          dX            |t          dYdZ            |t          d[            |t          d\d]            |t          d^d_            |t          d`da            |t          db            |t          dc            |t          dd            |t          de            |t          dfdg            |t          dh            |t          di            |t          dj            |t          dkdl            |t          dm            |t          dn            |t          do            |t          dp            |t          dqdr            |t          ds            |t          dsdt            |t          du            |t          dv            |t          dw            |t          dx            |t          dy            |t          d            |t          d            |t          dz            |t          d{d|            |t          d}d~            |t          dd            |t          dd            |d dd            |d dd            |d d            |d dd            |d dd            |d dd            |d dd            |d d            |d d            |t          dy            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          dd            |t          dd            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          d            |t          dd            |t          d            |t          dd            |t          d            |t          dd¦            |t          dæ            |t          d            |t          ddŦ            |t          d
            |t          dƦ            |t          dǦ            |t          d            |t          dd            |t          dȦ            |t          dɦ            |t          dʦ            |t          d˦            |t          d̦            |t          ddΦ            |t          dϦ            |t          dЦ            |t          ddҦ            |t          ddԦ            |t          dզ            |t          d֦            |t          dצ            |t          dئ            |t          ddڦ            |t          ddܦ            |t          dݦ            |t          ddߦ            |t          d            |t          d            |t          d            |t          d            |t          d            |t          dd            |t          d            |t          dd            |t          dd            |t          dd            |t          dd            |t          dd            |t          d            |t          dd            |t          d            |t          d            |t          d            |t          d            |t          dd            |t          dd            |t          dd            |t          d            |t          dw            |t          d            |t          ds            |t          dsdt            |t          du            |t          dv            |t          dw            |t          dx            |t          d            |t          d            |t           j        d            |t           j        d            |t           j        d            |t           j        d            |t           j        d            |t           j        d            |t           j        d            |t           j        d            |t           j        d            |t           j        d            |t           j        d            |t           j        d˦            |t           j        d̦           d S (   Noncecategoryc                    t          j        | ||||          }|                    d          }|dk     rt          |           d S ||d                                          d         dd          }t          |           d S )N)r=   r  r   r  )warningsformatwarningri   r>   r  )r  catr3   r4   r.   r=   r:   r/  s           r   showthisz!restore_aliases.<locals>.showthis`U  s    %c3&tLLLII'((q5 	IIIFABBx""$$Q'+D					r   c                      t           j        t                    s3dd}D ],}|dk    rd}|r|                                z  d}'|z  -t	                     t	           d          rJ d  d             t                    r- fd}t           |           d	 d
j         |_        dS t                      dS )a  
        Adds an alias for a class_ or module item clled <class_>.<new>.

        class_:
            Class/module to modify; use None for the current module.
        new_name:
            String name of existing item, e.g. name of method.
        legacy_name:
            Name of legacy object to create in <class_>. If None, we generate
            from <item> by removing underscores and capitalising the next
            letter.
        Nr(   Fr  Tzclass z already has c            	          t                               d          s%t          j        d d d dt                      | i |S )Nz1.18rm  z" removed from z after v1.19.0 - use "z".r  )VersionBindr   r  warnr  )r  r  class_legacy_namenew_name
new_objects     r   deprecated_functionz<restore_aliases.<locals>._alias.<locals>.deprecated_functionU  sk    "--f55 MfffFffZbfff%4    "zD3F333r   z>*** Deprecated and removed in version following 1.19.0 - use "z". ***
)r  modulesr`   r  r   r  r  r	  )r  r  r  capitalise_nextry  r  r  s   ```   @r   _aliaszrestore_aliases.<locals>._aliaskU  sU     	+[*F 
	%K#O % %8 %&*OO$ %17799,K&+OO1$KKfh//
FK66cc8c8c8cVa8c8ccccZ   	64 4 4 4 4 4 4 4 V[*=>>>,U] , ,!), ,  '''
 V[*55555r   r  fileGetr  r  soundGetr  r'  r  getTextPager  r  setBlendModer!  r0  r3  rA  rT  rV  rY  setOCr`  ro  r  fileUpdr  r  r  convertToPDFr"  r  r  deletePageRanger9  embeddedFileAddr;  embeddedFileCountr>  embeddedFileDelr@  embeddedFileGetrF  embeddedFileInfor1  embeddedFileNamesrI  embeddedFileUpdrY  r  r  r  r7  r  getOCGsr  getPageFontListr  getPageImageListget_page_pixmapget_page_textr  getPageXObjectListr  getSigFlagsr'  getToCr  insert_pager  	insertPDFr  r  	isFormPDFr  isPDFr  r  rC  r  ra  rp  r  new_pager  r  r  pageCropBoxr  r  
PDFCatalogr  
PDFTrailerr  previousLocationr  search_page_forrO  set_metadataset_tocsetToCr8  r  rJ  ri  isStreamrm  r  rw  rz  r|  metadataXMLget_areagetRectArear  r  r
  r
  r2	  r	  r	  	preRotater	  preScaler	  preShearr	  preTranslater6  	getPDFnowr7  	getPDFstrro  getTextlengthrq  ImagePropertiesr  	PaperRectr  	PaperSizer  r  r  r:  r>  rB  rD  rJ  rM  rO  rS  rU  rW  rZ  r^  r`  rc  rf  ri  rk  rZ  r  r  r  CropBoxPositionr  r  delete_widgetr3  r>  rC  rI  rL  rS  rU  rW  rY  rB  ry  r{  r  r  r  r  r  getDisplayListr  r  getFontListr  r  getImageListr  r#  getSVGimageget_text_blocksget_text_wordsr=  insert_imager  r  insert_textboxr  
_isWrappedrx  r  r  ri  rQ  MediaBoxSize	new_shaperT  r  
search_forre  
setCropBoxr  setMediaBoxrs  show_pdf_pageshowPDFpager2  update_linkr  r  r  r  
copyPixmapr  r  invertIRectr  pillowWriter  
pillowDatar  
writeImagewritePNGr<  r  setResolutionrB  rD  rS  r  getImageData
getPNGData
getPNGdatarV  r  fill_textboxr  r   )r  filterwarningsr  showwarningr   r  r   r  r	  r<  r  r   r  r  r   r  r  r.  )r  r  s     r   restore_aliasesrR  ]U  s   Vo>>>>    $H*6 *6 *6 *6X FE:I666
FE<   
FE;J777
FE:
FE=!!!
FE>M:::
FE;
FE?N;;;
FE<   
FE<   
FE;
FE:
FE?###
FE:
FE8W%%%
FE=!!!
FE:
FE=I666
FK&&&
FKM:::
FHo&&&
FH*+++
FH&N;;;
FHk"""
FHm$$$
FHn,=>>>
FHm,=>>>
FHo,?@@@
FHm,=>>>
FHm,=>>>
FHn,>???
FHo,?@@@
FHm,=>>>
FHn%%%
FHo&&&
FHo&&&
FHo&&&
FH'(((
FHjI666
FH&,=>>>
FH',>???
FH'(((
FHo&&&
FH),@AAA
FHnM:::
FHi***
FH()))
FHm$$$
FHlK888
FHj!!!
FHmK888
FHh(((
FHo&&&
FHm$$$
FHo&&&
FHk"""
FHo&&&
FHk"""
FHl###
FHj!!!
FHo&&&
FHl###
FHnM:::
FHk"""
FHmL999
FHmL999
FHo,>???
FHn%%%
FH'(((
FHn%%%
FHn%%%
FHi***
FH()))
FHo&&&
FHo&&&
FH&J777
FHm$$$
FHm$$$
FHm$$$
FH'(((
FH)M:::
FE:
FE:M:::
FE?###
FE>"""
FE:
FE=!!!
FD-   
FD,
FD,
FF$%%%
FFKK888
FFJJ777
FFJJ777
FFNN;;;
FD-K888
FD-K888
FD#$$$
FD#O<<<
FD/,=>>>
FD,K888
FD,K888
FD-   
FD.!!!
FG]###
FGY
FD#$$$
FD$%%%
FD"###
FD&'''
FD'(((
FD/"""
FD"###
FD%&&&
FD&'''
FD"###
FD$%%%
FD&'''
FD#$$$
FD'(((
FD"###
FD'(((
FD,
FD"###
FD)I666
FD$,=>>>
FD.!!!
FD-   
FD/"""
FD%&&&
FD-   
FD-   
FD,
FD+
FD+
FD/"""
FD+
FD+
FD-   
FD/"""
FD-   
FD-   
FD,
FD.!!!
FD.!!!
FD#,<===
FD.!!!
FD+M:::
FD"###
FD,N;;;
FD+
FD,
FD/M:::
FD*
FD#$$$
FD"###
FD-   
FD.M:::
FD-   
FD.!!!
FD-   
FD-   
FD"###
FD,L999
FD,
FD,
FD*J777
FD/N;;;
FD+
FD/"""
FD#$$$
FD,
FD-L999
FD.M:::
FD.!!!
FD/M:::
FD)***
FD-   
FD/"""
FD,
FFL!!!
FFFL999
FFL!!!
FFNM:::
FFJM:::
FFML999
FFFL999
FFFJ777
FFK   
FFIO<<<
FFL!!!
FFK   
FFJ
FFK   
FFIN;;;
FFIL999
FFIL999
FD+
FD*
FD"###
FD*
FD*M:::
FD/"""
FD.!!!
FD*
FD-   
FJ'''
FJ%%%
FEK'''
FEK'''
FEK&&&
FEK%%%
FEK%%%
FEK)))
FEK%%%
FEK%%%
FEK'''
FEK)))
FEK'''
FEK'''
FEK)*****r   zPyMuPDF z : Python bindings for the MuPDF z* library (rebased implementation).
Python z running on r=  l        z-bit).
)r(   r   r  )r   r   r   r   r   N)r  )r/  r  r   )rY  )r   r   r   r   r  Nr  )r  r   r   )r   r   r/  r  r  N(  r	  atexitr  r  r/   r4  rP	  r   rD  r  rX  r  rO  r  r  r  r  rJ  r(   r   r   rW  r8   r@   r{   r   r#   r!   r%   r'   r>   rB   rF   r-  
whitespacer  rq  rO   rQ   r   r   rU   r
  r   r   re   __file__	importlib	machinerySourceFileLoaderload_moduler  r 	  rf   r   reinit_singlethreadedrj   r  VersionFitzr  VersionDater  VersionDate2r  r|   rl  pymupdf_version_tupleFZ_VERSION_MAJORFZ_VERSION_MINORFZ_VERSION_PATCHr~   r}   format_gOptionalr  r  r   OptDictr+  r	  r  r   r  Sequencer
  r   r  r   r  r   r   r   r   r   r   r   r   r   r  r   r  r_  rl  r  r  FzDocument_insert_pdfr  r   r   r  r  r  r	  r<  r	  r  r3	  r  r$
  r  rW  r  r  r   r.  r  r  r  r  r  r`   _selfr}  rt  r|  _valuer   r  
getmembersPDF_SIGNATURE_SHOW_LABELSPDF_SIGNATURE_SHOW_DNPDF_SIGNATURE_SHOW_DATEPDF_SIGNATURE_SHOW_TEXT_NAMEPDF_SIGNATURE_SHOW_GRAPHIC_NAMEPDF_SIGNATURE_SHOW_LOGO PDF_SIGNATURE_DEFAULT_APPEARANCEUCDN_EAST_ASIAN_HPDF_TX_FIELD_IS_MULTILINEUCDN_SCRIPT_ADLAMrR  rs  AnyAnyTypeBase14_fontnamesr  r  r  r	  r  r  r  r  r  r  rp  	PDF_OC_ONPDF_OC_TOGGLE
PDF_OC_OFFr	  r	  r	  r	  r	  r	  r	  r	  LINK_FLAG_R_VALIDLINK_FLAG_B_VALIDLINK_FLAG_FIT_HLINK_FLAG_FIT_VLINK_FLAG_R_IS_ZOOMr	  r
  STAMP_Approved
STAMP_AsIsSTAMP_ConfidentialSTAMP_DepartmentalSTAMP_ExperimentalSTAMP_ExpiredSTAMP_FinalSTAMP_ForCommentSTAMP_ForPublicReleaseSTAMP_NotApprovedSTAMP_NotForPublicRelease
STAMP_SoldSTAMP_TopSecretSTAMP_Draftr  r  r  r  TEXT_FONT_SUPERSCRIPTr  r  r  r  TEXT_OUTPUT_TEXTTEXT_OUTPUT_HTMLTEXT_OUTPUT_JSONTEXT_OUTPUT_XMLTEXT_OUTPUT_XHTMLTEXT_PRESERVE_LIGATURESTEXT_PRESERVE_WHITESPACETEXT_PRESERVE_IMAGESTEXT_INHIBIT_SPACESTEXT_DEHYPHENATETEXT_PRESERVE_SPANSTEXT_MEDIABOX_CLIPTEXT_CID_FOR_UNKNOWN_UNICODETEXTFLAGS_WORDSTEXTFLAGS_BLOCKSTEXTFLAGS_DICTTEXTFLAGS_RAWDICTTEXTFLAGS_SEARCHTEXTFLAGS_HTMLTEXTFLAGS_XHTMLTEXTFLAGS_XMLTEXTFLAGS_TEXTTEXT_ENCODING_LATINTEXT_ENCODING_GREEKTEXT_ENCODING_CYRILLICr  rs  ro  rq  PDF_BM_ColorPDF_BM_ColorBurnPDF_BM_ColorDodgePDF_BM_DarkenPDF_BM_DifferencePDF_BM_ExclusionPDF_BM_HardLight
PDF_BM_HuePDF_BM_LightenPDF_BM_LuminosityPDF_BM_MultiplyPDF_BM_NormalPDF_BM_OverlayPDF_BM_SaturationPDF_BM_ScreenPDF_BM_SoftLight
annot_skelr   r  r  r  r  r  r  r   dictkey_ascrl  rQ  r~  r:  r5  rT  r}  r  r  r  
dictkey_dar  r|  rJ  dictkey_effectrQ  r{  r  r8  r9  dictkey_glyphr|  r  r  ru  r}  rK  rn  r  r  rk  r7  r  r~  rz  r;  r  r  r  r   r  rR  r@  r{  rI  r   r  r  r  rZ  r[  r  r  r  rx  r
  rl  rm  rP  r]  r  r$  r]  ra  r`  r  rh  r  r  r   rz  r   rq  r  r  r
  r<  r  r   r`
  rX  rM  r\  r  r  rM  r  r  rK  r  r  r  r  r  r  r  r  r  r
  r  r  r  r7  r  ro  r  r  r/  r<  rG  ra  r  r  r  rF  rS  r  rY  r   re  r  r  rm  r  rq  r  r  rf  r
  rL  r  rP  r  r  rt  r  re  ri  r  r  r  r	  r  r
  r  r  r  rd  r*  rj
  r4  rF  rH  r@  r  rO  r  r  rq  rs  r  rx  r|  r.  rk  r]  r  rX  r  r  r\
  r<  r  r  r8  r6  r  r.  r
  r  r  rL  rB  re  r  r  r  r  rs  r  r  r'  r  r  r  r   r   r+  rn
  rq
  rw  r   ro
  r|
  r   rE  MSG_BAD_DOCUMENTr  MSG_BAD_LOCATIONr  r:  r  r  r  r7  rm  r	  rE  r  r  rw  rH  r
  rZ  rF  r  r  ry  r  rx  r  r,  r5  r6  rH  r  r  r-  r  r  r  r
  r   r+  r  r
  r  r>  r  r7  r^  ri  ro  rq  r{  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  FzPathWalker2r  r  r  r  r  r  r  r  r	  r  r  r  r  r  r  r  r  PdfFilterOptions2r   	FzDevice2ru  	FzOutput2r~  r  r  r+  r   rf  rk  rm  rw  ry  r7  r8  r  r  r  r  r  r6  r  r  r  rG  r  r  r  r"
  r  r  r  r*  r  r  r  r  r  r  r	  r	  rn  r  r
  r  r  r]  r  r  r  r  r5  r8  r  rC  r  r  rL  rI  r  r  r  r  r	  r  rd  r  r   r  getColorInfoDictpdfcolorr  r  r  registerrecover_bbox_quadrecover_char_quadrecover_line_quadrecover_quadrecover_span_quadr'  do_linksr  del_toc_itemr7  r  get_ocmdget_page_labelsget_page_numbersr  r  r'  
has_annots	has_linksr  r  scrubr   r!  rY  set_ocmdset_page_labelsr"  set_toc_itemsubset_fontsrQ  r  	xref_copyr&  apply_redactionsdelete_imager3  r>  rC  rI  rL  rS  rU  rW  rY  rB  ry  r{  get_image_infor  	get_labelr  r  r8  get_text_selectionr9  get_textpage_ocrr:  r  r  r;  insert_htmlboxr>  replace_imager?  rB  rD  r  tabler  rO  DeprecationWarningr  rR  __version__version_inforU  maxsizer    r   r   <module>r     s,           				  				  				  



            "O O O  [
33
.
;;tvv   ! ! !              S*\9CCFFBCC   $    #{$@!DD  l/66' ' ' ' ' ' ' ' 8:: jnnm,, "CH	Y	Y[	Y	Y	YZZZCH	>	>BJ|$<	>	>???b  )::  +-- 	 !'EE   E!!!   #""3++33C<<DDS"MM\
2KKK4E4Ec4J4JKKKLL -u/EuG]^ ee$P$P9J9J39O9O$P$P$PQQQ X XW/BWWWWX X X !     *  ?6,-
/$
?5!	c4i	 		)		*..!233
		4 4 4$4 4 4&0 0 00 0 0$ 	
f< f< f< f< f< f< f< f<R+c' c' c' c' c' c' c' c'Lb	 b	 b	 b	 b	 b	 b	 b	J       BO O O O O O O O.+ + + + + + + +Z  >"'"=_5 _5 _5 _5 _5 _5 _5 _5Bk )& )& )& )& )& )& )& )&XG/ G/ G/ G/ G/ G/ G/ G/T       v v v v v v v vro o o o o o o od: : : : :V : : :. >Z, Z, Z, Z, Z, Z, Z, Z,xe e e e e e e eP	      O O O O O O O Of ; ; ; ;|a$1 a$1 a$1 a$1 a$1 a$1 a$1 a$1HIY Y Y Y Y Y Y Yx 
u u u u u u u upeX eX eX eX eX eX eX eXPX X X X X X X Xvd	7 d	7 d	7 d	7 d	7 d	7 d	7 d	7N^B ^B ^B ^B ^B ^B ^B ^BBQ Q Q Q Q Q Q Qh
@ @ @ @ @ @ @ @Fi i i i i i i i^.K!E2"^1133 	2 	2ME6 899 2##$455 2 GE5&111	22 )*-).))* +), 0	)1
 3)4 +),$ "a'''' %(GGGGG 77777uf
* " 	 # #A!"OAGGII% - * 1 # + ( / ' & ( , " ( 
      	

 		

       
       
                  " 
!"
"#  '	' 
!"
"#  '	'  
!"
"#  	
 '' # 
!"
"#  	
 ''  
!"
"#  	
 '' 
!"
"#  	
 '' 
!"
"#  '	' 
!"
"#  '	'      


        
           D  DYY l  lee}}ZZgg
 

	 	 	 	 	L 	 	 		 	 	 	 	 	 	 		 	 	 	 	] 	 	 	 	
6	G			G		
 	! % 
 
 ::::::::/?/11!&&(( ; ;,7NQ))   A
HA
N  " " "!3 !3 !3H' ' 'U U U  T T T< < <
U U U     T T T    :6 6 6$  
  C C CL  I IE I I I II IU I I I I  / / /*2 2 2 % % %P  .3= 3= 3=l
 
 
2 2 2> > >&& & &<
 
 
  V V Vr5 5 5p4 4 4n  $" " "J     .0 0 0j/ / /d  (  & & &" " "JN N N0  I I I   $     *  .  6( ( (      " " "J% %c % % % %P7%+ 7EL 7Z] 7 7 7 7t  (  0    2/ / /   ; ; ;|4) 4) 4)n  ,  "C C CL) ) )X     B
  
  
   >    . 
  ) ) )X# # #L$ $ $N  <K K K\     F7 7 7<    0\ \ \(} } }@( ( (B* * *.+ + +B> > >  :3 3 3l=  =  = @* * ** * *6 6 6
  *  ,. . .
 
 
    2	 	 	  * * *Z  .(6 (6 (6VB B BB" " "( ( (  	 	 	" " "* * *Z  (6 6 6.  H H H"  0F F FR&# &# &#R< < <8#: #: #:L- - -`3 3 3<' ' 'B B B*~" ~" ~"B  8       6 6 60     F( ( (   & )? ( %( 0 ! ! ' % %%#*!- / &$(.,  '    	 	 	 	P& P P P PD C E    x s t    	&* 	 	 	 	 		&* 	 	 	 	 	H6: H H H H
 
 
 
 
 

- 
- 
- 
- 
- 
-.dE5$67 .C .C . . . .$  .0 0 0

# 
# 
# 
# 
# 
#  2. . .b    "3 "T5$-> ? " "Y\ "ad " " " "J23 23 2 2 2 2j=c = = = =B %)TRVB B BB!B3:BIOBB B B BJ'< '<# '< '< '<UX '<`e '< '< '< '<T'v( 'T ' ' ' ',D D DNJ J J1 1 1          X X X  $ $ $N. . .b  U U Up  8    N    p p p p pU  p p pf  >2 2 2j  *  (              $    
! ! !
  +Z +Z +F + + + +     u6   . . . . . . . .<$ $ $ $ $5? $ $ $0  $P/ P/ P/ P/ P/5? P/ P/ P/f3% 3% 3% 3% 3%eo 3% 3% 3%lV% V% V% V% V%r3 3 3v 3 3 3 3l    *)5 ) ) ) )+e + + + +6 c    
 
 
 

 
 
    8    S    &    f     F F F FYb Fmq F F F FR, , , , , ,1 1 1( (Y (C (# (T ( ( ( (VG G G8 #t$4 K* K* K* K* K*\  $$4D 	 	 	 	 	H H Hf f f      / / /      $ $ $N  ,  6 6 6 " " ">  2G2 G2 G2T)# )$ ) ) ) )# %    (6
 6
 6
p *$ Z$6 6 6 6A A AF$ $ $*/ / / /dL L L L@4c 4e 4 4 4 4c e       ) ) )X  ,     ! ,c ,c , , , , 1 1 1 dffdff| | | | |D = = = = =@y# y# y# y# y# y# y# y#~       4	
 	
 6 6 8 8 > > @ @	
 	
 	

 
  0!E!"2333E///(& & &    
 $5 #5 #5 #0#5 #n#/ #n #0 #3 #l#n #3 #4 #3 #1 #m #. #o #/ #n #k#3 #0 #l#n #3 #m #0 #0 &n #o #n#4 #0 #1 #/ #/ #.#o#o#1 #o#o#/ #1 #/ #2 #3 #o#o#.#n#3 #6 #2 #/ #4 #0 #/ #/ #2 #2 66#1 #.#1 #/ #.       #n#0
 	 	 	 	 	( 	 	 	V+ V+ V+p 	E; 	E 	E 	E 	E"1%	E 	E(+(8(;	E 	EIL	E 	E_b_jmr_rYzY[Y[xz	E 	E 	E s%   ?F 	FFA`/ /	`;:`;