§
    _}dgýŽ  ã                   ó²  — d Z ddlZddlZddlmZmZ ddlmZ ddlm	Z	 ddl
mZ ddl
mZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZmZ ddlmZ ddlmZ ddlmZ ddl m!Z!m"Z" d$d„Z#d„ Z$d„ Z%d„ Z&d„ Z' edg d¢¦  «        Z( edg d¢¦  «        Z) e)dddd¬¦  «        Z* G d„ d¦  «        Z+ G d„ de+¦  «        Z, G d „ d!e+¦  «        Z- G d"„ d#e+¦  «        Z.dS )%zk
Pagination serializers determine the structure of the output that should
be used for paginated responses.
é    N)Ú	b64decodeÚ	b64encode)Ú
namedtuple)Úparse)ÚInvalidPage)Ú	Paginator)Úloader)Ú	force_str)Úgettext_lazy)ÚRemovedInDRF317Warning)ÚcoreapiÚ
coreschema)ÚNotFound)ÚResponse)Úapi_settings)Úremove_query_paramÚreplace_query_paramFc                 ó€   — t          | ¦  «        }|dk     s|dk    r|rt          ¦   «         ‚|rt          ||¦  «        S |S )z7
    Cast a string to a strictly positive integer.
    r   )ÚintÚ
ValueErrorÚmin)Úinteger_stringÚstrictÚcutoffÚrets       úX/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/rest_framework/pagination.pyÚ_positive_intr      sM   € õ ˆnÑ
Ô
€CØ
ˆQ‚w€w�3˜!’8�8 �8Ý‰lŒlÐØð  Ý�3˜ÑÔÐØ€Jó    c                 ó&   — | |z  r| |z  dz   S | |z  S )zD
    Returns 'a' divided by 'b', with any remainder rounded up.
    é   © )ÚaÚbs     r   Ú_divide_with_ceilr$   &   s'   € ð 	ˆ1�uð Ø�Q‘˜!‰|Ðà�‰6€Mr   c                 ó,  ‡— | dk    sJ ‚‰| k    sJ ‚‰dk    r t          t          d‰dz   ¦  «        ¦  «        S d| dz
  | | dz   ‰h}| dk    r*|                     d¦  «         |                     d¦  «         | ‰dz
  k    r0|                     ‰dz
  ¦  «         |                     ‰dz
  ¦  «         ˆfd„t          |¦  «        D ¦   «         }| dk    r|                     dd¦  «         | ‰dz
  k     r&|                     t          |¦  «        dz
  d¦  «         |S )aŒ  
    This utility function determines a list of page numbers to display.
    This gives us a nice contextually relevant set of page numbers.

    For example:
    current=14, final=16 -> [1, None, 13, 14, 15, 16]

    This implementation gives one page to each side of the cursor,
    or two pages to the side when the cursor is at the edge, then
    ensures that any breaks between non-continuous page numbers never
    remove only a single page.

    For an alternative implementation which gives two pages to each side of
    the cursor, eg. as in GitHub issue list pagination, see:

    https://gist.github.com/tomchristie/321140cebb1c4a558b15
    r    é   é   é   é   c                 ó4   •— g | ]}d |cxk     r‰k    ¯n n|‘ŒS )r   r!   )Ú.0ÚidxÚfinals     €r   ú
