
    )Vht                      U d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	m
Z
 ddlmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZ ddlmZ dd	lm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      Z$ G d de      Z% G d de      Z&dudZ'dvdwdZ(dxdZ)	 dy	 	 	 	 	 	 	 dzdZ*dd d!d"d#d$d%d&d'Z+i d(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIi dJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdiZ,e,j[                  e+       djdkdldmdnZ.dodpiZ/e,ja                         D  ci c]  \  } }|| 
 c}} Z1 e2e1      D ]+  Z3dqe3v se3ji                  dq      \  Z5Z6e1e3   xe1e5<   e1e6<   e1e3= - e.ja                         D  ci c]  \  } }|| 
 c}} Z7e/ja                         D  ci c]  \  } }|| 
 c}} Z8 e2e8      D ]+  Z3dqe3v se3ji                  dq      \  Z5Z6e8e3   xe8e5<   e8e6<   e8e3= - drZ9 e)e9      Z:dsZ; e)e;      Z<g dtZ=dugZ> e(dve=e>D cg c]  }dw| 	 c}z         Z?e=e>z   Z@ e*e@dxdydz{      \  ZAZBZCd|ZD e*eDd}d      \  ZEZFZGZHd~ZI e*eIdd      \  ZJZKZLZMdZN e*eNdd      \  ZOZPZQZRdZS e*eSddy      \  ZTZUZVZWdZX e*eXddy      \  ZYZZZ[Z\dZ] e*e]ddy      \  Z^Z_Z`ZadZb e*ebddy      \  ZcZdZeZfdZg e*egddy      \  ZhZiZjZkdZl e)el      ZmdZn e*enddy      \  ZoZpZqZrdZs e*esddy      \  ZtZuZvZwg dZx e)ex      Zy e)exD cg c]
  }|dd  d c}      Zz e(dex      Z{h dZ|e|D ch c]  }| d	 c}Z}g dexz   Z~ e)e~      Z e)e~D cg c]  }| d	 c}      ZdZ e*edd      \  ZZZZdZ e*eddy      \  ZZZZdZ e*eddy      \  ZZZZdZ e*eddy      \  ZZZZdZ e*eddy      \  ZZZZdZ e*edd      \  ZZZZdZ e*edd      \  ZZZZdji                         Zdji                         Z e*edddz{      \  ZZZ e*edddz{      \  ZZZdZ e*edddz{      \  ZZZg dZddgZeeD cg c]  }dw| 	 c}z   ZdZg dez   Zg dZg dez   Z e)e      Zg de=z   Zddge>z   Z e)e      ZeD cg c]  }| d	 c}ZeD cg c]  }| d	 c}Z e)e      ZdgZ e'dqj                  eeD cg c]  }dw| 	 c}z   ez               ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ e'dqj                  egez    e2e+      z   g dz               Zd e'd      fd e'd      fd e'd      ffZd eD        Zded<   ddqj                  eӫ       dĝZdZdji                         Zeg dǢz   Z e)eث      Z e'dqj                  eث            Zdeڛ dɝZh dʣZi dd˓dd͓ddΓddГddғddԓddғddԓddғddԓddғddԓddۓddܓddޓddޓddޓddiZdeja                         D  ci c]  \  } }|| 
 c}} iZded<   ded   d<   dddddddddddddZ e'dqj                  e߫            Z e)e߫      Zeja                         D  ci c]  \  } }|| 
 c}} ed<   dD ]  \  ZZZZ	 eee   e   e<     e'dqj                  ed               Z e)ed         Zd{dZdddddddddd	Zi dddddddddddddddddddddddddddddddddddd d dddddddddddddZ ej                  d e'dqj                  e             d	ej                        Zd
Z ej                  dej                        ZdZdZdZdZdZdddddZ ej                  d e'dqj                  e             dej                        ZdddddddZ ej                  d e'dqj                  e             dej                        Z ej                  dej                        Z ej                  dej                        Z ej                  dej                        Z ej                  dej                        Z ej                  dej                        Z ej                  dej                        Z d d!d"d#d d d d d d d d d d$Z eej                               Z ed%d&d'd(d)d*d+d,-      Z ej                  ddqj                  e       d.      Zg d/Zg d0Z	g d1Z
g d2Z edzdzdzddzdz3      ZeD  ci c]  } | d c} ZeD  ci c]  } | dz c} Zddzdd4Z ej                  d5      Z ej                  d6ej                        Z ej                  d7      Z ej                  d8e՛ dej                        Z ej                  d8eۛ dej                        Z ej                  d9      Z ej                  deћ d      Z ej                  d:      Z ej                  d;ej                        Z ej                  d<      Z ej                  d=ej                        Z ej                  d>ej                        Z ej                  d?ej                        Z ej                  d@ej                        Z ej                  dAej                        Z ej                  dBej                        Z ej                  dCej                        Z  ej                  dDej                        Z! ej                  dEej                        Z" ej                  dFej                        Z# ej                  dGej                        Z$ ej                  dHej                        Z% ej                  dI      Z& ej                  dJej                        Z' ej                  dK      Z( ej                  dL      Z) ej                  dM      Z* ej                  dN      Z+ ej                  dO      Z, ej                  dP      Z- ej                  dQ      Z. ej                  dR      Z/ ej                  dS      Z0 ej                  dT      Z1 ej                  dU      Z2 ej                  dV      dWf ej                  dX      dYf ej                  dZ      d[f ej                  d\      d]f ej                  d^      d_f ej                  d`      daf ej                  db      dcf ej                  dd      d[f ej                  de      d[f ej                  df      dgf ej                  dh      diffZ3 ej                  dj      Z4 G dk dle5      Z6eZ7eZ8e8ree5dmf   Z9n  G dn doe:      Z; G dp dqe;r      Z9 G ds dt      Z<yc c}} w c c}} w c c}} w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}} w c c}} w # e$ r i ee   e<   eee   e   e<   Y w xY wc c} w c c} w (|  a  
inflect: english language inflection
 - correctly generate plurals, ordinals, indefinite articles
 - convert numbers to words

Copyright (C) 2010 Paul Dyson

Based upon the Perl module
`Lingua::EN::Inflect <https://metacpan.org/pod/Lingua::EN::Inflect>`_.

methods:
    classical inflect
    plural plural_noun plural_verb plural_adj singular_noun no num a an
    compare compare_nouns compare_verbs compare_adjs
    present_participle
    ordinal
    number_to_words
    join
    defnoun defverb defadj defa defan

INFLECTIONS:
    classical inflect
    plural plural_noun plural_verb plural_adj singular_noun compare
    no num a an present_participle

PLURALS:
    classical inflect
    plural plural_noun plural_verb plural_adj singular_noun no num
    compare compare_nouns compare_verbs compare_adjs

COMPARISONS:
    classical
    compare compare_nouns compare_verbs compare_adjs

ARTICLES:
    classical inflect num a an

NUMERICAL:
    ordinal number_to_words

USER_DEFINED:
    defnoun defverb defadj defa defan

Exceptions:
 UnknownClassicalModeError
 BadNumValueError
 BadChunkingOptionError
 NumOutOfRangeError
 BadUserDefinedPatternError
 BadRcFileError
 BadGenderError

    )annotationsN)Number)TYPE_CHECKINGAnyCallableDictIterableListLiteralMatchOptionalSequenceTupleUnioncast)windowed_complete)typechecked   )	Annotatedc                      e Zd Zy)UnknownClassicalModeErrorN__name__
