§
    ƒØjx¿  ã                  óœ  — d dl mZ g d¢Zd dlmZ d dlZd dlZd dlZd dl	m
Z
 d dl	mZ d dl	mZ d dl	mZ  ej        d	¦  «        Z G d
„ dej        ¦  «        Z G d„ dej        ¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z G d„ dej        ¦  «        Z G d„ de¦  «        Z G d„ dej        ¦  «        Z G d„ de¦  «        Z G d„ dej        ¦  «        Z G d „ d!ej        ¦  «        ZeeeeeeeefZeej        z  ez  Z eez  ez  ez  e!z  Z"e#d"k    rd dl	Z	 e	j$        e¦  «         dS dS )#é    )Úannotations)ÚContributorÚ	CopyrightÚCreatorÚDateÚDateBetweenÚDatePrimitiveÚDateRelativeÚDateSelectionÚ
DateSingleÚImprintÚTextÚ	ValueType)ÚIterableN)Úcommon)Úenvironment)Úexceptions21)Úprebasezmetadata.primitivesc                  óÖ   — e Zd ZdZdZdZdZdddddddddddddœd/d„Zd0d„Zd„ Z	d1d„Z
d„ Zed „ ¦   «         Zd2d"„Zd3d&„Zd4d(„Zd5d+„Zed,„ ¦   «         Zed-„ ¦   «         Zed.„ ¦   «         ZdS )6r   aË  
    A single date value, specified by year, month, day, hour, minute, and
    second. Note that this class has been created, instead of using Python's
    datetime, to provide greater flexibility for processing unconventional
    dates, ancient dates, dates with error, and date ranges.

    The :attr:`~music21.metadata.Date.datetime` property can be used to
    retrieve a datetime object when necessary.

    Additionally, each value can be specified as `uncertain` or `approximate`;
    if None, assumed to be certain.

    Date objects are fundamental components of
    :class:`~music21.metadata.DateSingle` and related subclasses that represent
    single dates and date ranges.

    >>> a = metadata.Date(year=1843, yearError='approximate')
    >>> a.year
    1843

    >>> a.yearError
    'approximate'

    >>> a = metadata.Date(year='1843?')
    >>> a.yearError
    'uncertain'

    >>> d = metadata.Date(year=1805, month=3, monthError='approximate')
    >>> str(d)
    '1805/03~/--'

    Note that milliseconds are not retained, as this is a tool for musicology
    and not for file timestamps.  However, unlike datetime objects, dates
    in the distant past are supported (though not currently BC/BCE dates).
    )ú~Úx)ú?Úz)ú<Ú{ú>Ú}N)ÚyearÚmonthÚdayÚhourÚminuteÚsecondÚ	yearErrorÚ
monthErrorÚdayErrorÚ	hourErrorÚminuteErrorÚsecondErrorr   úint | str | Noner   r    r!   r"   r#   úint | float | str | Noner$   ú
str | Noner%   r&   r'   r(   r)   c               ó†  — |�|€|                       |¦  «        \  }}|�|€|                       |¦  «        \  }}|�|	€|                       |¦  «        \  }}	|�|
€|                       |¦  «        \  }}
|�|€|                       |¦  «        \  }}|�|€|                       |¦  «        \  }}|                      ||||||¬¦  «         t          j        t          d z  |¦  «        | _        t          j        t          d z  |¦  «        | _        t          j        t          d z  |¦  «        | _        t          j        t          d z  |¦  «        | _        t          j        t          d z  |¦  «        | _	        t          j        t          d z  |¦  «        | _
        || _        || _        |	| _        |
| _        || _        || _        d| _        d S )N©r   r   r    r!   r"   r#   )Ú_stripErrorÚ_sanityCheckÚtÚcastÚintr   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   Ú	attrNames)Úselfr   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   s                ú�/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/metadata/primitives.pyÚ__init__zDate.__init__Z   s·  € ð Ð 	Ð 1Ø"×.Ò.¨tÑ4Ô4‰OˆD�)ØÐ Ð!3Ø $× 0Ò 0°Ñ 7Ô 7ÑˆE�:Øˆ?˜xÐ/Ø ×,Ò,¨SÑ1Ô1‰MˆC�ØÐ 	Ð 1Ø"×.Ò.¨tÑ4Ô4‰OˆD�)ØÐ +Ð"5Ø"&×"2Ò"2°6Ñ":Ô":ÑˆF�KØÐ +Ð"5Ø"&×"2Ò"2°6Ñ":Ô":ÑˆF�Kà×Ò˜t¨5°cÀÈVÐ\bÐÑcÔcÐcå”F�3˜t™8 TÑ*Ô*ˆŒ	Ý”V�C ™H eÑ,Ô,ˆŒ
Ý”6�#˜d™( CÑ(Ô(ˆŒÝ”F�3˜t™8 TÑ*Ô*ˆŒ	Ý”f�S ™X vÑ.Ô.ˆŒÝ”f�S ™X vÑ.Ô.ˆŒð $-ˆŒØ$.ˆŒØ"*ˆŒØ#,ˆŒØ%0ˆÔØ%0ˆÔØMˆŒˆˆó    ÚreturnÚboolc                óB   — t          | ¦  «        t          |¦  «        k    S ©N©Ústr©r5   Úothers     r6   Ú__eq__zDate.__eq__‰   s   € Ý�4‰yŒy�C ™JœJÒ&Ð&r8   c           	     ó¤  — g }| j         €| j        €
| j        €d}nd}t          | j        ¦  «        D ]Ë\  }}||k    r n¿t          j        t          t          | |¦  «        ¦  «        }t          j        t          t          | |dz   ¦  «        ¦  «        }|€| 	                    d¦  «         Œx|dk    rd}nd}||z  }|�|t                               |¦  «        z  }t          |¦  «        }| 	                    |¦  «         ŒÌd	                     |dd
…         ¦  «        }	t          |¦  «        d
k    r#|	dd                     |d
d…         ¦  «        z   z  }	|	S )z¿
        Return a string representation, including error if defined.

        >>> d = metadata.Date()
        >>> d.loadStr('1030?/12~/?4')
        >>> str(d)
        '1030?/12~/04?'
        Né   é   ÚErrorú--r   z%04.iz%02.iú/é   ú:)r!   r"   r#   Ú	enumerater4   r1   r2   r>   ÚgetattrÚappendr   ÚerrorToSymbolÚjoinÚlen)
r5   ÚmsgÚ
breakIndexÚiÚattrÚvalueÚerrorÚfmtÚsubÚouts
             r6   Ú__str__zDate.__str__Œ   sR  € ð ˆØŒ9Ð ¤Ð!4¸¼Ð9LØˆJˆJàˆJå  ¤Ñ0Ô0ð 	 ð 	 ‰GˆAˆtØ�JŠˆØ�Ý”F�3¥¨¨dÑ 3Ô 3Ñ4Ô4ˆEÝ”F�3¥¨¨d°W©nÑ =Ô =Ñ>Ô>ˆEØˆ}Ø—
’
˜4Ñ Ô Ð Ð à˜6’>�>Ø!�C�Cà!�CØ˜E‘k�ØÐ$Ø�4×-Ò-¨eÑ4Ô4Ñ4�CÝ˜#‘h”h�Ø—
’
˜3‘”��Ø�hŠh�s˜2˜A˜2”wÑÔˆÝˆs‰8Œ8�aŠ<ˆ<Ø�3˜Ÿš # a b b¤'Ñ*Ô*Ñ*Ñ*ˆCØˆ
r8   rT   úint | float | strútuple[int, str | None]c                ó†  — d}t          |t          ¦  «        r‹| j        | j        z   | j        z   }d}|D ]
}||v r|} nŒ|| j        v r|                     |d¦  «        }d}nC|| j        v r|                     |d¦  «        }d}n!|| j        v r|                     |d¦  «        }d}t          |¦  «        }t          |¦  «        |fS )a¶  
        Strip error symbols from a numerical value. Return cleaned source and
        sym. Only one error symbol is expected per string.

        >>> d = metadata.Date()
        >>> d._stripError('1247~')
        (1247, 'approximate')

        >>> d._stripError('63?')
        (63, 'uncertain')

        Milliseconds are not retained -- this is for musicology, not computers:

        >>> d._stripError('4.43')
        (4, None)
        NÚ ÚapproximateÚ	uncertainÚpriority)Ú
