§
    ¢”j÷|  ã                  óŽ  — U d Z ddlmZ ddlZddlmZmZ ddlmZ ddl	m
c mZ ddlmZmZmZmZ ddlmZ ddlmZ eeeeeeee         d	f         f         ef         f         Zd\d„Zd]d„Zd^d„Zd\d„Zd\d„Z d_d„Z!d\d„Z"d\d„Z#d\d„Z$d\d„Z%d\d„Z&d\d „Z'd`d!„Z(d`d"„Z)d`d#„Z*d`d$„Z+d`d%„Z,d`d&„Z-d\d'„Z.d\d(„Z/d\d)„Z0d\d*„Z1d\d+„Z2d\d,„Z3d\d-„Z4d\d.„Z5d\d/„Z6d\d0„Z7d\d1„Z8d\d2„Z9d\d3„Z:d\d4„Z;d\d5„Z<dadbd8„Z= ee>e?fd9fe>e?fd9fe>e?fd9fed9fed9fed9f¬:¦  «        Z@deAd;<   d\d<„ZBdadbd=„ZC ee>e?fd9fe>e?fd9fed9fed9fed9f¬>¦  «        ZDdeAd?<   d\d@„ZEd\dA„ZFd\dB„ZGdCZHdDeAdE<    eedFfe>e?fd9fe>e?fd9fe>e?fd9fe>e?fd9fe>e?fd9fe>e?fd9fed9f¬G¦  «        ZIdeAdH<   dI„ ZJ	 	 	 dcdddQ„ZKdedU„ZLdfdV„ZMdgdW„ZNdXZOdfdY„ZPdfdZ„ZQeRd[k    rddlSZS eSjT        ¦   «          dS dS )hz"Various low level data validators.é    )ÚannotationsN)ÚMappingÚSequence)Úopen)ÚAnyÚTypeÚOptionalÚUnion)ÚIntFloat)ÚnumberTypes.Úvaluer   ÚreturnÚboolc                ód   — t          | t          ¦  «        rdS dD ]}t          | |¦  «        s dS ŒdS )zY
    Some objects will likely come in that aren't
    dicts but are dict-ish enough.
    T)ÚkeysÚvaluesÚitemsF)Ú
isinstancer   Úhasattr)r   Úattrs     új/var/www/finuniver-perm.ru/html/portfolio/venv/lib/python3.11/site-packages/fontTools/ufoLib/validators.pyÚisDictEnoughr      sM   € õ
 �%�Ñ!Ô!ð ØˆtØ+ð ð ˆÝ�u˜dÑ#Ô#ð 	Ø�5�5ð	àˆ4ó    Útypú	Type[Any]c                ó"   — t          | |¦  «        S )ú(
    Generic. (Added at version 2.)
    )r   )r   r   s     r   ÚgenericTypeValidatorr   #   s   € õ �e˜SÑ!Ô!Ð!r   r   ÚvalidValuesúSequence[int]c                óÆ   — t          | t          t          f¦  «        sdS t          | ¦  «        }t          |¦  «        }||z
  rdS | D ]}t          |t          ¦  «        s dS ŒdS )r   FT)r   ÚlistÚtupleÚsetÚint)r   r   Ú	valuesSetÚvalidValuesSetr   s        r   ÚgenericIntListValidatorr(   *   s{   € õ �f�t¥U˜mÑ,Ô,ð ØˆuÝ�F‘”€IÝ˜Ñ%Ô%€NØ�>Ñ!ð ØˆuØð ð ˆÝ˜%¥Ñ%Ô%ð 	Ø�5�5ð	àˆ4r   c                óD   — t          | t          ¦  «        sdS | dk     rdS dS ©ú(
    Generic. (Added at version 3.)
    Fr   T©r   r%   ©r   s    r   ÚgenericNonNegativeIntValidatorr.   :   ó.   € õ �e�SÑ!Ô!ð ØˆuØˆq‚y€yØˆuØˆ4r   c                óD   — t          | t          ¦  «        sdS | dk     rdS dS r*   )r   r   r-   s    r   Ú!genericNonNegativeNumberValidatorr1   E   s.   € õ �e�[Ñ)Ô)ð ØˆuØˆq‚y€yØˆuØˆ4r   Ú	prototypeÚGenericDictc                ó8  — t          | t          ¦  «        sdS |                     ¦   «         D ]\  }\  }}|sŒ|| vr dS Œ|                      ¦   «         D ]	}||vr dS Œ
|                      ¦   «         D ](\  }}||         \  }}|€|sŒt          ||¦  «        s dS Œ)dS )r+   FNT)r   r   r   r   )r   r2   Úkeyr   ÚrequiredÚvÚprototypeTypes          r   ÚgenericDictValidatorr9   P   sé   € õ
 �e�WÑ%Ô%ð Øˆuà )§¢Ñ 1Ô 1ð ð Ñˆ‰_ˆc�8Øð 	ØØ�eÐÐØ�5�5ð ð �zŠz‰|Œ|ð ð ˆØ�iÐÐØ�5�5ð  ð —+’+‘-”-ð ð ‰ˆˆQØ"+¨C¤.Ñˆ�xØˆ9˜Xˆ9ØÝ˜!˜]Ñ+Ô+ð 	Ø�5�5ð	àˆ4r   c                ó   — g d¢}| |v S )ú
    Version 2+.
    )ÚregularÚitalicÚboldzbold italic© )r   Úoptionss     r   Ú"fontInfoStyleMapStyleNameValidatorrA   r   s   € ð ;Ð:Ð:€GØ�GÐÐr   c                óž  — t          | t          ¦  «        sdS t          | ¦  «        dk    rdS g d¢}t          t          dft          df¬¦  «        }g }| D ]c}t          ||¦  «        s dS |d         }|d         }t          |¦  «        }|s dS t          ||¦  «        }|s dS |                     |¦  «         Œd|t          |¦  «        k    rdS dS )ú
    Version 3+.
    Fr   T)r   é   é   é   )ÚrangeMaxPPEMÚrangeGaspBehaviorrG   rH   )