__module____qualname__     S/home/dcms/DCMS/lib/python3.12/site-packages/setuptools/_vendor/inflect/__init__.pyr   r   V       r   r   c                      e Zd Zy)BadNumValueErrorNr   r   r   r   r!   r!   Z   r   r   r!   c                      e Zd Zy)BadChunkingOptionErrorNr   r   r   r   r#   r#   ^   r   r   r#   c                      e Zd Zy)NumOutOfRangeErrorNr   r   r   r   r%   r%   b   r   r   r%   c                      e Zd Zy)BadUserDefinedPatternErrorNr   r   r   r   r'   r'   f   r   r   r'   c                      e Zd Zy)BadRcFileErrorNr   r   r   r   r)   r)   j   r   r   r)   c                      e Zd Zy)BadGenderErrorNr   r   r   r   r+   r+   n   r   r   r+   sc                    d|  dS )Nz(?:)r   )r,   s    r   encloser/   r   s    1:r   c                R     t        dj                   fd|xs g D                    S )a  
    Join stem of each word in words into a string for regex.

    Each word is truncated at cutpoint.

    Cutpoint is usually negative indicating the number of letters to remove
    from the end of each word.

    >>> joinstem(-2, ["ephemeris", "iris", ".*itis"])
    '(?:ephemer|ir|.*it)'

    >>> joinstem(None, ["ephemeris"])
    '(?:ephemeris)'

    >>> joinstem(5, None)
    '(?:)'
    |c              3  (   K   | ]	  }|d    y wNr   ).0wcutpoints     r   	<genexpr>zjoinstem.<locals>.<genexpr>   s     >QAixL>s   )r/   join)r6   wordss   ` r   joinstemr:   v   s#    $ 388>%+2>>??r   Iterable[str]c                    t        j                  t              }| D ]  }|t        |         j	                  |       ! |S )a  
    From a list of words, return a dict of sets sorted by word length.

    >>> words = ['ant', 'cat', 'dog', 'pig', 'frog', 'goat', 'horse', 'elephant']
    >>> ret = bysize(words)
    >>> sorted(ret[3])
    ['ant', 'cat', 'dog', 'pig']
    >>> ret[5]
    {'horse'}
    )collectionsdefaultdictsetlenadd)r9   resr5   s      r   bysizerC      s<     &11#6C CFJr   Tc                    || }| D cg c]
  }|d| |z    }}t        |       }t        |      }|rt        ||       }||||fS |||fS c c}w )am  
    given a list of singular words: lst

    an ending to append to make the plural: plending

    the number of characters to remove from the singular
    before appending plending: siendingsize

    a flag whether to create a joinstem: dojoinstem

    return:
    a list of pluralised words: si_list (called si because this is what you need to
    look for to make the singular)

    the pluralised words as a dict of sets sorted by word length: si_bysize
    the singular words as a dict of sets sorted by word length: pl_bysize
    if dojoinstem is True: a regular expression that matches any of the stems: stem
    N)rC   r:   )	lstplendingsiendingsize
dojoinstemr5   si_list	pl_bysize	si_bysizestems	            r   make_pl_si_listsrM      sr    0 $}478qq,(*8G8sIwIc*	9d22	9,, 9s   A
zcorpuses|corporazopuses|operageneramythoizpenises|penestesteszatlases|atlantesyeses)corpusopusgenusmythospenistestisatlasyeschildchildrenchilizchilis|chiliesbrotherzbrothers|brethreninfinityzinfinities|infinityloafloaveslorez
lores|lorehoofzhoofs|hoovesbeefzbeefs|beevesthiefzthiefs|thievesmoneymoniesmongoose	mongoosesoxoxencowz	cows|kinegraffitograffitioctopuszoctopuses|octopodesgeniezgenies|geniiganglionzganglions|gangliatrilbytrilbysturfzturfs|turvesnumennuminaatmanatmasocciputzocciputs|occipita
sabretoothsabretooths
sabertoothsabertoothslowlifelowlifesflatfoot	flatfoots
tenderfoottenderfootsromanyromaniesjerryjerriesmarymariestalousetalousesromromacarmencarminaRomaniesJerrysMarysRoma)RomanyJerryMaryRomzprima donnazprima donnas|prime donner1   )quartztopaz)snooze)	ephemerisirisclitoris	chrysalis
epididymisitisz.*ides   F)rH   )anathemabema	carcinomacharismadiplomadogmadramaedemaenemaenigmalemmalymphomamagmamelismamiasmaoedemasarcomaschemasomastigmastomatraumagummapragmaata)alumnaalgavertebrapersonavitae)amoebaantennaformula	hyperbolamedusanebulaparabolaabscissahydranovalacunaauroraumbraflorafauna)stamenforamenlumenina)		bacteriumagendumdesideratumerratumstratumdatumovumextremumcandelabruma)maximumminimummomentumoptimumquantumcranium
curriculumdictumphylumaquarium
compendiumemporiumencomium	gymnasium
honorariuminterregnumlustrum
memorandum
millenniumrostrumspectrumspeculumstadium	trapezium	ultimatummediumvacuumvelum
consortium	arboretum)	alumnusalveolusbacillusbronchuslocusnucleusstimulusmeniscussarcophagusi)focusradiusgeniusincubussuccubusnimbusfungus	nucleolusstylustorus	umbilicusuterushippopotamuscactus)status	apparatus
prospectussinushiatusimpetusplexus)		criterion
perihelionaphelion
phenomenonprolegomenonnoumenonorganon	asyndeton
hyperbaton)oxymoron)solosopranobassoalto	contraltotempopianovirtuoso>   ISONCONGOadootoNATO)
aficionadoaggroalbinoallegroammoAntananarivoarchipelago	armadilloautoavocadoBamakoBarquisimetobimbobingoBiroboleroBolzanobongoBotoburroCairocanto
cappuccinocasinocelloChicagoChimangocilantrocochitococoColomboColoradocommando
concertinocontangocredo	crescendocyanodemodittoDracodynamoembryo	EsperantoespressoeurofalsettoFarofiascoFilipinoflamencofuriosogeneralissimoGestapoghettogigologizmo
Greensborogringo	GuaiaberoguanogumbogyrohairdohippoIdahoimpetigoinfernoinfo
intermezzo
intertrigoIquicojumbojuntoKakapokilo	KinkimavoKokakoKosovoLesotholiberolibidolibrettolidoLilolimbolimolinenolingolinolivedolocologolumbagomachomacromafiosomagneto	magnificoMajuroMalabo	manifestoMaputo	MaracaibomedicomemometroMexicomicroMilanoMonacomono
MontenegroMoroccoMuqdishomyoneutrinoNingbooctavooreganoOrinocoOrlandoOslopanto
ParamariboParduscopedalophotopimentopintoplecoPlutopogopoloponchoz
Porto-NovoPortopropsychopuebloquartoQuitoreporhinorisottorococorondo
SacramentosaddosagosalvoSantiagoSapporoSarajevo
scherzandoscherzosilosiroccosombrerostaccatosternostuccostylosumoTaikotechnoterrazzotestudotimpanotirotobaccoTogoTokyotoreroTorinoTorontotorsotremolotypotyroufoUNESCOvaquero
vermicelloversovibratovioloncelloVirgoweirdoWHOWTOYamoussoukrozyo-yozeroZibo)czecheunuchstomach)codexmurexsilexices)radixhelix)vortexvertexcortexlatexpontifexapexindexsimplex)appendix)afritafreetefreet)goyseraphcherubimzq
    ataman caiman cayman ceriman
    desman dolman farman harman hetman
    human leman ottoman shaman talisman
z
    Alabaman Bahaman Burman German
    Hiroshiman Liman Nakayaman Norman Oklahoman
    Panaman Roman Selman Sonaman Tacoman Yakiman
    Yokohaman Yuman
)	booklouse
grapelouselouse	woodlouselice   )#breechesbritchespajamaspyjamasclippersgallowshijinksheadquarterspliersscissorsrP   herpespincersshearsproceedingstrouserscantuscoitusnexuscontretempscorpsdebrissiemensmumpsdiabetes
jackanapesseriesspecies
subspeciesrabieschassisinningsnewsmewshaggisoismeasles)
wildebeestswineelandbisonbuffalocattleelk
rhinoceroszucchinicariboudacegrousezguinea fowlzguinea-fowlhaddockhakehalibutherringmackerelpickerelpikeroeseedshadsnipetealturbotz
water fowlz
water-fowl)tunasalmonrI  troutbreamzsea-basszsea basscarpcodflounderwhitingmooserm   djinnsamuri	offspringpencequidhertz)
PortugueseAmoyeseBorgheseCongoeseFaroese
FoochoweseGeneveseGenoese
GilberteseHottentotese
KiplingeseKongoeseLuccheseMaltese
NankingeseNiasese	PekingesePiedmontese	Pistoiese
SarawakeseShavese
Vermontese
WenchoweseYengeese)buttercash	furnitureinformationfishdeersheepnesereselesemesepoxcraft) 	acropolisaegisaliasasbestosbathosbias
bronchitisbursitiscaddiscannabiscanvaschaoscosmosdais	digitalis	epidermisethoseyasgasglottishubrisibislensmantismarquis
metropolispathospelvispolisr@  	sassafrastrellisssusesz	[A-Z].*es)BolshoisHanois)BetelgeusesDusesMeuses	Syracuses	Toulouses)abuses	applausesblousescarousescauseschartreusesclausescontusesdousesexcusesfusesgrouseshypotenuses	masseuses
menopausesmisusesmusesoverusespausesperusesprofusesreclusesreusesrusessousesspousessuffuses
transfusesuses)AddiesAggiesAlliesAmiesAngiesAnnies	AnnmariesArchiesArtiesAussiesBarbiesBarriesBasiesBenniesBerniesBertiesBessiesBettiesBilliesBlondiesBobbiesBonniesBowiesBrandiesBriesBrowniesCallies	CarnegiesCarriesCassiesCharliesCheries	ChristiesConniesCuriesDanniesDebbiesDixiesDolliesDonnies	DrambuiesEddiesEffiesElliesElsiesEriesErniesEssiesEugeniesFanniesFlossiesFrankiesFreddies
GillespiesGoldiesGraciesGuthriesHalliesHattiesHettiesHolliesJackiesJamiesJaniesJanniesJeaniesJeanniesJenniesJessiesJimmiesJodiesJohniesJohnniesJosiesJuliesKalgoorliesKathiesKatiesKelliesKewpiesKristiesLaramiesLassiesLauriesLesliesLessiesLilliesLizziesLonniesLoriesLorriesLottiesLouies
MackenziesMaggiesMaisiesMamiesMarciesMargiesMaries	MarjoriesMatties	McKenziesMelaniesMickiesMilliesMinniesMolliesMountiesNanniesNataliesNelliesNettiesOlliesOzziesPearliesPottawatomiesReggiesRichiesRickiesRobbiesRonniesRosalies
RosemariesRosiesRoxiesRushdiesRuthiesSadiesSalliesSammiesScotties	SelassiesSherriesSophiesStacies	Stefanies
StephaniesSteviesSusiesSylviesTammiesTerriesTessiesTommiesTraciesTrekkiesValariesValeries	ValkyriesVickiesVirgiesWilliesWinniesWyliesYorkies)Gaeriesbaggiesbeliesbiggiesbirdiesbogiesbonniesboogiesbookiesbourgeoisiesbrowniesbudgiescaddiescaloriescamaraderiescockamamiescolliescookiescooliescootiescoteriescrappiescuriescutesiesdogieseyriesflooziesfootsiesfreebiesgeniesgoaliesgroupieshies	jalousiesjunkieskiddiesladdieslassieslies	lingeriesmagpies
menageriesmommiesmoviesnecktiesnewbiesnightiesoldies	organdiesoverliespiespinkiespixiespotpiesprairiesquickiesreveriesrookiesrotisseriessoftiessortiesr/  stymiessweetiesties	underliesuntiesveggiesviesyuppieszombies)ChloesCrusoesDefoesFaeroesIvanhoesJoesMcEnroesMoesMonroesNoesPoesRoscoesTahoesTippecanoesZoes)aloesbackhoescanoesdoesfloesfoeshoes
mistletoesoboespekoesroessloesthroestiptoestoeswoes)quartzestopazes)buzzesfizzesfrizzesrazzes)AndromachesApachesBlanches	Comanches
NietzschesPorschesRoches)aches
avalanches	backaches
bellyachescachesclochescrechesdouchesearachesfiches	headaches
heartachesmicrofichesniches	pastichespsychesquichesstomachaches
toothachestranches)annexesaxesdeluxespickaxes)HessesJesses	LaroussesMatisses)bouillabaisses	crevasses
demitassesimpassesmoussesposses)Clives
Palmolives)	interweavesweavesolivesbivalves	dissolvesresolvessalvestwelvesvalves)z(.*[csx])isz(.*)cepsz[A-Z].*sgeneralz1(?!major|lieutenant|brigadier|adjutant|.*star)\S+martialcourtforcepoundc              #  F   K   | ]  \  }}t        |d | dz           yw)z(?=(?:-|\s+)r.   N)r/   )r4   keyvals      r   r7   r7     s,      $.6c3GCM#a(()$s   !pl_sb_postfix_adj(z)(.*))A
amanuensesamniocentesesanalyses
antitheses
apotheosesarteriosclerosesatherosclerosesr  	catalyses	catharseschasses	cirrhosescoccescrises	diagnosesdialysesdiereseselectrolysesemphasesexegesesgeneses	halitoses
hydrolyseshypnoses
hypotheses
hysteresesmetamorphoses
metastasesmisdiagnosesmitosesmononucleosesnarcosesnecrosesnemesesneurosesoasesosmosesosteoporoses	paralysesparenthesesparthenogenesesperiphrasesphotosyntheses	probosces	prognosesprophylaxes
prosthesespreces	psoriasespsychoanalysespsychokineses	psychoses	scleroses	scoliosessepses	silicoses	symbiosessynopses	synthesestaxestelekinesestheses
thrombosestuberculoses
urinalysesz
    about above across after among around at athwart before behind
    below beneath beside besides between betwixt beyond but by
    during except for from in into near of off on onto out over
    since till to under until unto upon with)dedudaz(.*?)((?:-|\s+)(?:z)(?:-|\s+))a(?:-|\s+)(.*)>   neuterfeminine	masculinegender-neutralfeminine or masculinemasculine or femininewemyself	ourselvesyouyourself
yourselvesshetheyherself
themselveshehimselfititselfthemselfmineoursyoursherstheirshisitsnomz0Dict[str, Dict[str, Union[str, Dict[str, str]]]]si_pronIthem)mer[  r]  r^  herrb  himre  rf  rg  rs  rh  acc))rp  ra  rT  rf  )rp  ra  rU  r`  )rp  ra  rV  rd  )rp  ra  rW  ra  )rp  ra  rX  z	she or he)rp  ra  rY  z	he or she)rp  rc  rT  rg  )rp  rc  rU  rb  )rp  rc  rV  re  )rp  rc  rW  rh  )rp  rc  rX  herself or himself)rp  rc  rY  himself or herself)rp  rm  rT  ro  )rp  rm  rU  rl  )rp  rm  rV  rn  )rp  rm  rW  rm  )rp  rm  rX  zhers or his)rp  rm  rY  zhis or hers)rw  rs  rT  rf  )rw  rs  rU  ru  )rw  rs  rV  rv  )rw  rs  rW  rs  )rw  rs  rX  z
her or him)rw  rs  rY  z
him or her)rw  rc  rT  rg  )rw  rc  rU  rb  )rw  rc  rV  re  )rw  rc  rW  rh  )rw  rc  rX  rx  )rw  rc  rY  ry  c                    	 t         |    |   }	 ||   S # t        $ r  w xY w# t        $ r t        t        |      cY S w xY wr3   )rq  KeyError	TypeErrorr   str)thecasewordgendersings       r   get_si_pronr    sU    w%F|    Cs    " >>arewerehavedo)	amr  iswasr  r  hasr  r  actactsblameblamescanmustflyfliescopycopiesdrinkdrinksfightfightsfirefireslikelookmakereachrunsinksleepview)likesr  looksr  makesr  reachesr  runsr  sinksr  sleepsr  viewsz^(z)((\s.*)?)$)didhadatemadeputspentfoughtsankgavesoughtshallcouldoughtshouldz0^((?:thought|saw|bent|will|might|cut))((\s.*)?)$)r  r  r  r  r  r  )r  r  )shoes)0nor  nil)1r   anoneeacheverythisthatsomethesethose)r   r  r  r  z)$ouryourtheir)myr  ro  ru  rn  r  z~
^(?! FJO | [HLMNS]Y.  | RY[EO] | SQU
  | ( F[LR]? | [HL] | MN? | N | RH? | S[CHKLMNPTVW]? | X(YL)?) [AEIOU])