isinstancer>   ÚapproximateSymbolsÚuncertainSymbolsÚpriorTimeSymbolsÚreplaceÚfloatr3   )r5   rT   ÚuncertaintyÚsymÚfoundÚchars         r6   r/   zDate._stripError´   sõ   € ð& !%ˆÝ�e�SÑ!Ô!ð 	)ØÔ)¨DÔ,AÑAÀDÔDYÑYˆCØˆEØð ð �Ø˜3�;�;Ø �EØ�Eð ð ˜Ô/Ð/Ð/ØŸš e¨RÑ0Ô0�Ø+��Ø˜$Ô/Ð/Ð/ØŸš e¨RÑ0Ô0�Ø)��Ø˜$Ô/Ð/Ð/ØŸš e¨RÑ0Ô0�Ø(�õ �e‘”ˆÝ�5‰zŒz˜;Ð&Ð&r8   c               ót  ‡‡‡— ˆˆˆfd„}‰�‰dk     s‰dk    rt          d‰› d�¦  «        ‚‰�1‰dk    s‰dk     s‰�# |‰‰‰¦  «        rt          d‰› d‰› d�¦  «        ‚|�|d	k     s|d
k    rt          d¦  «        ‚|�|d	k     s|dk    rt          d¦  «        ‚|�|d	k     s|dk    rt          d¦  «        ‚d S d S )Nc                óZ   •— ‰dv r‰dk    p ‰dk    o‰dk    p‰dk    o‰dk    o‰d uo‰dz  S )N)rH   é   é	   é   é   é   é   rH   © )ÚmÚdÚyr    r   r   s      €€€r6   Ú
month_failz%Date._sanityCheck.<locals>.month_failÞ   sZ   ø€ à˜mÐ+Ð9°°r²	ð TØ š
Ð/ s¨R¢xðTà š
ÐR s¨b¢yÐR°TÀÐ5EÐRÈ$ÐQRÉ(ðUr8   é   é   z$Month must be between 1 and 12, not ú.rp   zDay z is not possible with month r   é   zHour must be between 0 and 23é;   zMinute must be between 0 and 59zSecond must be between 0 and 59)Ú
ValueError)r5   r   r   r    r!   r"   r#   rw   s    ```    r6   r0   zDate._sanityCheckÝ   s.  øøø€ ð	Uð 	Uð 	Uð 	Uð 	Uð 	Uð 	Uð Ð %¨!¢) )¨u°rªz¨zÝÐLÀEÐLÐLÐLÑMÔMÐMØˆ?Ø�b’�Ø˜’7�7ØÐ$¨¨°E¸3ÀÑ)EÔ)EÐ$ÝÐM CÐMÐMÀUÐMÐMÐMÑNÔNÐNØÐ ¨¢ ¨T°BªY¨YÝÐ<Ñ=Ô=Ð=ØÐ 6¨A¢: :°¸"²°ÝÐ>Ñ?Ô?Ð?ØÐ 6¨A¢: :°¸"²°ÝÐ>Ñ?Ô?Ð?ð Ð°°r8   c                óÚ   — |                       ¦   «         t          j        dz   v rt          j        d         S |                       ¦   «         t          j        dz   v rt          j        d         S dS )z×
        Convert an error string (approximate, uncertain) into a symbol.

        >>> metadata.Date.errorToSymbol('approximate')
        '~'

        >>> metadata.Date.errorToSymbol('uncertain')
        '?'
        )r^   r   )r_   N)Úlowerr   rb   rc   )rT   s    r6   rM   zDate.errorToSymbolô   s`   € ð �;Š;‰=Œ=�DÔ3Ð6FÑFÐFÐFÝÔ*¨1Ô-Ð-Ø�;Š;‰=Œ=�DÔ1°NÑBÐBÐBÝÔ(¨Ô+Ð+ð CÐBr8   ÚDateParseTypec                ó"  — t          |t          j        ¦  «        r|                      |¦  «         n¥t          |t          ¦  «        r|                      |¦  «         nzt          |t
          ¦  «        r#|                      t          |¦  «        ¦  «         nBt          |t          ¦  «        r|                      |¦  «         nt          j	        d|› �¦  «        ‚|  
                    | j        | j        | j        | j        | j        | j        ¬¦  «         dS )a"  
        Load values by string, datetime object, or Date object:

        >>> a = metadata.Date(year=1843, month=3, day=3)
        >>> b = metadata.Date()
        >>> b.load(a)
        >>> b.year
        1843

        If there is an error, a ValueError is raised, but the
        incorrect values are retained:

        >>> d = metadata.Date()
        >>> d.load('1999/14/32/25:60:61')
        Traceback (most recent call last):
        ValueError: Month must be between 1 and 12, not 14.
        >>> str(d)
        '1999/14/32/25:60:61'
        zCannot load data: r.   N)ra   ÚdatetimeÚloadDatetimer>   ÚloadStrr3   r   Ú	loadOtherr   ÚMetadataExceptionr0   r   r   r    r!   r"   r#   ©r5   rT   s     r6   Úloadz	Date.load  s  € õ( �e�XÔ.Ñ/Ô/ð 		OØ×Ò˜eÑ$Ô$Ð$Ð$Ý˜�sÑ#Ô#ð 	OØ�LŠL˜ÑÔÐÐÝ˜�sÑ#Ô#ð 	OØ�LŠL�˜U™œÑ$Ô$Ð$Ð$Ý˜�tÑ$Ô$ð 	OØ�NŠN˜5Ñ!Ô!Ð!Ð!åÔ0Ð1MÀeÐ1MÐ1MÑNÔNÐNØ×Ò˜tœy°´
ÀÄØ#œy°´ÀTÄ[ð 	ñ 	Rô 	Rð 	Rð 	Rð 	Rr8   Údtúdatetime.datetimeÚNonec                ó„   — | j         D ]7}t          ||¦  «        r%t          ||¦  «        }|dvrt          | ||¦  «         Œ8dS )a?  
        Load time data from a datetime object:

        >>> import datetime
        >>> dt = datetime.datetime(2005, 2, 1)
        >>> dt
        datetime.datetime(2005, 2, 1, 0, 0)

        >>> m21mdDate = metadata.Date()
        >>> m21mdDate.loadDatetime(dt)
        >>> str(m21mdDate)
        '2005/02/01'
        )r   NN)r4   ÚhasattrrK   Úsetattr)r5   r‰   rS   rT   s       r6   rƒ   zDate.loadDatetime%  s^   € ð ”Nð 	/ð 	/ˆDÝ�r˜4Ñ Ô ð /å  DÑ)Ô)�Ø 	Ð)Ð)Ý˜D $¨Ñ.Ô.Ð.øð	/ð 	/r8   r@   c           	     óà   — | j         D ]e}t          ||¦  «        �St          | |t          ||¦  «        ¦  «         |dz   }t          ||¦  «        �t          | |t          ||¦  «        ¦  «         ŒfdS )aj  
        Load values based on another Date object.  (the "Other" in "loadOther"
        means another Date object, not just anything.

        >>> a = metadata.Date(year=1843, month=3, day=3, yearError='approximate')
        >>> b = metadata.Date()
        >>> b.loadOther(a)
        >>> b.year
        1843
        >>> b.yearError
        'approximate'
        NrE   )r4   rK   rŽ   )r5   r@   rS   Ú	errorAttrs       r6   r…   zDate.loadOther;  s…   € ð ”Nð 	Hð 	HˆDÝ�u˜dÑ#Ô#Ð/Ý˜˜d¥G¨E°4Ñ$8Ô$8Ñ9Ô9Ð9Ø  7™N�	Ý˜5 )Ñ,Ô,Ð8Ý˜D )­W°U¸IÑ-FÔ-FÑGÔGÐGøð	Hð 	Hr8   ÚdateStrr>   c                ó>  — g }g }|                      dd¦  «        }|                      dd¦  «        }|                     d¦  «        D ]P}|dk    rd\  }}n|                      |¦  «        \  }}|                     |¦  «         |                     |¦  «         ŒQt	          t          | j        ¦  «        ¦  «        D ]d}t          |¦  «        |k    rOt          | | j        |         ||         ¦  «         ||         �%t          | | j        |         dz   ||         ¦  «         ŒedS )	aL  
        Load a string date representation, which might have approximate
        symbols.

        Assume `year/month/day/hour:minute:second`:

        >>> d = metadata.Date()
        >>> d.loadStr('1030?/12~/?4')
        >>> d.month, d.monthError
        (12, 'approximate')

        >>> d.year, d.yearError
        (1030, 'uncertain')

        >>> d.month, d.monthError
        (12, 'approximate')

        >>> d.day, d.dayError
        (4, 'uncertain')

        >>> d = metadata.Date()
        >>> d.loadStr('1834/12/4/4:50:32')
        >>> d.minute, d.second
        (50, 32)
        rI   rG   ú r]   rF   )NNNrE   )re   Úsplitr/   rL   ÚrangerO   r4   rŽ   )r5   r‘   ÚpostÚ	postErrorÚchunkrT   rU   rR   s           r6   r„   zDate.loadStrO  s+  € ð4  "ˆØ$&ˆ	Ø—/’/ # sÑ+Ô+ˆØ—/’/ # rÑ*Ô*ˆØ—]’] 3Ñ'Ô'ð 	$ð 	$ˆEØ˜Š}ˆ}Ø)‘��u�uà#×/Ò/°Ñ6Ô6‘��uØ�KŠK˜ÑÔÐØ×Ò˜UÑ#Ô#Ð#Ð#å•s˜4œ>Ñ*Ô*Ñ+Ô+ð 	Mð 	MˆAÝ�4‰yŒy˜1Š}ˆ}Ý˜˜dœn¨QÔ/°°a´Ñ9Ô9Ð9Ø˜Q”<Ð+Ý˜D $¤.°Ô"3°gÑ"=¸yÈ¼|ÑLÔLÐLøð		Mð 	Mr8   c                ó¢   — g }| j         D ]8}t          | |¦  «        }|€ n#|                     t          |¦  «        ¦  «         Œ9t	          j        |Ž S )a  
        Get a datetime object from a metadata.Date() object

        >>> a = metadata.Date(year=1843, month=3, day=3)
        >>> str(a)
        '1843/03/03'

        >>> a.datetime
        datetime.datetime(1843, 3, 3, 0, 0)

        Lack of a required date element raises an exception:

        >>> a = metadata.Date(year=1843, month=3)
        >>> str(a)
        '1843/03/--'

        >>> a.datetime
        Traceback (most recent call last):
        TypeError: function missing required argument 'day' (pos 3)
        )r4   rK   rL   r3   r‚   )r5   r–   rS   rT   s       r6   r‚   zDate.datetime}  s^   € ð, ˆð ”Nð 	$ð 	$ˆDå˜D $Ñ'Ô'ˆEØˆ}Ø�Ø�KŠK�˜E™
œ
Ñ#Ô#Ð#Ð#ÝÔ  $Ð'Ð'r8   c                ó4   — | j         €| j        €| j        �dS dS )a  
        Return True if any time elements are defined:

        >>> a = metadata.Date(year=1843, month=3, day=3)
        >>> a.hasTime
        False

        >>> b = metadata.Date(year=1843, month=3, day=3, minute=3)
        >>> b.hasTime
        True
        NTF©r!   r"   r#   ©r5   s    r6   ÚhasTimezDate.hasTimež  s&   € ð ŒIÐ!Ø”;Ð*Ø”;Ð*Ø�4à�5r8   c                óF   — | j         D ]}t          | |dz   ¦  «        � dS ŒdS )aÊ  
        Return True if any data points have error defined:

        >>> a = metadata.Date(
        ...     year=1843,
        ...     month=3,
        ...     day=3,
        ...     dayError='approximate',
        ...     )
        >>> a.hasError
        True

        >>> b = metadata.Date(
        ...     year=1843,
        ...     month=3,
        ...     day=3,
        ...     minute=3,
        ...     )
        >>> b.hasError
        False

        rE   NTF)r4   rK   )r5   rS   s     r6   ÚhasErrorzDate.hasError²  s:   € ð0 ”Nð 	ð 	ˆDÝ�t˜T G™^Ñ,Ô,Ð8Ø�t�tð 9àˆur8   )r   r*   r   r*   r    r*   r!   r*   r"   r*   r#   r+   r$   r,   r%   r,   r&   r,   r'   r,   r(   r,   r)   r,   ©r9   r:   )rT   rZ   r9   r[   )rT   r€   )r‰   rŠ   r9   r‹   )r@   r   r9   r‹   )r‘   r>   r9   r‹   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rb   rc   rd   r7   rA   rY   r/   r0   ÚstaticmethodrM   rˆ   rƒ   r…   r„   Úpropertyr‚   r�   rŸ   rs   r8   r6   r   r   /   s”  € € € € € ð"ð "ðH $ÐØ!ÐØ+Ðð '+Ø'+Ø%)Ø&*Ø(,Ø.2Ø'+Ø(,Ø&*Ø'+Ø)-Ø)-ð,Nð ,Nð ,Nð ,Nð ,Nð ,Nð^'ð 'ð 'ð 'ð%ð %ð %ðP''ð ''ð ''ð ''ðR@ð @ð @ð. ð,ð ,ñ „\ð,ðRð Rð Rð RðB/ð /ð /ð /ð,Hð Hð Hð Hð(*Mð *Mð *Mð *Mð\ ð(ð (ñ „Xð(ð@ ðð ñ „Xðð& ðð ñ „Xðð ð r8   r   c                  ó~   — e Zd ZdZddd„Zdd„Zdd	„Zd
„ Zed„ ¦   «         Z	ed„ ¦   «         Z
e
j        d„ ¦   «         Z
dS )r	   a'  
    A default class for all date objects, which can have different types
    and different "relevance" values.

    Note that the interaction between uncertainty on an entire DatePrimitive object
    vs uncertainty on a particular Date value, like month, is ill-defined
    and needs work.
    ÚcertainÚ	relevancer>   c                ó>   — g | _         d| _        g | _        || _        d S ©Nr]   )Ú_dataÚ
_relevanceÚ_dataUncertaintyr©   )r5   r©   s     r6   r7   zDatePrimitive.__init__Ü  s%   € Ø!#ˆŒ
ØˆŒð
 13ˆÔØ"ˆŒˆˆr8   r9   r:   c                óž   — t          | ¦  «        t          |¦  «        u o/| j        |j        k    o| j        |j        k    o| j        |j        k    S )a  
        >>> dd = metadata.DateSingle('1805/3/12', 'uncertain')
        >>> dd2 = metadata.DateSingle('1805/3/12', 'uncertain')
        >>> str(dd)
        '1805/03/12'
        >>> dd == dd2
        True
        >>> dd2.relevance='certain'
        >>> dd == dd2
        False
        )Útyper¬   r®   r©   r?   s     r6   rA   zDatePrimitive.__eq__è  sT   € õ �T‘
”
�d 5™kœkÐ)ð :Øœ
 e¤kÒ1ð:àÔ-°Ô1GÒGð:ð œ¨%¬/Ò9ð	;r8   c                ó    — t          | ¦  «        S r<   r=   rœ   s    r6   Ú_reprInternalzDatePrimitive._reprInternalù  ó   € Ý�4‰yŒyÐr8   c                óÖ   — t          | j        ¦  «        dk    rdS t          | j        ¦  «        dk    rt          | j        d         ¦  «        S t          d„ | j        D ¦   «         ¦  «        S )Nr   r]   rx   c                ó,   — g | ]}t          |¦  «        ‘ŒS rs   r=   )Ú.0ru   s     r6   ú
<listcomp>z)DatePrimitive.__str__.<locals>.<listcomp>  s   € Ð3Ð3Ð3 1�˜A™œÐ3Ð3Ð3r8   )rO   r¬   r>   rœ   s    r6   rY   zDatePrimitive.__str__ü  s`   € ÝˆtŒz‰?Œ?˜aÒÐØ�2Ý�”‰_Œ_ Ò!Ð!Ý�t”z !”}Ñ%Ô%Ð%åÐ3Ð3¨¬
Ð3Ñ3Ô3Ñ4Ô4Ð4r8   c                ó&   — | j         d         j        S )a  
        Get a datetime object.

        >>> a = metadata.DateSingle('1843/03/03')
        >>> str(a)
        '1843/03/03'

        >>> a.datetime
        datetime.datetime(1843, 3, 3, 0, 0)

        >>> a = metadata.DateSingle('1843/03')
        >>> str(a)
        '1843/03/--'
        r   )r¬   r‚   rœ   s    r6   r‚   zDatePrimitive.datetime  s   € ð" Œz˜!Œ}Ô%Ð%r8   c                ó   — | j         S )z„
        The relevance attribute takes one of three
        values, `'certain'`, `'approximate'`, or
        `'uncertain'`.
        ©r­   rœ   s    r6   r©   zDatePrimitive.relevance  ó   € ð ŒÐr8   c                óŒ   — |dv r*|| _         g | _        | j                             |¦  «         d S t          j        d|›�¦  «        ‚)N)r¨   r^   r_   ú1Relevance value is not supported by this object: )r­   r®   rL   r   r†   r‡   s     r6   r©   zDatePrimitive.relevance"  s]   € àÐ;Ð;Ð;Ø#ˆDŒOØ$&ˆDÔ!àÔ!×(Ò(¨Ñ/Ô/Ð/Ð/Ð/åÔ0ØMÀEÐMÐMñOô Oð Or8   N)r¨   )r©   r>   r    )r9   r>   )r¡   r¢   r£   r¤   r7   rA   r²   rY   r¦   r‚   r©   Úsetterrs   r8   r6   r	   r	   Ñ  sÈ   € € € € € ðð ð#ð #ð #ð #ð #ð;ð ;ð ;ð ;ð"ð ð ð ð5ð 5ð 5ð ð&ð &ñ „Xð&ð$ ðð ñ „Xðð ÔðOð Oñ ÔðOð Oð Or8   r	   c                  ó4   ‡ — e Zd ZdZd	d
