§
    ƒØjŽB  ã                  óL  — d Z ddlm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  ej        d
¦  «        Z G d„ dej        ¦  «        Z G d„ d¦  «        Z G d„ d¦  «        Z G d„ dej        ¦  «        ZegZedk    rddlZ ej        e¦  «         dS dS )an  
This module describes classes for performing windowed and overlapping windowed analysis.
The :class:`music21.analysis.windowed.WindowedAnalysis` provides a reusable framework for
systematic overlapping window analysis at the starting at the level of the quarter note
and moving to the size of an entire :class:`music21.stream.Stream`.

Modular analysis procedures inherit from :class:`music21.analysis.discrete.DiscreteAnalysis`.
The :class:`music21.analysis.discrete.KrumhanslSchmuckler` (for algorithmic key detection)
and :class:`music21.analysis.discrete.Ambitus` (for pitch range analysis) classes provide examples.
é    )ÚannotationsN)Úexceptions21)Úcommon)Úenvironment)Úmeter)Ústream)ÚDiscreteAnalysisExceptionzanalysis.windowedc                  ó   — e Zd ZdS )ÚWindowedAnalysisExceptionN)Ú__name__Ú
__module__Ú__qualname__© ó    úŽ/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/analysis/windowed.pyr   r   '   s   € € € € € Ø€Dr   r   c                  ó<   — e Zd ZdZd„ Zdd„Zdd„Z	 	 	 	 	 ddd„ZdS )ÚWindowedAnalysisa  
    Create a WindowedAnalysis object.

    The provided `analysisProcessor` must provide a `process()` method that,
    when given a windowed Stream (a Measure) returns two element tuple containing
    (a) a data value (implementation dependent) and (b) a color code.
    c                óö   — || _         t          |t          j        ¦  «        st	          d¦  «        ‚|                     ¦   «         r|                     ¦   «         }|| _        |                      ¦   «         | _	        d S )Nznon-stream provided as argument)
Ú	processorÚ
isinstancer   ÚStreamr   ÚhasPartLikeStreamsÚflattenÚ
_srcStreamÚgetMinimumWindowStreamÚ_windowedStream)ÚselfÚ	streamObjÚanalysisProcessors      r   Ú__init__zWindowedAnalysis.__init__6   ss   € Ø*ˆŒå˜)¥V¤]Ñ3Ô3ð 	OÝ+Ð,MÑNÔNÐNØ×'Ò'Ñ)Ô)ð 	,Ø!×)Ò)Ñ+Ô+ˆIØ#ˆŒà#×:Ò:Ñ<Ô<ˆÔÐÐr   ú1/4c                ó*  — t          j        ¦   «         }|                     dt          j        |¦  «        ¦  «         | j                             |¬¦  «        }|                     d¦  «         |st          d¦  «        ‚| 	                    d¬¦  «         |S )a-  
        Take the loaded stream and restructure it into measures of 1 quarter note duration.

        >>> s = corpus.parse('bach/bwv324')
        >>> p = analysis.discrete.Ambitus()

        Placing one part into analysis:

        >>> wa = analysis.windowed.WindowedAnalysis(s.parts[0], p)

        >>> post = wa.getMinimumWindowStream()
        >>> len(post.getElementsByClass(stream.Measure))
        42
        >>> post.getElementsByClass(stream.Measure).first()
        <music21.stream.Measure 1 offset=0.0>

        Time signature set to 1/4 time signature

        >>> post.getElementsByClass(stream.Measure).first().timeSignature
        <music21.meter.TimeSignature 1/4>

        leaves one note in this measure

        >>> len(post.getElementsByClass(stream.Measure)[1].notes)
        1

        Placing a score with parts into analysis will automatically flatten
        the stream.  So these two calls are equivalent:

        >>> wa1 = analysis.windowed.WindowedAnalysis(s, p)
        >>> wa2 = analysis.windowed.WindowedAnalysis(s.flatten(), p)

        r   )ÚmeterStreamÚMeasurezMaking measures failedT)ÚinPlace)
