
    	]jp                        d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	 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 ddlmZmZ ddlm Z  ddl!m"Z" ddl#m$Z$m%Z%m&Z& ddl'm(Z( ddl)m*Z* ddl+m,Z,m-Z- ddl.m/Z/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8m9Z9m:Z: ddl;m<Z<m=Z=m>Z>m?Z?m@Z@  ej                  eB      ZC e d e&dgdd d! e$d"e"j                  d#d$%      gd& e%d'd(d)d*d+d,d-d./      id0d1gd2d3gd45      6       G d7 d8e,j                               ZF e d e& e$d9e"j                  d:d;%       e$d<e"j                  d:d=%       e$d>e"j                  d:d?%       e$d@d!d:dAB       e$d"e"j                  d#d$%      gdgdCdDj                  ej                  xs dEej                  xs dEej                  xs dE      d!d& e%dFdGdHd)dIdJ/      id0d1gdKd3gd4L      6       G dM dNe,j                               ZK e&d!O       G dP dQe,j                               ZL e&d!O       G dR dSe4             ZM e d e&dgdTdU e$d"e"j                  d#d$%      gd0d1gdVd3gd4W      6       e dX e&dgdYdZ e$d"e"j                  d#d$%      gd0d1gd[d3gd4W      6       G d\ d]e,j                                      ZO e d e&dgd^d_ e$d"e"j                  d#d$%       e$d`e"j                  d#da%      gd0d1gdd3gd4W      6       e db e&dgdcdd e$d"e"j                  d#d$%       e$d`e"j                  d#da%      gd0d1gdbd3gd4W      6       G de dfe,j                                      ZQ e d e&dgdgdh e$die"j                  d:dj%       e$d"e"j                  d#d$%       e$d`e"j                  d#da%      gdk e%dGd)dIdl/      id0d1gdmd3gd4n      6       G do dpe,j                               ZRddqZSdr ZT e dX e&dgdsdte< e$d"e"j                  d#d$%       e$d`e"j                  d#da%      gd& e%dudvd)idvdwidxdyz      id0d1gd{d3gd4|      6       G d} d~e,j                               ZVy)zThis file and its contents are licensed under the Apache License 2.0. Please see the included NOTICE for copyright information and LICENSE for a copy of the license.
    N)datetime)urlparseflag_set)all_permissions)start_job_async_or_sync)batch)extract_message)settings)File)FileSystemStorage)transaction)Prefetch)FileResponseHttpResponse)method_decorator)OpenApiTypes)OpenApiParameterOpenApiResponseextend_schema)Project)RangedFileResponse)genericsstatus)NotFoundValidationError)Response)APIView)Task   )ConvertedFormat
DataExportExport)ExportConvertSerializerExportCreateSerializerExportDataSerializerExportParamSerializerExportSerializergetr#   z[Deprecated] Get export formatsa  
        This endpoint is deprecated in Enterprise. Use the async export API instead:
        POST /api/projects/{{id}}/exports/ (see [Create new export](/api#operation/api_projects_exports_create)).

        In Label Studio Enterprise, this endpoint will always return a 404 Not Found response with instructions to use the async export API.

        Retrieve the available export formats for the current project by ID.Tidpathz0A unique integer value identifying this project.)nametypelocationdescription   zExport formatsarraystringzExport format)r-   titlezList of available formatszFormat list)r-   itemsr/   r3   )r/   responseprojectsexportslist_formatspublic)zx-fern-sdk-group-namezx-fern-sdk-method-namezx-fern-audiences)tagssummaryr/   
deprecated
parameters	responses
extensions)r,   	decoratorc                   0    e Zd Zej                  Zd Zd Zy)ExportFormatsListAPIc                 ~    t         j                  j                  | j                  j                  j
                        S Norganizationr   objectsfilterrequestuseractive_organizationselfs    F/root/env/lib/python3.12/site-packages/label_studio/data_export/api.pyget_querysetz!ExportFormatsListAPI.get_querysetU   *    %%4<<3D3D3X3X%YY    c                 b    | j                         }t        j                  |      }t        |      S )N)