r   r"   ÚlenÚdictr%   r9   r.   r(   ÚappendÚsorted)	r   ÚvalidBehaviorsÚdictPrototypeÚ	ppemOrderÚrangeRecordÚppemÚbehaviorÚppemValidityÚbehaviorValiditys	            r   Ú)fontInfoOpenTypeGaspRangeRecordsValidatorrU   z   s  € õ �e�TÑ"Ô"ð ØˆuÝ
ˆ5�z„z�Q‚€ØˆtØ!�\�\€NÝ!%Ý˜4�[µT¸4°Lð"ñ "ô "€Mð €IØð ð ˆÝ# K°Ñ?Ô?ð 	Ø�5�5Ø˜>Ô*ˆØÐ2Ô3ˆÝ5°dÑ;Ô;ˆØð 	Ø�5�5Ý2°8¸^ÑLÔLÐØð 	Ø�5�5Ø×Ò˜ÑÔÐÐØ•F˜9Ñ%Ô%Ò%Ð%ØˆuØˆ4r   c                óR  — t          | t          ¦  «        sdS t          | ¦  «        dk    sdS |                      d¦  «        dk    rdS |                      d¦  «        \  }}|                     d¦  «        dk    rdS |                     d¦  «        dk    rdS |                     d¦  «        \  }}}t          |¦  «        dk    rdS t          |¦  «        dk    rdS t          |¦  «        dk    rdS 	 t          |¦  «        }t          |¦  «        }t          |¦  «        }n# t          $ r Y dS w xY w|dk     s|d	k    rdS t          j        ||¦  «        d         }	|dk     s||	k    rdS |                     d¦  «        \  }
}}t          |
¦  «        dk    rdS t          |¦  «        dk    rdS t          |¦  «        dk    rdS 	 t          |
¦  «        }t          |¦  «        }t          |¦  «        }n# t          $ r Y dS w xY w|d
k     s|dk    rdS |d
k     s|dk    rdS |d
k     s|dk    rdS dS )r;   Fé   ú rD   ú/rE   ú:é   é   r   é   é;   T)	r   ÚstrrI   ÚcountÚsplitr%   Ú
ValueErrorÚcalendarÚ
monthrange)r   ÚstrDateÚstrTimeÚstrYearÚstrMonthÚstrDayÚintYearÚintMonthÚintDayÚmonthMaxDayÚstrHourÚ	strMinuteÚ	strSecondÚintHourÚ	intMinuteÚ	intSeconds                   r   Ú$fontInfoOpenTypeHeadCreatedValidatorrt   ˜   so  € õ
 �e�SÑ!Ô!ð Øˆuåˆu‰:Œ:˜ÒÐØˆuØ‡{‚{�3ÑÔ˜1ÒÐØˆuØ—{’{ 3Ñ'Ô'Ñ€GˆWØ‡}‚}�SÑÔ˜QÒÐØˆuØ‡}‚}�SÑÔ˜QÒÐØˆuà '§¢¨cÑ 2Ô 2Ñ€GˆX�vÝ
