§
    �Øjé=  ã                   óâ   — d Z ddlZddlmZmZmZmZmZmZm	Z	 ddl
mZmZ  ej        d¦  «        Z ej        d¦  «        Z G d„ d	¦  «        Zd
efd„Zd
efd„Zd„ Zd
ee         fd„Zd
efd„ZdS )uS  Step E: Serialize ProtoChunks into Chunks, plus table/figure/section views.

The serializer materializes chunk text once (assembly never joins text),
builds the tables/figures/sections views with bidirectional links
(chunk.metadata.table_ids/figure_ids/section_id <-> view.chunk_id(s)),
and attaches citation metadata (section_path, pages, element ids).

section_path derives from the layout-detected heading structure â€” it is
the innermost owning section's path (D18). It never consults the PDF TOC,
so it stays populated and consistent with the sections view on documents
without bookmarks.
é    Né   )ÚChunkÚChunkMetadataÚFigureChunkÚ
ProtoChunkÚSectionChunkÚ
TableChunkÚ
element_id)Úextract_table_headersÚtable_contentz^[#>*_`\s]+z	[*_`\s]+$c                   ór   — e Zd ZdZd„ Zdee         fd„Zdedefd„Z	d„ Z
defd	„Zded
ee         defd„ZdS )ÚChunkSerializerz?Converts ProtoChunks into Chunks and builds the document views.c                 ó@   — || _         d„ |j        D ¦   «         | _        d S )Nc                 ó>   — h | ]}t          |d d¦  «        ¯|j        ’ŒS )Ú
full_ocredF)ÚgetattrÚpage_number)Ú.0Úps     úœ/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/pymupdf4llm/helpers/chunking/serializer.pyú	<setcomp>z+ChunkSerializer.__init__.<locals>.<setcomp>%   s;   € ð 
ð 
ð 
Øµ¸¸<ÈÑ0OÔ0Oð
ØŒMð
ð 
ð 
ó    )ÚdocÚpagesÚ
_ocr_pages)Úselfr   s     r   Ú__init__zChunkSerializer.__init__#   s/   € ØˆŒð
ð 
Ø#&¤9ð
ñ 
ô 
ˆŒˆˆr   Úproto_chunksc                 óæ   ‡ — |sg g g g fS ˆ fd„|D ¦   «         }‰                       ||¦  «        \  }}}t          ||¦  «        D ]*\  }}‰                      ||j        j        ¦  «        |_        Œ+||||fS )z½Convert ProtoChunks to Chunks.

        Returns (chunks, tables, figures, sections) where tables/figures/
        sections are the document views, bidirectionally linked to chunks.
        c                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS © )Ú_make_chunk)r   Úpcr   s     €r   ú
<listcomp>z-ChunkSerializer.serialize.<locals>.<listcomp>2   s'   ø€ Ð>Ð>Ð>¨2�$×"Ò" 2Ñ&Ô&Ð>Ð>Ð>r   )Ú_build_viewsÚzipÚ_build_tagged_contentÚmetadataÚsection_pathÚtagged_content)r   r   ÚchunksÚtablesÚfiguresÚsectionsr#   Úchunks   `       r   Ú	serializezChunkSerializer.serialize)   s¥   ø€ ð ð 	"Ø�r˜2˜r�>Ð!à>Ð>Ð>Ð>°Ð>Ñ>Ô>ˆØ$(×$5Ò$5°lÀFÑ$KÔ$KÑ!ˆ�˜õ ˜\¨6Ñ2Ô2ð 	1ð 	1‰IˆB�Ø#'×#=Ò#=Ø�E”NÔ/ñ$1ô $1ˆEÔ Ð ð �v˜w¨Ð0Ð0r   r#   Úreturnc                 ó´  ‡ — d                      d„ |j        D ¦   «         ¦  «        |_        t          |j        |j        d„ |j        D ¦   «         |j        p	|j        pdg|j	        |j
        t          |j        ¦  «        t          ˆ fd„|j        D ¦   «         ¦  «        ‰ j        j        ‰ j        j        ¬¦
  «
        }t!          d|j        › �|j        d|¬	¦  «        S )
