ó
    �®žj¹ ã            	      ó¸  • % S r SSKJr  SSKrSSKrSSKJr  SSKJr  SSK	J
r
  SSKJr  SSKJrJr  SS	KJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJ r J!r!J"r"J#r#J$r$J%r%J&r&J'r'  SS
K(J)r*  SSK+J,r,J-r-  SSK.J/r/  SSK0J1r1J2r2  SSK3J4r4  SSK5J6r6  SSK7J8r8  SSK9J:r:  Sr;S\<S'   Sr=S\<S'    SSK>J?r@JArAJBrBJCrCJDrEJFrFJGrGJHrHJIrJ  Sr;\Rš                  " \N5      rOSrP\R¢                  \R¤                  \R¦                  \R¦                  \R¨                  S.rU\ " S S5      5       rV\ " S S5      5       rW\R°                  " S5      rYS^S  jrZ      S_S! jr[ " S" S#\15      r\S`S$ jr]SaS% jr^SbS& jr_ScS' jr`SdS( jra Se       SfS) jjrb  Sg         ShS* jjrcSiS+ jrdSjS, jre            SkS- jrf            SlS. jrg            SmS/ jrh      SnS0 jriSS1.             SoS2 jjrjSpS3 jrkSS4.     SqS5 jjrlSS4.       SrS6 jjrm      SsS7 jrn      SsS8 jroSS4.     SsS9 jjrp        StS: jrq          SuS; jrr        SvS< jrs          SwS= jrtSxS> jruSyS? jrvSzS@ jrwSzSA jrxSySB jrySySC jrzSySD jr{SS1.       S{SE jjr|S|SF jr}S}SG jr~S~SH jrSSI jr€SSSJ.               S€SK jjr�SS1.             S�SL jjr‚SS1.             S‚SM jjrƒSƒSN jr„S„SO jr…      S…SP jr†            S†SQ jr‡    S‡                   SˆSR jjrˆ Se             S‰SS jjr‰SSSSSSSSST.                       SŠSU jjrŠ            S‹SV jr‹    SŒ           S�SW jjrŒ " SX SY\\5      r� " SZ S[\\\25      rŽ " S\ S]\\\25      r�g! \K a  rL\Lr= SrLCLGNSrLCLff = f)Ža‡  Backends to parse OpenDocument formats (ODT, ODS, ODP).

The backends leverage the ``odfdo`` library (https://github.com/jdum/odfdo) to
read the underlying XML structure and translate it into a :class:`DoclingDocument`.

The conventions used here mirror the corresponding Microsoft Office backends
(:mod:`docling.backend.msword_backend`, :mod:`docling.backend.mspowerpoint_backend`,
:mod:`docling.backend.msexcel_backend`).

Known gaps to improve:
- rich text styling is not preserved yet;
- ODP table extraction and ordered-list markers are incomplete;
- ODS conversion focuses on cell/table content rather than spreadsheet rendering
  fidelity.
é    )ÚannotationsN)ÚCallable)Ú	dataclass©ÚBytesIO)ÚPath)ÚAnyÚcast)ÚBoundingBoxÚContentLayerÚCoordOriginÚDocItemÚDocItemLabelÚDoclingDocumentÚDocumentOriginÚ
FormattingÚ
GroupLabelÚImageRefÚNodeItemÚPictureClassificationLabelÚPictureClassificationMetaFieldÚPictureClassificationPredictionÚPictureMetaÚProvenanceItemÚRichTableCellÚScriptÚSizeÚ	TableCellÚ	TableDataÚ	TableItemÚTabularChartMetaField)ÚImage)ÚAnyUrlÚValidationError)Úoverride)ÚDeclarativeDocumentBackendÚPaginatedDocumentBackend)ÚImageResourceLoader)ÚOdsBackendOptions)ÚInputFormat)ÚInputDocumentFÚboolÚ_ODFDO_AVAILABLEzImportError | NoneÚ_ODFDO_IMPORT_ERROR)	ÚDocumentÚDrawPageÚFrameÚHeaderÚListÚListItemÚ	ParagraphÚSectionÚTableTz�The 'odfdo' package is required to process OpenDocument files. Install it with `pip install 'docling-slim[format-opendocument]'`.)z	chart:barz
chart:linezchart:circlez	chart:piezchart:scatterc                  ó>   • \ rS rSr% S\S'   S\S'   S\S'   S\S	'   S
rg)Ú_OdfListStateég   r   ÚgroupúNodeItem | NoneÚ	last_itemr,   Ú
enumeratedÚintÚcounter© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__annotations__Ú__static_attributes__rA   ó    Úa/home/mande/repo/quber/.venv/lib/python3.13/site-packages/docling/backend/opendocument_backend.pyr9   r9   g   s   ‡ àƒOØÓØÓØ†LrH   r9   c                  ó<   • \ rS rSr% S\S'   SrS\S'   SrS\S'   S	rg)
Ú_OdfTextRunéo   ÚstrÚtextNúFormatting | NoneÚ
formattingúAnyUrl | Path | NoneÚ	hyperlinkrA   )rB   rC   rD   rE   rF   rP   rR   rG   rA   rH   rI   rK   rK   o   s   ‡ à
ƒIØ$(€JÐ!Ó(Ø&*€IÐ#Ö*rH   rK   z^[a-zA-Z][a-zA-Z0-9+.-]*:c                óÀ   • U c  g U R                  5       n U (       d  g  [        U 5      $ ! [         a*    [        R	                  U 5      (       a   g [        U 5      s $ f = f©N)Ústripr#   r$   Ú_ODF_HREF_SCHEME_REÚmatchr   ©Úhrefs    rI   Ú_odf_hyperlink_from_hrefrZ   y   sY   € Ø�|ØØ�:‰:‹<€DÞØðÜ�d‹|ÐøÜó Ü×$Ñ$ T×*Ñ*ñ Ü�D‹zÒðús   ž
) ©$AÁAÁAc                ó®   •  [        U [        5      (       a  [        U 5      $ [        [        U 5      5      $ ! [         a  n[        SU 35      UeSnAff = f)z5Load an ODF document from a path or in-memory stream.z7OpenDocument backend could not load document with hash N)Ú
isinstancer   ÚOdfDocumentrM   Ú	ExceptionÚRuntimeError)Úpath_or_streamÚdocument_hashÚes      rI   Ú_load_odf_documentrc   Š   sY   € ðÜ�n¤g×.Ñ.Ü˜~Ó.Ð.Üœ3˜~Ó.Ó/Ð/øÜó ÜØEÀmÀ_ÐUó
àð	ûðús   ‚6 ¢6 ¶
AÁ AÁAc                  ó‚   ^ • \ rS rSr% SrSrS\S'   \ S
       SU 4S jjj5       r\SS j5       r	\S 5       r
S	rU =r$ )Ú_OdfBaseBackendé˜   z@Shared loading / validation logic for ODT, ODS and ODP backends.Ú rM   Ú	_odf_typec                ó
  >• [         (       d  [        [        5      [        e[        TU ]  XU5        X l        SU l        [        X R                  5      U l
        U R                  (       a]  U R                  R                  5       U R                  :w  a5  [        SU R                  < SU R                  R                  5       < 35      eSU l        [        U R                  R                   U R                  R"                  S9U l        g )NFzExpected an OpenDocument z	 but got T)Úenable_local_fetchÚenable_remote_fetch)r-   ÚImportErrorÚ_INSTALL_HINTr.   ÚsuperÚ__init__r`   Úvalidrc   ra   Úodf_objrh   Úget_typer_   r(   Úoptionsrj   rk   Ú_image_loader©ÚselfÚin_docr`   rs   Ú	__class__s       €rI   ro   Ú_OdfBaseBackend.__init__�   sÎ   ø€ ÷  ÒÜœmÓ,Ô2EÐEÜ‰Ñ˜°Ô9Ø.<ÔØ ˆŒ
Ü$6Ø×.Ñ.ó%
ˆŒð �>�>˜dŸl™l×3Ñ3Ó5¸¿¹ÓGÜØ+¨D¯N©NÑ+=¸YØ—<‘<×(Ñ(Ó*Ñ-ð/óð ð ˆŒ
Ü0Ø#Ÿ|™|×>Ñ>Ø $§¡× @Ñ @ñ
ˆÕrH   c                ó   • U R                   $ rT   )rp   ©rv   s    rI   Úis_validÚ_OdfBaseBackend.is_valid·   s   € à�z‰zÐrH   c                ó„   • [        U R                  [        5      (       a  U R                  R                  5         S U l        g rT   )r\   r`   r   Úcloser{   s    rI   ÚunloadÚ_OdfBaseBackend.unload»   s/   € ä�d×)Ñ)¬7×3Ñ3Ø×Ñ×%Ñ%Ô'Ø"ˆÕrH   )rt   rq   r`   rp   rT   ©rw   r+   r`   úBytesIO | Pathrs   zOdsBackendOptions | NoneÚreturnÚNone©r„   r,   )rB   rC   rD   rE   Ú__doc__rh   rF   r%   ro   r|   r€   rG   Ú__classcell__©rx   s   @rI   re   re   ˜   su   ø‡ ÙJà€IˆsÓàð
 -1ð	
àð
ð 'ð
ð *ð	
ð
 
÷
ó ð
ð2 óó ðð ñ#ó ö#rH   re   c                ó„  • Su  pSu  p4[        U R                  5       5       GH  u  pV[        UR                  5       5       Hí  u  px[        U5      (       d  UR                  S:X  a%  Uc  UnUb  Xr:  a  Un[	        X55      n[	        XG5      nUR                  S:w  d  M\  UR
                  n	[        U	R                  S5      =(       d    S5      n
[        U	R                  S5      =(       d    S5      nU
S:”  d  US:”  d  M¼  Uc  UnUb  Xr:  a  Un[	        X5U
-   S-
  5      n[	        XGU-   S-
  5      nMï     GM     Ub  Uc  gXX$4$ )a¾  Find the true data boundaries (min/max rows and columns) in an ODS table.

This function scans all cells to find the smallest rectangular region that contains
all non-empty cells or merged cell ranges, similar to the Excel backend approach.

Args:
    table: The ODF table to analyze.

Returns:
    A tuple (min_row, max_row, min_col, max_col) representing the 0-based indices
    of the data region. If the table is empty, returns (0, 0, 0, 0).
©NN©r   r   útable:covered-table-cellútable:number-rows-spannedé   útable:number-columns-spanned)r   r   r   r   )Ú	enumerateÚtraverseÚ_odf_cell_has_contentÚtagÚmaxÚ
attributesr?   Úget)ÚtableÚmin_rowÚmin_colÚmax_rowÚmax_colÚrow_idxÚrowÚcol_idxÚcellÚattrsÚrow_spanÚcol_spans               rI   Ú_find_true_data_boundsr¤   Â   s:  € ð "Ñ€GØÑ€Gô " %§.¡.Ó"2×3‰ˆÜ& s§|¡|£~Ö6‰MˆGä$ T×*Ñ*¨d¯h©hÐ:TÓ.TØ‘?Ø%�GØ‘? gÓ&7Ø%�GÜ˜gÓ/�Ü˜gÓ/�ð �x‰xÐ5Õ5ØŸ™�Ü˜uŸy™yÐ)DÓE×JÈÓK�Ü˜uŸy™yÐ)GÓH×MÈAÓN�Ø˜a“< 8¨a¥<Ø‘Ø")˜Ø‘¨'Ó*;Ø")˜Ü! '°XÑ+=ÀÑ+AÓB�GÜ! '°XÑ+=ÀÑ+AÓB’Gô+ 7ñ 4ð2 �˜'™/Øà˜gÐ/Ð/rH   c                ól   • S U R                  5        5        Vs/ s H  o(       d  M  UPM     sn$ s  snf )Nc              3  ó@   #   • U  H  oR                  5       v •  M     g 7frT   )rU   )Ú.0Úlines     rI   Ú	<genexpr>Ú(_clean_odf_text_lines.<locals>.<genexpr>ó   s   é € ÐIÒ7H¨tŸj™jŸl˜lÒ7Hùs   ‚)Ú
splitlines)rN   r¨   s     rI   Ú_clean_odf_text_linesr¬   ò   s*   € ÙI°t·±Ô7HÔIÓRÒI�TËT�DÑIÑRÐRùÒRs   š
1¨1c                ó&   • U [        5       :X  a  S $ U $ rT   )r   ©rP   s    rI   Ú_formatting_or_noner¯   ö   s   € Ø¤£Ó-ˆ4Ð=°:Ð=rH   c                ó<   • U c
  [        5       $ U R                  5       $ rT   )r   Ú
model_copyr®   s    rI   Ú_copy_formattingr²   ú   s   € ØÑÜ‹|ÐØ× Ñ Ó"Ð"rH   c                ó\   • U S:X  a  gU S;   a  g [        U 5      S:¬  $ ! [         a     gf = f)NÚboldT>   rg   ÚnormalFiX  )r?   Ú
ValueError)Úvalues    rI   Ú_is_bold_weightr¸      s=   € Ø�ƒØØ�ÓØðÜ�5‹z˜SÑ Ð øÜó Ùðús   � ž
+ª+c                ó  ^
• [        U5      nU b  Uc  [        U5      $ U R                  SU5      nUc  [        U5      $ UR                  5       =(       d    0 m
[	        U
4S jS 5       S 5      nUb  [        U5      Ul        [	        U
4S jS 5       S 5      nUb
  US;   Ul        T
R                  S5      nUb
  US:g  Ul	        T
R                  S	5      =(       d    T
R                  S
5      nUb
  US:g  Ul
        T
R                  S5      n	U	bm  U	R                  S5      (       a  [        R                  Ul        OAU	R                  S5      (       a  [        R                  Ul        O[        R                   Ul        [        U5      $ )NrN   c              3  ó>   >#   • U  H  nUT;   d  M  TU   v •  M     g 7frT   rA   ©r§   ÚnameÚpropss     €rI   r©   Ú2_formatting_from_odf_text_style.<locals>.<genexpr>  ó+   øé € ð 	
ò�ð
 �u‰}ó ˆE�$ŽKòùó   ƒ
‘)zfo:font-weightzstyle:font-weight-asianzstyle:font-weight-complexc              3  ó>   >#   • U  H  nUT;   d  M  TU   v •  M     g 7frT   rA   r»   s     €rI   r©   r¾   )  r¿   rÀ   )zfo:font-stylezstyle:font-style-asianzstyle:font-style-complex>   ÚitalicÚobliquezstyle:text-underline-styleÚnonezstyle:text-line-through-stylezstyle:text-line-through-typezstyle:text-positionrn   Úsub)r²   r¯   Ú	get_styleÚget_propertiesÚnextr¸   r´   rÂ   r—   Ú	underlineÚstrikethroughÚ
startswithr   ÚSUPERÚscriptÚSUBÚBASELINE)rq   Ú
style_nameÚbase_formattingrP   ÚstyleÚfont_weightÚ
font_styleÚunderline_styleÚline_throughÚtext_positionr½   s             @rI   Ú_formatting_from_odf_text_stylerØ     s  ø€ ô
 " /Ó2€JØ�˜*Ñ,Ü" :Ó.Ð.à×Ñ˜f jÓ1€EØ�}Ü" :Ó.Ð.à× Ñ Ó"×( b€EÜô	
ñó	
ð 	ó€Kð ÑÜ)¨+Ó6ˆ
Œäô	
ñó	
ð 	ó€Jð ÑØ&Ð*?Ñ?ˆ
Ôà—i‘iÐ <Ó=€OØÑ"Ø.°&Ñ8ˆ
Ôà—9‘9Ð<Ó=÷ ÀÇÁØ&óB€Lð ÑØ#/°6Ñ#9ˆ
Ô à—I‘IÐ3Ó4€MØÑ Ø×#Ñ# G×,Ñ,Ü &§¡ˆJÕØ×%Ñ% e×,Ñ,Ü &§
¡
ˆJÕä &§¡ˆJÔä˜zÓ*Ð*rH   c           	     óÊ  • U R                   R                  S5      n[        XU5      nU R                  nUS:X  a$  [	        U R                   R                  S5      5      OUnUS:X  a  [        U R                  =(       d    SXWS9/$ US:X  a  [        SXWS9/$ / nU R                  n	U R                  n
U
(       a  UR                  [        X¥US95        U	 HT  nUR                  [        X±XW5      5        UR                  (       d  M1  UR                  [        UR                  XWS95        MV     U(       d3  U	(       d,  U R                  nU(       a  UR                  [        XÅUS95        U$ )	Nútext:style-nameztext:aú
xlink:hrefztext:line-breakÚ
©rN   rP   rR   ztext:tabÚ	)r–   r—   rØ   r”   rZ   rK   rN   ÚchildrenÚappendÚextendÚ_odf_text_runsÚtailÚ
inner_text)Úelementrq   Úinherited_formattingÚinherited_hyperlinkrÐ   rP   r”   rR   Úrunsrß   rN   Úchildrä   s                rI   râ   râ   M  sH  € ð ×#Ñ#×'Ñ'Ð(9Ó:€JÜ0ØÐ1ó€Jð �+‰+€Cð �(‹?ô 	! ×!3Ñ!3×!7Ñ!7¸Ó!EÔFà ð ð
 ÐÓäØ—\‘\×) T°jñð
ð 	
ð
 ˆjÓÜ °*ÑRÐSÐSà €DØ×Ñ€HØ�<‰<€DÞØ�‰”K TÈIÑVÔWãˆØ�‰”N 5°:ÓIÔJØ�:�:‰:Ø�K‰KÜ §¡¸
ÑXöñ ö žØ×'Ñ'ˆ
ÞØ�K‰KÜ ÈiÑXôð €KrH   c           	     ó¼  • / nU  GH  nUR                   S:X  a  M  U(       a^  US   R                  UR                  :X  aA  US   R                  UR                  :X  a$  US   =R                   UR                   -  sl         M{  UR                   nU(       aR  US   R                  UR                  :w  a5  US   R                   R                  5       US   l         UR	                  5       nUR                  [        X2R                  UR                  S95        GM     U(       a\  US   R                   R                  5       S:X  a;  UR                  S5        U(       a#  US   R                   R                  5       S:X  a  M;  U(       a%  US   R                   R	                  5       US   l         U(       a[  US   R                   R                  5       S:X  a:  UR                  5         U(       a#  US   R                   R                  5       S:X  a  M:  U(       a%  US   R                   R                  5       US   l         U Vs/ s H  o"R                   (       d  M  UPM     sn$ s  snf )Nrg   éÿÿÿÿrÝ   r   )	rN   rP   rR   ÚrstripÚlstriprà   rK   rU   Úpop)rè   Úmerged_runsÚrunrN   s       rI   Ú_normalize_odf_text_runsrñ   }  sÇ  € Ø%'€KÜˆØ�8‰8�r‹>ÙæØ˜B‘×*Ñ*¨c¯n©nÓ<Ø˜B‘×)Ñ)¨S¯]©]Ó:à˜‰O× Ò  C§H¡HÑ,Õ Ùà�x‰xˆÞ˜; r™?×4Ñ4¸¿¹ÓEð $/¨r¡?×#7Ñ#7×#>Ñ#>Ó#@ˆK˜‰OÔ Ø—;‘;“=ˆDØ×ÑÜ˜T¯n©nÈÏÉÑV÷	
ñ% ö, ˜+ a™.×-Ñ-×3Ñ3Ó5¸Ó;Ø�‰˜Ôö ˜+ a™.×-Ñ-×3Ñ3Ó5¸Õ;æØ)¨!™n×1Ñ1×8Ñ8Ó:ˆ�A‰Ôæ
˜+ b™/×.Ñ.×4Ñ4Ó6¸"Ó<Ø�‰Ôö ˜+ b™/×.Ñ.×4Ñ4Ó6¸"Õ<æØ*¨2™×3Ñ3×:Ñ:Ó<ˆ�B‰Ôá&Ó3š;�C¯(­(�C™;Ñ3Ð3ùÒ3s   È8IÉIc                ód   • [        U 5      n SR                  S U  5       5      R                  5       $ )Nrg   c              3  ó8   #   • U  H  oR                   v •  M     g 7frT   ©rN   )r§   rð   s     rI   r©   Ú&_odf_text_from_runs.<locals>.<genexpr>¤  s   é € Ð,¢t —8–8¢tùs   ‚)rñ   ÚjoinrU   )rè   s    rI   Ú_odf_text_from_runsr÷   ¢  s*   € Ü# DÓ)€DØ�7‰7Ñ,¡tÓ,Ó,×2Ñ2Ó4Ð4rH   c          
     óT  • [        U5      nU(       d  g [        U5      S:X  a;  U R                  UUUS   R                  UUS   R                  US   R
                  S9$ U R                  X4S9nU H5  nU R                  UUUR                  UUR                  UR
                  S9  M7     U$ )Nr�   r   ©ÚlabelÚparentrN   Úcontent_layerrP   rR   ©rû   rü   )rñ   ÚlenÚadd_textrN   rP   rR   Úadd_inline_group)Údocrè   rú   rû   rü   Úinline_grouprð   s          rI   Ú_add_odf_text_runsr  §  s¹   € ô $ DÓ)€DÞØÜ
ˆ4ƒy�Aƒ~Ø�|‰|ØØØ�a‘—‘Ø'Ø˜A‘w×)Ñ)Ø˜1‘g×'Ñ'ð ð 
ð 	
ð ×'Ñ'¨vÐ'ÐS€LÛˆØ�‰ØØØ—‘Ø'Ø—~‘~Ø—m‘mð 	ó 	
ñ ð ÐrH   c          
     ój  • [        U5      nU(       d  g[        U5      S:X  a1  U" US   R                  UUUS   R                  US   R                  S9$ U" SX4S9nU R                  XTS9nU HC  nU R                  [        R                  UUR                  UUR                  UR                  S9  ME     U$ )	aG  Add a heading/title-like block from text runs.

A single run becomes the block directly. Multiple runs (e.g. a heading
with a hyperlink or mixed formatting in the middle) become one empty
block wrapping an InlineGroup of TEXT runs, so the block stays a single
semantic item instead of fragmenting into several headings/titles.
Nr�   r   )rN   rû   rü   rP   rR   rg   )rN   rû   rü   rý   rù   )	rñ   rþ   rN   rP   rR   r   rÿ   r   ÚTEXT)r  rè   Ú	add_blockrû   rü   Úblockr  rð   s           rI   Ú_add_odf_rich_blockr  É  s¾   € ô $ DÓ)€DÞØÜ
ˆ4ƒy�Aƒ~ÙØ�a‘—‘ØØ'Ø˜A‘w×)Ñ)Ø˜1‘g×'Ñ'ñ
ð 	
ñ ˜2 fÑJ€EØ×'Ñ'¨uÐ'ÐR€LÛˆØ�‰Ü×#Ñ#ØØ—‘Ø'Ø—~‘~Ø—m‘mð 	ó 	
ñ ð €LrH   c               óŠ   ^ ^• [        SUR                  S5      =(       d    S5      m[        X5      n[        T UU U4S jUUS9  g )Nr�   ztext:outline-levelc                 ó,   >• TR                   " SST0U D6$ )NÚlevelrA   ©Úadd_heading)Úkwargsr  r  s    €€rI   Ú<lambda>Ú"_add_odf_heading.<locals>.<lambda>ÿ  s   ø€  3§?¢?Ñ#I¸Ð#IÀ&Ò#IrH   ©r  rû   rü   )r•   Úget_attribute_integerrâ   r  )r  rå   rû   rü   rq   rè   r  s   `     @rI   Ú_add_odf_headingr  ò  sC   ù€ ô ��7×0Ñ0Ð1EÓF×KÈ!ÓL€EÜ˜'Ó+€DÜØØÝIØØ#órH   c                ór  • [        5       nUR                  R                  S5      nUb  UR                  U5        U b  Uc  U$ U R	                  SU5      nUc  U$ UR                  R                  S5      nUb  UR                  U5        UR                  R                  S5      nUb  UR                  U5        U$ )NrÚ   Ú	paragraphzstyle:parent-style-namezstyle:display-name)Úsetr–   r—   ÚaddrÆ   )rq   rå   Ústyle_namesrÐ   rÒ   Úparent_style_nameÚdisplay_names          rI   Ú_odf_paragraph_style_namesr    s»   € ô  ›E€KØ×#Ñ#×'Ñ'Ð(9Ó:€JØÑØ�‰˜
Ô#à�˜*Ñ,ØÐà×Ñ˜k¨:Ó6€EØ�}ØÐà×(Ñ(×,Ñ,Ð-FÓGÐØÑ$Ø�‰Ð)Ô*Ø×#Ñ#×'Ñ'Ð(<Ó=€LØÑØ�‰˜Ô%ØÐrH   ©Úimage_loaderc          
     ó  ^ • [        T XX45      nUR                  5       n[        T UUUUUUS:„  S9n[        X5      n	[	        U	5      n
U(       a3  [        X§5      R                  5       nXº:w  a  U(       a
  [        US9/O/ n	Un
US:”  a  [        X§5      (       a  g US:”  a  SU
;   d  U
(       d  g [        XA5      nSU;   a  [        T U	U 4S jUUS9  g SU;   a  [        T U	U 4S	 jUUS9  g [        T U	[        R                  UUS
9  g )Nr   ©r  Úskip_object_replacementsrô   ÚObjectReplacementsÚTitlec                 óH   >• TR                   " SS[        R                  0U D6$ )Nrú   rA   )rÿ   r   ÚTITLE©r  r  s    €rI   r  Ú$_add_odf_paragraph.<locals>.<lambda>B  s   ø€  s§|¢|Ñ'W¼,×:LÑ:LÐ'WÐPVÒ'WrH   r  ÚSubtitlec                 ó,   >• TR                   " SSS0U D6$ )Nr  r�   rA   r  r%  s    €rI   r  r&  J  s   ø€  s§¢Ñ'I¸QÐ'IÀ&Ò'IrH   ©rú   rû   rü   )Ú_add_odf_chartsÚ
get_imagesÚ_add_odf_imagesrâ   r÷   Ú_strip_odf_image_reference_textrU   rK   Ú'_odf_text_is_generated_image_referencesr  r  r  r   r  )r  rå   rû   rü   rq   r  Úchart_countÚimagesÚimage_countrè   rN   Ústripped_textr  s   `            rI   Ú_add_odf_paragraphr3    s  ø€ ô " # w¸ÓO€KØ×ÑÓ!€FÜ!ØØØØØØ!Ø!,¨q¡ñ€Kô ˜'Ó+€DÜ˜tÓ$€DÞÜ7¸ÓE×KÑKÓMˆØÓ Þ8E”K ]Ñ3Ñ4È2ˆDØ ˆDØ�QƒÔBÀ4×PÑPØØ�QƒÐ0°DÓ8ÆØä,¨WÓ>€KØ�+ÓÜØØÜWØØ'ó	
ð 
�{Ó	"ÜØØÜIØØ'ó	
ô 	ØØÜ×#Ñ#ØØ'ó	
rH   c                ó|  • [        U [        5      (       aH  / nU R                   H4  n[        U[        5      (       d  M  UR	                  [        U5      5        M6     U$ [        U [        5      (       aM  / nU R                   H  nUR	                  [        U5      5        M     U(       a  U$ [        U R                  5      $ [        U [        [        45      (       a  [        U R                  5      $ / n[        U S/ 5       H  nUR	                  [        U5      5        M     U(       a  U$ [        U R                  5      $ )Nrß   )r\   ÚOdfListrß   r4   rá   Ú_odf_element_text_linesr¬   Útext_recursiver2   r5   Úgetattr)rå   Úlinesré   Úchild_liness       rI   r6  r6  X  s   € Ü�'œ7×#Ñ#ØˆØ×%Ô%ˆEÜ˜%¤×*Ó*Ø—‘Ô4°UÓ;Ö<ñ &ð ˆä�'œ8×$Ñ$ØˆØ×%Ô%ˆEØ�L‰LÔ0°Ó7Ö8ñ &æØˆLÜ$ W×%;Ñ%;Ó<Ð<ä�'œF¤IÐ.×/Ñ/Ü$ W×%;Ñ%;Ó<Ð<à€KÜ˜ *¨bÖ1ˆØ×ÑÔ2°5Ó9Ö:ñ 2æØÐä  ×!7Ñ!7Ó8Ð8rH   ©Úflatten_nested_textc               óŽ  • / n/ nU R                    Hf  n[        U[        5      (       a  UR                  U5        M+  [        U[        5      (       d  MB  UR                  [        UR                  5      5        Mh     U(       d2  U(       d  U(       d$  UR                  [        U R                  5      5        SR                  U5      U4$ )NÚ )	rß   r\   r5  rà   r5   rá   r¬   r7  rö   )Úitemr<  Ú
text_partsÚnestedré   s        rI   Ú_odf_list_item_contentrB  t  s”   € ð €JØ€FØ—”ˆÜ�eœW×%Ñ%Ø�M‰M˜%Ö Ü˜œy×)Ó)Ø×ÑÔ3°E×4HÑ4HÓIÖJñ	 ö
 Ö.¶fØ×ÑÔ/°×0CÑ0CÓDÔEØ�8‰8�JÓ Ð'Ð'rH   c               ój  • / nSnU R                    HM  n[        U[        5      (       a  SnM  [        U[        5      (       d  M3  UR	                  [        XQ5      5        MO     U(       dA  U(       d  U(       d3  [        [        X5      5      nU(       a  UR                  [        US95        [        U5      $ )NFTrô   )
rß   r\   r5  r5   rá   râ   r÷   rà   rK   rñ   )r?  rq   r<  rè   Ú
has_nestedré   rN   s          rI   Ú_odf_list_item_text_runsrE  ƒ  s„   € ð !€DØ€JØ—”ˆÜ�eœW×%Ñ%ØŠJÜ˜œy×)Ó)Ø�K‰Kœ uÓ6Ö7ñ	 ö
 Ö(¶
Ü"¤>°$Ó#@ÓAˆÞØ�K‰Kœ¨Ñ.Ô/Ü# DÓ)Ð)rH   c               ó´   ^• U R                    HG  n[        U[        5      (       d  M  [        UTS9u  p4US:H  =(       a    [	        U4S jU 5       5      s  $    g)Nr;  rg   c              3  ó8   >#   • U  H  n[        UTS 9v •  M     g7f©r;  N©Ú _odf_list_has_renderable_content©r§   r?  r<  s     €rI   r©   Ú:_odf_list_starts_with_empty_nested_item.<locals>.<genexpr>   s'   øé € ð "
ò �ô -ØÐ*=öò ùó   ƒF©rß   r\   r4   rB  Úany©Úodf_listr<  ré   rN   rA  s    `   rI   Ú'_odf_list_starts_with_empty_nested_itemrR  —  se   ø€ ð ×"Ô"ˆÜ˜%¤×*Ñ*ÙÜ-ØÐ':ñ
‰ˆð �r‰z÷ 
œcô "
ñ ó	"
ó 
ò 	
ñ #ð rH   c               ó€   • U R                    H.  n[        U[        5      (       d  M  [        X!S9u  p4U(       d  M.    g   g)Nr;  TF)rß   r\   r4   rB  )rQ  r<  ré   rN   Ú_nesteds        rI   Ú_odf_list_has_direct_item_textrU  ©  sB   € ð ×"Ô"ˆÜ˜%¤×*Ñ*ÙÜ.Øñ
‰ˆ÷ ˆ4Ùñ #ð rH   c               ó¸   ^• U R                    HI  n[        U[        5      (       d  M  [        UTS9u  p4U(       d  [	        U4S jU 5       5      (       d  MI    g   g)Nr;  c              3  ó8   >#   • U  H  n[        UTS 9v •  M     g7frH  rI  rK  s     €rI   r©   Ú3_odf_list_has_renderable_content.<locals>.<genexpr>À  s'   øé € ð 
ò �ô -ØÐ*=öò ùrM  TFrN  rP  s    `   rI   rJ  rJ  ·  sa   ø€ ð ×"Ô"ˆÜ˜%¤×*Ñ*ÙÜ-ØÐ':ñ
‰ˆö ”3ô 
ñ ó	
÷ 
ó 
ñ ñ #ð rH   c                ó–   • U c  g UR                   R                  S5      nUc  g U R                  SU5      nUc  g UR                  U5      $ )NrÚ   Úlist)r–   r—   rÆ   Úget_level_style)rq   rQ  r  rÐ   rÒ   s        rI   Ú_odf_list_level_styler\  Ê  sW   € ð �Øà×$Ñ$×(Ñ(Ð):Ó;€JØÑØà×Ñ˜f jÓ1€EØ�}Øà× Ñ  Ó'Ð'rH   c                óB   • [        XU5      nUc  U$ UR                  S:H  $ )Nztext:list-level-style-number)r\  r”   )rq   rQ  r  ÚfallbackÚlevel_styles        rI   Ú_odf_list_level_is_enumeratedr`  Û  s+   € ô (¨¸5ÓA€KØÑØˆØ�?‰?Ð<Ñ<Ð<rH   c                ó¬   • [        XU5      nUc  gUR                  R                  S5      nUc  g [        S[	        U5      5      $ ! [
         a     gf = f)Nr�   ztext:start-value)r\  r–   r—   r•   r?   r¶   )rq   rQ  r  r_  Ústart_values        rI   Ú_odf_list_start_valuerc  ç  sb   € ô
 (¨¸5ÓA€KØÑØà×(Ñ(×,Ñ,Ð-?Ó@€KØÑØðÜ�1”c˜+Ó&Ó'Ð'øÜó Ùðús   ±A Á
AÁAc                óx   • [        XU5      nSnUb$  UR                  R                  S5      =(       d    UnU  U 3$ )NÚ.zstyle:num-suffix)r\  r–   r—   )r@   rq   rQ  r  r_  Úsuffixs         rI   Ú_odf_list_markerrg  ú  sF   € ô (¨¸5ÓA€KØ€FØÑØ×'Ñ'×+Ñ+Ð,>Ó?×IÀ6ˆØˆY�v�hÐÐrH   c                ó¬   • U R                  5        H@  nUR                  5        H)  nUR                  S:X  a      g[        U5      (       d  M(      g   MB     g©Nr�   TF)r’   r”   r“   )r˜   rž   r    s      rI   Ú_odf_table_has_contentrj    sF   € Ø�~‰~ÖˆØ—L‘L–NˆDØ�x‰xÐ5Ó5ÚÜ$ T×*Ó*Úó	 #ñ  ð rH   c                ó>  • [        U 5      (       a  gSnU R                   HÕ  n[        U[        5      (       a  [	        U5      (       a    gM,  [        U[
        5      (       a  [        UR                  5      (       a    gM_  [        U[        5      (       a8  [        UR                  5      (       a  US-  nUR                  5       (       a    gM¬  [        U[        5      (       d  MÃ  [        U5      (       d  MÕ    g   US:„  =(       d    U R                  S L =(       a    US:„  $ )NTr   r�   )Ú_odf_cell_has_imagesrß   r\   r5  rJ  r2   r¬   r7  r5   r+  ÚOdfTablerj  r·   )r    Únon_empty_paragraphsré   s      rI   Ú_odf_cell_has_rich_contentro    sì   € Ü˜D×!Ñ!ØàÐØ—”ˆÜ�eœW×%Ñ%Ü/°×6Ñ6Ùñ 7ä˜œv×&Ñ&Ü$ U×%9Ñ%9×:Ñ:Ùñ ;ä˜œy×)Ñ)Ü$ U×%9Ñ%9×:Ñ:Ø$¨Ñ)Ð$Ø×Ñ×!Ñ!Ùñ "ä˜œx×(Ó(Ü% e×,Ó,Ùñ ð    !Ñ#×X¨¯
©
°dÐ(:×(WÐ?SÐVWÑ?WÐXrH   c                ó‚   • / nU R                    H  nUR                  [        U5      5        M     SR                  U5      $ )NrÜ   )rß   rá   r6  rö   )r    r9  ré   s      rI   Ú_odf_cell_child_textrq  )  s6   € Ø€EØ—”ˆØ�‰Ô,¨UÓ3Ö4ñ à�9‰9�UÓÐrH   c                ó,  • [        U 5      n[        U 5      (       a  [        XR                  5       5      $ U R                  b  [        U R                  5      $ U(       a  U$ U R                  (       a  gSR                  [        U R                  5      5      $ )Nrg   rÜ   )
rq  ro  r-  r+  r·   rM   rß   rö   r¬   r7  )r    Ú
child_texts     rI   Ú_odf_cell_textrt  0  so   € Ü% dÓ+€JÜ! $×'Ñ'Ü.¨z¿?¹?Ó;LÓMÐMà‡z�zÑÜ�4—:‘:‹ÐÞØÐØ‡}‡}Øà�9‰9Ô*¨4×+>Ñ+>Ó?Ó@Ð@rH   c                ó:   • [        U R                  5       5      S:„  $ ©Nr   )rþ   r+  ©r    s    rI   rl  rl  ?  s   € Üˆt�‰Ó Ó! AÑ%Ð%rH   c                óB   • [        U 5      S:g  =(       d    [        U 5      $ ©Nrg   )rt  rl  rw  s    rI   r“   r“   C  s   € Ü˜$Ó 2Ñ%×CÔ)=¸dÓ)CÐCrH   c                ó   • [        U 5      $ rT   )ro  rw  s    rI   Ú_odf_cell_is_richr{  G  s   € Ü% dÓ+Ð+rH   c               ó²  • [        U5      n[        X5      (       d  g S n[        USS 5      n[        U5      (       a  U" 5       nUc  U b  U(       a   U R	                  U5      nUc  U(       a  Ub  UR                  US S9nUc  g [        R                  " [        U5      5      nUR                  5         [        R                  " USS9$ ! [
         a    S n Nsf = f)NÚget_data)Ú	base_pathéH   ©ÚimageÚdpi)Ú_odf_image_hrefÚ_odf_image_can_be_bitmapr8  ÚcallableÚget_partr^   Úload_image_dataÚPILImageÚopenr   Úloadr   Úfrom_pil)rq   r�  r  Ú	image_urlÚ
image_datar}  Ú	pil_images          rI   Ú_image_ref_from_odf_imager�  K  sÖ   € ô   Ó&€IÜ# E×5Ñ5Øà#€JÜ�u˜j¨$Ó/€HÜ�×ÑÙ“Zˆ
àÑ˜gÑ1¶ið	Ø ×)Ñ)¨)Ó4ˆJð Ñži¨LÑ,DØ!×1Ñ1°)ÀtÐ1ÐLˆ
àÑØä—’œg jÓ1Ó2€IØ‡N�NÔÜ×Ò 9°"Ñ5Ð5øô ó 	ØŠJð	ús   ÁC ÃCÃCc                ób   • [        U SS 5      =(       d    [        U S0 5      R                  S5      $ )NÚurlr–   rÛ   ©r8  r—   )r�  s    rI   rƒ  rƒ  m  s1   € Ü�5˜% Ó&÷ ¬'°%¸ÀrÓ*J×*NÑ*NØó+ð rH   c                óà   • [        U S0 5      R                  S5      nUb  UR                  S5      =(       a    US:g  $ Uc  g[        U5      R                  R                  5       nUS;   a  gUS;   $ )	Nr–   zdraw:mime-typezimage/zimage/svg+xmlT>   ú.emfú.pdfú.svgú.wmfF>   ú.bmpú.gifú.jpgú.pngú.tifú.jpegú.tiffú.webp)r8  r—   rË   r   rf  Úlower)r�  rŒ  Ú	mime_typerf  s       rI   r„  r„  s  s~   € Ü˜˜|¨RÓ0×4Ñ4Ð5EÓF€IØÑØ×#Ñ# HÓ-×N°)¸Ñ2NÐNàÑØä�)‹_×#Ñ#×)Ñ)Ó+€FØÐ1Ó1Øð ð 	ñ 	ð 	rH   c                ó:   • [        X5      R                  5       S:H  $ ry  )r-  rU   )rN   r0  s     rI   r.  r.  Œ  s   € Ü*¨4Ó8×>Ñ>Ó@ÀBÑFÐFrH   c                ó¾   • U nU HT  n[        U5      nUc  M  UR                  5       nXDR                  S5      1nU H  nUR                  SU S3S5      nM     MV     U$ )Nú./Ú(Ú)rg   )rƒ  rU   ÚremoveprefixÚreplace)rN   r0  Ú	remainingr�  rY   ÚrefsÚrefs          rI   r-  r-  �  sm   € Ø€IÛˆÜ˜uÓ%ˆØ‰<ÙØ�z‰z‹|ˆØ×'Ñ'¨Ó-Ð.ˆÛˆCØ!×)Ñ)¨A¨c¨U°!¨*°bÓ9ŠIó ñ ð ÐrH   r  c               ó>  • SnU He  n[        U5      n	U(       a*  U	b'  U	R                  S5      R                  S5      (       a  M?   [        UUUS9n
U
c  MP  U R                  X*US9  US-  nMg     U$ ! [         a"  n[
        R                  SU5        S n
 S nANGS nAff = f)Nr   r¤  zObjectReplacements/r  z(Could not extract OpenDocument image: %s)rû   r�  rü   r�   )rƒ  r§  rË   r�  r^   Ú_logÚdebugÚadd_picture)r  r0  rû   rü   rq   r  r   r1  r�  rŒ  Ú	image_refrb   s               rI   r,  r,  ž  s°   € ð €KÛˆÜ# EÓ*ˆ	Þ#¨	Ñ(=Ø×%Ñ% dÓ+×6Ñ6Ð7L×MÑMÙð	Ü1ØØØ)ñˆIð ÑÙØ�‰˜vÀmˆÑTØ�qÑŠñ# ð$ Ðøô ó 	Ü�J‰JÐAÀ1ÔEØ�Iûð	ús   ÁA0Á0
BÁ:BÂBc          
     óÒ  • [        U[        5      (       a  [        U UUUUS9  g [        U[        5      (       a$  [        U[        5      (       d  [	        U UUUUUS9  g [        U[
        5      (       a  [        U UUUUSSS9$ [        U[        5      (       a  [        U UUUUUS9  g [        U[        5      (       a  [        U UR                  UUUUS9  g [        U[        5      (       a.  [        XX#U5      n[        U UR                  5       UUUUUS:„  S9  g [!        USS 5      n[#        U5      (       a  [        U U" 5       UUUUS9  g [$        R'                  S	[!        US
S 5      5        g )N©rû   rü   rq   ©rû   rü   rq   r  F)rû   rü   rq   r>   r<  r   r  r+  r  z!Ignoring ODF element with tag: %sr”   )r\   r2   r  r5   r3  r5  Ú_add_odf_listrm  Ú_add_table_from_odfr6   Ú_add_odf_childrenrß   r1   r*  r,  r+  r8  r…  r­  r®  )r  rå   rû   rü   rq   r  r/  r+  s           rI   Ú_add_odf_childr·  ¾  sª  € ô �'œ6×"Ñ"ÜØØØØ'Øò	
ðL ô 
�GœY×	'Ñ	'´
¸7ÄF×0KÑ0KÜØØØØ'ØØ%ò	
ð| ôm 
�GœW×	%Ñ	%ÜØØØØ'ØØØ %ñ
ð 	
ô 
�GœX×	&Ñ	&ÜØØØØ'ØØ%ò	
ðV ôG 
�GœW×	%Ñ	%ÜØØ×ÑØØ'ØØ%ò	
ðD ô5 
�GœU×	#Ñ	#Ü% c°FÈ7ÓSˆÜØØ×ÑÓ ØØØØ%Ø%0°1¡_ò	
ð0 ô ˜W l°DÓ9ˆ
Ü�J×ÑÜØÙ“ØØØØ)òð ô �J‰JØ3´W¸WÀeÈTÓ5Rôð rH   c               óˆ   • S nU H:  n[        U[        5      (       a  [        U UUUUSUSS9nM*  S n[        U UUUUUS9  M<     g )NF©rû   rü   rq   r>   Úcontinued_stater<  r³  )r\   r5  r´  r·  )r  Úelementsrû   rü   rq   r  Úprevious_list_staterå   s           rI   r¶  r¶    sf   € ð 15ÐÛˆÜ�gœw×'Ñ'Ü"/ØØØØ+ØØ Ø 3Ø$)ñ	#Òð #'ÐÜØØØØ+ØØ)ôò rH   c                óH   • U R                  S5      R                  S5       S3$ )Nr¤  Ú/z/content.xml)r§  rì   rX   s    rI   Ú_embedded_odf_content_pathr¿  3  s&   € Ø×Ñ Ó%×,Ñ,¨SÓ1Ð2°,Ð?Ð?rH   c                óB  • U R                  S5       H3  nUR                  R                  S5      nU[        ;   d  M*  [        U   s  $    U R                  S5       H3  nUR                  R                  S5      nU[        ;   d  M*  [        U   s  $    [        R
                  $ )Nzdescendant::chart:chartzchart:classzdescendant::chart:series)Úget_elementsr–   r—   Ú*_ODF_CHART_CLASS_TO_PICTURE_CLASSIFICATIONr   ÚOTHER_CHART)Úchart_contentÚchartÚchart_classÚseriess       rI   Ú_odf_chart_classificationrÈ  7  s”   € Ø×+Ñ+Ð,EÖFˆØ×&Ñ&×*Ñ*¨=Ó9ˆØÔDÕDÜ=¸kÑJÒJñ Gð
  ×,Ñ,Ð-GÖHˆØ×'Ñ'×+Ñ+¨MÓ:ˆØÔDÕDÜ=¸kÑJÒJñ Iô
 &×1Ñ1Ð1rH   c                óì  • Uc  g S nU R                    H1  n[        USS 5      S:X  d  M  UR                  R                  S5      n  O   Uc  g  UR	                  [        U5      5      n[        U5      nUR                  S5      nU H?  n[        U[        5      (       d  M  UR                  S:X  d  M,  [        U5      n	U	c  M<  X•4s  $    g ! [         a   n[        R                  SX'5         S nAg S nAff = f)Nr”   zdraw:objectrÛ   údescendant::table:tablez2Could not read embedded OpenDocument object %s: %szlocal-table)rß   r8  r–   r—   r†  r¿  rÈ  rÁ  r^   r­  Úwarningr\   rm  r¼   Ú_table_data_from_odf)
Úframerq   Úobject_hrefré   rÄ  Úchart_classificationÚchart_tablesrb   r˜   Ú
table_datas
             rI   Ú_chart_data_from_framerÒ  E  s÷   € ð �Øà"€KØ—”ˆÜ�5˜% Ó&¨-Õ7Ø×*Ñ*×.Ñ.¨|Ó<ˆKÙñ  ð ÑØð
Ø×(Ñ(Ô)CÀKÓ)PÓQˆô  9¸ÓGÐØ$×1Ñ1Ð2KÓLˆó ˆÜ�eœX×&Ó&¨5¯:©:¸Õ+FÜ-¨eÓ4ˆJØÓ%Ø!Ð7Ò7ñ	 ð
 øô ó Ü�‰Ø@À+ô	
ô ûð	ús   Á6C	 Ã	
C3ÃC.Ã.C3c           	     óÂ  • Sn[        U[        5      (       a  U/O/ n[        USS 5      n[        U5      (       a  UR	                  U" 5       5        O#UR	                  S [        US/ 5       5       5        U He  n[        X„5      n	U	c  M  U	u  p«U R                  X#S9n[        R                  Ul	        [        [        [        US9/S9[        U
S9S	9Ul        US
-  nMg     U$ )Nr   Ú
get_framesc              3  óT   #   • U  H  n[        U[        5      (       d  M  Uv •  M      g 7frT   )r\   r1   )r§   ré   s     rI   r©   Ú"_add_odf_charts.<locals>.<genexpr>s  s#   é € ð 
â9�Ü˜%¤×'÷ ‰EÚ9ùs   ‚(Ÿ	(rß   rý   )Ú
class_name)Úpredictions)Ú
chart_data)ÚclassificationÚtabular_chartr�   )r\   r1   r8  r…  rá   rÒ  r¯  r   ÚPICTURErú   r   r   r   r!   Úmeta)r  rå   rû   rü   rq   r/  ÚframesrÔ  rÍ  Úchart_resultrÙ  rÏ  rÅ  s                rI   r*  r*  f  së   € ð €KÜ$ W¬e×4Ñ4ˆg‰Y¸"€FÜ˜ ,°Ó5€JÜ�
×ÑØ�‰‘j“lÕ#à�‰ñ 
ä  ¨*°bÔ9ó
ô 	
ó
 ˆÜ-¨eÓ=ˆØÑÙØ+7Ñ(ˆ
Ø—‘ v�ÐKˆÜ"×*Ñ*ˆŒÜ Ü9ä3Ð?SÑTðñô
 0¸:ÑFñ
ˆŒ
ð 	�qÑŠñ ð  ÐrH   c	                ó–  • [        XS9(       d  g [        XAXeS9n	US L=(       a    UR                  S L=(       a	    [        XS9n
U
(       d`  [	        XS9(       dR  UR
                   HA  n[        U[        5      (       d  M  [        X¸S9u  pÍU H  n[        U UUUUU	US-   US9  M     MC     g U
(       a4  Ub1  UR                  nUR                  nUR                  nUR                  nO#U R                  SX#S9nU	n[        XAU5      S-
  nS nUR
                   GH¡  n[        U[        5      (       d  M  [        X¸S9u  nnU Vs/ s H  n[        UUS9(       d  M  UPM     nnU(       d	  U(       d  MZ  U(       d)  U=(       d    UnU H  n[        U UUUUU	US-   US9  M     MŠ  US-  nU(       a  [        UXAU5      OSn[!        UUUS9n[#        U5      S::  aX  U R%                  UUUU(       a  US   R&                  OUUU(       a  US   R(                  OS U(       a  US   R*                  OS S	9nOlU R%                  UUUSUS
9nU R-                  UUS9nU HC  nU R/                  [0        R2                  UUR&                  UUR(                  UR*                  S9  ME     UnU H  n[        U UUUUU	US-   US9  M     GM¤     [5        UUUUS9$ s  snf )Nr;  )r^  r�   )rû   rü   rq   r>   r  r<  rZ  )r¼   rû   rü   rg   r   )Úmarkerr>   rû   rN   rü   rP   rR   )rá  r>   rû   rN   rü   rý   rù   )r;   r=   r>   r@   )rJ  r`  r=   rR  rU  rß   r\   r4   rB  r´  r;   r>   r@   Úadd_list_grouprc  rg  rE  rþ   Úadd_list_itemrN   rP   rR   r   rÿ   r   r  r9   )r  rQ  rû   rü   rq   r>   r  rº  r<  Ústyle_enumeratedÚshould_continueré   Ú_textrA  Únested_listÚ
list_groupÚcurrent_enumeratedr@   Úprevious_itemrN   r?  Únested_parentrá  rè   r  rð   s                             rI   r´  r´  ‹  sY  € ô ,Ø÷ð ä4Ø˜5ñÐð 	˜tÐ#÷ 	
Ø×%Ñ%¨TÐ1÷	
ä3Øñ
ð ö Ô#AØ÷$ð ×&Ô&ˆEÜ˜e¤X×.Ñ.ÙÜ2Øñ‰MˆEó  &�ÜØØØ!Ø"/Ø#Ø/Ø !™)Ø(;ô	ó  &ñ 'ð" æ˜?Ñ6Ø$×*Ñ*ˆ
Ø,×7Ñ7ÐØ!×)Ñ)ˆØ'×1Ñ1‰à×'Ñ'Ø ð (ð 
ˆ
ð .ÐÜ'¨¸5ÓAÀAÑEˆØˆà×"Õ"ˆÜ˜%¤×*Ñ*ÙÜ-Øñ
‰ˆˆfñ
 ó
â�Ü/ØÐ*=õ÷ Ùð 	ð 
ö žFÙÞØ)×7¨ZˆMÛ%�ÜØØØ(Ø"/Ø#Ø/Ø !™)Ø(;ô	ñ  &ñ Ø�1‰ˆö "ô ˜W g¸Ô?àð 	ô
 (ØØØ 3ñ
ˆô
 ˆt‹9˜‹>Ø×$Ñ$ØØ-Ø!ö &*�T˜!‘W—\’\¨tØ+Þ15˜4 ™7×-Ò-¸4Þ/3˜$˜q™'×+Ò+¸ð %ð ‰Dð ×$Ñ$ØØ-Ø!ØØ+ð %ð ˆDð ×/Ñ/Ø¨=ð 0ð ˆLó �Ø—‘Ü&×+Ñ+Ø'ØŸ™Ø"/Ø"Ÿ~™~Ø!Ÿm™mð ó ñ ð ˆÛ!ˆKÜØØØØ+ØØ+Ø˜a‘iØ$7ô	ô "ñU #ôj ØØØ%Øñ	ð ùò_
s   Ä?KÅKc           
     óF   • UR                    H  n[        U UUUUUS9  M     g ©Nr³  )rß   r·  )r  r    rû   rü   rq   r  ré   s          rI   Ú_add_rich_cell_childrenrî  %  s,   € ð —”ˆÜØØØØ'ØØ%ô	
ò rH   )r™   r›   rš   rœ   Úprovrü   rq   r  c               ó¶  • Ub	  Ub  Ub  Uc  [        U5      u  p4pVXC-
  S-   nXe-
  S-   nUS:X  d  US:X  a  g [        X¼/ S9nU R                  UUUUS9n[        UR	                  5       5       GHi  u  nnXó:  d  Xô:”  a  M  [        UR	                  5       5       GH8  u  nnUU:  d  UU:”  a  M  UR
                  S:X  a  M'  UR                  n[        UR                  S5      =(       d    S5      n[        UR                  S5      =(       d    S5      nXó-
  nUU-
  n[        U5      nUUUUUU-   UUU-   US:H  SS	.	n[        U5      (       ak  U R                  [        R                  S
[        U R                  5      S-
   SU SU 3UUS9n[!        U UUUU	U
S9  [#        S0 UDSUR%                  5       0D6nO['        S0 UD6nU R)                  UUS9  GM;     GMl     U$ )Nr�   r   ©Únum_rowsÚnum_colsÚtable_cells)rû   Údatarï  rü   r�   rŽ   r�   F©	rN   r¢   r£   Ústart_row_offset_idxÚend_row_offset_idxÚstart_col_offset_idxÚend_col_offset_idxÚcolumn_headerÚ
row_headerÚrich_cell_group_Ú_)rú   r¼   rû   rü   r³  r«  )Ú
table_itemr    rA   )r¤   r   Ú	add_tabler‘   r’   r”   r–   r?   r—   rt  r{  Ú	add_groupr   ÚUNSPECIFIEDrþ   Útablesrî  r   Úget_refr   Úadd_table_cell)r  r˜   rû   r™   r›   rš   rœ   rï  rü   rq   r  ÚheightÚwidthrõ  rÿ  r�   rž   rŸ   r    r¡   r¢   r£   Úadjusted_rowÚadjusted_colrN   Úcell_kwargsr;   Ú
table_cells                               rI   rµ  rµ  8  s  € ð �˜'™/¨W©_ÀÁÜ-CÀEÓ-JÑ*ˆ˜'àÑ Ñ"€FØÑ Ñ!€EØ�ƒz�V˜q“[Øä˜fÀ"ÑE€DØ—‘ØØØØ#ð	 ð €Jô " %§.¡.Ó"2×3‰ˆ�ØÓ Ó 1Ùä& s§|¡|£~×6‰MˆG�TØ˜Ó  G¨gÓ$5Ùà�x‰xÐ5Ó5Ùà—O‘OˆEÜ˜5Ÿ9™9Ð%@ÓA×FÀQÓGˆHÜ˜5Ÿ9™9Ð%CÓD×IÈÓJˆHØ"Ñ,ˆLØ" WÑ,ˆLÜ! $Ó'ˆDàØ$Ø$Ø(4Ø&2°XÑ&=Ø(4Ø&2°XÑ&=Ø!-°Ñ!2Ø#ñ
ˆKô ! ×&Ñ&ØŸ™Ü$×0Ñ0Ø+¬C°·
±
«O¸aÑ,?Ð+@ÀÀ,ÀÈqÐQ]ÐP^Ð_Ø%Ø"/ð	 &ð �ô (ØØØ Ø"/Ø#Ø!-òô +ÑN¨[ÑN¸e¿m¹m»oÒN‘
ä&Ñ5¨Ñ5�
à×Ñ¨*¸:ÐÔFôY 7ñ	 4ðd ÐrH   c                ó  • [        U R                  5       5       Hd  u  pVXQ:  d  XR:”  a  M  [        UR                  5       5       H6  u  pxXs:  d  Xt:”  a  M  UR                  S:w  d  M#  [        U5      (       d  M5      g   Mf     gri  )r‘   r’   r”   r{  )	r˜   r™   r›   rš   rœ   r�   rž   rŸ   r    s	            rI   Ú_table_region_has_rich_cellr  ‹  so   € ô " %§.¡.Ó"2Ö3‰ˆØÓ Ó 1ÙÜ& s§|¡|£~Ö6‰MˆGØÓ  GÓ$5ÙØ�x‰xÐ5Õ5Ô:KÈD×:QÓ:QÚó	 7ñ 4ð rH   c                ó|  • Ub	  Ub  Ub  Uc  [        U 5      u  pp4X!-
  S-   nXC-
  S-   nUS:X  d  US:X  a  g/ n[        U R                  5       5       Hß  u  p‰X�:  d  X‚:”  a  M  [        U	R                  5       5       H±  u  p«X£:  d  X¤:”  a  M  UR                  S:X  a  M#  UR                  n[        UR                  S5      =(       d    S5      n[        UR                  S5      =(       d    S5      n[        U5      nX�-
  nX£-
  nUR                  [        UUUUUU-   UUU-   US:H  SS9	5        M³     Má     [        XVUS	9$ )
a‘  Convert an ODF table to a :class:`TableData` object.

This function finds the true data boundaries and only processes cells within
that region, avoiding the inclusion of large numbers of empty cells that may
exist beyond the actual data.

Args:
    table: The ODF table to convert.
    min_row: Optional minimum row index (0-based). If None, will be computed.
    max_row: Optional maximum row index (0-based). If None, will be computed.
    min_col: Optional minimum column index (0-based). If None, will be computed.
    max_col: Optional maximum column index (0-based). If None, will be computed.

Returns ``None`` when the table has no rows or columns.
Nr�   r   r�   rŽ   r�   Frö  rñ  )r¤   r‘   r’   r”   r–   r?   r—   rt  rà   r   r   )r˜   r™   r›   rš   rœ   r  r  Úcellsr�   rž   rŸ   r    r¡   r¢   r£   rN   r  r	  s                     rI   rÌ  rÌ  �  sW  € ð. �˜'™/¨W©_ÀÁÜ-CÀEÓ-JÑ*ˆ˜'ð Ñ Ñ"€FØÑ Ñ!€Eà�ƒz�V˜q“[Øà€Eô " %§.¡.Ó"2Ö3‰ˆØÓ Ó 1Ùä& s§|¡|£~Ö6‰MˆGØÓ  GÓ$5Ùà�x‰xÐ5Ó5áà—O‘OˆEÜ˜5Ÿ9™9Ð%@ÓA×FÀQÓGˆHÜ˜5Ÿ9™9Ð%CÓD×IÈÓJˆHÜ! $Ó'ˆDð #Ñ,ˆLØ"Ñ,ˆLà�L‰LÜØØ%Ø%Ø)5Ø'3°hÑ'>Ø)5Ø'3°hÑ'>Ø".°!Ñ"3Ø$ñ
öó# 7ñ	 4ôF ˜fÀ%ÑHÐHrH   c                  ó†   • \ rS rSrSrSr\\S
S j5       5       r\\SS j5       5       r	\SS j5       r
        SS jrSrg	)ÚOdtDocumentBackendiç  z/Backend for OpenDocument Text (``.odt``) files.rN   c                ó   • g©NFrA   ©Úclss    rI   Úsupports_paginationÚ&OdtDocumentBackend.supports_paginationì  s   € ð rH   c                ó$   • [         R                  1$ rT   )r*   ÚODTr  s    rI   Úsupported_formatsÚ$OdtDocumentBackend.supported_formatsñ  ó   € ô —‘Ð Ð rH   c                ór  • [        U R                  R                  =(       d    SSU R                  S9n[	        U R                  R
                  =(       d    SUS9nU R                  5       (       d  [        SU R                   S35      eU R                  U R                  R                  R                  S US9  U$ )NÚfilez'application/vnd.oasis.opendocument.text©ÚfilenameÚmimetypeÚbinary_hash©r¼   ÚoriginúCannot convert doc with ú$ because the backend failed to init.©rû   r  )r   r  r¼   ra   r   Ústemr|   r_   Ú_walkrq   Úbodyrß   )rv   r$  r  s      rI   ÚconvertÚOdtDocumentBackend.convertö  s˜   € äØ—Y‘Y—^‘^×- vØ>Ø×*Ñ*ñ
ˆô
  4§9¡9§>¡>×#;°VÀFÑKˆØ�}‰}�‰ÜØ*¨4×+=Ñ+=Ð*>Ð>bÐcóð ð 	�
‰
�4—<‘<×$Ñ$×-Ñ-°dÀˆ
ÑDØˆ
rH   c           	     óH   • [        UUUS U R                  U R                  S9  g rí  )r¶  rq   rt   )rv   r»  rû   r  s       rI   r)  ÚOdtDocumentBackend._walk  s(   € ô 	ØØØØØ—L‘LØ×+Ñ+ó	
rH   rA   Nr†   ©r„   zset[InputFormat]©r„   r   )r»  ú	list[Any]rû   r<   r  r   r„   r…   )rB   rC   rD   rE   r‡   rh   Úclassmethodr%   r  r  r+  r)  rG   rA   rH   rI   r  r  ç  s   † Ù9à€IàØóó ó ðð Øó!ó ó ð!ð óó ðð
àð
ð  ð
ð ð	
ð
 
÷
rH   r  c                  ó  • \ rS rSrSrSr\\SS j5       5       r\SS j5       r	\\SS j5       5       r
\SS j5       r        SS jr\SS	 j5       r\SS
 j5       r          SS jrSS.         SS jjrSrg)ÚOdpDocumentBackendi  z7Backend for OpenDocument Presentation (``.odp``) files.Úpresentationc                ó   • g©NTrA   r  s    rI   r  Ú&OdpDocumentBackend.supports_pagination  ó   € ð rH   c                óˆ   • U R                  5       (       d  g[        U R                  R                  R	                  5       5      $ rv  )r|   rþ   rq   r*  Úget_draw_pagesr{   s    rI   Ú
page_countÚOdpDocumentBackend.page_count   s.   € à�}‰}�‰ØÜ�4—<‘<×$Ñ$×3Ñ3Ó5Ó6Ð6rH   c                ó$   • [         R                  1$ rT   )r*   ÚODPr  s    rI   r  Ú$OdpDocumentBackend.supported_formats&  r  rH   c                ó„  • [        U R                  R                  =(       d    SSU R                  S9n[	        U R                  R
                  =(       d    SUS9nU R                  5       (       d  [        SU R                   S35      e[        U R                  R                  R                  5       5       H‡  u  p4UR                  =(       d    SUS-    3nUR                  SU 3[        R                  S S	9nU R                  U5      (       d  UR!                  ["        R$                  UUS
9  U R'                  XFUS9  M‰     U$ )Nr  z/application/vnd.oasis.opendocument.presentationr  r#  r%  r&  zslide-r�   )r¼   rú   rû   )rú   rû   rN   r'  )r   r  r¼   ra   r   r(  r|   r_   r‘   rq   r*  r;  r  r   ÚCHAPTERÚ_slide_has_visible_titlerÿ   r   r$  Ú_walk_slide)rv   r$  r  Ú	slide_idxÚpageÚ
slide_nameÚslide_groups          rI   r+  ÚOdpDocumentBackend.convert+  s'  € äØ—Y‘Y—^‘^×- vØFØ×*Ñ*ñ
ˆô
  4§9¡9§>¡>×#;°VÀFÑKˆØ�}‰}�‰ÜØ*¨4×+=Ñ+=Ð*>Ð>bÐcóð ô  )¨¯©×):Ñ):×)IÑ)IÓ)KÖL‰OˆIØŸ™×>¨¨y¸1©}¨oÐ&>ˆJØŸ-™-Ø˜i˜[Ð)Ü ×(Ñ(Øð (ð ˆKð
 ×0Ñ0°×6Ñ6Ø—‘Ü&×,Ñ,Ø&Ø#ð ñ ð
 ×Ñ˜T¸3ÐÓ?ñ  Mð ˆ
rH   c           
     óZ  • SnUR                    H™  n[        USS 5      S;   a  M  [        [        [        USS5      5      5      nU R	                  XT(       + 5      nU(       a  Sn[        U[        5      (       a  U R                  UUUUS9  M}  U R                  UR                   UUUS9  M›     g )NFr”   ¾   úanim:parúpresentation:notesr7  rg   T©rû   r  Úis_title)	rß   r8  r,   r¬   Ú_is_slide_title_elementr\   r1   Ú_walk_slide_frameÚ_walk_textbox_children)rv   rF  rû   r  Úseen_text_contentrå   Úhas_textrO  s           rI   rD  ÚOdpDocumentBackend._walk_slideH  sº   € ð "ÐØ—}”}ˆGÜ�w  tÓ,Ð0RÓRÙÜÜ%¤g¨gÐ7GÈÓ&LÓMóˆHð ×3Ñ3°GÔ=RÓSˆHÞØ$(Ð!Ü˜'¤5×)Ñ)Ø×&Ñ&ØØ!ØØ%ð	 'ó ð ×+Ñ+Ø×$Ñ$Ø!ØØ%ð	 ,ó ò# %rH   c                óÔ   • SnU R                    HV  n[        USS 5      S;   a  M  [        R                  X!(       + 5      (       a    g[	        [        USS5      5      (       d  MT  SnMX     g)NFr”   rK  Tr7  rg   )rß   r8  r4  rP  r¬   )rF  rS  rå   s      rI   rC  Ú+OdpDocumentBackend._slide_has_visible_titled  si   € à!ÐØ—}”}ˆGÜ�w  tÓ,Ð0RÓRÙÜ!×9Ñ9ØÔ.÷ñ ñ Ü$¤W¨WÐ6FÈÓ%K×LÓLØ$(Ò!ñ %ð rH   c                óz   • [        U S0 5      nUR                  S5      S:X  a  gU=(       a    [        U SS 5      S:H  $ )Nr–   zpresentation:classÚtitleTr”   zdraw:custom-shaper’  )rå   Úis_first_text_contentr¡   s      rI   rP  Ú*OdpDocumentBackend._is_slide_title_elementr  sE   € ä˜ ¨rÓ2ˆØ�9‰9Ð)Ó*¨gÓ5ØØ$÷ 
¬°¸%ÀÓ)FØñ*
ð 	
rH   c          
     ót  • [        UUUS U R                  S9nUR                  S5       H$  n[        UUUU R                  U R                  S9  M&     [        UUR                  5       US U R                  U R                  US:„  S9  UR                  S5       H  nU R                  UR                  UUUS9  M!     g )Nr²  rÊ  )rû   rq   r  r   r  zdescendant::draw:text-boxrN  )	r*  rq   rÁ  rµ  rt   r,  r+  rR  rß   )rv   rÍ  rû   r  rO  r/  ÚtblÚtextboxs           rI   rQ  Ú$OdpDocumentBackend._walk_slide_frame{  sÏ   € ô &ØØØØØ—L‘Lñ
ˆð ×%Ñ%Ð&?Ö@ˆCÜØØØØŸ™Ø!×/Ñ/ôñ Aô 	ØØ×ÑÓØØØ�L‰LØ×+Ñ+Ø%0°1¡_ò	
ð ×)Ñ)Ð*EÖFˆGØ×'Ñ'Ø× Ñ ØØØ!ð	 (ó ò GrH   F)rO  c               ó˜  • S nU HÂ  n[        U[        5      (       a  S n[        UUUS U R                  S9  M3  [        U[        5      (       aI  S n[        U[        X`R                  5      U(       a  [        R                  O[        R                  US S9  M‘  [        U[        5      (       d  M¨  [        UUUS U R                  SUSS9nMÄ     g )Nr²  r)  Fr¹  )r\   r2   r  rq   r5   r  râ   r   r$  r  r5  r´  )rv   r»  rû   r  rO  r¼  Úels          rI   rR  Ú)OdpDocumentBackend._walk_textbox_children¦  s½   € ð 59ÐÛˆBÜ˜"œf×%Ñ%Ø&*Ð#Ü ØØØ!Ø"&Ø ŸL™Lôô ˜B¤	×*Ñ*Ø&*Ð#Ü"ØÜ" 2§|¡|Ó4Þ08œ,×,Ò,¼l×>OÑ>OØ!Ø"&ôô ˜B¤×(Ó(Ü&3ØØØ!Ø"&Ø ŸL™LØ$Ø$7Ø(-ñ	'Ò#ò) rH   rA   Nr†   ©r„   r?   r/  r0  )rF  r0   rû   r   r  r   r„   r…   )rF  r0   r„   r,   )rå   r	   rZ  r,   r„   r,   )
rÍ  r1   rû   r   r  r   rO  r,   r„   r…   )
r»  r1  rû   r   r  r   rO  r,   r„   r…   )rB   rC   rD   rE   r‡   rh   r2  r%   r  r<  r  r+  rD  ÚstaticmethodrC  rP  rQ  rR  rG   rA   rH   rI   r4  r4    s*  † ÙAà€IàØóó ó ðð ó7ó ð7ð
 Øó!ó ó ð!ð óó ðð8ØðØ&.ðØ5Dðà	ôð8 óó ðð ó
ó ð
ð)àð)ð ð)ð ð	)ð ð)ð 
ô)ðb ñ&àð&ð ð&ð ð	&ð ð&ð 
÷&ð &rH   r4  c                  ó4  ^ • \ rS rSrSrSr\ S       SU 4S jjj5       r\\SS j5       5       r	\SS j5       r
\\SS j5       5       r\SS j5       r            SS	 jr    SS
 jr            SS jr\SS j5       r\SS j5       rSrU =r$ )ÚOdsDocumentBackendiÏ  zâBackend for OpenDocument Spreadsheet (``.ods``) files.

Each sheet becomes a separate page. The backend can detect multiple disconnected
tables within a sheet and optionally treat singleton cells as text items (e.g., titles).
Úspreadsheetc                ó@   >• Uc
  [        5       n[        TU ]	  XU5        g rT   )r)   rn   ro   ru   s       €rI   ro   ÚOdsDocumentBackend.__init__Ø  s!   ø€ ð ‰?Ü'Ó)ˆGÜ‰Ñ˜°Õ9rH   c                ó   • gr7  rA   r  s    rI   r  Ú&OdsDocumentBackend.supports_paginationã  r9  rH   c                ó\  ^• U R                  5       (       d  g[        U R                  [        5      (       a  U R                  R                  OS mTc)  [        U R                  R                  R                  5      $ [        U4S jU R                  R                  R                   5       5      $ )Nr   c              3  óJ   >#   • U  H  oR                   T;   d  M  S v •  M     g7f)r�   N)r¼   )r§   r˜   Úsheet_names_filters     €rI   r©   Ú0OdsDocumentBackend.page_count.<locals>.<genexpr>ó  s!   øé € ð 
Ú3�%·z±zÐEWÑ7W�A‰AÒ3ùs   ƒ#š	#)
r|   r\   rs   r)   Úsheet_namesrþ   rq   r*  r  Úsum)rv   rn  s    @rI   r<  ÚOdsDocumentBackend.page_countè  s‰   ø€ à�}‰}�‰Øô ˜$Ÿ,™,Ô(9×:Ñ:ð �L‰L×$Ò$àð 	ð
 Ñ%Ü�t—|‘|×(Ñ(×/Ñ/Ó0Ð0Üô 
ØŸ<™<×,Ñ,×3Ò3ó
ó 
ð 	
rH   c                ó$   • [         R                  1$ rT   )r*   ÚODSr  s    rI   r  Ú$OdsDocumentBackend.supported_formats÷  r  rH   c           	     ó:  • [        U R                  R                  =(       d    SSU R                  S9n[	        U R                  R
                  =(       d    SUS9nU R                  5       (       d  [        SU R                   S35      e[        U R                  [        5      (       a  U R                  R                  OS nSn[        U R                  R                  R                  5       GH,  u  pVUb8  UR                  U;  a(  [         R#                  SU S	UR                   S
35        MA  US-  n[         R%                  SU S	UR                   SU 35        UR'                  U[)        SSS9S9nU R+                  U5      nUR-                  S [.        R0                  SUR                   3US9n	U R3                  X&X”U5        U R5                  X&X”U5        U R7                  X$5      u  p«[)        X«S9Ul        [         R#                  SUR                  U5        GM/     U$ )Nr  z.application/vnd.oasis.opendocument.spreadsheetr  r#  r%  r&  r   zSkipping sheet z: z (filtered out)r�   zProcessing sheet z	 as page )r  r  )Úpage_noÚsizezsheet: )rû   rú   r¼   rü   z!Processed ODS sheet %s as page %s)r   r  r¼   ra   r   r(  r|   r_   r\   rs   r)   rp  r‘   rq   r*  r  r­  r®  ÚinfoÚadd_pager   Ú_get_sheet_content_layerr  r   ÚSECTIONÚ_convert_sheet_tableÚ_find_images_in_sheetÚ_find_page_sizerx  )rv   r$  r  rn  rw  Ú	sheet_idxr˜   rF  rü   Úsheet_groupr  r  s               rI   r+  ÚOdsDocumentBackend.convertü  sç  € äØ—Y‘Y—^‘^×- vØEØ×*Ñ*ñ
ˆô
  4§9¡9§>¡>×#;°VÀFÑKˆØ�}‰}�‰ÜØ*¨4×+=Ñ+=Ð*>Ð>bÐcóð ô ˜$Ÿ,™,Ô(9×:Ñ:ð �L‰L×$Ò$àð 	ð ˆÜ )¨$¯,©,×*;Ñ*;×*BÑ*B× CÑˆIØ!Ñ-°%·*±*ÐDVÓ2VÜ—
‘
˜_¨Y¨K°r¸%¿*¹*¸À_ÐUÔVÙà�q‰LˆGÜ�I‰IÐ)¨)¨°B°u·z±z°lÀ)ÈGÈ9ÐUÔVð —<‘<¨´dÀÈ1Ñ6M�<ÐNˆDð !×9Ñ9¸%Ó@ˆMàŸ-™-ØÜ ×(Ñ(Ø˜uŸz™z˜lÐ+Ø+ð	 (ð ˆKð ×%Ñ% c°+ÈÔVð ×&Ñ& s°;ÈÔWð !×0Ñ0°Ó>‰MˆEÜ 5Ñ8ˆDŒIä�J‰JÐ:¸E¿J¹JÈ×Pñ? !Dð@ ˆ
rH   c                ó¨  • U R                  U5      n[        U R                  [        5      =(       a    U R                  R                  nU GH  nUS   u  pšp¼US   n[        X)X«U5      nU(       a�  [        UR                  5      S:X  av  U(       do  UR                  S   nUR                  UR                  [        R                  U[        US[        R                  " X¹US-   U
S-   4[        R                   S9S9US9  M´  [#        UUUU	U
UU[        US[        R                  " X¹US-   U
S-   4[        R                   S9S9UU R$                  S	9
  GM     g
)zØConvert an ODS table and add it to the document with provenance.

This method finds all disconnected data regions in the sheet and creates
separate tables for each. Singleton cells can optionally be treated as text.
Úboundsrõ  r�   r   rŒ   ©r$  ©rw  ÚcharspanÚbbox)rN   rú   rû   rï  rü   )r™   r›   rš   rœ   rï  rü   rq   N)Ú_find_data_tables_in_sheetr\   rs   r)   Útreat_singleton_as_textr  rþ   rô  rÿ   rN   r   r  r   r   Ú
from_tupler   ÚTOPLEFTrµ  rq   )rv   r  r˜   rû   rw  rü   Údata_tablesrŠ  Ú
data_tabler™   r›   rš   rœ   rÑ  Úhas_rich_contentr    s                   rI   r}  Ú'OdsDocumentBackend._convert_sheet_table2  sb  € ð ×5Ñ5°eÓ<ˆô �t—|‘|Ô%6Ó7÷ 5Ø—‘×4Ñ4ð 	 ô
 &ˆJØ1;¸HÑ1EÑ.ˆG˜gØ# FÑ+ˆJÜ:Ø °'ó Ðö (Ü˜
×.Ñ.Ó/°1Ó4Þ(ð "×-Ñ-¨aÑ0�Ø—‘ØŸ™Ü&×+Ñ+Ø!Ü'Ø 'Ø!'Ü(×3Ò3Ø$¨w¸©{¸GÀa¹KÐHÜ#.×#6Ñ#6ññð #0ð ó ô  $ØØØØ#Ø#Ø#Ø#Ü'Ø 'Ø!'Ü(×3Ò3Ø$¨w¸©{¸GÀa¹KÐHÜ#.×#6Ñ#6ññð #0Ø ŸL™Lõ#ò? &rH   c           
     ó  ^^^ ^!^"• SSK n[        U5      u  m"m m!mT"S:X  a5  T S:X  a/  T!S:X  a)  TS:X  a#  UR                  S5      n[        U5      (       d  / $ [	        [
        U R                  5      R                  n/ n[        5       n0 m[        UR                  5       5       HN  u  px[        UR                  5       5       H,  u  pš[        U
5      =(       d    U
R                  S:H  nUTXy4'   M.     MP     SUUU U!U"4S jjn[        T"T S-   5       GHp  n[        T!TS-   5       GHX  nXÞ4U;   a  M  U" XÞ5      (       d  M  [        5       nUR                  XÞ4/5      nUR                  XÞ45        XÝnnXînnU(       aÄ  UR                  5       u  nn[!        UU5      n[#        UU5      n[!        UU5      n[#        UU5      n/ SQnU Hn  u  nn[        SUS-   5       HU  nUUU-  -   UUU-  -   nnUU4U;   a    M3  U" UU5      (       d  M.  UR                  UU45        UR%                  UU45          Ml     Mp     U(       a  MÄ  UR'                  U5        [)        UUUUUS	9nUc  GM@  UR%                  UUUU4US
.5        GM[     GMs     U$ )zÂFind all disconnected data tables in an ODS sheet using flood-fill.

Returns a list of dictionaries, each containing:
- 'bounds': (min_row, max_row, min_col, max_col)
- 'data': TableData object
r   NÚA1r�   c                ó\   >• U T:  d  U T:”  d  UT:  d  UT:”  a  gTR                  X4S5      $ r  )r—   )ÚrÚcÚcell_mapÚoverall_max_colÚoverall_max_rowÚoverall_min_colÚoverall_min_rows     €€€€€rI   Úhas_contentÚBOdsDocumentBackend._find_data_tables_in_sheet.<locals>.has_content£  s9   ø€ à�OÓ#Ø�Ó&Ø�Ó&Ø�Ó&àØ—<‘<  ¨Ó.Ð.rH   r�   ))r   r�   )r   rë   )r�   r   )rë   r   é   )r™   r›   rš   rœ   )r„  rõ  )r”  r?   r•  r?   r„   r,   )Úcollectionsr¤   Úget_cellr“   r
   r)   rs   Úgap_tolerancer  r‘   r’   r”   ÚrangeÚdequer  ÚpopleftÚminr•   rà   ÚupdaterÌ  )#rv   r˜   rž  Ú
first_cellÚGAP_TOLERANCEr  Úvisitedr�   rž   rŸ   r    Úhas_datar›  ÚriÚcirô  ÚqueueÚmin_rÚmax_rÚmin_cÚmax_cÚcurr_rÚcurr_cÚ
directionsÚdrÚdcÚstepÚnrÚncrõ  r–  r—  r˜  r™  rš  s#                                 @@@@@rI   r‰  Ú-OdsDocumentBackend._find_data_tables_in_sheetz  sœ  ü€ ó 	ô # 5Ó)ñ 	Kˆ˜¨/¸?ð ˜qÓ Ø 1Ó$Ø 1Ó$Ø 1Ó$àŸ™¨Ó-ˆJÜ(¨×4Ñ4Ø�	äÔ.°·±Ó=×KÑKˆØIKˆÜ(+«ˆð 13ˆÜ% e§n¡nÓ&6Ö7‰LˆGÜ!*¨3¯<©<«>Ö!:‘�Ü0°Ó6÷ Ø—H‘HÐ :Ñ:ð ð 08�˜'Ð+Ó,ó	 ";ñ 8÷	/ó 	/ô ˜¨¸1Ñ)<×=ˆBÜ˜O¨_¸qÑ-@×A�Ø�8˜wÓ&Ùá" 2×*Ñ*Ùô 58³E�Ø#×)Ñ)¨B¨8¨*Ó5�Ø—‘  Ô)à!�u�Ø!�u�ö Ø%*§]¡]£_‘N�F˜Fô    vÓ.�EÜ  vÓ.�EÜ  vÓ.�EÜ  vÓ.�Eò "D�Jã",™˜˜BÜ$)¨!¨]¸QÑ->Ö$?˜DØ%+¨r°D©yÑ%9¸6ÀRÈ$ÁYÑ;O ˜Bà " B˜x¨;Ó6Ú %á*¨2¨r×2Ó2Ø +§¡°°R°Ô 9Ø %§¡¨b°"¨XÔ 6Ú %ó %@ñ #-÷ �eð2 —‘˜{Ô+ô ,Ø 5°%ÀÐPUñ�ð Ô#Ø—M‘MØ$)¨5°%¸Ð#?ÈÑN÷ôe Bñ >ðn ˆrH   c                ó  •  UR                  5       nU H‘  n UR                  5       nU(       av  SSKJn	  [        R
                  " U	" U5      5      n
SnUR                  U[        R                  " U
SS9S[        US[        R                  " U[        R                  S9S	9US
9  M‘  M“     g! [         a#  n[        R!                  SU 35         SnAM¾  SnAff = f! [         a"  n[        R!                  SU 35         SnAgSnAff = f)z*Find and extract images from an ODS sheet.r   r   )r   r   r�   r�   r  r€  NrŒ   r…  r†  )rû   r�  Úcaptionrï  rü   z(Could not extract image from ODS sheet: z$Could not find images in ODS sheet: )r+  r}  Úior   rˆ  r‰  r¯  r   r‹  r   r   r‹  r   rŒ  r^   r­  r®  )rv   r  r˜   rû   rw  rü   r0  Úimgr�  r   rŽ  Úanchorrb   s                rI   r~  Ú(OdsDocumentBackend._find_images_in_sheetç  sü   € ð"	Cà×%Ñ%Ó'ˆFÛ�ðOà!$§¡£�JÞ!å.ä$,§M¢M±'¸*Ó2EÓ$F˜	ð
 ".˜àŸ™Ø#)Ü"*×"3Ò"3¸)ÈÑ"LØ$(Ü!/Ø(/Ø)/Ü%0×%;Ò%;Ø$*´;×3FÑ3Fñ&"ñ"ð +8ð (ó ñ "ò	 øô8 !ó OÜ—J‘JÐ!IÈ!ÈÐM×NÒNûðOûäó 	CÜ�J‰JÐ=¸a¸SÐA×BÑBûð	CúsA   ‚C ˜BB*Â#C Â*
CÂ4CÃC ÃCÃC Ã
DÃ$DÄDc                ó0  • SnSnSnSnU R                  SUS9 Hæ  u  pg[        U[        5      (       d  M  UR                   Hº  nUR                  c  M  UR                  n	US:w  a  [        X)R                  5      OU	R                  nUS:w  a  [        XIR                  5      OU	R                  nUS:w  a  [        X9R                  5      OU	R                  nUS:w  a  [        XYR                  5      OU	R                  nM¼     Mè     US:X  d  US:X  a  gXB-
  XS-
  4$ )zICalculate page size based on the bounding boxes of all items on the page.g      ð¿T)Útraverse_picturesrw  rë   )ç        rÂ  )Úiterate_itemsr\   r   rï  rˆ  r¤  Úlr•   r”  ÚtÚb)
r  rw  ÚleftÚtopÚrightÚbottomr?  rþ  Ú
provenancerˆ  s
             rI   r  Ú"OdsDocumentBackend._find_page_size  sò   € ð ˆØˆØˆØˆà×(Ñ(¸4ÈÐ(ÓQ‰GˆDÜ˜d¤G×,Ñ,ÙØ"Ÿiœi�
Ø—?‘?Ñ*ÙØ!—‘�Ø,0°B«J”s˜4§¡Ô(¸D¿F¹F�Ø.3°r«kœ˜E§6¡6Ô*¸t¿v¹v�Ø*-°«)”c˜#Ÿv™vÔ&¸¿¹�Ø06¸"³œ˜V§V¡VÔ,À$Ç&Á&’ó (ñ Rð �2‹:˜ "›ØØ‘˜f™lÐ+Ð+rH   c                óR   • U R                  S5      nUS:X  a  [        R                  $ g)zADetermine if a sheet is hidden and should be marked as invisible.ztable:displayÚfalseN)Úget_attributer   Ú	INVISIBLE)r˜   Údisplays     rI   r{  Ú+OdsDocumentBackend._get_sheet_content_layer-  s+   € ð
 ×%Ñ% oÓ6ˆØ�gÓÜ×)Ñ)Ð)ØrH   rA   rT   r‚   r†   rc  r/  r0  )r  r   r˜   rm  rû   r   rw  r?   rü   úContentLayer | Noner„   r…   )r˜   rm  r„   z6list[dict[str, tuple[int, int, int, int] | TableData]])r  r   rw  r?   r„   ztuple[float, float])r˜   rm  r„   rÓ  )rB   rC   rD   rE   r‡   rh   r%   ro   r2  r  r<  r  r+  r}  r‰  r~  rd  r  r{  rG   rˆ   r‰   s   @rI   rf  rf  Ï  s|  ø† ñð €Iàð
 -1ð	:àð:ð 'ð:ð *ð	:ð
 
÷:ó ð:ð Øóó ó ðð ó
ó ð
ð Øó!ó ó ð!ð ó3ó ð3ðjFàðFð ðFð ð	Fð
 ðFð +ðFð 
ôFðPkØðkà	?ôkðZ+Càð+Cð ð+Cð ð	+Cð
 ð+Cð +ð+Cð 
ô+CðZ ó,ó ð,ð0 óó örH   rf  )rY   ú
str | Noner„   rQ   )r`   rƒ   ra   rM   r„   r]   )r˜   rm  r„   ztuple[int, int, int, int])rN   rM   r„   ú	list[str])rP   r   r„   rO   )rP   rO   r„   r   )r·   rM   r„   r,   rT   )rq   úOdfDocument | NonerÐ   rÔ  rÑ   rO   r„   rO   r‹   )
rå   r	   rq   rÖ  ræ   rO   rç   rQ   r„   úlist[_OdfTextRun])rè   r×  r„   r×  )rè   r×  r„   rM   )r  r   rè   r×  rú   r   rû   r<   rü   rÓ  r„   r<   )r  r   rè   r×  r  zCallable[..., NodeItem]rû   r<   rü   rÓ  r„   r<   )r  r   rå   r2   rû   r<   rü   rÓ  rq   rÖ  r„   r…   )rq   rÖ  rå   r5   r„   zset[str])r  r   rå   r5   rû   r<   rü   rÓ  rq   rÖ  r  úImageResourceLoader | Noner„   r…   )rå   r	   r„   rÕ  )r?  r4   r<  r,   r„   ztuple[str, list[OdfList]])r?  r4   rq   rÖ  r<  r,   r„   r×  )rQ  r5  r<  r,   r„   r,   )rq   rÖ  rQ  r5  r  r?   r„   z
Any | None)
rq   rÖ  rQ  r5  r  r?   r^  r,   r„   r,   )rq   rÖ  rQ  r5  r  r?   r„   r?   )
r@   r?   rq   rÖ  rQ  r5  r  r?   r„   rM   )r˜   rm  r„   r,   )r    r	   r„   r,   )r    r	   r„   rM   )rq   rÖ  r�  r	   r  rØ  r„   zImageRef | None)r�  r	   r„   rÔ  )r�  r	   rŒ  rÔ  r„   r,   )rN   rM   r0  r1  r„   r,   )rN   rM   r0  r1  r„   rM   )r  r   r0  r1  rû   r   rü   rÓ  rq   rÖ  r  rØ  r   r,   r„   r?   )r  r   rå   r	   rû   r<   rü   rÓ  rq   rÖ  r  rØ  r„   ú_OdfListState | None)r  r   r»  r1  rû   r<   rü   rÓ  rq   rÖ  r  rØ  r„   r…   )rY   rM   r„   rM   )rÄ  r	   r„   r   )rÍ  r1   rq   rÖ  r„   z3tuple[TableData, PictureClassificationLabel] | None)r  r   rå   r	   rû   r<   rü   rÓ  rq   rÖ  r„   r?   )Fr�   NT)r  r   rQ  r5  rû   r   rü   rÓ  rq   rÖ  r>   r,   r  r?   rº  rÙ  r<  r,   r„   rÙ  )r  r   r    r	   rû   r   rü   rÓ  rq   rÖ  r  rØ  r„   r…   )r  r   r˜   rm  rû   r<   r™   ú
int | Noner›   rÚ  rš   rÚ  rœ   rÚ  rï  zProvenanceItem | Nonerü   rÓ  rq   rÖ  r  rØ  r„   zTableItem | None)r˜   rm  r™   r?   r›   r?   rš   r?   rœ   r?   r„   r,   )NNNN)r˜   rm  r™   rÚ  r›   rÚ  rš   rÚ  rœ   rÚ  r„   zTableData | None)�r‡   Ú
__future__r   ÚloggingÚreÚcollections.abcr   Údataclassesr   r¼  r   Úpathlibr   Útypingr	   r
   Údocling_core.types.docr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   ÚPILr"   rˆ  Úpydanticr#   r$   Útyping_extensionsr%   Ú docling.backend.abstract_backendr&   r'   Ú+docling.backend.utils.image_resource_loaderr(   Ú!docling.datamodel.backend_optionsr)   Údocling.datamodel.base_modelsr*   Údocling.datamodel.documentr+   r-   rF   r.   Úodfdor/   r]   r0   r1   r2   r3   r5  r4   r5   r6   r7   rm  rl   rb   Ú	getLoggerrB   r­  rm   Ú	BAR_CHARTÚ
LINE_CHARTÚ	PIE_CHARTÚSCATTER_PLOTrÂ  r9   rK   ÚcompilerV   rZ   rc   re   r¤   r¬   r¯   r²   r¸   rØ   râ   rñ   r÷   r  r  r  r  r3  r6  rB  rE  rR  rU  rJ  r\  r`  rc  rg  rj  ro  rq  rt  rl  r“   r{  r�  rƒ  r„  r.  r-  r,  r·  r¶  r¿  rÈ  rÒ  r*  r´  rî  rµ  r  rÌ  r  r4  rf  rA   rH   rI   Ú<module>rò     s“  ðòõ  #ã Û 	Ý $Ý !Ý Ý ß ÷÷ ÷ ÷ ÷ ÷ ñ õ2 "ß ,Ý &÷õ LÝ ?Ý 5Ý 4àÐ �$Ó Ø*.Ð Ð'Ó .ð÷
÷ 
õ 
ð Ðð ×Ò˜Ó"€ðIð ð ,×5Ñ5Ø,×7Ñ7Ø.×8Ñ8Ø+×5Ñ5Ø/×<Ñ<ñ.Ð *ð ÷ð ó ðð ÷+ð +ó ð+ð —j’jÐ!=Ó>Ð ôð"Ø"ðØ36ðàôô'#Ð0ô '#ôT-0ô`Sô>ô#ôð *.ð?+Øð?+àð?+ð 'ð?+ð õ	?+ðJ /3Ø04ð	-Øð-àð-ð ,ð-ð .ð	-ð
 õ-ô`"4ôJ5ð
Ø	ðà
ðð ð	ð
 ðð 'ðð ôðD&Ø	ð&à
ð&ð 'ð	&ð
 ð&ð 'ð&ð ô&ðRØ	ðàðð ð	ð
 'ðð  ðð 
ôð&ØðØ*3ðàôð> 04ñ8
Ø	ð8
àð8
ð ð	8
ð
 'ð8
ð  ð8
ð -ð8
ð 
õ8
ôv9ð: 48ñ(Ø
ð(Ø,0ð(àõ(ð& !%ñ	*Ø
ð*àð*ð ð	*ð
 õ*ð(ØðØ/3ðà	ôð$ØðØ/3ðà	ôð 7;ñØðØ/3ðà	õð&(Øð(Ø+2ð(Ø;>ð(àô(ð"	=Øð	=àð	=ð ð	=ð ð		=ð
 
ô	=ðØðàðð ðð 	ô	ð&
 Øð
 àð
 ð ð
 ð ð	
 ð
 	ô
 ôôYô0ôAô&ôDô,ð 04ñ	6Øð6àð6ð -ð	6ð
 õ6ôDôô2Gôð* 04Ø%*ñØ	ðàðð ðð 'ð	ð
  ðð -ðð #ðð 	õðN 04ñPØ	ðPàðPð ð	Pð
 'ðPð  ðPð -ðPð õPðt 04ñØ	ðàðð ð	ð
 'ðð  ðð -ðð 
õôD@ô2ðØðØ-ðà8ôðB"Ø	ð"àð"ð ð"ð 'ð	"ð
  ð"ð 	ô"ðV ØØ,0Ø $ðWØ	ðWàðWð ðWð 'ð	Wð
  ðWð ðWð ðWð *ðWð ðWð õWð@ 04ð
Ø	ð
à
ð
ð ð
ð 'ð	
ð
  ð
ð -ð
ð 
õ
ð0 ØØØØ"&Ø)-Ø"&Ø/3ñPØ	ðPàðPð ðPð
 ðPð ðPð ðPð ðPð  ðPð 'ðPð  ðPð -ðPð õPðfØðàðð ðð ð	ð
 ðð 
ôð( ØØØðGIØðGIàðGIð ðGIð ð	GIð
 ðGIð õGIôT,
˜ô ,
ô^v˜Ð*Bô vôrf˜Ð*Bõ føðw3 ó ØÖûðús   Â'O ÏOÏOÏO