ˆ7�|„|�qÒÐØˆuÝ
ˆ8�}„}˜ÒÐØˆuÝ
ˆ6�{„{�aÒÐØˆuðÝ�g‘,”,ˆÝ�x‘=”=ˆÝ�V‘”ˆˆøÝð ð ð Øˆuˆuðøøøà�!‚|€|�x "’}�}ØˆuÝÔ% g¨xÑ8Ô8¸Ô;€KØ�‚z€z�V˜kÒ)Ð)Øˆuà$+§M¢M°#Ñ$6Ô$6Ñ!€GˆY˜	Ý
ˆ7�|„|�qÒÐØˆuÝ
ˆ9�~„~˜ÒÐØˆuÝ
ˆ9�~„~˜ÒÐØˆuðÝ�g‘,”,ˆÝ˜	‘N”Nˆ	Ý˜	‘N”Nˆ	ˆ	øÝð ð ð Øˆuˆuðøøøà�‚{€{�g ’l�lØˆuØ�1‚}€}˜	 Bš˜ØˆuØ�1‚}€}˜	 Bš˜Øˆuàˆ4s$   Ã/-D Ä
D+Ä*D+Æ>-G, Ç,
G:Ç9G:c                óÒ   — t          | t          ¦  «        sdS t          t          dft          dft          dft          dft          df¬¦  «        }| D ]}t          ||¦  «        s dS ŒdS )rC   FT)ÚnameIDÚ
platformIDÚ
encodingIDÚ
languageIDÚstring)r   r"   rJ   r%   r_   r9   )r   rN   Ú
nameRecords      r   Ú$fontInfoOpenTypeNameRecordsValidatorr|   Ô   s†   € õ �e�TÑ"Ô"ð ØˆuÝ!%Ý�Tˆ{Ý˜�;Ý˜�;Ý˜�;Ý�Tˆ{ð"ñ "ô "€Mð ð ð ˆ
Ý# J°Ñ>Ô>ð 	Ø�5�5ð	àˆ4r   c                óD   — t          | t          ¦  «        sdS | dk     rdS dS )r;   Fr   Tr,   r-   s    r   Ú'fontInfoOpenTypeOS2WeightClassValidatorr~   ç   r/   r   c                óT   — t          | t          ¦  «        sdS | dk     rdS | dk    rdS dS )r;   FrD   é	   Tr,   r-   s    r   Ú&fontInfoOpenTypeOS2WidthClassValidatorr�   ò   s<   € õ �e�SÑ!Ô!ð ØˆuØˆq‚y€yØˆuØˆq‚y€yØˆuØˆ4r   c                ó¦   — t          | t          t          f¦  «        sdS t          | ¦  «        dk    rdS | D ]}t          |t          ¦  «        s dS ŒdS )z
    Version 2.
    Fé
   T©r   r"   r#   rI   r%   ©r   r   s     r   Ú*fontInfoVersion2OpenTypeOS2PanoseValidatorr†   ÿ   si   € õ �f�t¥U˜mÑ,Ô,ð ØˆuÝ
ˆ6�{„{�bÒÐØˆuØð ð ˆÝ˜%¥Ñ%Ô%ð 	Ø�5�5ð	ð ˆ4r   c                ó¸   — t          | t          t          f¦  «        sdS t          | ¦  «        dk    rdS | D ]#}t          |t          ¦  «        s dS |dk     r dS Œ$dS )rC   Frƒ   r   Tr„   r…   s     r   Ú*fontInfoVersion3OpenTypeOS2PanoseValidatorrˆ     sy   € õ �f�t¥U˜mÑ,Ô,ð ØˆuÝ
ˆ6�{„{�bÒÐØˆuØð ð ˆÝ˜%¥Ñ%Ô%ð 	Ø�5�5Ø�1Š9ˆ9Ø�5�5ð ð ˆ4r   c                óè   — t          | t          t          f¦  «        sdS t          | ¦  «        dk    rdS | D ]}t          |t          ¦  «        s dS Œ| \  }}|dk     s|dk    rdS |dk     s|dk    rdS dS )r;   FrE   r   é   é   Tr„   )r   r   ÚclassIDÚ
subclassIDs       r   Ú'fontInfoOpenTypeOS2FamilyClassValidatorrŽ     s�   € õ �f�t¥U˜mÑ,Ô,ð ØˆuÝ
ˆ6�{„{�aÒÐØˆuØð ð ˆÝ˜%¥Ñ%Ô%ð 	Ø�5�5ð	à Ñ€GˆZØ�‚{€{�g ’l�lØˆuØ�A‚~€~˜ bš˜ØˆuØˆ4r   c                óÎ   — t          | t          t          f¦  «        sdS t          | ¦  «        dk    rdS t          | ¦  «        dz  rdS | D ]}t          |t          ¦  «        s dS ŒdS )r;   FrŠ   rE   T©r   r"   r#   rI   r   r…   s     r   Ú fontInfoPostscriptBluesValidatorr‘   2  ó~   € õ �f�t¥U˜mÑ,Ô,ð ØˆuÝ
ˆ6�{„{�RÒÐØˆuÝ
ˆ6�{„{�Q�ð ØˆuØð ð ˆÝ˜%¥Ñ-Ô-ð 	Ø�5�5ð	àˆ4r   c                óÎ   — t          | t          t          f¦  «        sdS t          | ¦  «        dk    rdS t          | ¦  «        dz  rdS | D ]}t          |t          ¦  «        s dS ŒdS )r;   Frƒ   rE   Tr�   r…   s     r   Ú%fontInfoPostscriptOtherBluesValidatorr”   B  r’   r   c                ó¦   — t          | t          t          f¦  «        sdS t          | ¦  «        dk    rdS | D ]}t          |t          ¦  «        s dS ŒdS )r;   Fr\   Tr�   r…   s     r   Ú fontInfoPostscriptStemsValidatorr–   R  sg   € õ �f�t¥U˜mÑ,Ô,ð ØˆuÝ
ˆ6�{„{�RÒÐØˆuØð ð ˆÝ˜%¥Ñ-Ô-ð 	Ø�5�5ð	àˆ4r   c                óL   — t          t          dd¦  «        ¦  «        }| |vrdS dS )r;   rD   é   FT)r"   Úrange)r   r   s     r   Ú.fontInfoPostscriptWindowsCharacterSetValidatorrš   `  s.   € õ •u˜Q ‘|”|Ñ$Ô$€KØ�KÐÐØˆuØˆ4r   c                óX   — t          t          df¬¦  «        }t          | |¦  «        sdS dS )rC   T)ÚidF)rJ   r_   r9   ©r   rN   s     r   Ú%fontInfoWOFFMetadataUniqueIDValidatorrž   j  s4   € õ "&­#¨t¨Ð!5Ñ!5Ô!5€MÝ  }Ñ5Ô5ð ØˆuØˆ4r   c                óª   — t           dft           dft           dft           dfdœ}t          | |¦  «        sdS d| v r|                      d¦  «        dvrdS dS )rC   TF)ÚnameÚurlÚdirÚclassr¢   ©ÚltrÚrtl©r_   r9   Úgetr�   s     r   Ú#fontInfoWOFFMetadataVendorValidatorr©   t  sn   € õ
 �d�Ý�Uˆ|Ý�Uˆ|Ý�u�ð	"ð "€Mõ    }Ñ5Ô5ð ØˆuØ�€~€~˜%Ÿ)š) EÑ*Ô*°.Ð@Ð@ØˆuØˆ4r   c                óT  — t          t          df¬¦  «        }t          | |¦  «        sdS t          | d         ¦  «        sdS t          dft          dft          dft          dft          dfdœ}| d         D ]3}t          ||¦  «        s dS d|v r|                     d¦  «        dvr dS Œ4dS )rC   T)ÚcreditsFr«   )r    r¡   Úroler¢   r£   r¢   r¤   )rJ   r"   r9   rI   r_   r¨   )r   rN   Úcredits      r   Ú$fontInfoWOFFMetadataCreditsValidatorr®   …  sÓ   € õ "&­t°T¨lÐ!;Ñ!;Ô!;€MÝ  }Ñ5Ô5ð ØˆuÝˆu�YÔÑ Ô ð Øˆuå�d�Ý�Uˆ|Ý�e�Ý�Uˆ|Ý�u�ðð €Mð ˜	Ô"ð ð ˆÝ# F¨MÑ:Ô:ð 	Ø�5�5Ø�Fˆ?ˆ?˜vŸzšz¨%Ñ0Ô0¸ÐFÐFØ�5�5øØˆ4r   c                ó¢   — t          t          dft          df¬¦  «        }t          | |¦  «        sdS | d         D ]}t	          |¦  «        s dS ŒdS )rC   FT)r¡   Útextr°   ©rJ   r_   r"   r9   ÚfontInfoWOFFMetadataTextValue©r   rN   r°   s      r   Ú(fontInfoWOFFMetadataDescriptionValidatorr´   �  si   € õ "&­3°¨,½dÀD¸\Ð!JÑ!JÔ!J€MÝ  }Ñ5Ô5ð ØˆuØ�f”ð ð ˆÝ,¨TÑ2Ô2ð 	Ø�5�5ð	àˆ4r   c                óº   — t          t          dft          dft          df¬¦  «        }t          | |¦  «        sdS d| v r| d         D ]}t	          |¦  «        s dS ŒdS )rC   F)r¡   r°   rœ   r°   Tr±   r³   s      r   Ú$fontInfoWOFFMetadataLicenseValidatorr¶   ª  s�   € õ "&Ý�%ˆL¥ e˜}µ#°u°ð"ñ "ô "€Mõ    }Ñ5Ô5ð ØˆuØ�€€Ø˜&”Mð 	ð 	ˆDÝ0°Ñ6Ô6ð Ø�u�uðàˆ4r   c                ó’   — t          t          df¬¦  «        }t          | |¦  «        sdS | d         D ]}t          |¦  «        s dS ŒdS ©rC   T)r°   Fr°   ©rJ   r"   r9   r²   r³   s      r   Ú&fontInfoWOFFMetadataTrademarkValidatorrº   º  óc   € õ "&­D°$¨<Ð!8Ñ!8Ô!8€MÝ  }Ñ5Ô5ð ØˆuØ�f”ð ð ˆÝ,¨TÑ2Ô2ð 	Ø�5�5ð	àˆ4r   c                ó’   — t          t          df¬¦  «        }t          | |¦  «        sdS | d         D ]}t          |¦  «        s dS ŒdS r¸   r¹   r³   s      r   Ú&fontInfoWOFFMetadataCopyrightValidatorr½   Ç  r»   r   c                óš   — t           dft           dft           dfdœ}t          | |¦  «        sdS d| v r|                      d¦  «        dvrdS dS )rC   TF)r    r¢   r£   r¢   r¤   r§   r�   s     r   Ú%fontInfoWOFFMetadataLicenseeValidatorr¿   Ô  sg   € õ
 �d�Ý�Uˆ|Ý�u�ð"ð "€Mõ
    }Ñ5Ô5ð ØˆuØ�€~€~˜%Ÿ)š) EÑ*Ô*°.Ð@Ð@ØˆuØˆ4r   c                óª   — t           dft           dft           dft           dfdœ}t          | |¦  «        sdS d| v r|                      d¦  «        dvrdS dS ©rC   TF)r°   Úlanguager¢   r£   r¢   r¤   r§   r�   s     r   r²   r²   ä  ón   € õ
 �d�Ý˜%�LÝ�Uˆ|Ý�u�ð	"ð "€Mõ    }Ñ5Ô5ð ØˆuØ�€~€~˜%Ÿ)š) EÑ*Ô*°.Ð@Ð@ØˆuØˆ4r   c                ój   — t          | t          ¦  «        sdS | sdS | D ]}t          |¦  «        s dS ŒdS )rC   FT)r   r"   Ú&fontInfoWOFFMetadataExtensionValidator)r   Ú	extensions     r   Ú'fontInfoWOFFMetadataExtensionsValidatorrÇ   õ  sX   € õ �e�TÑ"Ô"ð ØˆuØð ØˆuØð ð ˆ	Ý5°iÑ@Ô@ð 	Ø�5�5ð	àˆ4r   c                óô   — t          t          dft          dft          df¬¦  «        }t          | |¦  «        sdS d| v r| d         D ]}t	          |¦  «        s dS Œ| d         D ]}t          |¦  «        s dS ŒdS )rC   FT)Únamesr   rœ   rÉ   r   )rJ   r"   r_   r9   Ú*fontInfoWOFFMetadataExtensionNameValidatorÚ*fontInfoWOFFMetadataExtensionItemValidator)r   rN   r    Úitems       r   rÅ   rÅ     s²   € õ "&Ý�Uˆm¥D¨$ <µS¸%°Lð"ñ "ô "€Mõ    }Ñ5Ô5ð ØˆuØ�%ÐÐØ˜'”Nð 	ð 	ˆDÝ=¸dÑCÔCð Ø�u�uðà�g”ð ð ˆÝ9¸$Ñ?Ô?ð 	Ø�5�5ð	àˆ4r   c                óì   — t          t          dft          dft          df¬¦  «        }t          | |¦  «        sdS | d         D ]}t	          |¦  «        s dS Œ| d         D ]}t          |¦  «        s dS ŒdS )rC   FT)rœ   rÉ   r   rÉ   r   )rJ   r_   r"   r9   rÊ   Ú+fontInfoWOFFMetadataExtensionValueValidator)r   rN   r    Úvals       r   rË   rË     s§   € õ "&Ý�ˆ<¥ d˜|µT¸4°Lð"ñ "ô "€Mõ    }Ñ5Ô5ð ØˆuØ�g”ð ð ˆÝ9¸$Ñ?Ô?ð 	Ø�5�5ð	à�XŒð ð ˆÝ:¸3Ñ?Ô?ð 	Ø�5�5ð	àˆ4r   c                óª   — t           dft           dft           dft           dfdœ}t          | |¦  «        sdS d| v r|                      d¦  «        dvrdS dS rÁ   r§   r�   s     r   rÊ   rÊ   (  rÃ   r   c                óª   — t           dft           dft           dft           dfdœ}t          | |¦  «        sdS d| v r|                      d¦  «        dvrdS dS rÁ   r§   r�   s     r   rÎ   rÎ   9  rÃ   r   ÚidentifiersúOptional[set[str]]c                óè   — t          | t          ¦  «        sdS |€t          ¦   «         }| D ]G}t          |¦  «        s dS |                     d¦  «        }|�||v r dS |                     |¦  «         ŒHdS ©rC   FNÚ