[FHLMNRSX][A-Z]
z)^(y(b[lor]|cl[ea]|fere|gg|p[ios]|rou|tt))z^((?:unabomber|unanimous|US))z0^((?:euler|hour(?!i)|heir|honest|hono[ur]|mpeg))z^([aefhilmnorsx]-?th)z^([bcdgjkpqtuvwyz]-?th)thstndrd)r   r   r         r           	            tiethfirstsecondthirdfiftheighthninthtwelfth)tyr  twothreefiveeightninetwelvez)\Z)
 r  r  r  fourr  sixsevenr  r  )
tenelevenr  thirteenfourteenfifteensixteen	seventeeneighteennineteen)
r  r  twentythirtyfortyfiftysixtyseventyeightyninety) z	 thousandz millionz billionz	 trillionz quadrillionz quintillionz sextillionz septillionz
 octillionz
 nonillionz
 decillion)allr  herdnamespersonsancient)TrueFalseNonez\$(\d+)z((\w+)\([^)]*\)*)z\A(\s*)(.+?)(\s*)\Zz^(?:z (?P<denominator>.+)( (per|a) .+)z\sz^(.*[^s])s$z	^(.*)'s?$z\A(\s*)(?:an?\s+)?(.+?)(\s*)\Zz^[aefhilmnorsx]$z^[bcdgjkpqtuvwyz]$z^[aefhilmnorsx][.-]z
^[a-z][.-]z
^[^aeiouy]z^e[uw]z^onc?e\bz
^onetime\bz^uni([^nmd]|mo)z^u[bcfghjkqrst][aeiou]z^ukrz^U[NK][AIEO]?z^[aeiou]z(\d)z(\d)(\d)z(\d)(\d)(\d)z(\d)(\d)(\d)(?=\D*\Z)z(\d)(\d)(?=\D*\Z)z(\d)(?=\D*\Z)z(\d)(\d{3}(?:,|\Z))z\Dz\s+,z, (\S+)\s+\Zz\s+zie$yzue$uz	([auy])e$z\g<1>zski$skiz[^b]i$r  z^(are|were)$bez^(had)$havz^(hoe)$z([^e])e$zer$erz ([^aeiou][aeiouy]([bdgmnprst]))$z
\g<1>\g<2>z\dc                  >    e Zd ZU ded<   ded<   ded<   ded<   d	dZy)
Wordsr}  loweredz	List[str]split_r  lastc                    | j                         | _        | j                         | _        | j                  d   | _        | j                  d   | _        y )Nr   r.  )lowerr  splitr  r  r  )selforigs     r   __init__zWords.__init__  s:    zz|jjl[[^
KKO	r   Nreturnr  )r   r   r   __annotations__r  r   r   r   r  r    s    LJ
I$r   r   String with at least 1 characterc                      e Zd ZddZy)	_WordMetac                B    t        |t              xr t        |      dk\  S Nr   )
isinstancer}  r@   )r  instances     r   __instancecheck__z_WordMeta.__instancecheck__  s    h,CX!1CCr   N)r  r   r  bool)r   r   r   r   r   r   r   r  r    s    	Dr   r  c                      e Zd ZdZy)Wordr  N)r   r   r   __doc__r   r   r   r#  r#    s    .r   r#  )	metaclassc                     e Zd ZdEdZed        Zej                  d        ZedFd       Ze	 	 	 	 	 	 	 	 	 	 	 	 	 	 dGd       Z	edFd       Z
edHd       ZedHd       ZdId	ZdId
ZedJd       ZdEdZ	 dK	 	 	 	 	 dLdZdMdZd Z	 	 	 	 	 	 dNdZedOd       ZdPdZdQdZedRdSd       Ze	 dR	 	 	 	 	 dSd       Ze	 dR	 	 	 	 	 dSd       Ze	 dR	 	 	 	 	 dSd       ZedTd       ZedTd       ZedTd       ZedTd       Ze	 	 dK	 	 	 	 	 	 	 dUd       Z dVdZ!dWdZ"dXd Z#dXd!Z$dRdYd"Z%	 dR	 	 	 	 	 dZd#Z&e'd$        Z(d[d%Z)e*d&        Z+	 dR	 	 	 	 	 d\d'Z,	 dR	 	 	 	 	 dZd(Z-	 dR	 	 	 	 	 d\d)Z.	 	 dK	 	 	 	 	 	 	 d]d*Z/ed^d_d+       Z0e0Z1e2d,fe3d-fe4d-fe5d-fe6d,fe7d-fe8d-fe9d,fe:d,fe;d,fe<d,fe=d,fe>d,fe?d,fe@d,feAd,feBd,feCd-feDd-ffZEd`d.ZFedRdad/       ZGedbd0       ZHedcd1       ZIddded2ZJdddfd3ZKdddgd4ZLdhd5ZMdid6ZNdid7ZOdid8ZPdid9ZQdid:ZRdid;ZSdid<ZTdjd=ZUe*d>        ZVe'd?        ZWe*d@        ZXe*dA        ZYe	 	 	 	 	 	 	 	 dk	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dldB       ZZe*dC        Z[e	 	 	 	 	 dm	 	 	 	 	 	 	 	 	 	 	 	 	 dndD       Z\y)oenginec                    t         j                         | _        d | _        d| _        g | _        g | _        g | _        g | _        g | _	        d| _
        d | _        y )Nr   rT  )def_classicalr  classical_dictpersistent_count