ˆ fd„Zd„ Zd
d„Zˆ xZS )r   a?  
    Store a date, either as certain, approximate, or uncertain relevance.

    The relevance attribute is limited within each DateSingle subclass
    depending on the design of the class. Alternative relevance types should be
    configured as other DateSingle subclasses.

    >>> dd = metadata.DateSingle('2009/12/31', 'approximate')
    >>> dd
    <music21.metadata.primitives.DateSingle 2009/12/31>

    >>> str(dd)
    '2009/12/31'

    >>> dd.relevance
    'approximate'

    >>> dd = metadata.DateSingle('1805/3/12', 'uncertain')
    >>> str(dd)
    '1805/03/12'
    r]   r¨   Údatar€   c                ót   •— t          ¦   «                              |¦  «         |                      |¦  «         d S r<   ©Úsuperr7   Ú_prepareData©r5   rÀ   r©   Ú	__class__s      €r6   r7   zDateSingle.__init__D  ó5   ø€ Ý‰Œ×Ò˜Ñ#Ô#Ð#Ø×Ò˜$ÑÔÐÐÐr8   c                ó6   — t          | j        d         ¦  «        S )Nr   )r>   r¬   rœ   s    r6   rY   zDateSingle.__str__H  s   € Ý�4”:˜a”=Ñ!Ô!Ð!r8   c                óº   — g | _         | j        g| _        | j                              t	          ¦   «         ¦  «         | j         d                              |¦  «         dS )ú9
        Assume a string is supplied as argument
        r   N)r¬   r©   r®   rL   r   rˆ   ©r5   rÀ   s     r6   rÄ   zDateSingle._prepareDataK  sR   € ð ˆŒ