identifierT)r   r"   r$   ÚguidelineValidatorr¨   Úadd)r   rÒ   ÚguiderÖ   s       r   ÚguidelinesValidatorrÚ   O  s‘   € õ �e�TÑ"Ô"ð ØˆuØÐÝ‘e”eˆØð (ð (ˆÝ! %Ñ(Ô(ð 	Ø�5�5Ø—Y’Y˜|Ñ,Ô,ˆ
ØÐ!Ø˜[Ð(Ð(Ø�u�uØ�OŠO˜JÑ'Ô'Ð'øØˆ4r   F)ÚxÚyÚangler    ÚcolorrÖ   Ú_guidelineDictPrototypec                ó"  — t          | t          ¦  «        sdS |                      d¦  «        }|�|dk     rdS |dk    rdS |                      d¦  «        }|�t          |¦  «        sdS |                      d¦  «        }|�t	          |¦  «        sdS dS )	rC   FrÝ   Nr   ih  rÖ   rÞ   T)r9   rß   r¨   ÚidentifierValidatorÚcolorValidator)r   rÝ   rÖ   rÞ   s       r   r×   r×   l  s§   € õ   Õ'>Ñ?Ô?ð Øˆuà�IŠI�gÑÔ€EàÐØ�1Š9ˆ9Ø�5Ø�3Š;ˆ;Ø�5à—’˜<Ñ(Ô(€JØÐÕ&9¸*Ñ&EÔ&EÐØˆuà�IŠI�gÑÔ€EØÐ¥°Ñ!6Ô!6ÐØˆuØˆ4r   c                óè   — t          | t          ¦  «        sdS |€t          ¦   «         }| D ]G}t          |¦  «        s dS |                     d¦  «        }|�||v r dS |                     |¦  «         ŒHdS rÕ   )r   r"   r$   ÚanchorValidatorr¨   rØ   )r   rÒ   ÚanchorrÖ   s       r   ÚanchorsValidatorræ   Š  s‘   € õ �e�TÑ"Ô"ð ØˆuØÐÝ‘e”eˆØð (ð (ˆÝ˜vÑ&Ô&ð 	Ø�5�5Ø—Z’Z Ñ-Ô-ˆ
ØÐ!Ø˜[Ð(Ð(Ø�u�uØ�OŠO˜JÑ'Ô'Ð'øØˆ4r   )rÛ   rÜ   r    rÞ   rÖ   Ú_anchorDictPrototypec                ó4  — t          | t          ¦  «        sdS |                      d¦  «        }|                      d¦  «        }|�|€dS |                      d¦  «        }|�t          |¦  «        sdS |                      d¦  «        }|�t	          |¦  «        sdS dS )rC   FrÛ   rÜ   NrÖ   rÞ   T)r9   rç   r¨   rá   râ   )r   rÛ   rÜ   rÖ   rÞ   s        r   rä   rä   ¦  s    € õ   Õ';Ñ<Ô<ð ØˆuØ�	Š	�#‰Œ€AØ�	Š	�#‰Œ€Aà€y�A�IØˆuà—’˜<Ñ(Ô(€JØÐÕ&9¸*Ñ&EÔ&EÐØˆuà�IŠI�gÑÔ€EØÐ¥°Ñ!6Ô!6ÐØˆuØˆ4r   c                ó´   — d}d}t          | t          ¦  «        sdS | sdS t          | ¦  «        dk    rdS | D ] }t          |¦  «        }||k     s||k    r dS Œ!dS )z›
    Version 3+.

    >>> identifierValidator("a")
    True
    >>> identifierValidator("")
    False
    >>> identifierValidator("a" * 101)
    False
    é    é~   Féd   T)r   r_   rI   Úord)r   ÚvalidCharactersMinÚvalidCharactersMaxÚcÚis        r   rá   rá   Á  sŒ   € ð ÐØÐÝ�e�SÑ!Ô!ð ØˆuØð ØˆuÝ
ˆ5�z„z�CÒÐØˆuØð ð ˆÝ�‰FŒFˆØÐ!Ò!Ð! QÐ);Ò%;Ð%;Ø�5�5ð &<àˆ4r   c                ó|  — t          | t          ¦  «        sdS |                      d¦  «        }t          |¦  «        dk    rdS |D ]w}|                     ¦   «         }d}	 t          |¦  «        }d}n# t          $ r Y nw xY w|s#	 t          |¦  «        }d}n# t          $ r Y nw xY w|s dS d|cxk    rdk    sn  dS ŒxdS )a  
    Version 3+.

    >>> colorValidator("0,0,0,0")
    True
    >>> colorValidator(".5,.5,.5,.5")
    True
    >>> colorValidator("0.5,0.5,0.5,0.5")
    True
    >>> colorValidator("1,1,1,1")
    True

    >>> colorValidator("2,0,0,0")
    False
    >>> colorValidator("0,2,0,0")
    False
    >>> colorValidator("0,0,2,0")
    False
    >>> colorValidator("0,0,0,2")
    False

    >>> colorValidator("1r,1,1,1")
    False
    >>> colorValidator("1,1g,1,1")
    False
    >>> colorValidator("1,1,1b,1")
    False
    >>> colorValidator("1,1,1,1a")
    False

    >>> colorValidator("1 1 1 1")
    False
    >>> colorValidator("1 1,1,1")
    False
    >>> colorValidator("1,1 1,1")
    False
    >>> colorValidator("1,1,1 1")
    False

    >>> colorValidator("1, 1, 1, 1")
    True
    Fú,r[   Tr   rD   )r   r_   ra   rI   Ústripr%   rb   Úfloat)r   ÚpartsÚpartÚ	convertedÚnumbers        r   râ   râ   à  s  € õV �e�SÑ!Ô!ð ØˆuØ�KŠK˜ÑÔ€EÝ