<listcomp>z/_get_displayed_page_numbers.<locals>.<listcomp>V   sE   ø€ ð ð ð ØØˆsÐÐÒÐ�eÒÐÐÐÐð 	ØÐÐr   N)ÚlistÚrangeÚaddÚsortedÚinsertÚlen)Úcurrentr-   Úincludeds    ` r   Ú_get_displayed_page_numbersr7   0   sH  ø€ ð$ �aŠ<ˆ<ˆ<ˆ<Ø�GÒÐÐÐà�‚z€zÝ•E˜!˜U Q™YÑ'Ô'Ñ(Ô(Ð(ð �7˜Q‘; ¨°1©°eÐ<€Hð �!‚|€|Ø�Š�Q‰ŒˆØ�Š�Q‰ŒˆØ�%˜!‘)ÒÐØ�Š�U˜Q‘YÑÔÐØ�Š�U˜Q‘YÑÔÐðð ð ð Ý˜hÑ'Ô'ðñ ô €Hð �‚{€{Ø�Š˜˜4Ñ Ô Ð Ø�˜‘ÒÐØ�Š�˜H™œ¨Ñ)¨4Ñ0Ô0Ð0Ø€Or   c                 ó’   — g }| D ]A}|€t           }n t           ||¦  «        |||k    d¬¦  «        }|                     |¦  «         ŒB|S )zg
    Given a list of page numbers and `None` page breaks,
    return a list of `PageLink` objects.
    NF©ÚurlÚnumberÚ	is_activeÚis_break)Ú
PAGE_BREAKÚPageLinkÚappend)Úpage_numbersr5   Úurl_funcÚ
page_linksÚpage_numberÚ	page_links         r   Ú_get_page_linksrF   c   ss   € ð
 €JØ#ð 
%ð 
%ˆØÐÝ"ˆIˆIå Ø�H˜[Ñ)Ô)Ø"Ø&¨'Ò1Øð	ñ ô ˆIð 	×Ò˜)Ñ$Ô$Ð$Ð$ØÐr   c                 ó@   ‡— d„ Št          ˆfd„| D ¦   «         ¦  «        S )z�
    Given an order_by tuple such as `('-created', 'uuid')` reverse the
    ordering and return a new tuple, eg. `('created', '-uuid')`.
    c                 óJ   — |                       d¦  «        r
| dd …         nd| z   S )Nú-r    )Ú
startswith)Úxs    r   Úinvertz!_reverse_ordering.<locals>.invert|   s)   € ØŸš SÑ)Ô)Ð6ˆq���Œuˆu¨s°Q©wÐ6r   c                 ó&   •— g | ]} ‰|¦  «        ‘ŒS r!   r!   )r+   ÚitemrL   s     €r   r.   z%_reverse_ordering.<locals>.<listcomp>   s!   ø€ Ð:Ð:Ð: 4�&�&˜‘,”,Ð:Ð:Ð:r   )Útuple)Úordering_tuplerL   s    @r   Ú_reverse_orderingrQ   w   s7   ø€ ð
7ð 7ð 7õ Ð:Ð:Ð:Ð:¨>Ð:Ñ:Ô:Ñ;Ô;Ð;r   ÚCursor©ÚoffsetÚreverseÚpositionr?   r9   Tc                   ó>   — e Zd ZdZd
d„Zd„ Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
dS )ÚBasePaginationFNc                 ó    — t          d¦  «        ‚)Nz(paginate_queryset() must be implemented.©ÚNotImplementedError©ÚselfÚquerysetÚrequestÚviews       r   Úpaginate_querysetz BasePagination.paginate_queryset‹   s   € Ý!Ð"LÑMÔMÐMr   c                 ó    — t          d¦  «        ‚)Nz-get_paginated_response() must be implemented.rZ   ©r]   Údatas     r   Úget_paginated_responsez%BasePagination.get_paginated_responseŽ   s   € Ý!Ð"QÑRÔRÐRr   c                 ó   — |S ©Nr!   ©r]   Úschemas     r   Úget_paginated_response_schemaz,BasePagination.get_paginated_response_schema‘   s   € Øˆr   c                 ó    — t          d¦  «        ‚)Nz7to_html() must be implemented to display page controls.rZ   ©r]   s    r   Úto_htmlzBasePagination.to_html”   s   € Ý!Ð"[Ñ\Ô\Ð\r   c                 ó   — |d         S )NÚresultsr!   rc   s     r   Úget_resultszBasePagination.get_results—   s   € Ø�IŒÐr   c                 ój   — t           €
J d¦   «         ‚t           �t          j        dt          ¦  «         g S )Nú6coreapi must be installed to use `get_schema_fields()`úCCoreAPI compatibility is deprecated and will be removed in DRF 3.17)r   ÚwarningsÚwarnr   ©r]   r`   s     r   Úget_schema_fieldsz BasePagination.get_schema_fieldsš   s6   € ÝÐ"Ð"Ð$\Ñ"Ô"Ð"ÝÐÝŒMÐ_ÕawÑxÔxÐxØˆ	r   c                 ó   — g S rg   r!   rv   s     r   Úget_schema_operation_parametersz.BasePagination.get_schema_operation_parameters    s   € Øˆ	r   rg   )Ú__name__Ú
__module__Ú__qualname__Údisplay_page_controlsra   re   rj   rm   rp   rw   ry   r!   r   r   rX   rX   ˆ   s’   € € € € € Ø!ÐðNð Nð Nð NðSð Sð Sðð ð ð]ð ]ð ]ðð ð ðð ð ðð ð ð ð r   rX   c                   ó¾   — e Zd ZdZej        ZeZdZ	 e
d¦  «        ZdZ e
d¦  «        ZdZdZdZ e
d¦  «        Zdd	„Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚPageNumberPaginationzÒ
    A simple page number based style that supports page numbers as
    query parameters. For example:

    http://api.example.org/accounts/?page=4
    http://api.example.org/accounts/?page=4&page_size=100
    Úpagez.A page number within the paginated result set.Nú%Number of results to return per page.)Úlastú&rest_framework/pagination/numbers.htmlzInvalid page.c                 óÀ  — || _         |                      |¦  «        }|sdS |                      ||¦  «        }|                      ||¦  «        }	 |                     |¦  «        | _        nJ# t
          $ r=}| j                             |t          |¦  «        ¬¦  «        }t          |¦  «        ‚d}~ww xY w|j
        dk    r| j        �d| _        t          | j        ¦  «        S )z“
        Paginate a queryset if required, either returning a
        page object, or `None` if pagination is not configured for this view.
        N)rD   Úmessager    T)r_   Úget_page_sizeÚdjango_paginator_classÚget_page_numberr€   r   Úinvalid_page_messageÚformatÚstrr   Ú	num_pagesÚtemplater}   r/   )	r]   r^   r_   r`   Ú	page_sizeÚ	paginatorrD   ÚexcÚmsgs	            r   ra   z&PageNumberPagination.paginate_querysetÅ   sñ   € ð
 ˆŒØ×&Ò& wÑ/Ô/ˆ	Øð 	Ø�4à×/Ò/°¸)ÑDÔDˆ	Ø×*Ò*¨7°IÑ>Ô>ˆð	 Ø!Ÿš {Ñ3Ô3ˆDŒIˆIøÝð 	 ð 	 ð 	 ØÔ+×2Ò2Ø'µ°S±´ð 3ñ ô ˆCõ ˜3‘-”-Ðøøøøð		 øøøð Ô Ò"Ð" t¤}Ð'@à)-ˆDÔ&å�D”I‰ŒÐs   ÁA) Á)
B0Á38B+Â+B0c                 óh   — |j                              | j        ¦  «        pd}|| j        v r|j        }|S ©Nr    )Úquery_paramsÚgetÚpage_query_paramÚlast_page_stringsrŒ   )r]   r_   r�   rD   s       r   rˆ   z$PageNumberPagination.get_page_numberà   s<   € ØÔ*×.Ò.¨tÔ/DÑEÔEÐJÈˆØ˜$Ô0Ð0Ð0Ø#Ô-ˆKØÐr   c                 ó�   — t          | j        j        j        |                      ¦   «         |                      ¦   «         |dœ¦  «        S ©N©ÚcountÚnextÚpreviousro   )r   r€   r�   r›   Úget_next_linkÚget_previous_linkrc   s     r   re   z+PageNumberPagination.get_paginated_responseæ   sJ   € ÝØ”YÔ(Ô.Ø×&Ò&Ñ(Ô(Ø×.Ò.Ñ0Ô0Øð	
ð 
ñ ô ð 	r   c           
      óš   — dddgdddœddd	d
                      | j        ¬¦  «        dœddd	d                      | j        ¬¦  «        dœ|dœdœS )NÚobjectr›   ro   Úintegeré{   ©ÚtypeÚexampleÚstringTÚuriz5http://api.example.org/accounts/?{page_query_param}=4)r–   ©r¥   ÚnullablerŠ   r¦   z5http://api.example.org/accounts/?{page_query_param}=2rš   ©r¥   ÚrequiredÚ
properties)rŠ   r–   rh   s     r   rj   z2PageNumberPagination.get_paginated_response_schemaî   s©   € àØ  )Ð,ð &Ø"ðð ð
 %Ø $Ø#ØV×]Ò]Ø)-Ô)>ð  ^ñ  @ô  @ð	ð ð %Ø $Ø#ØV×]Ò]Ø)-Ô)>ð  ^ñ  @ô  @ð	ð ð "ð'ð ð
ð 
ð 	
r   c                 óÚ   — | j         r^t          j        t          t          ¦  «        5  t          |j        | j                  d| j        ¬¦  «        cd d d ¦  «         S # 1 swxY w Y   | j        S ©NT)r   r   ©	Úpage_size_query_paramÚ
contextlibÚsuppressÚKeyErrorr   r   r”   Úmax_page_sizerŽ   ©r]   r_   s     r   r†   z"PageNumberPagination.get_page_size	  ó­   € ØÔ%ð 	ÝÔ$¥X­zÑ:Ô:ð ð Ý$ØÔ(¨Ô)CÔDØØÔ-ðñ ô ðð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð Œ~Ðó   §'AÁAÁ"Ac                 óÈ   — | j                              ¦   «         sd S | j                             ¦   «         }| j                              ¦   «         }t          || j        |¦  «        S rg   )r€   Úhas_nextr_   Úbuild_absolute_uriÚnext_page_numberr   r–   ©r]   r:   rD   s      r   rž   z"PageNumberPagination.get_next_link  sX   € ØŒy×!Ò!Ñ#Ô#ð 	Ø�4ØŒl×-Ò-Ñ/Ô/ˆØ”i×0Ò0Ñ2Ô2ˆÝ" 3¨Ô(=¸{ÑKÔKÐKr   c                 óþ   — | j                              ¦   «         sd S | j                             ¦   «         }| j                              ¦   «         }|dk    rt          || j        ¦  «        S t          || j        |¦  «        S r“   )r€   Úhas_previousr_   r»   Úprevious_page_numberr   r–   r   r½   s      r   rŸ   z&PageNumberPagination.get_previous_link  sv   € ØŒy×%Ò%Ñ'Ô'ð 	Ø�4ØŒl×-Ò-Ñ/Ô/ˆØ”i×4Ò4Ñ6Ô6ˆØ˜!ÒÐÝ% c¨4Ô+@ÑAÔAÐAÝ" 3¨Ô(=¸{ÑKÔKÐKr   c                 ó  ‡ ‡— ‰ j                              ¦   «         Šˆˆ fd„}‰ j        j        }‰ j        j        j        }t          ||¦  «        }t          |||¦  «        }‰                      ¦   «         ‰  	                    ¦   «         |dœS )Nc                 óf   •— | dk    rt          ‰‰j        ¦  «        S t          ‰‰j        | ¦  «        S r“   )r   r–   r   )rD   Úbase_urlr]   s    €€r   Úpage_number_to_urlzAPageNumberPagination.get_html_context.<locals>.page_number_to_url&  s6   ø€ Ø˜aÒÐÝ)¨(°DÔ4IÑJÔJÐJå*¨8°TÔ5JÈKÑXÔXÐXr   ©Úprevious_urlÚnext_urlrC   )
r_   r»   r€   r;   r�   rŒ   r7   rF   rŸ   rž   )r]   rÄ   r5   r-   rA   rC   rÃ   s   `     @r   Úget_html_contextz%PageNumberPagination.get_html_context#  s§   øø€ Ø”<×2Ò2Ñ4Ô4ˆð	Yð 	Yð 	Yð 	Yð 	Yð 	Yð ”)Ô"ˆØ”	Ô#Ô-ˆÝ2°7¸EÑBÔBˆÝ$ \°7Ð<NÑOÔOˆ
ð !×2Ò2Ñ4Ô4Ø×*Ò*Ñ,Ô,Ø$ð
ð 
ð 	
r   c                 ó†   — t          j        | j        ¦  «        }|                      ¦   «         }|                     |¦  «        S rg   ©r	   Úget_templater�   rÈ   Úrender©r]   r�   Úcontexts      r   rm   zPageNumberPagination.to_html7  ó7   € ÝÔ& t¤}Ñ5Ô5ˆØ×'Ò'Ñ)Ô)ˆØ�Š˜wÑ'Ô'Ð'r   c                 óÎ  — t           €
J d¦   «         ‚t           �t          j        dt          ¦  «         t          €
J d¦   «         ‚t          j        | j        ddt	          j        dt          | j	        ¦  «        ¬¦  «        ¬¦  «        g}| j
        �V|                     t          j        | j
        ddt	          j        d	t          | j        ¦  «        ¬¦  «        ¬¦  «        ¦  «         |S )