get_objectr"   get_export_formatsr   )rN   rJ   argskwargsprojectformatss         rO   r)   zExportFormatsListAPI.getX   s)    //#//8  rR   N)__name__
__module____qualname__r   projects_viewpermission_requiredrP   r)    rR   rO   rB   rB   +   s    P *77Z!rR   rB   export_typequeryz(Selected export format (JSON by default)download_all_taskszZIf true, download all tasks regardless of status. If false, download only annotated tasks.download_resourcesz]If true, download all resource files such as images, audio, and others relevant to the tasks.idszHSpecify a list of task IDs to retrieve only the details for those tasks.)r,   manyr.   r/   z1[Deprecated] Easy export of tasks and annotationsa  
        This endpoint is deprecated in Enterprise. Use the async export API instead:
        POST /api/projects/{{id}}/exports/ (see [Create new export](/api#operation/api_projects_exports_create)).

        In Label Studio Enterprise, this endpoint will always return a 404 Not Found response with instructions to use the async export API.

        <i>Note: if you have a large project it's recommended to use
        export snapshots, this easy export endpoint might have timeouts.</i><br/><br>
        Export annotated tasks as a file in a specific format.
        For example, to export JSON annotations for a project to a file called `annotations.json`,
        run the following from the command line:
        ```bash
        curl -X GET {}/api/projects/{{id}}/export?exportType=JSON -H 'Authorization: Token abc123' --output 'annotations.json'
        ```
        To export all tasks, including skipped tasks and others without annotations, run the following from the command line:
        ```bash
        curl -X GET {}/api/projects/{{id}}/export?exportType=JSON&download_all_tasks=true -H 'Authorization: Token abc123' --output 'annotations.json'
        ```
        To export specific tasks with IDs of 123 and 345, run the following from the command line:
        ```bash
        curl -X GET '{}/api/projects/{{id}}/export?ids[]=123&ids[]=345' -H 'Authorization: Token abc123' --output 'annotations.json'
        ```
        zhttps://localhost:8080zExported datazExport filezExport file with resultsbinary)r3   r/   r-   formatdownload_sync)r=   r:   r;   r/   r<   r>   r?   c                   6    e Zd Zej                  Zd Zd Zd Zy)	ExportAPIc                 ~    t         j                  j                  | j                  j                  j
                        S rD   rG   rM   s    rO   rP   zExportAPI.get_queryset   rQ   rR   c                    ddl m} ddlm} |j                  j                         }t        | j                  dd       } |d|      r& |d|      rt        |d      r|j                         }|j                  d	      j                  t        d
|      d      } |d|      r& |d|      rt        |d      r|j                         }|S )Nr   r   )
AnnotationrK   *fflag_feat_fit_568_finite_state_management)rK   #fflag_feat_fit_710_fsm_state_fields
with_staterX   annotations)querysetpredictions)core.feature_flagsr   tasks.modelsrm   rH   allgetattrrJ   hasattrrp   select_relatedprefetch_relatedr   )rN   rr   r   rm   annotations_qsrK   qss          rO   get_task_querysetzExportAPI.get_task_queryset   s    /+ $++//1 t||VT2AM>TJ5+668N$$Y/@@]^<m
 AM>TJL)B	rR   c           
      J   | j                         }t        |j                        }|j                  d       |j                  j                  d      xs |j                  d   }|j                  d    }|j                  d   }|j                  d   }	|j                  j                  d	      }
t        j                  d
       t        j                  j                  |      }|
rBt        |
      dkD  r4t        j                  dt        |
       d       |j                  |
      }|r |j                  d      j                         }|j                  dd      }t        j                  d       g }t        |d      D ]@  }|t!        | j#                  |j                  |            ddgd|	i      j$                  z  }B t        j                  d       t'        j(                  |||||j                  |j+                  d            \  }}}t-        |d||      }||d<   |S )N)dataTraise_exception