ˆ5�z„z�Q‚€ØˆuØð ð ˆØ�zŠz‰|Œ|ˆØˆ	ð	Ý˜‘Y”YˆFØˆIˆIøÝð 	ð 	ð 	ØˆDð	øøøàð 	ðÝ˜t™œ�Ø �	�	øÝð ð ð Ø�ðøøøàð 	Ø�5�5Ø�FÐÐÒÐ˜aÒÐÐÐØ�5�5ð  àˆ4s$   ÁA/Á/
A<Á;A<ÂBÂ
B!Â B!s   ‰PNG

ÚbytesÚpngSignatureT)ÚfileNameÚxScaleÚxyScaleÚyxScaleÚyScaleÚxOffsetÚyOffsetrÞ   Ú_imageDictPrototypec                ó˜   — t          | t          ¦  «        sdS | d         sdS |                      d¦  «        }|�t          |¦  «        sdS dS )rC   Frü   rÞ   NT)r9   r  r¨   râ   )r   rÞ   s     r   ÚimageValidatorr  8  s\   € õ   Õ':Ñ;Ô;ð Øˆuà�Ôð Øˆuà�IŠI�gÑÔ€EØÐ¥°Ñ!6Ô!6ÐØˆuØˆ4r   ÚpathúOptional[str]ÚdataúOptional[bytes]ÚfileObjúOptional[Any]útuple[bool, Any]c                óJ  — | €|€|€J ‚| �>t          | d¦  «        5 }|                     d¦  «        }ddd¦  «         n# 1 swxY w Y   nM|�|dd…         }n@|�>|                     ¦   «         }|                     d¦  «        }|                     |¦  «         |t          k    rdS dS )zG
    Version 3+.

    This checks the signature of the image data.
    NÚrbé   )Fz,Image does not begin with the PNG signature.©TN)r   ÚreadÚtellÚseekrû   )r  r  r
  ÚfÚ	signatureÚposs         r   ÚpngValidatorr  H  sñ   € ð Ð˜tÐ/°7Ð3FÐ3FÐ3FØÐÝ�$˜ÑÔð 	" ØŸš˜q™	œ	ˆIð	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"øà	Ð	Ø˜˜!˜”Hˆ	ˆ	Ø	Ð	Ø�lŠl‰nŒnˆØ—L’L ‘O”Oˆ	Ø�Š�SÑÔÐØ•LÒ Ð ØDÐDØˆ:s   ›=½AÁAÚufoPathOrFileSystemúUnion[str, fs.base.FS]útuple[bool, Optional[str]]c                óR  — t          |t          j        j        ¦  «        r|}nt          j                             |¦  «        }d}t          | t          ¦  «        sd|fS t          ¦   «         }t          ¦   «         }i }| D �]}t          |t          ¦  «        sd|fc S t          |¦  «        dk    sd|fc S |D ]}t          |t          ¦  «        sd|fc c S Œ |\  }	}
