§
    ƒØjâ·  ã                  ó&  — d Z ddlmZ ddlZddlZddl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 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„Z G d„ d¦  «        Z G d„ dej        ¦  «        Ze dk    rddlZ ej!        e¦  «         dS dS )z�
A mixin to ScoreExporter that includes the capabilities for producing a single
MusicXML `<part>` from multiple music21 `PartStaff` objects.
é    )ÚannotationsN)ÚElementÚ
SubElementÚComment)ÚflattenList)Ú
M21ObjType)ÚKeySignature)Ú
StaffGroup)ÚTimeSignature)Ústream)Úhelpers)ÚMusicXMLExportExceptionÚMusicXMLWarningÚmeasurer   ÚstaffNumberÚintÚtagListú	list[str]c                óx  — | j         dk    rt          d¦  «        ‚|D ]œ}|                      |¦  «        D ]„}|                     d¦  «        �1t          d¦  «        }|                      d¦  «        x}r|nd|_        |‚t          d¦  «        }t          |¦  «        |_        t          j
        ||g d¢¬	¦  «         Œ…Œ�dS )
aK  
    For a <measure> tag `measure`, add a <staff> grandchild to any instance of
    a child tag of a type in `tagList`.

    >>> from xml.etree.ElementTree import fromstring as EL
    >>> from music21.musicxml.partStaffExporter import addStaffTags
    >>> from music21.musicxml.helpers import dump
    >>> elem = EL("""
    ...     <measure number="1">
    ...        <note>
    ...          <rest measure="yes" />
    ...          <duration>8</duration>
    ...        </note>
    ...      </measure>"""
    ...     )
    >>> addStaffTags(elem, 2, tagList=['note', 'forward', 'direction', 'harmony'])
    >>> dump(elem)
    <measure number="1">
      <note>
        <rest measure="yes" />
        <duration>8</duration>
        <staff>2</staff>
      </note>
    </measure>

    Raise if a <staff> grandchild is already present:

    >>> addStaffTags(elem, 2, tagList=['note', 'forward', 'direction'])
    Traceback (most recent call last):
    music21.musicxml.xmlObjects.MusicXMLExportException:
        In part (), measure (1): Attempted to create a second <staff> tag

    The function doesn't accept elements other than <measure>:

    >>> addStaffTags(elem.find('note'), 2, tagList=['direction'])
    Traceback (most recent call last):
    music21.musicxml.xmlObjects.MusicXMLExportException:
        addStaffTags() only accepts <measure> tags
    r   z*addStaffTags() only accepts <measure> tagsÚstaffNz(Attempted to create a second <staff> tagÚnumberÚ )ÚbeamÚ	notationsÚlyricÚplayÚsound©r   )Útagr   ÚfindallÚfindÚgetÚmeasureNumberr   ÚstrÚtextr   ÚinsertBeforeElements)r   r   r   ÚtagNamer   ÚeÚmÚmxStaffs           ú—/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/musicxml/partStaffExporter.pyÚaddStaffTagsr,   !   sý   € ðX „{�iÒÐÝ%Ð&RÑSÔSÐSØð 
Dð 
DˆØ—?’? 7Ñ+Ô+ð 		Dð 		DˆCØ�xŠx˜Ñ Ô Ð,Ý+Ð,VÑWÔW�Ø-4¯[ª[¸Ñ-BÔ-BÐ(B¨Ð"K ! !È�”Ø�Ý˜gÑ&Ô&ˆGÝ˜{Ñ+Ô+ˆGŒLÝÔ(¨¨gð:Cð :Cð :CðDñ Dô Dð Dð Dð		Dð
Dð 
Dó    c                  ód   — e Zd Zd„ Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Z	e
dd„¦   «         Zdd„ZdS )ÚPartStaffExporterMixinc                ó  — | j         s|                      ¦   «         | _         | j         D ]V}|                      |¦  «         |                      |¦  «         |                      |¦  «         |                      |¦  «         ŒWdS )aó  
        Collect <part> elements exported from
        :class:`~music21.stream.PartStaff` objects under a single
        <part> element using <staff> and <voice> subelements.

        Here we load in a simple 2-staff piano piece.  Note that they
        are both elements of the :class:`~music21.stream.PartStaff`
        Stream subclass.

        >>> from music21.musicxml import testPrimitive
        >>> s = converter.parse(testPrimitive.pianoStaff43a)
        >>> s.show('text')
        {0.0} <music21.metadata.Metadata object at 0x107d6a100>
        {0.0} <music21.stream.PartStaff P1-Staff1>
            {0.0} <music21.instrument.Instrument 'P1: MusicXML Part: '>
            {0.0} <music21.stream.Measure 1 offset=0.0>
                {0.0} <music21.clef.TrebleClef>
                {0.0} <music21.key.KeySignature of no sharps or flats>
                {0.0} <music21.meter.TimeSignature 4/4>
                {0.0} <music21.note.Note F>
        {0.0} <music21.stream.PartStaff P1-Staff2>
            {0.0} <music21.instrument.Instrument 'P1: MusicXML Part: '>
            {0.0} <music21.stream.Measure 1 offset=0.0>
                {0.0} <music21.clef.BassClef>
                {0.0} <music21.key.KeySignature of no sharps or flats>
                {0.0} <music21.meter.TimeSignature 4/4>
                {0.0} <music21.note.Note B>
        {0.0} <music21.layout.StaffGroup
                 <music21.stream.PartStaff P1-Staff1><music21.stream.PartStaff P1-Staff2>>

        Now these get joined into a single part in the `parse()` process:

        >>> SX = musicxml.m21ToXml.ScoreExporter(s)
        >>> root = SX.parse()
        >>> parts = root.findall('part')
        >>> len(parts)
        1

        >>> clefs = root.findall('.//clef')
        >>> len(clefs)
        2

        Note that there are exactly two notes (an F and B) in the original score,
        so there are exactly two staff tags in the output.

        >>> staffTags = root.findall('part/measure/note/staff')
        >>> len(staffTags)
        2
        N)ÚgroupsToJoinÚjoinableGroupsÚaddStaffTagsMultiStaffPartsÚmovePartStaffMeasureContentsÚ&setEarliestAttributesAndClefsPartStaffÚcleanUpSubsequentPartStaffs)ÚselfÚgroups     r+   ÚjoinPartStaffsz%PartStaffExporterMixin.joinPartStaffs]   s•   € ðh Ô ð 	6ð !%× 3Ò 3Ñ 5Ô 5ˆDÔØÔ&ð 	4ð 	4ˆEØ×,Ò,¨UÑ3Ô3Ð3Ø×-Ò-¨eÑ4Ô4Ð4Ø×7Ò7¸Ñ>Ô>Ð>Ø×,Ò,¨UÑ3Ô3Ð3Ð3ð		4ð 	4r-   Úreturnúlist[StaffGroup]c                óÂ  — t           j        rddlm} t	          | |¦  «        sJ ‚| j        x}r't          |                     t          ¦  «        ¦  «        ng }g }|D ]‹}t          |¦  «        dk    rŒt          d„ |D ¦   «         ¦  «        sŒ0t          d„ |D ¦   «         ¦  «        sŒJ	 |D ]}|                      |¦  «         Œn# t          $ r Y Œrw xY w|                     |¦  «         ŒŒt          ¦   «         }g }|D ]?}	t          |	¦  «        }
|
|vr|                     |	¦  «         |                     |
¦  «         Œ@t#          |¦  «        }t          t          |¦  «        ¦  «        t          |¦  «        k    r%t%          j        t)          d¦  «        d¬¦  «         g S |D ]B}d	}|D ];}t	          |t
          j        ¦  «        sJ ‚| j        D ]}|j        |urŒ||_        |} Œ<ŒC|S )