r   r   Úinsertr   ÚTimeSignaturer   ÚmakeMeasuresÚremoveByNotOfClassr   ÚmakeTies)r   ÚtimeSignaturer#   Úmeasureds       r   r   z'WindowedAnalysis.getMinimumWindowStreamA   s•   € õH ”m‘o”oˆØ×Ò˜1�eÔ1°-Ñ@Ô@ÑAÔAÐAð
 ”?×/Ò/¸KÐ/ÑHÔHˆð 	×#Ò# IÑ.Ô.Ð.Øð 	FÝ+Ð,DÑEÔEÐEØ×Ò $ÐÑ'Ô'Ð'Øˆr   Úoverlapc                óH  — t          | j        ¦  «        }|dk    r	||z
  dz   }nZ|dk    r4||z  dz   }t          |¦  «        }||k    rt          j        dd¬¦  «         n |dk    r|}nt          j        d|› �¦  «        ‚d	g|z  }d	g|z  }t          |¦  «        }|dk    r�|D ]Š}	t          j	        ¦   «         }
t          |	|	|z   ¦  «        D ]"}|
 
                    | j        |         ¦  «         Œ#	 | j                             |
¦  «        \  ||	<   ||	<   Œp# t          $ r d
\  ||	<   ||	<   Y Œ‡w xY w�nò|dk    rÊd	}||z   }t          |¦  «        D ]±}	t          |t          | j        ¦  «        ¦  «        }t          j	        ¦   «         }
t          ||¦  «        D ]"}|
 
                    | j        |         ¦  «         Œ#	 | j                             |
¦  «        \  ||	<   ||	<   n# t          $ r d
\  ||	<   ||	<   Y nw xY w|}||z   }Œ²�n"|dk    �rg }t          ||z
  dz   ¦  «        D ]y}	t          j	        ¦   «         }
g }t          |	|	|z   ¦  «        D ]7}|
 
                    | j        |         ¦  «         | 
                    |¦  «         Œ8| 
                    |
|g¦  «         Œzt          |¦  «        D ]z}	t          j	        ¦   «         }
|D ]#\  }}|	|v r|D ]}|
 
                    |¦  «         ŒŒ$	 | j                             |