Ø!%¤Ð 0ˆÔØŒ
×Ò�$™&œ&Ñ!Ô!Ð!ØŒ
�1Œ×Ò˜4Ñ Ô Ð Ð Ð r8   )r]   r¨   ©rÀ   r€   )r¡   r¢   r£   r¤   r7   rY   rÄ   Ú__classcell__©rÆ   s   @r6   r   r   .  so   ø€ € € € € ðð ð* ð  ð  ð  ð  ð  ð  ð"ð "ð "ð	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!r8   r   c                  ón   ‡ — e Zd ZdZddˆ fd„Zˆ fd„Zed„ ¦   «         Zej        d	„ ¦   «         Zdd
„Z	ˆ xZ
S )r
   aá  
    Store a relative date, sometime `prior` or sometime `after`, `onorbefore`, or onorafter`.

    >>> dd = metadata.DateRelative('2009/12/31', 'prior')
    >>> str(dd)
    'prior to 2009/12/31'
    >>> dd.relevance = 'after'
    >>> str(dd)
    'after 2009/12/31'

    >>> dd = metadata.DateRelative('2009/12/31', 'certain')
    Traceback (most recent call last):
    music21.exceptions21.MetadataException: Relevance value is not
        supported by this object: 'certain'
    r]   ÚafterrÀ   r€   c                ót   •— t          ¦   «                              |¦  «         |                      |¦  «         d S r<   rÂ   rÅ   s      €r6   r7   zDateRelative.__init__n  s5   ø€ å‰Œ×Ò˜Ñ#Ô#Ð#Ø×Ò˜$ÑÔÐÐÐr8   c                óž   •— | j         }t          ¦   «                              ¦   «         }|dk    rd|z   S |dk    r|dz   S |dk    r|dz   S d|z   S )NÚpriorz	prior to Ú
onorbeforez or earlierÚ	onorafterz	 or laterzafter )r©   rÃ   rY   )r5   ÚrÚdsrÆ   s      €r6   rY   zDateRelative.__str__u  sg   ø€ ØŒNˆÝ‰WŒW�_Š_ÑÔˆØ�Š<ˆ<Ø Ñ#Ð#Ø�,ÒÐØ˜Ñ%Ð%Ø�+ÒÐØ˜Ñ#Ð#à˜b‘=Ð r8   c                ó   — | j         S )z�
        The relevance attribute takes one of four
        values, `'prior'`, `'after'`, or
        `'onorbefore'` or `'onorafter'`.
        rº   rœ   s    r6   r©   zDateRelative.relevance�  r»   r8   c                ó¢   — |dk    rd}|                      ¦   «         dvrt          j        d|›�¦  «        ‚|                      ¦   «         | _        d S )NÚbeforerÓ   )rÓ   rÐ   rÔ   rÕ   r½   )r   r   r†   r­   r‡   s     r6   r©   zDateRelative.relevanceŠ  s\   € à�HÒÐØˆEà�;Š;‰=Œ=Ð MÐMÐMÝÔ0ØMÀEÐMÐMñOô Oð OàŸ+š+™-œ-ˆŒˆˆr8   c                ó°   — g | _         dg| _        | j                              t          ¦   «         ¦  «         | j         d                              |¦  «         dS )rÊ   Nr   )r¬   r®   rL   r   rˆ   rË   s     r6   rÄ   zDateRelative._prepareData”  sO   € ð ˆŒ
Ø!% ˆÔØŒ
×Ò�$™&œ&Ñ!Ô!Ð!ØŒ
�1Œ×Ò˜4Ñ Ô Ð Ð Ð r8   )r]   rÐ   rÌ   )r¡   r¢   r£   r¤   r7   rY   r¦   r©   r¾   rÄ   rÍ   rÎ   s   @r6   r
   r
   [  s³   ø€ € € € € ðð ð$ ð  ð  ð  ð  ð  ð  ð
!ð 
!ð 
!ð 
!ð 
!ð ðð ñ „Xðð Ôð(ð (ñ Ôð(ð	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!r8   r
   c                  ój   ‡ — e Zd ZdZddˆ fd„Zd„ Zdd„Zed	„ ¦   «         Zej	        d
„ ¦   «         Zˆ xZ
S )r   aB  
    Store a relative date, sometime between two dates:

    >>> dd = metadata.DateBetween(['2009/12/31', '2010/1/28'])
    >>> str(dd)
    '2009/12/31 to 2010/01/28'

    >>> dd = metadata.DateBetween(['2009/12/31', '2010/1/28'], 'certain')
    Traceback (most recent call last):
    music21.exceptions21.MetadataException: Relevance value is not
        supported by this object: 'certain'

    >>> d1 = metadata.Date(year=1605)
    >>> d2 = metadata.Date(year=1608, month='11?')
    >>> dd = metadata.DateBetween([d1, d2])
    >>> str(dd)
    '1605/--/-- to 1608/11?/--'
    rs   ÚbetweenrÀ   úIterable[DateParseType]c                ót   •— t          ¦   «                              |¦  «         |                      |¦  «         d S r<   rÂ   rÅ   s      €r6   r7   zDateBetween.__init__¶  rÇ   r8   c                óˆ   — g }| j         D ]$}|                     t          |¦  «        ¦  «         Œ%d                     |¦  «        S )Nz to )r¬   rL   r>   rN   ©r5   rP   ru   s      r6   rY   zDateBetween.__str__¼  sE   € ØˆØ”ð 	ð 	ˆAØ�JŠJ•s˜1‘v”vÑÔÐÐØ�{Š{˜3ÑÔÐr8   c                óÚ   — g | _         g | _        |D ]Y}t          ¦   «         }|                     |¦  «         | j                              |¦  «         | j                             d¦  «         ŒZdS )zK
        Assume a list of dates as strings is supplied as argument
        N©r¬   r®   r   rˆ   rL   ©r5   rÀ   Úpartru   s       r6   rÄ   zDateBetween._prepareDataÄ  ót   € ð ˆŒ
Ø "ˆÔØð 	/ð 	/ˆDÝ‘”ˆAØ�FŠF�4‰LŒLˆLØŒJ×Ò˜aÑ Ô Ð àÔ!×(Ò(¨Ñ.Ô.Ð.Ð.ð	/ð 	/r8   c                ó   — | j         S )zT
        The relevance attribute takes only one value:
        `'between'`.
        rº   rœ   s    r6   r©   zDateBetween.relevanceÓ  ó   € ð ŒÐr8   c                óN   — |dk    rt          j        d|›�¦  «        ‚|| _        d S )NrÝ   r½   ©r   r†   r­   r‡   s     r6   r©   zDateBetween.relevanceÛ  s;   € à�IÒÐÝÔ0ØMÀEÐMÐMñOô Oð OàˆŒˆˆr8   )rs   rÝ   ©rÀ   rÞ   )r¡   r¢   r£   r¤   r7   rY   rÄ   r¦   r©   r¾   rÍ   rÎ   s   @r6   r   r   ¡  s©   ø€ € € € € ðð ð( ð  ð  ð  ð  ð  ð  ð ð  ð  ð/ð /ð /ð /ð ðð ñ „Xðð Ôð ð  ñ Ôð ð  ð  ð  ð  r8   r   c                  ór   ‡ — e Zd ZdZdZ	 	 ddˆ fd„Zd„ Zdd	„Zed
„ ¦   «         Z	e	j
        d„ ¦   «         Z	ˆ xZS )r   aâ  
    Store a selection of dates, or a collection of dates that might all be
    possible

    >>> dd = metadata.DateSelection(
    ...     ['2009/12/31', '2010/1/28', '1894/1/28'],
    ...     )
    >>> str(dd)
    '2009/12/31 or 2010/01/28 or 1894/01/28'

    >>> dd = metadata.DateSelection(
    ...     [1750, '1775/03?'],
    ...     'and'
    ...     )
    >>> str(dd)
    '1750/--/-- and 1775/03?/--'

    >>> dd = metadata.DateSelection(
    ...     ['2009/12/31', '2010/1/28'],
    ...     'certain',
    ...     )
    Traceback (most recent call last):
    music21.exceptions21.MetadataException: Relevance value is not
        supported by this object: 'certain'

    Note that '1350 or 1351 and 1375' is not supported yet.
    Frs   ÚorrÀ   rÞ   c                ót   •— t          ¦   «                              |¦  «         |                      |¦  «         d S r<   rÂ   rÅ   s      €r6   r7   zDateSelection.__init__	  s7   ø€ õ 	‰Œ×Ò˜Ñ#Ô#Ð#Ø×Ò˜$ÑÔÐÐÐr8   c                óš   — g }| j         D ]$}|                     t          |¦  «        ¦  «         Œ%d| j        › d�                     |¦  «        S )Nr“   )r¬   rL   r>   r­   rN   rá   s      r6   rY   zDateSelection.__str__  sT   € ØˆØ”ð 	ð 	ˆAØ�JŠJ•s˜1‘v”vÑÔÐÐØ%�4”?Ð%Ð%Ð%×*Ò*¨3Ñ/Ô/Ð/r8   c                óÚ   — g | _         g | _        |D ]Y}t          ¦   «         }|                     |¦  «         | j                              |¦  «         | j                             d¦  «         ŒZdS )zL
        Assume a list of dates as strings is supplied as argument.
        Nrã   rä   s       r6   rÄ   zDateSelection._prepareData  ræ   r8   c                ó   — | j         S )z[
        The relevance attribute takes only two values:
        `'or'` or `'and'`.
        rº   rœ   s    r6   r©   zDateSelection.relevance(  rè   r8   c                óJ   — |dvrt          j        d|›�¦  «        ‚|| _        d S )N)rí   Úandr½   rê   r‡   s     r6   r©   zDateSelection.relevance0  s;   € à˜Ð%Ð%ÝÔ0ØMÀEÐMÐMñOô Oð OàˆŒˆˆr8   )rs   rí   rë   )r¡   r¢   r£   r¤   ÚisSingler7   rY   rÄ   r¦   r©   r¾   rÍ   rÎ   s   @r6   r   r   æ  s¸   ø€ € € € € ðð ð< €Hð
 24Øð ð  ð  ð  ð  ð  ð  ð0ð 0ð 0ð/ð /ð /ð /ð ðð ñ „Xðð Ôð ð  ñ Ôð ð  ð  ð  ð  r8   r   c                  óz   — e Zd ZdZ	 	 	 	 ddd„Zd„ Zd„ Zdd„Zd„ Ze	d„ ¦   «         Z
e
j        d„ ¦   «         Z
d„ ZdS )r   aA  
    One unit of text data: a title, a name, or some other text data. Store the
    string and a language name or code. This object can be used and/or
    subclassed for a variety for of text storage.

    >>> td = metadata.Text('concerto in d', 'en')
    >>> str(td)
    'concerto in d'
    >>> td.language
    'en'
    r]   NrÀ   ú
str | TextÚlanguager,   ÚisTranslatedúbool | NoneÚencodingSchemec                óÌ   — t          |t          ¦  «        r2|j        | _        |j        | _        |j        | _        |j        | _        d S || _        || _        || _        || _        d S r<   )ra   r   r¬   Ú	_languagerø   rú   )r5   rÀ   r÷   rø   rú   s        r6   r7   zText.__init__L  sh   € õ
 �d�DÑ!Ô!ð 
	1à#'¤:ˆDŒJØ'+¤~ˆDŒNØ+/Ô+<ˆDÔØ,0Ô,?ˆDÔÐÐàˆDŒJØ%ˆDŒNØ ,ˆDÔØ"0ˆDÔÐÐr8   c                óÔ   — t          | j        t          ¦  «        r| j                             d¦  «        S t          | j        t          ¦  «        r| j        S t	          | j        ¦  «        S )NzUTF-8)ra   r¬   ÚbytesÚdecoder>   rœ   s    r6   rY   zText.__str___  sV   € Ý�d”j¥%Ñ(Ô(ð 	#Ø”:×$Ò$ WÑ-Ô-Ð-Ý˜œ
¥CÑ(Ô(ð 	#Ø”:Ðå�t”z‘?”?Ð"r8   c                ó    — t          | ¦  «        S r<   r=   rœ   s    r6   r²   zText._reprInternalg  r³   r8   r9   r:   c                óÖ   — t          |¦  «        t          | ¦  «        urdS | j        |j        k    rdS | j        |j        k    rdS | j        |j        k    rdS | j        |j        k    rdS dS )a   
        >>> t1 = metadata.Text('some text')
        >>> t2 = metadata.Text('some text')
        >>> t1 == t2
        True

        Language, isTranslated, and encodingScheme must all exactly match for equality.

        >>> t2 = metadata.Text('some text', language='en')
        >>> t1 == t2
        False
        >>> t2 = metadata.Text('some text', isTranslated=True)
        >>> t1 == t2
        False
        >>> t2 = metadata.Text('some text', encodingScheme='scheme42')
        >>> t1 == t2
        False

        Comparison with non-Text types, including bare strings,
        will always be considered unequal.

        >>> t1 == 'some text'
        False
        FT)r°   r¬   r÷   rø   rú   r?   s     r6   rA   zText.__eq__j  sy   € õ2 �‰;Œ;�d 4™jœjÐ(Ð(Ø�5ØŒ:˜œÒ$Ð$Ø�5ØŒ=˜EœNÒ*Ð*Ø�5ØÔ Ô 2Ò2Ð2Ø�5ØÔ %Ô"6Ò6Ð6Ø�5Øˆtr8   c                ó¸   — t          |¦  «        t          | ¦  «        urt          S | j        | j        | j        | j        f|j        |j        |j        |j        fk     S )z@
        Allows for alphabetically sorting two elements
        )r°   ÚNotImplementedr¬   r÷   rø   rú   r?   s     r6   Ú__lt__zText.__lt__�  sX   € õ �‰;Œ;�d 4™jœjÐ(Ð(Ý!Ð!àŒZ˜œ¨Ô(9¸4Ô;NÐOØŒ{˜EœN¨EÔ,>ÀÔ@TÐUòVð	
r8   c                ó   — | j         S )z¸
        Set the language of the Text stored within.

        >>> myText = metadata.Text('my text')
        >>> myText.language = 'en'
        >>> myText.language
        'en'
        ©rü   rœ   s    r6   r÷   zText.languagež  s   € ð Œ~Ðr8   c                ó   — || _         d S r<   r  r‡   s     r6   r÷   zText.languageª  s   € àˆŒˆˆr8   c                ó^   — ddl m} |                     t          | ¦  «        | j        ¦  «        S )a¡  
        Return a string representation with normalized articles.

        >>> td = metadata.Text('Ale is Dear, The', language='en')
        >>> str(td)
        'Ale is Dear, The'

        >>> td.getNormalizedArticle()
        'The Ale is Dear'

        The language will determine whether the article is moved:

        >>> td.language = 'de'
        >>> td.getNormalizedArticle()
        'Ale is Dear, The'
        r   )Útext)Úmusic21r	  ÚprependArticler>   rü   )r5   r	  s     r6   ÚgetNormalizedArticlezText.getNormalizedArticle°  s4   € ð" 	!Ð Ð Ð Ð Ð Ø×"Ò"¥3 t¡9¤9¨d¬nÑ=Ô=Ð=r8   )r]   NNN)rÀ   rö   r÷   r,   rø   rù   rú   r,   r    )r¡   r¢   r£   r¤   r7   rY   r²   rA   r  r¦   r÷   r¾   r  rs   r8   r6   r   r   =  sÎ   € € € € € ð
ð 
ð #%Ø&*Ø+/Ø,0ð	1ð 1ð 1ð 1ð 1ð&#ð #ð #ðð ð ð#ð #ð #ð #ðL	
ð 	
ð 	
ð ð	ð 	ñ „Xð	ð „_ðð ñ „_ðð
>ð >ð >ð >ð >r8   r   c                  ó:   ‡ — e Zd ZdZ	 	 	 dddœdˆ fd„Zdd„Zˆ xZS )r   uÛ  
    A subclass of text that can also have a role

    >>> c = metadata.primitives.Copyright('Copyright 1945 Florence Price')
    >>> c
    <music21.metadata.primitives.Copyright Copyright 1945 Florence Price>
    >>> c.role is None
    True
    >>> str(c)
    'Copyright 1945 Florence Price'

    The text, language, isTranslated, role, etc. must be identical for equality.

    >>> c2 = metadata.Copyright('Copyright 1945 Florence Price')
    >>> c == c2
    True
    >>> c2 = metadata.Copyright('Copyright Â© 1945 Florence Price')
    >>> c == c2
    False
    >>> c2 = metadata.Copyright('Copyright 1945 Florence Price', language='en')
    >>> c == c2
    False
    >>> c2 = metadata.Copyright('Copyright 1945 Florence Price', isTranslated=True)
    >>> c == c2
    False
    >>> c2 = metadata.Copyright('Copyright 1945 Florence Price', role='other')
    >>> c == c2
    False

    Comparison against a non-Copyright object will always return False.

    >>> c == 1945
    False
    r]   N)ÚrolerÀ   rö   r÷   r,   rø   rù   c               ó\   •— t          ¦   «                              |||¦  «         || _        d S r<   )rÃ   r7   r  )r5   rÀ   r÷   rø   r  rÆ   s        €r6   r7   zCopyright.__init__ë  s,   ø€ õ
 	‰Œ×Ò˜˜x¨Ñ6Ô6Ð6ØˆŒ	ˆ	ˆ	r8   r9   r:   c                óÖ   — t          |¦  «        t          | ¦  «        urdS | j        |j        k    rdS | j        |j        k    rdS | j        |j        k    rdS | j        |j        k    rdS dS )NFT)r°   r¬   r÷   rø   r  r?   s     r6   rA   zCopyright.__eq__ó  su   € Ý�‰;Œ;�d 4™jœjÐ(Ð(Ø�5ØŒ:˜œÒ$Ð$Ø�5ØŒ=˜EœNÒ*Ð*Ø�5ØÔ Ô 2Ò2Ð2Ø�5ØŒ9˜œ
Ò"Ð"Ø�5Øˆtr8   )r]   NN)rÀ   rö   r÷   r,   rø   rù   r    )r¡   r¢   r£   r¤   r7   rA   rÍ   rÎ   s   @r6   r   r   Ç  s{   ø€ € € € € ð!ð !ðH #%Ø&*Ø+/ðð ð	ð ð ð ð ð ð ð ðð ð ð ð ð ð ð r8   r   c                  ó€  — e Zd ZdZdZddddddd	d
dddœ
Ze                     ¦   «         Ze                     ¦   «         Z	ddddddœd)d„Z
d„ Zd„ Zd*d„Zd+d „Zed!„ ¦   «         Zej        d"„ ¦   «         Zed#„ ¦   «         Zej        d$„ ¦   «         Zed%„ ¦   «         Zej        d&„ ¦   «         Zed'„ ¦   «         Zed(„ ¦   «         ZdS ),r   a³  
    A person that contributed to a work. Can be a composer, lyricist, arranger,
    or other type of contributor.  In MusicXML, these are "creator" elements.

    >>> td = metadata.Contributor(role='composer', name='Chopin, Fryderyk')
    >>> td.role
    'composer'

    >>> td.name
    'Chopin, Fryderyk'

    >>> td.relevance
    'contributor'

    >>> td
    <music21.metadata.primitives.Contributor composer:Chopin, Fryderyk>
    ÚcontributorÚcomposerÚattributedComposerÚsuspectedComposerÚcomposerAliasÚcomposerCorporateÚlyricistÚ
librettistÚarrangerÚorchestratorÚ
translator)
ÚcomÚcoaÚcosÚcolÚcocÚlyrÚlibÚlarÚlorÚtrnNrs   )ÚnameÚnamesr  ÚbirthÚdeathr'  ústr | Text | Noner(  úIterable[str | Text]r  r)  úNone | DateSingle | strr*  c               ó   — d | _         |r|| _        nd | _        g | _        |rWt          |t          ¦  «        r| j                             |¦  «         n'| j                             t	          |¦  «        ¦  «         |r\|D ]Y}t          |t          ¦  «        r| j                             |¦  «         Œ2| j                             t	          |¦  «        ¦  «         ŒZg | _        d | _        d | _        |�.t          |t          ¦  «        st          |¦  «        }n|}|| _        |�0t          |t          ¦  «        st          |¦  «        }	n|}	|	| _        d S d S r<   )
Ú_roler  Ú_namesra   r   rL   Ú_nationalityr)  r*  r   )
r5   r'  r(  r  r)  r*  ÚkeywordsÚnÚbirthDSÚdeathDSs
             r6   r7   zContributor.__init__;  sd  € ð ˆŒ
Øð 	àˆDŒIˆIàˆDŒIð #%ˆŒØð 	/Ý˜$¥Ñ%Ô%ð /Ø”×"Ò" 4Ñ(Ô(Ð(Ð(à”×"Ò"¥4¨¡:¤:Ñ.Ô.Ð.Øð 	0Øð 0ð 0�Ý˜a¥Ñ&Ô&ð 0Ø”K×&Ò& qÑ)Ô)Ð)Ð)à”K×&Ò&¥t¨A¡w¤wÑ/Ô/Ð/Ð/à(*ˆÔà&*ˆŒ
Ø&*ˆŒ
àÐÝ˜e¥ZÑ0Ô0ð  Ý$ UÑ+Ô+��à�Ø ˆDŒJØÐÝ˜e¥ZÑ0Ô0ð  Ý$ UÑ+Ô+��à�Ø ˆDŒJˆJˆJð Ðr8   c                ó$   — | j         › d| j        › �S )NrI   ©r  r'  rœ   s    r6   r²   zContributor._reprInternalj  s   € Ø”)Ð)Ð)˜dœiÐ)Ð)Ð)r8   c                ó"   — | j         sdS | j         S r«   )r'  rœ   s    r6   rY   zContributor.__str__m  s   € ØŒyð 	Ø�2ØŒyÐr8   r9   r:   c                ó�  — t          |¦  «        t          | ¦  «        urdS | j        |j        k    rdS t          | j        ¦  «        t          |j        ¦  «        k    rdS t	          t          | j        ¦  «        t          |j        ¦  «        ¦  «        D ]\  }}||k    r dS Œ| j        |j        k    rdS | j        |j        k    rdS dS )ar  
        >>> c1 = metadata.Contributor(
        ...         role='composer',
        ...         name='The Composer',
        ...         birth='1923',
        ...         death='2013'
        ... )
        >>> c2 = metadata.Contributor(
        ...         role='composer',
        ...         name='The Composer',
        ...         birth='1923',
        ...         death='2013'
        ... )

        Names, role, birth, and death must all be identical for equality.

        >>> c1 == c2
        True
        >>> c2.role = 'lyricist'
        >>> c1 == c2
        False
        >>> c2 = metadata.Contributor(
        ...         role='composer',
        ...         name='A Composer',
        ...         birth='1923',
        ...         death='2013'
        ... )
        >>> c1 == c2
        False
        >>> c2 = metadata.Contributor(
        ...         role='composer',
        ...         names=['A Composer', 'The Composer'],
        ...         birth='1923',
        ...         death='2013'
        ... )
        >>> c1 == c2
        False
        >>> c2 = metadata.Contributor(
        ...         role='composer',
        ...         name='The Composer',
        ...         birth='1924',
        ...         death='2013'
        ... )
        >>> c1 == c2
        False
        >>> c2 = metadata.Contributor(
        ...         role='composer',
        ...         name='The Composer',
        ...         birth='1923',
        ...         death='2012'
        ... )
        >>> c1 == c2
        False

        Comparison with a non-Contributor object always returns False.

        >>> c1 == 'The Composer'
        False
        FT)r°   r/  rO   r0  ÚzipÚsortedr)  r*  )r5   r@   r'  Ú	otherNames       r6   rA   zContributor.__eq__r  sÎ   € õx �‰;Œ;�d 4™jœjÐ(Ð(Ø�5ØŒ:˜œÒ$Ð$Ø�5ÝˆtŒ{ÑÔ�s 5¤<Ñ0Ô0Ò0Ð0Ø�5Ý"¥6¨$¬+Ñ#6Ô#6½¸u¼|Ñ8LÔ8LÑMÔMð 	ð 	‰OˆD�)Ø�yÒ Ð Ø�u�uð !àŒ:˜œÒ$Ð$Ø�5ØŒ:˜œÒ$Ð$Ø�5Øˆtr8   údatetime.timedelta | Nonec                ó²   — | j         €dS | j        �| j        j        }| j         j        }||z
  S t          j                             ¦   «         | j         j        z
  S )a¶  
        Calculate the age at death of the Contributor, returning a
        datetime.timedelta object.

        >>> a = metadata.Contributor(
        ...     name='Beethoven, Ludwig van',
        ...     role='composer',
        ...     birth='1770/12/17',
        ...     death='1827/3/26',
        ...     )

        >>> a.birth
        <music21.metadata.primitives.DateSingle 1770/12/17>

        >>> a.age()
        datetime.timedelta(days=20552)

        >>> a.age().days
        20552

        >>> years = a.age().days // 365
        >>> years
        56

        If the composer is still alive, it returns the composer's current age.

        >>> shaw = metadata.Contributor(
        ...     name='Shaw, Caroline',
        ...     role='composer',
        ...     birth='1982/08/01',
        ...     )
        >>> shaw_years = shaw.age().days // 365

        This test will fail in 2067:

        >>> 36 < shaw_years < 85
        True
        N)r)  r*  r‚   Únow)r5   ru   Úbs      r6   ÚagezContributor.age¿  sV   € ðN Œ:ÐØ�4àŒ:Ð!Ø”
Ô#ˆAØ”
Ô#ˆAØ�q‘5ˆLåÔ$×(Ò(Ñ*Ô*¨T¬ZÔ-@Ñ@Ð@r8   c                óH   — | j         rt          | j         d         ¦  «        S dS )a_  
        Returns the text name, or the first of many names entered.

        >>> td = metadata.Contributor(
        ...     role='composer',
        ...     names=['Chopin, Fryderyk', 'Chopin, Frederick'],
        ...     )
        >>> td.name
        'Chopin, Fryderyk'

        >>> td.names
        ['Chopin, Fryderyk', 'Chopin, Frederick']
        r   N)r0  r>   rœ   s    r6   r'  zContributor.nameò  s'   € ð  Œ;ð 	Ý�t”{ 1”~Ñ&Ô&Ð&à�4r8   c                ób   — g | _         | j                              t          |¦  «        ¦  «         d S r<   )r0  rL   r   r‡   s     r6   r'  zContributor.name  s-   € ð ˆŒØŒ×Ò�4 ™;œ;Ñ'Ô'Ð'Ð'Ð'r8   c                ób   — g }| j         D ]$}|                     t          |¦  «        ¦  «         Œ%|S )an  
        Returns all names in a list.

        >>> td = metadata.Contributor(
        ...     role='composer',
        ...     names=['Chopin, Fryderyk', 'Chopin, Frederick'],
        ...     )
        >>> td.names
        ['Chopin, Fryderyk', 'Chopin, Frederick']

        >>> td.names = ['Czerny', 'Spohr']
        >>> td.names
        ['Czerny', 'Spohr']
        )r0  rL   r>   )r5   rP   r3  s      r6   r(  zContributor.names  s:   € ð" ˆØ”ð 	ð 	ˆAØ�JŠJ•s˜1‘v”vÑÔÐÐØˆ
r8   c                ó¼   — t          j        |¦  «        st          j        d¦  «        ‚g | _        |D ])}| j                             t          |¦  «        ¦  «         Œ*d S )Nz3.names must be a list -- do you mean .name instead?)r   Ú
isIterabler   r†   r0  rL   r   )r5   Úvaluesr3  s      r6   r(  zContributor.names#  sp   € åÔ  Ñ(Ô(ð 	GÝÔ0ØEñGô Gð GàˆŒØð 	(ð 	(ˆAØŒK×Ò�t A™wœwÑ'Ô'Ð'Ð'ð	(ð 	(r8   c                ó   — | j         S )a#  
        The role is what part this Contributor plays in the work.  Both
        full roll strings and roll abbreviations may be used.

        >>> td = metadata.Contributor()
        >>> td.role = 'composer'
        >>> td.role
        'composer'

        In case of a Humdrum role abbreviation, the role that is set
        is the full name:

        >>> td.role = 'lor'
        >>> td.role
        'orchestrator'

        Roles can be created on the fly:

        >>> td.role = 'court jester'
        >>> td.role
        'court jester'
        )r/  rœ   s    r6   r  zContributor.role,  s   € ð0 ŒzÐr8   c                óš   — |�|| j                              ¦   «         v r	|| _        d S || j         v r| j         |         | _        d S || _        d S r<   )ÚroleAbbreviationsDictrG  r/  r‡   s     r6   r  zContributor.roleF  sW   € àˆ=˜E TÔ%?×%FÒ%FÑ%HÔ%HÐHÐHØˆDŒJˆJˆJØ�dÔ0Ð0Ð0ØÔ3°EÔ:ˆDŒJˆJˆJàˆDŒJˆJˆJr8   c                ó˜   — |                       ¦   «         } | t          j        v rt          j        |          S t          j        d| ›�¦  «        ‚)zÖ
        Convert `abbreviation` to role name:

        >>> metadata.Contributor.abbreviationToRole('com')
        'composer'

        >>> metadata.Contributor.abbreviationToRole('lib')
        'librettist'
        zno such role: )r   r   rJ  r   r†   )Úabbreviations    r6   ÚabbreviationToRolezContributor.abbreviationToRoleO  sQ   € ð $×)Ò)Ñ+Ô+ˆØ�;Ô<Ð<Ð<ÝÔ4°\ÔBÐBåÔ0Ø1 Ð1Ð1ñ3ô 3ð 3r8   c                óÊ   — t           j        D ]@}|                      ¦   «         t           j        |                              ¦   «         k    r|c S ŒAt          j        d| › �¦  «        ‚)z‰
        Convert `roleName` to role abbreviation:

        >>> metadata.Contributor.roleToAbbreviation('composer')
        'com'
        zNo such role: )r   rJ  r   r   r†   )ÚroleNameÚrole_ids     r6   ÚroleToAbbreviationzContributor.roleToAbbreviationa  sh   € õ #Ô8ð 	ð 	ˆGØ�~Š~ÑÔ¥;Ô#DÀWÔ#M×#SÒ#SÑ#UÔ#UÒUÐUØ���ð VåÔ,Ð-H¸hÐ-HÐ-HÑIÔIÐIr8   )
r'  r+  r(  r,  r  r+  r)  r-  r*  r-  r    )r9   r=  )r¡   r¢   r£   r¤   r©   rJ  ÚkeysÚroleAbbreviationsrG  Ú	roleNamesr7   r²   rY   rA   rA  r¦   r'  r¾   r(  r  r¥   rM  rQ  rs   r8   r6   r   r     sÚ  € € € € € ðð ð( €Ið  Ø#Ø"ØØ"ØØØØØðð Ðð .×2Ò2Ñ4Ô4Ðà%×,Ò,Ñ.Ô.€Ið (,Ø-/Ø'+Ø.2Ø.2ð-!ð -!ð -!ð -!ð -!ð -!ð^*ð *ð *ðð ð ð
Ið Ið Ið IðZ/Að /Að /Að /Aðf ðð ñ „Xðð( 
„[ð(ð (ñ „[ð(ð
 ðð ñ „Xðð* „\ð(ð (ñ „\ð(ð ðð ñ „Xðð2 
„[ðð ñ „[ðð ð3ð 3ñ „\ð3ð" ðJð Jñ „\ðJð Jð Jr8   r   c                  ó   — e Zd ZdZdZdS )r   aT  
    A person that created a work. Can be a composer, lyricist, arranger, or
    other type of contributor.

    In MusicXML, these are "creator" elements.

    >>> td = metadata.Creator(role='composer', name='Chopin, Fryderyk')
    >>> td.role
    'composer'

    >>> td.name
    'Chopin, Fryderyk'

    >>> td.relevance
    'creator'
    ÚcreatorN)r¡   r¢   r£   r¤   r©   rs   r8   r6   r   r   r  s   € € € € € ðð ð& €I€I€Ir8   r   c                  ó   — e Zd ZdZd„ ZdS )r   z>
    An object representation of imprint, or publication.
    c                ó   — || _         d S r<   )r2  )r5   r2  s     r6   r7   zImprint.__init__�  s   € Ø ˆŒˆˆr8   N)r¡   r¢   r£   r¤   r7   rs   r8   r6   r   r   Œ  s-   € € € € € ðð ð!ð !ð !ð !ð !r8   r   c                  óD   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
S )ÚTestc                óÀ   — ddl m} |j                             d¦  «        }d|_        |                      |j        d¦  «         |                      |j        d¦  «         d S )Nr   ©Úmetadatazmy textÚen)r
  r]  Ú
primitivesr   r÷   ÚassertEqualr¬   rü   )r5   r]  r	  s      r6   ÚtestTextzTest.testTextÎ  sg   € Ø$Ð$Ð$Ð$Ð$Ð$àÔ"×'Ò'¨	Ñ2Ô2ˆØˆŒØ×Ò˜œ YÑ/Ô/Ð/Ø×Ò˜œ¨Ñ.Ô.Ð.Ð.Ð.r8   c                óì   — ddl m} |j                             dd¬¦  «        }|                      |j        d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         d S )Nr   r\  r  úGilles Binchoisr7  r  )r
  r]  r_  r   r`  r  r©   r'  )r5   r]  r  s      r6   ÚtestContributorzTest.testContributorÖ  s‹   € Ø$Ð$Ð$Ð$Ð$Ð$àÔ)×5Ò5ØØ"ð 6ñ 