az  
        Returns a list of :class:`~music21.layout.StaffGroup` objects that
        represent :class:`~music21.stream.base.PartStaff` objects that can be
        joined into a single MusicXML `<part>`, so long as there exists a
        `PartExporter` for it in `ScoreExporter.partExporterList`.

        Sets :attr:`~music21.musicxml.m21ToXml.PartExporter.previousPartStaffInGroup`.

        >>> s = stream.Score()

        Group 1: three staves.

        >>> p1a = stream.PartStaff(id='p1a')
        >>> p1a.insert(0, stream.Measure())
        >>> p1b = stream.PartStaff(id='p1b')
        >>> p1b.insert(0, stream.Measure())
        >>> p1c = stream.PartStaff(id='p1c')
        >>> p1c.insert(0, stream.Measure())
        >>> sg1 = layout.StaffGroup([p1a, p1b, p1c])

        Group 2: two staves.

        >>> p2a = stream.PartStaff(id='p2a')
        >>> p2a.insert(0, stream.Measure())
        >>> p2b = stream.PartStaff(id='p2b')
        >>> p2b.insert(0, stream.Measure())
        >>> sg2 = layout.StaffGroup([p2a, p2b])

        Group 3: one staff -- will not be merged.

        >>> p3a = stream.PartStaff(id='p3a')
        >>> p3a.insert(0, stream.Measure())
        >>> sg3 = layout.StaffGroup([p3a])

        Group 4: two staves, but no measures, will not be merged:

        >>> p4a = stream.PartStaff(id='p4a')
        >>> p4b = stream.PartStaff(id='p4b')
        >>> sg4 = layout.StaffGroup([p4a, p4b])

        Group 5: two staves, but no staff group

        >>> p5a = stream.PartStaff(id='p5a')
        >>> p5a.insert(0, stream.Measure())
        >>> p5b = stream.PartStaff(id='p5b')
        >>> p5b.insert(0, stream.Measure())

        Group 6: same as Group 2, just to show that valid groups can come later

        >>> p6a = stream.PartStaff(id='p6a')
        >>> p6a.insert(0, stream.Measure())
        >>> p6b = stream.PartStaff(id='p6b')
        >>> p6b.insert(0, stream.Measure())
        >>> sg6 = layout.StaffGroup([p6a, p6b])

        Group 7: same as Group 6, but with Parts instead of PartStaffs

        >>> p7a = stream.Part(id='p7a')
        >>> p7a.insert(0, stream.Measure())
        >>> p7b = stream.Part(id='p7b')
        >>> p7b.insert(0, stream.Measure())
        >>> sg7 = layout.StaffGroup([p7a, p7b])

        Group 8: encloses same objects as Group 6, just to show it's gracefully ignored

        >>> sg8 = layout.StaffGroup([p6a, p6b])

        >>> for el in (p1a, p1b, p1c, sg1, p2a, p2b, sg2, p3a, sg3,
        ...            p4a, p4b, sg4, p5a, p5b, p6a, p6b, sg6, p7a, p7b, sg7, sg8):
        ...     s.insert(0, el)

        >>> SX = musicxml.m21ToXml.ScoreExporter(s)
        >>> SX.scorePreliminaries()
        >>> SX.parsePartlikeScore()  # populate .partExporterList
        >>> SX.joinableGroups()
        [<music21.layout.StaffGroup <... p1a><... p1b><... p1c>>,
         <music21.layout.StaffGroup <... p2a><... p2b>>,
         <music21.layout.StaffGroup <... p6a><... p6b>>]
        r   )ÚXMLExporterBaseé   c              3  ó<   K  — | ]}t           j        |j        v V — Œd S ©N)r   Ú	PartStaffÚclassSet©Ú.0Úps     r+   ú	<genexpr>z8PartStaffExporterMixin.joinableGroups.<locals>.<genexpr>ö   s,   è è € ÐBÐB¸!•vÔ'¨1¬:Ð5ÐBÐBÐBÐBÐBÐBr-   c              3  óT   K  — | ]#}|                      t          j        ¦  «        V — Œ$d S r@   )ÚgetElementsByClassr   ÚMeasurerC   s     r+   rF   z8PartStaffExporterMixin.joinableGroups.<locals>.<genexpr>ø   s2   è è € ÐHÐHÀ�q×+Ò+­F¬NÑ;Ô;ÐHÐHÐHÐHÐHÐHr-   z7Got overlapping StaffGroups; will not merge ANY groups.é   )Ú
stacklevelN)ÚtÚTYPE_CHECKINGÚmusic21.musicxml.m21ToXmlr=   Ú
isinstancer   ÚlistrH   r
   ÚlenÚallÚgetRootForPartStaffr   ÚappendÚsetÚtupleÚaddr   ÚwarningsÚwarnr   rA   ÚpartExporterListÚpreviousPartStaffInGroup)r7   r=   ÚsÚstaffGroupsr2   ÚsgrE   ÚpermutationsÚdeduplicatedGroupsÚjgÚcontainedPartsÚjoinable_components_listr8   Úprior_part_staffÚ
part_staffÚpart_exporters                   r+   r2   z%PartStaffExporterMixin.joinableGroups›   s„  € õb Œ?ð 	5ØAÐAÐAÐAÐAÐAÝ˜d OÑ4Ô4Ð4Ð4Ð4ØFJÄkÐAQÀÐZ•d˜1×/Ò/µ
Ñ;Ô;Ñ<Ô<Ð<ÐXZˆØ+-ˆð ð 	&ð 	&ˆBÝ�2‰wŒw˜!Š|ˆ|ØÝÐBÐB¸rÐBÑBÔBÑBÔBð ØÝÐHÐHÀRÐHÑHÔHÑHÔHð ØðØð 0ð 0�AØ×,Ò,¨QÑ/Ô/Ð/Ð/ð0øå*ð ð ð Ø�ðøøøà×!Ò! "Ñ%Ô%Ð%Ð%õ ‘u”uˆØ/1ÐØ ð 	-ð 	-ˆBÝ" 2™YœYˆNØ \Ð1Ð1Ø"×)Ò)¨"Ñ-Ô-Ð-Ø×Ò˜^Ñ,Ô,Ð,Ð,õ $/Ð/AÑ#BÔ#BÐ Ý�sÐ+Ñ,Ô,Ñ-Ô-µÐ5MÑ1NÔ1NÒNÐNÝŒMÝØMñô ð ð	ñ ô ð ð ˆIð (ð 		ð 		ˆEØ#ÐØ#ð ð �
Ý! *­fÔ.>Ñ?Ô?Ð?Ð?Ð?Ø%)Ô%:ð ð �MØ$Ô+°:Ð=Ð=Ø Ø=M�MÔ:Ø'1Ð$Øøðð "Ð!s   Â&CÃ
CÃCr8   r
   c                óL  — d}t          |¦  «        D ]‘\  }}|dz   }|                      |¦  «        }|                     d¦  «        D ]W}	 t          ||g d¢¬¦  «         Œ# t          $ r3}|j        |_        |                     d¦  «        x}	r|	nd|_        |‚d}~ww xY w|€|}Œ‘Œ’dS )ag  
        Create child <staff> tags under each <note>, <direction>, and <forward> element
        in the <part>s being joined.

        Called by :meth:`joinPartStaffs`.

        >>> from music21.musicxml import testPrimitive
        >>> s = converter.parse(testPrimitive.pianoStaff43a)
        >>> SX = musicxml.m21ToXml.ScoreExporter(s)
        >>> root = SX.parse()
        >>> m1 = root.find('part/measure')
        >>> SX.dump(m1)
        <measure implicit="no" number="1">
        ...
          <note>
            <pitch>
              <step>F</step>
              <octave>4</octave>
            </pitch>
            <duration>40320</duration>
            <voice>1</voice>
            <type>whole</type>
            <staff>1</staff>
          </note>
          <backup>
            <duration>40320</duration>
          </backup>
          <note>
            <pitch>
              <step>B</step>
              <octave>2</octave>
            </pitch>
            <duration>40320</duration>
            <voice>2</voice>
            <type>whole</type>
            <staff>2</staff>
          </note>
        </measure>
        Nr>   r   )ÚnoteÚ	directionÚforwardÚharmonyr   r   r   )Ú	enumeraterS   r    r,   r   ÚpartNamer"   r#   )
r7   r8   ÚinitialPartStaffRootÚiÚpsr   ÚthisPartStaffRootÚ	mxMeasurer(   Úm_nums
             r+   r3   z2PartStaffExporterMixin.addStaffTagsMultiStaffParts#  s  € ðP .2ÐÝ˜uÑ%Ô%ð 	ð 	‰EˆAˆrØ  1™uˆKØ)-×)AÒ)AÀ"Ñ)EÔ)EÐð /×6Ò6°yÑAÔAð 
ð 
�	ð	Ý Ø!Ø#Ø KÐ KÐ Kðñ ô ð ð øõ
 /ð ð ð Ø!#¤�A”JØ9B¿ºÀxÑ9PÔ9PÐ0P°Ð&Y e eÐWY�A”OØ�Gøøøøðøøøð
 $Ð+Ø'8Ð$Øð ,ð#	ð 	s   Á	AÁ
BÁ(.BÂBc                óT  — |                       |d         ¦  «        }t          |¦  «        D ]|\  }}|dk    rŒ|dz   }|                       |¦  «        }|                      |||¦  «        }d}|                     ¦   «         D ](\  }	}
|
D ] }|                     |	|z   |¦  «         |dz  }Œ!Œ)Œ}dS )a#  
        For every <part> after the first, find the corresponding measure in the initial
        <part> and merge the contents by inserting all contained elements.

        Called by :meth:`joinPartStaffs`

        StaffGroup must be a valid one from
        :meth:`joinableGroups`.
        r   r>   N)rS   rl   ÚprocessSubsequentPartStaffÚitemsÚinsert)r7   r8   Útargetro   rp   r   ÚsourceÚ
insertionsÚinsertionCounterÚoriginalIdxÚelementsÚelements               r+   r4   z3PartStaffExporterMixin.movePartStaffMeasureContentsa  sæ   € ð ×)Ò)¨%°¬(Ñ3Ô3ˆå˜uÑ%Ô%ð 	*ð 	*‰EˆAˆrØ�AŠvˆvØà  1™uˆKØ×-Ò-¨bÑ1Ô1ˆFØ×8Ò8¸ÀÈÑUÔUˆJØ$%ÐØ)3×)9Ò)9Ñ);Ô);ð *ð *Ñ%�˜XØ'ð *ð *�GØ—M’M +Ð0@Ñ"@À'ÑJÔJÐJØ$¨Ñ)Ð$Ð$ð*ð*ð	*ð 	*r-   rx   r   ry   ÚstaffNumr   údict[int, list[Element]]c                ó^  ‡‡— dŠdŠdˆˆfd„}t          |                     d¦  «        ¦  «        }d	}i }t          |¦  «        D �]N\  }}	|	j        dk    rŒ|€%	 t	          |¦  «        }n# t
          $ r |cY c S w xY w|	                     d
¦  «        }
|                     d
¦  «        }|
|k    r|                      ||	|¦  «         d	}Œƒ|�|
�t          j	        |
|¦  «        rŒ�|�œ|
�št          j	        ||
¦  «        r…||vrg ||<   t          j        rt          |t          ¦  «        sJ ‚||xx          ||¦  «        |gz  cc<   	 t	          |¦  «        }n# t
          $ r |cY c S w xY w|�|