Nrr   rs   ú9coreschema must be installed to use `get_schema_fields()`FÚqueryÚPage©ÚtitleÚdescription©Únamer¬   Úlocationri   ú	Page size)r   rt   ru   r   r   ÚFieldr–   ÚIntegerr
   Úpage_query_descriptionr±   r@   Úpage_size_query_description©r]   r`   Úfieldss      r   rw   z&PageNumberPagination.get_schema_fields<  s  € ÝÐ"Ð"Ð$\Ñ"Ô"Ð"ÝÐÝŒMÐ_ÕawÑxÔxÐxÝÐ%Ð%Ð'bÑ%Ô%Ð%åŒMØÔ*ØØ Ý!Ô)Ø Ý )¨$Ô*EÑ FÔ Fðñ ô ð	ñ ô ð

ˆð Ô%Ð1Ø�MŠMÝ”ØÔ3Ø"Ø$Ý%Ô-Ø)Ý$-¨dÔ.NÑ$OÔ$Oðñ ô ð	ñ ô ñ
ô 
ð 
ð ˆr   c                 óÀ   — | j         ddt          | j        ¦  «        ddidœg}| j        �4|                     | j        ddt          | j        ¦  «        ddidœ¦  «         |S ©NFrÒ   r¥   r¢   ©rØ   r¬   ÚinrÖ   ri   )r–   r
   rÝ   r±   r@   rÞ   ©r]   r`   Ú
parameterss      r   ry   z4PageNumberPagination.get_schema_operation_parametersZ  s’   € ð Ô-Ø!ØÝ(¨Ô)DÑEÔEà˜Iððð ð