exportTyper`   rb   rc   interpolate_key_frameszids[]z	Get tasksrX   r   zSelect only subset of z tasks)id__inF)annotations__isnullr*   )flatzSerialize tasks for exporti  drafts)re   expandcontextzPrepare export files/)hostname)as_attachmentcontent_typefilenamer   )rT   r'   GETis_validvalidated_datar)   getlistloggerdebugr   rH   rI   lendistinctvalues_listr	   r&   r}   r   r"   generate_export_filebuild_absolute_urir   )rN   rJ   rV   rW   rX   query_serializerr`   only_finishedrc   r   	tasks_idsra   task_idstasks	_task_idsexport_filer   r   rs                      rO   r)   zExportAPI.get   s   //#0gkkB!!$!7 ++//=oAQA`A`anAo 	 -;;<PQQ-<<=QR!1!@!@AY!ZKK''0	[!##G#4Y!+LL1#i.1AHILL	L2ELLUL;DDFE$$T$512x. 	I)&&u||9|'EF z13IJ	
 dE	 	+,.8.M.MUK);W[[SZSmSmnqSr/
+\8 D|^fg *rR   N)	rZ   r[   r\   r   projects_changer^   rP   r}   r)   r_   rR   rO   rj   rj   ^   s!    h *99Z<)rR   rj   )excludec                   0    e Zd Zej                  Zd Zd Zy)ProjectExportFilesc                 ~    t         j                  j                  | j                  j                  j
                        S rD   rG   rM   s    rO   rP   zProjectExportFiles.get_queryset  rQ   rR   c                    | j                          g }t        j                  t        j                        D ]n  }|j                  d      s|j                  d      r'|j                  d      d   }t        |d         |k(  sM|j                  t        j                  |z          p t        |      d d d   D cg c]+  }|j                  d      d   j                  d	      d   |d
- }}t        d|it        j                        S c c}w )Nz.jsonz
-info.json-r   pkr      .)r,   urlexport_filesr   )rT   oslistdirr   
EXPORT_DIRendswithsplitstrappendEXPORT_URL_ROOTsortedr   r   HTTP_200_OK)	rN   rJ   rV   rW   pathsr,   
project_idpr4   s	            rO   r)   zProjectExportFiles.get  s    JJx223 	BD}}W%dmmL.I!ZZ_Q/
vd|$
2LL!9!9D!@A		B MSSXMZ^\^Z^L_`q!''#,q///4Q7B``/8J8JKK as   :0D	N)rZ   r[   r\   r   r   r^   rP   r)   r_   rR   rO   r   r     s    )99ZLrR   r   c                   4    e Zd ZdZdgZej                  Zd Zy)ProjectExportFilesAuthCheckz5Check auth for nginx auth_request (/api/auth/export/)r)   c                    |j                   d   }|j                  dd      }|j                  d      d   }	 t        |      }t        j                  t        j                  j                  | j                  j                  j                  	      |
       t        ddit        j                         S # t        $ r  t        ddit        j                        cY S w xY w)zGet export files listHTTP_X_ORIGINAL_URIz/export/ r   r   detailzIncorrect filename in exportr   rE   r   zauth ok)METAreplacer   int
ValueErrorr   r   HTTP_422_UNPROCESSABLE_ENTITYr   get_object_or_404r   rH   rI   rJ   rK   rL   r   )rN   rJ   rV   rW   original_urlr   r   r   s           rO   r)   zProjectExportFilesAuthCheck.get)  s    ||$9:''
B7^^C(+
	uZB 	""7??#9#9t||GXGXGlGl#9#mrtu9-f6H6HII	  	uX'EFvOsOstt	us   B2 2&CCN)	rZ   r[   r\   __doc__http_method_namesr   r   r^   r)   r_   rR   rO   r   r   "  s    ?)99JrR   r   zList all export snapshotsz>Returns a list of exported files for a specific project by ID.list)r:   r;   r/   r=   r?   postzCreate new export snapshotzpCreate a new export request to start a background task and generate an export file for a specific project by ID.createc                        e Zd Zej                  j                         j                  d      ZeZ	e
Zej                  Z fdZ fdZd Zd Z fdZ fdZ xZS )ExportListAPI-created_atc                     | j                   j                  dk(  rt        S | j                   j                  dk(  rt        S t        |          S )Nr   POST)rJ   methodr(   r%   superget_serializer_class)rN   	__class__s    rO   r   z"ExportListAPI.get_serializer_classg  sA    <<%'##<<&())w+--rR   c                 ^    t         t        |          }| j                  j                  |d<   |S )NrK   )r   r   get_serializer_contextrJ   rK   )rN   r   r   s     rO   r   z$ExportListAPI.get_serializer_contextn  s*    tCE,,++rR   c                     | j                   j                  d      }t        j                  | j                  j
                  j                  | j                  j                        |      }|S Nr   r   	rW   r)   r   r   project_modelrH   for_userrJ   rK   rN   
project_pkrX   s      rO   _get_projectzExportListAPI._get_projects  R    [[__T*
,,&&//0A0AB
 rR   c                 T   |j                   j                  d      }|j                   j                  d      }|j                   j                  d      }| j                         }|j                  || j                  j
                         |j                  }|j                  |||       y )Ntask_filter_optionsannotation_filter_optionsserialization_options)rX   
created_by)r   r   r   )r   popr   saverJ   rK   instancerun_file_exporting)rN   
serializerr   r   r   rX   r   s          rO   perform_createzExportListAPI.perform_create{  s    (77;;<QR$.$=$=$A$AB]$^! * 9 9 = =>U V##%DLL4E4EF&&## 3&?"7 	$ 	
rR   c                 `    | j                         }t        | 	         j                  |      S Nr   r   r   rP   rI   rN   rX   r   s     rO   rP   zExportListAPI.get_queryset  -    ##%w#%,,W,==rR   c                 J    t         |   |      }|j                  d      d d S )Nr   d   )r   filter_querysetorder_by)rN   rr   r   s     rO   r   zExportListAPI.filter_queryset  s*    7*84  /55rR   )rZ   r[   r\   r#   rH   rv   r   rr   r   r   r(   serializer_classr   r   r^   r   r   r   r   rP   r   __classcell__r   s   @rO   r   r   7  s]    V ~~!!#,,];HM')99.