�t          j	        ||
¦  «        °…t          d|
› d|› �¦  «        ‚t          |¦  «        }|�|                     d|¦  «         |D ]p}|                     d
¦  «        }|€Œt#          |¦  «        }||vrg ||<   t          j        rt          |t          ¦  «        sJ ‚||xx          ||¦  «        |gz  cc<   Œq|S )a@  
        Move elements from subsequent PartStaff's measures into `target`: the <part>
        element representing the initial PartStaff that will soon represent the merged whole.

        Called by
        :meth:`movePartStaffMeasureContents`,
        which is in turn called by
        :meth:`joinPartStaffs`.
        zB========================= Measure [NNN] ==========================z[NNN]Úinner_sourceNumberú	int | strr:   úElement[t.Any]c                ód   •— t          ‰                     ‰t          | ¦  «        ¦  «        ¦  «        S r@   )r   Úreplacer$   )r‚   ÚDIVIDER_COMMENTÚPLACEHOLDERs    €€r+   ÚmakeDividerzFPartStaffExporterMixin.processSubsequentPartStaff.<locals>.makeDividerŒ  s*   ø€ Ý˜?×2Ò2°;ÅÐDVÑ@WÔ@WÑXÔXÑYÔYÐYr-   r   Nr   z2joinPartStaffs() was unable to order the measures z, r   )r‚   rƒ   r:   r„   )Úiterr    rl   r   ÚnextÚStopIterationr"   ÚmoveMeasureContentsr   ÚmeasureNumberComesBeforerL   rM   rO   r$   r   rP   rw   rQ   )r7   rx   ry   r   r‰   ÚsourceMeasuresÚsourceMeasurerz   ro   ÚtargetMeasureÚtargetNumberÚsourceNumberÚremainingMeasuresÚ	remainingÚidxr‡   rˆ   s                  @@r+   ru   z1PartStaffExporterMixin.processSubsequentPartStaff{  s'  øø€ ð _ˆØˆð	Zð 	Zð 	Zð 	Zð 	Zð 	Zð 	Zõ ˜fŸnšn¨YÑ7Ô7Ñ8Ô8ˆØˆØ/1ˆ
õ !*¨&Ñ 1Ô 1ð )	3ñ )	3ÑˆAˆ}ØÔ  IÒ-Ð-ØØÐ$ð&Ý$(¨Ñ$8Ô$8�M�MøÝ$ð &ð &ð &Ø%Ð%Ð%Ð%Ð%Ð%ð&øøøð )×,Ò,¨XÑ6Ô6ˆLØ(×,Ò,¨XÑ6Ô6ˆLð ˜|Ò+Ð+à×(Ò(¨¸ÀxÑPÔPÐPØ $�Øð Ð(Ø#Ð/ÝÔ7¸ÀlÑSÔSð 0àð  Ð+Ø#Ð/ÝÔ7¸ÀlÑSÔSð 0à˜JÐ&Ð&Ø$&�J˜q‘MÝ”?ð 9Ý% lµCÑ8Ô8Ð8Ð8Ð8Ø˜1��” + +¨lÑ";Ô";¸]Ð!KÑK��‘ð&Ý$(¨Ñ$8Ô$8�M�MøÝ$ð &ð &ð &Ø%Ð%Ð%Ð%Ð%Ð%ð&øøøð  Ð+Ø#Ð/ÝÔ7¸ÀlÑSÔSð 0õ *ð2Øð2ð 2Ø#/ð2ð 2ñ3ô 3ð 3õ
 ! Ñ0Ô0ÐØÐ$Ø×$Ò$ Q¨Ñ6Ô6Ð6Ø*ð 	Fð 	FˆIØ$Ÿ=š=¨Ñ2Ô2ˆLØÐ#Øå�f‘+”+ˆCØ˜*Ð$Ð$Ø"$�
˜3‘ÝŒð 5Ý! ,µÑ4Ô4Ð4Ð4Ð4à�sˆOˆOŒO  ¨LÑ 9Ô 9¸9ÐEÑEˆOˆO‰OˆOØÐs$   ÁA(Á(A9Á8A9ÅEÅE"Å!E"c                óº  ‡— 	 dd ˆfd„} |t           ¦  «        } |t          d	¬
¦  «        }d}d}t          ‰¦  «        D �]\  }}|dz   }	|�€|                      |¦  «        }|                     d¦  «        x}�-|                     d¦  «        x}
�|
                     dd¦  «         t          d¦  «        }t          t          ‰¦  «        ¦  «        |_	        t          j        ||g d¢¬¦  «         |r/|�-|                     d¦  «        }|�|                     dd¦  «         |r/|�-|                     d¦  «        }|�|                     dd¦  «         �Œ|                      |¦  «        }|                     d¦  «        }|��0|��-|                     d¦  «        }t          |¦  «        |	k    rt          d¦  «        }|j        |_        |‚t          d¦  «        }|                     dt          |	¦  «        ¦  «         t          |d¦  «        }|                     d¦  «        x}�|j	        nd|_	        t          |d¦  «        }|                     d¦  «        x}�|j	        nd|_	        |                     d¦  «        }|�t          |d¦  «        }|j	        |_	        t          j        ||g d¢¬¦  «         |rR|                     d¦  «        x}�;|                     dt          |	¦  «        ¦  «         t          j        ||dg¬¦  «         |rS|                     d¦  «        x}�<|                     dt          |	¦  «        ¦  «         t          j        ||ddg¬¦  «         �ŒdS )!a»
  
        Set the <staff>, <key>, <time>, and <clef> information on the earliest
        measure <attributes> tag in the <part> representing the joined PartStaffs.

        Need the earliest <attributes> tag, which may not exist in the merged <part>
        until moved there by movePartStaffMeasureContents() --
        e.g. RH of piano doesn't appear until m. 40, and earlier music for LH needs
        to be merged first in order to find earliest <attributes>.

        Called by :meth:`joinPartStaffs`

        Multiple keys:

        >>> from music21.musicxml import testPrimitive
        >>> xmlDir = common.getSourceFilePath() / 'musicxml' / 'lilypondTestSuite'
        >>> s = converter.parse(xmlDir / '43b-MultiStaff-DifferentKeys.xml')
        >>> SX = musicxml.m21ToXml.ScoreExporter(s)
        >>> root = SX.parse()
        >>> m1 = root.find('part/measure')
        >>> SX.dump(m1)
        <measure implicit="no" number="1">
          <attributes>
            <divisions>10080</divisions>
            <key number="1">
              <fifths>0</fifths>
            </key>
            <key number="2">
              <fifths>2</fifths>
            </key>
            <time>
              <beats>4</beats>
              <beat-type>4</beat-type>
            </time>
            <staves>2</staves>
            <clef number="1">
              <sign>G</sign>
              <line>2</line>
            </clef>
            <clef number="2">
              <sign>F</sign>
              <line>4</line>
            </clef>
          </attributes>
        ...
        </measure>

        Multiple meters (not very well supported by MusicXML readers):

        >>> from music21.musicxml import testPrimitive
        >>> s = converter.parse(testPrimitive.pianoStaffPolymeterWithClefOctaveChange)
        >>> SX = musicxml.m21ToXml.ScoreExporter(s)
        >>> root = SX.parse()
        >>> m1 = root.find('part/measure')
        >>> SX.dump(m1)
        <measure implicit="no" number="1">
            <attributes>
            <divisions>10080</divisions>
            <key>
                <fifths>0</fifths>
            </key>
            <time number="1">
                <beats>4</beats>
                <beat-type>4</beat-type>
            </time>
            <time number="2">
                <beats>2</beats>
                <beat-type>2</beat-type>
            </time>
            <staves>2</staves>
            <clef number="1">
                <sign>G</sign>
                <line>2</line>
            </clef>
            <clef number="2">
                <sign>G</sign>
                <line>2</line>
                <clef-octave-change>-1</clef-octave-change>
            </clef>
            </attributes>
        ...
        </measure>
        Ú__eq__Úm21Classútype[M21ObjType]Ú