|
dk    r|
 
                    d¦  «        s	dd|
z  fc S t          |	¦  «        dk    r dS |                     |
¦  «        s	dd	|
z  fc S |	d
k    r	|
dk    r dS |	|v r	dd|	z  fc S |                     |	¦  «         |
|v r	dd|
z  fc S |                     |
¦  «         |
||	<   �Œd|                     ¦   «         v }|sdS dS )zD
    Check the validity of layercontents.plist.
    Version 3+.
    z1layercontents.plist in not in the correct format.FrE   Úglyphszglyphs.z3Invalid directory name (%s) in layercontents.plist.r   )Fz(Empty layer name in layercontents.plist.z A glyphset does not exist at %s.zpublic.default)FzIThe name public.default is being used by a layer that is not the default.z1The layer name %s is used by more than one layer.z0The directory %s is used by more than one layer.)Fz1The required default glyph set is not in the UFO.r  )r   ÚfsÚbaseÚFSÚosfsÚOSFSr"   r$   rI   r_   Ú
startswithÚexistsrØ   r   )r   r  Ú
fileSystemÚbogusFileMessageÚusedLayerNamesÚusedDirectoriesÚcontentsÚentryrñ   Ú	layerNameÚdirectoryNameÚfoundDefaults               r   ÚlayerContentsValidatorr-  f  sv  € õ Ð%¥r¤w¤zÑ2Ô2ð 7Ø(ˆ
ˆ
å”W—\’\Ð"5Ñ6Ô6ˆ
àJÐå�e�TÑ"Ô"ð 'ØÐ&Ð&Ð&å‘U”U€NÝ‘e”e€OØ€HØð +,ñ +,ˆå˜%¥Ñ&Ô&ð 	+ØÐ*Ð*Ð*Ð*Ð*Ý�5‰zŒz˜QŠˆØÐ*Ð*Ð*Ð*Ð*Øð 	/ð 	/ˆAÝ˜a¥Ñ%Ô%ð /ØÐ.Ð.Ð.Ð.Ð.Ð.Ð.ð/à#(Ñ ˆ	�=à˜HÒ$Ð$Ø ×+Ò+¨IÑ6Ô6ð àØIØ#ñ$ðð ð ð õ
 ˆy‰>Œ>˜QÒÐØDÐDÐDà× Ò  Ñ/Ô/ð 	MØÐ<¸}ÑLÐLÐLÐLÐLàÐ(Ò(Ð(¨]¸hÒ-FÐ-Fðð ð ð
 ˜Ð&Ð&àØCÀiÑOðð ð ð ð 	×Ò˜9Ñ%Ô%Ð%Ø˜OÐ+Ð+àØBÀ]ÑRðð ð ð ð 	×Ò˜MÑ*Ô*Ð*à+ˆ�ÑÑà˜xŸšÑ0Ô0Ð0€LØð JØIÐIØˆ:r   c                ó\  — d}t          | ¦  «        sd|fS i }i }|                      ¦   «         D ]ý\  }}t          |t          ¦  «        sd|fc S t          |t          t
          f¦  «        sd|fc S |s dS |                     d¦  «        r¡|                     d¦  «        s|                     d¦  «        sŒ‡t          d¦  «        t          |¦  «        k    r dS |                     d¦  «        r|}n|}|D ]6}t          |t          ¦  «        sdd	|z  fc c S ||v rdd