¦  «        \  ||	<   ||	<   Œ`# t          $ r d
\  ||	<   ||	<   Y Œww xY w||fS )a~  
        Calls, for a given window size, an analysis method across all windows in the source Stream.

        If windowType is "overlap", windows above size 1 are always overlapped, so if a window
        of size 2 is used, windows 1-2, then 2-3, then 3-4 are compared. If a window of size 3
        is used, windows 1-3, then 2-4, then 3-5 are compared.

        Windows are assumed to be partitioned by :class:`music21.stream.Measure` objects.

        Returns two lists for results, each equal in size to the length of minimum windows
        minus the window size plus one. If we have 20 1/4 windows, then the results lists
        will be of length 20 for window size 1, 19 for window size 2, 18 for window size 3, etc.

        >>> s = corpus.parse('bach/bwv66.6')
        >>> p = analysis.discrete.Ambitus()
        >>> wa = analysis.windowed.WindowedAnalysis(s.flatten(), p)
        >>> len(wa._windowedStream)
        36
        >>> a, b = wa.analyze(1)
        >>> len(a), len(b)
        (36, 36)

        >>> a, b = wa.analyze(4)
        >>> len(a), len(b)
        (33, 33)

        >>> a, b = wa.analyze(1, windowType='noOverlap')
        >>> len(a), len(b)
        (37, 37)

        >>> a, b = wa.analyze(4, windowType='noOverlap')
        >>> len(a), len(b)
        (10, 10)

        >>> a, b = wa.analyze(1, windowType='adjacentAverage')
        >>> len(a), len(b)
        (36, 36)

        r-   é   Ú	noOverlapzJmaxWindowCount is not divisible by windowSize, possibly undefined behavioré   )Ú
stacklevelÚadjacentAveragezUnknown windowType: r   ))NNr   z#ffffff)Úlenr   ÚintÚwarningsÚwarnr   ÚMusic21ExceptionÚranger   r   Úappendr   Úprocessr	   Úmin)r   Ú
windowSizeÚ
windowTypeÚmaxWindowCountÚwindowCountÚwindowCountFloatÚdataÚcolorÚwindowCountIndicesÚiÚcurrentÚjÚstartÚendÚ
overlappedÚparticipantsÚ
dataStreamÚms                     r   ÚanalyzezWindowedAnalysis.analyzet   s*  € õP ˜TÔ1Ñ2Ô2ˆð ˜Ò"Ð"Ø(¨:Ñ5¸Ñ9ˆKˆKØ˜;Ò&Ð&Ø-°
Ñ:¸QÑ>ÐÝÐ.Ñ/Ô/ˆKØ ;Ò.Ð.Ý”Ø`Ø ðñ ô ð øð Ð,Ò,Ð,Ø(ˆKˆKåÔ/Ð0SÀzÐ0SÐ0SÑTÔTÐTàˆs�[Ñ ˆØ��kÑ!ˆå" ;Ñ/Ô/Ðà˜Ò"Ð"Ø'ð 
Cð 
C�Ý œ-™/œ/�Ý˜q ! j¡.Ñ1Ô1ð <ð <�Aà—N’N 4Ô#7¸Ô#:Ñ;Ô;Ð;Ð;ðCØ(,¬×(>Ò(>¸wÑ(GÔ(GÑ%�D˜‘G˜U 1™X˜XøÝ0ð Cð Cð Cà(BÑ%�D˜‘G˜U 1™X˜X˜XðCøøøñ
Cð ˜;Ò&Ð&ØˆEØ˜*Ñ$ˆCÝ˜;Ñ'Ô'ð )ð )�Ý˜#�s 4Ô#7Ñ8Ô8Ñ9Ô9�å œ-™/œ/�Ý˜u cÑ*Ô*ð <ð <�AØ—N’N 4Ô#7¸Ô#:Ñ;Ô;Ð;Ð;ðCØ(,¬×(>Ò(>¸wÑ(GÔ(GÑ%�D˜‘G˜U 1™X˜XøÝ0ð Cð Cð Cà(BÑ%�D˜‘G˜U 1™X˜X˜XðCøøøð �Ø˜jÑ(��ñ)ð  Ð,Ò,Ñ,àˆJÝ˜>¨JÑ6¸Ñ:Ñ;Ô;ð ;ð ;�Ý œ-™/œ/�à!�Ý˜q ! j¡.Ñ1Ô1ð +ð +�AØ—N’N 4Ô#7¸Ô#:Ñ;Ô;Ð;Ø ×'Ò'¨Ñ*Ô*Ð*Ð*Ø×!Ò! 7¨LÐ"9Ñ:Ô:Ð:Ð:õ ˜>Ñ*Ô*ð Cð C�å œ-™/œ/�Ø0:ð .ð .Ñ,�J Ø˜LÐ(Ð(Ø!+ð .ð .˜AØ#ŸNšN¨1Ñ-Ô-Ð-Ð-øðCØ(,¬×(>Ò(>¸wÑ(GÔ(GÑ%�D˜‘G˜U 1™X˜XøÝ0ð Cð Cð Cà(BÑ%�D˜‘G˜U 1™X˜X˜XðCøøøð �Uˆ{Ðs6   Ã-#DÄD)Ä(D)Æ5#GÇG1Ç0G1Ë!#LÌLÌLr/   TÚ	minWindowú
int | NoneÚ	maxWindowÚwindowStepSizeú	int | strc                ó`  — |€t          | j        ¦  «        }n|}|€t          | j        ¦  «        }n|}|€d}nJ|                     ¦   «         dv rd}n1|                     ¦   «         dv rd}n|                     ¦   «         dv rd}g }g }	g }
t          |t          ¦  «        r"t          t          ||dz   |¦  «        ¦  «        }n[t          j        |¦  «        \  }}g }|}	 | 	                    |¦  «         |t          t	          |¦  «        ¦  «        z  }||d
z  k    rnŒ?|r-t          | j        ¦  «        }||vr| 	                    |¦  «         |D ]_}|                      ||¬¦  «        \  }}| 	                    |¦  «         |	 	                    |¦  «         d|i}|
 	                    |¦  «         Œ`||	|
