
    rbi~                       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     k/var/www/html/mdtn/previsions/meteo_cartes/venv/lib/python3.11/site-packages/fontTools/ufoLib/validators.pyisDictEnoughr      sM    
 %!! t+  ud## 	55	4    typ	Type[Any]c                "    t          | |          S )(
    Generic. (Added at version 2.)
    )r   )r   r   s     r   genericTypeValidatorr   #   s     eS!!!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{     ftUm,, uFI%%N>! u  %%% 	55	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.   :   .     eS!! uqyy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qyy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    
 eW%% u ) 1 1  _c8 	e55  zz||  i55   ++--  Q"+C.x9X9!]++ 	55	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    eT"" u
5zzQt!\\N!%4[T4L" " "M I  #K?? 	55>*235d;; 	5528^LL 	55F9%%%%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   
 eS!! uu::u{{31u{{3''GW}}SQu}}SQu 'c 2 2GXv
7||qu
8}}u
6{{aug,,x==V   uu!||x"}}u%gx88;KzzVk))u$+MM#$6$6!GY	
7||qu
9~~u
9~~ug,,	NN		NN		   uu{{gll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     eT"" u!%T{;;;T{" " "M   
#J>> 	55	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<     eS!! uqyyuqyy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     ftUm,, u
6{{bu  %%% 	55	 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     ftUm,, u
6{{bu  %%% 	5519955  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     ftUm,, u
6{{au  %%% 	55	 GZ{{gll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  ~     ftUm,, u
6{{Ru
6{{Q u  %-- 	55	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     ftUm,, u
6{{Ru  %-- 	55	4r   c                L    t          t          dd                    }| |vrdS dS )r;   rD      FT)r"   range)r   r   s     r   .fontInfoPostscriptWindowsCharacterSetValidatorr   `  s.     uQ||$$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!5M}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     "&tTl!;!;!;M}55 uuY   udU|eU|u M 	"  #FM:: 	55F??vzz%00FF55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,dD\!J!J!JM}55 uf  ,T22 	55	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 uu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!8M}55 uf  ,T22 	55	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     eT"" u u  	5i@@ 	55	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     "&UmD$<S%L" " "M  }55 u%'N 	 	D=dCC uug  9$?? 	55	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|T4L" " "M  }55 ug  9$?? 	55	X  :3?? 	55	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     eT"" uee ( (!%(( 	55YY|,,
![((uuOOJ'''4r   F)xyangler   colorr   _guidelineDictPrototypec                   t          | t                    sdS |                     d          }|                     d          }|                     d          }||dS |||dS |||dS ||dk     rdS |dk    rdS |                     d          }|t          |          sdS |                     d	          }|t	          |          sdS d
S )rC   Fr   r   r   Nr   ih  r   r   T)r9   r   r   identifierValidatorcolorValidator)r   r   r   r   r   r   s         r   r   r   l  s      '>?? u		#A		#AIIgEyQYuyAI5}5=u19953;;5<((J&9*&E&EuIIg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     eT"" uee ( (v&& 	55ZZ--
![((uuOOJ'''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yAIu<((J&9*&E&EuIIg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
        ~   Fd   T)r   r_   rI   ord)r   validCharactersMinvalidCharactersMaxcis        r   r   r     s     eS!! u u
5zzCu  FF!!!Q);%;%;55 &<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 eS!! uKKE
5zzQu  zz||		YYFII 	 	 	D	 	t 		    	55Fa55  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  C  s\      ':;; u uIIg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  S  s     t/73F3F3F$ 	"q		I	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"		!H				llnnLLOO	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-  q  sv    %rwz22 7(

W\\"566
JeT"" '&&&UUNeeOH +, +,%&& 	+*****5zzQ***** 	/ 	/Aa%% /......./#( 	=H$$ ++I66 I#$   
 y>>QDDD  // 	M<}LLLLL(((]h-F-F  
 &&CiO    	9%%%O++B]R    	M***+x000L 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 |||<   7d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++ 	-,,,,,)dE]33 	-,,,,, 	7666	** 	)''88 
AUAUB B 
 ''3y>>99   ##O44 &$%& ) )	!)S11 G)S      >>Ki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dG$$ )(((!ZZ\\ 	1 	1z%%% 	-,,,,,J00 	-,,,,,'--// 	1 	1MFEfc** 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  G  sR   Z  62T%[[5II,v555kkmm B B
U#s## 	599%%%ss,   
 %%%%V"edE]33 >;d5kk>RR4v=====" B B	!)S11 B5Y8PPF "86"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2T%[[5II,v555kkmm L L
U#s## 	:2S8F06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eD%S	3*?$?@$FGGH
 
 
 
" " " "             D      <9 9 9 9x   &   
 
 
 
      "   &                    "   0
 
 
 
    
 
 
 

 
 
 
       "      &   $   "   ,    & (,tU|UU|U<

u,U|( ( (     ! ! ! !R    & %)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NNNGO r   