ô 
ˆð 	×Ò˜Ô)¨:Ñ6Ô6Ð6Ø×Ò˜Ô.°Ñ>Ô>Ð>Ø×Ò˜Ô)Ð+<Ñ=Ô=Ð=Ð=Ð=r8   c                óì   — ddl m} |j                             dd¬¦  «        }|                      |j        d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         d S )Nr   r\  r  rc  r7  rV  )r
  r]  r_  r   r`  r  r©   r'  )r5   r]  rV  s      r6   ÚtestCreatorzTest.testCreatorá  s‰   € Ø$Ð$Ð$Ð$Ð$Ð$àÔ%×-Ò-ØØ"ð .ñ 
ô 
ˆð 	×Ò˜œ zÑ2Ô2Ð2Ø×Ò˜Ô*¨IÑ6Ô6Ð6Ø×Ò˜œÐ'8Ñ9Ô9Ð9Ð9Ð9r8   c                óX  — ddl m} |j                             dd¬¦  «        }|j                             d¬¦  «        }|                      |j        d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         d S )	Nr   r\  i3  r^   )r   r$   z1843?)r   r_   )r
  r]  r_  r   r`  r   r$   )r5   r]  Údate1Údate2s       r6   ÚtestDatezTest.testDateì  s®   € Ø$Ð$Ð$Ð$Ð$Ð$àÔ#×(Ò(¨d¸mÐ(ÑLÔLˆØÔ#×(Ò(¨gÐ(Ñ6Ô6ˆà×Ò˜œ TÑ*Ô*Ð*Ø×Ò˜œ¨-Ñ8Ô8Ð8à×Ò˜œ TÑ*Ô*Ð*Ø×Ò˜œ¨+Ñ6Ô6Ð6Ð6Ð6r8   c                óÞ  — |                       t          d¦  «        5  t          d¬¦  «         d d d ¦  «         n# 1 swxY w Y   dD ]K\  }}}|                       t          d¦  «        5  t          |||¬¦  «         d d d ¦  «         n# 1 swxY w Y   ŒL|                       t          d¦  «        5  t          d¬	¦  «         d d d ¦  «         n# 1 swxY w Y   |                       t          d