fS )a   
        Main method for windowed analysis across one or more window sizes.

        Calls :meth:`~music21.analysis.WindowedAnalysis.analyze` for
        the number of different window sizes to be analyzed.

        The `minWindow` and `maxWindow` set the range of window sizes in quarter lengths.
        The `windowStepSize` parameter determines the increment between these window sizes,
        in quarter lengths.

        If `minWindow` or `maxWindow` is None, the largest window size available will be set.

        If `includeTotalWindow` is True, the largest window size will always be added.

        >>> s = corpus.parse('bach/bwv324')
        >>> ksAnalyzer = analysis.discrete.KrumhanslSchmuckler()

        placing one part into analysis

        >>> sopr = s.parts[0]
        >>> wa = analysis.windowed.WindowedAnalysis(sopr, ksAnalyzer)
        >>> solutions, colors, meta = wa.process(1, 1, includeTotalWindow=False)
        >>> len(solutions)  # we only have one series of windows
        1

        >>> solutions, colors, meta = wa.process(1, 2, includeTotalWindow=False)
        >>> len(solutions)  # we have two series of windows
        2

        >>> solutions[1]
        [(<music21.pitch.Pitch B>, 'major', 0.6844...),
         (<music21.pitch.Pitch B>, 'minor', 0.8308...),
         (<music21.pitch.Pitch D>, 'major', 0.6844...),
         (<music21.pitch.Pitch B>, 'minor', 0.8308...),...]

        >>> colors[1]
        ['#ffb5ff', '#9b519b', '#ffd752', '#9b519b', ...]

        >>> meta
        [{'windowSize': 1}, {'windowSize': 2}]
        Nr-   ©r-   )Ú	nooverlapÚnonoverlappingr0   )Úadjacentaverager3   r/   Tg      è?)r>   r=   )r4   r   Úlowerr   r5   Úlistr9   r   ÚgetNumFromStrr:   ÚroundrN   )r   rO   rQ   rR   r>   ÚincludeTotalWindowÚ	maxLengthÚ	minLengthÚsolutionMatrixÚcolorMatrixÚ