z@Create a Chunk from a ProtoChunk (text materialized here, once).ú
c              3   ó$   K  — | ]}|j         V — Œd S ©N)Útext©r   Úss     r   ú	<genexpr>z.ChunkSerializer._make_chunk.<locals>.<genexpr>?   s$   è è € Ð:Ð: q˜AœFÐ:Ð:Ð:Ð:Ð:Ð:r   c                 ó4   — g | ]\  }}t          ||¦  «        ‘ŒS r!   )r
   )r   r   Úbs      r   r$   z/ChunkSerializer._make_chunk.<locals>.<listcomp>D   s&   € ÐEÐEÐE©d¨a°� A qÑ)Ô)ÐEÐEÐEr   Ú	paragraphc              3   ó4   •K  — | ]}|j         ‰j        v V — Œd S r5   )Úpage_nor   )r   r8   r   s     €r   r9   z.ChunkSerializer._make_chunk.<locals>.<genexpr>L   s,   øè è € ÐHÐH°Q�A”I ¤Ð0ÐHÐHÐHÐHÐHÐHr   )
Ú
page_startÚpage_endÚelement_idsÚtypesÚtoken_countÚbboxesÚlistsÚocrÚ	file_pathÚ
page_countÚcÚ )Úidr6   r*   r(   )ÚjoinÚ
_sentencesr6   r   r?   r@   Úbox_indicesrB   Úprimary_typerC   rD   Ú_group_list_itemsÚanyr   ÚfilenamerH   r   Úchunk_id)r   r#   r(   s   `  r   r"   zChunkSerializer._make_chunk=   sè   ø€ à—)’)Ð:Ð:¨B¬MÐ:Ñ:Ô:Ñ:Ô:ˆŒå Ø”}Ø”[ØEÐE°b´nÐEÑEÔEØ”(Ð>˜rœÐ=°+Ð>ØœØ”9Ý# B¤MÑ2Ô2õ ÐHÐHÐHÐH¸"¼-ÐHÑHÔHÑHÔHØ”hÔ'Ø”xÔ*ð
ñ 
ô 
ˆõ  Ø �2”;Ð Ð Ø”ØØð	
ñ 
ô 
ð 	
r   c                 óB  — g }g }g }i }g }i }d}	| j         j        D ]#}
|	||
j        <   |	t          |
j        ¦  «        z  }	Œ$d„ }t          ||¦  «        D �]�\  }}t          |j        ¦  «        D �]ó\  }}|j        rçt          |j        |d¦  «        }t          dt          |¦  «        › �|j        t          |j        |j        ¦  «        |j        |j        |j        |j        t%          |j        ¦  «        |r|j        nd|rt          |j        |j        ¦  «        nd|j        ¬¦  «        }|                     |¦  «         |j        j                             |j        ¦  «         Œô|j        �r­|j        ��¥|                     |j        ¦  «        }|€ÿ|j                             d¦  «        r|j        nd}t          |j        |d	¦  «        }t9          d
|j        › �|j        t          |j        |j        ¦  «        |j        |j        |j        |rdn|j        ||r|j        nd|rt          |j        |j        ¦  «        nd|j        ¬¦  «        }|||j        <   |                     |¦  «         |j        j                             |j        ¦  «         �Œ|j                             d¦  «        s7|j         r$|j         dz   |j        z    !                    ¦   «         n|j        |_         |j        |j        j        vr$|j        j                             |j        ¦  «         �Œ©|j"        �rB|j#        pd}|r:|d         d         |k    r(| $                    ¦   «          |r|d         d         |k    °(tJ           &                    dtN           &                    d|j        ¦  «        ¦  «         !                    ¦   «         }tQ          dt          |¦  «        › �|||j        |j        t          |j        |j        ¦  «        d„ |D ¦   «         |gz   |                     |j        d¦  «        |j        z   |	f¬¦  «        }|                     |¦  «          |||¦  «         |                     ||f¦  «         �Œõ|D ]0\  }} |||¦  «         tS          |j*        |j*        ¦  «        |_*        Œ1|r=|d         d         }|j        |j        _+        tY          |j-        ¦  «        |j        _.        �Œƒt          |¦  «        D ]J\  }}|	}||dz   d…         D ]!}|j/        |j/        k    r|j0        d         } nŒ"|j0        d         |f|_0        ŒK|  1                    |¦  «        }|rte          |||¦  «        }d„ |D ¦   «         }||fD ]4}|D ]/} |                     | j3        ¦  «        }!|!�|!j        j+        | _+        Œ0Œ5|||fS )z1Build t/f/s views with bidirectional chunk links.r   c                 ó˜   — |j         | j        vr;| j                             |j         ¦  «         | xj        |j        j        z  c_        d S d S r5   )rK   Úchild_chunk_idsÚappendrC   r(   )Úsectionr/   s     r   Ú_linkz+ChunkSerializer._build_views.<locals>._linki   sR   € ØŒx˜wÔ6Ð6Ð6ØÔ'×.Ò.¨u¬xÑ8Ô8Ð8ØÐ#Ô# u¤~Ô'AÑAÐ#Ô#Ð#Ð#ð 7Ð6r   ÚtableÚtN)rK   rS   r
   ÚpageÚbboxÚmarkdownÚhtmlÚheadersÚcaptionÚcaption_element_idrC   z[FigurerJ   ÚfigureÚf)rK   rS   r
   r\   r]   ÚboxclassÚocr_textÚplaceholderra   rb   Úimager3   r   éÿÿÿÿr8   c                 ó"   — g | ]\  }}|j         ‘ŒS r!   )Útitle)r   Ú_lÚsecs      r   r$   z0ChunkSerializer._build_views.<locals>.<listcomp>±   s   € ÐEÐEÐE©G¨B°˜cœiÐEÐEÐEr   )rK   rk   Úlevelr?   r@   Úheading_element_idÚpathÚelement_spanc                 ó   — i | ]
}|j         |“ŒS r!   ©rK   ©r   rI   s     r   ú
<dictcomp>z0ChunkSerializer._build_views.<locals>.<dictcomp>Ø   s   € Ð/Ð/Ð/ 1�q”t˜QÐ/Ð/Ð/r   )4r   r   r   ÚlenÚboxesr&   Ú	enumeraterM   Úis_table_contentÚ_nearest_captionr	   rK   r
   r>   Ú	box_indexr]   Útable_markdownÚ