¦  «        5  t          d¬¦  «         d d d ¦  «         n# 1 swxY w Y   |                       t          d¦  «        5  t          d¬¦  «         d d d ¦  «         n# 1 swxY w Y   |                      t          ddd¬¦  «        ¦  «         |                      t          dd¬¦  «        ¦  «         |                      t          dd¬¦  «        ¦  «         |                      t          ddd¬¦  «        ¦  «         d S )NzMonth must be.*not 13é   )r   ))é    NN)r   NN)rp   rH   N)é   rq   N)rr   rq   iÏ  zDay.*is not possible)r   r   r    ÚHouré   )r!   ÚMinuteé=   )r"   ÚSecondéÿÿÿÿ)r#   iÐ  rq   rr   )r   r    ry   rp   r{   r|   r›   )ÚassertRaisesRegexr}   r   ÚassertIsNotNone)r5   ru   rt   rv   s       r6   ÚtestDateValueErrorzTest.testDateValueErrorø  s  € Ø×#Ò#¥JÐ0GÑHÔHð 	ð 	Ý�rˆN‰NŒNˆNð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ðð 	-ð 	-‰GˆAˆq�!ð ×'Ò'­
Ð4JÑKÔKð -ð -Ý˜! 1¨!Ð,Ñ,Ô,Ð,ð-ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -øð ×#Ò#¥J°Ñ7Ô7ð 	ð 	Ý�bˆM‰MŒMˆMð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	à×#Ò#¥J°Ñ9Ô9ð 	ð 	Ý˜ˆO‰OŒOˆOð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	à×#Ò#¥J°Ñ9Ô9ð 	ð 	Ý˜ˆO‰OŒOˆOð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	×Ò�T t°1¸"Ð=Ñ=Ô=Ñ>Ô>Ð>Ø×Ò�T¨¨rÐ2Ñ2Ô2Ñ3Ô3Ð3Ø×Ò�T¨°Ð3Ñ3Ô3Ñ4Ô4Ð4Ø×Ò�T r°"¸RÐ@Ñ@Ô@ÑAÔAÐAÐAÐAsU   œ9¹=Á =Á'BÂB
	ÂB
	Â-C