ˆ
ð Ô%Ð1Ø×Òà Ô6Ø %Ø!Ý#,¨TÔ-MÑ#NÔ#Nà 	ððð ñ
ô 
ð 
ð Ðr   rg   )rz   r{   r|   Ú__doc__r   Ú	PAGE_SIZErŽ   ÚDjangoPaginatorr‡   r–   Ú_rÝ   r±   rÞ   rµ   r—   r�   r‰   ra   rˆ   re   rj   r†   rž   rŸ   rÈ   rm   rw   ry   r!   r   r   r   r   ¤   s2  € € € € € ðð ð Ô&€Ià,Ðð ÐØ˜QÐOÑPÔPÐð !ÐØ"# !Ð$KÑ"LÔ"LÐð €Mà!Ðà7€Hà˜1˜_Ñ-Ô-Ððð ð ð ð6ð ð ðð ð ð
ð 
ð 
ð6ð ð ðLð Lð LðLð Lð Lð
ð 
ð 
ð((ð (ð (ð
ð ð ð<ð ð ð ð r   r   c                   ó¦   — e Zd ZdZej        ZdZ ed¦  «        Z	dZ
 ed¦  «        ZdZdZdd„Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚLimitOffsetPaginationzœ
    A limit/offset based style. For example:

    http://api.example.org/accounts/?limit=100
    http://api.example.org/accounts/?offset=400&limit=100
    Úlimitr�   rT   z3The initial index from which to return the results.Nrƒ   c                 ó†  — || _         |                      |¦  «        | _        | j        €d S |                      |¦  «        | _        |                      |¦  «        | _        | j        | j        k    r| j        �d| _        | j        dk    s| j        | j        k    rg S t          || j        | j        | j        z   …         ¦  «        S )NTr   )
r_   Ú	get_limitrí   Ú	get_countr›   Ú
get_offsetrT   r�   r}   r/   r\   s       r   ra   z'LimitOffsetPagination.paginate_queryset„  s®   € ØˆŒØ—^’^ GÑ,Ô,ˆŒ
ØŒ:ÐØ�4à—^’^ HÑ-Ô-ˆŒ
Ø—o’o gÑ.Ô.ˆŒØŒ:˜œ
Ò"Ð" t¤}Ð'@Ø)-ˆDÔ&àŒ:˜Š?ˆ?˜dœk¨D¬JÒ6Ð6ØˆIÝ�H˜Tœ[¨¬°t´zÑ)AÐAÔBÑCÔCÐCr   c                 ó|   — t          | j        |                      ¦   «         |                      ¦   «         |dœ¦  «        S r™   )r   r›   rž   rŸ   rc   s     r   re   z,LimitOffsetPagination.get_paginated_response“  sD   € ÝØ”ZØ×&Ò&Ñ(Ô(Ø×.Ò.Ñ0Ô0Øð	
ð 
ñ ô ð 	r   c                 ó²   — dddgdddœddd	d
                      | j        | j        ¬¦  «        dœddd	d                      | j        | j        ¬¦  «        dœ|dœdœS )Nr¡   r›   ro   r¢   r£   r¤   r§   Tr¨   zEhttp://api.example.org/accounts/?{offset_param}=400&{limit_param}=100)Úoffset_paramÚlimit_paramr©   zEhttp://api.example.org/accounts/?{offset_param}=200&{limit_param}=100rš   r«   )rŠ   Úoffset_query_paramÚlimit_query_paramrh   s     r   rj   z3LimitOffsetPagination.get_paginated_response_schema›  s³   € àØ  )Ð,ð &Ø"ðð ð
 %Ø $Ø#Øf×mÒmØ%)Ô%<È$ÔJ`ð  nñ  bô  bð	ð ð %Ø $Ø#Øf×mÒmØ%)Ô%<È$ÔJ`ð  nñ  bô  bð	ð ð "ð'ð ð
