� c��j�r���dZddgZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl mZddlZdZGd�d�Zd �Zd �ZGd �d�Zd �Zd �Zdd�Zd�ZGd�d�Zd�Zedk(re�yy)a�program/module to trace Python program or function execution Sample use, command line: trace.py -c -f counts --ignore-dir '$prefix' spam.py eggs trace.py -t --ignore-dir '$prefix' spam.py eggs trace.py --trackcalls spam.py eggs Sample use, programmatically import sys # create a Trace object, telling it what to ignore, and whether to # do tracing or line-counting or both. tracer = trace.Trace(ignoredirs=[sys.base_prefix, sys.base_exec_prefix,], trace=0, count=1) # run the new command using the given tracer tracer.run('main()') # make a report, placing output in /tmp r = tracer.results() r.write_results(show_missing=True, coverdir="/tmp") �Trace�CoverageResults�N)� monotonicz#pragma NO COVERc��eZdZdd�Zd�Zy)�_IgnoreNc���|s t�n t|�|_|sgn,|D�cgc]!}tjj |���#c}|_ddi|_ycc}w)Nz�)�set�_mods�os�path�normpath�_dirs�_ignore)�self�modules�dirs�ds �/usr/lib64/python3.12/trace.py�__init__z_Ignore.__init__FsW��")�S�U�s�7�|�� �#�R�37�*9�37�a�+-�'�'�*:�*:�1�*=�37�*9�� �#�Q�(�� ��*9s�&Ac��||jvr|j|S||jvrd|j|<y|jD]'}|j|dz�s�d|j|<y|�d|j|<y|jD]5}|j|tj z�s�&d|j|<yd|j|<y)Nr �.r)rr � startswithrr �sep)r�filename� modulename�modrs r�namesz _Ignore.namesLs��� ���� %��<�<� �+� +� ���� #�'(�D�L�L�� $���:�:�C��$�$�S�3�Y�/�+,�� � �Z�(�� � � �'(�D�L�L�� $�����A��"�"�1�r�v�v�:�.�+,�� � �Z�(���$%�� � �Z� ���NN)�__name__� __module__� __qualname__rr�rrrrEs ��)� )rrc��tjj|�}tjj|�\}}|S)�,Return a plausible module name for the path.)r r �basename�splitext)r �baser�exts r�_modnamer+ws5�� �7�7� � �D� !�D��G�G�$�$�T�*�M�H�c� �Orc��tjj|�}d}tjD]m}tjj|�}|j |�s�4|t |�tj k(s�Tt |�t |�kDs�l|}�o|r|t |�dzd}n|}tjj|�\}}|jtj d�}tjr |jtjd�}tjj|�\}}|jd�S)r&�r Nr) r r �normcase�sysr�lenr� splitdrive�replace�altsepr(�lstrip)r � comparepath�longest�dirr)�driverr*s r� _fullmodnamer9~s���'�'�"�"�4�(�K��G��x�x���g�g���s�#�� � !� !�#� &�;�s�3�x�+@�B�F�F�+J��3�x�#�g�,�&��� � ��C��L�1�$�%�&�����'�'�$�$�T�*�K�E�4� �<�<����� $�D� �y�y��|�|�B�I�I�s�+���G�G�$�$�T�*�M�H�c� �?�?�3� �rc�4�eZdZ dd�Zd�Zd�Zdd�Zd d�Zy) rNc���||_|j�i|_|jj�|_||_|j�i|_|jj�|_||_|j�i|_|jj�|_||_||_|j r] t|j d�5}tj|�\}}}ddd�|j|j|||���yy#1swY�.xYw#tttf$r5}td|j �d|��t j"��Yd}~yd}~wwxYw)N�rb)�callerszSkipping counts file �: ��file)�counts�copy�counter� calledfuncsr=�infile�outfile�open�pickle�load�update� __class__�OSError�EOFError� ValueError�printr/�stderr)rrArDrEr=rF�f�errs rrzCoverageResults.__init__�s8���� � �;�;� ��D�K��{�{�'�'�)�� �&��� � � � #�!�D� ��+�+�0�0�2����� � �<�<� ��D�L��|�|�(�(�*�� ��� ��� � �;�;� N��$�+�+�t�,��39�;�;�q�>�0�F�K��-�� � �D�N�N�6�;��N�P�Q� �-�,���X�z�2� N��)-���c�;�BE�*�*�N�N�� N�s0�D0�D$�7+D0�$D-�)D0�0E9�+E4�4E9c�J�|jd�xr|jd�S)z_Return True if the filename does not refer to a file we want to have reported. �<�>)r�endswith)rrs r�is_ignored_filenamez#CoverageResults.is_ignored_filename�s%���"�"�3�'�B�H�,=�,=�c�,B�Brc��|j}|j}|j}|j}|j}|j}|D]}|j|d�||z||<�|D]}d||<� |D]}d||<� y)z.Merge in the data from another CoverageResultsrr N)rArDr=�get) r�otherrArDr=� other_counts�other_calledfuncs� other_callers�keys rrJzCoverageResults.update�s��������&�&� ��,�,���|�|� �!�-�-��� � � ��C� �*�*�S�!�,�|�C�/@�@�F�3�K� �%�C� �K�� �%�!�C��G�C�L�!rc ��|jrIt�td�|j}t|�D]\}}}td|�d|�d|����|jr�t�td�dx}} t|j�D]\\\} } } \} }}| |k7rt�td| d�| }d} | | k7r| | k7rtd| �| } td | �d | �d |�d |����^i}|jD]0\}}|j |i�x}||<|j||f||<�2i}|j �D�]U\}}|j|�r�|jd �r|d d}|�Htjjtjj|��}t|�}n$|}tj|d��t|�}|r t!|�}ni}t#j$|�}tjj'||dz�}t)|d�5}t+j,|j.�\}}d d d �|j1||||�\}}|s��8|s����Yd }!~!y d }!~!wwxYw)af Write the coverage results. :param show_missing: Show lines that had no hits. :param summary: Include coverage summary per module. :param coverdir: If None, the results of each module are placed in its directory, otherwise it is included in the directory specified. zfunctions called:z filename: z, modulename: � , funcname: zcalling relationships:r-z***z -->z rz -> z.pycN�����T)�exist_okz.coverr<�dzlines cov% module (path)z%5d %3d%% %s (%s)�wbr z"Can't save counts files because %sr?) rDrO�sortedr=rArY�itemsrWrVr r �dirname�abspathr+�makedirsr9�_find_executable_linenos� linecache�getlines�joinrG�tokenize�detect_encoding�readline�write_results_file�intrFrH�dumprLr/rP)"r� show_missing�summary�coverdir�callsrr�funcname�lastfile� lastcfile�pfile�pmod�pfunc�cfile�cmod�cfunc�per_file�lineno� lines_hit�sums�countr7�lnotab�source� coverpath�fp�encoding�_�n_hits�n_lines�percent�mrQrRs" r� write_resultszCoverageResults.write_results�sL�� � � � �G� �%� &��$�$�E�28��-�.��*�h��"�J��:�<�3@� �<�<� �G� �*� +�#%� %�H�y��d�l�l�+�=�%�%��u�';��t�U��H�$��G��%���.�$�H� "�I��E�>�i�5�&8��'�5�)� %�I��d�E�4��G�H�,��� $� � � �H�f�-5�\�\�(�B�-G� G�I���*� $� � �X�v�,>� ?�I�f� �!,� ��'�~�~�/�O�H�e��'�'��1��� � ��(�#�C�R�=�����g�g�o�o�b�g�g�o�o�h�&?�@��%�h�/� ���� � �C�$�/�)�(�3� ��1�(�;�����'�'��1�F���� � �S�*�x�*?�@�I��h��%��&�6�6�r�{�{�C� ��!�&�"�5�5�i��6<�e�X�O�O�F�G��7��c�F�l�W�4�5��#*�G�Z��#I��Z� �; 0�@ �t� �2� 3��D�\��9=�a��6���*�h��/�$�q�'�9�:�"� �<�<� S��$�,�,��-���K�K����d�.>�.>�� � � M� !�1�&�.�-� �&�%��$.�-��� S��:�S�@�s�z�z�R�R�� S�sB�3#L;�"M�89M�1M�;M �M� M�M� N�M?�?Nc��� t|d|��}d }d } |5t |d �D]\} } | |vr"|j d || z�| d z } |d z }n4| |vrt| vr|j d �|d z }n|j d �|j | jd���� ddd�| |fS#t$r,}td|�d|�d�tj��Yd}~yd}~wwxYw#1swY| |fSxYw)z'Return a coverage results file in path.�w�r�ztrace: Could not open z for writing: z - skippingr?N)rrrr z%5d: z>>>>>> z �) rGrLrOr/rP� enumerate�write�PRAGMA_NOCOVER� expandtabs) rr �linesr�r�r�rFrRr�r�r��lines rrqz"CoverageResults.write_results_file(s�� ��4��x�8�G� ���� � )�%�� 3� ����Y�&��M�M�'�I�f�,=�"=�>��a�K�F��q�L�G��v�%�n��.D��M�M�)�,��q�L�G��M�M�)�,�� � �d�o�o�a�0�1�!4��"�w����1� � �26��=�DG�J�J� P��� ���"�w���s#�B2�BC*�2 C'�;"C"�"C'�*C6)NNNNN)TFN�N)r!r"r#rrWrJr�rqr$rrrr�s&��=A�'+�N�4C� �$YS�vrc�X�i}tj|�D]\}}||vs� d||<�|S)z:Return dict where keys are lines in the line number table.r )�dis�findlinestarts)�code�strs�linenosr�r�s r�_find_lines_from_coder�Hs8���G��'�'��-� ��6� �� ��G�F�O�.� �Nrc��t||�}|jD]3}tj|�s�|j t ||���5|S)z�>�!� � �N�N�;�q�$�/� 0�� �Nrc�`�i}tj}t||��5}tj|j �}|D]S\}}}} } |tj k(r6|tjk(r#|\} } | \} }t| | dz�D]}d||<� |}�U ddd�|S#1swY|SxYw)z�Return a dict of possible docstring positions. The dict maps line numbers to strings. There is an entry for line that contains only a string or a part of a triple-quoted string. r�r N)�token�INDENTrGrn�generate_tokensrp�STRING�range)rr�r� prev_ttyperQ�tok�ttype�tstr�start�endr��sline�scol�eline�ecol�is r� _find_stringsr�^s��� �A����J� �h�� *�a��&�&�q�z�z�2��-0� )�E�4���T��� � �$�����-�"'�K�E�4�"%�K�E�4�"�5�%�!�)�4�� ��!��5��J�.1� +� �H� +� �H�s �A8B#�#B-c�L� tj|�5}|j�}|j}ddd�t|d�}t|�}t||�S#1swY�.xYw#t$r-}t d|�d|��t j��icYd}~Sd}~wwxYw)zAReturn dict where keys are line numbers in the line number table.NzNot printing coverage data for r>r?�exec) rnrG�readr�rLrOr/rP�compiler�r�)rrQ�progr�rRr�r�s rrjrjus���� �]�]�8� $���6�6�8�D��z�z�H�%� �4��6� *�D� ��8� ,�D� �t�T� "�"�%� $�� �� �!)�3�0�7:�z�z� C�� ���s3�A-�A!�A-�!A*�&A-�- B#�6"B�B#�B#c�^�eZdZ dd�Zd�Zdd�Zd�Zd�Zd�Zd�Z d �Z d �Z d �Z d �Z d �Zy)rNc ��||_||_t||�|_i|_i|_d|_||_i|_i|_ i|_ d|_ | rt�|_ |r|j|_y|r|j|_y|r%|r#|j |_|j"|_y|r#|j |_|j&|_y|r#|j |_|j(|_yd|_y)ax @param count true iff it should count number of times each line is executed @param trace true iff it should print out each line that is being counted @param countfuncs true iff it should just output a list of (filename, modulename, funcname,) for functions that were called at least once; This overrides `count' and `trace' @param ignoremods a list of the names of modules to ignore @param ignoredirs a list of the names of directories to ignore all of the (recursive) contents of @param infile file from which to read stored counts to be added into the results @param outfile file in which to write the results @param timing true iff timing information be displayed rNr )rErFr�ignorerA�pathtobasename� donothing�trace� _calledfuncs�_callers� _caller_cache� start_time�_time�globaltrace_trackcallers� globaltrace�globaltrace_countfuncs�globaltrace_lt�localtrace_trace_and_count� localtrace�localtrace_trace�localtrace_count) rr�r�� countfuncs� countcallers� ignoremods� ignoredirsrErF�timings rrzTrace.__init__�s���(�� ��� ��j�*�5�� ��� � �������� ������ ������� �#�g�D�O� �#�<�<�D� � �#�:�:�D� � �u�#�2�2�D� �"�=�=�D�O� �#�2�2�D� �"�3�3�D�O� �#�2�2�D� �"�3�3�D�O��D�Nrc�J�ddl}|j}|j|||�y)Nr)�__main__�__dict__�runctx)r�cmdr��dicts r�runz Trace.run�s ���� � �� � � �C��t�$rc��|�i}|�i}|js>tj|j�t j|j� t |||�|js+t jd�tjd�yy#|js+t jd�tjd�wwxYwr�)r�� threading�settracer�r/r�)rr��globals�localss rr�z Trace.runctx�s��� �?�b�G� �>�B�6��~�~� � � �t�/�/� 0� �L�L��)�)� *� )� ��g�v� &��>�>�� � �T�"��"�"�4�(�"��4�>�>�� � �T�"��"�"�4�(�"�s � B�9Cc��d}|jstj|j� ||i|��}|jstjd�|S#|jstjd�wwxYwr�)r�r/r�r�)r�func�args�kw�results r�runfuncz Trace.runfunc�sh�����~�~� �L�L��)�)� *� #��4�&�2�&�F��>�>�� � �T�"�� ���>�>�� � �T�"�"�s �A�$A>c���|j}|j}|r t|�}nd}|j}d}||jvr |j|��|j|}n�d|j|<t j |�D�cgc]}tj|�r|��}}t|�dk(r�t j |d�D� cgc]} t| t�r| ��} } t| �dk(r]t j | d�D� cgc]} t| d�r| ��} } t| �dk(r| dj}||j|<|�|�d|��}|||fScc}wcc} wcc} w)Nr r� __bases__r)�f_code� co_filenamer+�co_namer��gc� get_referrersr�� isfunctionr0� isinstancer��hasattrr!) r�framer�rrrx�clsnamerQ�funcsr�dictsr��classess r�file_module_function_ofzTrace.file_module_function_of�s����|�|���#�#�� �!�(�+�J��J��<�<���� �4�%�%� %��!�!�$�'�3��,�,�T�2��'+�D� � �t� $�!#� 0� 0�� 6�3� 6�1�#�.�.�q�1�� 6�E�3� �5�z�Q��$&�$4�$4�U�1�X�$>�5�$>�q� *�1�d� 3��$>��5��u�:��?�*,�*:�*:�5��8�*D�?�*D�Q�&-�a��&=� !�*D�G�?��7�|�q�(�")�!�*�"5�"5�� 4;��*�*�4�0� � �")�8�4�H���X�-�-��-3�� 5��?s� E'�E,�E1c��|dk(r>|j|�}|j|j�}d|j||f<yy)zkHandler for call events. Adds information about who called who to the self._callers dict. �callr N)r��f_backr�)rr��why�arg� this_func� parent_funcs rr�zTrace.globaltrace_trackcallers�sG�� �&�=��4�4�U�;�I��6�6�u�|�|�D�K�67�D�M�M�;� �2� 3� rc�P�|dk(r!|j|�}d|j|<yy)zoHandler for call events. Adds (filename, modulename, funcname) to the self._calledfuncs dict. r�r N)r�r�)rr�r�r�r�s rr�zTrace.globaltrace_countfuncss0�� �&�=��4�4�U�;�I�+,�D� � �i� (� rc�$�|dk(r�|j}|jjdd�}|r`t|�}|�R|jj ||�}|s3|j rtd|�d|j���|jSyyyy)z�Handler for call events. If the code block being entered is to be ignored, returns `None', else returns self.localtrace. r��__file__Nz --- modulename: r`) r�� f_globalsrYr+r�rr�rOr�r�)rr�r�r�r�rr� ignore_its rr�zTrace.globaltrace_lts��� �&�=��<�<�D����*�*�:�t�<�H��&�h�/� ��)� $� � � 1� 1�(�J� G�I�$��:�:�!�&0�$�,�,�$@�B�#���.� %�*�� rc��|dk(r�|jj}|j}||f}|jj |d�dz|j|<|j r%t dt�|j z zd��tjj|�}tj||�}t d||fzd��|rt d |d��|jSt �|jS) Nr�rr �%.2f� �r��%s(%d)r-r>)r�r��f_linenorArYr�rOr�r r r'rk�getliner�) rr�r�r�rr�r^�bnamer�s rr�z Trace.localtrace_trace_and_count's��� �&�=��|�|�/�/�H��^�^�F��F�"�C�#�{�{���s�A�6��:�D�K�K�� �����f���$�/�/� 9�:��D��G�G�$�$�X�.�E��$�$�X�v�6�D� �(�e�V�_�,�"� 5���d�D�b�)����������rc��|dk(r�|jj}|j}|jr%t dt �|jz zd��t jj|�}tj||�}t d||fzd��|rt d|d��|jSt �|jS)Nr�rrr r r-r>) r�r�r r�rOr�r r r'rkr r�)rr�r�r�rr�r r�s rr�zTrace.localtrace_trace:s��� �&�=��|�|�/�/�H��^�^�F�����f���$�/�/� 9�:��D��G�G�$�$�X�.�E��$�$�X�v�6�D� �(�e�V�_�,�"� 5���d�D�b�)����������rc���|dk(rR|jj}|j}||f}|jj |d�dz|j|<|j S)Nr�rr )r�r�r rArYr�)rr�r�r�rr�r^s rr�zTrace.localtrace_countKsW�� �&�=��|�|�/�/�H��^�^�F��F�"�C�#�{�{���s�A�6��:�D�K�K�� ����rc��t|j|j|j|j|j ��S)N)rErFrDr=)rrArErFr�r�)rs r�resultsz Trace.resultsSs2���t�{�{�4�;�;�'+�|�|�+/�+<�+<�'+�}�}�6� 6r) r r rrr$r$NNFr )r!r"r#rr�r�r�r�r�r�r�r�r�r�rr$rrrr�sI��DE�DH��0�d%� )� �'.�R 8�-��.�&�"�6rc � ���ddl}|j�}|jddd��|jdd�}|jdd d d � �|jd dd d� �|jddd d� �|jddd d� �|jd�}|j �}|jddd d� �|jddd d� �|jddd� �|jd!d"d#� �|jd$d%d d&� �|jd'd(d d)� �|jd*d+d d,� �|jd-d.�}|jd/d0gd1�2�|jd3d0gd4�2�|jd5d d6d7�2�|jd8d9d:�;�|jd<|j d=�;�|j �}|jr*tjd>��tjd?����fd@�}|jD��cgc](}|jdA�D]}|j����*c}}|_ |jD��cgc].}|jtj�D] }||��� �0c}}|_|jro|j s|j#dB�t%|j |j �C�} | j'|j(|j*|j,�St/|j0|j2|j4|j6g�s|j#dD�|j4r)|j2s |j0r|j#dE�|j*r|j2s|j#dF�|j8�|j#dG�t;|j2|j0|j4|j6|j|j|j |j |j<�H� } |j>roddl } |j8} | jC| �\} }}|jDg|jF�tH_%dI|jD|jL|jN|ddJ�}n�|j8g|jF�tH_%tjPjS|j8�tHjPd<tUjV|j8�5}tY|j[�|j8dK�}ddd�|j8dIdddL�}| j]||�| je�} |jfs2| j'|j(|j*|j,�yycc}}wcc}}w#1swY��xYw#t^$r6}tIj`dMtHjJd�dN|���Yd}~��d}~wtb$rY��wxYw)ONrz --version�versionz trace 2.0)�actionrz Main optionsz(One of these (or --report) must be givenz-cz--count� store_truez�Count the number of times each line is executed and write the counts to .cover for each module executed, in the module's directory. See also --coverdir, --file, --no-report below.)r�helpz-tz--tracez3Print each line to sys.stdout before it is executedz-lz --listfuncsz�Keep track of which functions are executed at least once and write the results to sys.stdout after the program exits. Cannot be specified alongside --trace or --count.z-Tz --trackcallsz^Keep track of caller/called pairs and write the results to sys.stdout after the program exits.� Modifiersz-rz--reportz�Generate a report from a counts file; does not execute any code. --file must specify the results file to read, which must have been created in a previous run with --count --file=FILEz-Rz --no-reportz^Do not generate the coverage report files. Useful if you want to accumulate over several runs.z-fz--filez+File to accumulate counts over several runs)rz-Cz --coverdirz�Directory where the report files go. The coverage report for . will be written to file //.coverz-mz --missingz?Annotate executable lines that were not executed with ">>>>>> "z-sz --summaryz\Write a brief summary for each file to sys.stdout. Can only be used with --count or --reportz-gz--timingzQPrefix each line with the time since the program started. Only used while tracing�FilterszCan be specified multiple timesz--ignore-module�appendzqIgnore the given module(s) and its submodules (if it is a package). Accepts comma separated list of module names.)r�defaultrz --ignore-dirzWIgnore files in the given directory (multiple directories can be joined by os.pathsep).z--moduleFzTrace a module. �progname�?zfile to run as main program)�nargsr� argumentszarguments to the program�stdlib� platstdlibc����tjjtjj|��}|j d��j d��}tjj |�S)Nz$prefixz $exec_prefix)r r � expanduser� expandvarsr2r)�s� _exec_prefix�_prefixs ��r�parse_ignore_dirzmain..parse_ignore_dir�sX��� �G�G� � �r�w�w�1�1�!�4� 5�� �I�I�i�� )� 1� 1�.�,� O���w�w����"�"r�,z-r/--report requires -f/--file)rErFzLmust specify one of --trace, --count, --report, --listfuncs, or --trackcallsz8cannot specify both --listfuncs and (--trace or --count)z3--summary can only be used with --count or --reportz3progname is missing: required with the main options)r�r�r�r�rErFr�r�)r!r� __package__� __loader__�__spec__� __cached__r�)rr!r)r,zCannot run file z because: )4�argparse�ArgumentParser� add_argument�add_argument_group�add_mutually_exclusive_group� REMAINDER� parse_args� ignore_dir� sysconfig�get_path� ignore_module�split�stripr �pathsep�reportr@�errorrr��missingrurv�anyr�r�� listfuncs� trackcallsrrr��module�runpy�_get_module_detailsr�rr/�argv�parent�loaderr rg�io� open_coder�r�r�rL�exit� SystemExitr� no_report)r-�parser�grp�_grp�optsr'r�rr$r�trB� module_name�mod_name�mod_specr��globsr�rRr%r&s @@r�mainrUYs����� � $� $� &�F� ��� �I�{��K� � #� #�N� 6� 8�C����T�9�\�&��'� ���T�9�\�F��H����T�=��E��F����T�>�,�7��8� � #� #�K� 0�C� � +� +� -�D����d�J�|��� �  ���d�M�,�G��H����T�8�>��@����T�<�2��3����T�;�|�������T�;�|�=��>����T�:�l�+��,� � #� #�I� -� /�C����&�x��!��"����^�H�b�G��H� ��� �<��/��1� ��� �#�.��0� ��� �8�+=�+=�+��-� � � � �D� ����$�$�X�.�� �)�)�,�7� �#� $(�#5�#5�O�#5�a������#��)�)�+�AM�&�#5�O�D��!%���N� /�1�������9L�A�(��*�9L�+� /�N�D�O� �{�{��y�y� �L�L�9� :�!����D�I�I�F���$�$�T�\�\�4�<�<����O�O� �� � �D�J�J�������H� I�� � �4� 5� �~�~�4�:�:����� � �O�P� �|�|�D�J�J�� � �J�K� �}�}��� � �J�K� �d�j�j�$�*�*�����?�?�t�7I�7I��������i�i�� � � 5�A� � �;�;� ��-�-�K�',�'@�'@��'M� $�H�h���(�(�:�4�>�>�:�C�H�&� �,�,�'���&�o�o�$�"� �E�� � �7����7�C�H��'�'�/�/�$�-�-�8�C�H�H�Q�K����d�m�m�,���r�w�w�y�$�-�-��@��-�!�M�M�&�#�"� �E� ����u�e�$� �i�i�k�G� �>�>����d�l�l�D�L�L�$�-�-�H� ��O��N�X-�,�� �H� ���S�X�X�a�[�#�F�G�G�� � � � �sC�!-W&�&3W,�C6W>�&W2�+,W>�2W;�7W>�> Y�,X8�8 Y�Yr�r�)�__doc__�__all__rGrkr r/r5r�rnr�r�r�rH�timerr�r�r�rr+r9rr�r�r�rjrrUr!r$rr�rYs���<�( �%� &�� �� � �� ��� � � �#��#��0�0�d� �8l�l�\� � �. #�T6�T6�lPI�d �Z���F�r