|z  fc c S |||<   Œ7ŒþdS )aª  
    Check the validity of the groups.
    Version 3+ (though it's backwards compatible with UFO 1 and UFO 2).

    >>> groups = {"A" : ["A", "A"], "A2" : ["A"]}
    >>> groupsValidator(groups)
    (True, None)

    >>> groups = {"" : ["A"]}
    >>> valid, msg = groupsValidator(groups)
    >>> valid
    False
    >>> print(msg)
    A group has an empty name.

    >>> groups = {"public.awesome" : ["A"]}
    >>> groupsValidator(groups)
    (True, None)

    >>> groups = {"public.kern1." : ["A"]}
    >>> valid, msg = groupsValidator(groups)
    >>> valid
    False
    >>> print(msg)
    The group data contains a kerning group with an incomplete name.
    >>> groups = {"public.kern2." : ["A"]}
    >>> valid, msg = groupsValidator(groups)
    >>> valid
    False
    >>> print(msg)
    The group data contains a kerning group with an incomplete name.

    >>> groups = {"public.kern1.A" : ["A"], "public.kern2.A" : ["A"]}
    >>> groupsValidator(groups)
    (True, None)

    >>> groups = {"public.kern1.A1" : ["A"], "public.kern1.A2" : ["A"]}
    >>> valid, msg = groupsValidator(groups)
    >>> valid
    False
    >>> print(msg)
    The glyph "A" occurs in too many kerning groups.
    z,The group data is not in the correct format.F)FzA group has an empty name.zpublic.zpublic.kern1.zpublic.kern2.zpublic.kernN.)Fz@The group data contains a kerning group with an incomplete name.z-The group data %s contains an invalid member.z1The glyph "%s" occurs in too many kerning groups.r  )r   r   r   r_   r"   r#   r"  rI   )r   ÚbogusFormatMessageÚfirstSideMappingÚsecondSideMappingÚ	groupNameÚ	glyphListÚdÚ	glyphNames           r   ÚgroupsValidatorr6  ²  s×  € ðX HÐÝ˜ÑÔð )ØÐ(Ð(Ð(Ø')ÐØ(*ÐØ %§¢¡¤ð ")ð ")Ñˆ	�9Ý˜)¥cÑ+Ô+ð 	-ØÐ,Ð,Ð,Ð,Ð,Ý˜)¥d­E ]Ñ3Ô3ð 	-ØÐ,Ð,Ð,Ð,Ð,Øð 	7Ø6Ð6Ð6Ø×Ò 	Ñ*Ô*ð 	)Ø×'Ò'¨Ñ8Ô8ð 
À×AUÒAUØñBô Bð 
ð å�Ñ'Ô'­3¨y©>¬>Ò9Ð9ðð ð ð ×#Ò# OÑ4Ô4ð &Ø$��à%�Ø&ð )ð )�	Ý! )­SÑ1Ô1ð àØGÈ)ÑSðð ð ð ð ð ð  �>�>àØKÈiÑWðð ð ð ð ð ð  )��)‘�øØˆ:r   c                ó„  — d}t          | t          ¦  «        sd|fS |                      ¦   «         D ]�\  }}t          |t          ¦  «        sd|fc S t          |t          ¦  «        sd|fc S |                     ¦   «         D ]?\  }}t          |t          ¦  «        sd|fc c S t          |t          ¦  «        sd|fc c S Œ@Œ�dS )aA  
    Check the validity of the kerning data structure.
    Version 3+ (though it's backwards compatible with UFO 1 and UFO 2).

    >>> kerning = {"A" : {"B" : 100}}
    >>> kerningValidator(kerning)
    (True, None)

    >>> kerning = {"A" : ["B"]}
    >>> valid, msg = kerningValidator(kerning)
    >>> valid
    False
    >>> print(msg)
    The kerning data is not in the correct format.

    >>> kerning = {"A" : {"B" : "100"}}
    >>> valid, msg = kerningValidator(kerning)
    >>> valid
    False
    >>> print(msg)
    The kerning data is not in the correct format.
    z.The kerning data is not in the correct format.Fr  )r   r   r   r_   r   )r  r/  ÚfirstÚ
secondDictÚsecondr   s         r   ÚkerningValidatorr;    s  € ð. JÐÝ�d�GÑ$Ô$ð )ØÐ(Ð(Ð(Ø!ŸZšZ™\œ\ð 	1ð 	1ÑˆˆzÝ˜%¥Ñ%Ô%ð 	-ØÐ,Ð,Ð,Ð,Ð,Ý˜J­Ñ0Ô0ð 	-ØÐ,Ð,Ð,Ð,Ð,Ø'×-Ò-Ñ/Ô/ð 	1ð 	1‰MˆF�EÝ˜f¥cÑ*Ô*ð 1ØÐ0Ð0Ð0Ð0Ð0Ð0Ð0Ý ¥{Ñ3Ô3ð 1ØÐ0Ð0Ð0Ð0Ð0Ð0Ð0ð1ð	1ð
 ˆ:r   z-The lib data is not in the correct format: %sc                ó  — t          | ¦  «        s#dt          | ¦  «        j        z  }dt          |z  fS |                      ¦   «         D ]¸\  }} t          |t          ¦  «        sddt          |¦  «        j        ›d|›�fc S |dk    rzd}t          | t          t          f¦  «        s dt          | ¦  «        j        z  }d||z  fc S | D ]9}t          |t          ¦  «        s"dt          |¦  «        j        z  }d||z  fc c S Œ:Œ¹d	S )
aÎ  
    Check the validity of the lib.
    Version 3+ (though it's backwards compatible with UFO 1 and UFO 2).

    >>> lib = {"foo" : "bar"}
    >>> fontLibValidator(lib)
    (True, None)

    >>> lib = {"public.awesome" : "hello"}
    >>> fontLibValidator(lib)
    (True, None)

    >>> lib = {"public.glyphOrder" : ["A", "C", "B"]}
    >>> fontLibValidator(lib)
    (True, None)

    >>> lib = "hello"
    >>> valid, msg = fontLibValidator(lib)
    >>> valid
    False
    >>> print(msg)  # doctest: +ELLIPSIS
    The lib data is not in the correct format: expected a dictionary, ...

    >>> lib = {1: "hello"}
    >>> valid, msg = fontLibValidator(lib)
    >>> valid
    False
    >>> print(msg)
    The lib key is not properly formatted: expected str, found int: 1

    >>> lib = {"public.glyphOrder" : "hello"}
    >>> valid, msg = fontLibValidator(lib)
    >>> valid
    False
    >>> print(msg)  # doctest: +ELLIPSIS
    public.glyphOrder is not properly formatted: expected list or tuple,...

    >>> lib = {"public.glyphOrder" : ["A", 1, "B"]}
    >>> valid, msg = fontLibValidator(lib)
    >>> valid
    False
    >>> print(msg)  # doctest: +ELLIPSIS
    public.glyphOrder is not properly formatted: expected str,...
    úexpected a dictionary, found %sFz;The lib key is not properly formatted: expected str, found z: zpublic.glyphOrderz/public.glyphOrder is not properly formatted: %sz expected list or tuple, found %szexpected str, found %sr  )	r   ÚtypeÚ__name__Ú_bogusLibFormatMessager   r   r_   r"   r#   )r   Úreasonr5   ÚbogusGlyphOrderMessager5  s        r   ÚfontLibValidatorrC  <  sR  € õZ ˜ÑÔð 6Ø2µT¸%±[´[Ô5IÑIˆØÕ,¨vÑ5Ð5Ð5Ø—k’k‘m”mð Bð B‰
ˆˆUÝ˜#�sÑ#Ô#ð 	Ø�5å˜‘9”9Ô%Ð%Ð% s sð,ðð ð ð ð
 Ð%Ò%Ð%Ø%VÐ"Ý˜e¥d­E ]Ñ3Ô3ð >Ø;½dÀ5¹k¼kÔ>RÑR�ØÐ4°vÑ=Ð=Ð=Ð=Ð=Ø"ð Bð B�	Ý! )­SÑ1Ô1ð BØ5½¸Y¹¼Ô8PÑP�FØ Ð"8¸6Ñ"AÐAÐAÐAÐAÐAÐAðBøð ˆ:r   c                ó  — t          | ¦  «        s#dt          | ¦  «        j        z  }dt          |z  fS |                      ¦   «         D ]E\  }} t          |t          ¦  «        sd|z  }dt          |z  fc S |dk    rt          | ¦  «        s dS ŒFdS )a,  
    Check the validity of the lib.
    Version 3+ (though it's backwards compatible with UFO 1 and UFO 2).

    >>> lib = {"foo" : "bar"}
    >>> glyphLibValidator(lib)
    (True, None)

    >>> lib = {"public.awesome" : "hello"}
    >>> glyphLibValidator(lib)
    (True, None)

    >>> lib = {"public.markColor" : "1,0,0,0.5"}
    >>> glyphLibValidator(lib)
    (True, None)

    >>> lib = {"public.markColor" : 1}
    >>> valid, msg = glyphLibValidator(lib)
    >>> valid
    False
    >>> print(msg)
    public.markColor is not properly formatted.
    r=  Fzkey (%s) should be a stringzpublic.markColor)Fz+public.markColor is not properly formatted.r  )r   r>  r?  r@  r   r   r_   râ   )r   rA  r5   s      r   ÚglyphLibValidatorrE  „  s´   € õ0 ˜ÑÔð 6Ø2µT¸%±[´[Ô5IÑIˆØÕ,¨vÑ5Ð5Ð5Ø—k’k‘m”mð Lð L‰
ˆˆUÝ˜#�sÑ#Ô#ð 	:Ø2°SÑ8ˆFØÕ0°6Ñ9Ð9Ð9Ð9Ð9àÐ$Ò$Ð$Ý! %Ñ(Ô(ð LØKÐKÐKøØˆ:r   Ú__main__)r   r   r   r   )r   r   r   r   r   r   )r   r   r   r    r   r   )r   r   r2   r3   r   r   )r   r   r   r   )N)r   r   rÒ   rÓ   r   r   )NNN)r  r  r  r	  r
  r  r   r  )r   r   r  r  r   r  )r   r   r   r  )r  r   r   r  )UÚ__doc__Ú