mill_countpl_sb_user_definedpl_v_user_definedpl_adj_user_definedsi_sb_user_definedA_a_user_defined	thegender_engine__number_argsr  s    r   r  zengine.__init__  sY    +002/38:799; 8:68!7;r   c                P    t        t        t        t        f   | j                        S r3   )r   r   r}  r3  r4  s    r   _number_argszengine._number_args
  s    DcND$6$677r   c                    || _         y r3   )r3  )r  r  s     r   r6  zengine._number_args  s
     r   c                    | j                  |       | j                  |       | j                  j                  ||f       | j                  j                  ||f       y)z=
        Set the noun plural of singular to plural.

        r   )checkpatcheckpatpluralr-  extendr0  r  singularplurals      r   defnounzengine.defnoun  sS     	hF#&&&'9:&&'9:r   c                   | j                  |       | j                  |       | j                  |       | j                  |       | j                  |       | j                  |       | j                  j                  ||||||f       y)z
        Set the verb plurals for s1, s2 and s3 to p1, p2 and p3 respectively.

        Where 1, 2 and 3 represent the 1st, 2nd and 3rd person forms of the verb.

        r   )r9  r:  r.  r;  )r  s1p1s2p2s3p3s          r   defverbzengine.defverb  sv      	bbbBBB%%r2r2r2&>?r   c                    | j                  |       | j                  |       | j                  j                  ||f       y)zB
        Set the adjective plural of singular to plural.

        r   )r9  r:  r/  r;  r<  s      r   defadjzengine.defadj7  s:     	hF#  ''6(:;r   c                `    | j                  |       | j                  j                  |df       y)zS
        Define the indefinite article as 'a' for words matching pattern.

        r   r   r9  r1  r;  r  patterns     r   defazengine.defaB  s+     	g$$gs^4r   c                `    | j                  |       | j                  j                  |df       y)zT
        Define the indefinite article as 'an' for words matching pattern.

        r  r   rK  rL  s     r   defanzengine.defanL  s+     	g$$gt_5r   c                    |y	 t        j                  |d       y# t         j                  $ r}t        |      |d}~ww xY w)z5
        check for errors in a regex pattern
        Nr  )rematcherrorr'   )r  rM  errs      r   r9  zengine.checkpatV  s@     ?	?HHWb!xx 	?,W53>	?s    A ;A c                     y)z=
        check for errors in a regex replace pattern
        Nr   rL  s     r   r:  zengine.checkpatplurala  s     	r   c           
     *   t        t        |      dz
  dd      D ]w  }t        j                  d||    d|t        j                        }|s2||dz       y t
        j                  dt        t        ||dz                  }|j                  |      c S  y )Nr   r   ^$r   z\\1)
ranger@   rR  search
IGNORECASEDOLLAR_DIGITSsubr   r#  expand)r  r  wordlistr  mopls         r   ud_matchzengine.ud_matchg  s    s8}q("b1 	%Aa}A.bmmDBAE?*"&&DxA7 yy}$	% r   c                   |st         j                         | _        yd|v r8|d   rt         j                         | _        nt        j                         | _        |j	                         D ]"  \  }}|t
        v r|| j                  |<   t         y)a  
        turn classical mode on and off for various categories

        turn on all classical modes:
        classical()
        classical(all=True)

        turn on or off specific claassical modes:
        e.g.
        classical(herd=True)
        classical(names=False)

        By default all classical modes are off except names.

        unknown value in args or key in kwargs raises
        exception: UnknownClasicalModeError

        Nr  )all_classicalr  r*  no_classicalitemsr)  r   )r  kwargskvs       r   	classicalzengine.classicalt  s    & "/"4"4"6DF?e}&3&8&8&:#&2&7&7&9#LLN 	0DAqM!)*##A&//		0r   Nc                    |!	 t        |      | _        ||rt	        |      S yd| _        y# t        $ r}t        |d}~ww xY w)z
        Set the number to be used in other method calls.

        Returns count.

        Set show to False to return '' instead.

        Nr  )intr+  
ValueErrorr!   r}  )r  countshowrU  s       r   numz
engine.num  sZ     0(+E
% 5z!  %)D!  0&C/0s   , 	A<Ac                .    |t         v r|| _        yt        )a  
        set the gender for the singular of plural pronouns

        can be one of:
        'neuter'                ('they' -> 'it')
        'feminine'              ('they' -> 'she')
        'masculine'             ('they' -> 'he')
        'gender-neutral'        ('they' -> 'they')
        'feminine or masculine' ('they' -> 'she or he')
        'masculine or feminine' ('they' -> 'he or she')
        N)singular_pronoun_gendersr2  r+   )r  r  s     r   r  zengine.gender  s     --#DN  r   c                J   t        |t        j                        r|j                  S t        |t        j                        r|j
                  S t        |t        j                        r)|j                  D cg c]  }| j                  |       c}S t        |t        j                        r2t        |j                  D cg c]  }| j                  |       c}      S t        |t        j                        r|j                  S t        d|j                   d      c c}w c c}w )z5
        Return the value of the ast object.
        zname 'z' is not defined)r  astNumnStrr,   r
   elts_get_value_from_astr   tupleNameConstantvalue	NameErrorid)r  objr   s      r   rz  zengine._get_value_from_ast  s     c377#55LSWW%55LSXX&9<BAD,,Q/BBSYY'sxxH!$2215HII S--.99
 &(89:: CHs   5D=D c                   |j                         \  }}||vr|S t        j                  |      }|j                  d   j                  j
                  D cg c]  }| j                  |       }}|j                  d   j                  j                  D ci c](  }|j                  | j                  |j                        * }	} ||   |i |	S c c}w c c}w )zD
        Return the string to be substituted for the match.
        r   )	groupsru  parsebodyr}  argsrz  keywordsarg)
r  ra  methods_dictmatched_textf_namea_treer   	args_listkwkwargs_lists
             r   _string_to_substitutezengine._string_to_substitute  s      "yy{f
 % <(
 [[^))..
 $$Q'
	 
 kk!n**33
 FFD,,RXX66
 
 $|F#Y>+>>

s   C-Cc                r     j                   } j                   j                   j                   j                   j
                   j                   j                   j                   j                   j                   j                   j                  dt        j                   fd|      }| _         |S )a)  
        Perform inflections in a string.

        e.g. inflect('The plural of cat is plural(cat)') returns
        'The plural of cat is cats'

        can use plural, plural_noun, plural_verb, plural_adj,
        singular_noun, a, an, no, ordinal, number_to_words,
        and prespart

        )r>  
plural_adjplural_nounplural_verbsingular_nounr   r  r  ordinalnumber_to_wordspresent_participlerq  c                (    j                  |       S r3   )r  )ra  r  r  s    r   <lambda>z engine.inflect.<locals>.<lambda>	  s    t11"lC r   )r+  r>  r  r  r  r  r   r  r  r  r  rq  FUNCTION_CALLr^  )r  textsave_persistent_countoutputr  s   `   @r   inflectzengine.inflect  s     !% 5 5 kk//++++!//&&''||#33"&"9"988-
  ""CT
 !6r   c                   t        |      }d|v r|j                  d      }t        |d   j                  d            t        |d   j                  d            k(  r1|j                  d      | j                  d      j                  d      }n_|j                  d      }t	        |      D ].  \  }}d|v s|j                  d      | j                  d      ||<   0 n|j                  d      }t	        |j                  d            D ]^  \  }}|dk(  r|j                         |k(  r||   j                         ||<   ||j                         k(  sI||   j                         ||<   ` dj                  |      S )Nr1   r   r  r   r  rr  )r}  r  r@   r*  	enumerate
capitalizeupperr8   )r  r  	inflectedword_optionsresultr  r  s          r   postprocesszengine.postprocess	  se   	N	)$??3/L<?((-.#l1o6K6KC6P2QQ"-d.A.A%.HIOOPST #-#,V#4 TKE4d{(,

38K8KE8R(SuT __S)F %TZZ_5 
	6KE4s{
  D( &u 8 8 :utzz|# &u 3 3 5u
	6 xxr   c                    t         j                  |      }|r2|j                  d      |j                  d      |j                  d      fS y)Nr   r   r  )r  r  r  )PARTITION_WORDr[  group)r  r  ra  s      r   partition_wordzengine.partition_word9	  s=    ""4(88A;RXXa[88r   c                    | j                  |      \  }}}|s|S | j                  || j                  ||      xs& | j                  ||      xs | j	                  ||            }| | | S )z
        Return the plural of text.

        If count supplied, then return text if count is one of:
            1, a, an, one, each, every, this, that

        otherwise return the plural.

        Whitespace at the start and end is preserved.

        )r  r  _pl_special_adjective_pl_special_verb_plnounr  r  ro  prer  postr>  s          r   r>  zengine.plural@	  s     --d3T4K!!&&tU3 )$$T51)||D%(	
 vhtf%%r   c                    | j                  |      \  }}}|s|S | j                  || j                  ||            }| | | S )a  
        Return the plural of text, where text is a noun.

        If count supplied, then return text if count is one of:
            1, a, an, one, each, every, this, that

        otherwise return the plural.

        Whitespace at the start and end is preserved.

        )r  r  r  r  s          r   r  zengine.plural_nounX	  sR     --d3T4K!!$T5(ABvhtf%%r   c                    | j                  |      \  }}}|s|S | j                  || j                  ||      xs | j                  ||            }| | | S )a  
        Return the plural of text, where text is a verb.

        If count supplied, then return text if count is one of:
            1, a, an, one, each, every, this, that

        otherwise return the plural.

        Whitespace at the start and end is preserved.

        )r  r  r  _pl_general_verbr  s          r   r  zengine.plural_verbm	  sl     --d3T4K!!!!$.T$2G2Ge2T
 vhtf%%r   c                    | j                  |      \  }}}|s|S | j                  || j                  ||      xs |      }| | | S )a  
        Return the plural of text, where text is an adjective.

        If count supplied, then return text if count is one of:
            1, a, an, one, each, every, this, that

        otherwise return the plural.

        Whitespace at the start and end is preserved.

        )r  r  r  r  s          r   r  zengine.plural_adj	  sZ     --d3T4K!!$(B(B4(O(WSWXvhtf%%r   c                      j                    j                   j                  f} fd|D        }t        t	        d|      d      S )a  
        compare word1 and word2 for equality regardless of plurality

        return values:
        eq - the strings are equal
        p:s - word1 is the plural of word2
        s:p - word2 is the plural of word1
        p:p - word1 and word2 are two different plural forms of the one word
        False - otherwise

        >>> compare = engine().compare
        >>> compare("egg", "eggs")
        's:p'
        >>> compare('egg', 'egg')
        'eq'

        Words should not be empty.

        >>> compare('egg', '')
        Traceback (most recent call last):
        ...
        typeguard.TypeCheckError:...is not an instance of inflect.Word
        c              3  D   K   | ]  }j                  |        y wr3   )_plequal)r4   normr  word1word2s     r   r7   z!engine.compare.<locals>.<genexpr>	  s     G4==t4Gs    NF)r  r  r  nextfilter)r  r  r  normsresultss   ```  r   comparezengine.compare	  s?    2   $"2"2DOOCGGF4)511r   c                <    | j                  ||| j                        S )az  
        compare word1 and word2 for equality regardless of plurality
        word1 and word2 are to be treated as nouns

        return values:
        eq - the strings are equal
        p:s - word1 is the plural of word2
        s:p - word2 is the plural of word1
        p:p - word1 and word2 are two different plural forms of the one word
        False - otherwise

        )r  r  r  r  r  s      r   compare_nounszengine.compare_nouns	       }}UE4+;+;<<r   c                <    | j                  ||| j                        S )az  
        compare word1 and word2 for equality regardless of plurality
        word1 and word2 are to be treated as verbs

        return values:
        eq - the strings are equal
        p:s - word1 is the plural of word2
        s:p - word2 is the plural of word1
        p:p - word1 and word2 are two different plural forms of the one word
        False - otherwise

        )r  r  r  s      r   compare_verbszengine.compare_verbs	  r  r   c                <    | j                  ||| j                        S )a  
        compare word1 and word2 for equality regardless of plurality
        word1 and word2 are to be treated as adjectives

        return values:
        eq - the strings are equal
        p:s - word1 is the plural of word2
        s:p - word2 is the plural of word1
        p:p - word1 and word2 are two different plural forms of the one word
        False - otherwise

        )r  r  r  s      r   compare_adjszengine.compare_adjs	  s     }}UE4??;;r   c                    | j                  |      \  }}}|s|S | j                  |||      }|dur| j                  ||      }| | | S y)a  
        Return the singular of text, where text is a plural noun.

        If count supplied, then return the singular if count is one of:
            1, a, an, one, each, every, this, that or if count is None

        otherwise return text unchanged.

        Whitespace at the start and end is preserved.

        >>> p = engine()
        >>> p.singular_noun('horses')
        'horse'
        >>> p.singular_noun('knights')
        'knight'

        Returns False when a singular noun is passed.

        >>> p.singular_noun('horse')
        False
        >>> p.singular_noun('knight')
        False
        >>> p.singular_noun('soldier')
        False

        ro  r  F)r  _sinounr  )	r  r  ro  r  r  r  r  r  r>  s	            r   r  zengine.singular_noun	  sg    B --d3T4K||Df|=u%%dD1FU6(4&))r   c                   | j                   j                         }t        j                         | _         ||k(  ry| ||      k(  ry ||      |k(  ryt        j                         | _         | ||      k(  ry ||      |k(  ry|j                         | _         || j                  k(  s|| j
                  k(  r&| j                  ||      ry| j                  ||      ry|| j                  k(  s|| j                  k(  r| j                  ||      ryy)Neqzp:szs:pzp:pF)	r*  r  re  rf  r>  r  _pl_check_plurals_Nr  _pl_check_plurals_adj)r  r  r  rb  classvals        r   r  zengine._plequal
  s    &&++-+002E>BuIe9*//1BuIe9&mmod&6&6 6''u5''u5doo 5))%7r   c                d    d| d| d| d| d| d}t        t        j                  ||            S )Nr  z)(z\|\1r1   r.   )r!  rR  r[  )r  pairstemsend1end2rM  s         r   _pl_reg_pluralszengine._pl_reg_plurals+
  s>    ugRvT$qd4&BBIIgt,--r   c                    t         ddft        ddft        ddft        ddft        d	d
ft
        ddft        dd
ft        ddft        ddft        ddft        ddft        ddfddddf}t        t        ||f      }dj                  d |D              t        j!                         v xsE t"        j!                         v xs- t$        j!                         v xs t'         fd|D              S )Nasr   r  r   r,   r   ensr   umsr   r  r  onsosexesr  ixesr  )z.*eaur,   x)z.*ieur,   r  )z.*trixesces)z.{2,}[yia]nr  gesr1   c              3  4   K   | ]  }|j                     y wr3   )r  )r4   r  s     r   r7   z-engine._pl_check_plurals_N.<locals>.<genexpr>D
  s     4d		4s   c              3  N   K   | ]  \  }}}j                  |||        y wr3   )r  )r4   r  r  r  r  r  s       r   r7   z-engine._pl_check_plurals_N.<locals>.<genexpr>J
  s0      %E4 $$T5$=s   "%)pl_sb_C_a_atapl_sb_C_is_idespl_sb_C_a_aepl_sb_C_en_inapl_sb_C_um_apl_sb_C_us_ipl_sb_C_on_apl_sb_C_o_i_stemspl_sb_C_ex_icespl_sb_C_ix_ices	pl_sb_C_i