ð 
ð 	
r   c                 óÚ   — | j         r^t          j        t          t          ¦  «        5  t          |j        | j                  d| j        ¬¦  «        cd d d ¦  «         S # 1 swxY w Y   | j        S r¯   )	r÷   r²   r³   r´   r   r   r”   Ú	max_limitÚdefault_limitr¶   s     r   rï   zLimitOffsetPagination.get_limit¶  s­   € ØÔ!ð 	ÝÔ$¥X­zÑ:Ô:ð ð Ý$ØÔ(¨Ô)?Ô@ØØœ>ðñ ô ðð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð Ô!Ð!r¸   c                 ór   — 	 t          |j        | j                 ¦  «        S # t          t          f$ r Y dS w xY w©Nr   )r   r”   rö   r´   r   r¶   s     r   rñ   z LimitOffsetPagination.get_offsetÀ  sP   € ð	Ý ØÔ$ TÔ%<Ô=ñô ð øõ �*Ð%ð 	ð 	ð 	Ø�1�1ð	øøøs   ‚! ¡6µ6c                 óè   — | j         | j        z   | j        k    rd S | j                             ¦   «         }t          || j        | j        ¦  «        }| j         | j        z   }t          || j        |¦  «        S rg   )rT   rí   r›   r_   r»   r   r÷   rö   ©r]   r:   rT   s      r   rž   z#LimitOffsetPagination.get_next_linkÈ  si   € ØŒ;˜œÑ# t¤zÒ1Ð1Ø�4àŒl×-Ò-Ñ/Ô/ˆÝ! # tÔ'=¸t¼zÑJÔJˆà”˜tœzÑ)ˆÝ" 3¨Ô(?ÀÑHÔHÐHr   c                 ó  — | j         dk    rd S | j                             ¦   «         }t          || j        | j        ¦  «        }| j         | j        z
  dk    rt          || j        ¦  «        S | j         | j        z
  }t          || j        |¦  «        S rü   )rT   r_   r»   r   r÷   rí   r   rö   rþ   s      r   rŸ   z'LimitOffsetPagination.get_previous_linkÒ  s‡   € ØŒ;˜!ÒÐØ�4àŒl×-Ò-Ñ/Ô/ˆÝ! # tÔ'=¸t¼zÑJÔJˆàŒ;˜œÑ# qÒ(Ð(Ý% c¨4Ô+BÑCÔCÐCà”˜tœzÑ)ˆÝ" 3¨Ô(?ÀÑHÔHÐHr   c                 óÚ  ‡ ‡‡— ‰ j                              ¦   «         Š‰ j        rkt          ‰ j        ‰ j        ¦  «        dz   Št          ‰ j        ‰ j        z
  ‰ j        ¦  «        t          ‰ j        ‰ j        ¦  «        z   }t          |d¦  «        }ndŠd}‰|k    r|Šˆˆˆ fd„}t          ‰|¦  «        }t          |‰|¦  «        }‰  	                    ¦   «         ‰  
                    ¦   «         |dœS )Nr    c                 ó�   •— | dk    rt          ‰‰j        ¦  «        S ‰j        | ‰z
  ‰j        z  z   }t	          ‰‰j        |¦  «        S r“   )r   rö   rT   rí   r   )rD   rT   rÃ   r5   r]   s     €€€r   rÄ   zBLimitOffsetPagination.get_html_context.<locals>.page_number_to_url÷  sN   ø€ Ø˜aÒÐÝ)¨(°DÔ4KÑLÔLÐLàœ¨°wÑ)>À$Ä*Ñ(LÑM�Ý*¨8°TÔ5LÈfÑUÔUÐUr   rÅ   )r_   r»   rí   r$   rT   r›   Úmaxr7   rF   rŸ   rž   )r]   r-   rÄ   rA   rC   rÃ   r5   s   `    @@r   rÈ   z&LimitOffsetPagination.get_html_contextß  s  øøø€ Ø”<×2Ò2Ñ4Ô4ˆàŒ:ð 	Ý'¨¬°T´ZÑ@Ô@À1ÑDˆGõ " $¤*¨t¬{Ñ":¸D¼JÑGÔGÝ! $¤+¨t¬zÑ:Ô:ñ;ð õ
 ˜˜q‘M”MˆEˆEàˆGØˆEà�UŠ?ˆ?ØˆGð	Vð 	Vð 	Vð 	Vð 	Vð 	Vð 	Võ 3°7¸EÑBÔBˆÝ$ \°7Ð<NÑOÔOˆ
ð !×2Ò2Ñ4Ô4Ø×*Ò*Ñ,Ô,Ø$ð
ð 
ð 	
r   c                 ó†   — t          j        | j        ¦  «        }|                      ¦   «         }|                     |¦  «        S rg   rÊ   rÍ   s      r   rm   zLimitOffsetPagination.to_html  rÏ   r   c                 óx   — 	 |                      ¦   «         S # t          t          f$ r t          |¦  «        cY S w xY w)zZ
        Determine an object count, supporting either querysets or regular lists.
        )r›   ÚAttributeErrorÚ	TypeErrorr4   )r]   r^   s     r   rð   zLimitOffsetPagination.get_count  sI   € ð	!Ø—>’>Ñ#Ô#Ð#øÝ¥	Ð*ð 	!ð 	!ð 	!Ý�x‘=”=Ð Ð Ð ð	!øøøs   ‚ – 9¸9c                 ó”  — t           €
J d¦   «         ‚t           �t          j        dt          ¦  «         t          €
J d¦   «         ‚t          j        | j        ddt	          j        dt          | j	        ¦  «        ¬¦  «        ¬¦  «        t          j        | j
        ddt	          j        d	t          | j        ¦  «        ¬¦  «        ¬¦  «        gS )
Nrr   rs   rÑ   FrÒ   ÚLimitrÔ   r×   ÚOffset)r   rt   ru   r   r   rÛ   r÷   rÜ   r
   Úlimit_query_descriptionrö   Úoffset_query_descriptionrv   s     r   rw   z'LimitOffsetPagination.get_schema_fields  sÞ   € ÝÐ"Ð"Ð$\Ñ"Ô"Ð"ÝÐÝŒMÐ_ÕawÑxÔxÐxÝÐ%Ð%Ð'bÑ%Ô%Ð%åŒMØÔ+ØØ Ý!Ô)Ø!Ý )¨$Ô*FÑ GÔ Gðñ ô ð	ñ ô õ ŒMØÔ,ØØ Ý!Ô)Ø"Ý )¨$Ô*GÑ HÔ Hðñ ô ð	ñ ô ð
ð 	
r   c                 óŠ   — | j         ddt          | j        ¦  «        ddidœ| j        ddt          | j        ¦  «        ddidœg}|S râ   )r÷   r
   r
  rö   r  rå   s      r   ry   z5LimitOffsetPagination.get_schema_operation_parameters/  sq   € ð Ô.Ø!ØÝ(¨Ô)EÑFÔFà˜Iððð ð Ô/Ø!ØÝ(¨Ô)FÑGÔGà˜Iððð ð
ˆ
ð( Ðr   rg   )rz   r{   r|   rç   r   rè   rú   r÷   rê   r
  rö   r  rù   r�   ra   re   rj   rï   rñ   rž   rŸ   rÈ   rm   rð   rw   ry   r!   r   r   rì   rì   u  s$  € € € € € ðð ð !Ô*€MØÐØ˜aÐ GÑHÔHÐØ!ÐØ ˜qÐ!VÑWÔWÐØ€IØ7€HðDð Dð Dð Dðð ð ð
ð 
ð 
ð6"ð "ð "ðð ð ðIð Ið IðIð Ið Ið&
ð &
ð &
ðP(ð (ð (ð
!ð !ð !ð
ð 
ð 
ð4ð ð ð ð r   rì   c                   óÐ   — e Zd ZdZdZ ed¦  «        Zej        Z	 ed¦  «        Z
dZdZdZ ed¦  «        ZdZd	Zdd
„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚCursorPaginationzÐ
    The cursor pagination implementation is necessarily complex.
    For an overview of the position/offset style we use, see this post:
    https://cra.mr/2011/03/08/building-cursors-for-the-disqus-api
    ÚcursorzThe pagination cursor value.zInvalid cursorz-createdz0rest_framework/pagination/previous_and_next.htmlNr�   iè  c                 óÌ  — || _         |                      |¦  «        | _        | j        sd S |                     ¦   «         | _        |                      |||¦  «        | _        |                      |¦  «        | _        | j        €d\  }}}n| j        \  }}}|r |j	        t          | j        ¦  «        Ž }n |j	        | j        Ž }|�c| j        d         }|                     d¦  «        }|                     d¦  «        }	| j        j        |k    r|	dz   |i}
n|	dz   |i}
 |j        d
i |
¤Ž}t          |||| j        z   dz   …         ¦  «        }t          |d | j        …         ¦  «        | _        t#          |¦  «        t#          | j        ¦  «        k    r$d}|                      |d         | j        ¦  «        }nd	}d }|rYt          t'          | j        ¦  «        ¦  «        | _        |d up|dk    | _        || _        | j        r|| _        | j        r|| _        n2|| _        |d up|dk    | _        | j        r|| _        | j        r|| _        | j        s| j        r| j        �d| _        | j        S )N)r   FNr   rI   Ú__ltÚ__gtr    TéÿÿÿÿFr!   )r_   r†   rŽ   r»   rÃ   Úget_orderingÚorderingÚdecode_cursorr  Úorder_byrQ   rJ   ÚlstriprU   Úfilterr/   r€   r4   Ú_get_position_from_instanceÚreversedrº   r¿   Únext_positionÚprevious_positionr�   r}   )r]   r^   r_   r`   rT   rU   Úcurrent_positionÚorderÚis_reversedÚ
order_attrÚkwargsro   Úhas_following_positionÚfollowing_positions                 r   ra   z"CursorPagination.paginate_querysetc  s³  € ØˆŒØ×+Ò+¨GÑ4Ô4ˆŒØŒ~ð 	Ø�4à×2Ò2Ñ4Ô4ˆŒØ×)Ò)¨'°8¸TÑBÔBˆŒà×(Ò(¨Ñ1Ô1ˆŒØŒ;ÐØ2BÑ/ˆV�WÐ.Ð.à26´+Ñ/ˆV�WÐ.ð ð 	9Ø(�xÔ(Õ*;¸D¼MÑ*JÔ*JÐKˆHˆHà(�xÔ(¨$¬-Ð8ˆHð Ð'Ø”M !Ô$ˆEØ×*Ò*¨3Ñ/Ô/ˆKØŸš cÑ*Ô*ˆJð Œ{Ô" kÒ1Ð1Ø$ vÑ-Ð/?Ð@��à$ vÑ-Ð/?Ð@�à&�x”Ð0Ð0¨Ð0Ð0ˆHõ
 �x  v°´Ñ'>ÀÑ'BÐ BÔCÑDÔDˆÝ˜  $¤. Ô1Ñ2Ô2ˆŒ	õ ˆw‰<Œ<�#˜dœi™.œ.Ò(Ð(Ø%)Ð"Ø!%×!AÒ!AÀ'È"Ä+ÈtÌ}Ñ!]Ô!]ÐÐà%*Ð"Ø!%Ðàð 	:õ �X d¤iÑ0Ô0Ñ1Ô1ˆDŒIð .°TÐ9ÐJ¸vÈºzˆDŒMØ 6ˆDÔØŒ}ð 6Ø%5�Ô"ØÔ ð <Ø);�Ô&øð 3ˆDŒMØ!1¸Ð!=Ð NÀ6ÈAÂ:ˆDÔØŒ}ð 8Ø%7�Ô"ØÔ ð :Ø)9�Ô&ð Ôð 	. ¤ð 	.°D´MÐ4MØ)-ˆDÔ&àŒyÐr   c                 óÚ   — | j         r^t          j        t          t          ¦  «        5  t          |j        | j                  d| j        ¬¦  «        cd d d ¦  «         S # 1 swxY w Y   | j        S r¯   r°   r¶   s     r   r†   zCursorPagination.get_page_size°  r·   r¸   c                 óR  — | j         sd S | j        rJ| j        rC| j        j        r7| j        j        dk    r'|                      | j        d         | j        ¦  «        }n| j        }d}d}t          | j        ¦  «        D ].}|                      || j        ¦  «        }||k    rd} n|}|dz  }Œ/| j        rD|sB| j	        s