Ã
CÃCÃ0DÄDÄDÄ3EÅEÅEc                óL  — ddl m} |j                             dd¦  «        }|                      t          |¦  «        d¦  «         |                      t          |j        ¦  «        d¦  «         |                      |j        d¦  «         |                      |j	        dg¦  «         d S )Nr   r\  ú
2009/12/31r^   rx   )
r
  r]  r_  r   r`  r>   rO   r¬   r­   r®   )r5   r]  Ú
dateSingles      r6   ÚtestDateSinglezTest.testDateSingle  s¨   € Ø$Ð$Ð$Ð$Ð$Ð$àÔ(×3Ò3Ø˜-ñ)ô )ˆ
à×Ò�˜Z™œ¨,Ñ7Ô7Ð7Ø×Ò�˜ZÔ-Ñ.Ô.°Ñ2Ô2Ð2Ø×Ò˜Ô.°Ñ>Ô>Ð>Ø×Ò˜Ô4°}°oÑFÔFÐFÐFÐFr8   c                óL  — ddl m} |j                             dd¦  «        }|                      t          |¦  «        d¦  «         |                      |j        d¦  «         |                      t          |j        ¦  «        d¦  «         |                      |j	        d g¦  «         d S )Nr   r\  z
2001/12/31rÓ   zprior to 2001/12/31rx   )
r
  r]  r_  r
   r`  r>   r©   rO   r¬   r®   )r5   r]  ÚdateRelatives      r6   ÚtestDateRelativezTest.testDateRelative  s¦   € Ø$Ð$Ð$Ð$Ð$Ð$àÔ*×7Ò7¸ÀgÑNÔNˆØ×Ò�˜\Ñ*Ô*Ð,AÑBÔBÐBØ×Ò˜Ô/°Ñ9Ô9Ð9Ø×Ò�˜\Ô/Ñ0Ô0°!Ñ4Ô4Ð4Ø×Ò˜Ô6¸¸Ñ?Ô?Ð?Ð?Ð?r8   c                óL  — ddl m} |j                             d¦  «        }|                      t          |¦  «        d¦  «         |                      |j        d¦  «         |                      |j        d d g¦  «         |                      t          |j	        ¦  «        d¦  «         d S )Nr   r\  )ry  ú	2010/1/28z2009/12/31 to 2010/01/28rÝ   rq   )