>6 6rR   r   zGet export snapshot by IDzNRetrieve information about an export file by export ID for a specific project.	export_pkz(Primary key identifying the export file.deletezDelete export snapshotz-Delete an export file by specified export ID.c                        e Zd Zej                  j                         ZeZe	Z
dZej                  Z fdZd Z fdZ xZS )ExportDetailAPIr   c           	         t        d      rr	 | j                         }|j                  j                          |j                  j                         D ])  }|j                  s|j                  j                          + 	 t        |   |i |S # t        $ r3}t        t        j                  ddt        |      z  i      cY d }~S d }~ww xY w)NDff_back_dev_4664_remove_storage_file_on_export_delete_29032023_shortr   z\Could not delete file from storage. Check that your user has permissions to delete files: %s)r   r   )r   rT   filer   converted_formatsrv   	Exceptionr   r   HTTP_500_INTERNAL_SERVER_ERRORr
   r   )rN   rV   rW   exportconverted_formater   s         rO   r   zExportDetailAPI.delete  s    Z[*""$(.(@(@(D(D(F 7$',,(--4467 w~t.v..  !@@   #A)!,#- s$   AB "B 	C
(C?C
C
c                     | j                   j                  d      }t        j                  | j                  j
                  j                  | j                  j                        |      }|S r   r   r   s      rO   r   zExportDetailAPI._get_project  r   rR   c                 `    | j                         }t        | 	         j                  |      S r   r   r   s     rO   rP   zExportDetailAPI.get_queryset  r   rR   )rZ   r[   r\   r#   rH   rv   rr   r   r   r(   r   lookup_url_kwargr   r   r^   r   r   rP   r   r   s   @rO   r   r     sI    n ~~!!#HM'")99/(> >rR   r   z4Download export snapshot as file in specified formata  
        Download an export file in the specified format for a specific project. Specify the project ID with the `id`
        parameter in the path and the ID of the export file you want to download using the `export_pk` parameter
        in the path.

        Get the `export_pk` from the response of the request to [Create new export](/api#operation/api_projects_exports_create)
        or after [listing export files](/api#operation/api_projects_exports_list).
        r   zSelected export format)r0   zapplication/*)r-   rg   download)r:   r;   r/   r=   r>   r?   c                        e Zd Zej                  j                         ZeZdZ	dZ
ej                  Zd Z fdZd Z xZS )ExportDownloadAPINr   c                     | j                   j                  d      }t        j                  | j                  j
                  j                  | j                  j                        |      }|S r   r   r   s      rO   r   zExportDownloadAPI._get_project*  r   rR   c                 `    | j                         }t        | 	         j                  |      S r   r   r   s     rO   rP   zExportDownloadAPI.get_queryset2  r   rR   c                    | j                         }|j                  j                  d      }|j                  t        j
                  j                  k7  rt        dd      S t        d|j                        r|j                  }|K|dk7  rF|j                  j                  |      j                         }|t        | d      |j                  }t        |j                   t"              r&|j                   j%                  |j&                        }n'|j                   j%                  |j&                  d	
      }t)        |      j*                  }	t,        j.                  ryt               }