comparisonr$   r:   Úboolc                ó@  •— d}‰D ]—}|€:|                      ¦   «                              | ¦  «                             ¦   «         }Œ>|                      ¦   «                              | ¦  «                             ¦   «         }|�t          ||¦  «        } ||¦  «        s dS Œ˜dS )a  
            Return True if any first instance of m21Class in any subsequent staff
            in this StaffGroup does not compare to the first instance of that class
            in the earliest staff where found (not necessarily the first) using `comparison`.
            NTF)ÚrecurserH   ÚfirstÚgetattr)r™   r›   ÚinitialM21Instancerp   ÚfirstInstanceSubsequentStaffÚcomparisonWrapperr8   s         €r+   ÚisMultiAttributezWPartStaffExporterMixin.setEarliestAttributesAndClefsPartStaff.<locals>.isMultiAttribute%  s¯   ø€ ð 37Ðàð (ð (�Ø%Ð-Ø)+¯ª©¬×)HÒ)HÈÑ)RÔ)R×)XÒ)XÑ)ZÔ)ZÐ&Ð&à35·:²:±<´<×3RÒ3RÐS[Ñ3\Ô3\×3bÒ3bÑ3dÔ3dÐ0Ø3Ð?Ý,3Ð4PÐR\Ñ,]Ô,]Ð)Ø0Ð0Ð1CÑDÔDð (Ø#' 4 4øð �5r-   Ú
ratioEqual)r›   Nr>   zmeasure/attributesÚclefr   Ú1Ústaves)zpart-symbolÚinstrumentsr¦   ústaff-detailsÚ	transposeÚ	directiveúmeasure-styler   ÚkeyÚtimezmeasure/attributes/clefz'Attempted to add more clefs than staffsÚsignÚliner   zclef-octave-change)rª   r«   r¬   r­   zmeasure/attributes/timezmeasure/attributes/key)r˜   )r™   rš   r›   r$   r:   rœ   )r	   r   rl   rS   r!   rU   r   r$   rQ   r%   r   r&   r    r   rm   r   )r7   r8   r¤   ÚmultiKeyÚ
multiMeterrn   ÚmxAttributesro   rp   r   Úclef1ÚmxStavesÚkey1Úmeter1rq   ÚoldClefÚclefsInMxAttributesAlreadyr(   ÚnewClefÚnewSignÚoldClefSignÚnewLineÚ	foundLineÚfoundOctaveÚ	newOctaveÚoldMeterÚoldKeys    `                         r+   r5   z=PartStaffExporterMixin.setEarliestAttributesAndClefsPartStaffÑ  s   ø€ ðj 08ð	ð 	ð 	ð 	ð 	ð 	ð 	ð, *Ð)­,Ñ7Ô7ˆØ+Ð+­MÀlÐSÑSÔSˆ
à-1ÐØ%)ˆÝ˜uÑ%Ô%ð K	ñ K	‰EˆAˆrØ  1™uˆKð $Ñ+Ø'+×'?Ò'?ÀÑ'CÔ'CÐ$Ø$8×$=Ò$=Ð>RÑ$SÔ$SÐS�LÐ`Ø!-×!2Ò!2°6Ñ!:Ô!:Ð:˜ÐGØŸ	š	 (¨CÑ0Ô0Ð0å" 8Ñ,Ô,�Ý #¥C¨¡J¤J¡¤�”ÝÔ,Ø ØðKð Kð Kðñ ô ð ð ð 0 Ð 8Ø'×,Ò,¨UÑ3Ô3�DØÐ'ØŸš ¨3Ñ/Ô/Ð/Øð 2 ,Ð":Ø)×.Ò.¨vÑ6Ô6�FØÐ)ØŸ
š
 8¨SÑ1Ô1Ð1ùð .2×-EÒ-EÀbÑ-IÔ-IÐ!Ø(9×(>Ò(>Ð?XÑ(YÔ(Y�ØÑ&¨<Ñ+CØ1=×1EÒ1EÀfÑ1MÔ1MÐ.ÝÐ5Ñ6Ô6¸+ÒEÐEÝ3Ð4]Ñ^Ô^˜Ø%'¤[˜œ
Ø˜õ & f™oœo�GØ—K’K ­#¨kÑ*:Ô*:Ñ;Ô;Ð;Ý(¨°&Ñ9Ô9�Gà7>·|²|ÀFÑ7KÔ7KÐ(K¨Ð'Xð %0Ô$4Ð$4à)-ð ”Lõ )¨°&Ñ9Ô9�Gà5<·\²\À&Ñ5IÔ5IÐ(I¨	Ð'Vð %.¤N Nà)+ð ”Lð #*§,¢,Ð/CÑ"DÔ"D�KØ"Ð.Ý$.¨wÐ8LÑ$MÔ$M˜	Ø)4Ô)9˜	œÝÔ0Ø$ØØ \Ð \Ð \ðñ ô ð ð ð Ø$5×$:Ò$:Ð;TÑ$UÔ$UÐU˜ÐbØ Ÿš X­s°;Ñ/?Ô/?Ñ@Ô@Ð@ÝÔ4Ø(Ø$Ø%- Jðñ ô ð ð
 ð Ø"3×"8Ò"8Ð9QÑ"RÔ"RÐR˜Ð_ØŸ
š
 8­S°Ñ-=Ô-=Ñ>Ô>Ð>ÝÔ4Ø(Ø"Ø%+¨XÐ$6ðñ ô ð ùðOK	ð K	r-   c                ó|   ‡— |dd…         D ]/}|                       |¦  «        Šˆfd„| j        D ¦   «         | _        Œ0dS )aƒ  
        Now that the contents of all PartStaffs in `group` have been represented
        by a single :class:`~music21.musicxml.m21ToXml.PartExporter`, remove any
        obsolete `PartExporter` from `self.partExporterList`.

        Called by :meth:`joinPartStaffs`

        >>> from music21.musicxml import testPrimitive
        >>> s = converter.parse(testPrimitive.pianoStaff43a)
        >>> SX = musicxml.m21ToXml.ScoreExporter(s)
        >>> SX.scorePreliminaries()
        >>> SX.parsePartlikeScore()
        >>> len(SX.partExporterList)
        2
        >>> SX.postPartProcess()
        >>> len(SX.partExporterList)
        1
        r>   Nc                ó*   •— g | ]}|j         ‰k    ¯|‘ŒS © )ÚxmlRoot)rD   ÚpexÚpartStaffRoots     €r+   ú
<listcomp>zFPartStaffExporterMixin.cleanUpSubsequentPartStaffs.<locals>.<listcomp>¤  s/   ø€ ð Sð Sð SØ¸¼À}Ò8TÐ8T�Ð8TÐ8TÐ8Tr-   )rS   rZ   )r7   r8   rp   rÉ   s      @r+   r6   z2PartStaffExporterMixin.cleanUpSubsequentPartStaffs�  sq   ø€ ð& ˜˜˜”)ð 	ð 	ˆBØ%)×%=Ò%=¸bÑ%AÔ%AˆMðSð Sð Sð SØ#Ô4ðSñ Sô SˆDÔ!Ð!ð		ð 	r-   r   ÚotherMeasurer   c                óÎ  — | j         dk    s|j         dk    rt          d| › d|› d�¦  «        ‚d}d}|                     d¦  «        D ](}|j        }|�t	          |t          |¦  «        ¦  «        }Œ)|dk    rKd	}|                     d
¦  «        D ]1}t          d¦  «        }d|_        t          j        ||g d¢¬¦  «         Œ2d}d}	|                     d
¦  «        D ]K}
|
 	                    d¦  «        �Œ|
 	                    d¦  «        }|€Œ0|j        }|�|	t          |¦  «        z  }	ŒL|                     d¦  «        D ]}|j        }|�|	t          |¦  «        z  }	Œ|                     d¦  «        D ]}|j        }|�|	t          |¦  «        z  }	Œ|	rHt          d¦  «        }t          |d¦  «        }t          |	¦  «        |_        |                     |¦  «         |                      d¦  «        D �]{}|j         dk    rŒ|j         dk    rQ|                     d¦  «        rŒ0|                     d¦  «        D ]%}|                     dt          |¦  «        ¦  «         Œ&|j         dk    r[|                     d¦  «        }|                     d¦  «        D ]0}|                     d¦  «        |k    r|                     |¦  «         Œ1|j         d
k    rŠ| 	                    d¦  «        }|�4|r1|j        r*t          t          |j        ¦  «        dz   ¦  «        |_        n@n?t          d¦  «        }t          |dz   ¦  «        |_        t          j        ||g d¢¬¦  «         |                     |¦  «         �Œ}dS )a‚  
        Move the child elements of `measure` into `otherMeasure`.
        Create voice numbers if needed.
        Bump voice numbers if they conflict.
        Account for <backup> and <forward> tags.
        Skip <print> tags.
        Set "number" on mid-measure clef changes.
        Replace existing <barline> tags.

        >>> from xml.etree.ElementTree import fromstring as EL
        >>> measure = EL('<measure><note /></measure>')
        >>> otherMeasure = EL('<measure><note /></measure>')
        >>> SX = musicxml.m21ToXml.ScoreExporter
        >>> SX.moveMeasureContents(measure, otherMeasure, 2)
        >>> SX().dump(otherMeasure)
        <measure>
          <note>
            <voice>1</voice>
          </note>
          <note>
            <voice>2</voice>
          </note>
        </measure>

        >>> SX.moveMeasureContents(EL('<junk />'), otherMeasure, 2)
        Traceback (most recent call last):
        music21.musicxml.xmlObjects.MusicXMLExportException:
            moveMeasureContents() called on <Element 'junk'...

        Only one `<barline>` should be exported per merged measure:

        >>> from music21.musicxml import testPrimitive
        >>> s = converter.parse(testPrimitive.mixedVoices1a)
        >>> SX = musicxml.m21ToXml.ScoreExporter(s)
        >>> root = SX.parse()
        >>> root.findall('part/measure/barline')
        [<Element 'barline' at 0x...]
        r   z moveMeasureContents() called on z and z (not measures).r   Fz*/voiceNTrh   Úvoicer§   )ÚtypeÚdotÚ