| j
        }d }n1| j        j        r
d}| j        }n| j        j        | j
        z   }| j        }| j        s| j        }t          |d|¬¦  «        }|                      |¦  «        S )Nr   r  FTr    rS   )rº   r€   r  rU   rT   r  r  r  r  r¿   rŽ   r  rR   Úencode_cursor©r]   ÚcomparerT   Úhas_item_with_unique_positionrN   rV   r  s          r   rž   zCursorPagination.get_next_linkº  sn  € ØŒ}ð 	Ø�4àŒ9ð 	)˜œð 	)¨¬Ô)<ð 	)ÀÄÔASÐWXÒAXÐAXð ×6Ò6°t´yÀ´}ÀdÄmÑTÔTˆGˆGàÔ(ˆGØˆà(-Ð%Ý˜TœYÑ'Ô'ð 	ð 	ˆDØ×7Ò7¸¸d¼mÑLÔLˆHØ˜7Ò"Ð"ð 15Ð-Ø�ð
 ˆGØ�a‰KˆFˆFàŒ9ð 	2Ð:ð 	2àÔ$ð 2ð œ�Ø��Ø”Ô$ð 	2ð �ØÔ1��ð œÔ+¨d¬nÑ<�ØÔ1�àŒyð 	*ØÔ)ˆHå˜v¨u¸xÐHÑHÔHˆØ×!Ò! &Ñ)Ô)Ð)r   c                 ó8  — | j         sd S | j        rJ| j        rC| j        j        s7| j        j        dk    r'|                      | j        d         | j        ¦  «        }n| j        }d}d}| j        D ].}|                      || j        ¦  «        }||k    rd} n|}|dz  }Œ/| j        rD|sB| j        s
| j	        }d }n1| j        j        r| j        j        | j	        z   }| j
        }n	d}| j
        }| j        s| j        }t          |d|¬¦  «        }|                      |¦  «        S )Nr   FTr    rS   )r¿   r€   r  rU   rT   r  r  r  rº   rŽ   r  rR   r'  r(  s          r   rŸ   z"CursorPagination.get_previous_linkï  sf  € ØÔ ð 	Ø�4àŒ9ð 	-˜œð 	-¨T¬[Ô-@ð 	-ÀTÄ[ÔEWÐ[\ÒE\ÐE\ð ×6Ò6°t´yÀ´|ÀTÄ]ÑSÔSˆGˆGàÔ,ˆGØˆà(-Ð%Ø”Ið 	ð 	ˆDØ×7Ò7¸¸d¼mÑLÔLˆHØ˜7Ò"Ð"ð 15Ð-Ø�ð
 ˆGØ�a‰KˆFˆFàŒ9ð 	.Ð:ð 	.à”=ð .ð œ�Ø��Ø”Ô$ð 	.ð œÔ+¨d¬nÑ<�ØÔ-��ð �ØÔ-�àŒyð 	.ØÔ-ˆHå˜v¨t¸hÐGÑGÔGˆØ×!Ò! &Ñ)Ô)Ð)r   c                 óÊ  — | j         }d„ t          |dg ¦  «        D ¦   «         }|r-|d         } |¦   «         }|                     |||¦  «        }|r|}|€