pl_sb_C_immapr  r8   pl_sb_irregular_svaluespl_sb_irregularpl_sb_irregular_capsany)r  r  r  stem_endingsr9   r  s   `    @r   r  zengine._pl_check_plurals_N/
  s   D%(dF+3$UE*5#&63'5#&c*ff-ff-S!d##)!
& EE5>*xx4e44 %,,.. --//+2244  )5 		
r   c                   |j                  d      r|d |j                  d       nd}|j                  d      r|d |j                  d       nd}t        |      xr3 t        |      xr& | j                  ||      xs | j                  ||      S )N)z's'r  r  )endswithrfindr!  r  )r  r  r  word1aword2as        r   r  zengine._pl_check_plurals_adjP
  s    .3nn[.I)S)*r.3nn[.I)S)*r L V ((8 <++FF;	
r   c                    || j                   | j                   }|Gt        |      t        v s.| j                  d   r#t        |      j	                         t
        v rd}|S d}|S d}|S )Nr  r   r   r  )r+  r}  pl_count_oner*  r  pl_count_zero)r  ro  s     r   	get_countzengine.get_count]
  s    =T22>))E Z</++F3J,,.-?   	    Er   c                4   | j                  |      }|dk(  r|S | j                  || j                        }||S |dk(  r|S t        |      }|j                  j                         t        v r1t        |j                        dk\  r| j                  |d      xs |S |S |t        v r|S t        j                         D ]  \  }}|j                  | d  |v s|c S  | j                  d   r"|j                  j                         t        v r|S t         j#                  |      }|rH|j%                  d      dk7  r4| j'                  |j%                  d      d       |j%                  d       S d|j                  v sd|j                  v rt(        j#                  |      }|r||j%                  d      dk7  rh|j%                  d      dk7  rT| j'                  |j%                  d      d       |j%                  d       | j'                  |j%                  d             S t        |j                        dk\  r| j                  |d      }||S t*        j#                  |j                        }|r5t        |j%                  d	            }| j'                  |d |        ||d   S t        |j                        dk\  rM|j                  d
   dk(  r;dj-                  | j'                  |j.                        g|j                  dd  z         S t1        j2                  t4              5  | j7                  |j                  t9        j:                  | j&                  d      d      cd d d        S # 1 sw Y   nxY wt<        j                         D ]  \  }}|j                  | d  |v st>        j                         D ]}  \  }	}
|j                  d |	 |
v s|j                  jA                         |j                  d |	 |j                  | d  gk(  sS|j                  d |  tB        |j                  | d     z   c c S   	 tD        |j                     S # tF        $ r Y nw xY w	 tB        |j                     S # tF        $ r Y nw xY w|j                  tH        v r0t        |j                        }|d |   tH        |j                      S |j                  j                         }|tJ        v rt        |      }|d |   tJ        |    S |j                  jA                  d      }dj-                  |d
d        j                         tL        v rNt        dj-                  |d
d              }|d |   tL        dj-                  |d
d        j                             S |j                  dd  dk(  r|d d  dS |j                  dd  dk(  r| j                  d   r| dS |d d  dS |j                  dd  dk(  rhtN        j                         D ]  \  }}|j                  | d  |v s| dc S  tP        j                         D ]  \  }}|| d  |v s| dc S  |d d  dS |j                  dd  dk(  r|d d  dS |j                  dd  dk(  r;tR        jU                  t        |            }|r|j                  |v r|d d  dS | dS |j                  dd  dk(  r|d d  d S |j                  dd  d!k(  r|d d  d"S |j                  dd  d#k(  r|d d  d$S |j                  dd  d%k(  r|d d  d&S |j                  d'k(  ry(|j                  dd  d)k(  r|S |j                  dd  d*k(  r|d d
  d+S |j                  dd  d,v r|d d
  d-S d.tV        d dfd/tX        d
d0fd/tZ        d
d0fd1t\        d
d+fdt^        d
d2fd3t`        d
d+fd+tb        d d4ffD ]P  \  }}}}|j                  d   |k(  s|j                         D ]#  \  }}|j                  | d  |v s|d | |z   c c S  R | j                  d5   r`|j                  dd  d6k(  r|d d  d7S |j                  dd  d8v r| d/S |j                  dd  d9v rt        |      d:kD  r|d d  d;S d3td        d
d<fd/tf        d
d0fd/th        d
d0fd1tj        d
d+fdtl        d
d2fdtn        d dfd+tp        d d4fd+tr        d d=fdtt        dd>fd?tv        dd2fd3tx        d
d+ffD ]P  \  }}}}|j                  d   |k(  s|j                         D ]#  \  }}|j                  | d  |v s|d | |z   c c S  R tz        d d2ft|        d d@ffD ]<  \  }}}|j                         D ]#  \  }}|j                  | d  |v s|d | |z   c c S  > |t~        v r| d-S t        j                         D ]  \  }}|j                  | d  |v s| d-c S  |j                  d
d  d-k(  r|dA   |dA   j                         k(  r| d-S |j                  d   dBk(  rLt        j                         D ]  \  }}|j                  | d  |v s| d-c S  |j                  d
d dBk7  r| dCS |j                  d
d  dDk(  r5t        j                         D ]  \  }}|j                  | d  |v s| dc S  |j                  d
d  dEv s|j                  d   d/k(  r| d-S |j                  dd  dFv r|d d  dGS |j                  dd  dHk(  r|j                  dd dIk7  r|d d  dGS |j                  dd  dJv r|d d
  dGS |j                  dd  dKk(  r|d d  dGS |j                  d   dLk(  rk|j                  d
d dMv st        |      dk(  r| dS | j                  dN   r0|j                  d   dLk(  r|dA   |dA   j                         k(  r| dS |d d  dS |t        v r| dS t        j                         D ]  \  }}|j                  | d  |v s| dc S  |j                  d
d  dOv r| dS |j                  d   d?k(  r| d-S | dS )PNr   r  r  r   ro  r  z a z-a-denominatorr   degreer  -quyr.  iespersonr   r,   oplemanmenmousemicer  r  goosegeesetoothteethfootfeettacotacosdiedicecepszoonr   )cissisxisr  hr  r  mr  rw  r   r  trixr  )eauieu)ynxinxanxr  r  r   tadesor  r   zzesze)chshzzr  )elfalfolfveseafd)nifelifewifearfr  aeiour  )aoeoiooouo)Fr  rc  r-  r  r  r  pl_sb_uninflected_completer@   r  _handle_long_compoundspl_sb_uninflected_capspl_sb_uninflected_bysizerg  r  r*  pl_sb_uninflected_herdPL_SB_POSTFIX_ADJ_STEMS_REr[  r  r  PL_SB_PREP_DUAL_COMPOUND_REDENOMINATORr8   r  
contextlibsuppressrn  _handle_prepositional_phrase	functoolspartialpl_pron_acc_keys_bysizepl_prep_bysizer  pl_pron_accpl_pron_nomr{  r  r  pl_sb_irregular_compoundpl_sb_U_man_mans_bysizepl_sb_U_man_mans_caps_bysizepl_sb_U_louse_lice_bysizegetpl_sb_U_ch_chs_bysizepl_sb_U_ex_ices_bysizepl_sb_U_ix_ices_bysizepl_sb_U_um_a_bysizepl_sb_U_us_i_bysizepl_sb_U_on_a_bysizepl_sb_U_a_ae_bysizepl_sb_C_en_ina_bysizepl_sb_C_ex_ices_bysizepl_sb_C_ix_ices_bysizepl_sb_C_um_a_bysizepl_sb_C_us_i_bysizepl_sb_C_us_us_bysizepl_sb_C_a_ae_bysizepl_sb_C_a_ata_bysizepl_sb_C_is_ides_bysizepl_sb_C_o_i_bysizepl_sb_C_on_a_bysizepl_sb_C_i_bysizepl_sb_C_im_bysizepl_sb_singular_s_completepl_sb_singular_s_bysizer  pl_sb_z_zes_bysizepl_sb_ze_zes_bysizepl_sb_U_o_os_completepl_sb_U_o_os_bysize)r  r  ro  r}  ri  rj  ra  handled_wordsr  pkpvllenlowered_last
dash_splitlastletr8  numendr  s                     r   r  zengine._plnounr
  s    u% A:K dD$;$;<L 2:KT{99?? ::4;;1$224q2AITIK))K,224 	DAq||QBC A%	 v&499??+<@V+VK (..t4"((1+#ll288A;23BHHQK=AADLL ET\\$9,33D9BbhhqkR'BHHQK2,=||BHHQK34xx{m||BHHQK013 t{{q  77A7FM($$ -/0Ell4<01$uv,@@ t{{q T[[_%@88T\\$**56QRHII  , 	44!!$,,a8	 	 	 ,113 		VDAq||QBC A%,224 VFB||CR(B.<<--/ LL"- LL!-4 
 $(<<!#4{4<<QRPRPSCT7U#UUV		V	t||,, 			t||,, 		
 99,,tyy>D6TEl^$8$C#DEEyy(?*|$D6TEl^OL$A#BCC\\'',
HHZ_%,,.2JJBC)D $<.+SXXjo-F,M,M,OPQS
 <<%3Bi[$$<<(""9-qz!s)D)) <<%/557 &1<<$)"V1:%& 5::< &19>"V1:%& 3Bi[$$<<'3Bi[%%<<')--c$i8AT\\Q&s)D))V1:<<'3Bi[&&<<'3Bi[&&<<&3Bi[%%<<&3Bi[&&<<5  <<&K<<&3Bi[?"<< 553Bi[## 's3("f5("f5%r3/%r3/%r3/%tS1)
 	4$GQ ||B7*GGI 4DAq||QBC(A-#GV}t334	4  y)||BC F*s)C((||BC N2qz!||BC $99c$i!ms)C(( +R7,b&9,b&9)2s3)2s3*D"5)45*D$7,b%8("c2)2s3- 8(FD <<#w. !	 81<<,1#'=4#7788& "4-"D$/$ 464 GGI 4DAq||QBC(A-#GV}t334	4 44V2;+113 	#DAq||QBC A%r{"	# <<$aDGMMO)CV2;<<s"*002 '1<<$)"V2;&' ||Br"c)s|#<<$+113 &1<<$)"V1:%& << 88DLL<LPS<SV2; << 553Bi[$$<<%$,,r"*=*D3Bi[$$<< 883Bi[$$<<%3Bi[$$ <<s"||Br"g-Taqz!""7+<<#s*tAw$q'--//I"V1:%3Bi[$$ 00V1:'--/ 	"DAq||QBC A%qz!	" << >>V1:<<s"V2; qzs0   <M  M)0Q 	QQQ& &	Q21Q2c                B   |j                  |      }t        |      dk  rt        d      | j                  |t              } |||dz
           xs ||dz
     }dj                  |d|dz
   |j                  |||   dg      gz         dj                  ||dz   d       z   S )a  
        Given a word or phrase possibly separated by sep, parse out
        the prepositional phrase and apply the transform to the word
        preceding the prepositional phrase.

        Raise ValueError if the pivot is not found or if at least two
        separators are not found.

        >>> engine._handle_prepositional_phrase("man-of-war", str.upper, '-')
        'MAN-of-war'
        >>> engine._handle_prepositional_phrase("man of war", str.upper, ' ')
        'MAN of war'
        r  z2Cannot handle words with fewer than two separatorsr   r  Nr  )r  r@   rn  _find_pivotpl_prep_list_dar8   )clsphrase	transformseppartspivottransformeds          r   rM  z#engine._handle_prepositional_phrase  s     S!u:>QRR7eai 01EU5195Exx+EAI#((Kur+J"K!LL
HHUEAI=)*+ 	+r   c                    dk(  r| j                   n| j                  fdt        |j                  d      D        }t	        |d      S )aS  
        Handles the plural and singular for compound `Words` that
        have three or more words, based on the given count.

        >>> engine()._handle_long_compounds(Words("pair of scissors"), 2)
        'pairs of scissors'
        >>> engine()._handle_long_compounds(Words("men beyond hills"), 1)
        'man beyond hills'
        r   c           
   3     K   | ]B  \  }\  }}}|t         v r1d j                  t        j                  | |      |g|             D ywr  N)r}  r8   	itertoolschain)r4   leadercandpreptrailerro  
inflections        r   r7   z0engine._handle_long_compounds.<locals>.<genexpr>  sW      

 .tg& HHe,d3