accidentalztime-modificationÚstemÚnoteheadznotehead-textr   r   r>   ÚchordÚdurationzforward/durationzbackup/durationÚbackupÚ*ÚprintÚ
attributesÚ	divisionsr¦   r   ÚbarlineÚlocation)r   r   r    r%   Úmaxr   r   r   r&   r!   r   r$   rT   rU   r"   Úremove)r   rË   r   Ú	maxVoicesÚotherMeasureLackedVoiceÚother_voiceÚotherVoiceTextÚelemÚ	new_voiceÚamountToBackuprh   ÚdurÚbackupDurTextÚforwardDurTextÚ	backupDurÚmxBackupÚ
mxDurationÚmidMeasureClefÚthisBarlineLocationÚexistingBarlinerÍ   s                        r+   r�   z*PartStaffExporterMixin.moveMeasureContents¨  s  € ðR Œ;˜)Ò#Ð# |Ô'7¸9Ò'DÐ'DÝ)Ø_°7Ð_Ð_ÀÐ_Ð_Ð_ñaô að aàˆ	Ø(-Ðà'×/Ò/°	Ñ:Ô:ð 	@ð 	@ˆKØ(Ô-ˆNØÐ)Ý 	­3¨~Ñ+>Ô+>Ñ?Ô?�	øà˜Š>ˆ>Ø&*Ð#Ø$×,Ò,¨VÑ4Ô4ð 
ð 
�Ý# GÑ,Ô,�	Ø!$�	”ÝÔ,ØØðð ð ðñ ô ð ð ð ˆIð  ˆØ ×(Ò(¨Ñ0Ô0ð 	5ð 	5ˆDØ�yŠy˜Ñ!Ô!Ð-ØØ—)’)˜JÑ'Ô'ˆCØˆ{ØØœHˆMØÐ(Ø¥# mÑ"4Ô"4Ñ4�øØ×'Ò'Ð(:Ñ;Ô;ð 	6ð 	6ˆCØ œXˆNØÐ)Ø¥# nÑ"5Ô"5Ñ5�øØ%×-Ò-Ð.?Ñ@Ô@ð 	5ð 	5ˆIØ%œNˆMØÐ(Ø¥# mÑ"4Ô"4Ñ4�øØð 	*Ý˜xÑ(Ô(ˆHÝ# H¨jÑ9Ô9ˆJÝ! .Ñ1Ô1ˆJŒOØ×Ò Ñ)Ô)Ð)ð —O’O CÑ(Ô(ð $	&ñ $	&ˆDàŒx˜7Ò"Ð"ØØŒx˜<Ò'Ð'Ø—<’< Ñ,Ô,ð àØ&*§l¢l°6Ñ&:Ô&:ð Cð C�NØ"×&Ò& xµ°[Ñ1AÔ1AÑBÔBÐBÐBØŒx˜9Ò$Ð$à&*§h¢h¨zÑ&:Ô&:Ð#Ø'3×';Ò';¸IÑ'FÔ'Fð =ð =�OØ&×*Ò*¨:Ñ6Ô6Ð:MÒMÐMØ$×+Ò+¨OÑ<Ô<Ð<øØŒx˜6Ò!Ð!ØŸ	š	 'Ñ*Ô*�ØÐ$Ø.ð °5´:ð å%(­¨U¬Z©¬¸1Ñ)<Ñ%=Ô%=˜œ
˜
àå# GÑ,Ô,�EÝ!$ Y°¡]Ñ!3Ô!3�E”JÝÔ0ØØð!ð !ð !ðñ ô ð ð ×Ò Ñ%Ô%Ð%Ñ%ðI$	&ð $	&r-   Ú	partStaffústream.PartStaffc                óæ  — | j         D ]}||j        u r|j        �	|j        c S Œ| j         D ]9}|j        j                             ¦   «         D ]}||u r|j        �|j        c c S ŒŒ:| j         D ]'}|j        |j        j        k    r|j        �	|j        c S Œ(| j         D ]E}|j        j                             ¦   «         D ]$}|j        |j        k    r|j        �|j        c c S Œ%ŒFt          |› d�¦  «        ‚)aÏ  
        Look up the <part> Element being used to represent the music21 `partStaff`.

        >>> from music21.musicxml import testPrimitive
        >>> s = converter.parse(testPrimitive.pianoStaff43a)
        >>> SX = musicxml.m21ToXml.ScoreExporter(s)
        >>> SX.scorePreliminaries()
        >>> SX.parsePartlikeScore()
        >>> SX.getRootForPartStaff(s.parts[0])
        <Element 'part' at 0x...

        >>> other = stream.PartStaff()
        >>> other.id = 'unrelated'
        >>> SX.getRootForPartStaff(other)
        Traceback (most recent call last):
        music21.musicxml.xmlObjects.MusicXMLExportException:
            <music21.stream.PartStaff unrelated> not found in self.partExporterList
        Nz# not found in self.partExporterList)rZ   r   rÇ   Ú
derivationÚchainÚidr   )r7   rî   rÈ   Úderiveds       r+   rS   z*PartStaffExporterMixin.getRootForPartStaff+  sV  € ð& Ô(ð 	#ð 	#ˆCØ˜CœJÐ&Ð&¨3¬;Ð+BØ”{Ð"Ð"Ð"øð Ô(ð 	'ð 	'ˆCØœ:Ô0×6Ò6Ñ8Ô8ð 'ð '�Ø˜iÐ'Ð'¨C¬KÐ,CØœ;Ð&Ð&Ð&Ð&Ð&øð'ð
 Ô(ð 	#ð 	#ˆCØŒ|˜sœzœ}Ò,Ð,°´Ð1HØ”{Ð"Ð"Ð"øàÔ(ð 	'ð 	'ˆCØœ:Ô0×6Ò6Ñ8Ô8ð 'ð '�Ø”< 7¤:Ò-Ð-°#´+Ð2IØœ;Ð&Ð&Ð&Ð&Ð&øð'õ &ØÐ=Ð=Ð=ñ?ô ?ð 	?r-   N)r:   r;   )r8   r
   )rx   r   ry   r   r   r   r:   r€   )r   r   rË   r   r   r   )rî   rï   r:   r   )Ú__name__Ú