table_htmlr   r6   rC   rW   r(   Ú	table_idsÚis_figure_relatedÚfigure_numberÚgetÚ
startswithr   re   Ú
image_dataÚ
figure_idsrf   ÚstripÚis_heading_hintÚheading_level_hintÚpopÚ_MD_DECOR_TRAIL_REÚsubÚ_MD_DECOR_REr   Úmaxr@   Ú
section_idÚlistrp   r)   rn   rq   Ú_unchunked_tablesÚ_merge_unchunked_tablesrS   )"r   r   r+   r,   r-   r.   Úseen_figuresÚopen_sectionsÚ
box_offsetÚtotal_boxesr\   rY   r#   r/   Úidxr8   ÚcaprZ   Úfigrg   rn   rk   rX   Ú_levelÚ	innermostÚirm   ÚendÚlaterÚ	unchunkedÚchunk_by_idÚviewÚitemÚowners"                                     r   r%   zChunkSerializer._build_viewsZ   s.  € àˆØˆØˆØˆØˆð ˆ
ØˆØ”H”Nð 	+ð 	+ˆDØ+6ˆJ�tÔ'Ñ(Ø�3˜tœz™?œ?Ñ*ˆKˆKð	Bð 	Bð 	Bõ
 ˜\¨6Ñ2Ô2ð V	Cñ V	C‰IˆB�Ý# B¤MÑ2Ô2ð L;ñ L;‘��QØÔ%ð K;Ý*¨2¬=¸#¸wÑGÔG�CÝ&Ø,�s 6™{œ{Ð,Ð,Ø!&¤Ý#-¨a¬i¸¼Ñ#EÔ#EØœYØœVØ!"Ô!1Øœ\Ý 5°a´lÑ CÔ CØ,/Ð 9 ¤ °TàFIÐS�J s¤{°C´MÑBÔBÐBÈtØ$%¤Mðñ ô �Eð —M’M %Ñ(Ô(Ð(Ø”NÔ,×3Ò3°E´HÑ=Ô=Ð=Ð=àÔ(ñ 8;¨Q¬_Ñ-HØ&×*Ò*¨1¬?Ñ;Ô;�CØ�{Ø01´×0AÒ0AÀ)Ñ0LÔ0LÐ&T a¤f fÐRT˜Ý.¨r¬}¸cÀ8ÑLÔL˜Ý)Ø4 1¤?Ð4Ð4Ø%*¤XÝ'1°!´)¸Q¼[Ñ'IÔ'IØ!"¤Ø!"¤Ø%&¤ZØ-8Ð%D T T¸a¼fØ(3Ø03Ð$= C¤H H¸àJMÐ W¥