r
  r]  r_  r   r`  r>   r©   r®   rO   r¬   )r5   r]  ÚdateBetweens      r6   ÚtestDateBetweenzTest.testDateBetween$  s«   € Ø$Ð$Ð$Ð$Ð$Ð$àÔ)×5Ò5Ø'ñ)ô )ˆà×Ò�˜[Ñ)Ô)Ð+EÑFÔFÐFØ×Ò˜Ô.°	Ñ:Ô:Ð:Ø×Ò˜Ô5¸¸d°|ÑDÔDÐDØ×Ò�˜[Ô.Ñ/Ô/°Ñ3Ô3Ð3Ð3Ð3r8   c                óR  — ddl m} |j                             g d¢d¦  «        }|                      t          |¦  «        d¦  «         |                      |j        d¦  «         |                      |j        g d¢¦  «         |                      t          |j	        ¦  «        d¦  «         d S )Nr   r\  )ry  r€  z	1894/1/28rí   z&2009/12/31 or 2010/01/28 or 1894/01/28)NNNrC   )
r
  r]  r_  r   r`  r>   r©   r®   rO   r¬   )r5   r]  ÚdateSelections      r6   ÚtestDateSelectionzTest.testDateSelection.  sÂ   € Ø$Ð$Ð$Ð$Ð$Ð$à Ô+×9Ò9Ø4Ð4Ð4Øñ
ô 
ˆð 	×Ò�˜]Ñ+Ô+ØAñ	Cô 	Cð 	Cà×Ò˜Ô0°$Ñ7Ô7Ð7Ø×Ò˜Ô7Ð9KÐ9KÐ9KÑLÔLÐLØ×Ò�˜]Ô0Ñ1Ô1°1Ñ5Ô5Ð5Ð5Ð5r8   N)r¡   r¢   r£   ra  rd  rf  rj  rw  r{  r~  r‚  r…  rs   r8   r6   rZ  rZ  Ì  s¤   € € € € € ð/ð /ð /ð	>ð 	>ð 	>ð	:ð 	:ð 	:ð
7ð 
7ð 
7ðBð Bð Bð2Gð Gð Gð@ð @ð @ð4ð 4ð 4ð6ð 6ð 6ð 6ð 6r8   rZ  Ú__main__)%Ú
__future__r   Ú__all__Úcollections.abcr   r‚   Útypingr1   Úunittestr
  r   r   r   r   ÚEnvironmentÚenvironLocalÚProtoM21Objectr   r	   r   r
   r   r   r   r   r   r   r   ÚTestCaserZ  Ú
_DOC_ORDERr>   r€   r3   r   r¡   ÚmainTestrs   r8   r6   ú<module>r’     s›  ðð #Ð "Ð "Ð "Ð "Ð "ðð ð €ð %Ð $Ð $Ð $Ð $Ð $Ø €€€Ø Ð Ð Ð Ø €€€à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ø Ð Ð Ð Ð Ð ð 'ˆ{Ô&Ð'<Ñ=Ô=€ð^ð ^ð ^ð ^ð ^ˆ7Ô!ñ ^ô ^ð ^ðDZOð ZOð ZOð ZOð ZO�GÔ*ñ ZOô ZOð ZOðz&!ð &!ð &!ð &!ð &!�ñ &!ô &!ð &!ðZB!ð B!ð B!ð B!ð B!�=ñ B!ô B!ð B!ðL? ð ? ð ? ð ? ð ? �-ñ ? ô ? ð ? ðJO ð O ð O ð O ð O �Mñ O ô O ð O ðnE>ð E>ð E>ð E>ð E>ˆ7Ô!ñ E>ô E>ð E>ðT7ð 7ð 7ð 7ð 7�ñ 7ô 7ð 7ðziJð iJð iJð iJð iJ�'Ô(ñ iJô iJð iJð\ð ð ð ð ˆkñ ô ð ð4!ð !ð !ð !ð !ˆgÔ$ñ !ô !ð !ð@m6ð m6ð m6ð m6ð m6ˆ8Ôñ m6ô m6ð m6ðh 	ØØØØØØØð	€
ð �XÔ&Ñ& sÑ*€Ø˜$Ñ˜{Ñ*¨9Ñ4°SÑ8€	ð ˆzÒÐØ€N€N€NØ€GÔ�TÑÔÐÐÐð Ðr8   