__future__r   rc   Úcollections.abcr   r   Úior   ÚfontTools.misc.filesystemÚmiscÚ
filesystemr  Útypingr   r   r	   r
   ÚfontTools.annotationsr   ÚfontTools.ufoLib.utilsr   rJ   r_   r#   r>  r   r3   r   r   r(   r.   r1   r9   rA   rU   rt   r|   r~   r�   r†   rˆ   rŽ   r‘   r”   r–   rš   rž   r©   r®   r´   r¶   rº   r½   r¿   r²   rÇ   rÅ   rË   rÊ   rÎ   rÚ   r%   rõ   rß   Ú__annotations__r×   ræ   rç   rä   rá   râ   rû   r  r  r  r-  r6  r;  r@  rC  rE  r?  ÚdoctestÚtestmodr?   r   r   ú<module>rT     s<  ðØ (Ð (Ð (à "Ð "Ð "Ð "Ð "Ð "à €€€Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ø Ð Ð Ð Ð Ð à &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -à *Ð *Ð *Ð *Ð *Ð *Ø .Ð .Ð .Ð .Ð .Ð .à�3˜˜e D¨%°°S´	¸3°Ô*?Ð$?Ô@À$ÐFÔGÐGÔH€ð
ð 
ð 
ð 
ð"ð "ð "ð "ðð ð ð ð ð ð ð ðð ð ð ðð ð ð ðDð ð ð ðð ð ð ð<9ð 9ð 9ð 9ðxð ð ð ð&ð ð ð ð
ð 
ð 
ð 
ðð ð ð ðð ð ð ð"ð ð ð ð&ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ðð ð ð ðð ð ð ð"ð ð ð ð0
ð 
ð 
ð 
ðð ð ð ð 
ð 
ð 
ð 
ð
ð 
ð 
ð 
ðð ð ð ð ð ð ð ð"ð ð ð ðð ð ð ð&ð ð ð ð$ð ð ð ð"ð ð ð ð,ð ð ð ð ð& (, tØˆU€|�UÐØˆU€|�UÐØ�ˆ<˜Ð
Ø
ˆuˆØ�ˆ,Ø�Uˆ|ð(ñ (ô (Ð ð ð ð ñ ðð ð ð ð<ð ð ð ð ð& %) DØˆU€|�UÐØˆU€|�UÐØ
ˆuˆØ�ˆ,Ø�Uˆ|ð%ñ %ô %Ð ð ð ð ñ ðð ð ð ð6ð ð ð ð>Cð Cð Cð CðT +€Ð *Ð *Ð *Ñ *à#' 4Ø�4ˆ[Ø�%ˆL˜%Ð Ø�5ˆ\˜5Ð!Ø�5ˆ\˜5Ð!Ø�%ˆL˜%Ð Ø�5ˆ\˜5Ð!Ø�5ˆ\˜5Ð!Ø�ˆ,ð	$ñ 	$ô 	$Ð ð 	ð 	ð 	ñ 	ðð ð ð" Ø Ø!ðð ð ð ð ð<Dð Dð Dð DðXTð Tð Tð Tðx$ð $ð $ð $ðV IÐ ð@ð @ð @ð @ðP#ð #ð #ð #ðL ˆzÒÐØ€N€N€Nà€G„OÑÔÐÐÐð Ðr   