__module__Ú__qualname__r9   r2   r3   r4   ru   r5   r6   Ústaticmethodr�   rS   rÆ   r-   r+   r/   r/   \   så   € € € € € ð<4ð <4ð <4ð|F"ð F"ð F"ð F"ðP<ð <ð <ð <ð|*ð *ð *ð *ð4Tð Tð Tð Tðlzð zð zð zðxð ð ð ð6 ð@&ð @&ð @&ñ „\ð@&ðD(?ð (?ð (?ð (?ð (?ð (?r-   r/   c                  óh   — e 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„ Zd„ Zd„ ZdS )ÚTestc                óz   — ddl m}  |¦   «         }|                     |¦  «        }|                     d¦  «        }|S )Nr   )ÚGeneralObjectExporterzutf-8)rN   rü   ÚparseÚdecode)r7   Úobjrü   ÚgexÚbytesOutÚbytesOutUnicodes         r+   ÚgetXmlzTest.getXmlX  sH   € ØCÐCÐCÐCÐCÐCà#Ð#Ñ%Ô%ˆØ—9’9˜S‘>”>ˆØ"Ÿ/š/¨'Ñ2Ô2ˆØÐr-   c                óx   — ddl m}  ||¦  «        }|                     ¦   «         }t          j        |¦  «         |S )Nr   ©ÚScoreExporter)rN   r  rý   r   Úindent)r7   rÿ   r  ÚSXÚmxScores        r+   ÚgetETz
Test.getET`  sE   € Ø;Ð;Ð;Ð;Ð;Ð;àˆ]˜3ÑÔˆØ—(’(‘*”*ˆÝŒ�wÑÔÐØˆr-   c                ó„  — ddl m} |                     dd¦  «        }|                      |¦  «        }|                     d¦  «        }|                     d¦  «        }|                      t          |¦  «        d¦  «         |                      |d                              d¦  «        d	¦  «         |                      |d
                              d¦  «        d¦  «         |                      |d                              d¦  «        d¦  «         |                      |d                              d¦  «        j	        d¦  «         dS )zK
        Measure 1, staff 2 contains mid-measure treble clef in LH
        r   ©Úcorpusúschoenberg/opus19rJ   úpart/measurezattributes/clefé   r   r§   r>   Ú2r°   ÚGN)
Úmusic21r  rý   r
  r!   r    ÚassertEqualrQ   r"   r%   )r7   r  ÚschÚrootÚm1Úclefss         r+   ÚtestJoinPartStaffsAzTest.testJoinPartStaffsAh  s  € ð 	#Ð"Ð"Ð"Ð"Ð"Ø�lŠlÐ.°Ñ2Ô2ˆØ�zŠz˜#‰Œˆð �YŠY�~Ñ&Ô&ˆØ—
’
Ð,Ñ-Ô-ˆØ×Ò�˜U™œ QÑ'Ô'Ð'Ø×Ò˜˜qœŸš hÑ/Ô/°Ñ5Ô5Ð5Ø×Ò˜˜qœŸš hÑ/Ô/°Ñ5Ô5Ð5Ø×Ò˜˜qœŸš hÑ/Ô/°Ñ5Ô5Ð5Ø×Ò˜˜qœŸš vÑ.Ô.Ô3°SÑ9Ô9Ð9Ð9Ð9r-   c                óä  — ddl m} ddl m} t          j        ¦   «         }t          j        ¦   «         }|                     d|                     ¦   «         ¦  «         |                     d|                     ¦   «         ¦  «         t          j        ¦   «         }|                     d|                     ¦   «         ¦  «         |                     |¦  «         |                     |¦  «         |                     d| 	                    ||g¦  «        ¦  «         |  
                    |¦  «        }|                     d¦  «        }|D ]H}|                      |                     d¦  «        j        |                     d¦  «        j        ¦  «         ŒI|                     d¦  «        }	|                     d	¦  «        }
t          |d                              d
¦  «        j        ¦  «        t          |	                     d
¦  «        j        ¦  «        z   t          |d                              d
¦  «        j        ¦  «        z   }|                      t          |
                     d
¦  «        j        ¦  «        |¦  «         dS )zU
        Gapful first PartStaff, ensure <backup> in second PartStaff correct
        r   ©Úlayout©rh   r  ú.//noterÍ   r   z
.//forwardz	.//backuprÔ   r>   N)r  r  rh   r   ÚScorerA   rw   ÚNoterT   r
   r
  r    r  r!   r%   r   )r7   r  rh   r\   Úps1Úps2r  ÚnotesÚmxNoterj   rÕ   rä   s               r+   ÚtestJoinPartStaffsBzTest.testJoinPartStaffsBy  s  € ð 	#Ð"Ð"Ð"Ð"Ð"Ø Ð Ð Ð Ð Ð ÝŒL‰NŒNˆÝÔÑ Ô ˆØ�
Š
�1�d—i’i‘k”kÑ"Ô"Ð"à�
Š
�1�d—i’i‘k”kÑ"Ô"Ð"ÝÔÑ Ô ˆØ�
Š
�1�d—i’i‘k”kÑ"Ô"Ð"Ø	�Š�‰ŒˆØ	�Š�‰ŒˆØ	�Š��F×%Ò% s¨C jÑ1Ô1Ñ2Ô2Ð2Ø�zŠz˜!‰}Œ}ˆØ—’˜YÑ'Ô'ˆð ð 	Sð 	SˆFØ×Ò˜VŸ[š[¨Ñ1Ô1Ô6¸¿ºÀGÑ8LÔ8LÔ8QÑRÔRÐRÐRà—)’)˜LÑ)Ô)ˆØ—’˜;Ñ'Ô'ˆå��a”—’˜jÑ)Ô)Ô.Ñ/Ô/Ý�'—,’,˜zÑ*Ô*Ô/Ñ0Ô0ñ1å�%˜”(—-’- 
Ñ+Ô+Ô0Ñ1Ô1ñ2ð 	ð
 	×Ò�˜VŸ[š[¨Ñ4Ô4Ô9Ñ:Ô:¸NÑKÔKÐKÐKÐKr-   c                ó@  — ddl m} ddl m} t          j        ¦   «         }t          j        ¦   «         }|                     |                     ¦   «         d¦  «         |                     d¬¦  «         | 	                    d|¦  «         t          j        ¦   «         }|                     |                     ¦   «         d¦  «         |                     d¬¦  «         | 	                    d|¦  «         | 	                    d| 
                    ||g¦  «        ¦  «         |                      |¦  «        }|                     d¦  «        }|                     d	¦  «        }|                      t          |¦  «        d
¦  «         |                      t          |¦  «        d¦  «         dS )z4
        First PartStaff longer than second
        r   r  r  é   T©ÚinPlaceé   ú
.//measurer  rJ   é   N©r  r  rh   r   r  rA   ÚrepeatAppendr   ÚmakeNotationrw   r
   r
  r    r  rQ   ©	r7   r  rh   r\   r!  r"  r  Úmeasuresr#  s	            r+   ÚtestJoinPartStaffsCzTest.testJoinPartStaffsCš  sv  € ð 	#Ð"Ð"Ð"Ð"Ð"Ø Ð Ð Ð Ð Ð ÝŒL‰NŒNˆÝÔÑ Ô ˆØ×Ò˜Ÿš™œ aÑ(Ô(Ð(Ø×Ò ÐÑ&Ô&Ð&Ø	�Š��CÑÔÐÝÔÑ Ô ˆØ×Ò˜Ÿš™œ aÑ(Ô(Ð(Ø×Ò ÐÑ&Ô&Ð&Ø	�Š��CÑÔÐØ	�Š��F×%Ò% s¨C jÑ1Ô1Ñ2Ô2Ð2Ø�zŠz˜!‰}Œ}ˆØ—<’< Ñ-Ô-ˆØ—’˜YÑ'Ô'ˆØ×Ò�˜X™œ¨Ñ*Ô*Ð*Ø×Ò�˜U™œ RÑ(Ô(Ð(Ð(Ð(r-   c                ó@  — ddl m} ddl m} t          j        ¦   «         }t          j        ¦   «         }|                     |                     ¦   «         d¦  «         |                     d¬¦  «         t          j        ¦   «         }|                     |                     ¦   «         d¦  «         |                     d¬¦  «         | 	                    d|¦  «         | 	                    d|¦  «         | 	                    d| 
                    ||g¦  «        ¦  «         |                      |¦  «        }|                     d¦  «        }|                     d	¦  «        }|                      t          |¦  «        d
¦  «         |                      t          |¦  «        d¦  «         dS )zv
        Same example as testJoinPartStaffsC but switch the hands:
        second PartStaff longer than first
        r   r  r  r'  Tr(  r*  r+  r  rJ   r,  Nr-  r0  s	            r+   ÚtestJoinPartStaffsDzTest.testJoinPartStaffsD°  sx  € ð
 	#Ð"Ð"Ð"Ð"Ð"Ø Ð Ð Ð Ð Ð ÝŒL‰NŒNˆÝÔÑ Ô ˆØ×Ò˜Ÿš™œ aÑ(Ô(Ð(Ø×Ò ÐÑ&Ô&Ð&ÝÔÑ Ô ˆØ×Ò˜Ÿš™œ aÑ(Ô(Ð(Ø×Ò ÐÑ&Ô&Ð&Ø	�Š��CÑÔÐØ	�Š��CÑÔÐØ	�Š��F×%Ò% s¨C jÑ1Ô1Ñ2Ô2Ð2Ø�zŠz˜!‰}Œ}ˆØ—<’< Ñ-Ô-ˆØ—’˜YÑ'Ô'ˆð 	×Ò�˜X™œ¨Ñ*Ô*Ð*Ø×Ò�˜U™œ RÑ(Ô(Ð(Ð(Ð(r-   c                óÖ
  — ddl m} ddl m} t          j        ¦   «         }t          j        ¦   «         }t          j        ¦   «         }|                     d|¦  «         t          j        ¦   «         }t          j        ¦   «         }|                     d|¦  «         |                     d|¦  «         | 	                    | 
                    d¦  «        d¦  «         | 	                    | 
                    d¦  «        d¦  «         |                     d¬¦  «         t          j        ¦   «         }t          j        ¦   «         }	|                     d|	¦  «         t          j        ¦   «         }
t          j        ¦   «         }|	                     d|
¦  «         |	                     d|¦  «         |
 	                    | 
                    d	¦  «        d¦  «         | 	                    | 
                    d
¦  «        d¦  «         |                     d¬¦  «         |                     d|¦  «         |                     d|¦  «         |                     d|                     ||g¦  «        ¦  «         |                      |¦  «        }|                     d¦  «        }|                     d¦  «        }|                      t!          |¦  «        d¦  «         |                      t!          |¦  «        d¦  «         |D �]}}|                     d¦  «        }|                     d¦  «        j        dk    r{|                     d¦  «        j        dk    r]|                      |                     d¦  «        j        d¦  «         |                      |                     d¦  «        j        d¦  «         Œ±|                     d¦  «        j        dk    r||                     d¦  «        j        dk    r^|                      |                     d¦  «        j        d¦  «         |                      |                     d¦  «        j        d¦  «         �ŒK|                     d¦  «        j        dk    r||                     d¦  «        j        dk    r^|                      |                     d¦  «        j        d¦  «         |                      |                     d¦  «        j        d¦  «         �Œå|                     d¦  «        j        dk    rz|                     d¦  «        j        dk    r\|                      |                     d¦  «        j        d¦  «         |                      |                     d¦  «        j        d¦  «         �ŒdS )zc
        Add measures and voices and check for unique voice numbers across the StaffGroup.
        r   r  r  ÚC4r*  ÚE4Tr(  ÚC3ÚG3r+  r  r>   é   ÚpitchÚstepÚCÚoctaveÚ4rÍ   r§   r   ÚEr  Ú3r  N)r  r  rh   r   r  rA   rI   rw   ÚVoicer.  r   r/  r
   r
  r    r  rQ   r!   r%   )r7   r  rh   r\   r!  r  Úv1Úv2r"  Úm2Úv3Úv4r  r1  r#  r$  ÚmxPitchs                    r+   ÚtestJoinPartStaffsD2zTest.testJoinPartStaffsD2É  sž  € ð 	#Ð"Ð"Ð"Ð"Ð"Ø Ð Ð Ð Ð Ð ÝŒL‰NŒNˆÝÔÑ Ô ˆÝŒ^ÑÔˆØ�
Š
�1�bÑÔÐÝŒ\‰^Œ^ˆÝŒ\‰^Œ^ˆØ
�	Š	�!�RÑÔÐØ
�	Š	�!�RÑÔÐØ
�Š˜Ÿ	š	 $™œ¨Ñ+Ô+Ð+Ø
�Š˜Ÿ	š	 $™œ¨Ñ+Ô+Ð+Ø×Ò ÐÑ&Ô&Ð&åÔÑ Ô ˆÝŒ^ÑÔˆØ�
Š
�1�bÑÔÐÝŒ\‰^Œ^ˆÝŒ\‰^Œ^ˆØ
�	Š	�!�RÑÔÐØ
�	Š	�!�RÑÔÐØ
�Š˜Ÿ	š	 $™œ¨Ñ+Ô+Ð+Ø
�Š˜Ÿ	š	 $™œ¨Ñ+Ô+Ð+Ø×Ò ÐÑ&Ô&Ð&à	�Š��CÑÔÐØ	�Š��CÑÔÐØ	�Š��F×%Ò% s¨C jÑ1Ô1Ñ2Ô2Ð2Ø�zŠz˜!‰}Œ}ˆØ—<’< Ñ-Ô-ˆØ—’˜YÑ'Ô'ˆð 	×Ò�˜X™œ¨Ñ*Ô*Ð*Ø×Ò�˜U™œ RÑ(Ô(Ð(ð ð 	Añ 	AˆFØ—k’k 'Ñ*Ô*ˆGØ�|Š|˜FÑ#Ô#Ô(¨CÒ/Ð/°G·L²LÀÑ4JÔ4JÔ4OÐSVÒ4VÐ4VØ× Ò  §¢¨WÑ!5Ô!5Ô!:¸CÑ@Ô@Ð@Ø× Ò  §¢¨WÑ!5Ô!5Ô!:¸CÑ@Ô@Ð@Ð@Ø—’˜fÑ%Ô%Ô*¨cÒ1Ð1°g·l²lÀ8Ñ6LÔ6LÔ6QÐUXÒ6XÐ6XØ× Ò  §¢¨WÑ!5Ô!5Ô!:¸CÑ@Ô@Ð@Ø× Ò  §¢¨WÑ!5Ô!5Ô!:¸CÑ@Ô@Ð@Ñ@Ø—’˜fÑ%Ô%Ô*¨cÒ1Ð1°g·l²lÀ8Ñ6LÔ6LÔ6QÐUXÒ6XÐ6XØ× Ò  §¢¨WÑ!5Ô!5Ô!:¸CÑ@Ô@Ð@Ø× Ò  §¢¨WÑ!5Ô!5Ô!:¸CÑ@Ô@Ð@Ñ@Ø—’˜fÑ%Ô%Ô*¨cÒ1Ð1°g·l²lÀ8Ñ6LÔ6LÔ6QÐUXÒ6XÐ6XØ× Ò  §¢¨WÑ!5Ô!5Ô!:¸CÑ@Ô@Ð@Ø× Ò  §¢¨WÑ!5Ô!5Ô!:¸CÑ@Ô@Ð@ùð	Að 	Ar-   c                óD  — ddl m} ddl m} |                     dd¦  «        }t	          j        ¦   «         }t	          j        ¦   «         }t	          j        ¦   «         }|                     |¦  «         |                     |¦  «         |                     d| 	                    ||g¦  «        ¦  «         |j
        d                              d¦  «        }|j
        d                              d¦  «        }|j
        d                              d¦  «        }	|                     |¦  «         |                     |	¦  «         |                     |j        |¦  «         |                      |¦  «        }
|
                     d¦  «        \  }}}|                      d	„ |                     d
¦  «        D ¦   «         dh¦  «         |                      d„ |                     d
¦  «        D ¦   «         dh¦  «         |                      d„ |                     d
¦  «        D ¦   «         dh¦  «         dS )z^
        Measure numbers existing only in certain PartStaffs: don't collapse together
        r   r  r  r  rJ   r>   r  r  c                ó   — h | ]	}|j         ’Œ
S rÆ   ©r%   ©rD   r   s     r+   ú	<setcomp>z+Test.testJoinPartStaffsE.<locals>.<setcomp>  ó   € ÐNÐNÐN¨˜%œ*ÐNÐNÐNr-   z
note/staffr§   c                ó   — h | ]	}|j         ’Œ
S rÆ   rL  rM  s     r+   rN  z+Test.testJoinPartStaffsE.<locals>.<setcomp>  rO  r-   r  c                ó   — h | ]	}|j         ’Œ
S rÆ   rL  rM  s     r+   rN  z+Test.testJoinPartStaffsE.<locals>.<setcomp>  rO  r-   N)r  r  r  rý   r   r  rA   rT   rw   r
   Úpartsr   Úoffsetr
  r    r  )r7   r  r  r  r\   r!  r"  r  rE  Úm3r  Úm1tagÚm2tagÚm3tags                 r+   ÚtestJoinPartStaffsEzTest.testJoinPartStaffsE  sò  € ð 	#Ð"Ð"Ð"Ð"Ð"Ø"Ð"Ð"Ð"Ð"Ð"Ø�lŠlÐ.°Ñ2Ô2ˆåŒL‰NŒNˆÝÔÑ Ô ˆÝÔÑ Ô ˆØ	�Š�‰ŒˆØ	�Š�‰ŒˆØ	�Š��F×%Ò% s¨C jÑ1Ô1Ñ2Ô2Ð2ØŒY�qŒ\×!Ò! !Ñ$Ô$ˆØŒY�qŒ\×!Ò! !Ñ$Ô$ˆØŒY�qŒ\×!Ò! !Ñ$Ô$ˆØ�
Š
�2‰ŒˆØ�
Š
�2‰ŒˆØ�
Š
�2”9˜bÑ!Ô!Ð!Ø�zŠz˜!‰}Œ}ˆØ"Ÿlšl¨>Ñ:Ô:Ñˆˆu�eØ×ÒÐNÐN°%·-²-ÀÑ2MÔ2MÐNÑNÔNÐQTÐPUÑVÔVÐVØ×ÒÐNÐN°%·-²-ÀÑ2MÔ2MÐNÑNÔNÐQTÐPUÑVÔVÐVØ×ÒÐNÐN°%·-²-ÀÑ2MÔ2MÐNÑNÔNÐQTÐPUÑVÔVÐVÐVÐVr-   c                óÜ  — ddl m} ddl m} |                     dd¦  «        }|j                             ¦   «         }|                      t          d¦  «        5  |                     | 	                    ¦   «         ¦  «        }ddd¦  «         n# 1 swxY w Y   |j         
                    |¦  «        }|                     ¦   «          |                     ¦   «          |                     ¦   «          dS )zi
        Flattening the score will leave StaffGroup spanners with parts no longer in the stream.
        r   r  ©Úmusicxmlr  rJ   znot well-formedN)r  r  r[  rý   Úm21ToXmlrü   ÚassertWarnsRegexÚWarningÚfromGeneralObjectÚflattenr  ÚscorePreliminariesÚparseFlatScorer9   )r7   r  r[  r  r   rÿ   r  s          r+   ÚtestJoinPartStaffsFzTest.testJoinPartStaffsF  s-  € ð 	#Ð"Ð"Ð"Ð"Ð"Ø$Ð$Ð$Ð$Ð$Ð$Ø�lŠlÐ.°Ñ2Ô2ˆð Ô×5Ò5Ñ7Ô7ˆØ×"Ò"¥7Ð,=Ñ>Ô>ð 	7ð 	7à×'Ò'¨¯ª©¬Ñ6Ô6ˆCð	7ð 	7ð 	7ñ 	7ô 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7øøøð 	7ð 	7ð 	7ð 	7ð Ô×,Ò,¨SÑ1Ô1ˆØ
×ÒÑÔÐØ
×ÒÑÔÐà
×ÒÑÔÐÐÐs   Á(BÂBÂBc                ó–  — ddl m} ddl m} |                     d¦  «        }|                     d¦  «        }|                      d|j        ¦  «         |j                             |¦  «        }| 	                    ¦   «          | 
                    ¦   «          |                      t          |                     ¦   «         ¦  «        d¦  «         dS )zD
        A derived score should still have joinable groups.
        r   r  rZ  zdemos/two-partsr>   r  N)r  r  r[  rý   r   ÚassertInÚclassesr\  r  ra  ÚparsePartlikeScorer  rQ   r2   )r7   r  r[  r\   r  r  s         r+   ÚtestJoinPartStaffsGzTest.testJoinPartStaffsG/  sÉ   € ð 	#Ð"Ð"Ð"Ð"Ð"Ø$Ð$Ð$Ð$Ð$Ð$Ø�LŠLÐ*Ñ+Ô+ˆà�YŠY�q‰\Œ\ˆØ�Š�g˜rœzÑ*Ô*Ð*ØÔ×,Ò,¨RÑ0Ô0ˆØ
×ÒÑÔÐØ
×ÒÑÔÐØ×Ò�˜R×.Ò.Ñ0Ô0Ñ1Ô1°1Ñ5Ô5Ð5Ð5Ð5r-   c                ó   — ddl m} t          j        t          j        ¦   «         ¦  «        }t          j        t          j        ¦   «         ¦  «        }t          j        t          j        ¦   «         ¦  «        }t          ||g¦  «        }t          ||g¦  «        }t          j        |||||g¦  «        }|j                             |¦  «        }| 	                    ¦   «          |  
                    t          ¦  «        5  |                     ¦   «          |                      |                     ¦   «         g ¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z�
        Overlapping PartStaffs cannot be guaranteed to export correctly,
        so they fall back to the old export paradigm (no joinable groups).
        r   rZ  N)r  r[  r   rA   rI   r
   r  r\  r  ra  ÚassertWarnsr   rg  r  r2   )	r7   r[  r!  r"  Úps3Úsg1Úsg2r\   r  s	            r+   ÚtestJoinPartStaffsHzTest.testJoinPartStaffsH>  sn  € ð
 	%Ð$Ð$Ð$Ð$Ð$åÔ�vœ~Ñ/Ô/Ñ0Ô0ˆÝÔ�vœ~Ñ/Ô/Ñ0Ô0ˆÝÔ�vœ~Ñ/Ô/Ñ0Ô0ˆÝ˜#˜s˜Ñ$Ô$ˆÝ˜#˜s˜Ñ$Ô$ˆÝŒL˜#˜s C¨¨cÐ2Ñ3Ô3ˆàÔ×,Ò,¨QÑ/Ô/ˆØ
×ÒÑÔÐØ×Ò�oÑ.Ô.ð 	6ð 	6Ø×!Ò!Ñ#Ô#Ð#Ø×Ò˜R×.Ò.Ñ0Ô0°"Ñ5Ô5Ð5ð	6ð 	6ð 	6ñ 	6ô 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6øøøð 	6ð 	6ð 	6ð 	6ð 	6ð 	6s   Ã9=EÅEÅ
Ec                ó®   — ddl m} ddlm} |                     d¦  «        } ||¦  «        }|                     ¦   «          |                     ¦   «          dS )zŒ
        Regression test for side effects on the stream passed to ScoreExporter
        preventing it from being written out again.
        r   r  r  ÚcpebachN)r  r  rN   r  rý   )r7   r  r  Úbr  s        r+   ÚtestJoinPartStaffsAgainzTest.testJoinPartStaffsAgainR  sf   € ð
 	#Ð"Ð"Ð"Ð"Ð"Ø;Ð;Ð;Ð;Ð;Ð;Ø�LŠL˜Ñ#Ô#ˆØˆ]˜1ÑÔˆØ
�Š‰
Œ
ˆ
Ø
�Š‰
Œ
ˆ
ˆ
ˆ
r-   c                ó¬  — ddl m} ddl m} ddl m} t	          j        ¦   «         }t	          j        ¦   «         }|                     ||g¦  «        }t	          j        |||g¦  «        }||fD ]©}|                     d| 	                    d¦  «        ¦  «         | 
                    |                     d¬¦  «        d¦  «         |                     d	¬
¦  «         |t          j                 d                              | 	                    d¦  «        ¦  «         Œª|                      |¦  «        }	|                      t!          |	                     d¦  «        ¦  «        d¦  «         d|t          j                                      ¦   «         _        |                      |¦  «        }	|                      t!          |	                     d¦  «        ¦  «        d¦  «         d S )Nr   r  )Úmeterr  z3/1Úwhole©rÎ   é   Tr(  r>   z4/1zpart/measure/attributes/timerJ   r  )r  r  rt  rh   r   rA   r
   r  rw   r   r.  r   r/  rI   r
  r  rQ   r    Úlastr   )
r7   r  rt  rh   r!  r"  r^   r\   rp   r  s
             r+   ÚtestMeterChangeszTest.testMeterChanges^  sµ  € Ø"Ð"Ð"Ð"Ð"Ð"Ø!Ð!Ð!Ð!Ð!Ð!Ø Ð Ð Ð Ð Ð åÔÑ Ô ˆÝÔÑ Ô ˆØ×Ò  S˜zÑ*Ô*ˆÝŒL˜#˜s B˜Ñ(Ô(ˆØ�s�(ð 	Eð 	EˆBØ�IŠI�a˜×,Ò,¨UÑ3Ô3Ñ4Ô4Ð4Ø�OŠO˜DŸIšI¨7˜IÑ3Ô3°QÑ7Ô7Ð7Ø�OŠO DˆOÑ)Ô)Ð)Ø�vŒ~Ô˜qÔ!×(Ò(¨×)<Ò)<¸UÑ)CÔ)CÑDÔDÐDÐDà�zŠz˜!‰}Œ}ˆà×Ò�˜TŸ\š\Ð*HÑIÔIÑJÔJÈAÑNÔNÐNð -.ˆ�FŒNÔ× Ò Ñ"Ô"Ô)Ø�zŠz˜!‰}Œ}ˆØ×Ò�˜TŸ\š\Ð*HÑIÔIÑJÔJÈAÑNÔNÐNÐNÐNr-   c                óØ  — ddl m} ddl m} ddl m} t	          j        |                     d¦  «        ¦  «        }t	          j        |                     d¦  «        ¦  «        }|                     ||g¦  «        }t	          j        |||g¦  «        }|  	                    |¦  «        }|  
                    |                     d¦  «        d         j        t          |j        ¦  «        ¦  «         dS )	zU
        Regression test for chord members causing too-large backup amounts.
        r   )rÓ   )Údefaultsr  zC E GzD F Azpart/measure/backup/durationN)r  rÓ   r{  r  r   rA   ÚChordr
   r  r
  r  r    r%   r$   ÚdivisionsPerQuarter)	r7   rÓ   r{  r  r!  r"  r^   r\   r  s	            r+   ÚtestBackupAmountzTest.testBackupAmountv  sõ   € ð 	"Ð!Ð!Ð!Ð!Ð!Ø$Ð$Ð$Ð$Ð$Ð$Ø"Ð"Ð"Ð"Ð"Ð"åÔ˜uŸ{š{¨7Ñ3Ô3Ñ4Ô4ˆÝÔ˜uŸ{š{¨7Ñ3Ô3Ñ4Ô4ˆØ×Ò  S˜zÑ*Ô*ˆÝŒL˜"˜c 3˜Ñ(Ô(ˆà�zŠz˜!‰}Œ}ˆØ×ÒØ�LŠLÐ7Ñ8Ô8¸Ô;Ô@Ý�Ô,Ñ-Ô-ñ	
ô 	
ð 	
ð 	
ð 	
r-   c                ó  — ddl m} ddl m} ddl m} t	          j        |                     d¬¦  «        |                     d¬¦  «        g¦  «        }|                     |                     d	¬¦  «        ¦  «         t	          j        |                     d¬¦  «        |                     d¬¦  «        g¦  «        }|                     |                     d	¬¦  «        ¦  «         t	          j	        |¦  «        }t	          j	        |¦  «        }| 
                    ||g¦  «        }t	          j        |||g¦  «        }	|                      |	¦  «        }
|                      d
„ |
                     d¦  «        D ¦   «         ddg¦  «         dS )zB
        Regression test for losing forward repeat marks.
        r   )Úbarr  r  Ústart©ri   ru  rv  Úendc                ó8   — g | ]}|                      d ¦  «        ‘ŒS r‚  )r"   )rD   Úrs     r+   rÊ   z/Test.testForwardRepeatMarks.<locals>.<listcomp>Ÿ  s$   € ÐCÐCÐC AˆQ�UŠU�;ÑÔÐCÐCÐCr-   z	.//repeatrj   ÚbackwardN)r  r€  r  rh   r   rI   ÚRepeatr   Ú
storeAtEndrA   r
   r  r
  r  r    )r7   r€  r  rh   Ú	measureRHÚ	measureLHr!  r"  r^   r\   r  s              r+   ÚtestForwardRepeatMarkszTest.testForwardRepeatMarks‰  sŽ  € ð 	 ÐÐÐÐÐØ"Ð"Ð"Ð"Ð"Ð"Ø Ð Ð Ð Ð Ð å”NØ�ZŠZ 'ˆZÑ*Ô*¨D¯IªI¸7¨IÑ,CÔ,CÐDñFô Fˆ	à×Ò˜SŸZšZ°%˜ZÑ8Ô8Ñ9Ô9Ð9Ý”NØ�ZŠZ 'ˆZÑ*Ô*¨D¯IªI¸7¨IÑ,CÔ,CÐDñFô Fˆ	à×Ò˜SŸZšZ°%˜ZÑ8Ô8Ñ9Ô9Ð9åÔ˜yÑ)Ô)ˆÝÔ˜yÑ)Ô)ˆØ×Ò  S˜zÑ*Ô*ˆÝŒL˜"˜c 3˜Ñ(Ô(ˆà�zŠz˜!‰}Œ}ˆØ×ÒØCÐC¨¯ª°kÑ)BÔ)BÐCÑCÔCØ˜
Ð#ñ	
ô 	
ð 	
ð 	
ð 	
r-   N)rõ   rö   r÷   r  r
  r  r%  r2  r4  rI  rX  rc  rh  rn  rr  ry  r~  r‹  rÆ   r-   r+   rú   rú   V  s  € € € € € ðð ð ðð ð ð:ð :ð :ð"Lð Lð LðB)ð )ð )ð,)ð )ð )ð26Að 6Að 6AðpWð Wð Wð4ð ð ð(6ð 6ð 6ð6ð 6ð 6ð(
ð 
ð 
ðOð Oð Oð0
ð 
ð 
ð&
ð 
ð 
ð 
ð 
r-   rú   Ú__main__)r   r   r   r   r   r   )"Ú__doc__Ú
__future__r   ÚtypingrL   ÚunittestrX   Úxml.etree.ElementTreer   r   r   Úmusic21.common.miscr   Úmusic21.common.typesr   Úmusic21.keyr	   Úmusic21.layoutr
   Úmusic21.meterr   r  r   Úmusic21.musicxmlr   Úmusic21.musicxml.xmlObjectsr   r   r,   r/   ÚTestCaserú   rõ   ÚmainTestrÆ   r-   r+   ú<module>r›     s¬  ððð ð #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø €€€Ø €€€Ø >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >à +Ð +Ð +Ð +Ð +Ð +Ø +Ð +Ð +Ð +Ð +Ð +Ø $Ð $Ð $Ð $Ð $Ð $Ø %Ð %Ð %Ð %Ð %Ð %Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø Ð Ð Ð Ð Ð à $Ð $Ð $Ð $Ð $Ð $Ø PÐ PÐ PÐ PÐ PÐ PÐ PÐ Pð8Dð 8Dð 8Dð 8Dðvw?ð w?ð w?ð w?ð w?ñ w?ô w?ð w?ðtK
ð K
ð K
ð K
ð K
ˆ8Ôñ K
ô K
ð K
ð\
 ˆzÒÐØ€N€N€NØ€GÔ�TÑÔÐÐÐð Ðr-   