d|	z   dz   |j1                  |	dz   d      z   }||
d<   dj3                  |j&                        |
d<   t4        j6                  j9                  |j&                        |
d<   |
S |j&                  j;                  d      d   }t=        ||d|       }
d|j&                   d|
d<   t4        j6                  j9                  |j&                        |
d<   |
S ||j                  }n|j?                  |      }|t        dd      S |j&                  j;                  d      d   }t=        ||d|       }
d|j&                   d|
d<   |j&                  |
d<   |
S )Nr   zExport is not completedi  r   >fflag_fix_all_lsdv_4813_async_export_conversion_22032023_shortJSON)r`   z format is not converted yetT)storage_urlz/file_download/r   z://r   zX-Accel-Redirectzattachment; filename="{}"zContent-Dispositionr   r   r   zapplication/)r   zattachment; filename=""zCan't get file) rT   r   r)   r   r#   Status	COMPLETEDr   r   rK   r  r  rI   firstr   
isinstancestorager   r   r,   r   schemer   USE_NGINX_FOR_EXPORT_DOWNLOADSr   rg   r   r+   basenamer   r   convert_file)rN   rJ   rV   rW   snapshotr`   r  converted_filer   protocolr5   redirectextfile_s                 rO   r)   zExportDownloadAPI.get6  s   ??$kkool3??fmm555 9#FFTV]VbVbc==D&;&+@!)!;!;!B!B{!B![!a!a!c!)"k]2N#OPP%**$,,(9:ll&&tyy1ll&&tyyd&C}++H 66'>,x7#=HW\L\^`@aa/7+,2M2T2TUYU^U^2_./')ww'7'7		'B$ iiooc*2.-gtLY\X]J^_4J499+UV2W./')ww'7'7		'B$"  --k:}#$4SAA**""3'+C)'5VYUZG[\H0FuzzlRS.TH*+#(::HZ OrR   )rZ   r[   r\   r#   rH   rv   rr   r   r   r   r  r   r   r^   r   rP   r)   r   r   s   @rO   r  r    sD    d ~~!!#HM")99>5rR   r  c                 J   t        j                         5  	 t        j                  j	                  |       }|j                  t        j                  j                  k7  r:t        j                  d|j                  j                   d| d       	 d d d        y t        j                  j                  |_        |j                  dg       d d d        j                  }|j                  |||	      }|t!        d
      t#        j$                  |      }	|j&                  j)                  d      d   }
t+        j,                         }d|j                   d|j/                  d       d|	dd  d|
 }|j                   d| }t1        ||      }|j2                  j                  ||       t        j                  j4                  |_        |j                  ddg       y # t        j
                  $ r$ t        j                  d|  d       Y d d d        y w xY w# 1 sw Y   PxY w)Nr*   zConvertedFormat with id z not found, conversion failedzConversion for export id z to  already startedr   )update_fields)rc   r   zQNo converted file found, probably there are no annotations in the export snapshotr   r   zproject-z-at-z%Y-%m-%d-%H-%Mr   r      r   )r,   r  )r   atomicr!   rH   r)   DoesNotExistr   errorr   r  CREATEDr  r*   IN_PROGRESSr   r  r   r#   eval_md5r,   r   r   nowstrftimer   r  r  )converted_format_idr`   rX   r   rc   rW   r  r  r   md5r#  r0  	file_name	file_pathr$  s                  rO   async_convertr6  n  s   				 