s   AAr   N)r  r  r   r  r  )r  r  ro  	solutionsr  s     ` @r   rD  zengine._handle_long_compounds  sG     &+aZT\\T\\


 2C4;;PQ1R

	 It$$r   c                      fdt        dt               dz
        D        }	 t        |      S # t        $ r t	        d      d w xY w)Nc              3  2   K   | ]  }|   v s|  y wr3   r   )r4   r  
candidatesr9   s     r   r7   z%engine._find_pivot.<locals>.<genexpr>  s!      
5<:;UE
s   r   zNo pivot found)rZ  r@   r  StopIterationrn  )r9   r  pivotss   `` r   r|  zengine._find_pivot  sM    
$QE
Q7
	9< 	9-.D8	9s	   
1 Ac                8   | j                   d   r t        |      j                         t        v ry| j	                  |      }|dk(  r|S | j                  || j                        }||S 	 t        |      }|j                  t        v r-t        |j                      |t        |j                        d   S |j                  t        v r|S |j                  j                  d      rF|j                  d d t        v r1t        |j                  d d     d|t        |j                        d   S |j                  j                  d      r|S t        j                  |      }|ryt         j                  |      ry|j"                  dk(  ry|j"                  dd  d	v s|j"                  dd  d
k(  r|d d S |j"                  dd  dk(  r t        |      dkD  r|j"                  d d dz   S |j$                  j                         t&        v s*|j"                  dd  t(        v s|j"                  dd  t*        v r|d d S |j"                  j                  d      rt        |      dkD  r|j"                  d d S t,        j                  |      }|r|j/                  d      S y# t        $ r Y yw xY w)Nr  Fr   zn'tr  quizzesquizr  )chessheszzesssesr  r   r	  r  r  r  r.  oes)r*  r}  r  r   r  rc  r.  r  
IndexErrorr  plverb_irregular_presr@   plverb_irregular_non_presr  PLVERB_SPECIAL_S_REr[  
WHITESPACEr  r  pl_v_oes_oepl_v_oes_oe_endings_size4pl_v_oes_oe_endings_size5ENDS_WITH_Sr  )r  r  ro  r}  r9   ra  s         r   r  zengine._pl_special_verb  s    v&3u:+;+;+=+Nu%A:K dD$:$:;L	$KE ;;//+EKK89%EKK@P@R:S9TUU ;;33K ;;&5;;s+;?T+T(Sb)9:;3U[[)+,-/
 ;;&K !''-T"==I%
 MM"#"BB}}RS!U*":==&3u:>=="%++ JJ+-}}RS!%>>}}RS!%>>":==!!%(SZ!^=="%%&88A; y  		s   )J 	JJc                   | j                  |      }|dk(  r|S t        j                  |      }|r9t        |j	                  d      j                             |j	                  d       S t        j                  |      }|r|S |S )Nr   r   )r  plverb_ambiguous_pres_keysr[  plverb_ambiguous_presr  r  plverb_ambiguous_non_pres)r  r  ro  ra  s       r   r  zengine._pl_general_verb!  s     u%A:K (..t4+BHHQK,=,=,?@A"((1+OO '--d3K r   c                   | j                  |      }|dk(  r|S | j                  || j                        }||S t        j	                  |      }|r&t
        |j                  d      j                            S t        j	                  |      }|r&t        |j                  d      j                            S t        j	                  |      }|r3| j                  |j                  d            }|d   dk(  rdnd}| d| S y)Nr   r.  r,   r  r  F)r  rc  r/  pl_adj_special_keysr[  pl_adj_specialr  r  pl_adj_poss_keyspl_adj_possENDS_WITH_APOSTROPHE_Sr  )r  r  ro  r}  ra  rb  
trailing_ss          r   r  zengine._pl_special_adjective9  s     u%A:K dD$<$<=L !''-!"((1+"3"3"566 $$T*rxx{00233#**40!!"((1+.B!"v}#JT:,'' r   c                   | j                  |      }|dk(  r|S 	 || j                  }n|t        vrt        | j                  || j                        }||S |dk(  r|S |t        v r|d d S t        |      }|j                  j                         t        v r1t        |j                        dk\  r| j                  |d      xs |S |S |t         v r|S t"        j%                         D ]  \  }}|j&                  | d  |v s|c S  | j(                  d   r"|j                  j                         t*        v r|S |j                  j                         t,        v r| j(                  d   r|S d	S t.        j1                  |      }	|	rJ|	j3                  d      dk7  r6| j5                  |	j3                  d      d|
       |	j3                  d       S t7        j8                  t:              5  | j=                  |j&                  t?        j@                  | j4                  d|      d      cd d d        S # t        t
        f$ r}t        |d }~ww xY w# 1 sw Y   nxY wt7        j8                  t:              5  | j=                  |j&                  t?        j@                  | j4                  d|      d      cd d d        S # 1 sw Y   nxY wtB        j%                         D ]  \  }}|j&                  | d  |v stD        j%                         D ]  \  }
}|j&                  d |
 |v s|j&                  jG                         |j&                  d |
 |j&                  | d  gk(  sS|j&                  d |  tI        d|j&                  | d  |      z   c c S   	 tI        d|j&                  |      S # tJ        $ r Y nw xY w	 tI        d|j&                  |      S # tJ        $ r Y nw xY w|j                  tL        v r0t        |j                        }|d |   tL        |j                      S |j                  j                         tN        v rLt        |j                  j                               }|d |   tN        |j                  j                             S |j&                  jG                  d      }djQ                  |dd        j                         tR        v rZt        djQ                  |dd              }djU                  |d |  tR        djQ                  |dd        j                                  S |j&                  dd  dk(  r|d d dz   S |j&                  dd  dk(  r|d d S |j&                  dd  dk(  r|d d dz   S |j&                  dd  dk(  r`tV        j%                         D ]  \  }}|j&                  | d  |v s|d d c S  tX        j%                         D ]  \  }}|| d  |v s|d d c S  |j&                  dd  dk(  r|d d dz   S |j&                  dd  dk(  r|d d d z   S |j&                  dd  d!k(  r6tZ        j]                  t        |            }|r|j&                  |v r|d d d"z   S |j&                  dd  d#k(  r|d d d$z   S |j&                  dd  d%k(  r|d d d&z   S |j&                  dd  d'k(  r|d d d(z   S |j&                  d)k(  ry*|j&                  dd  d+k(  r|S |j&                  dd  d,k(  r|d d d-z   S d.t^        ddfd.t`        dd/fd.tb        dd0fd1td        dd2fd3tf        dd4fd1th        dd-fd5tj        ddffD ]P  \  }}}}|j&                  d   |k(  s|j%                         D ]#  \  }}|j&                  | d  |v s|d | |z   c c S  R | j(                  d   r!|j&                  dd  d6k(  r|d d d7z   S |j&                  dd  d8v r|d d S |j&                  dd  d9v rt        |      d:kD  r|d d d7z   S d1tl        dd;fd.tn        dd/fd.tp        dd0fd1tr        dd2fd3tt        dd4fd.tv        d dfd5tx        ddfd1tz        ddfd.t|        dd.fd3t~        dd<fd1t        dd-fd=t        ddfd3t        ddffD ]P  \  }}}}|j&                  d   |k(  s|j%                         D ]#  \  }}|j&                  | d  |v s|d | |z   c c S  R |j&                  dd  d>k(  s(|t        v s |j                  j                         t        v r|d d S |t        v s |j                  j                         t        v r|d d S |j&                  dd  d?k(  s(|t        v s |j                  j                         t        v r|d d S |t        v s |j                  j                         t        v r|d d S |j                  j                         t        v r|d d S t        j%                         D ]  \  }}|j&                  | d  |v s|d d c S  |j&                  dd  d@k(  r|dA   |dA   j                         k(  r|d d S |j                  j                         t        v r|d d S |j                  j                         t        v r|d d S |j&                  dd  dBk(  r|d d S |t        v s |j                  j                         t        v r|d d S |j&                  dd  dCv r|d d S |j                  j                         t        v r|d d S |j&                  dd  dDk(  r|d d S |t        v s |j                  j                         t        v r|d d S |j&                  dd  dEk(  rn|j&                  dd dFv r|d d dGz   S |j&                  dd dHk(  r|dd dIk7  r|d d dGz   S |j&                  dd dJv r|d d dKz   S |j&                  dd dLk(  r|d d dGz   S |j&                  dd  dMk(  rmt        |j&                        dkD  r|j&                  d   dNv r|d d S | j(                  dO   r0|j&                  dd  dMk(  r|dA   |dA   j                         k(  r|d d S |j&                  dd  dPk(  r|d d dz   S |j&                  dd  dQk(  rp|j                  j                         t        v r|d d S t        j%                         D ]  \  }}|j&                  | d  |v s|d d c S  |j&                  dd  dRv r|d d S |j&                  dd  dSk(  r|d d S |t        v r|d d dTz   S |j&                  d   d.k(  r|d d S y	)UNr   r  r.  r  r   r  r  r  F)r  r  r  r  rw  rp  r   z{}{}r  quiesr  r  ir   r
  peopler  rsonmansr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  zoaonr,   exixr   umr  r  r   tricesr  )eauxieux)yngesingesangesr  enr,  r#  housesr  esesr   r  )r  r  r  r6  )elalolfear8  )niliwifearysr=  r  r	  r  )aoseosiosoosuosr  r  )Xr  r2  rs  r+   r|  r  rc  r0  si_sb_ois_oi_caser  r  r  rC  r@   r  rD  rE  rF  rg  r  r*  rG  pl_sb_C_us_usrH  r[  r  r  rK  rL  rn  rM  rN  rO  si_pron_acc_keys_bysizerQ  r  r  r{  si_sb_irregular_capssi_sb_irregularr8   si_sb_irregular_compoundformatsi_sb_U_man_mans_bysizesi_sb_U_man_mans_caps_bysizesi_sb_U_louse_lice_bysizerX  si_sb_U_ch_chs_bysizesi_sb_U_ex_ices_bysizesi_sb_U_ix_ices_bysizesi_sb_U_um_a_bysizesi_sb_U_us_i_bysizesi_sb_U_on_a_bysizesi_sb_U_a_ae_bysizesi_sb_C_en_ina_bysizesi_sb_C_ex_ices_bysizesi_sb_C_ix_ices_bysizesi_sb_C_um_a_bysizesi_sb_C_us_i_bysizere  si_sb_C_a_ae_bysizesi_sb_C_a_ata_bysizesi_sb_C_is_ides_bysizesi_sb_C_o_i_bysizesi_sb_C_on_a_bysizesi_sb_C_im_bysizesi_sb_C_i_bysizesi_sb_uses_use_casesi_sb_uses_usesi_sb_ies_ie_casesi_sb_ies_iesi_sb_oes_oe_casesi_sb_oes_oesi_sb_sses_sse_casesi_sb_sses_ssesi_sb_singular_s_completesi_sb_singular_s_bysizer  si_sb_z_zessi_sb_zzes_zzsi_sb_ches_che_casesi_sb_ches_chesi_sb_xes_xesi_sb_ves_ve_casesi_sb_ves_vesi_sb_U_o_os_completesi_sb_U_o_os_bysizesi_sb_es_is)r  r  ro  r  rU  r}  r9   ri  rj  ra  rt  ru  rv  rx  ry  r8  unass_numendr  class_numends                      r   r  zengine._sinoun^  s@    u% A:K	*~77$$ dD$;$;<L 2:K$$9d::!;;5<< A%2252BJdJK))K,224 	DAq}}aRS!Q&	 v&5::+;+;+=AW+WK::...y94DuD (..t4"((1+#ll288A;&lAB288A;-PP  , 	44!!$,,aG	 	W :& 	* c)	*V	 	   , 	44!!$,,aG	 	 	 ,113 	DAq}}aRS!Q&,224 	FB}}Sb)R/ ==..0!MM#2.!MM1"#.5 
 $)==1"#5 %u}}aRS'969 $ 			uemmV<< 			uemmV<< 		
 ::--uzz?D6TEl^$8$D#EFF::0uzz'')*D6TEl^OEJJ4D4D4F$G#HII]]((-
HHZ_%,,.2JJBC)D ==Vte(#((:bc?*C)J)J)LM 
 ==(9s?"==*9==)9v%% =='/557 %1==!%*9$% 5::< %19>9$% ==&9u$$=='9w&&==')--c$i8AU]]a'CRy7**==(9w&&==(9w&&=='9v%%==F" =='K==&9t## 'R0("d3("d3%r40%r40%r40%r2./
 	:*GQd }}R G+GGI :DAq}}aRS)Q.#M\2T99:	:  y)}}RS!X-CRy3&}}RS!%55CRy }}RS!%@@SYQR]CRy3& +R6,b$7,b$7)2t4)2t4*D"5)2r2*B3,b#6("c2)2t4'R0&B/3 >.L$ ==$/ !	 >1 ==!-2#'#6#==>!>. MM"#(***zz!^39 $$