metaMatrixÚwindowSizesÚnumÚjunkÚxÚtotalWindowrE   ÚsolutionÚ	colorNameÚmetas                       r   r;   zWindowedAnalysis.processð   s  € ð` ÐÝ˜DÔ0Ñ1Ô1ˆIˆIà!ˆIàÐÝ˜DÔ0Ñ1Ô1ˆIˆIà!ˆIàÐØ"ˆJˆJØ×ÒÑÔ ;Ð.Ð.Ø"ˆJˆJØ×ÒÑÔÐ#BÐBÐBØ$ˆJˆJØ×ÒÑÔÐ#6Ð6Ð6Ø*ˆJð ˆØˆàˆ
å�n¥cÑ*Ô*ð 
	Ý�u Y°	¸A±¸~ÑNÔNÑOÔOˆKˆKåÔ,¨^Ñ<Ô<‰IˆC�ØˆKØˆAðØ×"Ò" 1Ñ%Ô%Ð%Ø��c #™hœh™œÑ'�Ø˜	 DÑ(Ò)Ð)Øð	ð ð 	0Ý˜dÔ2Ñ3Ô3ˆKØ +Ð-Ð-Ø×"Ò" ;Ñ/Ô/Ð/àð 	$ð 	$ˆAð #'§,¢,¨q¸Z ,Ñ"HÔ"HÑˆH�ià×!Ò! (Ñ+Ô+Ð+Ø×Ò˜yÑ)Ô)Ð)Ø  !Ð$ˆDØ×Ò˜dÑ#Ô#Ð#Ð#à˜{¨JÐ6Ð6r   N)r!   rU   )r/   r/   r/   r-   T)rO   rP   rQ   rP   rR   rS   )r   r   r   Ú__doc__r    r   rN   r;   r   r   r   r   r   -   sŒ   € € € € € ðð ð	=ð 	=ð 	=ð1ð 1ð 1ð 1ðfyð yð yð yðz '(Ø&'Ø*+Ø$Ø#'ðe7ð e7ð e7ð e7ð e7ð e7ð e7r   r   c                  ó   — e Zd Zd„ ZdS )ÚMockObjectProcessorc                óR   — t          |                     ¦   «         j        ¦  «        dfS )z8
        Simply count the number of notes found
        N)r4   r   ÚnotesAndRests)r   Ú	subStreams     r   r;   zMockObjectProcessor.process\  s&   € õ �9×$Ò$Ñ&Ô&Ô4Ñ5Ô5°tÐ;Ð;r   N)r   r   r   r;   r   r   r   rm   rm   Z  s#   € € € € € ð<ð <ð <ð <ð <r   rm   c                  ó&   — e Zd Zd„ Zd„ Zd„ Zd„ ZdS )ÚTestc                óB   — ddl m}  || t          ¦   «         ¦  «         d S )Nr   )ÚtestCopyAll)Úmusic21.test.commonTestrt   Úglobals)r   rt   s     r   ÚtestCopyAndDeepcopyzTest.testCopyAndDeepcopyd  s0   € Ø7Ð7Ð7Ð7Ð7Ð7Øˆ�D�'™)œ)Ñ$Ô$Ð$Ð$Ð$r   c                ó>  — ddl m} ddlm} |                     d¦  «        }|j        |j        fD ]l} |¦   «         }t          |                     ¦   «         |¦  «        }t          t          dd¦  «        ¦  «        d gz   D ]}|                     ||¦  «        \  }}	}
ŒŒmd S )Nr   ©Úcorpus©Údiscretezbach/bwv324r/   é   )Úmusic21rz   Úmusic21.analysisr|   ÚparseÚKrumhanslSchmucklerÚAmbitusr   r   rZ   r9   r;   )r   rz   r|   ÚsÚpClassÚpÚwarE   Úunused_xÚunused_yÚunused_zs              r   Ú	testBasiczTest.testBasich  sÏ   € Ø"Ð"Ð"Ð"Ð"Ð"Ø-Ð-Ð-Ð-Ð-Ð-ð �LŠL˜Ñ'Ô'ˆàÔ3°XÔ5EÐFð 	@ð 	@ˆFØ�‘”ˆAõ " !§)¢)¡+¤+¨qÑ1Ô1ˆBå�%  1™+œ+Ñ&Ô&¨$¨Ñ/ð @ð @�Ø/1¯zªz¸!¸QÑ/?Ô/?Ñ,�˜( H Hð@ð	@ð 	@r   c                ó	  — t          ¦   «         }ddlm} t          j        ¦   «         }|                     |                     d¦  «        ¦  «         |                     |                     d¦  «        ¦  «         t          j        ¦   «         }|                     |                     d¦  «        ¦  «         |                     |                     d¦  «        ¦  «         |                     |                     d¦  «        ¦  «         |                     |                     d¦  «        ¦  «         |                     |                     d¦  «        ¦  «         |                     |                     d¦  «        ¦  «         |                     |                     d	¦  «        ¦  «         |                     |                     d¦  «        ¦  «         t          ||¦  «        }t          ||¦  «        }|                      t          |j
        ¦  «        d
¦  «         |                      t          |j
        ¦  «        d¦  «         |                     dddd¬¦  «        \  }}}	|                      t          |d         ¦  «        d
¦  «         |                      |d         d         d¦  «         |                      |d         d         d¦  «         |                     d
d
dd¬¦  «        \  }}}	|                      t          |d         ¦  «        d¦  «         |                      |d         d         d
¦  «         |                     dddd¬¦  «        \  }}}	|                      t          |d         ¦  «        d¦  «         |                      |d         d         d¦  «         |                      |d         d         d¦  «         |                     d
d
dd¬¦  «        \  }}}	|                      t          |d         ¦  «        d¦  «         |                     dddd¬¦  «        \  }}}	|                      t          |d         ¦  «        d
¦  «         |                     dddd¬¦  «        \  }}}	|                      t          |d         ¦  «        d¦  «         dS )zJ
        Test that windows are doing what they are supposed to do
        r   )ÚnoteÚCÚDÚEÚFÚGÚAÚBr1   é   r/   F)r]   é   N)rm   r~   rŒ   r   r   r:   ÚNoter   ÚassertEqualr4   r   r;   )
r   r…   rŒ   Ús1Ús2Úwa1Úwa2ÚaÚunused_bÚunused_cs
             r   ÚtestWindowingzTest.testWindowingy  sÙ  € õ  Ñ!Ô!ˆà Ð Ð Ð Ð Ð ÝŒ]‰_Œ_ˆØ
�	Š	�$—)’)˜C‘.”.Ñ!Ô!Ð!Ø
�	Š	�$—)’)˜C‘.”.Ñ!Ô!Ð!åŒ]‰_Œ_ˆØ
�	Š	�$—)’)˜C‘.”.Ñ!Ô!Ð!Ø
�	Š	�$—)’)˜C‘.”.Ñ!Ô!Ð!Ø
�	Š	�$—)’)˜C‘.”.Ñ!Ô!Ð!Ø
�	Š	�$—)’)˜C‘.”.Ñ!Ô!Ð!Ø
�	Š	�$—)’)˜C‘.”.Ñ!Ô!Ð!Ø
�	Š	�$—)’)˜C‘.”.Ñ!Ô!Ð!Ø
�	Š	�$—)’)˜C‘.”.Ñ!Ô!Ð!Ø
�	Š	�$—)’)˜C‘.”.Ñ!Ô!Ð!å˜r 1Ñ%Ô%ˆÝ˜r 1Ñ%Ô%ˆð 	×Ò�˜SÔ0Ñ1Ô1°1Ñ5Ô5Ð5Ø×Ò�˜SÔ0Ñ1Ô1°1Ñ5Ô5Ð5ð !$§¢¨A¨q°!È Ñ NÔ NÑˆˆ8�XØ×Ò�˜Q˜qœT™œ AÑ&Ô&Ð&Ø×Ò˜˜1œ˜aœ !Ñ$Ô$Ð$Ø×Ò˜˜1œ˜aœ !Ñ$Ô$Ð$ð !$§¢¨A¨q°!È Ñ NÔ NÑˆˆ8�XØ×Ò�˜Q˜qœT™œ AÑ&Ô&Ð&à×Ò˜˜1œ˜aœ !Ñ$Ô$Ð$ð !$§¢¨A¨q°!È Ñ NÔ NÑˆˆ8�XØ×Ò�˜Q˜qœT™œ AÑ&Ô&Ð&Ø×Ò˜˜1œ˜aœ !Ñ$Ô$Ð$Ø×Ò˜˜1œ˜aœ !Ñ$Ô$Ð$ð !$§¢¨A¨q°!È Ñ NÔ NÑˆˆ8�XØ×Ò�˜Q˜qœT™œ AÑ&Ô&Ð&ð !$§¢¨A¨q°!È Ñ NÔ NÑˆˆ8�XØ×Ò�˜Q˜qœT™œ AÑ&Ô&Ð&ð !$§¢¨A¨q°!È Ñ NÔ NÑˆˆ8�XØ×Ò�˜Q˜qœT™œ AÑ&Ô&Ð&Ð&Ð&r   c                óH  — ddl m} ddlm} ddlm} |                     ¦   «         }|                     d¦  «        }t          |                     ¦   «         |¦  «        }|j	         
                    |                     ¦   «         d dd¬¦  «        }|                     ¦   «          d S )	Nr   r{   ry   )Úgraphzbach/bwv66.6r}   r-   )Ú
doneActionÚ
windowStepr>   )r   r|   r~   rz   r¡   r�   r€   r   r   ÚplotÚWindowedKeyÚrun)r   r|   rz   r¡   r…   rƒ   Ú	unused_war¤   s           r   ÚtestVariableWindowingzTest.testVariableWindowing´  s±   € Ø-Ð-Ð-Ð-Ð-Ð-Ø"Ð"Ð"Ð"Ð"Ð"Ø!Ð!Ð!Ð!Ð!Ð!à×(Ò(Ñ*Ô*ˆØ�LŠL˜Ñ(Ô(ˆå$ Q§Y¢Y¡[¤[°!Ñ4Ô4ˆ	àŒz×%Ò% a§i¢i¡k¤k¸dØ12¸yð &ñ Jô Jˆà�Š‰
Œ
ˆ
ˆ
ˆ
r   N)r   r   r   rw   rŠ   rŸ   r¨   r   r   r   rr   rr   c  sT   € € € € € ð%ð %ð %ð@ð @ð @ð"8'ð 8'ð 8'ðvð ð ð ð r   rr   Ú__main__)rk   Ú
__future__r   Úunittestr6   r~   r   r   r   r   r   Úmusic21.analysis.discreter	   ÚEnvironmentÚenvironLocalr8   r   r   rm   ÚTestCaserr   Ú
_DOC_ORDERr   ÚmainTestr   r   r   ú<module>r²      s¯  ðð	ð 	ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€à  Ð  Ð  Ð  Ð  Ð  à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à ?Ð ?Ð ?Ð ?Ð ?Ð ?à&ˆ{Ô&Ð':Ñ;Ô;€ð	ð 	ð 	ð 	ð 	 Ô =ñ 	ô 	ð 	ðh7ð h7ð h7ð h7ð h7ñ h7ô h7ð h7ðZ	<ð <ð <ð <ð <ñ <ô <ð <ð]ð ]ð ]ð ]ð ]ˆ8Ôñ ]ô ]ð ]ðF Ð€
àˆzÒÐØ€N€N€NØ€GÔ�TÑÔÐÐÐð Ðr   