8	.66::>Q:R ""o&<&<&D&DDLL45E5L5L5O5O4PPTU`Taaqrs
8 
8 #2"8"8"D"DXJ7
8  &&H**;K]hp*qNqrr
//.
)C



#
#C
(
,C
,,.C7::,d3<<8H+I*J!CPQRSH:UVWZV[\I::,a	{+Ii0Ey%0-44>>(:;- ++ 	LL34G3HHefg
8 
8	
8 
8s4   H GAH2H,H
HHHH"c                    ddl m} | j                  d   }	 dj                  t	        j
                  |||            }|j                  j                  |      j                  t        j                  j                  |       y # t        $ r=}t        d      r&t        j                  d| d|d|d|d	|
d
       d}Y d }~d }~ww xY w)Nr   )r!   r   Nfflag_fix_back_leap_1818_set_convert_background_failure_logging_02062025_shortz Failed to format traceback: job=z type=z value=z traceback_obj=z e=T)exc_infoz<Exception while processing traceback. See stderr for detailsr&  )r   	traceback)data_export.modelsr!   rV   jointbformat_exceptionr  r   r   r,  rH   rI   updater#   r  FAILED)	job
connectionr-   valuetraceback_objr!   
convert_idtracer  s	            rO   set_convert_background_failurerG    s    2!JO++D%GH
 ""j"188@T@T`e8f	  OdeLL<vWtgXuhN^P]O__cab`deptLuNOs   &B 	C	3CC	zExport conversionz*Convert export snapshot to selected formatobjectr-   integerr`   r  )r-   
properties)r5   convert)r:   r;   r/   rJ   r=   r>   r?   c                   b    e Zd Zej                  j                         ZdZej                  Z
d Zy)ExportConvertAPIr   c           	      D   | j                         }t        |j                  d|j                  i      }|j	                  d       |j
                  d   }|j
                  j                  d      }t        j                  j                  t        j                  j                        j                  ||      \  }}	|	st        d	| d
      t        t        |j                   ||j                  |j#                  d      |t$               t'        ||j                   d      S )NrX   )r   r   Tr   r`   rc   r   )r  r`   zConversion to r'  r   )rc   
on_failurerJ  )rT   r$   r   rX   r   r   r)   r!   rH   r   r  r@  get_or_creater   r   r6  r*   r   rG  r   )
rN   rJ   rV   rW   r  r   r`   rc   r  createds
             rO   r   zExportConvertAPI.post  s   ??$,',,T\TdTdHef
D1 //>'66::;OP$3$;$;$C$C"))00 %D %

-x[-
A 	"' !N;-?O"PQQ&&s+15	
 IYI\I\]^^rR   N)rZ   r[   r\   r#   rH   rv   rr   r  r   r   r^   r   r_   rR   rO   rN  rN    s/    P ~~!!#H")99_rR   rN  )F)Wr   loggingr   r:  r=  r   urllib.parser   rt   r   core.permissionsr   
core.redisr   core.utils.commonr	   core.utils.exceptionsr
   django.confr   django.core.filesr   django.core.files.storager   	django.dbr   django.db.modelsr   django.httpr   r   django.utils.decoratorsr   drf_spectacular.typesr   drf_spectacular.utilsr   r   r   projects.modelsr   ranged_fileresponser   rest_frameworkr   r   rest_framework.exceptionsr   r   rest_framework.responser   rest_framework.viewsr   ru   r   modelsr!   r"   r#   serializersr$   r%   r&   r'   r(   	getLoggerrZ   r   INTRetrieveAPIViewrB   STRBOOLrg   HOSTNAMErj   r   r   ListCreateAPIViewr   RetrieveDestroyAPIViewr   r  r6  rG  CreateAPIViewrN  r_   rR   rO   <module>rs     s=    	   ! ' , . # 1   " 7 ! % 2 4 . R R # 2 + ? , (  7 7  
		8	$ 	Z1P !%%N	
 ,#&.I#>*	

 '1)%<&4!)

=#&N	!833 	!O&N	! 	"!%% F	 )!&& x	 )!&& {	  f	 !%%N	3
@ ZC, F9!99!99!9

 +*#=$&	

 '1)%<&5!)

UORfM(( MgRfMv tL11 L L* tJ' J J( 	Z+T!%%N	
 '1)%<&,!)

* 	Z, G!%%N	
 '1)%<&.!)

*06H.. 06++T06f 	Z+d!%%N	  !%%F	
 '1)%<&+!)

%6 	Z(C!%%N	  !%%F	
 '1)%<&.!)

%6%>h55 %>77l%>P 	ZF !!%% 4	 !%%N	  !%%F	
* #O)$&%
 '1)%<&0!)

Q-0bH00 Hc0bHV<:
g 	Z#@'!%%N	  !%%F	
 $(.'9-3Y,?#

 '1)%<&/!)

=#&N_x-- _O&N_rR   