(8(8(:l(J9
 MM"#')((zz!\19 &&%***:*:*<*N9::!::9+113 	!DAq}}aRS!Q&CRy 	! =='DGtAw}},F9::,9::.9=='9&&%***:*:*<*N9==!119::-9==&9 $$

(8(8(:l(J9==&}}R#'99CRy3&}}R#t+Rs0BCRy3&}}R#'99CRy4''}}R#t+CRy3& ==%5==!A%%--*;w*FCRy ""7+==%-$q'T!W]]_2L9$==&9s?" ==%zz!%::CRy +113 %1==!%*9$% }}RS!%HHCRy ==&9 ;9t## ==#9 sS   H( !=I(I7H>>II+=J22J;N 	N)(N)-O 	OOc                    t         j                  |      }|rQ|j                  d      }|s|S |j                  d      }|j                  d      }| j                  ||      }| | | S y)a  
        Return the appropriate indefinite article followed by text.

        The indefinite article is either 'a' or 'an'.

        If count is not one, then return count followed by text
        instead of 'a' or 'an'.

        Whitespace at the start and end is preserved.

        r   r   r  r  )INDEFINITE_ARTICLE_TESTr[  r  _indef_article)r  r  ro  ra  r  r  r  r  s           r   r   zengine.a  sn     %++D188A;D((1+C88A;D((u5FU6(4&))r   r   r  c                    | j                  |      }|dk7  r| d S | j                  | j                        }|| d S fd| j                  D        }d }t	        ||      S )Nr   r  c              3  T   K   | ]  \  }}|j                        r	| d   ! ywr  )r[  )r4   regexenarticler  s      r   r7   z(engine._indef_article.<locals>.<genexpr>  s4      
 ~~d# iq
s   %(za )r  rc  r1  _indef_article_casesr  )r  r  ro  mycountr}  matchesfallbacks    `     r   r	  zengine._indef_article  s    ..'a<WAdV$$ dD$9$9:WAdV$$
$($=$=
 v;GX&&r   c                X   || j                   | j                   }|d}t        j                  |      }|r4|j                  d      }|j                  d      }|j                  d      }nd}d}d}t	        |      j                         t        v rd}| | d| j                  ||       | S )a  
        If count is 0, no, zero or nil, return 'no' followed by the plural
        of text.

        If count is one of:
            1, a, an, one, each, every, this, that
            return count followed by text.

        Otherwise return count follow by the plural of text.

        In the return value count is always followed by a space.

        Whitespace at the start and end is preserved.

        r   r   r   r  r  r  r  )r+  r  r[  r  r}  r  r   r>  )r  r  ro  ra  r  r  r  s          r   r  z	engine.no  s    " =T22>))E=E""4(((1+C88A;D88A;DCDDu:.EugQt{{478??r   c                    | j                  |d      }|}t        D ]#  \  }}|j                  ||      \  }}|s| dc S  | dS )zi
        Return the present participle for word.

        word is the 3rd person singular verb.

        r   ing)r  PRESENT_PARTICIPLE_REPLACEMENTSsubn)r  r  plvansr  replrq  s          r   r  zengine.present_participle  s_     tQ'< 	#MGT||D#.HCc{"	# c{r   c                   t         j                  t        |            rtt        |t        t
        f      rt        |      |k(  rt        |      }n1dt        |      v r	 t        t        |      d         }nt        |      }	 t        |dz     }| | S | j                  |      S # t        $ r t        t        |      dd       }Y Fw xY w# t        $ r t        |dz     }Y Tw xY w)z
        Return the ordinal of num.

        >>> ordinal = engine().ordinal
        >>> ordinal(1)
        '1st'
        >>> ordinal('one')
        'first'
        .r.  Nd   
   )
DIGITrS  r}  r  floatrm  rn  nthr{  _sub_ord)r  rq  rw  r  s       r   r  zengine.ordinal/  s     ;;s3x #s|,SSH#c(?/  C-
 CA#1s7| U4&>!==%% & /C"./  #1r6{#s$   B$ C
 $ CC
C"!C"c                J    |t        t              dz
  kD  rt        t        |   S r  )r@   millr%   )r  inds     r   millfnzengine.millfnP  s"    TQ$$Cyr   c                :    t         |    | j                  |       S r3   )unitr%  )r  unitsmindexs      r   unitfnzengine.unitfnU  s    u+t{{62344r   c                    |dk7  r6t         |   }|r|rd}nd}t        |   }| j                  |      }| | | | S t        |    t        |    S )Nr   r  r  )r  r'  r%  teenr#  )r  tensr(  r)  	tens_parthyphen	unit_part	mill_parts           r   tenfnzengine.tenfnX  sf    19D	IUIF+I[I;??u+tF|n--r   c                    |rK|s|rd| j                   d    dnd}t        |    d| | j                  ||       | j                  |       dS |s|r&| j                  ||       | j                  |       dS y)Nr  andwordr  z hundred, )r6  r'  r2  r%  )r  hundredsr-  r(  r)  r4  s         r   hundfnzengine.hundfnd  s    =AU$++I67q9PRG >"(7)::dE*+DKK,?+@D 5jju-.t{{6/B.C2FFr   c                    t        |j                  d            }|dk(  rd| j                  d    dS |rt        |    dS d| j                  d    dS )Nr   r  r  r5  r  )rm  r  r6  r'  r  ra  r(  s      r   	group1subzengine.group1subp  se    BHHQK A:t((/0335k]"%%t((0144r   c                x    t        |j                  d            }|rt        |    dS d| j                  d    dS )Nr   r5  r  r  )rm  r  r'  r6  r9  s      r   
group1bsubzengine.group1bsuby  sC    BHHQK 5k]"%%t((0144r   c                   t        |j                  d            }t        |j                  d            }|r| j                  ||       dS |rd| j                  d    dt        |    dS d| j                  d    d| j                  d    dS )Nr   r   r5  r  r  )rm  r  r2  r6  r'  )r  ra  r-  r(  s       r   	group2subzengine.group2sub  s    288A;BHHQK jju-.b11t((014;-rBB4$$V,-Qt/@/@/H.ILLr   c                   t        |j                  d            }t        |j                  d            }t        |j                  d            }|dk(  rd| j                  d    }n'|rt        t        |         }nd| j                  d    }|r| j                  ||      }nA|rd| j                  d    dt        |    }n"d| j                  d    d| j                  d    }| d| dS )Nr   r   r  r  r  r  r5  )rm  r  r6  r}  r'  r2  )r  ra  r6  r-  r(  hunwordtenwords          r   	group3subzengine.group3sub  s    rxx{#288A;BHHQK q=$++E234G$x.)G$++F345Gjju-G$++F34Ad5k]CG$++F34Ad6G6G6O5PQG!G9B''r   c           	         | j                  t        |j                  d            t        |j                  d            t        |j                  d            | j                        }| xj                  dz  c_        |S )Nr   r   r  )r7  rm  r  r,  )r  ra  rets      r   hundsubzengine.hundsub  sY    kkc"((1+.BHHQK0@$//
 	1
r   c                    | j                  t        |j                  d            t        |j                  d            | j                         dS )Nr   r   r5  )r2  rm  r  r,  r  ra  s     r   tensubzengine.tensub  s<    **S!-s288A;/?QRRTUUr   c                p    | j                  t        |j                  d            | j                         dS )Nr   r5  )r*  rm  r  r,  rG  s     r   unitsubzengine.unitsub  s,    ++c"((1+.@ADDr   c                   |dk(  r"t         j                  | j                  |      }|S |dk(  rCt        j                  | j                  |      }t         j                  | j
                  |d      }|S |dk(  rdt        j                  | j                  |      }t        j                  | j                  |d      }t         j                  | j                  |d      }|S t        |      dk(  r| j                  d   }|S t        |      dk(  r| j                  d   }|S |j                         j                  d      }d| _        t        j                  |      }|r9t        j                  | j                  |d      }t        j                  |      }|r9t        j                  | j                   |d      }t"        j                  | j$                  |d      }|S )Nr   r   r  r   r  r  r  )DIGIT_GROUPr^  r:  
TWO_DIGITSr>  r<  THREE_DIGITSrB  rm  r6  lstripr,  THREE_DIGITS_WORDr[  rE  TWO_DIGITS_WORDrH  ONE_DIGIT_WORDrJ  )r  rq  r  ra  s       r   enwordzengine.enword  s    A://$..#6C, 
+ aZ..5C//$//3:C& 
% aZ""4>>37C..a8C//$..#q9C 
 X]##F+C 
 X]##E*C 
 **,%%c*CDO"))#.B'++DLL#qA&--c2  "%%dkk3:C $$T\\3:C
r   c                F    t         j                  d |       }|d|| k(  z  z   S )Nc                2    t         | j                  d         S r  )r  r  )rS  s    r   r  z!engine._sub_ord.<locals>.<lambda>  s    WU[[^-D r   r  )ordinal_suffr^  )r  news     r   r!  zengine._sub_ord  s)    DcJTSCZ(((r   c                f    |r|dk7  rdnd}|j                  d|      }n|g}| j                  |      S )Nr   r.  r   r  )r  _remove_last_blank)r~  rq  decimalr  	max_splitchunkss         r   
_chunk_numzengine._chunk_num  s:    #qjaIYYsI.FUF%%f--r   c                ,    | d   dk(  }|r| dd n| }||fS )z
        Remove the last item from chunks if it's a blank string.

        Return the resultant chunks and whether the last item was removed.
        r.  r  Nr   )r\  removedr  s      r   rY  zengine._remove_last_blank  s+     *" 'Vwr   c                N    dddj                  | j                         d   d      S )Nplusminus)+r  r   r  )rX  rO  )rq  s    r   	_get_signzengine._get_sign  s$    '*..szz|ACCr   c
                    ||d _         t        |      }|	Xt        |      |	kD  rJ|j                  dd      }
|r(t        j                  d|
d         \  |
d<   }|dk(  rn|r(	 |
d    d|
d    S dk  sdkD  rt         j                  |      }|t        v r|}|dd t        v }|r|dd } j                  ||      \  }}|d   d	k(  }|  fd
}t        |||d       ||d g }dk7  r|d   j                  | d      }|r|r j                  |d         |d<   |dd D ]6  }|j                  |       |j                  |j                  | d             8 |r|j                  |       |r|gt        |      z  |z   S |r| dnd	}rdj!                  |      n!d	j!                   j#                  |||            }||z   S # t        $ r t        |
d         cY S w xY w)a  
        Return a number in words.

        group = 1, 2 or 3 to group numbers before turning into words
        comma: define comma

        andword:
            word for 'and'. Can be set to ''.
            e.g. "one hundred and one" vs "one hundred one"

        zero: word for '0'
        one: word for '1'
        decimal: word for decimal point
        threshold: numbers above threshold not turned into words

        parameters not remembered from last call. Departure from Perl version.
        )r4  r  r  Nr  r   z\1,\2r   r  r   r  c                v   t         j                  d|       } | dk(  rd} dk(  rsj                  | d      } nj                  |       } | dd  dk(  r| d d } t        j                  d|       } dk(  rrt        j                  d d	|       } t
        j                  d|       } | j                         } rd | S )
Nr  r  r   r   r   r5  ,r  z \1)	NON_DIGITr^  rS  WHITESPACES_COMMA
COMMA_WORDWHITESPACESstrip)chunkr4  r  r  r  s    r   _handle_chunkz-engine.number_to_words.<locals>._handle_chunk   s     MM"e,E{z%E1-E51RSzT!cr
%))#u5Eze"7)4'8%@OOC/EKKMELr   r  r.  r5  )r6  r}  r  r  FOUR_DIGIT_COMMAr  r  r#   rd  nth_suffr]  r  r!  appendr;  r!  r8   _render)r  rq  wantlistr  commar4  r  r  rZ  	thresholdspnumrw  signmyordr\  
finalpoint	loopstartrn  	numchunksrm  signoutvaloutr  s   `  ` `                @r   r  zengine.number_to_words  s?   < )0cJ#h  U3Z)%;IIc1%E 0 5 5ha Iq16 %(1U1XJ// 19	((~~c"(?CBCH$cr(C!__S'5A
1IO	!*]	4 !yz0BCyz	A:q	5'4IY MM)B-8IbMABZ 	7EW%U[[E7!56	7 W%6DJ&22 $TF!*"  IIi i%@A 	
 O  %58}$%s   (G G('G(c              #     K   | j                  d      }| |d u xs |j                  |       }| D ]  }||k(  rd}n|r| d|   y w)Nr   Fr  )popr  )r\  rZ  rt  
first_itemr  ncs         r   rr  zengine._renderU  sc     ZZ]
4Cz':':7'C#C 	BW}bT(N	s   AAc                   |syt        |      dk(  r|d   S |r|dk(  rd}nd| d}t        |      dk(  r|d    | |d    S |ddj                  |      v rd}nd}||}| | }|r|dz  }|j                  |dd        | |d    S )	a  
        Join words into a list.

        e.g. join(['ant', 'bee', 'fly']) returns 'ant, bee, and fly'

        options:
        conj: replacement for 'and'
        sep: separator. default ',', unless ',' is in the list then ';'
        final_sep: final separator. default ',', unless ',' is in the list then ';'
        conj_spaced: boolean. Should conj have spaces around it

        r  r   r   r  r   rg  ;r.  )r@   r8   )r  r9   r  