¨3¬;¸¼Ñ FÔ FÐ FÐSWØ"#¤,ðñ ô ˜ð 9<˜ Q¤_Ñ5ØŸš sÑ+Ô+Ð+ØœÔ1×8Ò8¸¼Ñ@Ô@Ð@Ñ@ð  !œv×0Ò0°Ñ;Ô;ð Ià/2¬|ð-H¨S¬\¸DÑ-@À1Ä6Ñ-I×,PÒ,PÑ,RÔ,RÐ,RØABÄð  œLð
 œ6¨¬Ô)BÐBÐBØ!œNÔ5×<Ò<¸S¼VÑDÔDÐDùàÔ&ñ ;ØÔ0Ð5°A�EØ'ð ,¨M¸"Ô,=¸aÔ,@ÀEÒ,IÐ,IØ%×)Ò)Ñ+Ô+Ð+ð (ð ,¨M¸"Ô,=¸aÔ,@ÀEÒ,IÐ,Iå.×2Ò2Ø�L×,Ò,¨R°´Ñ8Ô8ñ:ô :ß:?º%¹'¼'ð å*Ø.�s 8™}œ}Ð.Ð.Ø#Ø#Ø#$¤9Ø!"¤Ý+5°a´iÀÄÑ+MÔ+MØEÐE°}ÐEÑEÔEÈÈÑOà&ŸNšN¨1¬9°aÑ8Ô8¸1¼;ÑFØ'ð&ðñ ô �Gð —O’O GÑ,Ô,Ð,ð �E˜' 5Ñ)Ô)Ð)Ø!×(Ò(¨%°Ð)9Ñ:Ô:Ð:ùð $1ð Fð F‘�˜Ø��g˜uÑ%Ô%Ð%Ý#& wÔ'7¸¼Ñ#EÔ#E�Ô Ð Øð CØ)¨"Ô-¨aÔ0�	Ø,5¬L�”Ô)Ý.2°9´>Ñ.BÔ.B�”Ô+ùõ   Ñ)Ô)ð 	:ð 	:‰FˆAˆsØˆCØ! ! a¡% & &Ô)ð ð �Ø”; #¤)Ò+Ð+ØÔ,¨QÔ/�CØ�Eð ,ð !$Ô 0°Ô 3°SÐ9ˆCÔÐð
 ×*Ò*¨<Ñ8Ô8ˆ	Øð 	HÝ,¨V°YÀÑGÔGˆFð 0Ð/¨Ð/Ñ/Ô/ˆØ˜WÐ%ð 	@ð 	@ˆDØð @ð @�Ø#Ÿš¨¬Ñ6Ô6�ØÐ$Ø&+¤nÔ&?�D”Oøð@ð
 �w Ð(Ð(r   c                 óž  — d„ |D ¦   «         }g }| j         j        D ]±}t          |j        ¦  «        D ]š\  }}|j        dvrŒ|j        |f|v rŒt          |¦  «        \  }}|€|€d}|                     t          ddt          |j        |¦  «        |j        |j
        |j        |j        |j        f||t          |¦  «        ¬¦  «        ¦  «         Œ›Œ²|S )u)  Table boxes that produced no unit, as chunk-less TableChunks.

        A table box whose rendering is empty yields no SentenceUnit, so no
        chunk carries it. It stays in the element registry, but without
        this it would also disappear from ``tables`` and therefore from
        ``diagnostics["degenerate_tables"]`` â€” exactly the case the
        diagnostic exists to surface. Such a table is exposed with
        ``chunk_id=None``: it is addressable and reported, and its empty
        rendering is visible in ``TableChunk.text``.
        c                 óL   — h | ]!}|j         D ]}|j        ¯	|j        |j        f’ŒŒ"S r!   )rM   ry   r>   r{   )r   r#   r8   s      r   r   z4ChunkSerializer._unchunked_tables.<locals>.<setcomp>ì   sO   € ð *ð *ð *Ø°2´=ð*ð *Ø./ØÔ(ð*�A”I˜qœ{Ð+ð *ð *ð *ð *r   )rZ   ztable-fallbackNrJ   )rK   rS   r
   r\   r]   r^   r_   r`   )r   r   rx   rw   re   r   r   rW   r	   r
   Úx0Úy0Úx1Úy1r   )	r   r   ÚchunkedÚmissingr\   Úbox_idxÚboxr^   r_   s	            r   r�   z!ChunkSerializer._unchunked_tablesá   s  € ð*ð *Ø)ð*ñ *ô *ˆð ˆØ”H”Nð 	ð 	ˆDÝ )¨$¬*Ñ 5Ô 5ð ð ‘�˜Ø”<Ð'BÐBÐBØØÔ$ gÐ.°'Ð9Ð9ØÝ!.¨sÑ!3Ô!3‘�˜$ØÐ#¨¨Ø!�HØ—’�zØØ!Ý)¨$Ô*:¸GÑDÔDØÔ)Øœ& #¤&¨#¬&°#´&Ð9Ø%ØÝ1°$Ñ7Ô7ð	 ñ 	 ô 	 ñ 	ô 	ð 	ð 	ðð$ ˆr   Ú	hierarchyc                 óê  — g }|r+|                      dd                     |¦  «        › �¦  «         |j        |j        k    r|                      d|j        › �¦  «         n%|                      d|j        › d|j        › �¦  «         d„ |j        pg D ¦   «         }|r+|                      dd                     |¦  «        › �¦  «         |                      d	|j        › �¦  «         d
                     |¦  «        S )z*Build context-enriched text for embedding.z
[Section] z > z[Page] z[Pages] ú-c                 ó   — g | ]
}|d k    ¯|‘ŒS )r<   r!   )r   r[   s     r   r$   z9ChunkSerializer._build_tagged_content.<locals>.<listcomp>  s"   € ÐDÐDÐD˜!°1¸Ò3CÐ3C�AÐ3CÐ3CÐ3Cr   z[Type] z, z[Markdown]
r3   )rW   rL   r?   r@   rB   r6   )r   r#   r¬   ÚpartsÚnon_paras        r   r'   z%ChunkSerializer._build_tagged_content  s  € àˆàð 	?Ø�LŠLÐ= e§j¢j°Ñ&;Ô&;Ð=Ð=Ñ>Ô>Ð>àŒ=˜BœKÒ'Ð'Ø�LŠLÐ2 2¤=Ð2Ð2Ñ3Ô3Ð3Ð3à�LŠLÐA B¤MÐAÐA°B´KÐAÐAÑBÔBÐBàDÐD ¤ ¨BÐDÑDÔDˆØð 	:Ø�LŠLÐ8 4§9¢9¨XÑ#6Ô#6Ð8Ð8Ñ9Ô9Ð9à�ŠÐ- B¤GÐ-Ð-Ñ.Ô.Ð.à�yŠy˜ÑÔÐr   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rŽ   r   r0   r   r"   r%   r�   Ústrr'   r!   r   r   r   r       sÇ   € € € € € ØIÐIð
ð 
ð 
ð1 d¨:Ô&6ð 1ð 1ð 1ð 1ð(
˜jð 
¨Uð 
ð 
ð 
ð 
ð:E)ð E)ð E)ðN"°ð "ð "ð "ð "ðL ¨
ð  ¸tÀC¼yð  ÈSð  ð  ð  ð  ð  ð  r   r   r1   c                 ól   — | j         t          | j                             dd¦  «        d         ¦  «        fS )z=(page, box) reading-order key from a TableChunk's element id.z.br   ri   )r\   Úintr
   Úrsplit)rZ   s    r   Ú_table_addressrº     s/   € àŒJ�˜EÔ,×3Ò3°D¸!Ñ<Ô<¸RÔ@ÑAÔAÐBÐBr   c                 ó¤  — t          t          | ¦  «        t          |¦  «        z   t          ¬¦  «        }t          |¦  «        D ]\  }}d|› �|_        Œd„ |D ¦   «         }|D ] }|j        j                             ¦   «          Œ!|D ]K}|j        r| 	                    |j        ¦  «        nd}|�$|j        j         
                    |j        ¦  «         ŒL|S )a  Insert chunk-less tables into the view, keeping ids in reading order.

    Ids are re-issued over the merged, reading-ordered list and the chunk
    back-links (``metadata.table_ids``) are rebuilt from it, so ``t{n}``
    still numbers tables the way the document reads.
    )Úkeyr[   c                 ó   — i | ]
}|j         |“ŒS r!   rs   rt   s     r   ru   z+_merge_unchunked_tables.<locals>.<dictcomp>.  s   € Ð%Ð%Ð%˜ˆQŒT�1Ð%Ð%Ð%r   N)ÚsortedrŽ   rº   rx   rK   r(   r~   ÚclearrS   r�   rW   )	r,   r�   r+   Úmergedrš   rZ   Úby_idr/   r¡   s	            r   r�   r�   #  sâ   € õ •D˜‘L”L¥4¨	¡?¤?Ñ2½ÐGÑGÔG€FÝ˜fÑ%Ô%ð ð ‰ˆˆ5Ø�q�7�7ˆŒˆà%Ð%˜fÐ%Ñ%Ô%€EØð )ð )ˆØŒÔ ×&Ò&Ñ(Ô(Ð(Ð(Øð 6ð 6ˆØ-2¬^ÐE�—	’	˜%œ.Ñ)Ô)Ð)ÀˆØÐØŒNÔ$×+Ò+¨E¬HÑ5Ô5Ð5øØ€Mr   c                 óœ   — d}d}t          | ¦  «        D ]7\  }}|j        sŒ|j        d|fvrŒt          ||z
  ¦  «        }|�||k     r||}}Œ8|S )zHNearest caption unit to sents[idx] targeting *target_type* (or untyped).N)rx   Ú
is_captionÚcaption_target_typeÚabs)Úsentsr•   Útarget_typeÚbestÚ	best_distÚjr8   Údists           r   rz   rz   8  sx   € à€DØ€IÝ˜%Ñ Ô ð &ð &‰ˆˆ1ØŒ|ð 	ØØÔ ¨¨{Ð(;Ð;Ð;ØÝ�1�s‘7‰|Œ|ˆØÐ  yÒ 0Ð 0Ø �)ˆDøØ€Kr   c                 óæ   — g }g }| D ]E}|j         r|                     |¦  «         Œ|r$|                     t          |¦  «        ¦  «         g }ŒF|r"|                     t          |¦  «        ¦  «         |S )u¿  Group consecutive list-item sentences into logical list groups.

    Each group gets one union bbox *per page* and an ordered items list.
    Non-list sentences break the current group, so two separate
    runs of list-items produce two distinct list groups.

    Returns::

        [{"items":  [{"text": str, "page": int, "bbox": (x0, y0, x1, y1)}],
          "bboxes": [(page, x0, y0, x1, y1), ...]}]

    A list continuing across a page break yields one entry in ``bboxes``
    per page, in page order â€” unioning across pages would place the whole
    group in a rectangle that exists on neither page. Item bboxes stay
    4-tuples and carry their page next to them, matching ``Element.bbox``.
    )Úis_list_itemrW   Ú_finalize_list_group)rÆ   ÚgroupsÚcurrent_itemsr8   s       r   rP   rP   G  s�   € ð" €FØ€Màð #ð #ˆØŒ>ð 	#Ø× Ò  Ñ#Ô#Ð#Ð#àð #Ø—’Õ2°=ÑAÔAÑBÔBÐBØ "�øàð ;Ø�ŠÕ*¨=Ñ9Ô9Ñ:Ô:Ð:à€Mr   c                 ó¼  — d„ | D ¦   «         }i }| D ]5}|                      |j        g ¦  «                             |j        ¦  «         Œ6g }t	          |¦  «        D ]€}||         }|                     |t          d„ |D ¦   «         ¦  «        t          d„ |D ¦   «         ¦  «        t          d„ |D ¦   «         ¦  «        t          d„ |D ¦   «         ¦  «        f¦  «         Œ�||dœS )z=Build a list group dict from consecutive list-item sentences.c                 ó8   — g | ]}|j         |j        |j        d œ‘ŒS ))r6   r\   r]   )r6   r>   r]   r7   s     r   r$   z(_finalize_list_group.<locals>.<listcomp>k  s8   € ð ð ð Øð œ¨¬	¸1¼6ÐBÐBð ð ð r   c              3   ó&   K  — | ]}|d          V — ŒdS )r   Nr!   ©r   r;   s     r   r9   z'_finalize_list_group.<locals>.<genexpr>w  ó&   è è € Ð)Ð)˜��!”Ð)Ð)Ð)Ð)Ð)Ð)r   c              3   ó&   K  — | ]}|d          V — ŒdS )r   Nr!   rÔ   s     r   r9   z'_finalize_list_group.<locals>.<genexpr>x  rÕ   r   c              3   ó&   K  — | ]}|d          V — ŒdS )é   Nr!   rÔ   s     r   r9   z'_finalize_list_group.<locals>.<genexpr>y  rÕ   r   c              3   ó&   K  — | ]}|d          V — ŒdS )é   Nr!   rÔ   s     r   r9   z'_finalize_list_group.<locals>.<genexpr>z  rÕ   r   )ÚitemsrD   )Ú
setdefaultr>   rW   r]   r¾   ÚminrŒ   )rÛ   ÚentriesÚby_pager8   rD   r>   Ú
page_boxess          r   rÎ   rÎ   i  s   € ðð Øðñ ô €Gð €GØð 9ð 9ˆØ×Ò˜1œ9 bÑ)Ô)×0Ò0°´Ñ8Ô8Ð8Ð8à€FÝ˜'‘?”?ð ð ˆØ˜WÔ%ˆ
Ø�ŠØÝÐ)Ð)˜jÐ)Ñ)Ô)Ñ)Ô)ÝÐ)Ð)˜jÐ)Ñ)Ô)Ñ)Ô)ÝÐ)Ð)˜jÐ)Ñ)Ô)Ñ)Ô)ÝÐ)Ð)˜jÐ)Ñ)Ô)Ñ)Ô)ð
ñ 	ô 	ð 	ð 	ð ¨Ð/Ð/Ð/r   )rµ   ÚreÚmodelsr   r   r   r   r   r	   r
   Útext_sourcer   r   Úcompiler‹   r‰   r   Útuplerº   rŽ   r�   rz   ÚdictrP   rÎ   r!   r   r   ú<module>rç      ss  ððð ð 
€	€	€	ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð >Ð =Ð =Ð =Ð =Ð =Ð =Ð =ð ˆrŒz˜.Ñ)Ô)€Ø�R”Z Ñ-Ô-Ð ðy ð y ð y ð y ð y ñ y ô y ð y ð|C˜Uð Cð Cð Cð Cð
¸$ð ð ð ð ð*ð ð ð  T¤
ð ð ð ð ðD0 4ð 0ð 0ð 0ð 0ð 0ð 0r   