J d¦   «         ‚d|vs
J d¦   «         ‚t          |t          t
          t          f¦  «        s0J d                     t          |¦  «        j	        ¬	¦  «        ¦   «         ‚t          |t          ¦  «        r|fS t          |¦  «        S )
zV
        Return a tuple of strings, that may be used in an `order_by` method.
        c                 ó2   — g | ]}t          |d ¦  «        ¯|‘ŒS )r  )Úhasattr)r+   Ú
filter_clss     r   r.   z1CursorPagination.get_ordering.<locals>.<listcomp>,  s8   € ð 
ð 
ð 
Ø%Ý�z >Ñ2Ô2ð
Øð
ð 
ð 
r   Úfilter_backendsr   NzXUsing cursor pagination, but no ordering attribute was declared on the pagination class.Ú__z¶Cursor pagination does not support double underscore lookups for orderings. Orderings should be an unchanging, unique or nearly-unique field on the model, such as "-created" or "pk".z:Invalid ordering. Expected string or tuple, but got {type})r¥   )
r  Úgetattrr  Ú
isinstancer‹   r/   rO   rŠ   r¥   rz   )	r]   r_   r^   r`   r  Úordering_filtersr/  Úfilter_instanceÚordering_from_filters	            r   r  zCursorPagination.get_ordering$  s4  € ð ”=ˆð
ð 
Ý)0°Ð7HÈ"Ñ)MÔ)Mð
ñ 
ô 
Ðð
 ð 	0ð *¨!Ô,ˆJØ(˜j™lœlˆOØ#2×#?Ò#?ÀÈÐSWÑ#XÔ#XÐ Ø#ð 0Ø/�àÐ#Ð#ð'ñ $Ô#Ð#ð ˜8Ð#Ð#Ð#ðLñ $Ô#Ð#õ ˜(¥S­$µÐ$6Ñ7Ô7ð 	
ð 	
ØH×OÒOÝ˜(‘^”^Ô,ð Pñ ô ñ	
ô 	
ð 	
õ �h¥Ñ$Ô$ð 	Ø�;ÐÝ�X‰ŒÐr   c                 ój  — |j                              | j        ¦  «        }|€dS 	 t          |                     d¦  «        ¦  «                             d¦  «        }t          j        |d¬¦  «        }|                     ddg¦  «        d         }t          || j	        ¬¦  «        }|                     d	dg¦  «        d         }t          t          |¦  «        ¦  «        }|                     d
dg¦  «        d         }n)# t          t          f$ r t          | j        ¦  «        ‚w xY wt!          |||¬¦  «        S )zL
        Given a request with a cursor, return a `Cursor` instance.
        NÚasciiT)Úkeep_blank_valuesÚoÚ0r   )r   ÚrÚprS   )r”   r•   Úcursor_query_paramr   ÚencodeÚdecoder   Úparse_qsr   Úoffset_cutoffÚboolr   r  r   r   Úinvalid_cursor_messagerR   )r]   r_   ÚencodedÚquerystringÚtokensrT   rU   rV   s           r   r  zCursorPagination.decode_cursorN  s'  € ð
 Ô&×*Ò*¨4Ô+BÑCÔCˆØˆ?Ø�4ð	8Ý# G§N¢N°7Ñ$;Ô$;Ñ<Ô<×CÒCÀGÑLÔLˆKÝ”^ KÀ4ÐHÑHÔHˆFà—Z’Z  c UÑ+Ô+¨AÔ.ˆFÝ" 6°$Ô2DÐEÑEÔEˆFà—j’j  s eÑ,Ô,¨QÔ/ˆGÝ�3˜w™<œ<Ñ(Ô(ˆGà—z’z #¨ vÑ.Ô.¨qÔ1ˆHˆHøÝ�:Ð&ð 	8ð 	8ð 	8Ý˜4Ô6Ñ7Ô7Ð7ð	8øøøõ ˜V¨W¸xÐHÑHÔHÐHs   ¥CC: Ã:&D c                 óP  — i }|j         dk    rt          |j         ¦  «        |d<   |j        rd|d<   |j        �
|j        |d<   t	          j        |d¬¦  «        }t          |                     d	¦  «        ¦  «                             d	¦  «        }t          | j
        | j        |¦  «        S )
zM
        Given a Cursor instance, return an url with encoded cursor.
        r   r:  Ú1r<  Nr=  T)Údoseqr8  )rT   r‹   rU   rV   r   Ú	urlencoder   r?  r@  r   rÃ   r>  )r]   r  rG  rF  rE  s        r   r'  zCursorPagination.encode_cursorg  s£   € ð ˆØŒ=˜AÒÐÝ˜fœmÑ,Ô,ˆF�3‰KØŒ>ð 	ØˆF�3‰KØŒ?Ð&Ø œ/ˆF�3‰Kå”o f°DÐ9Ñ9Ô9ˆÝ˜K×.Ò.¨wÑ7Ô7Ñ8Ô8×?Ò?ÀÑHÔHˆÝ" 4¤=°$Ô2IÈ7ÑSÔSÐSr   c                 ó²   — |d                               d¦  «        }t          |t          ¦  «        r	||         }nt          ||¦  «        }t	          |¦  «        S )Nr   rI   )r  r3  Údictr2  r‹   )r]   Úinstancer  Ú
field_nameÚattrs        r   r  z,CursorPagination._get_position_from_instancew  sR   € Ø˜a”[×'Ò'¨Ñ,Ô,ˆ
Ý�h¥Ñ%Ô%ð 	1Ø˜JÔ'ˆDˆDå˜8 ZÑ0Ô0ˆDÝ�4‰yŒyÐr   c                 óp   — t          |                      ¦   «         |                      ¦   «         |dœ¦  «        S )N©rœ   r�   ro   )r   rž   rŸ   rc   s     r   re   z'CursorPagination.get_paginated_response  s?   € ÝØ×&Ò&Ñ(Ô(Ø×.Ò.Ñ0Ô0Øð
ð 
ñ ô ð 	r   c           	      ó�   — ddgdddd                      | j        ¬¦  «        dœdddd	                      | j        ¬¦  «        dœ|d
œdœS )Nr¡   ro   r§   Tr¨   zAhttp://api.example.org/accounts/?{cursor_query_param}=cD00ODY%3D")r>  r©   zBhttp://api.example.org/accounts/?{cursor_query_param}=cj0xJnA9NDg3rR  r«   )rŠ   r>  rh   s     r   rj   z.CursorPagination.get_paginated_response_schema†  s”   € àØ"˜ð %Ø $Ø#Øb×iÒiØ+/Ô+Bð  jñ  Dô  Dð	ð ð %Ø $Ø#Øc×jÒjØ+/Ô+Bð  kñ  Dô  Dð	ð ð "ðð ð
ð 
ð 	
r   c                 óT   — |                       ¦   «         |                      ¦   «         dœS )N)rÆ   rÇ   )rŸ   rž   rl   s    r   rÈ   z!CursorPagination.get_html_context�  s/   € à ×2Ò2Ñ4Ô4Ø×*Ò*Ñ,Ô,ð
ð 
ð 	
r   c                 ó†   — t          j        | j        ¦  «        }|                      ¦   «         }|                     |¦  «        S rg   rÊ   rÍ   s      r   rm   zCursorPagination.to_html£  rÏ   r   c                 óÎ  — t           €
J d¦   «         ‚t           �t          j        dt          ¦  «         t          €
J d¦   «         ‚t          j        | j        ddt	          j        dt          | j	        ¦  «        ¬¦  «        ¬¦  «        g}| j
        �V|                     t          j        | j
        ddt	          j        d	t          | j        ¦  «        ¬¦  «        ¬¦  «        ¦  «         |S )
Nrr   rs   rÑ   FrÒ   rR   rÔ   r×   rÚ   )r   rt   ru   r   r   rÛ   r>  ÚStringr
   Úcursor_query_descriptionr±   r@   rÜ   rÞ   rß   s      r   rw   z"CursorPagination.get_schema_fields¨  s  € ÝÐ"Ð"Ð$\Ñ"Ô"Ð"ÝÐÝŒMÐ_ÕawÑxÔxÐxÝÐ%Ð%Ð'bÑ%Ô%Ð%åŒMØÔ,ØØ Ý!Ô(Ø"Ý )¨$Ô*GÑ HÔ Hðñ ô ð	ñ ô ð

ˆð Ô%Ð1Ø�MŠMÝ”ØÔ3Ø"Ø$Ý%Ô-Ø)Ý$-¨dÔ.NÑ$OÔ$Oðñ ô ð	ñ ô ñ
ô 
ð 
ð ˆr   c                 óÀ   — | j         ddt          | j        ¦  «        ddidœg}| j        �4|                     | j        ddt          | j        ¦  «        ddidœ¦  «         |S )NFrÒ   r¥   r§   rã   r¢   )r>  r
   rX  r±   r@   rÞ   rå   s      r   ry   z0CursorPagination.get_schema_operation_parametersÆ  s’   € ð Ô/Ø!ØÝ(¨Ô)FÑGÔGà˜Hððð ð

ˆ
ð Ô%Ð1Ø×Òà Ô6Ø %Ø!Ý#,¨TÔ-MÑ#NÔ#Nà 	ððð ñ
ô 
ð 
ð Ðr   rg   )rz   r{   r|   rç   r>  rê   rX  r   rè   rŽ   rD  r  r�   r±   rÞ   rµ   rB  ra   r†   rž   rŸ   r  r  r'  r  re   rj   rÈ   rm   rw   ry   r!   r   r   r  r  G  sf  € € € € € ðð ð
 "ÐØ ˜qÐ!?Ñ@Ô@ÐØÔ&€IØ˜QÐ/Ñ0Ô0ÐØ€HØA€Hð !ÐØ"# !Ð$KÑ"LÔ"LÐð €Mð €MðKð Kð Kð KðZð ð ð3*ð 3*ð 3*ðj3*ð 3*ð 3*ðj(ð (ð (ðTIð Ið Ið2Tð Tð Tð ð ð ðð ð ð
ð 
ð 
ð.
ð 
ð 
ð(ð (ð (ð
ð ð ð<ð ð ð ð r   r  )FN)/rç   r²   rt   Úbase64r   r   Úcollectionsr   Úurllibr   Údjango.core.paginatorr   r   ré   Údjango.templater	   Údjango.utils.encodingr
   Údjango.utils.translationr   rê   Úrest_frameworkr   Úrest_framework.compatr   r   Úrest_framework.exceptionsr   Úrest_framework.responser   Úrest_framework.settingsr   Úrest_framework.utils.urlsr   r   r   r$   r7   rF   rQ   rR   r?   r>   rX   r   rì   r  r!   r   r   ú<module>rg     s›  ððð ð
 Ð Ð Ð Ø €€€Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø "Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð Ð Ð à -Ð -Ð -Ð -Ð -Ð -Ø >Ð >Ð >Ð >Ð >Ð >Ø "Ð "Ð "Ð "Ð "Ð "Ø +Ð +Ð +Ð +Ð +Ð +Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6à 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø .Ð .Ð .Ð .Ð .Ð .Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø MÐ MÐ MÐ MÐ MÐ MÐ MÐ Mð	ð 	ð 	ð 	ðð ð ð0ð 0ð 0ðfð ð ð(<ð <ð <ð 
ˆ�HÐ?Ð?Ð?Ñ	@Ô	@€Øˆ:�jÐ"LÐ"LÐ"LÑMÔM€àˆX˜$ t°uÀtÐLÑLÔL€
ðð ð ð ð ñ ô ð ð8Nð Nð Nð Nð N˜>ñ Nô Nð NðbOð Oð Oð Oð O˜Nñ Oô Oð OðdWð Wð Wð Wð W�~ñ Wô Wð Wð Wð Wr   