sep_spaced	final_sepconjconj_spaceds          r   r8   zengine.joina  s    , u:?8Orz4&{u:?AhZveAhZ00;bggen$I k$(	3JC((52;'(E"I;??r   r  )r=  Optional[Word]r>  r  r  rm  )rA  r  rB  r  rC  r  rD  r  rE  r  rF  r  r  rm  )rM  r  r  rm  )rM  r  r  r  )r  r#  r`  zSequence[Optional[Word]]r  Optional[str])NN)ro  Optional[int]rp  r  r  r}  )r  r}  r  r  )ra  r   r  zDict[str, Callable]r  r}  )r  r#  r  r}  )r  r}  r  r}  )r  r}  r  zTuple[str, str, str]r3   )r  r#  ro  zOptional[Union[str, int, Any]]r  r}  )r  r#  r  r#  r  Union[str, bool])r  r#  ro  Optional[Union[int, str, Any]]r  r  r  zUnion[str, Literal[False]])r  r}  r  r}  r  r  )
r  r}  r  r}  r  r}  r  r}  r  r!  )r  r}  r  r}  r  r!  )ro  Optional[Union[str, int]]r  zUnion[str, int])r  r}  ro  r  r  r}  )r  r  ro  rm  r  zUnion[str, None])r  r}  ro  r  r  r  )r  r}  ro  r  r  r  r  r  )r   )r  r#  ro  r  r  r}  )r  r}  ro  zUnion[int, str, Any]r  r}  )r  r#  ro  zOptional[Union[int, str]]r  r}  )r  r#  r  r}  )rq  Union[Number, Word]r  r}  )r   )r$  rm  r  r}  )r(  rm  r)  rm  r  r}  r  r}  )
r6  rm  r-  rm  r(  rm  r)  rm  r  r}  )ra  r   r  r}  )rq  r}  r  rm  r  r}  )Fr   rg  andr  r  pointN)rq  r  rs  r!  r  rm  rt  Union[Falsish, str]r4  r}  r  r}  r  r}  rZ  r  ru  r  r  zUnion[str, List[str]])NTNr  T)r9   zOptional[Sequence[Word]]r  r  r  r!  r  r  r  r}  r  r!  r  r}  )]r   r   r   r  propertyr6  setterr   r?  rG  rI  rN  rP  r9  r:  rc  rk  rq  r  rz  r  r  r  r  r>  r  r  r  r  r  r  r  r  r  r  r  r  r  r  classmethodrM  rD  staticmethodr|  r  r  r  r  r   r  A_ordinal_aA_ordinal_anA_explicit_an
SPECIAL_AN	SPECIAL_AA_abbrevSPECIAL_ABBREV_ANSPECIAL_ABBREV_A
CONSONANTSARTICLE_SPECIAL_EUARTICLE_SPECIAL_ONCEARTICLE_SPECIAL_ONETIMEARTICLE_SPECIAL_UNITARTICLE_SPECIAL_UBAARTICLE_SPECIAL_UKRA_explicit_aSPECIAL_CAPITALSVOWELSA_y_consr  r	  r  r  r  r%  r*  r2  r7  r:  r<  r>  rB  rE  rH  rJ  rS  r!  r]  rY  rd  r  rr  r8   r   r   r   r'  r'    sn   
< 8 8 ! ! 	 	   	
    
 0      	? 
 
 0F BF"1>	,!";,??':?	?@ # #N < & &. BF&&!?&	& &( BF&&!?&	& &. BF&&!?&	& &( 2 28 = = = = < <  15 $	'' .' 	'
 
$' 'R4.
B
, =A__ 9_	_B	 + +2%0 9 9 =APP 9P	Pf =A 9	2 =A"" 9"	"P ,0 $	CC )C 	C
 
CN
  . 
B 
c	t		T	C	4	D!	3	S	S!	s#	 #&	s#	c"	c"	s	3	 
49>'0 !@ !@J  $ & &@
5
.
55M($VE: ) ) . .   D D  %('.#'p  p  p  	p 
 #p  p  p  p  %p  !p  
p  p d 	 	  "#' 0@'0@ 0@ 	0@
 !0@ 0@ 0@ 
0@ 0@r   r'  )r,   r}  r  r}  )r   N)r6   r  r9   zOptional[Iterable[str]]r  r}  )r9   r;   r  zDict[int, set])T)rE   r;   rF   r}  rG   r  rH   r!  r  (=  r$  
__future__r   ru  r=   rK  rN  r  rR  numbersr   typingr   r   r   r   r	   r
   r   r   r   r   r   r   r   more_itertoolsr   	typeguardr   compat.py38r   	Exceptionr   r!   r#   r%   r'   r)   r+   r/   r:   rC   rM   r  r  updater  rT  rg  r  listri  r  k1k2r  r  pl_sb_z_zes_listro  pl_sb_ze_zes_listrp  pl_sb_C_is_ides_completepl_sb_C_is_ides_endingsr  pl_sb_C_is_ides_listsi_sb_C_is_ides_listr  rh  pl_sb_C_a_ata_listsi_sb_C_a_ata_listr  rg  r  pl_sb_U_a_ae_listsi_sb_U_a_ae_listr  r_  pl_sb_U_a_aepl_sb_C_a_ae_listsi_sb_C_a_ae_listr  rf  r  pl_sb_C_en_ina_listsi_sb_C_en_ina_listr  r`  r  pl_sb_U_um_a_listsi_sb_U_um_a_listr  r\  pl_sb_U_um_apl_sb_C_um_a_listsi_sb_C_um_a_listr  rc  r  pl_sb_U_us_i_listsi_sb_U_us_i_listr  r]  pl_sb_U_us_ipl_sb_C_us_i_listsi_sb_C_us_i_listr  rd  r  r  re  pl_sb_U_on_a_listsi_sb_U_on_a_listr  r^  pl_sb_U_on_apl_sb_C_on_a_listsi_sb_C_on_a_listr  rj  r  pl_sb_C_o_iri  r  r  rq  r  pl_sb_U_o_os_endingsrr  r  pl_sb_U_ch_chs_listsi_sb_U_ch_chs_listr  rY  pl_sb_U_ch_chspl_sb_U_ex_ices_listsi_sb_U_ex_ices_listr  rZ  pl_sb_U_ex_icespl_sb_U_ix_ices_listsi_sb_U_ix_ices_listr  r[  pl_sb_U_ix_icespl_sb_C_ex_ices_listsi_sb_C_ex_ices_listr  ra  r  pl_sb_C_ix_ices_listsi_sb_C_ix_ices_listr  rb  r  pl_sb_C_i_listsi_sb_C_i_listr  rk  r  pl_sb_C_im_listsi_sb_C_im_listr  rl  r  pl_sb_U_man_mans_listpl_sb_U_man_mans_caps_listsi_sb_U_man_mans_listr  rU  si_sb_U_man_mans_caps_listr  rV  pl_sb_U_louse_lice_listsi_sb_U_louse_lice_listr  rW  pl_sb_uninflected_s_completepl_sb_uninflected_s_endingspl_sb_uninflected_srG  rC  rE  pl_sb_uninflected_endingsrF  rm  pl_sb_singular_s_endingsrn  r  si_sb_singular_s_endingsr  pl_sb_singular_s_esr8   pl_sb_singular_sr  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  plverb_special_s_pl_sb_postfix_adj_defnr  r  pl_sb_postfix_adj_stemsr  pl_prep_listr}  rQ  pl_preppl_sb_prep_dual_compoundrs  rS  rq  rR  pl_pron_acc_keysrP  _thecase_plur_gend_singr|  si_pron_acc_keysr  r  r  r  compiler\  r  r  r  r  r  r  r   r  r  r  r  r  VERBOSEr  r  r  r  r  r  r   r?   r  rp  dictr  rV  r'  r,  r  r#  r)  re  rf  string_to_constantr]  r  r  rH  rI  rJ  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rL  rM  rN  rP  rQ  rR  ro  rh  ri  rj  rk  r  r  r}  r  Falsish_STATIC_TYPE_CHECKINGr#  typer  r'  )ri  rj  r5   s   000r   <module>r     sd  4l # 
     	      - ! "		 		y 		Y 		 		 		Y 		Y 	@** 	!-	!-!-  !- 	!-N !	 "Z"" "" %	"
 H" L" N" N" " X" " 	&" 
;" 
" $"  ^!"" ##"$ i%"& N'"( X)"* W+", "-". -/"0 -1"2 z3"4 5"6 -7"8 j9": Y;"< H="> z?"@ 
6A"B iC"H   ( ) 	  *+EF &5&;&;&=>FQ1a4>	o	 A
axB4CA4FFob1A	
 ,@+E+E+GH!Q1H /G/M/M/OPVaAqDP 	&	' (A
axB$Q'	
 $'?'C %Q'( ' ,-  ./ 
   
  6M#NbH#NN 02II  )61G	 @ '2
  &T2
 , &T2 5  (%3
   &Q/
 L &Q/
   &Q/
 , &Q/ m, 
   &Q/
 "  &Q/	 K( ;?a#2xq\?@ R-  D *?@QA3a@ DH ID L 12 /CD!1gDE 
 5  (#t4 3  )615 *  )615
	   )615 %  )615 /BRCC ?!#3Y .FVT4G C#%6
 
EG	 

 
EG  *C%H	 /duM	   L  ,faEJ	)  Z 
	  316bH6   B, !-! 2 :&  '  . "";< 
!B C! H !$<*AA  !9: /HI!s"XI .FGqcHG  !9: "m HH!5
6Rs8
6	7
	  + R @] ~HV $& &9 . :C  
  HH	
	
 
!	" 2	2  LMN !gg $:Q$ =  chh'89:%@ 
CJ0 16	  !33(
#((?+
,0	9RS   k 
5	
  
6 | 	& | 	& l F  F  W!" H#$ 
8%& 
8'( h)0 
{0023VaAqD3=	9  t 
 
  388K01  - %0%6%6%896Aq!Q$9& $0!HeUE@0*/% 'C$0N 388GEN34  0  


 !	5!
E! W! g	!
 
5! F! 
5! U! F! f! W! g! W! g! F!  V!!" F#!$ A! F (RZZ	'#((01
2	3;? 
 " 'BJJ7  E, &  + HVWgN bjj	'#((>*
+	,B/ 
  2::GCHH[,A$B#C2FV  2::
 JJ 2::BBMMR rzz:BMMJ

7 rzz2BMMBbjj3R]]C  szz|

	
		 rzzQsxx0156
 T$ ET5% #00QD0"/0Q50 #UDA  

:&

/?23'RZZ#$B'  )bjj$%R("--  bjj<= bjjB'7&8!;< RZZ
bjj7#L1 $"**%FV RZZ+R]];
BJJ,bmm<	BJJ5r}}E 2::mR]]; RZZr}}5
RZZ	2==9 !rzz+r}}= $"**]BMMB !rzz"4bmmD  bjj!:BMMJ  bjj"--8 2::./ 	K	/bjj!RZZ$
rzz/*BJJ78 "**12,-2::45 BJJu	BJJw' RZZ(
bjj  RZZ

6 RZZx(RZZ&!RZZ	C RZZ %(RZZ
V$RZZ
X&RZZh'RZZRZZ34mD# " 	

5
$C 
$  &  S<<=DDD D/ /U@ U@A8 ? IPJ $O` @ AT EL6~ JG 7^ 40 :H  0#%% */% '0d 10sl   &{4 {:$| |>|%|	|2|9||$9|)0|.|40|:6
}	
}:}}