Grammalecte  Check-in [19d5e77970]

Overview
Comment:merge trunk
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | fr_killtricks
Files: files | file ages | folders
SHA3-256: 19d5e77970299b3271e485da42b99dc5f18966a235af25dc8282d49d4c383101
User & Date: olr on 2017-09-12 01:59:52
Other Links: branch diff | manifest | tags
Context
2017-09-12
08:54
merge trunk check-in: c51ddd5524 user: olr tags: fr_killtricks
01:59
merge trunk check-in: 19d5e77970 user: olr tags: fr_killtricks
01:20
[fr] phonet_simil: 3 entrées check-in: b542d84d98 user: olr tags: trunk, fr
2017-06-20
18:41
[fr] màj: conjugaisons, suppression des pronoms et de “ne” (2) check-in: 7c28c4de28 user: olr tags: fr, fr_killtricks
Changes

Modified CHANGELOG.txt from [b2b4236d65] to [bdd168ce5d].

20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
    Dictionary switcher
    Text formatter
    Lexicographer
    French Conjugueur

##  0.4
    Suggestion mechanisms
    Simplier user options writing
    Application Launcher
    Author field edition

##  0.5
    Grammalecte is an autonomous package, free from Hunspell and LibreOffice
    Indexable binary dictionary (DAWG-FSA) generator
    Disambiguator
    Multi-actions rules (bi-passes engine again)
    Simplier options for word boundaries
    Unit tests







|








|

20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
    Dictionary switcher
    Text formatter
    Lexicographer
    French Conjugueur

##  0.4
    Suggestion mechanisms
    Simpler user options writing
    Application Launcher
    Author field edition

##  0.5
    Grammalecte is an autonomous package, free from Hunspell and LibreOffice
    Indexable binary dictionary (DAWG-FSA) generator
    Disambiguator
    Multi-actions rules (bi-passes engine again)
    Simpler options for word boundaries
    Unit tests

Modified LICENSE.fr.txt from [6c800bc372] to [863120fc46].

111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
soit gratuit ou contre un paiement, vous devez accorder aux
Destinataires les mêmes libertés que vous avez reçues. Vous devez aussi
vous assurer qu’eux aussi reçoivent ou peuvent recevoir son code
source. Et vous devez leur montrer les termes de cette licence afin
qu’ils connaissent leurs droits.

Les développeurs qui utilisent la GPL GNU protègent vos droits en deux
étapes : (1) ils affirment leur droits d’auteur (“copyright”) sur le
logiciel, et (2) vous accordent cette Licence qui vous donne la
permission légale de le copier, le distribuer et/ou le modifier.

Pour la protection des développeurs et auteurs, la GPL stipule
clairement qu’il n’y a pas de garantie pour ce logiciel libre. Aux fins
à la fois des utilisateurs et auteurs, la GPL requière que les versions
modifiées soient marquées comme changées, afin que leurs problèmes ne
soient pas attribués de façon erronée aux auteurs des versions
précédentes.

Certains dispositifs sont conçus pour empêcher l’accès des utilisateurs
à l’installation ou l’exécution de versions modifiées du logiciel à
l’intérieur de ces dispositifs, alors que les fabricants le peuvent.
Ceci est fondamentalement incompatible avec le but de protéger la
liberté des utilisateurs de modifier le logiciel. L’aspect systématique
de tels abus se produit dans le secteur des produits destinés aux
utilisateurs individuels, ce qui est précidément ce qui est le plus
inacceptable. Aussi, nous avons conçu cette version de la GPL pour
prohiber cette pratique pour ces produits. Si de tels problèmes
surviennent dans d’autres domaines, nous nous tenons prêt à étendre
cette restriction à ces domaines dans de futures versions de la GPL,
autant qu’il sera nécessaire pour protéger la liberté des utilisateurs.

Finalement, chaque programme est constamment menacé par les brevets







|
















|







111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
soit gratuit ou contre un paiement, vous devez accorder aux
Destinataires les mêmes libertés que vous avez reçues. Vous devez aussi
vous assurer qu’eux aussi reçoivent ou peuvent recevoir son code
source. Et vous devez leur montrer les termes de cette licence afin
qu’ils connaissent leurs droits.

Les développeurs qui utilisent la GPL GNU protègent vos droits en deux
étapes : (1) ils affirment leurs droits d’auteur (“copyright”) sur le
logiciel, et (2) vous accordent cette Licence qui vous donne la
permission légale de le copier, le distribuer et/ou le modifier.

Pour la protection des développeurs et auteurs, la GPL stipule
clairement qu’il n’y a pas de garantie pour ce logiciel libre. Aux fins
à la fois des utilisateurs et auteurs, la GPL requière que les versions
modifiées soient marquées comme changées, afin que leurs problèmes ne
soient pas attribués de façon erronée aux auteurs des versions
précédentes.

Certains dispositifs sont conçus pour empêcher l’accès des utilisateurs
à l’installation ou l’exécution de versions modifiées du logiciel à
l’intérieur de ces dispositifs, alors que les fabricants le peuvent.
Ceci est fondamentalement incompatible avec le but de protéger la
liberté des utilisateurs de modifier le logiciel. L’aspect systématique
de tels abus se produit dans le secteur des produits destinés aux
utilisateurs individuels, ce qui est précisément ce qui est le plus
inacceptable. Aussi, nous avons conçu cette version de la GPL pour
prohiber cette pratique pour ces produits. Si de tels problèmes
surviennent dans d’autres domaines, nous nous tenons prêt à étendre
cette restriction à ces domaines dans de futures versions de la GPL,
autant qu’il sera nécessaire pour protéger la liberté des utilisateurs.

Finalement, chaque programme est constamment menacé par les brevets
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
     Appropriées, votre travail n’a pas à les modifier pour qu’elles
     les affichent. 

Une compilation d’un Travail Couvert avec d’autres travaux séparés et
indépendants, qui ne sont pas par leur nature des extensions du Travail
Couvert, et qui ne sont pas combinés avec lui de façon à former un
programme plus large, dans ou sur un volume de stockage ou un support
de distribution, est appelé un « aggrégat » si la compilation et son
Droit d’Auteur résultant ne sont pas utilisés pour limiter l’accès ou
les droits légaux des utilisateurs de la compilation en deça de ce que
permettent les travaux individuels. L’inclusion d’un Travail Couvert
dans un aggrégat ne cause pas l’application de cette Licence aux
autres parties de l’aggrégat.


Article 6. Acheminement des formes non sources.

Vous pouvez acheminer sous forme de code objet un Travail Couvert
suivant les termes des articles 4 et 5, pourvu que vous acheminiez
également suivant les termes de cette Licence le Source Correspondant







|

|

|
|







355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
     Appropriées, votre travail n’a pas à les modifier pour qu’elles
     les affichent. 

Une compilation d’un Travail Couvert avec d’autres travaux séparés et
indépendants, qui ne sont pas par leur nature des extensions du Travail
Couvert, et qui ne sont pas combinés avec lui de façon à former un
programme plus large, dans ou sur un volume de stockage ou un support
de distribution, est appelé un « agrégat » si la compilation et son
Droit d’Auteur résultant ne sont pas utilisés pour limiter l’accès ou
les droits légaux des utilisateurs de la compilation en deçà de ce que
permettent les travaux individuels. L’inclusion d’un Travail Couvert
dans un agrégat ne cause pas l’application de cette Licence aux
autres parties de l’agrégat.


Article 6. Acheminement des formes non sources.

Vous pouvez acheminer sous forme de code objet un Travail Couvert
suivant les termes des articles 4 et 5, pourvu que vous acheminiez
également suivant les termes de cette Licence le Source Correspondant
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
     utilisé pour les échanges de logiciels, pour un prix non supérieur
     au coût raisonnable de la réalisation physique de l’acheminement
     de la source, ou soit (2) un accès permettant de copier le Source
     Correspondant depuis un serveur réseau sans frais.

  c) Acheminer des copies individuelles du code objet avec une copie de
     l’offre écrite de fournir le Source Correspondant. Cette
     alternative est permise seulement occasionellement et non
     commercialement, et seulement si vous avez reçu le code objet avec
     une telle offre, en accord avec l’article 6 alinéa b.

  d) Acheminer le code objet en offrant un accès depuis un emplacement
     désigné (gratuit ou contre facturation) et offrir un accès
     équivalent au Source Correspondant de la même façon via le même
     emplacement et sans facturation supplémentaire. Vous n’avez pas







|







390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
     utilisé pour les échanges de logiciels, pour un prix non supérieur
     au coût raisonnable de la réalisation physique de l’acheminement
     de la source, ou soit (2) un accès permettant de copier le Source
     Correspondant depuis un serveur réseau sans frais.

  c) Acheminer des copies individuelles du code objet avec une copie de
     l’offre écrite de fournir le Source Correspondant. Cette
     alternative est permise seulement occasionnellement et non
     commercialement, et seulement si vous avez reçu le code objet avec
     une telle offre, en accord avec l’article 6 alinéa b.

  d) Acheminer le code objet en offrant un accès depuis un emplacement
     désigné (gratuit ou contre facturation) et offrir un accès
     équivalent au Source Correspondant de la même façon via le même
     emplacement et sans facturation supplémentaire. Vous n’avez pas
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430

  e) Acheminer le code objet en utilisant une transmission
     d’égal-à-égal, pourvu que vous informiez les autres participants
     sur où le code objet et le Source Correspondant du travail sont
     offerts sans frais au public général suivant l’article 6 alinéa d.
     Une portion séparable du code objet, dont le code source est exclu
     du Source Correspondant en tant que Bibliothèque Système, n’a pas
     besoin d’être inclu dans l’acheminement du travail sous forme de
     code objet.

Un « Produit Utilisateur » est soit (1) un « Produit de Consommation, »
ce qui signifie toute propriété personnelle tangible normalement
utilisée à des fins personnelles, familiales ou relatives au foyer,
soit (2) toute chose conçue ou vendue pour l’incorporation dans un lieu
d’habitation. Pour déterminer si un produit constitue un Produit de







|







416
417
418
419
420
421
422
423
424
425
426
427
428
429
430

  e) Acheminer le code objet en utilisant une transmission
     d’égal-à-égal, pourvu que vous informiez les autres participants
     sur où le code objet et le Source Correspondant du travail sont
     offerts sans frais au public général suivant l’article 6 alinéa d.
     Une portion séparable du code objet, dont le code source est exclu
     du Source Correspondant en tant que Bibliothèque Système, n’a pas
     besoin d’être inclus dans l’acheminement du travail sous forme de
     code objet.

Un « Produit Utilisateur » est soit (1) un « Produit de Consommation, »
ce qui signifie toute propriété personnelle tangible normalement
utilisée à des fins personnelles, familiales ou relatives au foyer,
soit (2) toute chose conçue ou vendue pour l’incorporation dans un lieu
d’habitation. Pour déterminer si un produit constitue un Produit de
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
l’acheminement se produit en tant qu’élément d’une transaction dans
laquelle le droit de possession et d’utilisation du Produit
Utilisateur est transféré au Destinataire définitivement ou pour un
terme fixé (indépendamment de la façon dont la transaction est
caractérisée), le Source Correspondant acheminé selon cet article-ci
doit être accompagné des Informations d’Installation. Mais cette
obligation ne s’applique pas si ni vous ni aucune tierce partie ne
détient la possibilité d’intaller un code objet modifié sur le Produit
Utilisateur (par exemple, le travail a été installé en mémoire morte).

L’obligation de fournir les Informations d’Installation n’inclue pas
celle de continuer à fournir un service de support, une garantie ou des
mises à jour pour un travail qui a été modifié ou installé par le
Destinataire, ou pour le Produit Utilisateur dans lequel il a été
modifié ou installé. L’accès à un réseau peut être rejeté quand la







|







455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
l’acheminement se produit en tant qu’élément d’une transaction dans
laquelle le droit de possession et d’utilisation du Produit
Utilisateur est transféré au Destinataire définitivement ou pour un
terme fixé (indépendamment de la façon dont la transaction est
caractérisée), le Source Correspondant acheminé selon cet article-ci
doit être accompagné des Informations d’Installation. Mais cette
obligation ne s’applique pas si ni vous ni aucune tierce partie ne
détient la possibilité d’installer un code objet modifié sur le Produit
Utilisateur (par exemple, le travail a été installé en mémoire morte).

L’obligation de fournir les Informations d’Installation n’inclue pas
celle de continuer à fournir un service de support, une garantie ou des
mises à jour pour un travail qui a été modifié ou installé par le
Destinataire, ou pour le Produit Utilisateur dans lequel il a été
modifié ou installé. L’accès à un réseau peut être rejeté quand la
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
auprès du public sous forme de code source) et ne doit nécessiter
aucune clé ou mot de passe spécial pour le dépaquetage, la lecture ou
la copie.


Article 7. Termes additionnels.

Les « permissions additionelles » désignent les termes qui
supplémentent ceux de cette Licence en émettant des exceptions à l’une
ou plusieurs de ses conditions. Les permissions additionnelles qui
sont applicables au Programme entier doivent être traitées comme si
elles étaient incluent dans cette Licence, dans les limites de leur
validité suivant la loi applicable. Si des permissions additionnelles
s’appliquent seulement à une partie du Programme, cette partie peut
être utilisée séparément suivant ces permissions, mais le Programme
tout entier reste gouverné par cette Licence sans regard aux
permissions additionelles.

Quand vous acheminez une copie d’un Travail Couvert, vous pouvez à
votre convenance ôter toute permission additionelle de cette copie, ou
de n’importe quelle partie de celui-ci. (Des permissions
additionnelles peuvent être rédigées de façon à requérir leur propre
suppression dans certains cas où vous modifiez le travail.) Vous
pouvez placer les permissions additionnelles sur le matériel acheminé,
ajoutées par vous à un Travail Couvert pour lequel vous avez ou pouvez
donner les permissions de Droit d’Auteur (“copyright”) appropriées.








|



|




|


|







477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
auprès du public sous forme de code source) et ne doit nécessiter
aucune clé ou mot de passe spécial pour le dépaquetage, la lecture ou
la copie.


Article 7. Termes additionnels.

Les « permissions additionnelles » désignent les termes qui
supplémentent ceux de cette Licence en émettant des exceptions à l’une
ou plusieurs de ses conditions. Les permissions additionnelles qui
sont applicables au Programme entier doivent être traitées comme si
elles étaient incluses dans cette Licence, dans les limites de leur
validité suivant la loi applicable. Si des permissions additionnelles
s’appliquent seulement à une partie du Programme, cette partie peut
être utilisée séparément suivant ces permissions, mais le Programme
tout entier reste gouverné par cette Licence sans regard aux
permissions additionnelles.

Quand vous acheminez une copie d’un Travail Couvert, vous pouvez à
votre convenance ôter toute permission additionnelle de cette copie, ou
de n’importe quelle partie de celui-ci. (Des permissions
additionnelles peuvent être rédigées de façon à requérir leur propre
suppression dans certains cas où vous modifiez le travail.) Vous
pouvez placer les permissions additionnelles sur le matériel acheminé,
ajoutées par vous à un Travail Couvert pour lequel vous avez ou pouvez
donner les permissions de Droit d’Auteur (“copyright”) appropriées.

662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
brevet). « Accorder » une telle licence de brevet à une partie signifie
conclure un tel accord ou engagement à ne pas faire appliquer le brevet
à cette partie.

Si vous acheminez un Travail Couvert, dépendant en connaissance d’une
licence de brevet, et si le Source Correspondant du travail n’est pas
disponible à quiconque copie, sans frais et suivant les termes de cette
Licence, à travers un serveur réseau publiquement acessible ou tout
autre moyen immédiatement accessible, alors vous devez soit (1) rendre
la Source Correspondante ainsi disponible, soit (2) vous engager à vous
priver pour vous-même du bénéfice de la licence de brevet pour ce
travail particulier, soit (3) vous engager, d’une façon consistante
avec les obligations de cette Licence, à étendre la licence de brevet
aux Destinataires de ce travail. « Dépendant en connaissance » signifie
que vous avez effectivement connaissance que, selon la licence de







|







662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
brevet). « Accorder » une telle licence de brevet à une partie signifie
conclure un tel accord ou engagement à ne pas faire appliquer le brevet
à cette partie.

Si vous acheminez un Travail Couvert, dépendant en connaissance d’une
licence de brevet, et si le Source Correspondant du travail n’est pas
disponible à quiconque copie, sans frais et suivant les termes de cette
Licence, à travers un serveur réseau publiquement accessible ou tout
autre moyen immédiatement accessible, alors vous devez soit (1) rendre
la Source Correspondante ainsi disponible, soit (2) vous engager à vous
priver pour vous-même du bénéfice de la licence de brevet pour ce
travail particulier, soit (3) vous engager, d’une façon consistante
avec les obligations de cette Licence, à étendre la licence de brevet
aux Destinataires de ce travail. « Dépendant en connaissance » signifie
que vous avez effectivement connaissance que, selon la licence de
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726

Article 12. Non abandon de la liberté des autres.

Si des conditions vous sont imposées (que ce soit par décision
judiciaire, par un accord ou autrement) qui contredisent les conditions
de cette Licence, elles ne vous excusent pas des conditions de cette
Licence. Si vous ne pouvez pas acheminer un Travail Couvert de façon à
satisfaire simulténément vos obligations suivant cette Licence et
toutes autres obligations pertinentes, alors en conséquence vous ne
pouvez pas du tout l’acheminer. Par exemple, si vous avez un accord sur
des termes qui vous obligent à collecter pour le réacheminement des
royalties depuis ceux à qui vous acheminez le Programme, la seule façon
qui puisse vous permettre de satisfaire à la fois à ces termes et ceux
de cette Licence sera de vous abstenir entièrement d’acheminer le
Programme.







|







712
713
714
715
716
717
718
719
720
721
722
723
724
725
726

Article 12. Non abandon de la liberté des autres.

Si des conditions vous sont imposées (que ce soit par décision
judiciaire, par un accord ou autrement) qui contredisent les conditions
de cette Licence, elles ne vous excusent pas des conditions de cette
Licence. Si vous ne pouvez pas acheminer un Travail Couvert de façon à
satisfaire simultanément vos obligations suivant cette Licence et
toutes autres obligations pertinentes, alors en conséquence vous ne
pouvez pas du tout l’acheminer. Par exemple, si vous avez un accord sur
des termes qui vous obligent à collecter pour le réacheminement des
royalties depuis ceux à qui vous acheminez le Programme, la seule façon
qui puisse vous permettre de satisfaire à la fois à ces termes et ceux
de cette Licence sera de vous abstenir entièrement d’acheminer le
Programme.
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775

Si le Programme spécifie qu’un intermédiaire peut décider quelles
versions futures de la Licence Générale Publique GNU peut être
utilisée, la déclaration publique d’acceptation d’une version par cet
intermédiaire vous autorise à choisir cette version pour le Programme.

Des versions ultérieures de la licence peuvent vous donner des
permissions additionelles ou différentes. Cependant aucune obligation
additionelle n’est imposée à l’un des auteurs ou titulaires de Droit
d’Auteur du fait de votre choix de suivre une version ultérieure.


Article 15. Déclaration d’absence de garantie.

IL N’Y A AUCUNE GARANTIE POUR LE PROGRAMME, DANS LES LIMITES PERMISES
PAR LA LOI APPLICABLE. À MOINS QUE CELA NE SOIT ÉTABLI DIFFÉREMMENT PAR







|
|







760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775

Si le Programme spécifie qu’un intermédiaire peut décider quelles
versions futures de la Licence Générale Publique GNU peut être
utilisée, la déclaration publique d’acceptation d’une version par cet
intermédiaire vous autorise à choisir cette version pour le Programme.

Des versions ultérieures de la licence peuvent vous donner des
permissions additionnelles ou différentes. Cependant aucune obligation
additionnelle n’est imposée à l’un des auteurs ou titulaires de Droit
d’Auteur du fait de votre choix de suivre une version ultérieure.


Article 15. Déclaration d’absence de garantie.

IL N’Y A AUCUNE GARANTIE POUR LE PROGRAMME, DANS LES LIMITES PERMISES
PAR LA LOI APPLICABLE. À MOINS QUE CELA NE SOIT ÉTABLI DIFFÉREMMENT PAR

Modified THANKS.txt from [8029bfb1ad] to [8dd14e0ca5].

1
2
3
4
5
6
7
8
9
10
11
12
13
# THANKS

## Thanks to all who contributed to the project

László Németh (creator of Lightproof, from which Grammalecte forked),
Dominique Pelé (dominiko),
Jean-Luc T. (Tbj),
Pierre Choffardet (pitpit),


## Thanks to all those who supported us 
 
La Mouette [Association Pour une bureautique libre],





|







1
2
3
4
5
6
7
8
9
10
11
12
13
# THANKS

## Thanks to all who contributed to the project

László Németh (creator of Lightproof, from which Grammalecte forked),
Dominique Pellé (dominiko),
Jean-Luc T. (Tbj),
Pierre Choffardet (pitpit),


## Thanks to all those who supported us 
 
La Mouette [Association Pour une bureautique libre],
177
178
179
180
181
182
183

184
Vincent Meunier,
Willy Mangin,
Yann Asset,
Yann Brelière,
Yannick Geynet,
Yelin


et aux centaines de contributeurs qui ont préféré garder l’anonymat, ainsi qu’à la GPL3 de Richard Matthew Stallman.







>
|
177
178
179
180
181
182
183
184
185
Vincent Meunier,
Willy Mangin,
Yann Asset,
Yann Brelière,
Yannick Geynet,
Yelin

and to hundred of supporters who prefered to keep their anonymity,
and to the GPL3 by Richard Matthew Stallman.

Modified cli.py from [39244ea849] to [ed7458a4d3].

16
17
18
19
20
21
22



23
24
25
26
27
28
29
_EXAMPLE = "Quoi ? Racontes ! Racontes-moi ! Bon sangg, parles ! Oui. Il y a des menteur partout. " \
           "Je suit sidéré par la brutales arrogance de cette homme-là. Quelle salopard ! Un escrocs de la pire espece. " \
           "Quant sera t’il châtiés pour ses mensonge ?             Merde ! J’en aie marre."

_HELP = """
    /help                       /h      show this text
    ?word1 [word2] ...                  words analysis



    /lopt                       /lo     list options
    /+ option1 [option2] ...            activate grammar checking options
    /- option1 [option2] ...            deactivate grammar checking options
    /lrules [pattern]           /lr     list rules
    /--rule1 [rule2] ...                deactivate grammar checking rule
    /++rule1 [rule2] ...                reactivate grammar checking rule
    /quit                       /q      exit







>
>
>







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
_EXAMPLE = "Quoi ? Racontes ! Racontes-moi ! Bon sangg, parles ! Oui. Il y a des menteur partout. " \
           "Je suit sidéré par la brutales arrogance de cette homme-là. Quelle salopard ! Un escrocs de la pire espece. " \
           "Quant sera t’il châtiés pour ses mensonge ?             Merde ! J’en aie marre."

_HELP = """
    /help                       /h      show this text
    ?word1 [word2] ...                  words analysis
    !word                               suggestion
    >word                               draw path of word in the word graph
    =filter                             show all entries whose morphology fits to filter
    /lopt                       /lo     list options
    /+ option1 [option2] ...            activate grammar checking options
    /- option1 [option2] ...            deactivate grammar checking options
    /lrules [pattern]           /lr     list rules
    /--rule1 [rule2] ...                deactivate grammar checking rule
    /++rule1 [rule2] ...                reactivate grammar checking rule
    /quit                       /q      exit
196
197
198
199
200
201
202
203
204
205









206
207
208
209
210
211
212
        # pseudo-console
        sInputText = "\n~==========~ Enter your text [/h /q] ~==========~\n"
        sText = _getText(sInputText)
        while True:
            if sText.startswith("?"):
                for sWord in sText[1:].strip().split():
                    if sWord:
                        echo("* {}".format(sWord))
                        for sMorph in oDict.getMorph(sWord):
                            echo("  {:<32} {}".format(sMorph, oLexGraphe.formatTags(sMorph)))









            elif sText.startswith("/+ "):
                gce.setOptions({ opt:True  for opt in sText[3:].strip().split()  if opt in gce.getOptions() })
                echo("done")
            elif sText.startswith("/- "):
                gce.setOptions({ opt:False  for opt in sText[3:].strip().split()  if opt in gce.getOptions() })
                echo("done")
            elif sText.startswith("/-- "):







|


>
>
>
>
>
>
>
>
>







199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
        # pseudo-console
        sInputText = "\n~==========~ Enter your text [/h /q] ~==========~\n"
        sText = _getText(sInputText)
        while True:
            if sText.startswith("?"):
                for sWord in sText[1:].strip().split():
                    if sWord:
                        echo("* " + sWord)
                        for sMorph in oDict.getMorph(sWord):
                            echo("  {:<32} {}".format(sMorph, oLexGraphe.formatTags(sMorph)))
            elif sText.startswith("!"):
                for sWord in sText[1:].strip().split():
                    if sWord:
                        echo(" | ".join(oDict.suggest(sWord)))
            elif sText.startswith(">"):
                oDict.drawPath(sText[1:].strip())
            elif sText.startswith("="):
                for sRes in oDict.select(sText[1:].strip()):
                    echo(sRes)
            elif sText.startswith("/+ "):
                gce.setOptions({ opt:True  for opt in sText[3:].strip().split()  if opt in gce.getOptions() })
                echo("done")
            elif sText.startswith("/- "):
                gce.setOptions({ opt:False  for opt in sText[3:].strip().split()  if opt in gce.getOptions() })
                echo("done")
            elif sText.startswith("/-- "):

Modified compile_rules.py from [20229cb495] to [7fa2e820bf].

1
2
3
4
5
6
7


8
9
10
11
12
13
14

import re
import sys
import traceback
import copy
import json
from distutils import file_util




dDEF = {}
lFUNCTIONS = []

aRULESET = set()     # set of rule-ids to check if there is several rules with the same id
nRULEWITHOUTNAME = 0




<


>
>







1
2
3
4

5
6
7
8
9
10
11
12
13
14
15

import re
import sys
import traceback

import json
from distutils import file_util

import compile_rules_js_convert as jsconv


dDEF = {}
lFUNCTIONS = []

aRULESET = set()     # set of rule-ids to check if there is several rules with the same id
nRULEWITHOUTNAME = 0
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
    s = re.sub(r"isEndOfNG\(\s*\)", 'isEndOfNG(dDA, s[m.end():], m.end())', s)              # isEndOfNG(s)
    s = re.sub(r"isNextNotCOD\(\s*\)", 'isNextNotCOD(dDA, s[m.end():], m.end())', s)        # isNextNotCOD(s)
    s = re.sub(r"isNextVerb\(\s*\)", 'isNextVerb(dDA, s[m.end():], m.end())', s)            # isNextVerb(s)
    s = re.sub(r"\bspell *[(]", '_oDict.isValid(', s)
    s = re.sub(r"[\\](\d+)", 'm.group(\\1)', s)
    return s


def py2js (sCode):
    "convert Python code to JavaScript code"
    # Python 2.x unicode strings
    sCode = re.sub('\\b[ur]"', '"', sCode)
    sCode = re.sub("\\b[ur]'", "'", sCode)
    # operators
    sCode = sCode.replace(" and ", " && ")
    sCode = sCode.replace(" or ", " || ")
    sCode = re.sub("\\bnot\\b", "!", sCode)
    sCode = re.sub("(.+) if (.+) else (.+)", "(\\2) ? \\1 : \\3", sCode)
    # boolean
    sCode = sCode.replace("False", "false")
    sCode = sCode.replace("True", "true")
    sCode = sCode.replace("bool", "Boolean")
    # methods
    sCode = sCode.replace(".__len__()", ".length")
    sCode = sCode.replace(".endswith", ".endsWith")
    sCode = sCode.replace(".find", ".indexOf")
    sCode = sCode.replace(".startswith", ".startsWith")
    sCode = sCode.replace(".lower", ".toLowerCase")
    sCode = sCode.replace(".upper", ".toUpperCase")
    sCode = sCode.replace(".isdigit", "._isDigit")
    sCode = sCode.replace(".isupper", "._isUpperCase")
    sCode = sCode.replace(".islower", "._isLowerCase")
    sCode = sCode.replace(".istitle", "._isTitle")
    sCode = sCode.replace(".capitalize", "._toCapitalize")
    sCode = sCode.replace(".strip", "._trim")
    sCode = sCode.replace(".lstrip", "._trimLeft")
    sCode = sCode.replace(".rstrip", "._trimRight")
    sCode = sCode.replace('.replace("."', ".replace(/\./g")
    sCode = sCode.replace('.replace("..."', ".replace(/\.\.\./g")
    sCode = re.sub('.replace\("([^"]+)" ?,', ".replace(/\\1/g,", sCode)
    # regex
    sCode = re.sub('re.search\("([^"]+)", *(m.group\(\\d\))\)', "(\\2.search(/\\1/) >= 0)", sCode)
    sCode = re.sub(".search\\(/\\(\\?i\\)([^/]+)/\\) >= 0\\)", ".search(/\\1/i) >= 0)", sCode)
    sCode = re.sub('(look\\(sx?[][.a-z:()]*), "\\(\\?i\\)([^"]+)"', "\\1, /\\2/i", sCode)
    sCode = re.sub('(look\\(sx?[][.a-z:()]*), "([^"]+)"', "\\1, /\\2/", sCode)
    sCode = re.sub('(look_chk1\\(dDA, sx?[][.a-z:()]*, [0-9a-z.()]+), "\\(\\?i\\)([^"]+)"', "\\1, /\\2/i", sCode)
    sCode = re.sub('(look_chk1\\(dDA, sx?[][.a-z:()]*, [0-9a-z.()]+), "([^"]+)"', "\\1, /\\2/i", sCode)
    sCode = sCode.replace("(?<!-)", "")  # todo
    # slices
    sCode = sCode.replace("[:m.start()]", ".slice(0,m.index)")
    sCode = sCode.replace("[m.end():]", ".slice(m.end[0])")
    sCode = sCode.replace("[m.start():m.end()]", ".slice(m.index, m.end[0])")
    sCode = re.sub("\\[(-?\\d+):(-?\\d+)\\]", ".slice(\\1,\\2)", sCode)
    sCode = re.sub("\\[(-?\\d+):\\]", ".slice(\\1)", sCode)
    sCode = re.sub("\\[:(-?\\d+)\\]", ".slice(0,\\1)", sCode)
    # regex matches
    sCode = sCode.replace(".end()", ".end[0]")
    sCode = sCode.replace(".start()", ".index")
    sCode = sCode.replace("m.group()", "m[0]")
    sCode = re.sub("\\.start\\((\\d+)\\)", ".start[\\1]", sCode)
    sCode = re.sub("m\\.group\\((\\d+)\\)", "m[\\1]", sCode)
    # tuples -> lists
    sCode = re.sub("\((m\.start\[\\d+\], m\[\\d+\])\)", "[\\1]", sCode)
    # regex
    sCode = sCode.replace("\w[\w-]+", "[a-zA-Zà-öÀ-Ö0-9_ø-ÿØ-ßĀ-ʯfi-st][a-zA-Zà-öÀ-Ö0-9_ø-ÿØ-ßĀ-ʯfi-st-]+")
    sCode = sCode.replace(r"/\w/", "/[a-zA-Zà-öÀ-Ö0-9_ø-ÿØ-ßĀ-ʯfi-st]/")
    sCode = sCode.replace(r"[\w-]", "[a-zA-Zà-öÀ-Ö0-9_ø-ÿØ-ßĀ-ʯfi-st-]")
    sCode = sCode.replace(r"[\w,]", "[a-zA-Zà-öÀ-Ö0-9_ø-ÿØ-ßĀ-ʯfi-st,]")
    return sCode


def uppercase (s, sLang):
    "(flag i is not enough): converts regex to uppercase regex: 'foo' becomes '[Ff][Oo][Oo]', but 'Bar' becomes 'B[Aa][Rr]'."
    sUp = ""
    nState = 0
    for i in range(0, len(s)):
        c = s[i]







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







56
57
58
59
60
61
62































































63
64
65
66
67
68
69
    s = re.sub(r"isEndOfNG\(\s*\)", 'isEndOfNG(dDA, s[m.end():], m.end())', s)              # isEndOfNG(s)
    s = re.sub(r"isNextNotCOD\(\s*\)", 'isNextNotCOD(dDA, s[m.end():], m.end())', s)        # isNextNotCOD(s)
    s = re.sub(r"isNextVerb\(\s*\)", 'isNextVerb(dDA, s[m.end():], m.end())', s)            # isNextVerb(s)
    s = re.sub(r"\bspell *[(]", '_oDict.isValid(', s)
    s = re.sub(r"[\\](\d+)", 'm.group(\\1)', s)
    return s

































































def uppercase (s, sLang):
    "(flag i is not enough): converts regex to uppercase regex: 'foo' becomes '[Ff][Oo][Oo]', but 'Bar' becomes 'B[Aa][Rr]'."
    sUp = ""
    nState = 0
    for i in range(0, len(s)):
        c = s[i]
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
        return None
    sRegex = s[:i].strip()
    s = s[i+4:]
    
    # JS groups positioning codes
    m = re.search("@@\\S+", sRegex)
    if m:
        tGroups = groupsPositioningCodeToList(sRegex[m.start()+2:])
        sRegex = sRegex[:m.start()].strip()
    # JS regex
    m = re.search("<js>.+</js>i?", sRegex)
    if m:
        dJSREGEXES[sLineId] = m.group(0)
        sRegex = sRegex[:m.start()].strip()
    if "<js>" in sRegex or "</js>" in sRegex:







|







151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
        return None
    sRegex = s[:i].strip()
    s = s[i+4:]
    
    # JS groups positioning codes
    m = re.search("@@\\S+", sRegex)
    if m:
        tGroups = jsconv.groupsPositioningCodeToList(sRegex[m.start()+2:])
        sRegex = sRegex[:m.start()].strip()
    # JS regex
    m = re.search("<js>.+</js>i?", sRegex)
    if m:
        dJSREGEXES[sLineId] = m.group(0)
        sRegex = sRegex[:m.start()].strip()
    if "<js>" in sRegex or "</js>" in sRegex:
322
323
324
325
326
327
328





329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
    
    #### ACTION
    sAction = sAction[m.end():].strip()
    cAction = m.group(1)
    if cAction == "-":
        ## error
        iMsg = sAction.find(" # ")





        sMsg = sAction[iMsg+3:].strip()
        sAction = sAction[:iMsg].strip()
        sURL = ""
        mURL = re.search("[|] *(https?://.*)", sMsg)
        if mURL:
            sURL = mURL.group(1).strip()
            sMsg = sMsg[:mURL.start(0)].strip()
        if sMsg[0:1] == "=":
            sMsg = prepareFunction(sMsg[1:])
            lFUNCTIONS.append(("m_"+sIdAction, sMsg))
            for x in re.finditer("group[(](\d+)[)]", sMsg):
                if int(x.group(1)) > nGroup:
                    print("# Error in groups in message at line " + sIdAction + " ("+str(nGroup)+" groups only)")
            sMsg = "=m_"+sIdAction
        else:
            for x in re.finditer(r"\\(\d+)", sMsg):
                if int(x.group(1)) > nGroup:
                    print("# Error in groups in message at line " + sIdAction + " ("+str(nGroup)+" groups only)")
            if re.search("[.]\\w+[(]", sMsg):
                print("# Error in message at line " + sIdAction + ":  This message looks like code. Line should begin with =")
            
    if sAction[0:1] == "=" or cAction == "=":
        if "define" in sAction and not re.search(r"define\(\\\d+ *, *\[.*\] *\)", sAction):
            print("# Error in action at line " + sIdAction + ": second argument for define must be a list of strings")
        sAction = prepareFunction(sAction)
        sAction = sAction.replace("m.group(i[4])", "m.group("+str(iGroup)+")")
        for x in re.finditer("group[(](\d+)[)]", sAction):
            if int(x.group(1)) > nGroup:
                print("# Error in groups in replacement at line " + sIdAction + " ("+str(nGroup)+" groups only)")
    else:
        for x in re.finditer(r"\\(\d+)", sAction):
            if int(x.group(1)) > nGroup:
                print("# Error in groups in replacement at line " + sIdAction + " ("+str(nGroup)+" groups only)")
        if re.search("[.]\\w+[(]", sAction):
            print("# Error in action at line " + sIdAction + ":  This action looks like code. Line should begin with =")

    if cAction == "-":
        ## error detected --> suggestion
        if not sAction:
            print("# Error in action at line " + sIdAction + ":  This action is empty.")
        if sAction[0:1] == "=":







>
>
>
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|













|







260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
    
    #### ACTION
    sAction = sAction[m.end():].strip()
    cAction = m.group(1)
    if cAction == "-":
        ## error
        iMsg = sAction.find(" # ")
        if iMsg == -1:
            sMsg = "# Error. Error message not found."
            sURL = ""
            print(sMsg + " Action id: " + sIdAction)
        else:
            sMsg = sAction[iMsg+3:].strip()
            sAction = sAction[:iMsg].strip()
            sURL = ""
            mURL = re.search("[|] *(https?://.*)", sMsg)
            if mURL:
                sURL = mURL.group(1).strip()
                sMsg = sMsg[:mURL.start(0)].strip()
            if sMsg[0:1] == "=":
                sMsg = prepareFunction(sMsg[1:])
                lFUNCTIONS.append(("m_"+sIdAction, sMsg))
                for x in re.finditer("group[(](\d+)[)]", sMsg):
                    if int(x.group(1)) > nGroup:
                        print("# Error in groups in message at line " + sIdAction + " ("+str(nGroup)+" groups only)")
                sMsg = "=m_"+sIdAction
            else:
                for x in re.finditer(r"\\(\d+)", sMsg):
                    if int(x.group(1)) > nGroup:
                        print("# Error in groups in message at line " + sIdAction + " ("+str(nGroup)+" groups only)")
                if re.search("[.]\\w+[(]", sMsg):
                    print("# Error in message at line " + sIdAction + ":  This message looks like code. Line should begin with =")
            
    if sAction[0:1] == "=" or cAction == "=":
        if "define" in sAction and not re.search(r"define\(\\\d+ *, *\[.*\] *\)", sAction):
            print("# Error in action at line " + sIdAction + ": second argument for define must be a list of strings")
        sAction = prepareFunction(sAction)
        sAction = sAction.replace("m.group(i[4])", "m.group("+str(iGroup)+")")
        for x in re.finditer("group[(](\d+)[)]", sAction):
            if int(x.group(1)) > nGroup:
                print("# Error in groups in replacement at line " + sIdAction + " ("+str(nGroup)+" groups only)")
    else:
        for x in re.finditer(r"\\(\d+)", sAction):
            if int(x.group(1)) > nGroup:
                print("# Error in groups in replacement at line " + sIdAction + " ("+str(nGroup)+" groups only)")
        if re.search("[.]\\w+[(]|sugg\\w+[(]", sAction):
            print("# Error in action at line " + sIdAction + ":  This action looks like code. Line should begin with =")

    if cAction == "-":
        ## error detected --> suggestion
        if not sAction:
            print("# Error in action at line " + sIdAction + ":  This action is empty.")
        if sAction[0:1] == "=":
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
    elif cAction == ">":
        ## no action, break loop if condition is False
        return [sCondition, cAction, ""]
    else:
        print("# Unknown action at line " + sIdAction)
        return None


def regex2js (sRegex):
    "converts Python regex to JS regex and returns JS regex and list of negative lookbefore assertions"
    #   Latin letters: http://unicode-table.com/fr/
    #   0-9  and  _
    #   A-Z
    #   a-z
    #   À-Ö     00C0-00D6   (upper case)
    #   Ø-ß     00D8-00DF   (upper case)
    #   à-ö     00E0-00F6   (lower case)
    #   ø-ÿ     00F8-00FF   (lower case)
    #   Ā-ʯ     0100-02AF   (mixed)
    #   -> a-zA-Zà-öÀ-Ö0-9_ø-ÿØ-ßĀ-ʯ
    bCaseInsensitive = False
    if "(?i)" in sRegex:
        sRegex = sRegex.replace("(?i)", "")
        bCaseInsensitive = True
    lNegLookBeforeRegex = []
    if sWORDLIMITLEFT in sRegex:
        sRegex = sRegex.replace(sWORDLIMITLEFT, "")
        lNegLookBeforeRegex = ["[a-zA-Zà-öÀ-Ö0-9_ø-ÿØ-ßĀ-ʯ.,–-]$"]
    sRegex = sRegex.replace("[\\w", "[a-zA-Zà-öÀ-Ö0-9_ø-ÿØ-ßĀ-ʯ")
    sRegex = sRegex.replace("\\w", "[a-zA-Zà-öÀ-Ö0-9_ø-ÿØ-ßĀ-ʯ]")
    sRegex = sRegex.replace("[.]", r"\.")
    if not sRegex.startswith("<js>"):
        sRegex = sRegex.replace("/", r"\/")
    m = re.search(r"\(\?<!([^()]+)\)", sRegex)  # Negative lookbefore assertion should always be at the beginning of regex
    if m:
        lNegLookBeforeRegex.append(m.group(1)+"$")
        sRegex = sRegex.replace(m.group(0), "")
    if "(?<" in sRegex:
        print("# Warning. Lookbefore assertion not changed in:\n  ")
        print(sRegex)
    if sRegex.startswith("<js>"):
        sRegex = sRegex.replace('<js>', '/').replace('</js>i', '/ig').replace('</js>', '/g')
    else:
        sRegex = "/" + sRegex + "/g"
    if bCaseInsensitive and not sRegex.endswith("/ig"):
        sRegex = sRegex + "i"
    if not lNegLookBeforeRegex:
        lNegLookBeforeRegex = None
    return (sRegex, lNegLookBeforeRegex)


def pyRuleToJS (lRule):
    lRuleJS = copy.deepcopy(lRule)
    del lRule[-1] # tGroups positioning codes are useless for Python
    # error messages
    for aAction in lRuleJS[6]:
        if aAction[1] == "-":
            aAction[4] = aAction[4].replace("« ", "«&nbsp;").replace(" »", "&nbsp;»")
    # js regexes
    lRuleJS[1], lNegLookBehindRegex = regex2js( dJSREGEXES.get(lRuleJS[3], lRuleJS[1]) )
    lRuleJS.append(lNegLookBehindRegex)
    return lRuleJS


def writeRulesToJSArray (lRules):
    sArray = "[\n"
    for sOption, aRuleGroup in lRules:
        sArray += '  ["' + sOption + '", [\n'  if sOption  else  "  [false, [\n"
        for sRegex, bCaseInsensitive, sLineId, sRuleId, nPriority, lActions, aGroups, aNegLookBehindRegex in aRuleGroup:
            sArray += '    [' + sRegex + ", "
            sArray += "true, " if bCaseInsensitive  else "false, "
            sArray += '"' + sLineId + '", '
            sArray += '"' + sRuleId + '", '
            sArray += str(nPriority) + ", "
            sArray += json.dumps(lActions, ensure_ascii=False) + ", "
            sArray += json.dumps(aGroups, ensure_ascii=False) + ", "
            sArray += json.dumps(aNegLookBehindRegex, ensure_ascii=False) + "],\n"
        sArray += "  ]],\n"
    sArray += "]"
    return sArray


def groupsPositioningCodeToList (sGroupsPositioningCode):
    if not sGroupsPositioningCode:
        return None
    return [ int(sCode)  if sCode.isdigit() or (sCode[0:1] == "-" and sCode[1:].isdigit())  else sCode \
             for sCode in sGroupsPositioningCode.split(",") ]


def _calcRulesStats (lRules):
    d = {'=':0, '~': 0, '-': 0, '>': 0}
    for aRule in lRules:
        for aAction in aRule[6]:
            d[aAction[1]] = d[aAction[1]] + 1
    return (d, len(lRules))







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







339
340
341
342
343
344
345

















































































346
347
348
349
350
351
352
    elif cAction == ">":
        ## no action, break loop if condition is False
        return [sCondition, cAction, ""]
    else:
        print("# Unknown action at line " + sIdAction)
        return None



















































































def _calcRulesStats (lRules):
    d = {'=':0, '~': 0, '-': 0, '>': 0}
    for aRule in lRules:
        for aAction in aRule[6]:
            d[aAction[1]] = d[aAction[1]] + 1
    return (d, len(lRules))
514
515
516
517
518
519
520

521
522
523
524
525
526
527
    lFinal.append([sOption, lTemp])
    return lFinal


def prepareOptions (lOptionLines):
    "returns a dictionary with data about options"
    sLang = ""

    lStructOpt = []
    lOpt = []
    dOptLabel = {}
    dOptPriority = {}
    for sLine in lOptionLines:
        sLine = sLine.strip()
        if sLine.startswith("OPTGROUP/"):







>







376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
    lFinal.append([sOption, lTemp])
    return lFinal


def prepareOptions (lOptionLines):
    "returns a dictionary with data about options"
    sLang = ""
    sDefaultUILang = ""
    lStructOpt = []
    lOpt = []
    dOptLabel = {}
    dOptPriority = {}
    for sLine in lOptionLines:
        sLine = sLine.strip()
        if sLine.startswith("OPTGROUP/"):
536
537
538
539
540
541
542



543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
        elif sLine.startswith("OPTPRIORITY/"):
            m = re.match("OPTPRIORITY/([a-z0-9]+): *([0-9])$", sLine)
            dOptPriority[m.group(1)] = int(m.group(2))
        elif sLine.startswith("OPTLANG/"):
            m = re.match("OPTLANG/([a-z][a-z](?:_[A-Z][A-Z]|)):(.+)$", sLine)
            sLang = m.group(1)[:2]
            dOptLabel[sLang] = { "__optiontitle__": m.group(2).strip() }



        elif sLine.startswith("OPTLABEL/"):
            m = re.match("OPTLABEL/([a-z0-9]+):(.+)$", sLine)
            dOptLabel[sLang][m.group(1)] = list(map(str.strip, m.group(2).split("|")))  if "|" in m.group(2)  else  [m.group(2).strip(), ""]
        else:
            print("# Error. Wrong option line in:\n  ")
            print(sLine)
    print("  options defined for: " + ", ".join([ t[0] for t in lOpt ]))
    dOptions = { "lStructOpt": lStructOpt, "dOptLabel": dOptLabel }
    dOptions.update({ "dOpt"+k: v  for k, v in lOpt })
    return dOptions, dOptPriority


def printBookmark (nLevel, sComment, nLine):
    print("  {:>6}:  {}".format(nLine, "  " * nLevel + sComment))








>
>
>







|







399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
        elif sLine.startswith("OPTPRIORITY/"):
            m = re.match("OPTPRIORITY/([a-z0-9]+): *([0-9])$", sLine)
            dOptPriority[m.group(1)] = int(m.group(2))
        elif sLine.startswith("OPTLANG/"):
            m = re.match("OPTLANG/([a-z][a-z](?:_[A-Z][A-Z]|)):(.+)$", sLine)
            sLang = m.group(1)[:2]
            dOptLabel[sLang] = { "__optiontitle__": m.group(2).strip() }
        elif sLine.startswith("OPTDEFAULTUILANG:"):
            m = re.match("OPTDEFAULTUILANG: *([a-z][a-z](?:_[A-Z][A-Z]|))$", sLine)
            sDefaultUILang = m.group(1)[:2]
        elif sLine.startswith("OPTLABEL/"):
            m = re.match("OPTLABEL/([a-z0-9]+):(.+)$", sLine)
            dOptLabel[sLang][m.group(1)] = list(map(str.strip, m.group(2).split("|")))  if "|" in m.group(2)  else  [m.group(2).strip(), ""]
        else:
            print("# Error. Wrong option line in:\n  ")
            print(sLine)
    print("  options defined for: " + ", ".join([ t[0] for t in lOpt ]))
    dOptions = { "lStructOpt": lStructOpt, "dOptLabel": dOptLabel, "sDefaultUILang": sDefaultUILang }
    dOptions.update({ "dOpt"+k: v  for k, v in lOpt })
    return dOptions, dOptPriority


def printBookmark (nLevel, sComment, nLine):
    print("  {:>6}:  {}".format(nLine, "  " * nLevel + sComment))

582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
            else:
                print("Error in definition: ", end="")
                print(sLine.strip())
        elif sLine.startswith("TEST:"):
            lTest.append("{:<8}".format(i) + "  " + sLine[5:].strip())
        elif sLine.startswith("TODO:"):
            pass
        elif sLine.startswith(("OPTGROUP/", "OPTSOFTWARE:", "OPT/", "OPTLANG/", "OPTLABEL/", "OPTPRIORITY/")):
            lOpt.append(sLine)
        elif re.match("[  \t]*$", sLine):
            pass
        elif sLine.startswith("!!"):
            m = zBookmark.search(sLine)
            nExMk = len(m.group(0))
            if sLine[nExMk:].strip():







|







448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
            else:
                print("Error in definition: ", end="")
                print(sLine.strip())
        elif sLine.startswith("TEST:"):
            lTest.append("{:<8}".format(i) + "  " + sLine[5:].strip())
        elif sLine.startswith("TODO:"):
            pass
        elif sLine.startswith(("OPTGROUP/", "OPTSOFTWARE:", "OPT/", "OPTLANG/", "OPTDEFAULTUILANG:", "OPTLABEL/", "OPTPRIORITY/")):
            lOpt.append(sLine)
        elif re.match("[  \t]*$", sLine):
            pass
        elif sLine.startswith("!!"):
            m = zBookmark.search(sLine)
            nExMk = len(m.group(0))
            if sLine[nExMk:].strip():
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
            if sLine == "[++]":
                bParagraph = False
            else:
                aRule = createRule(sLine, nLine, sLang, bParagraph, dOptPriority)
                if aRule:
                    if bParagraph:
                        lParagraphRules.append(aRule)
                        lParagraphRulesJS.append(pyRuleToJS(aRule))
                    else:
                        lSentenceRules.append(aRule)
                        lSentenceRulesJS.append(pyRuleToJS(aRule))

    # creating file with all functions callable by rules
    print("  creating callables...")
    sPyCallables = "# generated code, do not edit\n"
    sJSCallables = "// generated code, do not edit\nconst oEvalFunc = {\n"
    for sFuncName, sReturn in lFUNCTIONS:
        cType = sFuncName[0:1]







|


|







492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
            if sLine == "[++]":
                bParagraph = False
            else:
                aRule = createRule(sLine, nLine, sLang, bParagraph, dOptPriority)
                if aRule:
                    if bParagraph:
                        lParagraphRules.append(aRule)
                        lParagraphRulesJS.append(jsconv.pyRuleToJS(aRule, dJSREGEXES, sWORDLIMITLEFT))
                    else:
                        lSentenceRules.append(aRule)
                        lSentenceRulesJS.append(jsconv.pyRuleToJS(aRule, dJSREGEXES, sWORDLIMITLEFT))

    # creating file with all functions callable by rules
    print("  creating callables...")
    sPyCallables = "# generated code, do not edit\n"
    sJSCallables = "// generated code, do not edit\nconst oEvalFunc = {\n"
    for sFuncName, sReturn in lFUNCTIONS:
        cType = sFuncName[0:1]
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
            sParams = "s, m, dDA"
        else:
            print("# Unknown function type in [" + sFuncName + "]")
            continue
        sPyCallables += "def {} ({}):\n".format(sFuncName, sParams)
        sPyCallables += "    return " + sReturn + "\n"
        sJSCallables += "    {}: function ({})".format(sFuncName, sParams) + " {\n"
        sJSCallables += "        return " + py2js(sReturn) + ";\n"
        sJSCallables += "    },\n"
    sJSCallables += "}\n"

    displayStats(lParagraphRules, lSentenceRules)

    print("Unnamed rules: " + str(nRULEWITHOUTNAME))

    d = { "callables": sPyCallables,
          "callablesJS": sJSCallables,
          "gctests": sGCTests,
          "gctestsJS": sGCTestsJS,
          "paragraph_rules": mergeRulesByOption(lParagraphRules),
          "sentence_rules": mergeRulesByOption(lSentenceRules),
          "paragraph_rules_JS": writeRulesToJSArray(mergeRulesByOption(lParagraphRulesJS)),
          "sentence_rules_JS": writeRulesToJSArray(mergeRulesByOption(lSentenceRulesJS)) }
    d.update(dOptions)

    return d







|













|
|



519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
            sParams = "s, m, dDA"
        else:
            print("# Unknown function type in [" + sFuncName + "]")
            continue
        sPyCallables += "def {} ({}):\n".format(sFuncName, sParams)
        sPyCallables += "    return " + sReturn + "\n"
        sJSCallables += "    {}: function ({})".format(sFuncName, sParams) + " {\n"
        sJSCallables += "        return " + jsconv.py2js(sReturn) + ";\n"
        sJSCallables += "    },\n"
    sJSCallables += "}\n"

    displayStats(lParagraphRules, lSentenceRules)

    print("Unnamed rules: " + str(nRULEWITHOUTNAME))

    d = { "callables": sPyCallables,
          "callablesJS": sJSCallables,
          "gctests": sGCTests,
          "gctestsJS": sGCTestsJS,
          "paragraph_rules": mergeRulesByOption(lParagraphRules),
          "sentence_rules": mergeRulesByOption(lSentenceRules),
          "paragraph_rules_JS": jsconv.writeRulesToJSArray(mergeRulesByOption(lParagraphRulesJS)),
          "sentence_rules_JS": jsconv.writeRulesToJSArray(mergeRulesByOption(lSentenceRulesJS)) }
    d.update(dOptions)

    return d

Added compile_rules_js_convert.py version [e1dbc7ea44].













































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# Convert Python code to JavaScript code

import copy
import re
import json


def py2js (sCode):
    "convert Python code to JavaScript code"
    # Python 2.x unicode strings
    sCode = re.sub('\\b[ur]"', '"', sCode)
    sCode = re.sub("\\b[ur]'", "'", sCode)
    # operators
    sCode = sCode.replace(" and ", " && ")
    sCode = sCode.replace(" or ", " || ")
    sCode = re.sub("\\bnot\\b", "!", sCode)
    sCode = re.sub("(.+) if (.+) else (.+)", "(\\2) ? \\1 : \\3", sCode)
    # boolean
    sCode = sCode.replace("False", "false")
    sCode = sCode.replace("True", "true")
    sCode = sCode.replace("bool", "Boolean")
    # methods
    sCode = sCode.replace(".__len__()", ".length")
    sCode = sCode.replace(".endswith", ".endsWith")
    sCode = sCode.replace(".find", ".indexOf")
    sCode = sCode.replace(".startswith", ".startsWith")
    sCode = sCode.replace(".lower", ".toLowerCase")
    sCode = sCode.replace(".upper", ".toUpperCase")
    sCode = sCode.replace(".isdigit", ".gl_isDigit")
    sCode = sCode.replace(".isupper", ".gl_isUpperCase")
    sCode = sCode.replace(".islower", ".gl_isLowerCase")
    sCode = sCode.replace(".istitle", ".gl_isTitle")
    sCode = sCode.replace(".capitalize", ".gl_toCapitalize")
    sCode = sCode.replace(".strip", ".gl_trim")
    sCode = sCode.replace(".lstrip", ".gl_trimLeft")
    sCode = sCode.replace(".rstrip", ".gl_trimRight")
    sCode = sCode.replace('.replace("."', ".replace(/\./g")
    sCode = sCode.replace('.replace("..."', ".replace(/\.\.\./g")
    sCode = re.sub('.replace\("([^"]+)" ?,', ".replace(/\\1/g,", sCode)
    # regex
    sCode = re.sub('re.search\("([^"]+)", *(m.group\(\\d\))\)', "(\\2.search(/\\1/) >= 0)", sCode)
    sCode = re.sub(".search\\(/\\(\\?i\\)([^/]+)/\\) >= 0\\)", ".search(/\\1/i) >= 0)", sCode)
    sCode = re.sub('(look\\(sx?[][.a-z:()]*), "\\(\\?i\\)([^"]+)"', "\\1, /\\2/i", sCode)
    sCode = re.sub('(look\\(sx?[][.a-z:()]*), "([^"]+)"', "\\1, /\\2/", sCode)
    sCode = re.sub('(look_chk1\\(dDA, sx?[][.a-z:()]*, [0-9a-z.()]+), "\\(\\?i\\)([^"]+)"', "\\1, /\\2/i", sCode)
    sCode = re.sub('(look_chk1\\(dDA, sx?[][.a-z:()]*, [0-9a-z.()]+), "([^"]+)"', "\\1, /\\2/i", sCode)
    sCode = sCode.replace("(?<!-)", "")  # todo
    # slices
    sCode = sCode.replace("[:m.start()]", ".slice(0,m.index)")
    sCode = sCode.replace("[m.end():]", ".slice(m.end[0])")
    sCode = sCode.replace("[m.start():m.end()]", ".slice(m.index, m.end[0])")
    sCode = re.sub("\\[(-?\\d+):(-?\\d+)\\]", ".slice(\\1,\\2)", sCode)
    sCode = re.sub("\\[(-?\\d+):\\]", ".slice(\\1)", sCode)
    sCode = re.sub("\\[:(-?\\d+)\\]", ".slice(0,\\1)", sCode)
    # regex matches
    sCode = sCode.replace(".end()", ".end[0]")
    sCode = sCode.replace(".start()", ".index")
    sCode = sCode.replace("m.group()", "m[0]")
    sCode = re.sub("\\.start\\((\\d+)\\)", ".start[\\1]", sCode)
    sCode = re.sub("m\\.group\\((\\d+)\\)", "m[\\1]", sCode)
    # tuples -> lists
    sCode = re.sub("\((m\.start\[\\d+\], m\[\\d+\])\)", "[\\1]", sCode)
    # regex
    sCode = sCode.replace("\w[\w-]+", "[a-zA-Zà-öÀ-Ö0-9_ø-ÿØ-ßĀ-ʯfi-st][a-zA-Zà-öÀ-Ö0-9_ø-ÿØ-ßĀ-ʯfi-st-]+")
    sCode = sCode.replace(r"/\w/", "/[a-zA-Zà-öÀ-Ö0-9_ø-ÿØ-ßĀ-ʯfi-st]/")
    sCode = sCode.replace(r"[\w-]", "[a-zA-Zà-öÀ-Ö0-9_ø-ÿØ-ßĀ-ʯfi-st-]")
    sCode = sCode.replace(r"[\w,]", "[a-zA-Zà-öÀ-Ö0-9_ø-ÿØ-ßĀ-ʯfi-st,]")
    return sCode


def regex2js (sRegex, sWORDLIMITLEFT):
    "converts Python regex to JS regex and returns JS regex and list of negative lookbefore assertions"
    #   Latin letters: http://unicode-table.com/fr/
    #   0-9  and  _
    #   A-Z
    #   a-z
    #   À-Ö     00C0-00D6   (upper case)
    #   Ø-ß     00D8-00DF   (upper case)
    #   à-ö     00E0-00F6   (lower case)
    #   ø-ÿ     00F8-00FF   (lower case)
    #   Ā-ʯ     0100-02AF   (mixed)
    #   -> a-zA-Zà-öÀ-Ö0-9_ø-ÿØ-ßĀ-ʯ
    bCaseInsensitive = False
    if "(?i)" in sRegex:
        sRegex = sRegex.replace("(?i)", "")
        bCaseInsensitive = True
    lNegLookBeforeRegex = []
    if sWORDLIMITLEFT in sRegex:
        sRegex = sRegex.replace(sWORDLIMITLEFT, "")
        lNegLookBeforeRegex = ["[a-zA-Zà-öÀ-Ö0-9_ø-ÿØ-ßĀ-ʯ.,–-]$"]
    sRegex = sRegex.replace("[\\w", "[a-zA-Zà-öÀ-Ö0-9_ø-ÿØ-ßĀ-ʯ")
    sRegex = sRegex.replace("\\w", "[a-zA-Zà-öÀ-Ö0-9_ø-ÿØ-ßĀ-ʯ]")
    sRegex = sRegex.replace("[.]", r"\.")
    if not sRegex.startswith("<js>"):
        sRegex = sRegex.replace("/", r"\/")
    m = re.search(r"\(\?<!([^()]+)\)", sRegex)  # Negative lookbefore assertion should always be at the beginning of regex
    if m:
        lNegLookBeforeRegex.append(m.group(1)+"$")
        sRegex = sRegex.replace(m.group(0), "")
    if "(?<" in sRegex:
        print("# Warning. Lookbefore assertion not changed in:\n  ")
        print(sRegex)
    if sRegex.startswith("<js>"):
        sRegex = sRegex.replace('<js>', '/').replace('</js>i', '/ig').replace('</js>', '/g')
    else:
        sRegex = "/" + sRegex + "/g"
    if bCaseInsensitive and not sRegex.endswith("/ig"):
        sRegex = sRegex + "i"
    if not lNegLookBeforeRegex:
        lNegLookBeforeRegex = None
    return (sRegex, lNegLookBeforeRegex)


def pyRuleToJS (lRule, dJSREGEXES, sWORDLIMITLEFT):
    lRuleJS = copy.deepcopy(lRule)
    del lRule[-1] # tGroups positioning codes are useless for Python
    # error messages
    for aAction in lRuleJS[6]:
        if aAction[1] == "-":
            aAction[2] = aAction[2].replace(" ", " ") # nbsp --> nnbsp
            aAction[4] = aAction[4].replace("« ", "« ").replace(" »", " »").replace(" :", " :").replace(" :", " :")
    # js regexes
    lRuleJS[1], lNegLookBehindRegex = regex2js(dJSREGEXES.get(lRuleJS[3], lRuleJS[1]), sWORDLIMITLEFT)
    lRuleJS.append(lNegLookBehindRegex)
    return lRuleJS


def writeRulesToJSArray (lRules):
    sArray = "[\n"
    for sOption, aRuleGroup in lRules:
        sArray += '  ["' + sOption + '", [\n'  if sOption  else  "  [false, [\n"
        for sRegex, bCaseInsensitive, sLineId, sRuleId, nPriority, lActions, aGroups, aNegLookBehindRegex in aRuleGroup:
            sArray += '    [' + sRegex + ", "
            sArray += "true, " if bCaseInsensitive  else "false, "
            sArray += '"' + sLineId + '", '
            sArray += '"' + sRuleId + '", '
            sArray += str(nPriority) + ", "
            sArray += json.dumps(lActions, ensure_ascii=False) + ", "
            sArray += json.dumps(aGroups, ensure_ascii=False) + ", "
            sArray += json.dumps(aNegLookBehindRegex, ensure_ascii=False) + "],\n"
        sArray += "  ]],\n"
    sArray += "]"
    return sArray


def groupsPositioningCodeToList (sGroupsPositioningCode):
    if not sGroupsPositioningCode:
        return None
    return [ int(sCode)  if sCode.isdigit() or (sCode[0:1] == "-" and sCode[1:].isdigit())  else sCode \
             for sCode in sGroupsPositioningCode.split(",") ]

Modified doc/build.md from [0d772932a8] to [28ea36b703].

49
50
51
52
53
54
55





56
57
58
59
60
61
62
63
64
65

`-i --install`

> Install the LibreOffice extension.

`-fx --firefox`






> Launch Firefox Nightly.
> Unit tests can be lanched from Firefox, with CTRL+SHIFT+F12.

`-tb --thunderbird`

> Launch Thunderbird.


## Examples ##








>
>
>
>
>
|
|








49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70

`-i --install`

> Install the LibreOffice extension.

`-fx --firefox`

> Launch Firefox Developper (before Firefox 57).
> Unit tests can be lanched from Firefox, with CTRL+SHIFT+F12.

`-we --webext`

> Launch Firefox Nightly (Firefox 57+).
> Unit tests can be lanched from the menu.

`-tb --thunderbird`

> Launch Thunderbird.


## Examples ##

Modified gc_core/js/helpers.js from [6c4ecd114f] to [7c62a39694].

1
2


3
4
5
6
7
8
9


10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

33




34



35

36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81

82



83
84


85
86
87
88


// HELPERS



"use strict";

// In Firefox, there is no console.log in PromiseWorker, but there is worker.log.
// In Thunderbird, you can’t access to console directly. So it’s required to pass a log function.
let funcOutput = null;



function setLogOutput (func) {
    funcOutput = func;
}

function echo (obj) {
    if (funcOutput !== null) {
        funcOutput(obj);
    } else {
        console.log(obj);
    }
    return true;
}

function logerror (e, bStack=false) {
    let sMsg = "\n" + e.fileName + "\n" + e.name + "\nline: " + e.lineNumber + "\n" + e.message;
    if (bStack) {
        sMsg += "\n--- Stack ---\n" + e.stack;
    }
    if (funcOutput !== null) {
        funcOutput(sMsg);
    } else {
        console.error(sMsg);
    }

}










// load ressources in workers (suggested by Mozilla extensions reviewers)
// for more options have a look here: https://gist.github.com/Noitidart/ec1e6b9a593ec7e3efed
// if not in workers, use sdk/data.load() instead
function loadFile (spf) {
    try {
        let xRequest;
        if (typeof XMLHttpRequest !== "undefined") {
            xRequest = new XMLHttpRequest();
        }
        else {
            // JS bullshit again… necessary for Thunderbird
            let { Cc, Ci } = require("chrome");
            xRequest = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance();
            xRequest.QueryInterface(Ci.nsIXMLHttpRequest);
        }
        xRequest.open('GET', spf, false); // 3rd arg is false for synchronous, sync is acceptable in workers

        xRequest.send();
        return xRequest.responseText;
    }
    catch (e) {
        logerror(e);
        return null
    }
}


    


// conversions
function objectToMap (obj) {
    let m = new Map();
    for (let param in obj) {
        //console.log(param + " " + obj[param]);
        m.set(param, obj[param]);
    }
    return m;
}

function mapToObject (m) {
    let obj = {};
    for (let [k, v] of m) {
        obj[k] = v;
    }
    return obj;
}





exports.echo = echo;
exports.logerror = logerror;


exports.objectToMap = objectToMap;
exports.mapToObject = mapToObject;
exports.setLogOutput = setLogOutput;
exports.loadFile = loadFile;



>
>







>
>
|
|
|

|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
>
|
>
>
>
>
|
>
>
>

>
|
|
|
<
|
|
|
|
<
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|

<
<
<
<
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
>

>
>
>
|
|
>
>
|
|
<
<
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

52
53
54
55

56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72




73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100


101

// HELPERS
/*jslint esversion: 6*/
/*global console,require,exports,XMLHttpRequest*/

"use strict";

// In Firefox, there is no console.log in PromiseWorker, but there is worker.log.
// In Thunderbird, you can’t access to console directly. So it’s required to pass a log function.
let funcOutput = null;

var helpers = {

    setLogOutput: function (func) {
        funcOutput = func;
    },

    echo: function (obj) {
        if (funcOutput !== null) {
            funcOutput(obj);
        } else {
            console.log(obj);
        }
        return true;
    },

    logerror: function (e, bStack=false) {
        let sMsg = "\n" + e.fileName + "\n" + e.name + "\nline: " + e.lineNumber + "\n" + e.message;
        if (bStack) {
            sMsg += "\n--- Stack ---\n" + e.stack;
        }
        if (funcOutput !== null) {
            funcOutput(sMsg);
        } else {
            console.error(sMsg);
        }
    },

    inspect: function (o) {
        let sMsg = "__inspect__: " + typeof o;
        for (let sParam in o) {
            sMsg += "\n" + sParam + ": " + o.sParam;
        }
        sMsg += "\n" + JSON.stringify(o) + "\n__end__";
        this.echo(sMsg);
    },

    loadFile: function (spf) {
        // load ressources in workers (suggested by Mozilla extensions reviewers)
        // for more options have a look here: https://gist.github.com/Noitidart/ec1e6b9a593ec7e3efed
        // if not in workers, use sdk/data.load() instead

        try {
            let xRequest;
            if (typeof XMLHttpRequest !== "undefined") {
                xRequest = new XMLHttpRequest();

            } else {
                // JS bullshit again… necessary for Thunderbird
                let { Cc, Ci } = require("chrome");
                xRequest = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance();
                xRequest.QueryInterface(Ci.nsIXMLHttpRequest);
            }
            xRequest.open('GET', spf, false); // 3rd arg is false for synchronous, sync is acceptable in workers
            xRequest.overrideMimeType('text/json');
            xRequest.send();
            return xRequest.responseText;
        }
        catch (e) {
            this.logerror(e);
            return null;
        }
    },





    // conversions
    objectToMap: function (obj) {
        let m = new Map();
        for (let param in obj) {
            //console.log(param + " " + obj[param]);
            m.set(param, obj[param]);
        }
        return m;
    },

    mapToObject: function (m) {
        let obj = {};
        for (let [k, v] of m) {
            obj[k] = v;
        }
        return obj;
    }
};


if (typeof(exports) !== 'undefined') {
    exports.setLogOutput = helpers.setLogOutput;
    exports.echo = helpers.echo;
    exports.logerror = helpers.logerror;
    exports.inspect = helpers.inspect;
    exports.loadFile = helpers.loadFile;
    exports.objectToMap = helpers.objectToMap;
    exports.mapToObject = helpers.mapToObject;


}

Modified gc_core/js/ibdawg.js from [2d42754063] to [4cc6e3ad82].

1


2
3
4


5
6

7
8
9
10
11
12
13
14
15
16
17
18
19

20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//// IBDAWG



"use strict";



const st = require("resource://grammalecte/str_transform.js");
const helpers = require("resource://grammalecte/helpers.js");



// String
// Don’t remove. Necessary in TB.
${string}



class IBDAWG {
    // INDEXABLE BINARY DIRECT ACYCLIC WORD GRAPH

    constructor (sDicName) {
        try {

            const dict = JSON.parse(helpers.loadFile("resource://grammalecte/_dictionaries/"+sDicName));
            Object.assign(this, dict);
            //const dict = require("resource://grammalecte/"+sLang+"/dictionary.js");
            //Object.assign(this, dict.dictionary);
        }
        catch (e) {
            throw Error("# Error. File not found or not loadable.\n" + e.message + "\n");
        }
        /*
            Properties:
            sName, nVersion, sHeader, lArcVal, nArcVal, byDic, sLang, nChar, nBytesArc, nBytesNodeAddress,
            nEntries, nNode, nArc, nAff, cStemming, nTag, dChar, _arcMask, _finalNodeMask, _lastArcMask, _addrBitMask, nBytesOffset,
        */
        if (!this.sHeader.startsWith("/pyfsa/")) {
            throw TypeError("# Error. Not a pyfsa binary dictionary. Header: " + this.sHeader);
        }
        if (!(this.nVersion == "1" || this.nVersion == "2" || this.nVersion == "3")) {
            throw RangeError("# Error. Unknown dictionary version: " + this.nVersion);
        }

        this.dChar = helpers.objectToMap(this.dChar);
        //this.byDic = new Uint8Array(this.byDic);  // not quicker, even slower

        if (this.cStemming == "S") {
            this.funcStemming = st.getStemFromSuffixCode;
        } else if (this.cStemming == "A") {
            this.funcStemming = st.getStemFromAffixCode;
        } else {
            this.funcStemming = st.noStemming;
        }

        // Configuring DAWG functions according to nVersion
        switch (this.nVersion) {
            case 1:
                this.morph = this._morph1;
                this.stem = this._stem1;

>
>



>
>
|
|
>











|

>
|

<
<




















|

|

|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27


28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//// IBDAWG
/*jslint esversion: 6*/
/*global console,require,exports*/

"use strict";


if (typeof(require) !== 'undefined') {
    var str_transform = require("resource://grammalecte/str_transform.js");
    var helpers = require("resource://grammalecte/helpers.js");
}


// String
// Don’t remove. Necessary in TB.
${string}



class IBDAWG {
    // INDEXABLE BINARY DIRECT ACYCLIC WORD GRAPH

    constructor (sDicName, sPath="") {
        try {
            let sURL = (sPath !== "") ? sPath + "/" + sDicName : "resource://grammalecte/_dictionaries/"+sDicName;
            const dict = JSON.parse(helpers.loadFile(sURL));
            Object.assign(this, dict);


        }
        catch (e) {
            throw Error("# Error. File not found or not loadable.\n" + e.message + "\n");
        }
        /*
            Properties:
            sName, nVersion, sHeader, lArcVal, nArcVal, byDic, sLang, nChar, nBytesArc, nBytesNodeAddress,
            nEntries, nNode, nArc, nAff, cStemming, nTag, dChar, _arcMask, _finalNodeMask, _lastArcMask, _addrBitMask, nBytesOffset,
        */
        if (!this.sHeader.startsWith("/pyfsa/")) {
            throw TypeError("# Error. Not a pyfsa binary dictionary. Header: " + this.sHeader);
        }
        if (!(this.nVersion == "1" || this.nVersion == "2" || this.nVersion == "3")) {
            throw RangeError("# Error. Unknown dictionary version: " + this.nVersion);
        }

        this.dChar = helpers.objectToMap(this.dChar);
        //this.byDic = new Uint8Array(this.byDic);  // not quicker, even slower

        if (this.cStemming == "S") {
            this.funcStemming = str_transform.getStemFromSuffixCode;
        } else if (this.cStemming == "A") {
            this.funcStemming = str_transform.getStemFromAffixCode;
        } else {
            this.funcStemming = str_transform.noStemming;
        }

        // Configuring DAWG functions according to nVersion
        switch (this.nVersion) {
            case 1:
                this.morph = this._morph1;
                this.stem = this._stem1;
70
71
72
73
74
75
76
77

78
79
80
81
82
83
84

85
86
87
88
89
90
91
92
93
94
95
96
97
98

99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128

129
130
131
132
133
134
135
136
137
138
139

140
141
142
143
144
145
146
147
148
149
150
151
152
153
154

155
156
157
158
159
160
161
162
163
164
165
166

167
168
169
170
171
172
173
174
175
176
177
                break;
            default:
                throw ValueError("# Error: unknown code: " + this.nVersion);
        }
        //console.log(this.getInfo());
        this.bOptNumSigle = true;
        this.bOptNumAtLast = false;
    };


    getInfo () {
        return  `  Language: ${this.sLang}      Version: ${this.nVersion}      Stemming: ${this.cStemming}FX\n` +
                `  Arcs values:  ${this.nArcVal} = ${this.nChar} characters,  ${this.nAff} affixes,  ${this.nTag} tags\n` +
                `  Dictionary: ${this.nEntries} entries,    ${this.nNode} nodes,   ${this.nArc} arcs\n` +
                `  Address size: ${this.nBytesNodeAddress} bytes,  Arc size: ${this.nBytesArc} bytes\n`;
    };


    isValidToken (sToken) {
        // checks if sToken is valid (if there is hyphens in sToken, sToken is split, each part is checked)
        if (this.isValid(sToken)) {
            return true;
        }
        if (sToken.includes("-")) {
            if (sToken._count("-") > 4) {
                return true;
            }
            return sToken.split("-").every(sWord  =>  this.isValid(sWord)); 
        }
        return false;
    };


    isValid (sWord) {
        // checks if sWord is valid (different casing tested if the first letter is a capital)
        if (!sWord) {
            return null;
        }
        if (sWord.includes("’")) { // ugly hack
            sWord = sWord.replace("’", "'");
        }
        if (this.lookup(sWord)) {
            return true;
        }
        if (sWord.charAt(0)._isUpperCase()) {
            if (sWord.length > 1) {
                if (sWord._isTitle()) {
                    return !!this.lookup(sWord.toLowerCase());
                }
                if (sWord._isUpperCase()) {
                    if (this.bOptNumSigle) {
                        return true;
                    }
                    return !!(this.lookup(sWord.toLowerCase()) || this.lookup(sWord._toCapitalize()));
                }
                return !!this.lookup(sWord.slice(0, 1).toLowerCase() + sWord.slice(1));
            } else {
                return !!this.lookup(sWord.toLowerCase());
            }
        }
        return false;
    };


    _convBytesToInteger (aBytes) {
        // Byte order = Big Endian (bigger first)
        let nVal = 0;
        let nWeight = (aBytes.length - 1) * 8;
        for (let n of aBytes) {
            nVal += n << nWeight;
            nWeight = nWeight - 8;
        }
        return nVal;
    };


    lookup (sWord) {
        // returns true if sWord in dictionary (strict verification)
        let iAddr = 0;
        for (let c of sWord) {
            if (!this.dChar.has(c)) {
                return false;
            }
            iAddr = this._lookupArcNode(this.dChar.get(c), iAddr);
            if (iAddr === null) {
                return false;
            }
        }
        return Boolean(this._convBytesToInteger(this.byDic.slice(iAddr, iAddr+this.nBytesArc)) & this._finalNodeMask);
    };


    getMorph (sWord) {
        // retrieves morphologies list, different casing allowed
        let l = this.morph(sWord);
        if (sWord[0]._isUpperCase()) {
            l = l.concat(this.morph(sWord.toLowerCase()));
            if (sWord._isUpperCase() && sWord.length > 1) {
                l = l.concat(this.morph(sWord._toCapitalize()));
            }
        }
        return l;
    };


    // morph (sWord) {
    //     is defined in constructor
    // };
    
    // VERSION 1
    _morph1 (sWord) {
        // returns morphologies of sWord
        let iAddr = 0;
        for (let c of sWord) {
            if (!this.dChar.has(c)) {







<
>






<
>







|





<
>












|

|


|



|







<
>










<
>














<
>




|

|
|



<
>



|







74
75
76
77
78
79
80

81
82
83
84
85
86
87

88
89
90
91
92
93
94
95
96
97
98
99
100
101

102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131

132
133
134
135
136
137
138
139
140
141
142

143
144
145
146
147
148
149
150
151
152
153
154
155
156
157

158
159
160
161
162
163
164
165
166
167
168
169

170
171
172
173
174
175
176
177
178
179
180
181
                break;
            default:
                throw ValueError("# Error: unknown code: " + this.nVersion);
        }
        //console.log(this.getInfo());
        this.bOptNumSigle = true;
        this.bOptNumAtLast = false;

    }

    getInfo () {
        return  `  Language: ${this.sLang}      Version: ${this.nVersion}      Stemming: ${this.cStemming}FX\n` +
                `  Arcs values:  ${this.nArcVal} = ${this.nChar} characters,  ${this.nAff} affixes,  ${this.nTag} tags\n` +
                `  Dictionary: ${this.nEntries} entries,    ${this.nNode} nodes,   ${this.nArc} arcs\n` +
                `  Address size: ${this.nBytesNodeAddress} bytes,  Arc size: ${this.nBytesArc} bytes\n`;

    }

    isValidToken (sToken) {
        // checks if sToken is valid (if there is hyphens in sToken, sToken is split, each part is checked)
        if (this.isValid(sToken)) {
            return true;
        }
        if (sToken.includes("-")) {
            if (sToken.gl_count("-") > 4) {
                return true;
            }
            return sToken.split("-").every(sWord  =>  this.isValid(sWord)); 
        }
        return false;

    }

    isValid (sWord) {
        // checks if sWord is valid (different casing tested if the first letter is a capital)
        if (!sWord) {
            return null;
        }
        if (sWord.includes("’")) { // ugly hack
            sWord = sWord.replace("’", "'");
        }
        if (this.lookup(sWord)) {
            return true;
        }
        if (sWord.charAt(0).gl_isUpperCase()) {
            if (sWord.length > 1) {
                if (sWord.gl_isTitle()) {
                    return !!this.lookup(sWord.toLowerCase());
                }
                if (sWord.gl_isUpperCase()) {
                    if (this.bOptNumSigle) {
                        return true;
                    }
                    return !!(this.lookup(sWord.toLowerCase()) || this.lookup(sWord.gl_toCapitalize()));
                }
                return !!this.lookup(sWord.slice(0, 1).toLowerCase() + sWord.slice(1));
            } else {
                return !!this.lookup(sWord.toLowerCase());
            }
        }
        return false;

    }

    _convBytesToInteger (aBytes) {
        // Byte order = Big Endian (bigger first)
        let nVal = 0;
        let nWeight = (aBytes.length - 1) * 8;
        for (let n of aBytes) {
            nVal += n << nWeight;
            nWeight = nWeight - 8;
        }
        return nVal;

    }

    lookup (sWord) {
        // returns true if sWord in dictionary (strict verification)
        let iAddr = 0;
        for (let c of sWord) {
            if (!this.dChar.has(c)) {
                return false;
            }
            iAddr = this._lookupArcNode(this.dChar.get(c), iAddr);
            if (iAddr === null) {
                return false;
            }
        }
        return Boolean(this._convBytesToInteger(this.byDic.slice(iAddr, iAddr+this.nBytesArc)) & this._finalNodeMask);

    }

    getMorph (sWord) {
        // retrieves morphologies list, different casing allowed
        let l = this.morph(sWord);
        if (sWord[0].gl_isUpperCase()) {
            l = l.concat(this.morph(sWord.toLowerCase()));
            if (sWord.gl_isUpperCase() && sWord.length > 1) {
                l = l.concat(this.morph(sWord.gl_toCapitalize()));
            }
        }
        return l;

    }

    // morph (sWord) {
    //     is defined in constructor
    // }
    
    // VERSION 1
    _morph1 (sWord) {
        // returns morphologies of sWord
        let iAddr = 0;
        for (let c of sWord) {
            if (!this.dChar.has(c)) {
203
204
205
206
207
208
209
210

211
212
213
214
215
216
217
                    }
                }
                iAddr = iEndArcAddr + this.nBytesNodeAddress;
            }
            return l;
        }
        return [];
    };


    _stem1 (sWord) {
        // returns stems list of sWord
        let iAddr = 0;
        for (let c of sWord) {
            if (!this.dChar.has(c)) {
                return [];







<
>







207
208
209
210
211
212
213

214
215
216
217
218
219
220
221
                    }
                }
                iAddr = iEndArcAddr + this.nBytesNodeAddress;
            }
            return l;
        }
        return [];

    }

    _stem1 (sWord) {
        // returns stems list of sWord
        let iAddr = 0;
        for (let c of sWord) {
            if (!this.dChar.has(c)) {
                return [];
233
234
235
236
237
238
239
240

241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260

261
262
263
264
265

266
267
268
269

270
271
272
273

274
275
276
277
278
279

280
281
282
283

284
285
286
287

288
289
290

291

                    l.push(this.funcStemming(sWord, this.lArcVal[nArc]));
                }
                iAddr = iEndArcAddr + this.nBytesNodeAddress;
            }
            return l;
        }
        return [];
    };


    _lookupArcNode1 (nVal, iAddr) {
        // looks if nVal is an arc at the node at iAddr, if yes, returns address of next node else None
        while (true) {
            let iEndArcAddr = iAddr+this.nBytesArc;
            let nRawArc = this._convBytesToInteger(this.byDic.slice(iAddr, iEndArcAddr));
            if (nVal == (nRawArc & this._arcMask)) {
                // the value we are looking for 
                // we return the address of the next node
                return this._convBytesToInteger(this.byDic.slice(iEndArcAddr, iEndArcAddr+this.nBytesNodeAddress));
            }
            else {
                // value not found
                if (nRawArc & this._lastArcMask) {
                    return null;
                }
                iAddr = iEndArcAddr + this.nBytesNodeAddress;
            }
        }
    };


    // VERSION 2
    _morph2 (sWord) {
        // to do
    };


    _stem2 (sWord) {
        // to do
    };


    _lookupArcNode2 (nVal, iAddr) {
        // to do
    };



    // VERSION 3
    _morph3 (sWord) {
        // to do
    };


    _stem3 (sWord) {
        // to do
    };


    _lookupArcNode3 (nVal, iAddr) {
        // to do
    };

}



exports.IBDAWG = IBDAWG;








<
>



















<
>




<
>



<
>



<
>





<
>



<
>



<
>



>
|
>
237
238
239
240
241
242
243

244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263

264
265
266
267
268

269
270
271
272

273
274
275
276

277
278
279
280
281
282

283
284
285
286

287
288
289
290

291
292
293
294
295
296
297
                    l.push(this.funcStemming(sWord, this.lArcVal[nArc]));
                }
                iAddr = iEndArcAddr + this.nBytesNodeAddress;
            }
            return l;
        }
        return [];

    }

    _lookupArcNode1 (nVal, iAddr) {
        // looks if nVal is an arc at the node at iAddr, if yes, returns address of next node else None
        while (true) {
            let iEndArcAddr = iAddr+this.nBytesArc;
            let nRawArc = this._convBytesToInteger(this.byDic.slice(iAddr, iEndArcAddr));
            if (nVal == (nRawArc & this._arcMask)) {
                // the value we are looking for 
                // we return the address of the next node
                return this._convBytesToInteger(this.byDic.slice(iEndArcAddr, iEndArcAddr+this.nBytesNodeAddress));
            }
            else {
                // value not found
                if (nRawArc & this._lastArcMask) {
                    return null;
                }
                iAddr = iEndArcAddr + this.nBytesNodeAddress;
            }
        }

    }

    // VERSION 2
    _morph2 (sWord) {
        // to do

    }

    _stem2 (sWord) {
        // to do

    }

    _lookupArcNode2 (nVal, iAddr) {
        // to do

    }


    // VERSION 3
    _morph3 (sWord) {
        // to do

    }

    _stem3 (sWord) {
        // to do

    }

    _lookupArcNode3 (nVal, iAddr) {
        // to do

    }
}


if (typeof(exports) !== 'undefined') {
    exports.IBDAWG = IBDAWG;
}

Modified gc_core/js/jsex_map.js from [181b814a6e] to [3dc39be41a].

1
2

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

// Map


if (Map.prototype.__grammalecte__ === undefined) {
    Map.prototype._shallowCopy = function () {
        let oNewMap = new Map();
        for (let [key, val] of this.entries()) {
            oNewMap.set(key, val);
        }
        return oNewMap;
    }

    Map.prototype._get = function (key, defaultValue) {
        let res = this.get(key);
        if (res !== undefined) {
            return res;
        }
        return defaultValue;
    }

    Map.prototype._toString = function () {
        // Default .toString() gives nothing useful
        let sRes = "{ ";
        for (let [k, v] of this.entries()) {
            sRes += (typeof k === "string") ? '"' + k + '": ' : k.toString() + ": ";
            sRes += (typeof v === "string") ? '"' + v + '", ' : v.toString() + ", ";
        }
        sRes = sRes.slice(0, -2) + " }"
        return sRes;
    }

    Map.prototype._update = function (dDict) {
        for (let [k, v] of dDict.entries()) {
            this.set(k, v);
        }
    }

    Map.prototype._updateOnlyExistingKeys = function (dDict) {
        for (let [k, v] of dDict.entries()) {
            if (this.has(k)){
                this.set(k, v);
            }
        }
    }

    Map.prototype.__grammalecte__ = true;
}


>

|
|





|

|





|

|






|

|

|



|

|





|

|

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

// Map
/*jslint esversion: 6*/

if (Map.prototype.grammalecte === undefined) {
    Map.prototype.gl_shallowCopy = function () {
        let oNewMap = new Map();
        for (let [key, val] of this.entries()) {
            oNewMap.set(key, val);
        }
        return oNewMap;
    };

    Map.prototype.gl_get = function (key, defaultValue) {
        let res = this.get(key);
        if (res !== undefined) {
            return res;
        }
        return defaultValue;
    };

    Map.prototype.gl_toString = function () {
        // Default .toString() gives nothing useful
        let sRes = "{ ";
        for (let [k, v] of this.entries()) {
            sRes += (typeof k === "string") ? '"' + k + '": ' : k.toString() + ": ";
            sRes += (typeof v === "string") ? '"' + v + '", ' : v.toString() + ", ";
        }
        sRes = sRes.slice(0, -2) + " }";
        return sRes;
    };

    Map.prototype.gl_update = function (dDict) {
        for (let [k, v] of dDict.entries()) {
            this.set(k, v);
        }
    };

    Map.prototype.gl_updateOnlyExistingKeys = function (dDict) {
        for (let [k, v] of dDict.entries()) {
            if (this.has(k)){
                this.set(k, v);
            }
        }
    };

    Map.prototype.grammalecte = true;
}

Modified gc_core/js/jsex_regex.js from [de380ed036] to [0c1a934c00].

1
2

3
4
5
6
7
8
9
10
11
12

// regex


if (RegExp.prototype.__grammalecte__ === undefined) {
    RegExp.prototype._exec2 = function (sText, aGroupsPos, aNegLookBefore=null) {
        let m;
        while ((m = this.exec(sText)) !== null) {
            // we have to iterate over sText here too
            // because first match doesn’t imply it’s a valid match according to negative lookbefore assertions,
            // and even if first match is finally invalid, it doesn’t mean the following eligible matchs would be invalid too.
            if (aNegLookBefore !== null) {
                // check negative look before assertions


>

|
|







1
2
3
4
5
6
7
8
9
10
11
12
13

// regex
/*jslint esversion: 6*/

if (RegExp.prototype.grammalecte === undefined) {
    RegExp.prototype.gl_exec2 = function (sText, aGroupsPos, aNegLookBefore=null) {
        let m;
        while ((m = this.exec(sText)) !== null) {
            // we have to iterate over sText here too
            // because first match doesn’t imply it’s a valid match according to negative lookbefore assertions,
            // and even if first match is finally invalid, it doesn’t mean the following eligible matchs would be invalid too.
            if (aNegLookBefore !== null) {
                // check negative look before assertions
21
22
23
24
25
26
27

28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75








76
77
78
79
80
            return null;
        }

        let codePos;
        let iPos = 0;
        m.start = [m.index];
        m.end = [this.lastIndex];

        if (m.length > 1) {
            // there is subgroup(s)
            if (aGroupsPos !== null) {
                // aGroupsPos is defined
                for (let i = 1; i <= m.length-1; i++) {
                    codePos = aGroupsPos[i-1];
                    if (typeof codePos === "number") {
                        // position as a number
                        m.start.push(m.index + codePos);
                        m.end.push(m.index + codePos + m[i].length);
                    } else if (codePos === "$") {
                        // at the end of the pattern
                        m.start.push(this.lastIndex - m[i].length);
                        m.end.push(this.lastIndex);
                    } else if (codePos === "w") {
                        // word in the middle of the pattern
                        iPos = m[0].search("[ ~’,()«»“”]"+m[i]+"[ ,’~()«»“”]") + 1 + m.index
                        m.start.push(iPos);
                        m.end.push(iPos + m[i].length)
                    } else if (codePos === "*") {
                        // anywhere
                        iPos = m[0].indexOf(m[i]) + m.index;
                        m.start.push(iPos);
                        m.end.push(iPos + m[i].length)
                    } else if (codePos === "**") {
                        // anywhere after previous group
                        iPos = m[0].indexOf(m[i], m.end[i-1]-m.index) + m.index;
                        m.start.push(iPos);
                        m.end.push(iPos + m[i].length)
                    } else if (codePos.startsWith(">")) {
                        // >x:_
                        // todo: look in substring x
                        iPos = m[0].indexOf(m[i]) + m.index;
                        m.start.push(iPos);
                        m.end.push(iPos + m[i].length);
                    } else {
                        console.error("# Error: unknown positioning code in regex [" + this.source + "], for group[" + i.toString() +"], code: [" + codePos + "]");
                    }
                }
            } else {
                // no aGroupsPos
                for (let subm of m.slice(1)) {
                    iPos = m[0].indexOf(subm) + m.index;
                    m.start.push(iPos);
                    m.end.push(iPos + subm.length);
                }
            }
        }








        return m;
    }

    RegExp.prototype.__grammalecte__ = true;
}







>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
>
>
>
>
>
>

|

|

22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
            return null;
        }

        let codePos;
        let iPos = 0;
        m.start = [m.index];
        m.end = [this.lastIndex];
        try {
            if (m.length > 1) {
                // there is subgroup(s)
                if (aGroupsPos !== null) {
                    // aGroupsPos is defined
                    for (let i = 1; i <= m.length-1; i++) {
                        codePos = aGroupsPos[i-1];
                        if (typeof codePos === "number") {
                            // position as a number
                            m.start.push(m.index + codePos);
                            m.end.push(m.index + codePos + m[i].length);
                        } else if (codePos === "$") {
                            // at the end of the pattern
                            m.start.push(this.lastIndex - m[i].length);
                            m.end.push(this.lastIndex);
                        } else if (codePos === "w") {
                            // word in the middle of the pattern
                            iPos = m[0].search("[ ’,()«»“”]"+m[i]+"[ ,’()«»“”]") + 1 + m.index;
                            m.start.push(iPos);
                            m.end.push(iPos + m[i].length);
                        } else if (codePos === "*") {
                            // anywhere
                            iPos = m[0].indexOf(m[i]) + m.index;
                            m.start.push(iPos);
                            m.end.push(iPos + m[i].length);
                        } else if (codePos === "**") {
                            // anywhere after previous group
                            iPos = m[0].indexOf(m[i], m.end[i-1]-m.index) + m.index;
                            m.start.push(iPos);
                            m.end.push(iPos + m[i].length);
                        } else if (codePos.startsWith(">")) {
                            // >x:_
                            // todo: look in substring x
                            iPos = m[0].indexOf(m[i]) + m.index;
                            m.start.push(iPos);
                            m.end.push(iPos + m[i].length);
                        } else {
                            console.error("# Error: unknown positioning code in regex [" + this.source + "], for group[" + i.toString() +"], code: [" + codePos + "]");
                        }
                    }
                } else {
                    // no aGroupsPos
                    for (let subm of m.slice(1)) {
                        iPos = m[0].indexOf(subm) + m.index;
                        m.start.push(iPos);
                        m.end.push(iPos + subm.length);
                    }
                }
            }
        }
        catch (e) {
            if (typeof(helpers) !== "undefined") {
                helpers.logerror(e);
            } else {
                console.error(e);
            }
        }
        return m;
    };

    RegExp.prototype.grammalecte = true;
}

Modified gc_core/js/jsex_string.js from [adf06fbda5] to [34840fe9fe].

1
2

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

// String


if (String.prototype.__grammalecte__ === undefined) {
    String.prototype._count = function (sSearch, bOverlapping) {
        // http://jsperf.com/string-ocurrence-split-vs-match/8
        if (sSearch.length <= 0) {
            return this.length + 1;
        }
        let nOccur = 0;
        let iPos = 0;
        let nStep = (bOverlapping) ? 1 : sSearch.length;
        while ((iPos = this.indexOf(sSearch, iPos)) >= 0) {
            nOccur++;
            iPos += nStep;
        }
        return nOccur;
    }
    String.prototype._isDigit = function () {
        return (this.search(/^[0-9⁰¹²³⁴⁵⁶⁷⁸⁹]+$/) !== -1);
    }
    String.prototype._isLowerCase = function () {
        return (this.search(/^[a-zà-öø-ÿ0-9-]+$/) !== -1);
    }
    String.prototype._isUpperCase = function () {
        return (this.search(/^[A-ZÀ-ÖØ-ߌ0-9-]+$/) !== -1);
    }
    String.prototype._isTitle = function () {
        return (this.search(/^[A-ZÀ-ÖØ-ߌ][a-zà-öø-ÿ'’-]+$/) !== -1);
    }
    String.prototype._toCapitalize = function () {
        return this.slice(0,1).toUpperCase() + this.slice(1).toLowerCase();
    }
    String.prototype._expand = function (oMatch) {
        let sNew = this;
        for (let i = 0; i < oMatch.length ; i++) {
            let z = new RegExp("\\\\"+parseInt(i), "g");
            sNew = sNew.replace(z, oMatch[i]);
        }
        return sNew;
    }
    String.prototype._trimRight = function (sChars) {
        let z = new RegExp("["+sChars+"]+$");
        return this.replace(z, "");
    }
    String.prototype._trimLeft = function (sChars) {
        let z = new RegExp("^["+sChars+"]+");
        return this.replace(z, "");
    }
    String.prototype._trim = function (sChars) {
        let z1 = new RegExp("^["+sChars+"]+");
        let z2 = new RegExp("["+sChars+"]+$");
        return this.replace(z1, "").replace(z2, "");
    }

    String.prototype.__grammalecte__ = true;
}


>

|
|












|
|

|
|

|
|

|
|

|
|

|
|






|
|


|
|


|
|



|

|

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

// String
/*jslint esversion: 6*/

if (String.prototype.grammalecte === undefined) {
    String.prototype.gl_count = function (sSearch, bOverlapping) {
        // http://jsperf.com/string-ocurrence-split-vs-match/8
        if (sSearch.length <= 0) {
            return this.length + 1;
        }
        let nOccur = 0;
        let iPos = 0;
        let nStep = (bOverlapping) ? 1 : sSearch.length;
        while ((iPos = this.indexOf(sSearch, iPos)) >= 0) {
            nOccur++;
            iPos += nStep;
        }
        return nOccur;
    };
    String.prototype.gl_isDigit = function () {
        return (this.search(/^[0-9⁰¹²³⁴⁵⁶⁷⁸⁹]+$/) !== -1);
    };
    String.prototype.gl_isLowerCase = function () {
        return (this.search(/^[a-zà-öø-ÿ0-9-]+$/) !== -1);
    };
    String.prototype.gl_isUpperCase = function () {
        return (this.search(/^[A-ZÀ-ÖØ-ߌ0-9-]+$/) !== -1);
    };
    String.prototype.gl_isTitle = function () {
        return (this.search(/^[A-ZÀ-ÖØ-ߌ][a-zà-öø-ÿ'’-]+$/) !== -1);
    };
    String.prototype.gl_toCapitalize = function () {
        return this.slice(0,1).toUpperCase() + this.slice(1).toLowerCase();
    };
    String.prototype.gl_expand = function (oMatch) {
        let sNew = this;
        for (let i = 0; i < oMatch.length ; i++) {
            let z = new RegExp("\\\\"+parseInt(i), "g");
            sNew = sNew.replace(z, oMatch[i]);
        }
        return sNew;
    };
    String.prototype.gl_trimRight = function (sChars) {
        let z = new RegExp("["+sChars+"]+$");
        return this.replace(z, "");
    };
    String.prototype.gl_trimLeft = function (sChars) {
        let z = new RegExp("^["+sChars+"]+");
        return this.replace(z, "");
    };
    String.prototype.gl_trim = function (sChars) {
        let z1 = new RegExp("^["+sChars+"]+");
        let z2 = new RegExp("["+sChars+"]+$");
        return this.replace(z1, "").replace(z2, "");
    };

    String.prototype.grammalecte = true;
}

Modified gc_core/js/lang_core/gc_engine.js from [908b008d84] to [a71cf52ea3].

1




2
3
4
5
6















7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44











45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95

96



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173

174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215

216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257

258

259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292

293



294


295
296
297
298
299


300


301



302
303
304
305
306
307
308
309
310
311
312
313
314
315

316
317
318
319



320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338


339

340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
// Grammar checker engine





${string}
${regex}
${map}

















function capitalizeArray (aArray) {
    // can’t map on user defined function??
    let aNew = [];
    for (let i = 0; i < aArray.length; i = i + 1) {
        aNew[i] = aArray[i]._toCapitalize();
    }
    return aNew;
}

const ibdawg = require("resource://grammalecte/ibdawg.js");
const helpers = require("resource://grammalecte/helpers.js");
const gc_options = require("resource://grammalecte/${lang}/gc_options.js");
const cr = require("resource://grammalecte/${lang}/cregex.js");
const text = require("resource://grammalecte/text.js");
const echo = require("resource://grammalecte/helpers.js").echo;

const lang = "${lang}";
const locales = ${loc};
const pkg = "${implname}";
const name = "${name}";
const version = "${version}";
const author = "${author}";

// commons regexes
const _zEndOfSentence = new RegExp ('([.?!:;…][ .?!… »”")]*|.$)', "g");
const _zBeginOfParagraph = new RegExp ("^[-  –—.,;?!…]*", "ig");
const _zEndOfParagraph = new RegExp ("[-  .,;?!…–—]*$", "ig");

// grammar rules and dictionary
//const _rules = require("./gc_rules.js");
const _rules = require("resource://grammalecte/${lang}/gc_rules.js");
let _dOptions = gc_options.dOpt._shallowCopy();     // duplication necessary, to be able to reset to default
let _aIgnoredRules = new Set();
let _oDict = null;
let _dAnalyses = new Map();                        // cache for data from dictionary













///// Parsing

function parse (sText, sCountry="${country_default}", bDebug=false, bContext=false) {
    // analyses the paragraph sText and returns list of errors
    let dErrors;
    let errs;
    let sAlt = sText;
    let dDA = new Map();        // Disamnbiguator
    let dPriority = new Map();  // Key = position; value = priority
    let sNew = "";

    // parse paragraph
    try {
        [sNew, dErrors] = _proofread(sText, sAlt, 0, true, dDA, dPriority, sCountry, bDebug, bContext);
        if (sNew) {
            sText = sNew;
        }
    }
    catch (e) {
        helpers.logerror(e);
    }

    // cleanup
    if (sText.includes(" ")) {
        sText = sText.replace(/ /g, ' '); // nbsp
    }
    if (sText.includes(" ")) {
        sText = sText.replace(/ /g, ' '); // snbsp
    }
    if (sText.includes("'")) {
        sText = sText.replace(/'/g, "’");
    }
    if (sText.includes("‑")) {
        sText = sText.replace(/‑/g, "-"); // nobreakdash
    }

    // parse sentence
    for (let [iStart, iEnd] of _getSentenceBoundaries(sText)) {
        if (4 < (iEnd - iStart) < 2000) {
            dDA.clear();
            //echo(sText.slice(iStart, iEnd));
            try {
                [_, errs] = _proofread(sText.slice(iStart, iEnd), sAlt.slice(iStart, iEnd), iStart, false, dDA, dPriority, sCountry, bDebug, bContext);
                dErrors._update(errs);
            }
            catch (e) {
                helpers.logerror(e);
            }
        }
    }
    return Array.from(dErrors.values());

}




function* _getSentenceBoundaries (sText) {
    let mBeginOfSentence = _zBeginOfParagraph.exec(sText)
    let iStart = _zBeginOfParagraph.lastIndex;
    let m;
    while ((m = _zEndOfSentence.exec(sText)) !== null) {
        yield [iStart, _zEndOfSentence.lastIndex];
        iStart = _zEndOfSentence.lastIndex;
    }
}

function _proofread (s, sx, nOffset, bParagraph, dDA, dPriority, sCountry, bDebug, bContext) {
    let dErrs = new Map();
    let bChange = false;
    let bIdRule = option('idrule');
    let m;
    let bCondMemo;
    let nErrorStart;

    for (let [sOption, lRuleGroup] of _getRules(bParagraph)) {
        if (!sOption || option(sOption)) {
            for (let [zRegex, bUppercase, sLineId, sRuleId, nPriority, lActions, lGroups, lNegLookBefore] of lRuleGroup) {
                if (!_aIgnoredRules.has(sRuleId)) {
                    while ((m = zRegex._exec2(s, lGroups, lNegLookBefore)) !== null) {
                        bCondMemo = null;
                        /*if (bDebug) {
                            echo(">>>> Rule # " + sLineId + " - Text: " + s + " opt: "+ sOption);
                        }*/
                        for (let [sFuncCond, cActionType, sWhat, ...eAct] of lActions) {
                        // action in lActions: [ condition, action type, replacement/suggestion/action[, iGroup[, message, URL]] ]
                            try {
                                //echo(oEvalFunc[sFuncCond]);
                                bCondMemo = (!sFuncCond || oEvalFunc[sFuncCond](s, sx, m, dDA, sCountry, bCondMemo))
                                if (bCondMemo) {
                                    switch (cActionType) {
                                        case "-":
                                            // grammar error
                                            //echo("-> error detected in " + sLineId + "\nzRegex: " + zRegex.source);
                                            nErrorStart = nOffset + m.start[eAct[0]];
                                            if (!dErrs.has(nErrorStart) || nPriority > dPriority.get(nErrorStart)) {
                                                dErrs.set(nErrorStart, _createError(s, sx, sWhat, nOffset, m, eAct[0], sLineId, sRuleId, bUppercase, eAct[1], eAct[2], bIdRule, sOption, bContext));
                                                dPriority.set(nErrorStart, nPriority);
                                            }
                                            break;
                                        case "~":
                                            // text processor
                                            //echo("-> text processor by " + sLineId + "\nzRegex: " + zRegex.source);
                                            s = _rewrite(s, sWhat, eAct[0], m, bUppercase);
                                            bChange = true;
                                            if (bDebug) {
                                                echo("~ " + s + "  -- " + m[eAct[0]] + "  # " + sLineId);
                                            }
                                            break;
                                        case "=":
                                            // disambiguation
                                            //echo("-> disambiguation by " + sLineId + "\nzRegex: " + zRegex.source);
                                            oEvalFunc[sWhat](s, m, dDA);
                                            if (bDebug) {
                                                echo("= " + m[0] + "  # " + sLineId + "\nDA: " + dDA._toString());
                                            }
                                            break;
                                        case ">":
                                            // we do nothing, this test is just a condition to apply all following actions
                                            break;
                                        default:
                                            echo("# error: unknown action at " + sLineId);
                                    }
                                } else {
                                    if (cActionType == ">") {
                                        break;
                                    }
                                }
                            }
                            catch (e) {
                                echo(s);
                                echo("# line id: " + sLineId + "\n# rule id: " + sRuleId);
                                helpers.logerror(e);

                            }
                        }
                    }
                }
            }
        }
    }
    if (bChange) {
        return [s, dErrs];
    }
    return [false, dErrs];
}

function _createError (s, sx, sRepl, nOffset, m, iGroup, sLineId, sRuleId, bUppercase, sMsg, sURL, bIdRule, sOption, bContext) {
    let oErr = {};
    oErr["nStart"] = nOffset + m.start[iGroup];
    oErr["nEnd"] = nOffset + m.end[iGroup];
    oErr["sLineId"] = sLineId;
    oErr["sRuleId"] = sRuleId;
    oErr["sType"] = (sOption) ? sOption : "notype";
    // suggestions
    if (sRepl[0] === "=") {
        let sugg = oEvalFunc[sRepl.slice(1)](s, m);
        if (sugg) {
            if (bUppercase && m[iGroup].slice(0,1)._isUpperCase()) {
                oErr["aSuggestions"] = capitalizeArray(sugg.split("|"));
            } else {
                oErr["aSuggestions"] = sugg.split("|");
            }
        } else {
            oErr["aSuggestions"] = [];
        }
    } else if (sRepl == "_") {
        oErr["aSuggestions"] = [];
    } else {
        if (bUppercase && m[iGroup].slice(0,1)._isUpperCase()) {
            oErr["aSuggestions"] = capitalizeArray(sRepl._expand(m).split("|"));
        } else {
            oErr["aSuggestions"] = sRepl._expand(m).split("|");
        }
    }
    // Message

    if (sMsg[0] === "=") {
        sMessage = oEvalFunc[sMsg.slice(1)](s, m)
    } else {
        sMessage = sMsg._expand(m);
    }
    if (bIdRule) {
        sMessage += "  #" + sLineId + " #" + sRuleId;
    }
    oErr["sMessage"] = sMessage;
    // URL
    oErr["URL"] = sURL || "";
    // Context
    if (bContext) {
        oErr["sUnderlined"] = sx.slice(m.start[iGroup], m.end[iGroup]);
        oErr["sBefore"] = sx.slice(Math.max(0, m.start[iGroup]-80), m.start[iGroup]);
        oErr["sAfter"] = sx.slice(m.end[iGroup], m.end[iGroup]+80);
    }
    return oErr;
}

function _rewrite (s, sRepl, iGroup, m, bUppercase) {
    // text processor: write sRepl in s at iGroup position"
    let ln = m.end[iGroup] - m.start[iGroup];
    let sNew = "";
    if (sRepl === "*") {
        sNew = " ".repeat(ln);
    } else if (sRepl === ">" || sRepl === "_" || sRepl === "~") {
        sNew = sRepl + " ".repeat(ln-1);
    } else if (sRepl === "@") {
        sNew = "@".repeat(ln);
    } else if (sRepl.slice(0,1) === "=") {
        sNew = oEvalFunc[sRepl.slice(1)](s, m);
        sNew = sNew + " ".repeat(ln-sNew.length);
        if (bUppercase && m[iGroup].slice(0,1)._isUpperCase()) {
            sNew = sNew._toCapitalize();
        }
    } else {
        sNew = sRepl._expand(m);
        sNew = sNew + " ".repeat(ln-sNew.length);
    }
    //echo("\n"+s+"\nstart: "+m.start[iGroup]+" end:"+m.end[iGroup])
    return s.slice(0, m.start[iGroup]) + sNew + s.slice(m.end[iGroup]);

}


function ignoreRule (sRuleId) {
    _aIgnoredRules.add(sRuleId);
}

function resetIgnoreRules () {
    _aIgnoredRules.clear();
}

function reactivateRule (sRuleId) {
    _aIgnoredRules.delete(sRuleId);
}

function listRules (sFilter=null) {
    // generator: returns tuple (sOption, sLineId, sRuleId)
    try {
        for ([sOption, lRuleGroup] of _getRules(true)) {
            for ([_, _, sLineId, sRuleId, _, _] of lRuleGroup) {
                if (!sFilter || sRuleId.test(sFilter)) {
                    yield [sOption, sLineId, sRuleId];
                }
            }
        }
        for ([sOption, lRuleGroup] of _getRules(false)) {
            for ([_, _, sLineId, sRuleId, _, _] of lRuleGroup) {
                if (!sFilter || sRuleId.test(sFilter)) {
                    yield [sOption, sLineId, sRuleId];
                }
            }
        }
    }
    catch (e) {
        helpers.logerror(e);
    }

}







//////// init

function load () {
    try {


        _oDict = new ibdawg.IBDAWG("${js_binary_dic}");


    }



    catch (e) {
        helpers.logerror(e);
    }
}

function setOption (sOpt, bVal) {
    if (_dOptions.has(sOpt)) {
        _dOptions.set(sOpt, bVal);
    }
}

function setOptions (dOpt) {
    _dOptions._updateOnlyExistingKeys(dOpt);
}


function getOptions () {
    return _dOptions;
}




function getDefaultOptions () {
    return gc_options.dOpt._shallowCopy();
}

function resetOptions () {
    _dOptions = gc_options.dOpt._shallowCopy();
}

function getDictionary () {
    return _oDict;
}

function _getRules (bParagraph) {
    if (!bParagraph) {
        return _rules.lSentenceRules;
    }
    return _rules.lParagraphRules;
}






//////// common functions

function option (sOpt) {
    // return true if option sOpt is active
    return _dOptions.get(sOpt);
}

function displayInfo (dDA, aWord) {
    // for debugging: info of word
    if (!aWord) {
        echo("> nothing to find");
        return true;
    }
    if (!_dAnalyses.has(aWord[1]) && !_storeMorphFromFSA(aWord[1])) {
        echo("> not in FSA");
        return true;
    }
    if (dDA.has(aWord[0])) {
        echo("DA: " + dDA.get(aWord[0]));
    }
    echo("FSA: " + _dAnalyses.get(aWord[1]));
    return true;
}

function _storeMorphFromFSA (sWord) {
    // retrieves morphologies list from _oDict -> _dAnalyses
    //echo("register: "+sWord + " " + _oDict.getMorph(sWord).toString())
    _dAnalyses.set(sWord, _oDict.getMorph(sWord));
    return !!_dAnalyses.get(sWord);
}

function morph (dDA, aWord, sPattern, bStrict=true, bNoWord=false) {
    // analyse a tuple (position, word), return true if sPattern in morphologies (disambiguation on)
    if (!aWord) {
        //echo("morph: noword, returns " + bNoWord);
        return bNoWord;
    }
    //echo("aWord: "+aWord.toString());
    if (!_dAnalyses.has(aWord[1]) && !_storeMorphFromFSA(aWord[1])) {
        return false;
    }
    let lMorph = dDA.has(aWord[0]) ? dDA.get(aWord[0]) : _dAnalyses.get(aWord[1]);
    //echo("lMorph: "+lMorph.toString());
    if (lMorph.length === 0) {
        return false;
    }
    //echo("***");
    if (bStrict) {
        return lMorph.every(s  =>  (s.search(sPattern) !== -1));
    }
    return lMorph.some(s  =>  (s.search(sPattern) !== -1));
}

function morphex (dDA, aWord, sPattern, sNegPattern, bNoWord=false) {
    // analyse a tuple (position, word), returns true if not sNegPattern in word morphologies and sPattern in word morphologies (disambiguation on)
    if (!aWord) {
        //echo("morph: noword, returns " + bNoWord);
        return bNoWord;
    }
    //echo("aWord: "+aWord.toString());
    if (!_dAnalyses.has(aWord[1]) && !_storeMorphFromFSA(aWord[1])) {
        return false;
    }
    let lMorph = dDA.has(aWord[0]) ? dDA.get(aWord[0]) : _dAnalyses.get(aWord[1]);
    //echo("lMorph: "+lMorph.toString());
    if (lMorph.length === 0) {
        return false;
    }
    //echo("***");
    // check negative condition
    if (lMorph.some(s  =>  (s.search(sNegPattern) !== -1))) {
        return false;
    }
    // search sPattern
    return lMorph.some(s  =>  (s.search(sPattern) !== -1));
}

>
>
>
>





>
>
>
>
>
>
>
>
>
>
>
>
>
>
>





|




<
<
<
<
<
<

<
<
<
<
<
<
|
<
<
<
<
|
<
<
<
|


|


>
>
>
>
>
>
>
>
>
>
>
|

|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
>
>
>

|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>






<
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
>

|
|
|

|
|
|

|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
>
>
>
|
>
>

|

|
|
>
>
|
>
>
|
>
>
>
|
|
|
|

|
<
<
<
<
|
<
<
<
>

<
|
|
>
>
>
|
<
<
|

|
|
|

|
|
|

|
<
|
|
<
|
>
>
|
>


|









|



|



|

|





|







|


|




|



|









|


|




|



|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35






36






37




38



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195

196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338




339



340
341

342
343
344
345
346
347


348
349
350
351
352
353
354
355
356
357
358

359
360

361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
// Grammar checker engine
/*jslint esversion: 6*/
/*global console,require,exports*/

"use strict";

${string}
${regex}
${map}


if (typeof(require) !== 'undefined') {
    var helpers = require("resource://grammalecte/helpers.js");
    var gc_options = require("resource://grammalecte/${lang}/gc_options.js");
    var gc_rules = require("resource://grammalecte/${lang}/gc_rules.js");
    var cregex = require("resource://grammalecte/${lang}/cregex.js");
    var text = require("resource://grammalecte/text.js");
    var echo = helpers.echo;
}
else if (typeof(console) !== "undefined") {
    var echo = function (o) { console.log(o); return true; };
}
else {
    var echo = function () { return true; }
}

function capitalizeArray (aArray) {
    // can’t map on user defined function??
    let aNew = [];
    for (let i = 0; i < aArray.length; i = i + 1) {
        aNew[i] = aArray[i].gl_toCapitalize();
    }
    return aNew;
}














// data




let _sAppContext = "";                                  // what software is running



let _dOptions = null;
let _aIgnoredRules = new Set();
let _oDict = null;
let _dAnalyses = new Map();                             // cache for data from dictionary


var gc_engine = {

    //// Informations

    lang: "${lang}",
    locales: ${loc},
    pkg: "${implname}",
    name: "${name}",
    version: "${version}",
    author: "${author}",

    //// Parsing

    parse: function (sText, sCountry="${country_default}", bDebug=false, bContext=false) {
        // analyses the paragraph sText and returns list of errors
        let dErrors;
        let errs;
        let sAlt = sText;
        let dDA = new Map();        // Disamnbiguator
        let dPriority = new Map();  // Key = position; value = priority
        let sNew = "";

        // parse paragraph
        try {
            [sNew, dErrors] = this._proofread(sText, sAlt, 0, true, dDA, dPriority, sCountry, bDebug, bContext);
            if (sNew) {
                sText = sNew;
            }
        }
        catch (e) {
            helpers.logerror(e);
        }

        // cleanup
        if (sText.includes(" ")) {
            sText = sText.replace(/ /g, ' '); // nbsp
        }
        if (sText.includes(" ")) {
            sText = sText.replace(/ /g, ' '); // snbsp
        }
        if (sText.includes("'")) {
            sText = sText.replace(/'/g, "’");
        }
        if (sText.includes("‑")) {
            sText = sText.replace(/‑/g, "-"); // nobreakdash
        }

        // parse sentence
        for (let [iStart, iEnd] of this._getSentenceBoundaries(sText)) {
            if (4 < (iEnd - iStart) < 2000) {
                dDA.clear();
                //helpers.echo(sText.slice(iStart, iEnd));
                try {
                    [, errs] = this._proofread(sText.slice(iStart, iEnd), sAlt.slice(iStart, iEnd), iStart, false, dDA, dPriority, sCountry, bDebug, bContext);
                    dErrors.gl_update(errs);
                }
                catch (e) {
                    helpers.logerror(e);
                }
            }
        }
        return Array.from(dErrors.values());
    },

    _zEndOfSentence: new RegExp ('([.?!:;…][ .?!… »”")]*|.$)', "g"),
    _zBeginOfParagraph: new RegExp ("^[-  –—.,;?!…]*", "ig"),
    _zEndOfParagraph: new RegExp ("[-  .,;?!…–—]*$", "ig"),

    _getSentenceBoundaries: function* (sText) {
        let mBeginOfSentence = this._zBeginOfParagraph.exec(sText);
        let iStart = this._zBeginOfParagraph.lastIndex;
        let m;
        while ((m = this._zEndOfSentence.exec(sText)) !== null) {
            yield [iStart, this._zEndOfSentence.lastIndex];
            iStart = this._zEndOfSentence.lastIndex;
        }
    },

    _proofread: function (s, sx, nOffset, bParagraph, dDA, dPriority, sCountry, bDebug, bContext) {
        let dErrs = new Map();
        let bChange = false;
        let bIdRule = option('idrule');
        let m;
        let bCondMemo;
        let nErrorStart;

        for (let [sOption, lRuleGroup] of this._getRules(bParagraph)) {
            if (!sOption || option(sOption)) {
                for (let [zRegex, bUppercase, sLineId, sRuleId, nPriority, lActions, lGroups, lNegLookBefore] of lRuleGroup) {
                    if (!_aIgnoredRules.has(sRuleId)) {
                        while ((m = zRegex.gl_exec2(s, lGroups, lNegLookBefore)) !== null) {
                            bCondMemo = null;
                            /*if (bDebug) {
                                helpers.echo(">>>> Rule # " + sLineId + " - Text: " + s + " opt: "+ sOption);
                            }*/
                            for (let [sFuncCond, cActionType, sWhat, ...eAct] of lActions) {
                            // action in lActions: [ condition, action type, replacement/suggestion/action[, iGroup[, message, URL]] ]
                                try {
                                    //helpers.echo(oEvalFunc[sFuncCond]);
                                    bCondMemo = (!sFuncCond || oEvalFunc[sFuncCond](s, sx, m, dDA, sCountry, bCondMemo));
                                    if (bCondMemo) {
                                        switch (cActionType) {
                                            case "-":
                                                // grammar error
                                                //helpers.echo("-> error detected in " + sLineId + "\nzRegex: " + zRegex.source);
                                                nErrorStart = nOffset + m.start[eAct[0]];
                                                if (!dErrs.has(nErrorStart) || nPriority > dPriority.get(nErrorStart)) {
                                                    dErrs.set(nErrorStart, this._createError(s, sx, sWhat, nOffset, m, eAct[0], sLineId, sRuleId, bUppercase, eAct[1], eAct[2], bIdRule, sOption, bContext));
                                                    dPriority.set(nErrorStart, nPriority);
                                                }
                                                break;
                                            case "~":
                                                // text processor
                                                //helpers.echo("-> text processor by " + sLineId + "\nzRegex: " + zRegex.source);
                                                s = this._rewrite(s, sWhat, eAct[0], m, bUppercase);
                                                bChange = true;
                                                if (bDebug) {
                                                    helpers.echo("~ " + s + "  -- " + m[eAct[0]] + "  # " + sLineId);
                                                }
                                                break;
                                            case "=":
                                                // disambiguation
                                                //helpers.echo("-> disambiguation by " + sLineId + "\nzRegex: " + zRegex.source);
                                                oEvalFunc[sWhat](s, m, dDA);
                                                if (bDebug) {
                                                    helpers.echo("= " + m[0] + "  # " + sLineId + "\nDA: " + dDA.gl_toString());
                                                }
                                                break;
                                            case ">":
                                                // we do nothing, this test is just a condition to apply all following actions
                                                break;
                                            default:
                                                helpers.echo("# error: unknown action at " + sLineId);
                                        }
                                    } else {
                                        if (cActionType == ">") {
                                            break;
                                        }
                                    }
                                }
                                catch (e) {
                                    helpers.echo(s);
                                    helpers.echo("# line id: " + sLineId + "\n# rule id: " + sRuleId);
                                    helpers.logerror(e);
                                }
                            }
                        }
                    }
                }
            }
        }

        if (bChange) {
            return [s, dErrs];
        }
        return [false, dErrs];
    },

    _createError: function (s, sx, sRepl, nOffset, m, iGroup, sLineId, sRuleId, bUppercase, sMsg, sURL, bIdRule, sOption, bContext) {
        let oErr = {};
        oErr["nStart"] = nOffset + m.start[iGroup];
        oErr["nEnd"] = nOffset + m.end[iGroup];
        oErr["sLineId"] = sLineId;
        oErr["sRuleId"] = sRuleId;
        oErr["sType"] = (sOption) ? sOption : "notype";
        // suggestions
        if (sRepl.slice(0,1) === "=") {
            let sugg = oEvalFunc[sRepl.slice(1)](s, m);
            if (sugg) {
                if (bUppercase && m[iGroup].slice(0,1).gl_isUpperCase()) {
                    oErr["aSuggestions"] = capitalizeArray(sugg.split("|"));
                } else {
                    oErr["aSuggestions"] = sugg.split("|");
                }
            } else {
                oErr["aSuggestions"] = [];
            }
        } else if (sRepl == "_") {
            oErr["aSuggestions"] = [];
        } else {
            if (bUppercase && m[iGroup].slice(0,1).gl_isUpperCase()) {
                oErr["aSuggestions"] = capitalizeArray(sRepl.gl_expand(m).split("|"));
            } else {
                oErr["aSuggestions"] = sRepl.gl_expand(m).split("|");
            }
        }
        // Message
        let sMessage = "";
        if (sMsg.slice(0,1) === "=") {
            sMessage = oEvalFunc[sMsg.slice(1)](s, m);
        } else {
            sMessage = sMsg.gl_expand(m);
        }
        if (bIdRule) {
            sMessage += " ##" + sLineId + " #" + sRuleId;
        }
        oErr["sMessage"] = sMessage;
        // URL
        oErr["URL"] = sURL || "";
        // Context
        if (bContext) {
            oErr["sUnderlined"] = sx.slice(m.start[iGroup], m.end[iGroup]);
            oErr["sBefore"] = sx.slice(Math.max(0, m.start[iGroup]-80), m.start[iGroup]);
            oErr["sAfter"] = sx.slice(m.end[iGroup], m.end[iGroup]+80);
        }
        return oErr;
    },

    _rewrite: function (s, sRepl, iGroup, m, bUppercase) {
        // text processor: write sRepl in s at iGroup position"
        let ln = m.end[iGroup] - m.start[iGroup];
        let sNew = "";
        if (sRepl === "*") {
            sNew = " ".repeat(ln);
        } else if (sRepl === ">" || sRepl === "_" || sRepl === "~") {
            sNew = sRepl + " ".repeat(ln-1);
        } else if (sRepl === "@") {
            sNew = "@".repeat(ln);
        } else if (sRepl.slice(0,1) === "=") {
            sNew = oEvalFunc[sRepl.slice(1)](s, m);
            sNew = sNew + " ".repeat(ln-sNew.length);
            if (bUppercase && m[iGroup].slice(0,1).gl_isUpperCase()) {
                sNew = sNew.gl_toCapitalize();
            }
        } else {
            sNew = sRepl.gl_expand(m);
            sNew = sNew + " ".repeat(ln-sNew.length);
        }
        //helpers.echo("\n"+s+"\nstart: "+m.start[iGroup]+" end:"+m.end[iGroup])
        return s.slice(0, m.start[iGroup]) + sNew + s.slice(m.end[iGroup]);
    },

    // Actions on rules

    ignoreRule: function (sRuleId) {
        _aIgnoredRules.add(sRuleId);
    },

    resetIgnoreRules: function () {
        _aIgnoredRules.clear();
    },

    reactivateRule: function (sRuleId) {
        _aIgnoredRules.delete(sRuleId);
    },

    listRules: function* (sFilter=null) {
        // generator: returns tuple (sOption, sLineId, sRuleId)
        try {
            for (let [sOption, lRuleGroup] of this._getRules(true)) {
                for (let [,, sLineId, sRuleId,,] of lRuleGroup) {
                    if (!sFilter || sRuleId.test(sFilter)) {
                        yield [sOption, sLineId, sRuleId];
                    }
                }
            }
            for (let [sOption, lRuleGroup] of this._getRules(false)) {
                for (let [,, sLineId, sRuleId,,] of lRuleGroup) {
                    if (!sFilter || sRuleId.test(sFilter)) {
                        yield [sOption, sLineId, sRuleId];
                    }
                }
            }
        }
        catch (e) {
            helpers.logerror(e);
        }
    },

    _getRules: function (bParagraph) {
        if (!bParagraph) {
            return gc_rules.lSentenceRules;
        }
        return gc_rules.lParagraphRules;
    },

    //// Initialization

    load: function (sContext="JavaScript", sPath="") {
        try {
            if (typeof(require) !== 'undefined') {
                var ibdawg = require("resource://grammalecte/ibdawg.js");
                _oDict = new ibdawg.IBDAWG("${dic_name}.json");
            } else {
                _oDict = new IBDAWG("${dic_name}.json", sPath);
            }
            _sAppContext = sContext;
            _dOptions = gc_options.getOptions(sContext).gl_shallowCopy();     // duplication necessary, to be able to reset to default
        }
        catch (e) {
            helpers.logerror(e);
        }
    },

    getDictionary: function () {




        return _oDict;



    },


    //// Options

    setOption: function (sOpt, bVal) {
        if (_dOptions.has(sOpt)) {
            _dOptions.set(sOpt, bVal);
        }


    },

    setOptions: function (dOpt) {
        _dOptions.gl_updateOnlyExistingKeys(dOpt);
    },

    getOptions: function () {
        return _dOptions;
    },

    getDefaultOptions: function () {

        return gc_options.getOptions(_sAppContext).gl_shallowCopy();
    },


    resetOptions: function () {
        _dOptions = gc_options.getOptions(_sAppContext).gl_shallowCopy();
    }
};


//////// Common functions

function option (sOpt) {
    // return true if option sOpt is active
    return _dOptions.get(sOpt);
}

function displayInfo (dDA, aWord) {
    // for debugging: info of word
    if (!aWord) {
        helpers.echo("> nothing to find");
        return true;
    }
    if (!_dAnalyses.has(aWord[1]) && !_storeMorphFromFSA(aWord[1])) {
        helpers.echo("> not in FSA");
        return true;
    }
    if (dDA.has(aWord[0])) {
        helpers.echo("DA: " + dDA.get(aWord[0]));
    }
    helpers.echo("FSA: " + _dAnalyses.get(aWord[1]));
    return true;
}

function _storeMorphFromFSA (sWord) {
    // retrieves morphologies list from _oDict -> _dAnalyses
    //helpers.echo("register: "+sWord + " " + _oDict.getMorph(sWord).toString())
    _dAnalyses.set(sWord, _oDict.getMorph(sWord));
    return !!_dAnalyses.get(sWord);
}

function morph (dDA, aWord, sPattern, bStrict=true, bNoWord=false) {
    // analyse a tuple (position, word), return true if sPattern in morphologies (disambiguation on)
    if (!aWord) {
        //helpers.echo("morph: noword, returns " + bNoWord);
        return bNoWord;
    }
    //helpers.echo("aWord: "+aWord.toString());
    if (!_dAnalyses.has(aWord[1]) && !_storeMorphFromFSA(aWord[1])) {
        return false;
    }
    let lMorph = dDA.has(aWord[0]) ? dDA.get(aWord[0]) : _dAnalyses.get(aWord[1]);
    //helpers.echo("lMorph: "+lMorph.toString());
    if (lMorph.length === 0) {
        return false;
    }
    //helpers.echo("***");
    if (bStrict) {
        return lMorph.every(s  =>  (s.search(sPattern) !== -1));
    }
    return lMorph.some(s  =>  (s.search(sPattern) !== -1));
}

function morphex (dDA, aWord, sPattern, sNegPattern, bNoWord=false) {
    // analyse a tuple (position, word), returns true if not sNegPattern in word morphologies and sPattern in word morphologies (disambiguation on)
    if (!aWord) {
        //helpers.echo("morph: noword, returns " + bNoWord);
        return bNoWord;
    }
    //helpers.echo("aWord: "+aWord.toString());
    if (!_dAnalyses.has(aWord[1]) && !_storeMorphFromFSA(aWord[1])) {
        return false;
    }
    let lMorph = dDA.has(aWord[0]) ? dDA.get(aWord[0]) : _dAnalyses.get(aWord[1]);
    //helpers.echo("lMorph: "+lMorph.toString());
    if (lMorph.length === 0) {
        return false;
    }
    //helpers.echo("***");
    // check negative condition
    if (lMorph.some(s  =>  (s.search(sNegPattern) !== -1))) {
        return false;
    }
    // search sPattern
    return lMorph.some(s  =>  (s.search(sPattern) !== -1));
}
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483

484
485
486
487
488
489


490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
    // returns a list of sWord's stems
    if (!sWord) {
        return [];
    }
    if (!_dAnalyses.has(sWord) && !_storeMorphFromFSA(sWord)) {
        return [];
    }
    return [ for (s of _dAnalyses.get(sWord))  s.slice(1, s.indexOf(" ")) ];
}


//// functions to get text outside pattern scope

// warning: check compile_rules.py to understand how it works

function nextword (s, iStart, n) {
    // get the nth word of the input string or empty string
    let z = new RegExp("^( +[a-zà-öA-Zø-ÿÀ-Ö0-9Ø-ßĀ-ʯfi-st%_-]+){" + (n-1).toString() + "} +([a-zà-öA-Zø-ÿÀ-Ö0-9Ø-ßĀ-ʯfi-st%_-]+)", "i");
    let m = z.exec(s.slice(iStart));
    if (!m) {
        return null;
    }
    return [iStart + RegExp.lastIndex - m[2].length, m[2]];
}

function prevword (s, iEnd, n) {
    // get the (-)nth word of the input string or empty string
    let z = new RegExp("([a-zà-öA-Zø-ÿÀ-Ö0-9Ø-ßĀ-ʯfi-st%_-]+) +([a-zà-öA-Zø-ÿÀ-Ö0-9Ø-ßĀ-ʯfi-st%_-]+ +){" + (n-1).toString() + "}$", "i");
    let m = z.exec(s.slice(0, iEnd));
    if (!m) {
        return null;
    }
    return [m.index, m[1]];
}

const _zNextWord = new RegExp ("^ +([a-zà-öA-Zø-ÿÀ-Ö0-9Ø-ßĀ-ʯfi-st_][a-zà-öA-Zø-ÿÀ-Ö0-9Ø-ßĀ-ʯfi-st_-]*)", "i");
const _zPrevWord = new RegExp ("([a-zà-öA-Zø-ÿÀ-Ö0-9Ø-ßĀ-ʯfi-st_][a-zà-öA-Zø-ÿÀ-Ö0-9Ø-ßĀ-ʯfi-st_-]*) +$", "i");

function nextword1 (s, iStart) {
    // get next word (optimization)

    let m = _zNextWord.exec(s.slice(iStart));
    if (!m) {
        return null;
    }
    return [iStart + RegExp.lastIndex - m[1].length, m[1]];
}



function prevword1 (s, iEnd) {
    // get previous word (optimization)
    //echo("prev1, s:"+s);
    //echo("prev1, s.slice(0, iEnd):"+s.slice(0, iEnd));
    let m = _zPrevWord.exec(s.slice(0, iEnd));
    //echo("prev1, m:"+m);
    if (!m) {
        return null;
    }
    //echo("prev1: " + m.index + " " + m[1]);
    return [m.index, m[1]];
}

function look (s, zPattern, zNegPattern=null) {
    // seek zPattern in s (before/after/fulltext), if antipattern zNegPattern not in s
    try {
        if (zNegPattern && zNegPattern.test(s)) {
            return false;
        }
        return zPattern.test(s);
    }
    catch (e) {
        helpers.logerror(e);
    }
    return false;
}

function look_chk1 (dDA, s, nOffset, zPattern, sPatternGroup1, sNegPatternGroup1=null) {
    // returns True if s has pattern zPattern and m.group(1) has pattern sPatternGroup1
    let m = zPattern._exec2(s, null);
    if (!m) {
        return false;
    }
    try {
        let sWord = m[1];
        let nPos = m.start[1] + nOffset;
        if (sNegPatternGroup1) {







|









|




|




|







<
<
<


>




|

>
>



<
<

<



<



















|







470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504



505
506
507
508
509
510
511
512
513
514
515
516
517
518


519

520
521
522

523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
    // returns a list of sWord's stems
    if (!sWord) {
        return [];
    }
    if (!_dAnalyses.has(sWord) && !_storeMorphFromFSA(sWord)) {
        return [];
    }
    return _dAnalyses.get(sWord).map( s => s.slice(1, s.indexOf(" ")) );
}


//// functions to get text outside pattern scope

// warning: check compile_rules.py to understand how it works

function nextword (s, iStart, n) {
    // get the nth word of the input string or empty string
    let z = new RegExp("^(?: +[a-zà-öA-Zø-ÿÀ-Ö0-9Ø-ßĀ-ʯfi-st%_-]+){" + (n-1).toString() + "} +([a-zà-öA-Zø-ÿÀ-Ö0-9Ø-ßĀ-ʯfi-st%_-]+)", "ig");
    let m = z.exec(s.slice(iStart));
    if (!m) {
        return null;
    }
    return [iStart + z.lastIndex - m[1].length, m[1]];
}

function prevword (s, iEnd, n) {
    // get the (-)nth word of the input string or empty string
    let z = new RegExp("([a-zà-öA-Zø-ÿÀ-Ö0-9Ø-ßĀ-ʯfi-st%_-]+) +(?:[a-zà-öA-Zø-ÿÀ-Ö0-9Ø-ßĀ-ʯfi-st%_-]+ +){" + (n-1).toString() + "}$", "i");
    let m = z.exec(s.slice(0, iEnd));
    if (!m) {
        return null;
    }
    return [m.index, m[1]];
}




function nextword1 (s, iStart) {
    // get next word (optimization)
    let _zNextWord = new RegExp ("^ +([a-zà-öA-Zø-ÿÀ-Ö0-9Ø-ßĀ-ʯfi-st_][a-zà-öA-Zø-ÿÀ-Ö0-9Ø-ßĀ-ʯfi-st_-]*)", "ig");
    let m = _zNextWord.exec(s.slice(iStart));
    if (!m) {
        return null;
    }
    return [iStart + _zNextWord.lastIndex - m[1].length, m[1]];
}

const _zPrevWord = new RegExp ("([a-zà-öA-Zø-ÿÀ-Ö0-9Ø-ßĀ-ʯfi-st_][a-zà-öA-Zø-ÿÀ-Ö0-9Ø-ßĀ-ʯfi-st_-]*) +$", "i");

function prevword1 (s, iEnd) {
    // get previous word (optimization)


    let m = _zPrevWord.exec(s.slice(0, iEnd));

    if (!m) {
        return null;
    }

    return [m.index, m[1]];
}

function look (s, zPattern, zNegPattern=null) {
    // seek zPattern in s (before/after/fulltext), if antipattern zNegPattern not in s
    try {
        if (zNegPattern && zNegPattern.test(s)) {
            return false;
        }
        return zPattern.test(s);
    }
    catch (e) {
        helpers.logerror(e);
    }
    return false;
}

function look_chk1 (dDA, s, nOffset, zPattern, sPatternGroup1, sNegPatternGroup1=null) {
    // returns True if s has pattern zPattern and m.group(1) has pattern sPatternGroup1
    let m = zPattern.gl_exec2(s, null);
    if (!m) {
        return false;
    }
    try {
        let sWord = m[1];
        let nPos = m.start[1] + nOffset;
        if (sNegPatternGroup1) {
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
    }
    if (dDA.has(nPos)) {
        return true;
    }
    if (!_dAnalyses.has(sWord) && !_storeMorphFromFSA(sWord)) {
        return true;
    }
    //echo("morph: "+_dAnalyses.get(sWord).toString());
    if (_dAnalyses.get(sWord).length === 1) {
        return true;
    }
    let lSelect = [ for (sMorph of _dAnalyses.get(sWord))  if (sMorph.search(sPattern) !== -1)  sMorph ];
    //echo("lSelect: "+lSelect.toString());
    if (lSelect.length > 0) {
        if (lSelect.length != _dAnalyses.get(sWord).length) {
            dDA.set(nPos, lSelect);
        }
    } else if (lDefault) {
        dDA.set(nPos, lDefaul);
    }







<



|
<







566
567
568
569
570
571
572

573
574
575
576

577
578
579
580
581
582
583
    }
    if (dDA.has(nPos)) {
        return true;
    }
    if (!_dAnalyses.has(sWord) && !_storeMorphFromFSA(sWord)) {
        return true;
    }

    if (_dAnalyses.get(sWord).length === 1) {
        return true;
    }
    let lSelect = _dAnalyses.get(sWord).filter( sMorph => sMorph.search(sPattern) !== -1 );

    if (lSelect.length > 0) {
        if (lSelect.length != _dAnalyses.get(sWord).length) {
            dDA.set(nPos, lSelect);
        }
    } else if (lDefault) {
        dDA.set(nPos, lDefaul);
    }
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595

596
597
598
599
600
601
602
603
604
605
606
607

608
609
610















611
612
613
614
615
616
617
618
619
620

    }
    if (!_dAnalyses.has(sWord) && !_storeMorphFromFSA(sWord)) {
        return true;
    }
    if (_dAnalyses.get(sWord).length === 1) {
        return true;
    }
    let lSelect = [ for (sMorph of _dAnalyses.get(sWord))  if (sMorph.search(sPattern) === -1)  sMorph ];
    //echo("lSelect: "+lSelect.toString());
    if (lSelect.length > 0) {
        if (lSelect.length != _dAnalyses.get(sWord).length) {
            dDA.set(nPos, lSelect);
        }
    } else if (lDefault) {
        dDA.set(nPos, lDefault);
    }
    return true;
}

function define (dDA, nPos, lMorph) {
    dDA.set(nPos, lMorph);
    return true;
}


//////// GRAMMAR CHECKER PLUGINS

${pluginsJS}


${callablesJS}




exports.load = load;

exports.parse = parse;
exports.lang = lang;
exports.version = version;















exports.getDictionary = getDictionary;
exports.setOption = setOption;
exports.setOptions = setOptions;
exports.getOptions = getOptions;
exports.getDefaultOptions = getDefaultOptions;
exports.resetOptions = resetOptions;
exports.ignoreRule = ignoreRule;
exports.reactivateRule = reactivateRule;
exports.resetIgnoreRules = resetIgnoreRules;
exports.listRules = listRules;








|
<














>










|
|
>
|
|
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|
|
|
|
|
<
<
<
<
>
593
594
595
596
597
598
599
600

601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652




653
    }
    if (!_dAnalyses.has(sWord) && !_storeMorphFromFSA(sWord)) {
        return true;
    }
    if (_dAnalyses.get(sWord).length === 1) {
        return true;
    }
    let lSelect = _dAnalyses.get(sWord).filter( sMorph => sMorph.search(sPattern) === -1 );

    if (lSelect.length > 0) {
        if (lSelect.length != _dAnalyses.get(sWord).length) {
            dDA.set(nPos, lSelect);
        }
    } else if (lDefault) {
        dDA.set(nPos, lDefault);
    }
    return true;
}

function define (dDA, nPos, lMorph) {
    dDA.set(nPos, lMorph);
    return true;
}


//////// GRAMMAR CHECKER PLUGINS

${pluginsJS}


${callablesJS}



if (typeof(exports) !== 'undefined') {
    exports.lang = gc_engine.lang;
    exports.locales = gc_engine.locales;
    exports.pkg = gc_engine.pkg;
    exports.name = gc_engine.name;
    exports.version = gc_engine.version;
    exports.author = gc_engine.author;
    exports.parse = gc_engine.parse;
    exports._zEndOfSentence = gc_engine._zEndOfSentence;
    exports._zBeginOfParagraph = gc_engine._zBeginOfParagraph;
    exports._zEndOfParagraph = gc_engine._zEndOfParagraph;
    exports._getSentenceBoundaries = gc_engine._getSentenceBoundaries;
    exports._proofread = gc_engine._proofread;
    exports._createError = gc_engine._createError;
    exports._rewrite = gc_engine._rewrite;
    exports.ignoreRule = gc_engine.ignoreRule;
    exports.resetIgnoreRules = gc_engine.resetIgnoreRules;
    exports.reactivateRule = gc_engine.reactivateRule;
    exports.listRules = gc_engine.listRules;
    exports._getRules = gc_engine._getRules;
    exports.load = gc_engine.load;
    exports.getDictionary = gc_engine.getDictionary;
    exports.setOption = gc_engine.setOption;
    exports.setOptions = gc_engine.setOptions;
    exports.getOptions = gc_engine.getOptions;
    exports.getDefaultOptions = gc_engine.getDefaultOptions;
    exports.resetOptions = gc_engine.resetOptions;




}

Modified gc_core/js/lang_core/gc_options.js from [3105c2862f] to [f47ea826e5].

1


2
3
4









5
6

7



8
9
10




11
12
13

// Options for Grammalecte



${map}










const lStructOpt = ${lStructOpt};


const dOpt = new Map (${dOptJavaScript});




const dOptLabel = ${dOptLabel};





exports.lStructOpt = lStructOpt;
exports.dOpt = dOpt;
exports.dOptLabel = dOptLabel;


>
>



>
>
>
>
>
>
>
>
>
|

>
|
>
>
>

|
|
>
>
>
>
|
|
|
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// Options for Grammalecte
/*jslint esversion: 6*/
/*global exports*/

${map}


var gc_options = {
    getOptions: function (sContext="JavaScript") {
        if (this.dOpt.hasOwnProperty(sContext)) {
            return this.dOpt[sContext];
        }
        return this.dOpt["JavaScript"];
    },

    lStructOpt: ${lStructOpt},

    dOpt: {
        "JavaScript": new Map (${dOptJavaScript}),
        "Firefox": new Map (${dOptFirefox}),
        "Thunderbird": new Map (${dOptThunderbird}),
    },

    dOptLabel: ${dOptLabel}
}


if (typeof(exports) !== 'undefined') {
	exports.getOptions = gc_options.getOptions;
	exports.lStructOpt = gc_options.lStructOpt;
    exports.dOpt = gc_options.dOpt;
	exports.dOptLabel = gc_options.dOptLabel;
}

Modified gc_core/js/lang_core/gc_rules.js from [c85bd666a1] to [cdb121423e].

1



2
3
4
5
6

7
8
9
10
11


12
13

// Grammar checker rules



"use strict";

${string}
${regex}


const lParagraphRules = ${paragraph_rules_JS};

const lSentenceRules = ${sentence_rules_JS};




exports.lParagraphRules = lParagraphRules;
exports.lSentenceRules = lSentenceRules;


>
>
>





>
|

|
|

>
>
|
|
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Grammar checker rules
/*jslint esversion: 6*/
/*global exports*/

"use strict";

${string}
${regex}

var gc_rules = {
    lParagraphRules: ${paragraph_rules_JS},

    lSentenceRules: ${sentence_rules_JS}
}


if (typeof(exports) !== 'undefined') {
    exports.lParagraphRules = gc_rules.lParagraphRules;
    exports.lSentenceRules = gc_rules.lSentenceRules;
}

Modified gc_core/js/str_transform.js from [572c35f46a] to [6745507121].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34


35
36
37
38
39
40
41
42

43
44
45
46
47
48
49
50
51
52
53
54

55
56

57
58

//// STRING TRANSFORMATION

var dSimilarChars = new Map ([
    ["a", "aàâáä"],
    ["à", "aàâáä"],
    ["â", "aàâáä"],
    ["á", "aàâáä"],
    ["ä", "aàâáä"],
    ["c", "cç"],
    ["ç", "cç"],
    ["e", "eéêèë"],
    ["é", "eéêèë"],
    ["ê", "eéêèë"],
    ["è", "eéêèë"],
    ["ë", "eéêèë"],
    ["i", "iîïíì"],
    ["î", "iîïíì"],
    ["ï", "iîïíì"],
    ["í", "iîïíì"],
    ["ì", "iîïíì"],
    ["o", "oôóòö"],
    ["ô", "oôóòö"],
    ["ó", "oôóòö"],
    ["ò", "oôóòö"],
    ["ö", "oôóòö"],
    ["u", "uûùüú"],
    ["û", "uûùüú"],
    ["ù", "uûùüú"],
    ["ü", "uûùüú"],
    ["ú", "uûùüú"]
]);

// Note: 48 is the ASCII code for "0"



// Suffix only
function getStemFromSuffixCode (sFlex, sSfxCode) {
    if (sSfxCode == "0") {
        return sFlex;
    }
    return sSfxCode[0] == '0' ? sFlex + sSfxCode.slice(1) : sFlex.slice(0, -(sSfxCode.charCodeAt(0)-48)) + sSfxCode.slice(1);
}


// Prefix and suffix
function getStemFromAffixCode (sFlex, sAffCode) {
    if (sAffCode == "0") {
        return sFlex;
    }
    if (!sAffCode.includes("/")) {
        return "# error #";
    }
    var [sPfxCode, sSfxCode] = sAffCode.split('/');
    sFlex = sPfxCode.slice(1) + sFlex.slice(sPfxCode.charCodeAt(0)-48);
    return sSfxCode[0] == '0' ? sFlex + sSfxCode.slice(1) : sFlex.slice(0, -(sSfxCode.charCodeAt(0)-48)) + sSfxCode.slice(1);
}




exports.getStemFromSuffixCode = getStemFromSuffixCode;
exports.getStemFromAffixCode = getStemFromAffixCode;


|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<



>
>
|
<
|
|
|
|
|
|
>
|
<
|
|
|
|
|
|
|
|
|
|
>


>
|
|
>
1
2





























3
4
5
6
7
8

9
10
11
12
13
14
15
16

17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//// STRING TRANSFORMATION
/*jslint esversion: 6*/






























// Note: 48 is the ASCII code for "0"

var str_transform = {
    getStemFromSuffixCode: function (sFlex, sSfxCode) {
        // Suffix only

        if (sSfxCode == "0") {
            return sFlex;
        }
        return sSfxCode[0] == '0' ? sFlex + sSfxCode.slice(1) : sFlex.slice(0, -(sSfxCode.charCodeAt(0)-48)) + sSfxCode.slice(1);
    },
    
    getStemFromAffixCode: function (sFlex, sAffCode) {
        // Prefix and suffix

        if (sAffCode == "0") {
            return sFlex;
        }
        if (!sAffCode.includes("/")) {
            return "# error #";
        }
        let [sPfxCode, sSfxCode] = sAffCode.split('/');
        sFlex = sPfxCode.slice(1) + sFlex.slice(sPfxCode.charCodeAt(0)-48);
        return sSfxCode[0] == '0' ? sFlex + sSfxCode.slice(1) : sFlex.slice(0, -(sSfxCode.charCodeAt(0)-48)) + sSfxCode.slice(1);
    }
};


if (typeof(exports) !== 'undefined') {
    exports.getStemFromSuffixCode = str_transform.getStemFromSuffixCode;
    exports.getStemFromAffixCode = str_transform.getStemFromAffixCode;
}

Modified gc_core/js/tests.js from [24427fff6b] to [4504bb3576].

1


2
3
4
5

6

7
8
9
10
11
12

13
14

15
16
17

18
19
20
21
22
23
24
25
26
27
28
// JavaScript



"use strict";



const helpers = require("resource://grammalecte/helpers.js");



class TestGrammarChecking {

    constructor (gce) {
        this.gce = gce;

        this._aRuleTested = new Set();
    };


    * testParse (bDebug=false) {
        const t0 = Date.now();

        const aData = JSON.parse(helpers.loadFile("resource://grammalecte/"+this.gce.lang+"/tests_data.json")).aData;
        //const aData = require("resource://grammalecte/"+this.gce.lang+"/tests_data.js").aData;
        let nInvalid = 0
        let nTotal = 0
        let sErrorText;
        let sSugg;
        let sExpectedErrors;
        let sTextToCheck;
        let sFoundErrors;
        let sListErr;
        let sLineNum;

>
>




>
|
>




|

>

<
>



>
|
<
|
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

19
20
21
22
23
24

25
26
27
28
29
30
31
32
33
// JavaScript
/*jslint esversion: 6*/
/*global console,require,exports*/

"use strict";


if (typeof(require) !== 'undefined') {
    var helpers = require("resource://grammalecte/helpers.js");
}


class TestGrammarChecking {

    constructor (gce, spfTests="") {
        this.gce = gce;
        this.spfTests = spfTests;
        this._aRuleTested = new Set();

    }

    * testParse (bDebug=false) {
        const t0 = Date.now();
        let sURL = (this.spfTests !== "") ? this.spfTests : "resource://grammalecte/"+this.gce.lang+"/tests_data.json";
        const aData = JSON.parse(helpers.loadFile(sURL)).aData;

        let nInvalid = 0;
        let nTotal = 0;
        let sErrorText;
        let sSugg;
        let sExpectedErrors;
        let sTextToCheck;
        let sFoundErrors;
        let sListErr;
        let sLineNum;
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95

96
97
98
99
100
101
102
                    if (sExpectedErrors !== sFoundErrors) {
                        yield "\n" + i.toString() +
                              "\n# Line num: " + sLineNum +
                              "\n> to check: " + sTextToCheck +
                              "\n  expected: " + sExpectedErrors +
                              "\n  found:    " + sFoundErrors +
                              "\n  errors:   \n" + sListErr;
                        nInvalid = nInvalid + 1
                    }
                    nTotal = nTotal + 1;
                }
                i = i + 1;
                if (i % 1000 === 0) {
                    yield i.toString();
                }
            }
            bShowUntested = true;
        }
        catch (e) {
            helpers.logerror(e);
        }

        if (bShowUntested) {
            i = 0;
            for (let [sOpt, sLineId, sRuleId] of gce.listRules()) {
                if (!this._aRuleTested.has(sLineId) && !/^[0-9]+[sp]$|^[pd]_/.test(sRuleId)) {
                    sUntestedRules += sRuleId + ", ";
                    i += 1;
                }
            }
            if (i > 0) {
                yield sUntestedRules + "\n[" + i.toString() + " untested rules]";
            }
        }

        const t1 = Date.now();
        yield "Tests parse finished in " + ((t1-t0)/1000).toString()
            + " s\nTotal errors: " + nInvalid.toString() + " / " + nTotal.toString();
    };


    _getExpectedErrors (sLine) {
        try {
            let sRes = " ".repeat(sLine.length);
            let z = /\{\{.+?\}\}/g;
            let m;
            let i = 0;







|
















|













<
>







62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99

100
101
102
103
104
105
106
107
                    if (sExpectedErrors !== sFoundErrors) {
                        yield "\n" + i.toString() +
                              "\n# Line num: " + sLineNum +
                              "\n> to check: " + sTextToCheck +
                              "\n  expected: " + sExpectedErrors +
                              "\n  found:    " + sFoundErrors +
                              "\n  errors:   \n" + sListErr;
                        nInvalid = nInvalid + 1;
                    }
                    nTotal = nTotal + 1;
                }
                i = i + 1;
                if (i % 1000 === 0) {
                    yield i.toString();
                }
            }
            bShowUntested = true;
        }
        catch (e) {
            helpers.logerror(e);
        }

        if (bShowUntested) {
            i = 0;
            for (let [sOpt, sLineId, sRuleId] of this.gce.listRules()) {
                if (!this._aRuleTested.has(sLineId) && !/^[0-9]+[sp]$|^[pd]_/.test(sRuleId)) {
                    sUntestedRules += sRuleId + ", ";
                    i += 1;
                }
            }
            if (i > 0) {
                yield sUntestedRules + "\n[" + i.toString() + " untested rules]";
            }
        }

        const t1 = Date.now();
        yield "Tests parse finished in " + ((t1-t0)/1000).toString()
            + " s\nTotal errors: " + nInvalid.toString() + " / " + nTotal.toString();

    }

    _getExpectedErrors (sLine) {
        try {
            let sRes = " ".repeat(sLine.length);
            let z = /\{\{.+?\}\}/g;
            let m;
            let i = 0;
114
115
116
117
118
119
120
121

122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146

147
148
149


150

            }
            return sRes;
        }
        catch (e) {
            helpers.logerror(e);
        }
        return " ".repeat(sLine.length);
    };


    _getFoundErrors (sLine, bDebug, sOption) {
        try {
            let aErrs = [];
            if (sOption) {
                gce.setOption(sOption, true);
                aErrs = this.gce.parse(sLine, "FR", bDebug);
                gce.setOption(sOption, false);
            } else {
                aErrs = this.gce.parse(sLine, "FR", bDebug);
            }
            let sRes = " ".repeat(sLine.length);
            let sListErr = "";
            for (let dErr of aErrs) {
                sRes = sRes.slice(0, dErr["nStart"]) + "~".repeat(dErr["nEnd"] - dErr["nStart"]) + sRes.slice(dErr["nEnd"]);
                sListErr += "    * {" + dErr['sLineId'] + " / " + dErr['sRuleId'] + "}  at  " + dErr['nStart'] + ":" + dErr['nEnd'] + "\n";
                this._aRuleTested.add(dErr["sLineId"]);
            }
            return [sRes, sListErr];
        }
        catch (e) {
            helpers.logerror(e);
        }
        return [" ".repeat(sLine.length), ""];
    };


}



exports.TestGrammarChecking = TestGrammarChecking;








<
>





|

|
















<
>



>
>
|
>
119
120
121
122
123
124
125

126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150

151
152
153
154
155
156
157
158
            }
            return sRes;
        }
        catch (e) {
            helpers.logerror(e);
        }
        return " ".repeat(sLine.length);

    }

    _getFoundErrors (sLine, bDebug, sOption) {
        try {
            let aErrs = [];
            if (sOption) {
                this.gce.setOption(sOption, true);
                aErrs = this.gce.parse(sLine, "FR", bDebug);
                this.gce.setOption(sOption, false);
            } else {
                aErrs = this.gce.parse(sLine, "FR", bDebug);
            }
            let sRes = " ".repeat(sLine.length);
            let sListErr = "";
            for (let dErr of aErrs) {
                sRes = sRes.slice(0, dErr["nStart"]) + "~".repeat(dErr["nEnd"] - dErr["nStart"]) + sRes.slice(dErr["nEnd"]);
                sListErr += "    * {" + dErr['sLineId'] + " / " + dErr['sRuleId'] + "}  at  " + dErr['nStart'] + ":" + dErr['nEnd'] + "\n";
                this._aRuleTested.add(dErr["sLineId"]);
            }
            return [sRes, sListErr];
        }
        catch (e) {
            helpers.logerror(e);
        }
        return [" ".repeat(sLine.length), ""];

    }

}


if (typeof(exports) !== 'undefined') {
    exports.TestGrammarChecking = TestGrammarChecking;
}

Modified gc_core/js/text.js from [f8cb0efb57] to [9bf91b3594].

1


2
3
4


5
6
7


8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
// JavaScript



"use strict";



const helpers = require("resource://grammalecte/helpers.js");




function* getParagraph (sText) {
    // generator: returns paragraphs of text
    let iStart = 0;
    let iEnd = 0;
    sText = sText.replace("\r", "");
    while ((iEnd = sText.indexOf("\n", iStart)) !== -1) {
        yield sText.slice(iStart, iEnd);
        iStart = iEnd + 1;
    }
    yield sText.slice(iStart);
}

function* wrap (sText, nWidth=80) {
    // generator: returns text line by line
    while (sText) {
        if (sText.length >= nWidth) {
            let nEnd = sText.lastIndexOf(" ", nWidth) + 1;
            if (nEnd > 0) {
                yield sText.slice(0, nEnd);
                sText = sText.slice(nEnd);
            } else {
                yield sText.slice(0, nWidth);
                sText = sText.slice(nWidth);
            }
        } else {
            break;
        }
    }
    yield sText;
}

function getReadableError (oErr) {
    // Returns an error oErr as a readable error
    try {
        let s = "\n* " + oErr['nStart'] + ":" + oErr['nEnd'] + "  # " + oErr['sRuleId']+":\n";

        s += "  " + oErr["sMessage"];
        if (oErr["aSuggestions"].length > 0) {
            s += "\n  > Suggestions : " + oErr["aSuggestions"].join(" | ");
        }
        if (oErr["URL"] !== "") {
            s += "\n  > URL: " + oErr["URL"];
        }
        return s;
    }
    catch (e) {
        helpers.logerror(e);
        return "\n# Error. Data: " + oErr.toString();
    }
}

function addHtmlEntities (sParagraph) {
    if (sParagraph.includes("&")) {
        sParagraph = sParagraph.replace(/&/g, "&amp;");
    }
    if (sParagraph.includes("<")) {
        sParagraph = sParagraph.replace(/</g, "&lt;").replace(/>/g, "&gt;");
    }
    return sParagraph;
}

function createHTMLBlock (sParagraph, iParagraph) {
    let sClassName = (sParagraph.includes('<u id="err')) ? " softred" : "";
    return '<p id="paragr'+iParagraph.toString()+'" class="paragraph' + sClassName + '" lang="fr" spellcheck="false">' + sParagraph + '</p>\n'
           + '<div class="actions"><div id="end'+iParagraph.toString()+'" class="button red">×</div>'
           + '<div id="edit'+iParagraph.toString()+'" class="button">Éditer</div>'
           + '<div id="check'+iParagraph.toString()+'" class="button green">Réanalyser</div>&nbsp;</div>\n';
}

function tagParagraph (sParagraph, iParagraph, aGrammErr, aSpellErr, bDebug=false) {
    // Returns a text with with underlined errors and messages in tooltip
    try {
        if (aGrammErr.length === 0  &&  aSpellErr.length === 0) {
            return sParagraph;
        }
        aGrammErr.push(...aSpellErr);
        aGrammErr.sort(function (a, b) {
            if (a["nStart"] < b["nStart"])
                return 1;
            if (a["nStart"] > b["nStart"])
                return -1;
            return 0;
        });

        let nErr = aGrammErr.length - 1; // we count errors to give them an identifier
        let nStartLastErr = sParagraph.length;
        for (let oErr of aGrammErr) {
            let sErrId = iParagraph.toString() + "_" + nErr.toString();
            let nStart = oErr["nStart"];
            let nEnd = oErr["nEnd"];
            if (nEnd <= nStartLastErr) {
                oErr["sId"] = sErrId;
                if (oErr['sType'] !== 'WORD') {
                    // Grammar Error
                    sParagraph = sParagraph.slice(0, nStart)
                               + '<u id="err' + sErrId + '" class="error '+oErr['sType']+'" href="#" onclick="return false;">'
                               + sParagraph.slice(nStart, nEnd)
                               + '<span id="tooltip' + sErrId + '" class="tooltip" contenteditable="false">'
                               + getGrammarErrorHTML(oErr, bDebug) + '</span>'
                               + "</u><!-- err_end -->" + sParagraph.slice(nEnd);
                } else {
                    // Spelling error
                    sParagraph = sParagraph.slice(0, nStart)
                               + '<u id="err' + sErrId + '" class="error spell" href="#" onclick="return false;">'
                               + sParagraph.slice(nStart, nEnd)
                               + '<span id="tooltip' + sErrId + '" class="tooltip" contenteditable="false">'
                               + getSpellingErrorHTML(oErr) + '</span>'
                               + "</u><!-- err_end -->" + sParagraph.slice(nEnd);
                }
                nStartLastErr = nStart;
            }
            nErr -= 1;
        }
        return sParagraph;
    }
    catch (e) {
        helpers.logerror(e);
        return "# Error.";
    }
}

function getGrammarErrorHTML (oErr, bDebug=false) {
    // Returns an error oErr as a readable error in HTML
    try {
        let sErr = '';
        if (bDebug) {
            sErr += '<em class="debug">'
              + '<i id="data'+oErr['sId']+'" class="data" hidden>'
              + oErr['nStart'] + ":" + oErr['nEnd'] + ' · #' + oErr['sRuleId'] + " </i>+</em>";
        }
        sErr += oErr["sMessage"];
        sErr += ' <a id="ignore'+oErr['sId']+'" class="ignore" href="#" onclick="return false;">IGNORER</a>';
        if (oErr["URL"] !== "") {
            sErr += ' <a href="' + oErr["URL"] + '" onclick="return false;">Infos…</a>';
        }
        if (oErr["aSuggestions"].length > 0) {
            sErr += '<br/><s>Suggestions :</s><br/>';
            let iSugg = 0;
            for (let sSugg of oErr["aSuggestions"]) {
                sErr += '<a id="sugg' + oErr['sId'] + "-" + iSugg + '" class="sugg" href="#" onclick="return false;">' + sSugg + '</a> ';
                iSugg += 1;
            }
        }
        return sErr;
    }
    catch (e) {
        helpers.logerror(e);
        return '# Error. Data: ' + oErr.toString();
    }
}

function getSpellingErrorHTML (oErr) {
    // Returns an error oErr as a readable error in HTML
    try {
        let sErr = 'Mot inconnu du dictionnaire.';
        sErr += ' <a id="ignore' + oErr['sId'] + '" class="ignore" href="#" onclick="return false;">IGNORER</a>';
        sErr += '<br/><s>Suggestions :</s><br/>';
        return sErr;
    }
    catch (e) {
        helpers.logerror(e);
        return '# Error. Data: ' + oErr.toString();
    }
}


exports.getParagraph = getParagraph;
exports.addHtmlEntities = addHtmlEntities;
exports.createHTMLBlock = createHTMLBlock;
exports.tagParagraph = tagParagraph;
exports.getReadableError = getReadableError;

>
>



>
>
|
|

>
>
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
<
<
<
|
<
<
|
<
|
|
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63




64


65

66
67







68














69




































70








71









































// JavaScript
/*jslint esversion: 6*/
/*global require,exports*/

"use strict";


if (typeof(require) !== 'undefined') {
    var helpers = require("resource://grammalecte/helpers.js");
}


var text = {
    getParagraph: function* (sText) {
        // generator: returns paragraphs of text
        let iStart = 0;
        let iEnd = 0;
        sText = sText.replace("\r\n", "\n").replace("\r", "\n");
        while ((iEnd = sText.indexOf("\n", iStart)) !== -1) {
            yield sText.slice(iStart, iEnd);
            iStart = iEnd + 1;
        }
        yield sText.slice(iStart);
    },

    wrap: function* (sText, nWidth=80) {
        // generator: returns text line by line
        while (sText) {
            if (sText.length >= nWidth) {
                let nEnd = sText.lastIndexOf(" ", nWidth) + 1;
                if (nEnd > 0) {
                    yield sText.slice(0, nEnd);
                    sText = sText.slice(nEnd);
                } else {
                    yield sText.slice(0, nWidth);
                    sText = sText.slice(nWidth);
                }
            } else {
                break;
            }
        }
        yield sText;
    },

    getReadableError: function (oErr) {
        // Returns an error oErr as a readable error
        try {
            let sResult = "\n* " + oErr['nStart'] + ":" + oErr['nEnd'] 
                        + "  # " + oErr['sLineId'] + "  # " + oErr['sRuleId'] + ":\n";
            sResult += "  " + oErr["sMessage"];
            if (oErr["aSuggestions"].length > 0) {
                sResult += "\n  > Suggestions : " + oErr["aSuggestions"].join(" | ");
            }
            if (oErr["URL"] !== "") {
                sResult += "\n  > URL: " + oErr["URL"];
            }
            return sResult;
        }
        catch (e) {
            helpers.logerror(e);
            return "\n# Error. Data: " + oErr.toString();
        }
    }




};





if (typeof(exports) !== 'undefined') {







    exports.getParagraph = text.getParagraph;














    exports.wrap = text.wrap;




































    exports.getReadableError = text.getReadableError;








}









































Modified gc_core/js/tokenizer.js from [d06151ccd7] to [81088a0177].

1
2


3
4
5


6
7
8

9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

51
52
53
54
55
56
57
58
59





60

61
62
63
64
65
66
67
68
69
70
71
72
73





74







75

// JavaScript
// Very simple tokenizer



"use strict";



const helpers = require("resource://grammalecte/helpers.js");



const aPatterns = {
    // All regexps must start with ^.
    "default":
        [
            [/^[   \t]+/, 'SPACE'],
            [/^[,.;:!?…«»“”"()]+/, 'SEPARATOR'],
            [/^(?:https?:\/\/|www[.]|[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st_]+[@.][a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st_]+[@.])[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st_.\/?&!%=+*"'@$#-]+/, 'LINK'],
            [/^[#@][a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st_-]+/, 'TAG'],
            [/^<[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+.*?>|<\/[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+ *>/, 'HTML'],
            [/^\[\/?[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+\]/, 'PSEUDOHTML'],
            [/^&\w+;(?:\w+;|)/, 'HTMLENTITY'],
            [/^\d\d?h\d\d\b/, 'HOUR'],
            [/^-?\d+(?:[.,]\d+|)/, 'NUM'],
            [/^[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+(?:[’'`-][a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+)*/, 'WORD']
        ],
    "fr":
        [
            [/^[   \t]+/, 'SPACE'],
            [/^[,.;:!?…«»“”"()]+/, 'SEPARATOR'],
            [/^(?:https?:\/\/|www[.]|[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st_]+[@.][a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st_]+[@.])[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st_.\/?&!%=+*"'@$#-]+/, 'LINK'],
            [/^[#@][a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st_-]+/, 'TAG'],
            [/^<[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+.*?>|<\/[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+ *>/, 'HTML'],
            [/^\[\/?[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+\]/, 'PSEUDOHTML'],
            [/^&\w+;(?:\w+;|)/, 'HTMLENTITY'],
            [/^(?:l|d|n|m|t|s|j|c|ç|lorsqu|puisqu|jusqu|quoiqu|qu)['’`]/i, 'ELPFX'],
            [/^\d\d?[hm]\d\d\b/, 'HOUR'],
            [/^\d+(?:er|nd|e|de|ième|ème|eme)\b/, 'ORDINAL'],
            [/^-?\d+(?:[.,]\d+|)/, 'NUM'],
            [/^[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+(?:[’'`-][a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+)*/, 'WORD']
        ]
}


class Tokenizer {

    constructor (sLang) {
        this.sLang = sLang;
        if (!aPatterns.hasOwnProperty(sLang)) {
            this.sLang = "default";
        }
        this.aRules = aPatterns[sLang];
    };


    * genTokens (sText) {
        let m;
        let i = 0;
        while (sText) {
            let nCut = 1;
            for (let [zRegex, sType] of this.aRules) {
                try {
                    if ((m = zRegex.exec(sText)) !== null) {





                        yield { "sType": sType, "sValue": m[0], "nStart": i, "nEnd": i + m[0].length }

                        nCut = m[0].length;
                        break;
                    }
                }
                catch (e) {
                    helpers.logerror(e);
                }
            }
            i += nCut;
            sText = sText.slice(nCut);
        }
    }
}













exports.Tokenizer = Tokenizer;



>
>



>
>
|
|

>
|




|












|







|



|






|


|
<
>









>
>
>
>
>
|
>












|
>
>
>
>
>
|
>
>
>
>
>
>
>
|
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
// JavaScript
// Very simple tokenizer
/*jslint esversion: 6*/
/*global require,exports*/

"use strict";


if (typeof(require) !== 'undefined') {
    var helpers = require("resource://grammalecte/helpers.js");
}


const aTkzPatterns = {
    // All regexps must start with ^.
    "default":
        [
            [/^[   \t]+/, 'SPACE'],
            [/^[,.;:!?…«»“”‘’"(){}\[\]/·–—]+/, 'SEPARATOR'],
            [/^(?:https?:\/\/|www[.]|[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st_]+[@.][a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st_]+[@.])[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st_.\/?&!%=+*"'@$#-]+/, 'LINK'],
            [/^[#@][a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st_-]+/, 'TAG'],
            [/^<[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+.*?>|<\/[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+ *>/, 'HTML'],
            [/^\[\/?[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+\]/, 'PSEUDOHTML'],
            [/^&\w+;(?:\w+;|)/, 'HTMLENTITY'],
            [/^\d\d?h\d\d\b/, 'HOUR'],
            [/^-?\d+(?:[.,]\d+|)/, 'NUM'],
            [/^[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+(?:[’'`-][a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+)*/, 'WORD']
        ],
    "fr":
        [
            [/^[   \t]+/, 'SPACE'],
            [/^[,.;:!?…«»“”‘’"(){}\[\]/·–—]+/, 'SEPARATOR'],
            [/^(?:https?:\/\/|www[.]|[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st_]+[@.][a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st_]+[@.])[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st_.\/?&!%=+*"'@$#-]+/, 'LINK'],
            [/^[#@][a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st_-]+/, 'TAG'],
            [/^<[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+.*?>|<\/[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+ *>/, 'HTML'],
            [/^\[\/?[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+\]/, 'PSEUDOHTML'],
            [/^&\w+;(?:\w+;|)/, 'HTMLENTITY'],
            [/^(?:l|d|n|m|t|s|j|c|ç|lorsqu|puisqu|jusqu|quoiqu|qu)['’`]/i, 'ELPFX'],
            [/^\d\d?[hm]\d\d\b/, 'HOUR'],
            [/^\d+(?:er|nd|e|de|ième|ème|eme)s?\b/, 'ORDINAL'],
            [/^-?\d+(?:[.,]\d+|)/, 'NUM'],
            [/^[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+(?:[’'`-][a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯfi-st]+)*/, 'WORD']
        ]
};


class Tokenizer {

    constructor (sLang) {
        this.sLang = sLang;
        if (!aTkzPatterns.hasOwnProperty(sLang)) {
            this.sLang = "default";
        }
        this.aRules = aTkzPatterns[this.sLang];

    }

    * genTokens (sText) {
        let m;
        let i = 0;
        while (sText) {
            let nCut = 1;
            for (let [zRegex, sType] of this.aRules) {
                try {
                    if ((m = zRegex.exec(sText)) !== null) {
                        if (sType == 'SEPARATOR') {
                            for (let c of m[0]) {
                                yield { "sType": sType, "sValue": c, "nStart": i, "nEnd": i + m[0].length }    
                            }
                        } else {
                            yield { "sType": sType, "sValue": m[0], "nStart": i, "nEnd": i + m[0].length }    
                        }
                        nCut = m[0].length;
                        break;
                    }
                }
                catch (e) {
                    helpers.logerror(e);
                }
            }
            i += nCut;
            sText = sText.slice(nCut);
        }
    }

    getSpellingErrors (sText, oDict) {
        let aSpellErr = [];
        for (let oToken of this.genTokens(sText)) {
            if (oToken.sType === 'WORD' && !oDict.isValidToken(oToken.sValue)) {
                aSpellErr.push(oToken);
            }
        }
        return aSpellErr;
    }
}


if (typeof(exports) !== 'undefined') {
    exports.Tokenizer = Tokenizer;
}

Added gc_core/py/char_player.py version [845d36e2d1].





































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
# list of similar chars
# useful for suggestion mechanism


def distanceBetweenWords (s1, s2):
    "distance of Damerau-Levenshtein between <s1> and <s2>"
    # https://fr.wikipedia.org/wiki/Distance_de_Damerau-Levenshtein
    d = {}
    nLen1 = len(s1)
    nLen2 = len(s2)
    for i in range(-1, nLen1+1):
        d[i, -1] = i + 1
    for j in range(-1, nLen2+1):
        d[-1, j] = j + 1
    for i in range(nLen1):
        for j in range(nLen2):
            nCost = 0  if s1[i] == s2[j]  else 1
            d[i, j] = min(
                d[i-1, j]   + 1,        # Deletion
                d[i,   j-1] + 1,        # Insertion
                d[i-1, j-1] + nCost,    # Substitution
            )
            if i and j and s1[i] == s2[j-1] and s1[i-1] == s2[j]:
                d[i, j] = min(d[i, j], d[i-2, j-2] + nCost)     # Transposition
    return d[nLen1-1, nLen2-1]


# Method: Remove Useless Chars

_dVovels = {
    'a': '',  'e': '',  'i': '',  'o': '',  'u': '',  'y': '',
    'à': '',  'é': '',  'î': '',  'ô': '',  'û': '',  'ÿ': '',
    'â': '',  'è': '',  'ï': '',  'ö': '',  'ù': '',  'ŷ': '',
    'ä': '',  'ê': '',  'í': '',  'ó': '',  'ü': '',  'ý': '',
    'á': '',  'ë': '',  'ì': '',  'ò': '',  'ú': '',  'ỳ': '',
    'ā': '',  'ē': '',  'ī': '',  'ō': '',  'ū': '',  'ȳ': '',
    'h': '',  'œ': '',  'æ': ''
 }

_xTransVovels = str.maketrans(_dVovels)


aVovels = frozenset(_dVovels.keys())


def clearWord (sWord):
    "remove vovels and h"
    return sWord[0:1].replace("h", "") + sWord[1:].translate(_xTransVovels)


# Similar chars

d1to1 = {
    "1": "li",
    "2": "z",
    "3": "e",
    "4": "aà",
    "5": "sg",
    "6": "bdg",
    "7": "lt",
    "8": "b",
    "9": "gbd",
    "0": "o",

    "a": "aàâáäæ",
    "à": "aàâáäæ",
    "â": "aàâáäæ",
    "á": "aàâáäæ",
    "ä": "aàâáäæ",

    "æ": "æéa",

    "c": "cçskqśŝ",
    "ç": "cçskqśŝ",

    "e": "eéèêëœ",
    "é": "eéèêëœ",
    "ê": "eéèêëœ",
    "è": "eéèêëœ",
    "ë": "eéèêëœ",

    "g": "gj",
    
    "i": "iîïyíìÿ",
    "î": "iîïyíìÿ",
    "ï": "iîïyíìÿ",
    "í": "iîïyíìÿ",
    "ì": "iîïyíìÿ",

    "j": "jg",

    "k": "kcq",

    "n": "nñ",

    "o": "oôóòöœ",
    "ô": "oôóòöœ",
    "ó": "oôóòöœ",
    "ò": "oôóòöœ",
    "ö": "oôóòöœ",

    "œ": "œoôeéèêë",

    "q": "qck",

    "s": "sśŝcç",
    "ś": "sśŝcç",
    "ŝ": "sśŝcç",

    "u": "uûùüú",
    "û": "uûùüú",
    "ù": "uûùüú",
    "ü": "uûùüú",
    "ú": "uûùüú",

    "v": "vw",

    "w": "wv",

    "x": "xck",

    "y": "yÿiîŷýỳ",
    "ÿ": "yÿiîŷýỳ",
    "ŷ": "yÿiîŷýỳ",
    "ý": "yÿiîŷýỳ",
    "ỳ": "yÿiîŷýỳ",

    "z": "zs",
}

d1toX = {
    "æ": ("ae",),
    "b": ("bb",),
    "c": ("cc", "ss", "qu", "ch"),
    "ç": ("ss", "cc", "qh", "ch"),
    "d": ("dd",),
    "f": ("ff", "ph"),
    "g": ("gu", "ge", "gg", "gh"),
    "i": ("ii",),
    "j": ("jj", "dj"),
    "k": ("qu", "ck", "ch", "cu", "kk", "kh"),
    "l": ("ll",),
    "m": ("mm", "mn"),
    "n": ("nn", "nm", "mn"),
    "o": ("au", "eau", "aut"),
    "œ": ("oe", "eu"),
    "p": ("pp", "ph"),
    "q": ("qu", "ch", "cq", "ck", "kk"),
    "r": ("rr",),
    "s": ("ss", "sh"),
    "t": ("tt", "th"),
    "x": ("cc", "ct", "xx"),
    "z": ("ss", "zh")
}

d2toX = {
    "an": ("en",),
    "en": ("an",),
    "ai": ("ei", "é", "è", "ê", "ë"),
    "ei": ("ai", "é", "è", "ê", "ë"),
    "ch": ("sh", "c", "ss"),
    "ct": ("x", "cc"),
    "oa": ("oi",),
    "oi": ("oa", "oie"),
    "qu": ("q", "cq", "ck", "c", "k"),
    "ss": ("c", "ç"),
}


# End of word

dFinal1 = {
    "a": ("as", "at", "ant", "ah"),
    "c": ("ch",),
    "e": ("et", "er", "ets", "ée", "ez", "ai", "ais", "ait", "ent", "eh"),
    "é": ("et", "er", "ets", "ée", "ez", "ai", "ais", "ait"),
    "è": ("et", "er", "ets", "ée", "ez", "ai", "ais", "ait"),
    "ê": ("et", "er", "ets", "ée", "ez", "ai", "ais", "ait"),
    "ë": ("et", "er", "ets", "ée", "ez", "ai", "ais", "ait"),
    "g": ("gh",),
    "i": ("is", "it", "ie", "in"),
    "n": ("nt", "nd", "ns", "nh"),
    "o": ("aut", "ot", "os"),
    "ô": ("aut", "ot", "os"),
    "ö": ("aut", "ot", "os"),
    "p": ("ph",),
    "s": ("sh",),
    "t": ("th",),
    "u": ("ut", "us", "uh"),
}

dFinal2 = {
    "ai": ("aient", "ais", "et"),
    "an": ("ant", "ent"),
    "en": ("ent", "ant"),
    "ei": ("ait", "ais"),
    "on": ("ons", "ont"),
    "oi": ("ois", "oit", "oix"),
}


# Préfixes

aPfx1 = frozenset([
    "anti", "archi", "contre", "hyper", "mé", "méta", "im", "in", "ir", "par", "proto",
    "pseudo", "pré", "re", "ré", "sans", "sous", "supra", "sur", "ultra"
])
aPfx2 = frozenset([
    "belgo", "franco", "génito", "gynéco", "médico", "russo"
])

Modified gc_core/py/dawg.py from [a9c487538f] to [eb4c8506bd].

12
13
14
15
16
17
18





























































19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137

138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203








204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
import sys
import os
import collections

from . import str_transform as st
from .progressbar import ProgressBar































































class DAWG:
    """DIRECT ACYCLIC WORD GRAPH"""
    # This code is inspired from Steve Hanov’s DAWG, 2011. (http://stevehanov.ca/blog/index.php?id=115)
    # We store suffix/affix codes and tags within the graph after the “real” word.
    # A word is a list of numbers [ c1, c2, c3 . . . cN, iAffix, iTags]
    # Each arc is an index in self.lArcVal, where are stored characters, suffix/affix codes for stemming and tags.
    # Important: As usual, the last node (after ‘iTags’) is tagged final, AND the node after ‘cN’ is ALSO tagged final.

    def __init__ (self, spfSrc, sLangName, cStemming):
        print("===== Direct Acyclic Word Graph - Minimal Acyclic Finite State Automaton =====")
        cStemming = cStemming.upper()
        if cStemming == "A":
            funcStemmingGen = st.defineAffixCode
        elif cStemming == "S":
            funcStemmingGen = st.defineSuffixCode
        elif cStemming == "N":
            funcStemmingGen = st.noStemming
        else:
            print("# Error code: {}".format(cStemming))
            exit()

        lEntry = []
        lChar = ['']; dChar = {}; nChar = 1; dCharOccur = {}
        lAff  = [];   dAff  = {}; nAff  = 0; dAffOccur = {}
        lTag  = [];   dTag  = {}; nTag  = 0; dTagOccur = {}
        nErr = 0
        
        # read lexicon
        with open(spfSrc, 'r', encoding='utf-8') as hSrc:
            print(" > Reading lexicon: " + spfSrc + " ...")
            for line in hSrc:
                line = line.strip()
                if not (line.startswith('#') or line == ''):
                    try:
                        flex, stem, tag = line.split("\t")
                    except:
                        nErr += 1
                        continue
                    # chars
                    for c in flex:
                        if c not in dChar:
                            dChar[c] = nChar
                            lChar.append(c)
                            nChar += 1
                        dCharOccur[c] = dCharOccur.get(c, 0) + 1
                    # affixes to find stem from flexion
                    aff = funcStemmingGen(flex, stem)
                    if aff not in dAff:
                        dAff[aff] = nAff
                        lAff.append(aff)
                        nAff += 1
                    dAffOccur[aff] = dCharOccur.get(aff, 0) + 1
                    # tags
                    if tag not in dTag:
                        dTag[tag] = nTag
                        lTag.append(tag)
                        nTag += 1
                    dTagOccur[tag] = dTagOccur.get(tag, 0) + 1
                    lEntry.append((flex, dAff[aff], dTag[tag]))
            hSrc.close()
        if nErr:
            print(" # Lines ignored: {:>10}".format(nErr))
        if not(lEntry):
            print(" # Empty lexicon")
            exit()
        
        # Preparing DAWG
        print(" > Preparing list of words")
        lVal = lChar + lAff + lTag
        lWord = [ [dChar[c] for c in sFlex] + [iAff+nChar] + [iTag+nChar+nAff]  for sFlex, iAff, iTag in lEntry ]
        lEntry = None
        
        # Dictionary of arc values occurrency, to sort arcs of each node
        dValOccur = dict( [ (dChar[c], dCharOccur[c])  for c in dChar ] \
                        + [ (dAff[aff]+nChar, dAffOccur[aff]) for aff in dAff ] \
                        + [ (dTag[tag]+nChar+nAff, dTagOccur[tag]) for tag in dTag ] )
        #with open(spfSrc[:-8]+".valuesfreq.txt", 'w', encoding='utf-8') as hFreqDst:  # DEBUG
        #    for iKey, nOcc in sorted(dValOccur.items(), key=lambda t: t[1], reverse=True):
        #        hFreqDst.write("{}: {}\n".format(lVal[iKey], nOcc))
        #    hFreqDst.close()
        
        self.sFile = spfSrc
        self.sLang = sLangName
        self.nEntry = len(lWord)
        self.previousWord = []
        DawgNode.resetNextId()
        self.root = DawgNode()
        self.uncheckedNodes = []  # list of nodes that have not been checked for duplication.
        self.minimizedNodes = {}  # list of unique nodes that have been checked for duplication.
        self.sortedNodes = []     # version 2 and 3
        self.nNode = 0
        self.nArc = 0
        self.dChar = dChar
        self.nChar = len(dChar)
        self.nAff = nAff
        self.lArcVal = lVal
        self.nArcVal = len(lVal)
        self.nTag = self.nArcVal - self.nChar - nAff
        self.cStemming = cStemming.upper()
        if cStemming == "A":
            self.funcStemming = st.getStemFromAffixCode
        elif cStemming == "S":    
            self.funcStemming = st.getStemFromSuffixCode
        else:
            self.funcStemming = st.noStemming
        
        # build
        lWord.sort()
        oProgBar = ProgressBar(0, len(lWord))
        for word in lWord:
            self.insert(word)
            oProgBar.increment(1)
        oProgBar.done()
        self.finish()
        self.countNodes()
        self.countArcs()
        self.sortNodes()
        self.sortNodeArcs(dValOccur)

        self.displayInfo()

    # BUILD DAWG
    def insert (self, word):
        if word < self.previousWord:
            sys.exit("# Error: Words must be inserted in alphabetical order.")
        
        # find common prefix between word and previous word
        commonPrefix = 0
        for i in range(min(len(word), len(self.previousWord))):
            if word[i] != self.previousWord[i]:
                break
            commonPrefix += 1

        # Check the uncheckedNodes for redundant nodes, proceeding from last
        # one down to the common prefix size. Then truncate the list at that point.
        self._minimize(commonPrefix)

        # add the suffix, starting from the correct node mid-way through the graph
        if len(self.uncheckedNodes) == 0:
            oNode = self.root
        else:
            oNode = self.uncheckedNodes[-1][2]

        iChar = commonPrefix
        for c in word[commonPrefix:]:
            oNextNode = DawgNode()
            oNode.arcs[c] = oNextNode
            self.uncheckedNodes.append((oNode, c, oNextNode))
            if iChar == (len(word) - 2): 
                oNode.final = True
            iChar += 1
            oNode = oNextNode
        oNode.final = True
        self.previousWord = word

    def finish (self):
        "minimize unchecked nodes"
        self._minimize(0)

    def _minimize (self, downTo):
        # proceed from the leaf up to a certain point
        for i in range( len(self.uncheckedNodes)-1, downTo-1, -1 ):
            (parent, char, child) = self.uncheckedNodes[i]
            if child in self.minimizedNodes:
                # replace the child with the previously encountered one
                parent.arcs[char] = self.minimizedNodes[child]
            else:
                # add the state to the minimized nodes.
                self.minimizedNodes[child] = child
            self.uncheckedNodes.pop()

    def countNodes (self):
        self.nNode = len(self.minimizedNodes)

    def countArcs (self):
        self.nArc = 0
        for node in self.minimizedNodes:
            self.nArc += len(node.arcs)
    
    def sortNodeArcs (self, dValOccur):
        print(" > Sort node arcs")
        self.root.sortArcs(dValOccur)
        for oNode in self.minimizedNodes:
            oNode.sortArcs(dValOccur)
    








    def sortNodes (self):
        print(" > Sort nodes")
        for oNode in self.root.arcs.values():
            self._parseNodes(oNode)
    
    def _parseNodes (self, oNode):
        # Warning: recursive method
        if oNode.pos > 0:
            return
        oNode.setPos()
        self.sortedNodes.append(oNode)
        for oNextNode in oNode.arcs.values():
             self._parseNodes(oNextNode)
        
    def lookup (self, sWord):
        oNode = self.root
        for c in sWord:
            if self.dChar.get(c, '') not in oNode.arcs:
                return False
            oNode = oNode.arcs[self.dChar[c]]
        return oNode.final

    def morph (self, sWord):
        oNode = self.root
        for c in sWord:
            if self.dChar.get(c, '') not in oNode.arcs:
                return ''
            oNode = oNode.arcs[self.dChar[c]]
        if oNode.final:
            s = "* "
            for arc in oNode.arcs:







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>



















|
<








|
<
<
<
<
<
<
|
<
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
<
<
|
|
<



















|

|
|
|
|








|

|

|






|
|







>



|
|



|
|
|

|

|

|


|
|

|

|
|


|
|




|







|
|
|

|


|
|


|



|
|



|
|


>
>
>
>
>
>
>
>


|







|




|







|







12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99

100
101
102
103
104
105
106
107
108






109


110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130



131
132

133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
import sys
import os
import collections

from . import str_transform as st
from .progressbar import ProgressBar



def readFile (spf):
    print(" < Read lexicon: " + spf)
    if os.path.isfile(spf):
        with open(spf, "r", encoding="utf-8") as hSrc:
            for sLine in hSrc:
                sLine = sLine.strip()
                if sLine and not sLine.startswith("#"):
                    yield sLine
    else:
        raise OSError("# Error. File not found or not loadable: " + spf)


def getElemsFromFile (spf):
    "returns tuple of (flexion, stem, tags) from lexicon file"
    nErr = 0
    if not spf.endswith(".clex"):
        for sLine in readFile(spf):
            try:
                sFlex, sStem, sTag = sLine.split("\t")
                yield (sFlex, sStem, sTag)
            except:
                nErr += 1
    else:
        sTag = "_" # neutral tag
        sTag2 = ""
        for sLine in readFile(spf):
            if sLine.startswith("[") and sLine.endswith("]"):
                # tag line
                if "-->" in sLine:
                    try:
                        sTag, sSfxCode, sTag2 = sLine[1:-1].split(" --> ")
                    except:
                        nErr += 1
                        continue
                    sTag = sTag.strip()
                    sSfxCode = sSfxCode.strip()
                    sTag2 = sTag2.strip()
                else:
                    sTag = sLine[1:-1]
                    sTag2 = ""
            else:
                # entry line
                if "\t" in sLine:
                    if sLine.count("\t") > 1:
                        nErr += 1
                        continue
                    sFlex, sStem = sLine.split("\t")
                else:
                    sFlex = sStem = sLine
                #print(sFlex, sStem, sTag)
                yield (sFlex, sStem, sTag)
                if sTag2:
                    sFlex2 = st.changeWordWithSuffixCode(sFlex, sSfxCode)
                    #print(sFlex2, sStem, sTag2)
                    yield (sFlex2, sStem, sTag2)
    if nErr:
        print(" # Lines ignored: {:>10}".format(nErr))



class DAWG:
    """DIRECT ACYCLIC WORD GRAPH"""
    # This code is inspired from Steve Hanov’s DAWG, 2011. (http://stevehanov.ca/blog/index.php?id=115)
    # We store suffix/affix codes and tags within the graph after the “real” word.
    # A word is a list of numbers [ c1, c2, c3 . . . cN, iAffix, iTags]
    # Each arc is an index in self.lArcVal, where are stored characters, suffix/affix codes for stemming and tags.
    # Important: As usual, the last node (after ‘iTags’) is tagged final, AND the node after ‘cN’ is ALSO tagged final.

    def __init__ (self, spfSrc, sLangName, cStemming):
        print("===== Direct Acyclic Word Graph - Minimal Acyclic Finite State Automaton =====")
        cStemming = cStemming.upper()
        if cStemming == "A":
            funcStemmingGen = st.defineAffixCode
        elif cStemming == "S":
            funcStemmingGen = st.defineSuffixCode
        elif cStemming == "N":
            funcStemmingGen = st.noStemming
        else:
            raise ValueError("# Error. Unknown stemming code: {}".format(cStemming))


        lEntry = []
        lChar = ['']; dChar = {}; nChar = 1; dCharOccur = {}
        lAff  = [];   dAff  = {}; nAff  = 0; dAffOccur = {}
        lTag  = [];   dTag  = {}; nTag  = 0; dTagOccur = {}
        nErr = 0
        
        # read lexicon
        for sFlex, sStem, sTag in getElemsFromFile(spfSrc):






            addWordToCharDict(sFlex)


            # chars
            for c in sFlex:
                if c not in dChar:
                    dChar[c] = nChar
                    lChar.append(c)
                    nChar += 1
                dCharOccur[c] = dCharOccur.get(c, 0) + 1
            # affixes to find stem from flexion
            aff = funcStemmingGen(sFlex, sStem)
            if aff not in dAff:
                dAff[aff] = nAff
                lAff.append(aff)
                nAff += 1
            dAffOccur[aff] = dCharOccur.get(aff, 0) + 1
            # tags
            if sTag not in dTag:
                dTag[sTag] = nTag
                lTag.append(sTag)
                nTag += 1
            dTagOccur[sTag] = dTagOccur.get(sTag, 0) + 1
            lEntry.append((sFlex, dAff[aff], dTag[sTag]))



        if not lEntry:
            raise ValueError("# Error. Empty lexicon")

        
        # Preparing DAWG
        print(" > Preparing list of words")
        lVal = lChar + lAff + lTag
        lWord = [ [dChar[c] for c in sFlex] + [iAff+nChar] + [iTag+nChar+nAff]  for sFlex, iAff, iTag in lEntry ]
        lEntry = None
        
        # Dictionary of arc values occurrency, to sort arcs of each node
        dValOccur = dict( [ (dChar[c], dCharOccur[c])  for c in dChar ] \
                        + [ (dAff[aff]+nChar, dAffOccur[aff]) for aff in dAff ] \
                        + [ (dTag[tag]+nChar+nAff, dTagOccur[tag]) for tag in dTag ] )
        #with open(spfSrc[:-8]+".valuesfreq.txt", 'w', encoding='utf-8') as hFreqDst:  # DEBUG
        #    for iKey, nOcc in sorted(dValOccur.items(), key=lambda t: t[1], reverse=True):
        #        hFreqDst.write("{}: {}\n".format(lVal[iKey], nOcc))
        #    hFreqDst.close()
        
        self.sFile = spfSrc
        self.sLang = sLangName
        self.nEntry = len(lWord)
        self.aPreviousEntry = []
        DawgNode.resetNextId()
        self.oRoot = DawgNode()
        self.lUncheckedNodes = []  # list of nodes that have not been checked for duplication.
        self.lMinimizedNodes = {}  # list of unique nodes that have been checked for duplication.
        self.lSortedNodes = []     # version 2 and 3
        self.nNode = 0
        self.nArc = 0
        self.dChar = dChar
        self.nChar = len(dChar)
        self.nAff = nAff
        self.lArcVal = lVal
        self.nArcVal = len(lVal)
        self.nTag = self.nArcVal - self.nChar - nAff
        self.cStemming = cStemming
        if cStemming == "A":
            self.funcStemming = st.changeWordWithAffixCode
        elif cStemming == "S":    
            self.funcStemming = st.changeWordWithSuffixCode
        else:
            self.funcStemming = st.noStemming
        
        # build
        lWord.sort()
        oProgBar = ProgressBar(0, len(lWord))
        for aEntry in lWord:
            self.insert(aEntry)
            oProgBar.increment(1)
        oProgBar.done()
        self.finish()
        self.countNodes()
        self.countArcs()
        self.sortNodes()
        self.sortNodeArcs(dValOccur)
        #self.sortNodeArcs2 (self.oRoot, "")
        self.displayInfo()

    # BUILD DAWG
    def insert (self, aEntry):
        if aEntry < self.aPreviousEntry:
            sys.exit("# Error: Words must be inserted in alphabetical order.")
        
        # find common prefix between word and previous word
        nCommonPrefix = 0
        for i in range(min(len(aEntry), len(self.aPreviousEntry))):
            if aEntry[i] != self.aPreviousEntry[i]:
                break
            nCommonPrefix += 1

        # Check the lUncheckedNodes for redundant nodes, proceeding from last
        # one down to the common prefix size. Then truncate the list at that point.
        self._minimize(nCommonPrefix)

        # add the suffix, starting from the correct node mid-way through the graph
        if len(self.lUncheckedNodes) == 0:
            oNode = self.oRoot
        else:
            oNode = self.lUncheckedNodes[-1][2]

        iChar = nCommonPrefix
        for c in aEntry[nCommonPrefix:]:
            oNextNode = DawgNode()
            oNode.arcs[c] = oNextNode
            self.lUncheckedNodes.append((oNode, c, oNextNode))
            if iChar == (len(aEntry) - 2): 
                oNode.final = True
            iChar += 1
            oNode = oNextNode
        oNode.final = True
        self.aPreviousEntry = aEntry

    def finish (self):
        "minimize unchecked nodes"
        self._minimize(0)

    def _minimize (self, downTo):
        # proceed from the leaf up to a certain point
        for i in range( len(self.lUncheckedNodes)-1, downTo-1, -1 ):
            oNode, char, oChildNode = self.lUncheckedNodes[i]
            if oChildNode in self.lMinimizedNodes:
                # replace the child with the previously encountered one
                oNode.arcs[char] = self.lMinimizedNodes[oChildNode]
            else:
                # add the state to the minimized nodes.
                self.lMinimizedNodes[oChildNode] = oChildNode
            self.lUncheckedNodes.pop()

    def countNodes (self):
        self.nNode = len(self.lMinimizedNodes)

    def countArcs (self):
        self.nArc = 0
        for oNode in self.lMinimizedNodes:
            self.nArc += len(oNode.arcs)
    
    def sortNodeArcs (self, dValOccur):
        print(" > Sort node arcs")
        self.oRoot.sortArcs(dValOccur)
        for oNode in self.lMinimizedNodes:
            oNode.sortArcs(dValOccur)
    
    def sortNodeArcs2 (self, oNode, cPrevious=""):
        # recursive function
        dCharOccur = getCharOrderAfterChar(cPrevious)
        if dCharOccur:
            oNode.sortArcs2(dCharOccur, self.lArcVal)
        for nArcVal, oNextNode in oNode.arcs.items():
            self.sortNodeArcs2(oNextNode, self.lArcVal[nArcVal])

    def sortNodes (self):
        print(" > Sort nodes")
        for oNode in self.oRoot.arcs.values():
            self._parseNodes(oNode)
    
    def _parseNodes (self, oNode):
        # Warning: recursive method
        if oNode.pos > 0:
            return
        oNode.setPos()
        self.lSortedNodes.append(oNode)
        for oNextNode in oNode.arcs.values():
             self._parseNodes(oNextNode)
        
    def lookup (self, sWord):
        oNode = self.oRoot
        for c in sWord:
            if self.dChar.get(c, '') not in oNode.arcs:
                return False
            oNode = oNode.arcs[self.dChar[c]]
        return oNode.final

    def morph (self, sWord):
        oNode = self.oRoot
        for c in sWord:
            if self.dChar.get(c, '') not in oNode.arcs:
                return ''
            oNode = oNode.arcs[self.dChar[c]]
        if oNode.final:
            s = "* "
            for arc in oNode.arcs:
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
        print(" * {:<12} {:>16,}".format("Arc values:", self.nArcVal))
        print(" * {:<12} {:>16,}".format("Nodes:", self.nNode))
        print(" * {:<12} {:>16,}".format("Arcs:", self.nArc))
        print(" * {:<12} {:>16}".format("Stemming:", self.cStemming + "FX"))

    def getArcStats (self):
        d = {}
        for oNode in self.minimizedNodes:
            n = len(oNode.arcs)
            d[n] = d.get(n, 0) + 1
        s = " * Nodes:\n"
        for n in d:
            s = s + " {:>9} nodes have {:>3} arcs\n".format(d[n], n)
        return s

    def writeInfo (self, sPathFile):
        print(" > Write informations")
        with open(sPathFile, 'w', encoding='utf-8', newline="\n") as hDst:
            hDst.write(self.getArcStats())
            hDst.write("\n * Values:\n")
            for i, s in enumerate(self.lArcVal):
                hDst.write(" {:>6}. {}\n".format(i, s))
            hDst.close()

    # BINARY CONVERSION
    def createBinary (self, sPathFile, nMethod, bDebug=False):
        print(" > Write DAWG as an indexable binary dictionary [method: %d]" % nMethod)
        if nMethod == 1:
            self.nBytesArc = ( ( (self.nArcVal).bit_length() + 2 ) // 8 ) + 1   # We add 2 bits. See DawgNode.convToBytes1()
            self._calcNumBytesNodeAddress()
            self._calcNodesAddress1()
        elif nMethod == 2:
            self.nBytesArc = ( ( (self.nArcVal).bit_length() + 3 ) // 8 ) + 1   # We add 3 bits. See DawgNode.convToBytes2()
            self._calcNumBytesNodeAddress()
            self._calcNodesAddress2()
        elif nMethod == 3:
            self.nBytesArc = ( ( (self.nArcVal).bit_length() + 3 ) // 8 ) + 1   # We add 3 bits. See DawgNode.convToBytes3()
            self.nBytesOffset = 1
            self.nMaxOffset = (2 ** (self.nBytesOffset * 8)) - 1
            self._calcNumBytesNodeAddress()
            self._calcNodesAddress3()
        else:
            print(" # Error: unknown compression method")
        print("   Arc values (chars, affixes and tags): {}  ->  {} bytes".format( self.nArcVal, len("\t".join(self.lArcVal).encode("utf-8")) ))







|




















|



|



|







306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
        print(" * {:<12} {:>16,}".format("Arc values:", self.nArcVal))
        print(" * {:<12} {:>16,}".format("Nodes:", self.nNode))
        print(" * {:<12} {:>16,}".format("Arcs:", self.nArc))
        print(" * {:<12} {:>16}".format("Stemming:", self.cStemming + "FX"))

    def getArcStats (self):
        d = {}
        for oNode in self.lMinimizedNodes:
            n = len(oNode.arcs)
            d[n] = d.get(n, 0) + 1
        s = " * Nodes:\n"
        for n in d:
            s = s + " {:>9} nodes have {:>3} arcs\n".format(d[n], n)
        return s

    def writeInfo (self, sPathFile):
        print(" > Write informations")
        with open(sPathFile, 'w', encoding='utf-8', newline="\n") as hDst:
            hDst.write(self.getArcStats())
            hDst.write("\n * Values:\n")
            for i, s in enumerate(self.lArcVal):
                hDst.write(" {:>6}. {}\n".format(i, s))
            hDst.close()

    # BINARY CONVERSION
    def createBinary (self, sPathFile, nMethod, bDebug=False):
        print(" > Write DAWG as an indexable binary dictionary [method: %d]" % nMethod)
        if nMethod == 1:
            self.nBytesArc = ( (self.nArcVal.bit_length() + 2) // 8 ) + 1   # We add 2 bits. See DawgNode.convToBytes1()
            self._calcNumBytesNodeAddress()
            self._calcNodesAddress1()
        elif nMethod == 2:
            self.nBytesArc = ( (self.nArcVal.bit_length() + 3) // 8 ) + 1   # We add 3 bits. See DawgNode.convToBytes2()
            self._calcNumBytesNodeAddress()
            self._calcNodesAddress2()
        elif nMethod == 3:
            self.nBytesArc = ( (self.nArcVal.bit_length() + 3) // 8 ) + 1   # We add 3 bits. See DawgNode.convToBytes3()
            self.nBytesOffset = 1
            self.nMaxOffset = (2 ** (self.nBytesOffset * 8)) - 1
            self._calcNumBytesNodeAddress()
            self._calcNodesAddress3()
        else:
            print(" # Error: unknown compression method")
        print("   Arc values (chars, affixes and tags): {}  ->  {} bytes".format( self.nArcVal, len("\t".join(self.lArcVal).encode("utf-8")) ))
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
        "how many bytes needed to store all nodes/arcs in the binary dictionary"
        self.nBytesNodeAddress = 1
        while ((self.nBytesArc + self.nBytesNodeAddress) * self.nArc) > (2 ** (self.nBytesNodeAddress * 8)):
            self.nBytesNodeAddress += 1

    def _calcNodesAddress1 (self):
        nBytesNode = self.nBytesArc + self.nBytesNodeAddress
        iAddr = len(self.root.arcs) * nBytesNode
        for oNode in self.minimizedNodes:
            oNode.addr = iAddr
            iAddr += max(len(oNode.arcs), 1) * nBytesNode

    def _calcNodesAddress2 (self):
        nBytesNode = self.nBytesArc + self.nBytesNodeAddress
        iAddr = len(self.root.arcs) * nBytesNode
        for oNode in self.sortedNodes:
            oNode.addr = iAddr
            iAddr += max(len(oNode.arcs), 1) * nBytesNode
            for oNextNode in oNode.arcs.values():
                if (oNode.pos + 1) == oNextNode.pos:
                    iAddr -= self.nBytesNodeAddress
                    #break

    def _calcNodesAddress3 (self):
        nBytesNode = self.nBytesArc + self.nBytesNodeAddress
        # theorical nodes size if only addresses and no offset
        self.root.size = len(self.root.arcs) * nBytesNode
        for oNode in self.sortedNodes:
            oNode.size = max(len(oNode.arcs), 1) * nBytesNode
        # rewind and calculate dropdown from the end, several times
        nDiff = self.nBytesNodeAddress - self.nBytesOffset
        bEnd = False
        while not bEnd:
            bEnd = True
            # recalculate addresses
            iAddr = self.root.size
            for oNode in self.sortedNodes:
                oNode.addr = iAddr
                iAddr += oNode.size
            # rewind and calculate dropdown from the end, several times
            for i in range(self.nNode-1, -1, -1):
                nSize = max(len(self.sortedNodes[i].arcs), 1) * nBytesNode
                for oNextNode in self.sortedNodes[i].arcs.values():
                    if 1 < (oNextNode.addr - self.sortedNodes[i].addr) < self.nMaxOffset:
                        nSize -= nDiff
                if self.sortedNodes[i].size != nSize:
                    self.sortedNodes[i].size = nSize
                    bEnd = False

    def _writeBinary (self, sPathFile, nMethod):
        """
        Format of the binary indexable dictionary:
        Each section is separated with 4 bytes of \0
        







|
|





|
|










|
|







|
|




|
|
|

|
|







358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
        "how many bytes needed to store all nodes/arcs in the binary dictionary"
        self.nBytesNodeAddress = 1
        while ((self.nBytesArc + self.nBytesNodeAddress) * self.nArc) > (2 ** (self.nBytesNodeAddress * 8)):
            self.nBytesNodeAddress += 1

    def _calcNodesAddress1 (self):
        nBytesNode = self.nBytesArc + self.nBytesNodeAddress
        iAddr = len(self.oRoot.arcs) * nBytesNode
        for oNode in self.lMinimizedNodes:
            oNode.addr = iAddr
            iAddr += max(len(oNode.arcs), 1) * nBytesNode

    def _calcNodesAddress2 (self):
        nBytesNode = self.nBytesArc + self.nBytesNodeAddress
        iAddr = len(self.oRoot.arcs) * nBytesNode
        for oNode in self.lSortedNodes:
            oNode.addr = iAddr
            iAddr += max(len(oNode.arcs), 1) * nBytesNode
            for oNextNode in oNode.arcs.values():
                if (oNode.pos + 1) == oNextNode.pos:
                    iAddr -= self.nBytesNodeAddress
                    #break

    def _calcNodesAddress3 (self):
        nBytesNode = self.nBytesArc + self.nBytesNodeAddress
        # theorical nodes size if only addresses and no offset
        self.oRoot.size = len(self.oRoot.arcs) * nBytesNode
        for oNode in self.lSortedNodes:
            oNode.size = max(len(oNode.arcs), 1) * nBytesNode
        # rewind and calculate dropdown from the end, several times
        nDiff = self.nBytesNodeAddress - self.nBytesOffset
        bEnd = False
        while not bEnd:
            bEnd = True
            # recalculate addresses
            iAddr = self.oRoot.size
            for oNode in self.lSortedNodes:
                oNode.addr = iAddr
                iAddr += oNode.size
            # rewind and calculate dropdown from the end, several times
            for i in range(self.nNode-1, -1, -1):
                nSize = max(len(self.lSortedNodes[i].arcs), 1) * nBytesNode
                for oNextNode in self.lSortedNodes[i].arcs.values():
                    if 1 < (oNextNode.addr - self.lSortedNodes[i].addr) < self.nMaxOffset:
                        nSize -= nDiff
                if self.lSortedNodes[i].size != nSize:
                    self.lSortedNodes[i].size = nSize
                    bEnd = False

    def _writeBinary (self, sPathFile, nMethod):
        """
        Format of the binary indexable dictionary:
        Each section is separated with 4 bytes of \0
        
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
                                                           self.nEntry, self.nNode, self.nArc, self.nAff, self.cStemming).encode("utf-8"))
            hDst.write(b"\0\0\0\0")
            # lArcVal
            hDst.write("\t".join(self.lArcVal).encode("utf-8"))
            hDst.write(b"\0\0\0\0")
            # DAWG: nodes / arcs
            if nMethod == 1:
                hDst.write(self.root.convToBytes1(self.nBytesArc, self.nBytesNodeAddress))
                for oNode in self.minimizedNodes:
                    hDst.write(oNode.convToBytes1(self.nBytesArc, self.nBytesNodeAddress))
            elif nMethod == 2:
                hDst.write(self.root.convToBytes2(self.nBytesArc, self.nBytesNodeAddress))
                for oNode in self.sortedNodes:
                    hDst.write(oNode.convToBytes2(self.nBytesArc, self.nBytesNodeAddress))
            elif nMethod == 3:
                hDst.write(self.root.convToBytes3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset))
                for oNode in self.sortedNodes:
                    hDst.write(oNode.convToBytes3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset))
            hDst.close()

    def _writeNodes (self, sPathFile, nMethod):
        "for debugging only"
        print(" > Write nodes")
        with open(sPathFile+".nodes."+str(nMethod)+".txt", 'w', encoding='utf-8', newline="\n") as hDst:
            if nMethod == 1:
                hDst.write(self.root.getTxtRepr1(self.nBytesArc, self.nBytesNodeAddress, self.lArcVal)+"\n")
                #hDst.write( ''.join( [ "%02X " %  z  for z in self.root.convToBytes1(self.nBytesArc, self.nBytesNodeAddress) ] ).strip() )
                for oNode in self.minimizedNodes:
                    hDst.write(oNode.getTxtRepr1(self.nBytesArc, self.nBytesNodeAddress, self.lArcVal)+"\n")
            if nMethod == 2:
                hDst.write(self.root.getTxtRepr2(self.nBytesArc, self.nBytesNodeAddress, self.lArcVal)+"\n")
                for oNode in self.sortedNodes:
                    hDst.write(oNode.getTxtRepr2(self.nBytesArc, self.nBytesNodeAddress, self.lArcVal)+"\n")
            if nMethod == 3:
                hDst.write(self.root.getTxtRepr3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset, self.lArcVal)+"\n")
                #hDst.write( ''.join( [ "%02X " %  z  for z in self.root.convToBytes3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset) ] ).strip() )
                for oNode in self.sortedNodes:
                    hDst.write(oNode.getTxtRepr3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset, self.lArcVal)+"\n")
            hDst.close()
    
    def writeResults (self, sPathFile):
        bFileExits = os.path.isfile("_lexicons.res.txt")
        with open("_lexicons.res.txt", "a", encoding='utf-8', newline="\n") as hDst:
            sFormat1 = "{:<12} {:>12} {:>5} {:>8} {:>8} {:>6} {:>8} {:>9} {:>9} {:>15} {:>12} {:>12}\n"







|
|


|
|


|
|








|
|
|


|
|


|
|
|







446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
                                                           self.nEntry, self.nNode, self.nArc, self.nAff, self.cStemming).encode("utf-8"))
            hDst.write(b"\0\0\0\0")
            # lArcVal
            hDst.write("\t".join(self.lArcVal).encode("utf-8"))
            hDst.write(b"\0\0\0\0")
            # DAWG: nodes / arcs
            if nMethod == 1:
                hDst.write(self.oRoot.convToBytes1(self.nBytesArc, self.nBytesNodeAddress))
                for oNode in self.lMinimizedNodes:
                    hDst.write(oNode.convToBytes1(self.nBytesArc, self.nBytesNodeAddress))
            elif nMethod == 2:
                hDst.write(self.oRoot.convToBytes2(self.nBytesArc, self.nBytesNodeAddress))
                for oNode in self.lSortedNodes:
                    hDst.write(oNode.convToBytes2(self.nBytesArc, self.nBytesNodeAddress))
            elif nMethod == 3:
                hDst.write(self.oRoot.convToBytes3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset))
                for oNode in self.lSortedNodes:
                    hDst.write(oNode.convToBytes3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset))
            hDst.close()

    def _writeNodes (self, sPathFile, nMethod):
        "for debugging only"
        print(" > Write nodes")
        with open(sPathFile+".nodes."+str(nMethod)+".txt", 'w', encoding='utf-8', newline="\n") as hDst:
            if nMethod == 1:
                hDst.write(self.oRoot.getTxtRepr1(self.nBytesArc, self.nBytesNodeAddress, self.lArcVal)+"\n")
                #hDst.write( ''.join( [ "%02X " %  z  for z in self.oRoot.convToBytes1(self.nBytesArc, self.nBytesNodeAddress) ] ).strip() )
                for oNode in self.lMinimizedNodes:
                    hDst.write(oNode.getTxtRepr1(self.nBytesArc, self.nBytesNodeAddress, self.lArcVal)+"\n")
            if nMethod == 2:
                hDst.write(self.oRoot.getTxtRepr2(self.nBytesArc, self.nBytesNodeAddress, self.lArcVal)+"\n")
                for oNode in self.lSortedNodes:
                    hDst.write(oNode.getTxtRepr2(self.nBytesArc, self.nBytesNodeAddress, self.lArcVal)+"\n")
            if nMethod == 3:
                hDst.write(self.oRoot.getTxtRepr3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset, self.lArcVal)+"\n")
                #hDst.write( ''.join( [ "%02X " %  z  for z in self.oRoot.convToBytes3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset) ] ).strip() )
                for oNode in self.lSortedNodes:
                    hDst.write(oNode.getTxtRepr3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset, self.lArcVal)+"\n")
            hDst.close()
    
    def writeResults (self, sPathFile):
        bFileExits = os.path.isfile("_lexicons.res.txt")
        with open("_lexicons.res.txt", "a", encoding='utf-8', newline="\n") as hDst:
            sFormat1 = "{:<12} {:>12} {:>5} {:>8} {:>8} {:>6} {:>8} {:>9} {:>9} {:>15} {:>12} {:>12}\n"
479
480
481
482
483
484
485
486



487
488
489
490
491
492
493

    def __eq__ (self, other):
        # Used as a key in a python dictionary.
        # Nodes are equivalent if they have identical arcs, and each identical arc leads to identical states.
        return self.__str__() == other.__str__()

    def sortArcs (self, dValOccur):
        self.arcs = collections.OrderedDict(sorted(self.arcs.items(), key=lambda t: dValOccur[t[0]], reverse=True))




    # VERSION 1 =====================================================================================================
    def convToBytes1 (self, nBytesArc, nBytesNodeAddress):
        """
        Node scheme:
        - Arc length is defined by nBytesArc
        - Address length is defined by nBytesNodeAddress







|
>
>
>







536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553

    def __eq__ (self, other):
        # Used as a key in a python dictionary.
        # Nodes are equivalent if they have identical arcs, and each identical arc leads to identical states.
        return self.__str__() == other.__str__()

    def sortArcs (self, dValOccur):
        self.arcs = collections.OrderedDict(sorted(self.arcs.items(), key=lambda t: dValOccur.get(t[0], 0), reverse=True))

    def sortArcs2 (self, dValOccur, lArcVal):
        self.arcs = collections.OrderedDict(sorted(self.arcs.items(), key=lambda t: dValOccur.get(lArcVal[t[0]], 0), reverse=True))

    # VERSION 1 =====================================================================================================
    def convToBytes1 (self, nBytesArc, nBytesNodeAddress):
        """
        Node scheme:
        - Arc length is defined by nBytesArc
        - Address length is defined by nBytesNodeAddress
682
683
684
685
686
687
688



























                val = val | nFinalArcMask
            if 1 < (self.arcs[arc].addr - self.addr) < nMaxOffset and self.i != 0:
                val = val | nNextNodeMask
                s += "  {:<20}  {:0>16}  i{:_>10}   +{:_>10}\n".format(lVal[arc], bin(val)[2:], self.arcs[arc].i, self.arcs[arc].addr - self.addr)
            else:
                s += "  {:<20}  {:0>16}  i{:_>10}   #{:_>10}\n".format(lVal[arc], bin(val)[2:], self.arcs[arc].i, self.arcs[arc].addr)
        return s


































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
                val = val | nFinalArcMask
            if 1 < (self.arcs[arc].addr - self.addr) < nMaxOffset and self.i != 0:
                val = val | nNextNodeMask
                s += "  {:<20}  {:0>16}  i{:_>10}   +{:_>10}\n".format(lVal[arc], bin(val)[2:], self.arcs[arc].i, self.arcs[arc].addr - self.addr)
            else:
                s += "  {:<20}  {:0>16}  i{:_>10}   #{:_>10}\n".format(lVal[arc], bin(val)[2:], self.arcs[arc].i, self.arcs[arc].addr)
        return s



# Another attempt to sort node arcs

_dCharOrder = {
    # key: previous char, value: dictionary of chars {c: nValue}
    "": {}
}


def addWordToCharDict (sWord):
    cPrevious = ""
    for cChar in sWord:
        if cPrevious not in _dCharOrder:
            _dCharOrder[cPrevious] = {}
        _dCharOrder[cPrevious][cChar] = _dCharOrder[cPrevious].get(cChar, 0) + 1
        cPrevious = cChar


def getCharOrderAfterChar (cChar):
    return _dCharOrder.get(cChar, None)


def displayCharOrder ():
    for key, value in _dCharOrder.items():
        print("[" + key + "]: ", ", ".join([ c+":"+str(n)  for c, n  in  sorted(value.items(), key=lambda t: t[1], reverse=True) ]))

Modified gc_core/py/ibdawg.py from [9ce1ce821d] to [9237f7174c].

1
2
3
4
5
6


7
8

9
10




11
12
13
14
15
16
17
#!python3
# -*- coding: UTF-8 -*-

import os
import traceback
import pkgutil



from . import str_transform as st

from .echo import echo






class IBDAWG:
    """INDEXABLE BINARY DIRECT ACYCLIC WORD GRAPH"""

    def __init__ (self, sDicName):
        self.by = pkgutil.get_data(__package__, "_dictionaries/" + sDicName)
        if not self.by:

<




>
>


>


>
>
>
>







1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!python3


import os
import traceback
import pkgutil
import re
from itertools import chain

from . import str_transform as st
from . import char_player as cp
from .echo import echo


def show (nDeep, sText):
    print(nDeep * "  " + sText)


class IBDAWG:
    """INDEXABLE BINARY DIRECT ACYCLIC WORD GRAPH"""

    def __init__ (self, sDicName):
        self.by = pkgutil.get_data(__package__, "_dictionaries/" + sDicName)
        if not self.by:
40
41
42
43
44
45
46
47
48
49
50
51
52

53
54
55

56
57
58
59
60
61
62
63
64
65
66
67
68

69
70
71
72
73

74
75
76
77

78
79
80
81
82
83
84
        self.nBytesNodeAddress = int(l[3])
        self.nEntries = int(l[4])
        self.nNode = int(l[5])
        self.nArc = int(l[6])
        self.nAff = int(l[7])
        self.cStemming = l[8]
        if self.cStemming == "S":
            self.funcStemming = st.getStemFromSuffixCode
        elif self.cStemming == "A":
            self.funcStemming = st.getStemFromAffixCode
        else:
            self.funcStemming = st.noStemming
        self.nTag = self.nArcVal - self.nChar - self.nAff

        self.dChar = {}
        for i in range(1, self.nChar):
            self.dChar[self.lArcVal[i]] = i

            
        self._arcMask = (2 ** ((self.nBytesArc * 8) - 3)) - 1
        self._finalNodeMask = 1 << ((self.nBytesArc * 8) - 1)
        self._lastArcMask = 1 << ((self.nBytesArc * 8) - 2)
        self._addrBitMask = 1 << ((self.nBytesArc * 8) - 3)  # version 2

        self.nBytesOffset = 1 # version 3

        # Configuring DAWG functions according to nVersion
        if self.nVersion == 1:
            self.morph = self._morph1
            self.stem = self._stem1
            self._lookupArcNode = self._lookupArcNode1

            self._writeNodes = self._writeNodes1
        elif self.nVersion == 2:
            self.morph = self._morph2
            self.stem = self._stem2
            self._lookupArcNode = self._lookupArcNode2

            self._writeNodes = self._writeNodes2
        elif self.nVersion == 3:
            self.morph = self._morph3
            self.stem = self._stem3

            self._lookupArcNode = self._lookupArcNode3
            self._writeNodes = self._writeNodes3
        else:
            raise ValueError("  # Error: unknown code: {}".format(self.nVersion))

        self.bOptNumSigle = False
        self.bOptNumAtLast = False







|

|



>



>













>





>




>







46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
        self.nBytesNodeAddress = int(l[3])
        self.nEntries = int(l[4])
        self.nNode = int(l[5])
        self.nArc = int(l[6])
        self.nAff = int(l[7])
        self.cStemming = l[8]
        if self.cStemming == "S":
            self.funcStemming = st.changeWordWithSuffixCode
        elif self.cStemming == "A":
            self.funcStemming = st.changeWordWithAffixCode
        else:
            self.funcStemming = st.noStemming
        self.nTag = self.nArcVal - self.nChar - self.nAff
        # <dChar> to get the value of an arc, <dCharVal> to get the char of an arc with its value
        self.dChar = {}
        for i in range(1, self.nChar):
            self.dChar[self.lArcVal[i]] = i
        self.dCharVal = { v: k  for k, v in self.dChar.items() }
            
        self._arcMask = (2 ** ((self.nBytesArc * 8) - 3)) - 1
        self._finalNodeMask = 1 << ((self.nBytesArc * 8) - 1)
        self._lastArcMask = 1 << ((self.nBytesArc * 8) - 2)
        self._addrBitMask = 1 << ((self.nBytesArc * 8) - 3)  # version 2

        self.nBytesOffset = 1 # version 3

        # Configuring DAWG functions according to nVersion
        if self.nVersion == 1:
            self.morph = self._morph1
            self.stem = self._stem1
            self._lookupArcNode = self._lookupArcNode1
            self._getArcs = self._getArcs1
            self._writeNodes = self._writeNodes1
        elif self.nVersion == 2:
            self.morph = self._morph2
            self.stem = self._stem2
            self._lookupArcNode = self._lookupArcNode2
            self._getArcs = self._getArcs2
            self._writeNodes = self._writeNodes2
        elif self.nVersion == 3:
            self.morph = self._morph3
            self.stem = self._stem3
            self._getArcs = self._getArcs3
            self._lookupArcNode = self._lookupArcNode3
            self._writeNodes = self._writeNodes3
        else:
            raise ValueError("  # Error: unknown code: {}".format(self.nVersion))

        self.bOptNumSigle = False
        self.bOptNumAtLast = False
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199

























































































































200
201
202
203












204
205
206
207
208
209
210
                            "_addrBitMask": self._addrBitMask,
                            "nBytesOffset": self.nBytesOffset
                        }, ensure_ascii=False))
            if bInJSModule:
                hDst.write(";\n\nexports.dictionary = dictionary;\n")

    def isValidToken (self, sToken):
        "checks if sToken is valid (if there is hyphens in sToken, sToken is split, each part is checked)"
        if self.isValid(sToken):
            return True
        if "-" in sToken:
            if sToken.count("-") > 4:
                return True
            return all(self.isValid(sWord)  for sWord in sToken.split("-"))
        return False

    def isValid (self, sWord):
        "checks if sWord is valid (different casing tested if the first letter is a capital)"
        if not sWord:
            return None
        if "’" in sWord: # ugly hack
            sWord = sWord.replace("’", "'")
        if self.lookup(sWord):
            return True
        if sWord[0:1].isupper():
            if len(sWord) > 1:
                if sWord.istitle():
                    return bool(self.lookup(sWord.lower()))
                if sWord.isupper():
                    if self.bOptNumSigle:
                        return True
                    return bool(self.lookup(sWord.lower()) or self.lookup(sWord.capitalize()))
                return bool(self.lookup(sWord[:1].lower() + sWord[1:]))
            else:
                return bool(self.lookup(sWord.lower()))
        return False

    def lookup (self, sWord):
        "returns True if sWord in dictionary (strict verification)"
        iAddr = 0
        for c in sWord:
            if c not in self.dChar:
                return False
            iAddr = self._lookupArcNode(self.dChar[c], iAddr)
            if iAddr == None:
                return False
        return int.from_bytes(self.byDic[iAddr:iAddr+self.nBytesArc], byteorder='big') & self._finalNodeMask

    def getSugg (self, sWord, iAddr=0, sNewWord=""):
        "not finished"
        # RECURSIVE FUNCTION
        if not sWord:
            if int.from_bytes(self.byDic[iAddr:iAddr+self.nBytesArc], byteorder='big') & self._finalNodeMask:
                return [sNewWord]
            return []
        lSugg = []
        lArc = self._getSimilarArcs(sWord[0:1], iAddr)
        if lArc:
            for t in lArc:
                lSugg.extend(self._lookupAndSuggest(sWord[1:], t[1], sNewWord+t[0]))
        else:
            pass
        return lSugg

    def _getSimilarArcs (self, cChar, iAddr):
        lArc = []
        for c in st.dSimilarChars.get(cChar, cChar):
            jAddr = self._lookupArcNode(self.dChar[c], iAddr)
            if jAddr:
                lArc.append((c, iAddr))
        return lArc

    def getMorph (self, sWord):
        "retrieves morphologies list, different casing allowed"
        l = self.morph(sWord)
        if sWord[0:1].isupper():
            l.extend(self.morph(sWord.lower()))
            if sWord.isupper() and len(sWord) > 1:
                l.extend(self.morph(sWord.capitalize()))
        return l


























































































































    # def morph (self, sWord):
    #     is defined in __init__

    # VERSION 1












    def _morph1 (self, sWord):
        "returns morphologies of sWord"
        iAddr = 0
        for c in sWord:
            if c not in self.dChar:
                return []
            iAddr = self._lookupArcNode(self.dChar[c], iAddr)







|









|









|



|
|

|



|







<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<










>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>




>
>
>
>
>
>
>
>
>
>
>
>







130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175






176


















177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
                            "_addrBitMask": self._addrBitMask,
                            "nBytesOffset": self.nBytesOffset
                        }, ensure_ascii=False))
            if bInJSModule:
                hDst.write(";\n\nexports.dictionary = dictionary;\n")

    def isValidToken (self, sToken):
        "checks if <sToken> is valid (if there is hyphens in <sToken>, <sToken> is split, each part is checked)"
        if self.isValid(sToken):
            return True
        if "-" in sToken:
            if sToken.count("-") > 4:
                return True
            return all(self.isValid(sWord)  for sWord in sToken.split("-"))
        return False

    def isValid (self, sWord):
        "checks if <sWord> is valid (different casing tested if the first letter is a capital)"
        if not sWord:
            return None
        if "’" in sWord: # ugly hack
            sWord = sWord.replace("’", "'")
        if self.lookup(sWord):
            return True
        if sWord[0:1].isupper():
            if len(sWord) > 1:
                if sWord.istitle():
                    return self.lookup(sWord.lower())
                if sWord.isupper():
                    if self.bOptNumSigle:
                        return True
                    return self.lookup(sWord.lower()) or self.lookup(sWord.capitalize())
                return self.lookup(sWord[:1].lower() + sWord[1:])
            else:
                return self.lookup(sWord.lower())
        return False

    def lookup (self, sWord):
        "returns True if <sWord> in dictionary (strict verification)"
        iAddr = 0
        for c in sWord:
            if c not in self.dChar:
                return False
            iAddr = self._lookupArcNode(self.dChar[c], iAddr)
            if iAddr == None:
                return False






        return bool(int.from_bytes(self.byDic[iAddr:iAddr+self.nBytesArc], byteorder='big') & self._finalNodeMask)



















    def getMorph (self, sWord):
        "retrieves morphologies list, different casing allowed"
        l = self.morph(sWord)
        if sWord[0:1].isupper():
            l.extend(self.morph(sWord.lower()))
            if sWord.isupper() and len(sWord) > 1:
                l.extend(self.morph(sWord.capitalize()))
        return l

    def suggest (self, sWord, nMaxSugg=10):
        "returns a set of suggestions for <sWord>"
        # first, we check for similar words
        #return self._suggestWithCrushedUselessChars(cp.clearWord(sWord))
        aSugg = self._suggest(sWord)
        if not aSugg:
            aSugg.update(self._suggest(sWord[1:]))
            if not aSugg:
                aSugg.update(self._suggestWithCrushedUselessChars(cp.clearWord(sWord)))
        return sorted(aSugg, key=lambda sSugg: cp.distanceBetweenWords(sWord, sSugg))

    def _suggest (self, sRemain, nDeep=0, iAddr=0, sNewWord="", bAvoidLoop=False):
        "returns a set of suggestions"
        # recursive function
        aSugg = set()
        if not sRemain:
            if int.from_bytes(self.byDic[iAddr:iAddr+self.nBytesArc], byteorder='big') & self._finalNodeMask:
                #show(nDeep, "___" + sNewWord + "___")
                aSugg.add(sNewWord)
            for sTail in self._getTails(iAddr):
                aSugg.add(sNewWord+sTail)
            return aSugg
        #show(nDeep, "<" + sRemain + ">  ===>  " + sNewWord)
        cCurrent = sRemain[0:1]
        for cChar, jAddr in self._getSimilarArcs(cCurrent, iAddr):
            #show(nDeep, cChar)
            aSugg.update(self._suggest(sRemain[1:], nDeep+1, jAddr, sNewWord+cChar))
        if not bAvoidLoop: # avoid infinite loop
            #show(nDeep, ":no loop:")
            if cCurrent == sRemain[1:2]:
                # same char, we remove 1 char without adding 1 to <sNewWord>
                aSugg.update(self._suggest(sRemain[1:], nDeep+1, iAddr, sNewWord))
            else:
                # switching chars
                aSugg.update(self._suggest(sRemain[1:2]+sRemain[0:1]+sRemain[2:], nDeep+1, iAddr, sNewWord, True))
            for sRepl in cp.d1toX.get(cCurrent, ()):
                #show(nDeep, sRepl)
                aSugg.update(self._suggest(sRepl + sRemain[1:], nDeep+1, iAddr, sNewWord, True))
            for sRepl in cp.d2toX.get(sRemain[0:2], ()):
                #show(nDeep, sRepl)
                aSugg.update(self._suggest(sRepl + sRemain[2:], nDeep+1, iAddr, sNewWord, True))
            if len(sRemain) == 2:
                for sRepl in cp.dFinal2.get(sRemain, ()):
                    #show(nDeep, sRepl)
                    aSugg.update(self._suggest(sRepl, nDeep+1, iAddr, sNewWord, True))
            elif len(sRemain) == 1:
                #show(nDeep, ":end of word:")
                # end of word
                aSugg.update(self._suggest("", nDeep+1, iAddr, sNewWord, True)) # remove last char and go on
                for sRepl in cp.dFinal1.get(sRemain, ()):
                    #show(nDeep, sRepl)
                    aSugg.update(self._suggest(sRepl, nDeep+1, iAddr, sNewWord, True))
        return aSugg

    def _getSimilarArcs (self, cChar, iAddr):
        "generator: yield similar char of <cChar> and address of the following node"
        for c in cp.d1to1.get(cChar, [cChar]):
            if c in self.dChar:
                jAddr = self._lookupArcNode(self.dChar[c], iAddr)
                if jAddr:
                    yield (c, jAddr)

    def _getTails (self, iAddr, sTail="", n=2):
        "return a list of suffixes ending at a distance of <n> from <iAddr>"
        aTails = set()
        for nVal, jAddr in self._getArcs(iAddr):
            if nVal < self.nChar:
                if int.from_bytes(self.byDic[jAddr:jAddr+self.nBytesArc], byteorder='big') & self._finalNodeMask:
                    aTails.add(sTail + self.dCharVal[nVal])
                if n and not aTails:
                    aTails.update(self._getTails(jAddr, sTail+self.dCharVal[nVal], n-1))
        return aTails

    def _suggestWithCrushedUselessChars (self, sWord, nDeep=0, iAddr=0, sNewWord="", bAvoidLoop=False):
        aSugg = set()
        if not sWord:
            if int.from_bytes(self.byDic[iAddr:iAddr+self.nBytesArc], byteorder='big') & self._finalNodeMask:
                show(nDeep, "!!! " + sNewWord + " !!!")
                aSugg.add(sNewWord)
            return aSugg
        cCurrent = sWord[0:1]
        for cChar, jAddr in self._getSimilarArcsAndCrushedChars(cCurrent, iAddr):
            show(nDeep, cChar)
            aSugg.update(self._suggestWithCrushedUselessChars(sWord[1:], nDeep+1, jAddr, sNewWord+cChar))
        return aSugg

    def _getSimilarArcsAndCrushedChars (self, cChar, iAddr):
        "generator: yield similar char of <cChar> and address of the following node"
        for nVal, jAddr in self._getArcs(iAddr):
            if self.dCharVal.get(nVal, None) in cp.aVovels:
                yield (self.dCharVal[nVal], jAddr)
        yield from self._getSimilarArcs(cChar, iAddr)

    def drawPath (self, sWord, iAddr=0):
        cChar = sWord[0:1]  if sWord  else " "
        iPos = -1
        n = 0
        print(cChar + ": ", end="")
        for nVal, jAddr in self._getArcs(iAddr):
            if nVal in self.dCharVal:
                print(self.dCharVal[nVal], end="")
                if self.dCharVal[nVal] == sWord[0:1]:
                    iNextNodeAddr = jAddr
                    iPos = n
                n += 1
        if not sWord:
            return
        if iPos >= 0:
            print("\n   "+ " " * iPos + "|")
            self.drawPath(sWord[1:], iNextNodeAddr)

    def select (self, sPattern=""):
        "generator: returns all entries which morphology fits <sPattern>"
        zPattern = None
        try:
            zPattern = re.compile(sPattern)
        except:
            print("# Error in regex pattern")
            traceback.print_exc()
        yield from self._select1(zPattern, 0, "")

    # def morph (self, sWord):
    #     is defined in __init__

    # VERSION 1
    def _select1 (self, zPattern, iAddr, sWord):
        # recursive generator
        for nVal, jAddr in self._getArcs1(iAddr):
            if nVal < self.nChar:
                # simple character
                yield from self._select1(zPattern, jAddr, sWord + self.lArcVal[nVal])
            else:
                sEntry = sWord + "\t" + self.funcStemming(sWord, self.lArcVal[nVal])
                for nMorphVal, _ in self._getArcs1(jAddr):
                    if not zPattern or zPattern.search(self.lArcVal[nMorphVal]):
                        yield sEntry + "\t" + self.lArcVal[nMorphVal]

    def _morph1 (self, sWord):
        "returns morphologies of sWord"
        iAddr = 0
        for c in sWord:
            if c not in self.dChar:
                return []
            iAddr = self._lookupArcNode(self.dChar[c], iAddr)
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
                        l.append(sStem + " " + self.lArcVal[nRawArc2 & self._arcMask])
                        iAddr2 = iEndArcAddr2+self.nBytesNodeAddress
                iAddr = iEndArcAddr+self.nBytesNodeAddress
            return l
        return []

    def _stem1 (self, sWord):
        "returns stems list of sWord"
        iAddr = 0
        for c in sWord:
            if c not in self.dChar:
                return []
            iAddr = self._lookupArcNode(self.dChar[c], iAddr)
            if iAddr == None:
                return []







|







349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
                        l.append(sStem + " " + self.lArcVal[nRawArc2 & self._arcMask])
                        iAddr2 = iEndArcAddr2+self.nBytesNodeAddress
                iAddr = iEndArcAddr+self.nBytesNodeAddress
            return l
        return []

    def _stem1 (self, sWord):
        "returns stems list of <sWord>"
        iAddr = 0
        for c in sWord:
            if c not in self.dChar:
                return []
            iAddr = self._lookupArcNode(self.dChar[c], iAddr)
            if iAddr == None:
                return []
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272










273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
                    # This value is not a char, this is a stemming code 
                    l.append(self.funcStemming(sWord, self.lArcVal[nArc]))
                iAddr = iEndArcAddr+self.nBytesNodeAddress
            return l
        return []

    def _lookupArcNode1 (self, nVal, iAddr):
        "looks if nVal is an arc at the node at iAddr, if yes, returns address of next node else None"
        while True:
            iEndArcAddr = iAddr+self.nBytesArc
            nRawArc = int.from_bytes(self.byDic[iAddr:iEndArcAddr], byteorder='big')
            if nVal == (nRawArc & self._arcMask):
                # the value we are looking for 
                # we return the address of the next node
                return int.from_bytes(self.byDic[iEndArcAddr:iEndArcAddr+self.nBytesNodeAddress], byteorder='big')
            else:
                # value not found
                if (nRawArc & self._lastArcMask):
                    return None
                iAddr = iEndArcAddr+self.nBytesNodeAddress











    def _writeNodes1 (self, spfDest):
        "for debugging only"
        print(" > Write binary nodes")
        with codecs.open(spfDest, 'w', 'utf-8', newline="\n") as hDst:
            iAddr = 0
            hDst.write("i{:_>10} -- #{:_>10}\n".format("0", iAddr))
            while iAddr < len(self.byDic):
                iEndArcAddr = iAddr+self.nBytesArc
                nRawArc = int.from_bytes(self.byDic[iAddr:iEndArcAddr], byteorder='big')
                nArc = nRawArc & self._arcMask
                hDst.write("  {:<20}  {:0>16}  i{:>10}   #{:_>10}\n".format(self.lArcVal[nArc], bin(nRawArc)[2:], "?", \
                                                                            int.from_bytes(self.byDic[iEndArcAddr:iEndArcAddr+self.nBytesNodeAddress], \
                                                                                           byteorder='big')))
                iAddr = iEndArcAddr+self.nBytesNodeAddress
                if (nRawArc & self._lastArcMask) and iAddr < len(self.byDic):
                    hDst.write("\ni{:_>10} -- #{:_>10}\n".format("?", iAddr))
            hDst.close()

    # VERSION 2
    def _morph2 (self, sWord):
        "returns morphologies of sWord"
        iAddr = 0
        for c in sWord:
            if c not in self.dChar:
                return []
            iAddr = self._lookupArcNode(self.dChar[c], iAddr)
            if iAddr == None:
                return []







|













>
>
>
>
>
>
>
>
>
>




















|







372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
                    # This value is not a char, this is a stemming code 
                    l.append(self.funcStemming(sWord, self.lArcVal[nArc]))
                iAddr = iEndArcAddr+self.nBytesNodeAddress
            return l
        return []

    def _lookupArcNode1 (self, nVal, iAddr):
        "looks if <nVal> is an arc at the node at <iAddr>, if yes, returns address of next node else None"
        while True:
            iEndArcAddr = iAddr+self.nBytesArc
            nRawArc = int.from_bytes(self.byDic[iAddr:iEndArcAddr], byteorder='big')
            if nVal == (nRawArc & self._arcMask):
                # the value we are looking for 
                # we return the address of the next node
                return int.from_bytes(self.byDic[iEndArcAddr:iEndArcAddr+self.nBytesNodeAddress], byteorder='big')
            else:
                # value not found
                if (nRawArc & self._lastArcMask):
                    return None
                iAddr = iEndArcAddr+self.nBytesNodeAddress

    def _getArcs1 (self, iAddr):
        "generator: return all arcs at <iAddr> as tuples of (nVal, iAddr)"
        while True:
            iEndArcAddr = iAddr+self.nBytesArc
            nRawArc = int.from_bytes(self.byDic[iAddr:iEndArcAddr], byteorder='big')
            yield (nRawArc & self._arcMask, int.from_bytes(self.byDic[iEndArcAddr:iEndArcAddr+self.nBytesNodeAddress], byteorder='big'))
            if (nRawArc & self._lastArcMask):
                break
            iAddr = iEndArcAddr+self.nBytesNodeAddress

    def _writeNodes1 (self, spfDest):
        "for debugging only"
        print(" > Write binary nodes")
        with codecs.open(spfDest, 'w', 'utf-8', newline="\n") as hDst:
            iAddr = 0
            hDst.write("i{:_>10} -- #{:_>10}\n".format("0", iAddr))
            while iAddr < len(self.byDic):
                iEndArcAddr = iAddr+self.nBytesArc
                nRawArc = int.from_bytes(self.byDic[iAddr:iEndArcAddr], byteorder='big')
                nArc = nRawArc & self._arcMask
                hDst.write("  {:<20}  {:0>16}  i{:>10}   #{:_>10}\n".format(self.lArcVal[nArc], bin(nRawArc)[2:], "?", \
                                                                            int.from_bytes(self.byDic[iEndArcAddr:iEndArcAddr+self.nBytesNodeAddress], \
                                                                                           byteorder='big')))
                iAddr = iEndArcAddr+self.nBytesNodeAddress
                if (nRawArc & self._lastArcMask) and iAddr < len(self.byDic):
                    hDst.write("\ni{:_>10} -- #{:_>10}\n".format("?", iAddr))
            hDst.close()

    # VERSION 2
    def _morph2 (self, sWord):
        "returns morphologies of <sWord>"
        iAddr = 0
        for c in sWord:
            if c not in self.dChar:
                return []
            iAddr = self._lookupArcNode(self.dChar[c], iAddr)
            if iAddr == None:
                return []
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
                        l.append(sStem + " " + self.lArcVal[nRawArc2 & self._arcMask])
                        iAddr2 = iEndArcAddr2+self.nBytesNodeAddress  if not (nRawArc2 & self._addrBitMask) else iEndArcAddr2
                iAddr = iEndArcAddr+self.nBytesNodeAddress  if not (nRawArc & self._addrBitMask)  else iEndArcAddr
            return l
        return []

    def _stem2 (self, sWord):
        "returns stems list of sWord"
        iAddr = 0
        for c in sWord:
            if c not in self.dChar:
                return []
            iAddr = self._lookupArcNode(self.dChar[c], iAddr)
            if iAddr == None:
                return []







|







454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
                        l.append(sStem + " " + self.lArcVal[nRawArc2 & self._arcMask])
                        iAddr2 = iEndArcAddr2+self.nBytesNodeAddress  if not (nRawArc2 & self._addrBitMask) else iEndArcAddr2
                iAddr = iEndArcAddr+self.nBytesNodeAddress  if not (nRawArc & self._addrBitMask)  else iEndArcAddr
            return l
        return []

    def _stem2 (self, sWord):
        "returns stems list of <sWord>"
        iAddr = 0
        for c in sWord:
            if c not in self.dChar:
                return []
            iAddr = self._lookupArcNode(self.dChar[c], iAddr)
            if iAddr == None:
                return []
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
                            nRawArc = int.from_bytes(self.byDic[iAddr2:iAddr2+self.nBytesArc], byteorder='big')
                            iAddr2 += self.nBytesArc + self.nBytesNodeAddress
                iAddr = iEndArcAddr+self.nBytesNodeAddress  if not (nRawArc & self._addrBitMask)  else iEndArcAddr
            return l
        return []

    def _lookupArcNode2 (self, nVal, iAddr):
        "looks if nVal is an arc at the node at iAddr, if yes, returns address of next node else None"
        while True:
            iEndArcAddr = iAddr+self.nBytesArc
            nRawArc = int.from_bytes(self.byDic[iAddr:iEndArcAddr], byteorder='big')
            if nVal == (nRawArc & self._arcMask):
                # the value we are looking for 
                if not (nRawArc & self._addrBitMask):
                    # we return the address of the next node







|







486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
                            nRawArc = int.from_bytes(self.byDic[iAddr2:iAddr2+self.nBytesArc], byteorder='big')
                            iAddr2 += self.nBytesArc + self.nBytesNodeAddress
                iAddr = iEndArcAddr+self.nBytesNodeAddress  if not (nRawArc & self._addrBitMask)  else iEndArcAddr
            return l
        return []

    def _lookupArcNode2 (self, nVal, iAddr):
        "looks if <nVal> is an arc at the node at <iAddr>, if yes, returns address of next node else None"
        while True:
            iEndArcAddr = iAddr+self.nBytesArc
            nRawArc = int.from_bytes(self.byDic[iAddr:iEndArcAddr], byteorder='big')
            if nVal == (nRawArc & self._arcMask):
                # the value we are looking for 
                if not (nRawArc & self._addrBitMask):
                    # we return the address of the next node
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
                    iAddr = iEndArcAddr
                if (nRawArc & self._lastArcMask):
                    hDst.write("\ni{:_>10} -- #{:_>10}\n".format("?", iAddr))
            hDst.close()

    # VERSION 3
    def _morph3 (self, sWord):
        "returns morphologies of sWord"
        iAddr = 0
        for c in sWord:
            if c not in self.dChar:
                return []
            iAddr = self._lookupArcNode(self.dChar[c], iAddr)
            if iAddr == None:
                return []







|







531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
                    iAddr = iEndArcAddr
                if (nRawArc & self._lastArcMask):
                    hDst.write("\ni{:_>10} -- #{:_>10}\n".format("?", iAddr))
            hDst.close()

    # VERSION 3
    def _morph3 (self, sWord):
        "returns morphologies of <sWord>"
        iAddr = 0
        for c in sWord:
            if c not in self.dChar:
                return []
            iAddr = self._lookupArcNode(self.dChar[c], iAddr)
            if iAddr == None:
                return []
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
                        l.append(sStem + " " + self.lArcVal[nRawArc2 & self._arcMask])
                        iAddr2 = iEndArcAddr2+self.nBytesNodeAddress  if not (nRawArc2 & self._addrBitMask) else iEndArcAddr2+self.nBytesOffset
                iAddr = iEndArcAddr+self.nBytesNodeAddress  if not (nRawArc & self._addrBitMask)  else iEndArcAddr+self.nBytesOffset
            return l
        return []

    def _stem3 (self, sWord):
        "returns stems list of sWord"
        iAddr = 0
        for c in sWord:
            if c not in self.dChar:
                return []
            iAddr = self._lookupArcNode(self.dChar[c], iAddr)
            if iAddr == None:
                return []







|







566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
                        l.append(sStem + " " + self.lArcVal[nRawArc2 & self._arcMask])
                        iAddr2 = iEndArcAddr2+self.nBytesNodeAddress  if not (nRawArc2 & self._addrBitMask) else iEndArcAddr2+self.nBytesOffset
                iAddr = iEndArcAddr+self.nBytesNodeAddress  if not (nRawArc & self._addrBitMask)  else iEndArcAddr+self.nBytesOffset
            return l
        return []

    def _stem3 (self, sWord):
        "returns stems list of <sWord>"
        iAddr = 0
        for c in sWord:
            if c not in self.dChar:
                return []
            iAddr = self._lookupArcNode(self.dChar[c], iAddr)
            if iAddr == None:
                return []
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
                    # This value is not a char, this is a stemming code 
                    l.append(self.funcStemming(sWord, self.lArcVal[nArc]))
                iAddr = iEndArcAddr+self.nBytesNodeAddress  if not (nRawArc & self._addrBitMask)  else iEndArcAddr+self.nBytesOffset
            return l
        return []

    def _lookupArcNode3 (self, nVal, iAddr):
        "looks if nVal is an arc at the node at iAddr, if yes, returns address of next node else None"
        iAddrNode = iAddr
        while True:
            iEndArcAddr = iAddr+self.nBytesArc
            nRawArc = int.from_bytes(self.byDic[iAddr:iEndArcAddr], byteorder='big')
            if nVal == (nRawArc & self._arcMask):
                # the value we are looking for 
                if not (nRawArc & self._addrBitMask):







|







590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
                    # This value is not a char, this is a stemming code 
                    l.append(self.funcStemming(sWord, self.lArcVal[nArc]))
                iAddr = iEndArcAddr+self.nBytesNodeAddress  if not (nRawArc & self._addrBitMask)  else iEndArcAddr+self.nBytesOffset
            return l
        return []

    def _lookupArcNode3 (self, nVal, iAddr):
        "looks if <nVal> is an arc at the node at <iAddr>, if yes, returns address of next node else None"
        iAddrNode = iAddr
        while True:
            iEndArcAddr = iAddr+self.nBytesArc
            nRawArc = int.from_bytes(self.byDic[iAddr:iEndArcAddr], byteorder='big')
            if nVal == (nRawArc & self._arcMask):
                # the value we are looking for 
                if not (nRawArc & self._addrBitMask):

Added gc_core/py/keyboard_chars_proximity.py version [8f397a7bbf].

























































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
# Keyboard chars proximity


def getKeyboardMap (sKeyboard):
    return _dKeyboardMap.get(sKeyboard.lower(), {})


def getKeyboardList ():
    return _dKeyboardMap.keys()


_dKeyboardMap = {
    # keyboards by alphabetical order
    # bépo, colemak and dvorak users are assumed to do less typing errors.
    "azerty": {
        # fr
        # line 1
        "é": "az",
        "è": "yu",
        "ç": "àio",
        "à": "op",
        # line 2
        "a": "zéq",
        "z": "aesq",
        "e": "zrds",
        "r": "etfd",
        "t": "rygf",
        "y": "tuhg",
        "u": "yijh",
        "i": "uokj",
        "o": "iplk",
        "p": "oml",
        # line 3
        "q": "sawz",
        "s": "qdzwxe",
        "d": "sfexcr",
        "f": "dgrcvt",
        "g": "fhtvby",
        "h": "gjybnu",
        "j": "hkuni",
        "k": "jlio",
        "l": "kmop",
        "m": "lùp",
        "ù": "m",
        # line 4
        "w": "xqs",
        "x": "wcsd",
        "c": "xvdf",
        "v": "cbfg",
        "b": "vngh",
        "n": "bhj",
    },
    "bépo": {
        # fr
        # line 2
        "b": "éa",
        "é": "bpu",
        "p": "éoi",
        "o": "pèe",
        "è": "o",
        "v": "dt",
        "d": "vls",
        "l": "djr",
        "j": "lzn",
        "z": "jmw",
        # line 3
        "a": "ubà",
        "u": "aiéy",
        "i": "uepx",
        "e": "io",
        "c": "t",
        "t": "csvq",
        "s": "trdg",
        "r": "snlh",
        "n": "rmjf",
        "m": "nzç",
        # line 4
        "à": "yêa",
        "y": "àxu",
        "x": "ywi",
        "w": "z",
        "k": "c",
        "q": "gt",
        "g": "qhs",
        "h": "gfr",
        "f": "hçn",
        "ç": "fm",
    },
    "colemak": {
        # en, us, intl
        # line 2
        "q": "wa",
        "w": "qfr",
        "f": "wps",
        "p": "fgt",
        "g": "pjd",
        "j": "glh",
        "l": "jun",
        "u": "lye",
        "y": "ui",
        # line 3
        "a": "rqz",
        "r": "aswx",
        "s": "rtfc",
        "t": "sdpv",
        "d": "thgb",
        "h": "dnjk",
        "n": "helm",
        "e": "niu",
        "i": "eoy",
        "o": "i",
        # line 4
        "z": "xa",
        "x": "zcr",
        "c": "xvs",
        "v": "cbt",
        "b": "vkd",
        "k": "bmh",
        "m": "kn",
    },
    "dvorak": {
        # en, us, intl
        # line 2
        "p": "yu",
        "y": "pfi",
        "f": "ygd",
        "g": "fch",
        "c": "grt",
        "r": "cln",
        "l": "rs",
        # line 3
        "a": "o",
        "o": "aeq",
        "e": "ouj",
        "u": "eipk",
        "i": "udyx",
        "d": "ihfb",
        "h": "dtgm",
        "t": "hncw",
        "n": "tsrv",
        "s": "nlz",
        # line 4
        "q": "jo",
        "j": "qke",
        "k": "jxu",
        "x": "kbi",
        "b": "xmd",
        "m": "bwh",
        "w": "mvt",
        "v": "wzn",
        "z": "vs",
    },
    "qwerty": {
        # en, us, intl
        # line 2
        "q": "wa",
        "w": "qeas",
        "e": "wrds",
        "r": "etfd",
        "t": "rygf",
        "y": "tuhg",
        "u": "yijh",
        "i": "uokj",
        "o": "iplk",
        "p": "ol",
        # line 3
        "a": "sqzw",
        "s": "adwzxe",
        "d": "sfexcr",
        "f": "dgrcvt",
        "g": "fhtvby",
        "h": "gjybnu",
        "j": "hkunmi",
        "k": "jlimo",
        "l": "kop",
        # line 4
        "z": "xas",
        "x": "zcsd",
        "c": "xvdf",
        "v": "cbfg",
        "b": "vngh",
        "n": "bmhj",
        "m": "njk",
    },
    "qwertz": {
        # ge, au
        # line 2
        "q": "wa",
        "w": "qeas",
        "e": "wrds",
        "r": "etfd",
        "t": "rzgf",
        "z": "tuhg",
        "u": "zijh",
        "i": "uokj",
        "o": "iplk",
        "p": "oüöl",
        "ü": "päö",
        # line 3
        "a": "sqyw",
        "s": "adwyxe",
        "d": "sfexcr",
        "f": "dgrcvt",
        "g": "fhtvbz",
        "h": "gjzbnu",
        "j": "hkunmi",
        "k": "jlimo",
        "l": "köop",
        "ö": "läpü",
        "ä": "öü",
        # line 4
        "y": "xas",
        "x": "ycsd",
        "c": "xvdf",
        "v": "cbfg",
        "b": "vngh",
        "n": "bmhj",
        "m": "njk",
    }
}

Modified gc_core/py/lang_core/gc_engine.py from [dfad6de958] to [f3dfb392d0].

24
25
26
27
28
29
30

31


32
33
34
35
36
37
38
39
40
41
42
43
lang = "${lang}"
locales = ${loc}
pkg = "${implname}"
name = "${name}"
version = "${version}"
author = "${author}"


# grammar rules and dictionary


_rules = None
_dOptions = dict(gc_options.dOpt)       # duplication necessary, to be able to reset to default
_aIgnoredRules = set()
_oDict = None
_dAnalyses = {}                         # cache for data from dictionary



#### Parsing

def parse (sText, sCountry="${country_default}", bDebug=False, dOptions=None, bContext=False):
    "analyses the paragraph sText and returns list of errors"







>
|
>
>
|
<


|







24
25
26
27
28
29
30
31
32
33
34
35

36
37
38
39
40
41
42
43
44
45
lang = "${lang}"
locales = ${loc}
pkg = "${implname}"
name = "${name}"
version = "${version}"
author = "${author}"

_rules = None                               # module gc_rules

# data
_sAppContext = ""                           # what software is running
_dOptions = None

_aIgnoredRules = set()
_oDict = None
_dAnalyses = {}                             # cache for data from dictionary



#### Parsing

def parse (sText, sCountry="${country_default}", bDebug=False, dOptions=None, bContext=False):
    "analyses the paragraph sText and returns list of errors"
281
282
283
284
285
286
287
288
289


290
291


292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
    from com.sun.star.beans import PropertyValue
    #import lightproof_handler_${implname} as opt
    _createError = _createWriterError
except ImportError:
    _createError = _createDictError


def load ():
    global _oDict


    try:
        _oDict = IBDAWG("${py_binary_dic}")


    except:
        traceback.print_exc()


def setOption (sOpt, bVal):
    if sOpt in _dOptions:
        _dOptions[sOpt] = bVal


def setOptions (dOpt):
    for sKey, bVal in dOpt.items():
        if sKey in _dOptions:
            _dOptions[sKey] = bVal


def getOptions ():
    return _dOptions


def getDefaultOptions ():
    return dict(gc_options.dOpt)


def getOptionsLabels (sLang):
    return gc_options.getUI(sLang)


def displayOptions (sLang):
    echo("List of options")
    echo("\n".join( [ k+":\t"+str(v)+"\t"+gc_options.getUI(sLang).get(k, ("?", ""))[0]  for k, v  in sorted(_dOptions.items()) ] ))
    echo("")


def resetOptions ():
    global _dOptions
    _dOptions = dict(gc_options.dOpt)


def getDictionary ():
    return _oDict


def _getRules (bParagraph):







|

>
>

|
>
>




















|














|







283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
    from com.sun.star.beans import PropertyValue
    #import lightproof_handler_${implname} as opt
    _createError = _createWriterError
except ImportError:
    _createError = _createDictError


def load (sContext="Python"):
    global _oDict
    global _sAppContext
    global _dOptions
    try:
        _oDict = IBDAWG("${dic_name}.bdic")
        _sAppContext = sContext
        _dOptions = dict(gc_options.getOptions(sContext))   # duplication necessary, to be able to reset to default
    except:
        traceback.print_exc()


def setOption (sOpt, bVal):
    if sOpt in _dOptions:
        _dOptions[sOpt] = bVal


def setOptions (dOpt):
    for sKey, bVal in dOpt.items():
        if sKey in _dOptions:
            _dOptions[sKey] = bVal


def getOptions ():
    return _dOptions


def getDefaultOptions ():
    return dict(gc_options.getOptions(_sAppContext))


def getOptionsLabels (sLang):
    return gc_options.getUI(sLang)


def displayOptions (sLang):
    echo("List of options")
    echo("\n".join( [ k+":\t"+str(v)+"\t"+gc_options.getUI(sLang).get(k, ("?", ""))[0]  for k, v  in sorted(_dOptions.items()) ] ))
    echo("")


def resetOptions ():
    global _dOptions
    _dOptions = dict(gc_options.getOptions(_sAppContext))


def getDictionary ():
    return _oDict


def _getRules (bParagraph):
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487

## functions to get text outside pattern scope

# warning: check compile_rules.py to understand how it works

def nextword (s, iStart, n):
    "get the nth word of the input string or empty string"
    m = re.match("( +[\\w%-]+){" + str(n-1) + "} +([\\w%-]+)", s[iStart:])
    if not m:
        return None
    return (iStart+m.start(2), m.group(2))


def prevword (s, iEnd, n):
    "get the (-)nth word of the input string or empty string"
    m = re.search("([\\w%-]+) +([\\w%-]+ +){" + str(n-1) + "}$", s[:iEnd])
    if not m:
        return None
    return (m.start(1), m.group(1))


def nextword1 (s, iStart):
    "get next word (optimization)"







|


|




|







471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493

## functions to get text outside pattern scope

# warning: check compile_rules.py to understand how it works

def nextword (s, iStart, n):
    "get the nth word of the input string or empty string"
    m = re.match("(?: +[\\w%-]+){" + str(n-1) + "} +([\\w%-]+)", s[iStart:])
    if not m:
        return None
    return (iStart+m.start(1), m.group(1))


def prevword (s, iEnd, n):
    "get the (-)nth word of the input string or empty string"
    m = re.search("([\\w%-]+) +(?:[\\w%-]+ +){" + str(n-1) + "}$", s[:iEnd])
    if not m:
        return None
    return (m.start(1), m.group(1))


def nextword1 (s, iStart):
    "get next word (optimization)"

Modified gc_core/py/lang_core/gc_options.py from [383a99acb3] to [871c8d4b8f].

1
2
3
4
5
6







7
8
9

10



11


12
# generated code, do not edit

def getUI (sLang):
    if sLang in _dOptLabel:
        return _dOptLabel[sLang]
    return _dOptLabel["fr"]








lStructOpt = ${lStructOpt}


dOpt = ${dOptPython}






_dOptLabel = ${dOptLabel}






>
>
>
>
>
>
>



>
|
>
>
>
|
>
>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# generated code, do not edit

def getUI (sLang):
    if sLang in _dOptLabel:
        return _dOptLabel[sLang]
    return _dOptLabel["fr"]


def getOptions (sContext="Python"):
    if sContext in dOpt:
        return dOpt[sContext]
    return dOpt["Python"]


lStructOpt = ${lStructOpt}


dOpt = {
    "Python": ${dOptPython},
    "Server": ${dOptServer},
    "Writer": ${dOptWriter}
}


_dOptLabel = ${dOptLabel}

Modified gc_core/py/oxt/Grammalecte.py from [f962117745] to [0f730fb3f5].

29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
        self.locales = []
        for i in gce.locales:
            l = gce.locales[i]
            self.locales.append(Locale(l[0], l[1], l[2]))
        self.locales = tuple(self.locales)
        xCurCtx = uno.getComponentContext()
        # init
        gce.load()
        # GC options
        # opt_handler.load(xCurCtx)
        dOpt = Options.load(xCurCtx)
        gce.setOptions(dOpt)
        # store for results of big paragraphs
        self.dResult = {}
        self.nMaxRes = 1500







|







29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
        self.locales = []
        for i in gce.locales:
            l = gce.locales[i]
            self.locales.append(Locale(l[0], l[1], l[2]))
        self.locales = tuple(self.locales)
        xCurCtx = uno.getComponentContext()
        # init
        gce.load("Writer")
        # GC options
        # opt_handler.load(xCurCtx)
        dOpt = Options.load(xCurCtx)
        gce.setOptions(dOpt)
        # store for results of big paragraphs
        self.dResult = {}
        self.nMaxRes = 1500

Modified gc_core/py/oxt/Options.py from [f3a8765730] to [e0f5ecd431].

137
138
139
140
141
142
143

144
145
146
147
148
149

150
151
152
153
154
155
156
157
158
159
160
                self.xContainer.endExecute()
            else:
                print("Wrong command: " + xActionEvent.ActionCommand)
        except:
            traceback.print_exc()

    def _setDefault (self):

        for w in self.lxOptions:
            w.State = gce.gc_options.dOpt.get(w.Name, False)

    def load (self, sLang):
        try:
            xChild = self.xNode.getByName(sLang)

            for sKey in gce.gc_options.dOpt:
                sValue = xChild.getPropertyValue(sKey)
                if sValue == '':
                    if gce.gc_options.dOpt[sKey]:
                        sValue = 1
                    else:
                        sValue = 0
                options[sKey] = bool(int(sValue))
        except:
            traceback.print_exc()








>

|




>
|


|







137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
                self.xContainer.endExecute()
            else:
                print("Wrong command: " + xActionEvent.ActionCommand)
        except:
            traceback.print_exc()

    def _setDefault (self):
        dOpt = gce.gc_options.getOptions("Writer")
        for w in self.lxOptions:
            w.State = dOpt.get(w.Name, False)

    def load (self, sLang):
        try:
            xChild = self.xNode.getByName(sLang)
            dOpt = gce.gc_options.getOptions("Writer")
            for sKey in dOpt:
                sValue = xChild.getPropertyValue(sKey)
                if sValue == '':
                    if dOpt[sKey]:
                        sValue = 1
                    else:
                        sValue = 0
                options[sKey] = bool(int(sValue))
        except:
            traceback.print_exc()

Added gc_core/py/spellchecker.py version [c6b35d80ee].













































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# Spellchecker
# Wrapper for the IBDAWG class.
# Useful to check several dictionaries at once.

from . import ibdawg


dDictionaries = {
    "fr": "French.bdic",
    "en": "English.bdic"
}


class Spellchecker ():

    def __init__ (self, sLangCode):
        self.sLangCode = sLangCode
        self.oMainDic = None
        if sLangCode in dDictionaries:
            self.oMainDic = ibdawg.IBDAWG(dDictionaries[sLangCode])
        self.lOtherDic = []
        return bool(self.oMainDic)


    def setMainDictionary (self, sDicName):
        try:
            self.oMainDic = ibdawg.IBDAWG(sDicName)
            return True
        except:
            print("Error: <" + sDicName + "> not set as main dictionary.")
            return False

    def addDictionary (self, sDicName):
        try:
            self.lOtherDic.append(ibdawg.IBDAWG(sDicName))
            return True
        except:
            print("Error: <" + sDicName + "> not added to the list.")
            return False

    # Return codes:
    #   0: invalid
    #   1: correct in main dictionary
    #   2+: correct in foreign dictionaries


    # check in the main dictionary only

    def isValidToken (self, sToken):
        "(in main dictionary) checks if sToken is valid (if there is hyphens in sToken, sToken is split, each part is checked)"
        if self.oMainDic.isValidToken(sToken):
            return 1
        return 0

    def isValid (self, sWord):
        "(in main dictionary) checks if sWord is valid (different casing tested if the first letter is a capital)"
        if self.oMainDic.isValid(sWord):
            return 1
        return 0

    def lookup (self, sWord):
        "(in main dictionary) checks if sWord is in dictionary as is (strict verification)"
        if self.oMainDic.lookup(sWord):
            return 1
        return 0


    # check in all dictionaries

    def isValidTokenAll (self, sToken):
        "(in all dictionaries) checks if sToken is valid (if there is hyphens in sToken, sToken is split, each part is checked)"
        if self.oMainDic.isValidToken(sToken):
            return 1
        for i, oDic in enumerate(self.lOtherDic, 2):
            if oDic.isValidToken(sToken):
                return i
        return 0

    def isValidAll (self, sWord):
        "(in all dictionaries) checks if sWord is valid (different casing tested if the first letter is a capital)"
        if self.oMainDic.isValid(sToken):
            return 1
        for i, oDic in enumerate(self.lOtherDic, 2):
            if oDic.isValid(sToken):
                return i
        return 0

    def lookupAll (self, sWord):
        "(in all dictionaries) checks if sWord is in dictionary as is (strict verification)"
        if self.oMainDic.lookup(sToken):
            return 1
        for i, oDic in enumerate(self.lOtherDic, 2):
            if oDic.lookup(sToken):
                return i
        return 0


    # check in dictionaries up to level n

    def isValidTokenLevel (self, sToken, nLevel):
        "(in dictionaries up to level n) checks if sToken is valid (if there is hyphens in sToken, sToken is split, each part is checked)"
        if self.oMainDic.isValidToken(sToken):
            return 1
        if nLevel >= 2:
            for i, oDic in enumerate(self.lOtherDic, 2):
                if oDic.isValidToken(sToken):
                    return i
                if i == nLevel:
                    break
        return 0

    def isValidLevel (self, sWord, nLevel):
        "(in dictionaries up to level n) checks if sWord is valid (different casing tested if the first letter is a capital)"
        if self.oMainDic.isValid(sToken):
            return 1
        if nLevel >= 2:
            for i, oDic in enumerate(self.lOtherDic, 2):
                if oDic.isValid(sToken):
                    return i
                if i == nLevel:
                    break
        return 0

    def lookupLevel (self, sWord, nLevel):
        "(in dictionaries up to level n) checks if sWord is in dictionary as is (strict verification)"
        if self.oMainDic.lookup(sToken):
            return 1
        if nLevel >= 2:
            for i, oDic in enumerate(self.lOtherDic, 2):
                if oDic.lookup(sToken):
                    return i
                if i == nLevel:
                    break
        return 0

Modified gc_core/py/str_transform.py from [e86906e5ce] to [23bc31f0e4].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!python3
# -*- coding: UTF-8 -*-


dSimilarChars = {
    "a": "aàâáä",
    "à": "aàâáä",
    "â": "aàâáä",
    "á": "aàâáä",
    "ä": "aàâáä",
    "c": "cç",
    "ç": "cç",
    "e": "eéêèë",
    "é": "eéêèë",
    "ê": "eéêèë",
    "è": "eéêèë",
    "ë": "eéêèë",
    "i": "iîïíì",
    "î": "iîïíì",
    "ï": "iîïíì",
    "í": "iîïíì",
    "ì": "iîïíì",
    "o": "oôóòö",
    "ô": "oôóòö",
    "ó": "oôóòö",
    "ò": "oôóòö",
    "ö": "oôóòö",
    "u": "uûùüú",
    "û": "uûùüú",
    "ù": "uûùüú",
    "ü": "uûùüú",
    "ú": "uûùüú",
}

## No stemming

def noStemming (sFlex, sStem):
    return sStem

def rebuildWord (sFlex, cmd1, cmd2):

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







1
































2
3
4
5
6
7
8
#!python3

































## No stemming

def noStemming (sFlex, sStem):
    return sStem

def rebuildWord (sFlex, cmd1, cmd2):
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
    jSfx = 0
    for i in range(min(len(sFlex), len(sStem))):
        if sFlex[i] != sStem[i]:
            break
        jSfx += 1
    return chr(len(sFlex)-jSfx+48) + sStem[jSfx:]  

def getStemFromSuffixCode (sFlex, sSfxCode):
    if sSfxCode == "0":
        return sFlex
    return sFlex[:-(ord(sSfxCode[0])-48)] + sSfxCode[1:]  if sSfxCode[0] != '0'  else sFlex + sSfxCode[1:]


# Prefix and suffix
def defineAffixCode (sFlex, sStem):
    """ Returns a string defining how to get stem from flexion. Examples:
            "0" if stem = flexion
            "stem" if no common substring







|

|
|







37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
    jSfx = 0
    for i in range(min(len(sFlex), len(sStem))):
        if sFlex[i] != sStem[i]:
            break
        jSfx += 1
    return chr(len(sFlex)-jSfx+48) + sStem[jSfx:]  

def changeWordWithSuffixCode (sWord, sSfxCode):
    if sSfxCode == "0":
        return sWord
    return sWord[:-(ord(sSfxCode[0])-48)] + sSfxCode[1:]  if sSfxCode[0] != '0'  else sWord + sSfxCode[1:]


# Prefix and suffix
def defineAffixCode (sFlex, sStem):
    """ Returns a string defining how to get stem from flexion. Examples:
            "0" if stem = flexion
            "stem" if no common substring
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
                if M[x][y] > longest:
                    longest = M[x][y]
                    x_longest = x
            else:
                M[x][y] = 0
    return s1[x_longest-longest : x_longest]

def getStemFromAffixCode (sFlex, sAffCode):
    if sAffCode == "0":
        return sFlex
    if '/' not in sAffCode:
        return "# error #"
    sPfxCode, sSfxCode = sAffCode.split('/')
    sFlex = sPfxCode[1:] + sFlex[(ord(sPfxCode[0])-48):] 
    return sFlex[:-(ord(sSfxCode[0])-48)] + sSfxCode[1:]  if sSfxCode[0] != '0'  else sFlex + sSfxCode[1:]








|

|



|
|

88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
                if M[x][y] > longest:
                    longest = M[x][y]
                    x_longest = x
            else:
                M[x][y] = 0
    return s1[x_longest-longest : x_longest]

def changeWordWithAffixCode (sWord, sAffCode):
    if sAffCode == "0":
        return sWord
    if '/' not in sAffCode:
        return "# error #"
    sPfxCode, sSfxCode = sAffCode.split('/')
    sWord = sPfxCode[1:] + sWord[(ord(sPfxCode[0])-48):] 
    return sWord[:-(ord(sSfxCode[0])-48)] + sSfxCode[1:]  if sSfxCode[0] != '0'  else sWord + sSfxCode[1:]

Modified gc_core/py/text.py from [e964ece40d] to [72d4931466].

1
2
3
4
5
6
7
8
9

10
11
12
13
14
15
16
#!python3

import textwrap
from itertools import chain


def getParagraph (sText):
    "generator: returns paragraphs of text"
    iStart = 0

    iEnd = sText.find("\n", iStart)
    while iEnd != -1:
        yield sText[iStart:iEnd]
        iStart = iEnd + 1
        iEnd = sText.find("\n", iStart)
    yield sText[iStart:]










>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!python3

import textwrap
from itertools import chain


def getParagraph (sText):
    "generator: returns paragraphs of text"
    iStart = 0
    sText = sText.replace("\r\n", "\n").replace("\r", "\n")
    iEnd = sText.find("\n", iStart)
    while iEnd != -1:
        yield sText[iStart:iEnd]
        iStart = iEnd + 1
        iEnd = sText.find("\n", iStart)
    yield sText[iStart:]

Modified gc_lang/fr/build.py from [9b9cd2c271] to [677a5b04fd].

1
2
3
4
5
6
7
8
9
10
11
12

13
14
























15
16
17
18
19
20
21
# Builder for French language

import os
import zipfile
from distutils import dir_util, file_util

import helpers


def build (sLang, dVars, spLangPack):
    "complementary build launched from make.py"
    createFirefoxExtension(sLang, dVars)

    createThunderbirdExtension(sLang, dVars, spLangPack)


























def createFirefoxExtension (sLang, dVars):
    "create extension for Firefox"
    print("Building extension for Firefox")
    helpers.createCleanFolder("_build/xpi/"+sLang)
    dir_util.copy_tree("gc_lang/"+sLang+"/xpi/", "_build/xpi/"+sLang)
    dir_util.copy_tree("grammalecte-js", "_build/xpi/"+sLang+"/grammalecte")












>


>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# Builder for French language

import os
import zipfile
from distutils import dir_util, file_util

import helpers


def build (sLang, dVars, spLangPack):
    "complementary build launched from make.py"
    createFirefoxExtension(sLang, dVars)
    createWebExtension(sLang, dVars)
    createThunderbirdExtension(sLang, dVars, spLangPack)


def createWebExtension (sLang, dVars):
    "create Web-extension"
    print("Building WebExtension")
    helpers.createCleanFolder("_build/webext/"+sLang)
    dir_util.copy_tree("gc_lang/"+sLang+"/webext/", "_build/webext/"+sLang)
    dir_util.copy_tree("grammalecte-js", "_build/webext/"+sLang+"/grammalecte")
    dVars['webextOptionsHTML'] = _createOptionsForWebExtension(dVars)
    helpers.copyAndFileTemplate("_build/webext/"+sLang+"/panel/main.html", "_build/webext/"+sLang+"/panel/main.html", dVars)
    with helpers.cd("_build/webext/"+sLang):
        os.system("web-ext build")


def _createOptionsForWebExtension (dVars):
    sHTML = ""
    sLang = dVars['sDefaultUILang']
    for sSection, lOpt in dVars['lStructOpt']:
        sHTML += f'\n<div id="subsection_{sSection}" class="opt_subsection">\n  <h2 data-l10n-id="option_{sSection}">{dVars["dOptLabel"][sLang][sSection][0]}</h2>\n'
        for lLineOpt in lOpt:
            for sOpt in lLineOpt:
                sHTML += f'  <p><input type="checkbox" id="option_{sOpt}" data-option="{sOpt}"/><label id="option_label_{sOpt}" for="option_{sOpt}" data-l10n-id="option_{sOpt}">{dVars["dOptLabel"][sLang][sOpt][0]}</label></p>\n'
        sHTML += '</div>\n'
    return sHTML


def createFirefoxExtension (sLang, dVars):
    "create extension for Firefox"
    print("Building extension for Firefox")
    helpers.createCleanFolder("_build/xpi/"+sLang)
    dir_util.copy_tree("gc_lang/"+sLang+"/xpi/", "_build/xpi/"+sLang)
    dir_util.copy_tree("grammalecte-js", "_build/xpi/"+sLang+"/grammalecte")
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
        for lLineOpt in lOpt:
            for sOpt in lLineOpt:
                sHTML += '  <p><input type="checkbox" id="option_'+sOpt+'" /><label id="option_label_'+sOpt+'" for="option_'+sOpt+'" data-l10n-id="option_'+sOpt+'"></label></p>\n'
        sHTML += '</div>\n'
    # Creating translation data
    dProperties = {}
    for sLang in dVars['dOptLabel'].keys():
        dProperties[sLang] = "\n".join( [ "option_" + sOpt + " = " + dVars['dOptLabel'][sLang][sOpt][0].replace(" [!]", " [!]")  for sOpt in dVars['dOptLabel'][sLang] ] )
    return sHTML, dProperties


def createThunderbirdExtension (sLang, dVars, spLangPack):
    "create extension for Thunderbird"
    print("Building extension for Thunderbird")
    sExtensionName = dVars['tb_identifier'] + "-v" + dVars['version'] + '.xpi'
    spfZip = "_build/" + sExtensionName
    hZip = zipfile.ZipFile(spfZip, mode='w', compression=zipfile.ZIP_DEFLATED)
    _copyGrammalecteJSPackageInZipFile(hZip, spLangPack, dVars['js_binary_dic'])
    for spf in ["LICENSE.txt", "LICENSE.fr.txt"]:
        hZip.write(spf)
    dVars = _createOptionsForThunderbird(dVars)
    helpers.addFolderToZipAndFileFile(hZip, "gc_lang/"+sLang+"/tb", "", dVars, True)
    hZip.write("gc_lang/"+sLang+"/xpi/gce_worker.js", "worker/gce_worker.js")
    spDict = "gc_lang/"+sLang+"/xpi/data/dictionaries"
    for sp in os.listdir(spDict):







|









|







64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
        for lLineOpt in lOpt:
            for sOpt in lLineOpt:
                sHTML += '  <p><input type="checkbox" id="option_'+sOpt+'" /><label id="option_label_'+sOpt+'" for="option_'+sOpt+'" data-l10n-id="option_'+sOpt+'"></label></p>\n'
        sHTML += '</div>\n'
    # Creating translation data
    dProperties = {}
    for sLang in dVars['dOptLabel'].keys():
        dProperties[sLang] = "\n".join( [ "option_" + sOpt + " = " + dVars['dOptLabel'][sLang][sOpt][0].replace(" [!]", "[!]")  for sOpt in dVars['dOptLabel'][sLang] ] )
    return sHTML, dProperties


def createThunderbirdExtension (sLang, dVars, spLangPack):
    "create extension for Thunderbird"
    print("Building extension for Thunderbird")
    sExtensionName = dVars['tb_identifier'] + "-v" + dVars['version'] + '.xpi'
    spfZip = "_build/" + sExtensionName
    hZip = zipfile.ZipFile(spfZip, mode='w', compression=zipfile.ZIP_DEFLATED)
    _copyGrammalecteJSPackageInZipFile(hZip, spLangPack, dVars['dic_name']+".json")
    for spf in ["LICENSE.txt", "LICENSE.fr.txt"]:
        hZip.write(spf)
    dVars = _createOptionsForThunderbird(dVars)
    helpers.addFolderToZipAndFileFile(hZip, "gc_lang/"+sLang+"/tb", "", dVars, True)
    hZip.write("gc_lang/"+sLang+"/xpi/gce_worker.js", "worker/gce_worker.js")
    spDict = "gc_lang/"+sLang+"/xpi/data/dictionaries"
    for sp in os.listdir(spDict):

Modified gc_lang/fr/build_data.py from [9294fbef92] to [3f80b32195].

1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
#!python3

# FRENCH DATA BUILDER
#
# by Olivier R.
# License: MPL 2

import json
import os

import grammalecte.ibdawg as ibdawg
from grammalecte.echo import echo
from grammalecte.str_transform import defineSuffixCode



class cd:
    """Context manager for changing the current working directory"""
    def __init__ (self, newPath):
        self.newPath = os.path.expanduser(newPath)














>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!python3

# FRENCH DATA BUILDER
#
# by Olivier R.
# License: MPL 2

import json
import os

import grammalecte.ibdawg as ibdawg
from grammalecte.echo import echo
from grammalecte.str_transform import defineSuffixCode
import grammalecte.fr.conj as conj


class cd:
    """Context manager for changing the current working directory"""
    def __init__ (self, newPath):
        self.newPath = os.path.expanduser(newPath)

265
266
267
268
269
270
271






272

273
274
275
276
277
278
279
        return

    with open(sp+"/data/phonet_simil.txt", 'r', encoding='utf-8') as hSrc:
        # set of homophonic words
        lSet = []
        for sLine in hSrc.readlines():
            if not sLine.startswith("#") and sLine.strip():






                lSet.append(sorted(sLine.strip().split()))

        # dictionary of words
        dWord = {}
        for i, aSet in enumerate(lSet):
            for sWord in aSet:
                if oDict.lookup(sWord):
                    dWord[sWord] = i  # warning, what if word in several sets?
                else:







>
>
>
>
>
>
|
>







266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
        return

    with open(sp+"/data/phonet_simil.txt", 'r', encoding='utf-8') as hSrc:
        # set of homophonic words
        lSet = []
        for sLine in hSrc.readlines():
            if not sLine.startswith("#") and sLine.strip():
                lWord = sLine.strip().split()
                aMore = set()
                for sWord in lWord:
                    if sWord.endswith("er") and conj.isVerb(sWord):
                        aMore = aMore.union(conj.getConjSimilInfiV1(sWord))
                lWord.extend(list(aMore))
                lSet.append(sorted(set(lWord)))
                #print(lWord)
        # dictionary of words
        dWord = {}
        for i, aSet in enumerate(lSet):
            for sWord in aSet:
                if oDict.lookup(sWord):
                    dWord[sWord] = i  # warning, what if word in several sets?
                else:

Modified gc_lang/fr/config.ini from [678ba4887a] to [61af539d3c].

1
2
3
4
5
6
7

8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33






34
35
36
37
38
39
40
[args]
lang = fr
lang_name = French
locales = fr_FR fr_BE fr_CA fr_CH fr_LU fr_MC fr_BF fr_CI fr_SN fr_ML fr_NE fr_TG fr_BJ
country_default = FR
name = Grammalecte
implname = grammalecte

version = 0.5.17
author = Olivier R.
provider = Dicollecte
link = http://grammalecte.net
description = Correcteur grammatical pour le français.
extras = README_fr.txt
logo = logo.png

# lexicon source
lexicon_src = lexicons/French.lex
# binary dictionary name
py_binary_dic = French.bdic
js_binary_dic = French.json
# Finite state automaton compression: 1, 2 (experimental) or 3 (experimental)
fsa_method = 1
# stemming method: S for suffixes only, A for prefixes and suffixes
stemming_method = S

# LibreOffice
unopkg = C:/Program Files/LibreOffice 5/program/unopkg.com
oxt_version = 6.1
oxt_identifier = French.linguistic.resources.from.Dicollecte.by.OlivierR

# Firefox
fx_identifier = French-GC@grammalecte.net
fx_name = Grammalecte [fr]







# Thunderbird
tb_identifier = French-GC-TB@grammalecte.net
tb_name = Grammalecte [fr]
tb_debug_extension_path = _build/tb-debug.profile/extensions/French-GC-TB@grammalecte.net
# Set Thunderbird folder in your PATH variable
# Create a local profile:







>
|










|
<







|





>
>
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
[args]
lang = fr
lang_name = French
locales = fr_FR fr_BE fr_CA fr_CH fr_LU fr_MC fr_BF fr_CI fr_SN fr_ML fr_NE fr_TG fr_BJ
country_default = FR
name = Grammalecte
implname = grammalecte
# always use 3 numbers for version: x.y.z
version = 0.6.0b
author = Olivier R.
provider = Dicollecte
link = http://grammalecte.net
description = Correcteur grammatical pour le français.
extras = README_fr.txt
logo = logo.png

# lexicon source
lexicon_src = lexicons/French.lex
# binary dictionary name
dic_name = French

# Finite state automaton compression: 1, 2 (experimental) or 3 (experimental)
fsa_method = 1
# stemming method: S for suffixes only, A for prefixes and suffixes
stemming_method = S

# LibreOffice
unopkg = C:/Program Files/LibreOffice 5/program/unopkg.com
oxt_version = 6.2
oxt_identifier = French.linguistic.resources.from.Dicollecte.by.OlivierR

# Firefox
fx_identifier = French-GC@grammalecte.net
fx_name = Grammalecte [fr]

win_fx_dev_path = C:\Program Files\Firefox Developer Edition\firefox.exe
win_fx_nightly_path = C:\Program Files (x86)\Nightly\firefox.exe
linux_fx_dev_path = /usr/bin/firefox
linux_fx_nightly_path = /usr/bin/firefox


# Thunderbird
tb_identifier = French-GC-TB@grammalecte.net
tb_name = Grammalecte [fr]
tb_debug_extension_path = _build/tb-debug.profile/extensions/French-GC-TB@grammalecte.net
# Set Thunderbird folder in your PATH variable
# Create a local profile:
50
51
52
53
54
55
56

57

58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77

78
79
80
81
82
[oxt]
# the following files must be in your project folder, files will be copied into the zip archive
rules.grx = fr-rules.txt
oxt/addons.xcu = addons.xcu
oxt/package-description.txt = package-description.txt
# images
oxt/_img/logo100.png = img/logo100.png

oxt/_img/LaMouette_small.png = img/LaMouette_small.png

oxt/_img/grammalecte_16.bmp = img/grammalecte_16.bmp
oxt/_img/french_flag_16.bmp = img/french_flag_16.bmp
# AppLauncher
oxt/AppLauncher.py = AppLauncher.py
oxt/helpers.py = pythonpath/helpers.py
# About
oxt/About/About.py = pythonpath/About.py
oxt/About/ab_strings.py = pythonpath/ab_strings.py
# Dictionaries
oxt/Dictionnaires/dictionaries = dictionaries
oxt/Dictionnaires/dictionaries.xcu = dictionaries.xcu
oxt/Dictionnaires/DictionarySwitcher.py = pythonpath/DictionarySwitcher.py
oxt/Dictionnaires/ds_strings.py = pythonpath/ds_strings.py
# ContextMenu
oxt/ContextMenu/ContextMenu.py = ContextMenu.py
oxt/ContextMenu/jobs.xcu = config/jobs.xcu
# TextFormatter
oxt/TextFormatter/TextFormatter.py = pythonpath/TextFormatter.py
oxt/TextFormatter/tf_strings.py = pythonpath/tf_strings.py
oxt/TextFormatter/tf_options.py = pythonpath/tf_options.py

# Conjugueur
oxt/Conjugueur/Conjugueur.py = pythonpath/Conjugueur.py
# Modify author
oxt/ChangeAuthor/Author.py = pythonpath/Author.py
oxt/ChangeAuthor/ca_strings.py = pythonpath/ca_strings.py







>

>




















>





56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
[oxt]
# the following files must be in your project folder, files will be copied into the zip archive
rules.grx = fr-rules.txt
oxt/addons.xcu = addons.xcu
oxt/package-description.txt = package-description.txt
# images
oxt/_img/logo100.png = img/logo100.png
oxt/_img/logo120_text.png = img/logo120_text.png
oxt/_img/LaMouette_small.png = img/LaMouette_small.png
oxt/_img/Algoo_logo.png = img/Algoo_logo.png
oxt/_img/grammalecte_16.bmp = img/grammalecte_16.bmp
oxt/_img/french_flag_16.bmp = img/french_flag_16.bmp
# AppLauncher
oxt/AppLauncher.py = AppLauncher.py
oxt/helpers.py = pythonpath/helpers.py
# About
oxt/About/About.py = pythonpath/About.py
oxt/About/ab_strings.py = pythonpath/ab_strings.py
# Dictionaries
oxt/Dictionnaires/dictionaries = dictionaries
oxt/Dictionnaires/dictionaries.xcu = dictionaries.xcu
oxt/Dictionnaires/DictionarySwitcher.py = pythonpath/DictionarySwitcher.py
oxt/Dictionnaires/ds_strings.py = pythonpath/ds_strings.py
# ContextMenu
oxt/ContextMenu/ContextMenu.py = ContextMenu.py
oxt/ContextMenu/jobs.xcu = config/jobs.xcu
# TextFormatter
oxt/TextFormatter/TextFormatter.py = pythonpath/TextFormatter.py
oxt/TextFormatter/tf_strings.py = pythonpath/tf_strings.py
oxt/TextFormatter/tf_options.py = pythonpath/tf_options.py
oxt/TextFormatter/tf_tabrep.py = pythonpath/tf_tabrep.py
# Conjugueur
oxt/Conjugueur/Conjugueur.py = pythonpath/Conjugueur.py
# Modify author
oxt/ChangeAuthor/Author.py = pythonpath/Author.py
oxt/ChangeAuthor/ca_strings.py = pythonpath/ca_strings.py

Modified gc_lang/fr/data/dictConj.txt from [3497ce77d3] to [1288011f2c].

142838
142839
142840
142841
142842
142843
142844






















































142845
142846
142847
142848
142849
142850
142851
_	impe 1pl	désindexons
_	impe 2pl	désindexez
_	ppas mas sg	désindexé
_	ppas mas pl	désindexés
_	ppas fem sg	désindexée
_	ppas fem pl	désindexées
$






















































désindustrialiser	1__t_q_zz
_	infi	désindustrialiser
_	ppre	désindustrialisant
_	ipre 1sg	désindustrialise
_	ipre 3sg	désindustrialise
_	spre 1sg	désindustrialise
_	spre 3sg	désindustrialise







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







142838
142839
142840
142841
142842
142843
142844
142845
142846
142847
142848
142849
142850
142851
142852
142853
142854
142855
142856
142857
142858
142859
142860
142861
142862
142863
142864
142865
142866
142867
142868
142869
142870
142871
142872
142873
142874
142875
142876
142877
142878
142879
142880
142881
142882
142883
142884
142885
142886
142887
142888
142889
142890
142891
142892
142893
142894
142895
142896
142897
142898
142899
142900
142901
142902
142903
142904
142905
_	impe 1pl	désindexons
_	impe 2pl	désindexez
_	ppas mas sg	désindexé
_	ppas mas pl	désindexés
_	ppas fem sg	désindexée
_	ppas fem pl	désindexées
$
désindividualiser	1_it_q__a
_	infi	désindividualiser
_	ppre	désindividualisant
_	ipre 1sg	désindividualise
_	ipre 3sg	désindividualise
_	spre 1sg	désindividualise
_	spre 3sg	désindividualise
_	ipre 1isg	désindividualisè
_	ipre 2sg	désindividualises
_	spre 2sg	désindividualises
_	ipre 1pl	désindividualisons
_	ipre 2pl	désindividualisez
_	ipre 3pl	désindividualisent
_	spre 3pl	désindividualisent
_	iimp 1sg	désindividualisais
_	iimp 2sg	désindividualisais
_	iimp 3sg	désindividualisait
_	iimp 1pl	désindividualisions
_	spre 1pl	désindividualisions
_	iimp 2pl	désindividualisiez
_	spre 2pl	désindividualisiez
_	iimp 3pl	désindividualisaient
_	ipsi 1sg	désindividualisai
_	ipsi 2sg	désindividualisas
_	ipsi 3sg	désindividualisa
_	ipsi 1pl	désindividualisâmes
_	ipsi 2pl	désindividualisâtes
_	ipsi 3pl	désindividualisèrent
_	ifut 1sg	désindividualiserai
_	ifut 2sg	désindividualiseras
_	ifut 3sg	désindividualisera
_	ifut 1pl	désindividualiserons
_	ifut 2pl	désindividualiserez
_	ifut 3pl	désindividualiseront
_	cond 1sg	désindividualiserais
_	cond 2sg	désindividualiserais
_	cond 3sg	désindividualiserait
_	cond 1pl	désindividualiserions
_	cond 2pl	désindividualiseriez
_	cond 3pl	désindividualiseraient
_	simp 1sg	désindividualisasse
_	simp 2sg	désindividualisasses
_	simp 3sg	désindividualisât
_	simp 1pl	désindividualisassions
_	simp 2pl	désindividualisassiez
_	simp 3pl	désindividualisassent
_	impe 2sg	désindividualise
_	impe 1pl	désindividualisons
_	impe 2pl	désindividualisez
_	ppas mas sg	désindividualisé
_	ppas mas pl	désindividualisés
_	ppas fem sg	désindividualisée
_	ppas fem pl	désindividualisées
$
désindustrialiser	1__t_q_zz
_	infi	désindustrialiser
_	ppre	désindustrialisant
_	ipre 1sg	désindustrialise
_	ipre 3sg	désindustrialise
_	spre 1sg	désindustrialise
_	spre 3sg	désindustrialise
322851
322852
322853
322854
322855
322856
322857






















































322858
322859
322860
322861
322862
322863
322864
_	impe 1pl	protestons
_	impe 2pl	protestez
_	ppas mas sg	protesté
_	ppas mas pl	protestés
_	ppas fem sg	protestée
_	ppas fem pl	protestées
$






















































prouter	1_i____zz
_	infi	prouter
_	ppre	proutant
_	ipre 1sg	proute
_	ipre 3sg	proute
_	spre 1sg	proute
_	spre 3sg	proute







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







322905
322906
322907
322908
322909
322910
322911
322912
322913
322914
322915
322916
322917
322918
322919
322920
322921
322922
322923
322924
322925
322926
322927
322928
322929
322930
322931
322932
322933
322934
322935
322936
322937
322938
322939
322940
322941
322942
322943
322944
322945
322946
322947
322948
322949
322950
322951
322952
322953
322954
322955
322956
322957
322958
322959
322960
322961
322962
322963
322964
322965
322966
322967
322968
322969
322970
322971
322972
_	impe 1pl	protestons
_	impe 2pl	protestez
_	ppas mas sg	protesté
_	ppas mas pl	protestés
_	ppas fem sg	protestée
_	ppas fem pl	protestées
$
prototyper	1_it____a
_	infi	prototyper
_	ppre	prototypant
_	ipre 1sg	prototype
_	ipre 3sg	prototype
_	spre 1sg	prototype
_	spre 3sg	prototype
_	ipre 1isg	prototypè
_	ipre 2sg	prototypes
_	spre 2sg	prototypes
_	ipre 1pl	prototypons
_	ipre 2pl	prototypez
_	ipre 3pl	prototypent
_	spre 3pl	prototypent
_	iimp 1sg	prototypais
_	iimp 2sg	prototypais
_	iimp 3sg	prototypait
_	iimp 1pl	prototypions
_	spre 1pl	prototypions
_	iimp 2pl	prototypiez
_	spre 2pl	prototypiez
_	iimp 3pl	prototypaient
_	ipsi 1sg	prototypai
_	ipsi 2sg	prototypas
_	ipsi 3sg	prototypa
_	ipsi 1pl	prototypâmes
_	ipsi 2pl	prototypâtes
_	ipsi 3pl	prototypèrent
_	ifut 1sg	prototyperai
_	ifut 2sg	prototyperas
_	ifut 3sg	prototypera
_	ifut 1pl	prototyperons
_	ifut 2pl	prototyperez
_	ifut 3pl	prototyperont
_	cond 1sg	prototyperais
_	cond 2sg	prototyperais
_	cond 3sg	prototyperait
_	cond 1pl	prototyperions
_	cond 2pl	prototyperiez
_	cond 3pl	prototyperaient
_	simp 1sg	prototypasse
_	simp 2sg	prototypasses
_	simp 3sg	prototypât
_	simp 1pl	prototypassions
_	simp 2pl	prototypassiez
_	simp 3pl	prototypassent
_	impe 2sg	prototype
_	impe 1pl	prototypons
_	impe 2pl	prototypez
_	ppas mas sg	prototypé
_	ppas mas pl	prototypés
_	ppas fem sg	prototypée
_	ppas fem pl	prototypées
$
prouter	1_i____zz
_	infi	prouter
_	ppre	proutant
_	ipre 1sg	proute
_	ipre 3sg	proute
_	spre 1sg	proute
_	spre 3sg	proute
385898
385899
385900
385901
385902
385903
385904



















































385905
385906
385907
385908
385909
385910
385911
_	impe 1pl	scriptons
_	impe 2pl	scriptez
_	ppas mas sg	scripté
_	ppas mas pl	scriptés
_	ppas fem sg	scriptée
_	ppas fem pl	scriptées
$



















































scruter	1__t___zz
_	infi	scruter
_	ppre	scrutant
_	ipre 1sg	scrute
_	ipre 3sg	scrute
_	spre 1sg	scrute
_	spre 3sg	scrute







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







386006
386007
386008
386009
386010
386011
386012
386013
386014
386015
386016
386017
386018
386019
386020
386021
386022
386023
386024
386025
386026
386027
386028
386029
386030
386031
386032
386033
386034
386035
386036
386037
386038
386039
386040
386041
386042
386043
386044
386045
386046
386047
386048
386049
386050
386051
386052
386053
386054
386055
386056
386057
386058
386059
386060
386061
386062
386063
386064
386065
386066
386067
386068
386069
386070
_	impe 1pl	scriptons
_	impe 2pl	scriptez
_	ppas mas sg	scripté
_	ppas mas pl	scriptés
_	ppas fem sg	scriptée
_	ppas fem pl	scriptées
$
scroller	1_i_____a
_	infi	scroller
_	ppre	scrollant
_	ipre 1sg	scrolle
_	ipre 3sg	scrolle
_	spre 1sg	scrolle
_	spre 3sg	scrolle
_	ipre 1isg	scrollè
_	ipre 2sg	scrolles
_	spre 2sg	scrolles
_	ipre 1pl	scrollons
_	ipre 2pl	scrollez
_	ipre 3pl	scrollent
_	spre 3pl	scrollent
_	iimp 1sg	scrollais
_	iimp 2sg	scrollais
_	iimp 3sg	scrollait
_	iimp 1pl	scrollions
_	spre 1pl	scrollions
_	iimp 2pl	scrolliez
_	spre 2pl	scrolliez
_	iimp 3pl	scrollaient
_	ipsi 1sg	scrollai
_	ipsi 2sg	scrollas
_	ipsi 3sg	scrolla
_	ipsi 1pl	scrollâmes
_	ipsi 2pl	scrollâtes
_	ipsi 3pl	scrollèrent
_	ifut 1sg	scrollerai
_	ifut 2sg	scrolleras
_	ifut 3sg	scrollera
_	ifut 1pl	scrollerons
_	ifut 2pl	scrollerez
_	ifut 3pl	scrolleront
_	cond 1sg	scrollerais
_	cond 2sg	scrollerais
_	cond 3sg	scrollerait
_	cond 1pl	scrollerions
_	cond 2pl	scrolleriez
_	cond 3pl	scrolleraient
_	simp 1sg	scrollasse
_	simp 2sg	scrollasses
_	simp 3sg	scrollât
_	simp 1pl	scrollassions
_	simp 2pl	scrollassiez
_	simp 3pl	scrollassent
_	impe 2sg	scrolle
_	impe 1pl	scrollons
_	impe 2pl	scrollez
_	ppas epi inv	scrollé
$
scruter	1__t___zz
_	infi	scruter
_	ppre	scrutant
_	ipre 1sg	scrute
_	ipre 3sg	scrute
_	spre 1sg	scrute
_	spre 3sg	scrute
421221
421222
421223
421224
421225
421226
421227






















































421228
421229
421230
421231
421232
421233
421234
_	impe 1pl	transvidons
_	impe 2pl	transvidez
_	ppas mas sg	transvidé
_	ppas mas pl	transvidés
_	ppas fem sg	transvidée
_	ppas fem pl	transvidées
$






















































traquer	1__t___zz
_	infi	traquer
_	ppre	traquant
_	ipre 1sg	traque
_	ipre 3sg	traque
_	spre 1sg	traque
_	spre 3sg	traque







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







421380
421381
421382
421383
421384
421385
421386
421387
421388
421389
421390
421391
421392
421393
421394
421395
421396
421397
421398
421399
421400
421401
421402
421403
421404
421405
421406
421407
421408
421409
421410
421411
421412
421413
421414
421415
421416
421417
421418
421419
421420
421421
421422
421423
421424
421425
421426
421427
421428
421429
421430
421431
421432
421433
421434
421435
421436
421437
421438
421439
421440
421441
421442
421443
421444
421445
421446
421447
_	impe 1pl	transvidons
_	impe 2pl	transvidez
_	ppas mas sg	transvidé
_	ppas mas pl	transvidés
_	ppas fem sg	transvidée
_	ppas fem pl	transvidées
$
trapper	1_it____a
_	infi	trapper
_	ppre	trappant
_	ipre 1sg	trappe
_	ipre 3sg	trappe
_	spre 1sg	trappe
_	spre 3sg	trappe
_	ipre 1isg	trappè
_	ipre 2sg	trappes
_	spre 2sg	trappes
_	ipre 1pl	trappons
_	ipre 2pl	trappez
_	ipre 3pl	trappent
_	spre 3pl	trappent
_	iimp 1sg	trappais
_	iimp 2sg	trappais
_	iimp 3sg	trappait
_	iimp 1pl	trappions
_	spre 1pl	trappions
_	iimp 2pl	trappiez
_	spre 2pl	trappiez
_	iimp 3pl	trappaient
_	ipsi 1sg	trappai
_	ipsi 2sg	trappas
_	ipsi 3sg	trappa
_	ipsi 1pl	trappâmes
_	ipsi 2pl	trappâtes
_	ipsi 3pl	trappèrent
_	ifut 1sg	trapperai
_	ifut 2sg	trapperas
_	ifut 3sg	trappera
_	ifut 1pl	trapperons
_	ifut 2pl	trapperez
_	ifut 3pl	trapperont
_	cond 1sg	trapperais
_	cond 2sg	trapperais
_	cond 3sg	trapperait
_	cond 1pl	trapperions
_	cond 2pl	trapperiez
_	cond 3pl	trapperaient
_	simp 1sg	trappasse
_	simp 2sg	trappasses
_	simp 3sg	trappât
_	simp 1pl	trappassions
_	simp 2pl	trappassiez
_	simp 3pl	trappassent
_	impe 2sg	trappe
_	impe 1pl	trappons
_	impe 2pl	trappez
_	ppas mas sg	trappé
_	ppas mas pl	trappés
_	ppas fem sg	trappée
_	ppas fem pl	trappées
$
traquer	1__t___zz
_	infi	traquer
_	ppre	traquant
_	ipre 1sg	traque
_	ipre 3sg	traque
_	spre 1sg	traque
_	spre 3sg	traque

Modified gc_lang/fr/data/dictDecl.txt from [ebca45ebbc] to [250741fc7c].

3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246




3247
3248
3249
3250
3251
3252
3253
_	adj mas sg	additif
_	adj mas pl	additifs
$
additivité	S*()
_	nom fem sg	additivité
_	nom fem pl	additivités
$
addon	S*()
_	nom mas sg	addon
_	nom mas pl	addons
$
adducteur	S*()
_	nom mas sg	adducteur
_	nom mas pl	adducteurs
$
adduction	S*()
_	nom fem sg	adduction
_	nom fem pl	adductions
$
adduit	S*()
_	nom mas sg	adduit
_	nom mas pl	adduits
$
adèle	S*()
_	nom fem sg	adèle
_	nom fem pl	adèles
$




adelphophagie	S*()
_	nom fem sg	adelphophagie
_	nom fem pl	adelphophagies
$
adénine	S*()
_	nom fem sg	adénine
_	nom fem pl	adénines







|
|
|

















>
>
>
>







3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
_	adj mas sg	additif
_	adj mas pl	additifs
$
additivité	S*()
_	nom fem sg	additivité
_	nom fem pl	additivités
$
add-on	S*()
_	nom mas sg	add-on
_	nom mas pl	add-ons
$
adducteur	S*()
_	nom mas sg	adducteur
_	nom mas pl	adducteurs
$
adduction	S*()
_	nom fem sg	adduction
_	nom fem pl	adductions
$
adduit	S*()
_	nom mas sg	adduit
_	nom mas pl	adduits
$
adèle	S*()
_	nom fem sg	adèle
_	nom fem pl	adèles
$
adelphe	S*()
_	nom adj epi sg	adelphe
_	nom adj epi pl	adelphes
$
adelphophagie	S*()
_	nom fem sg	adelphophagie
_	nom fem pl	adelphophagies
$
adénine	S*()
_	nom fem sg	adénine
_	nom fem pl	adénines
6154
6155
6156
6157
6158
6159
6160




6161
6162
6163
6164
6165
6166
6167
_	adj epi sg	aimable
_	adj epi pl	aimables
$
aimant	S*()
_	nom mas sg	aimant
_	nom mas pl	aimants
$




aimantation	S*()
_	nom fem sg	aimantation
_	nom fem pl	aimantations
$
aimante	F*()
_	adj fem sg	aimante
_	adj fem pl	aimantes







>
>
>
>







6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
_	adj epi sg	aimable
_	adj epi pl	aimables
$
aimant	S*()
_	nom mas sg	aimant
_	nom mas pl	aimants
$
aimantable	S*()
_	adj epi sg	aimantable
_	adj epi pl	aimantables
$
aimantation	S*()
_	nom fem sg	aimantation
_	nom fem pl	aimantations
$
aimante	F*()
_	adj fem sg	aimante
_	adj fem pl	aimantes
8533
8534
8535
8536
8537
8538
8539




8540
8541
8542
8543
8544
8545
8546
_	adj mas sg	amazonien
_	adj mas pl	amazoniens
$
amazonite	S*()
_	nom fem sg	amazonite
_	nom fem pl	amazonites
$




ambassade	S*()
_	nom fem sg	ambassade
_	nom fem pl	ambassades
$
ambassadrice	F*()
_	nom adj fem sg	ambassadrice
_	nom adj fem pl	ambassadrices







>
>
>
>







8541
8542
8543
8544
8545
8546
8547
8548
8549
8550
8551
8552
8553
8554
8555
8556
8557
8558
_	adj mas sg	amazonien
_	adj mas pl	amazoniens
$
amazonite	S*()
_	nom fem sg	amazonite
_	nom fem pl	amazonites
$
ambage	S*()
_	nom fem sg	ambage
_	nom fem pl	ambages
$
ambassade	S*()
_	nom fem sg	ambassade
_	nom fem pl	ambassades
$
ambassadrice	F*()
_	nom adj fem sg	ambassadrice
_	nom adj fem pl	ambassadrices
11777
11778
11779
11780
11781
11782
11783




11784
11785
11786
11787
11788
11789
11790
$
annulatrice	F*()
_	nom adj fem sg	annulatrice
_	nom adj fem pl	annulatrices
_	nom adj mas sg	annulateur
_	nom adj mas pl	annulateurs
$




anoblissante	F*()
_	adj fem sg	anoblissante
_	adj fem pl	anoblissantes
_	adj mas sg	anoblissant
_	adj mas pl	anoblissants
$
anoblissement	S*()







>
>
>
>







11789
11790
11791
11792
11793
11794
11795
11796
11797
11798
11799
11800
11801
11802
11803
11804
11805
11806
$
annulatrice	F*()
_	nom adj fem sg	annulatrice
_	nom adj fem pl	annulatrices
_	nom adj mas sg	annulateur
_	nom adj mas pl	annulateurs
$
annulement	S*()
_	nom mas sg	annulement
_	nom mas pl	annulements
$
anoblissante	F*()
_	adj fem sg	anoblissante
_	adj fem pl	anoblissantes
_	adj mas sg	anoblissant
_	adj mas pl	anoblissants
$
anoblissement	S*()
13041
13042
13043
13044
13045
13046
13047








13048
13049
13050
13051
13052
13053
13054
_	nom mas sg	antiestrogène
_	nom mas pl	antiestrogènes
$
antiétatique	S*()
_	adj epi sg	antiétatique
_	adj epi pl	antiétatiques
$








antifading	S*()
_	nom mas sg	antifading
_	nom mas pl	antifadings
$
antifascisme	S*()
_	nom mas sg	antifascisme
_	nom mas pl	antifascismes







>
>
>
>
>
>
>
>







13057
13058
13059
13060
13061
13062
13063
13064
13065
13066
13067
13068
13069
13070
13071
13072
13073
13074
13075
13076
13077
13078
_	nom mas sg	antiestrogène
_	nom mas pl	antiestrogènes
$
antiétatique	S*()
_	adj epi sg	antiétatique
_	adj epi pl	antiétatiques
$
antiétatisme	S*()
_	nom mas sg	antiétatisme
_	nom mas pl	antiétatismes
$
antifa	S*()
_	nom adj epi sg	antifa
_	nom adj epi pl	antifas
$
antifading	S*()
_	nom mas sg	antifading
_	nom mas pl	antifadings
$
antifascisme	S*()
_	nom mas sg	antifascisme
_	nom mas pl	antifascismes
27018
27019
27020
27021
27022
27023
27024





27025
27026
27027
27028
27029
27030
27031
_	nom fem sg	bernicle
_	nom fem pl	bernicles
$
bernique	S.()
_	nom fem sg	bernique
_	nom fem pl	berniques
$





berrichonne	F.()
_	nom adj fem sg	berrichonne
_	nom adj fem pl	berrichonnes
_	nom adj mas sg	berrichon
_	nom adj mas pl	berrichons
$
bersaglier	S.()







>
>
>
>
>







27042
27043
27044
27045
27046
27047
27048
27049
27050
27051
27052
27053
27054
27055
27056
27057
27058
27059
27060
_	nom fem sg	bernicle
_	nom fem pl	bernicles
$
bernique	S.()
_	nom fem sg	bernique
_	nom fem pl	berniques
$
bernoise	F.()
_	nom adj fem sg	bernoise
_	nom adj fem pl	bernoises
_	nom adj mas inv	bernois
$
berrichonne	F.()
_	nom adj fem sg	berrichonne
_	nom adj fem pl	berrichonnes
_	nom adj mas sg	berrichon
_	nom adj mas pl	berrichons
$
bersaglier	S.()
35413
35414
35415
35416
35417
35418
35419




35420
35421
35422
35423
35424
35425
35426
_	nom mas sg	building
_	nom mas pl	buildings
$
buire	S.()
_	nom fem sg	buire
_	nom fem pl	buires
$




buisson	S.()
_	nom mas sg	buisson
_	nom mas pl	buissons
$
buissonnante	F.()
_	adj fem sg	buissonnante
_	adj fem pl	buissonnantes







>
>
>
>







35442
35443
35444
35445
35446
35447
35448
35449
35450
35451
35452
35453
35454
35455
35456
35457
35458
35459
_	nom mas sg	building
_	nom mas pl	buildings
$
buire	S.()
_	nom fem sg	buire
_	nom fem pl	buires
$
buissaie	S.()
_	nom fem sg	buissaie
_	nom fem pl	buissaies
$
buisson	S.()
_	nom mas sg	buisson
_	nom mas pl	buissons
$
buissonnante	F.()
_	adj fem sg	buissonnante
_	adj fem pl	buissonnantes
36629
36630
36631
36632
36633
36634
36635
36636
36637
36638
36639
36640
36641
36642
36643
36644
36645
36646
36647
36648
36649
36650
36651
36652






36653
36654
36655
36656
36657
36658
36659
36660
36661
36662
_	nom mas pl	cadreurs
$
cadriciel	S.()
_	nom mas sg	cadriciel
_	nom mas pl	cadriciels
$
caduc	S.()
_	adj epi sg	caduc
_	adj epi pl	caducs
$
caducée	S.()
_	nom mas sg	caducée
_	nom mas pl	caducées
$
caducifoliée	F.()
_	adj fem sg	caducifoliée
_	adj fem pl	caducifoliées
_	adj mas sg	caducifolié
_	adj mas pl	caducifoliés
$
caducité	S.()
_	nom fem sg	caducité
_	nom fem pl	caducités
$






caduque	S.()
_	adj epi sg	caduque
_	adj epi pl	caduques
$
cæcale	W.()
_	adj fem sg	cæcale
_	adj fem pl	cæcales
_	adj mas sg	cæcal
_	adj mas pl	cæcaux
$







|
|















>
>
>
>
>
>

|
|







36662
36663
36664
36665
36666
36667
36668
36669
36670
36671
36672
36673
36674
36675
36676
36677
36678
36679
36680
36681
36682
36683
36684
36685
36686
36687
36688
36689
36690
36691
36692
36693
36694
36695
36696
36697
36698
36699
36700
36701
_	nom mas pl	cadreurs
$
cadriciel	S.()
_	nom mas sg	cadriciel
_	nom mas pl	cadriciels
$
caduc	S.()
_	adj mas sg	caduc
_	adj mas pl	caducs
$
caducée	S.()
_	nom mas sg	caducée
_	nom mas pl	caducées
$
caducifoliée	F.()
_	adj fem sg	caducifoliée
_	adj fem pl	caducifoliées
_	adj mas sg	caducifolié
_	adj mas pl	caducifoliés
$
caducité	S.()
_	nom fem sg	caducité
_	nom fem pl	caducités
$
caduque	F.()
_	adj fem sg	caduque
_	adj fem pl	caduques
_	adj mas sg	caduc
_	adj mas pl	caducs
$
caduque	S.()
_	nom fem sg	caduque
_	nom fem pl	caduques
$
cæcale	W.()
_	adj fem sg	cæcale
_	adj fem pl	cæcales
_	adj mas sg	cæcal
_	adj mas pl	cæcaux
$
38073
38074
38075
38076
38077
38078
38079




38080
38081
38082
38083
38084
38085
38086
_	nom adj fem pl	camuses
_	nom adj mas inv	camus
$
canada	S.()
_	nom fem sg	canada
_	nom fem pl	canadas
$




canadianisme	S.()
_	nom mas sg	canadianisme
_	nom mas pl	canadianismes
$
canadienne	F.()
_	nom adj fem sg	canadienne
_	nom adj fem pl	canadiennes







>
>
>
>







38112
38113
38114
38115
38116
38117
38118
38119
38120
38121
38122
38123
38124
38125
38126
38127
38128
38129
_	nom adj fem pl	camuses
_	nom adj mas inv	camus
$
canada	S.()
_	nom fem sg	canada
_	nom fem pl	canadas
$
canadair	S.()
_	nom mas sg	canadair
_	nom mas pl	canadairs
$
canadianisme	S.()
_	nom mas sg	canadianisme
_	nom mas pl	canadianismes
$
canadienne	F.()
_	nom adj fem sg	canadienne
_	nom adj fem pl	canadiennes
41724
41725
41726
41727
41728
41729
41730




41731
41732
41733
41734
41735
41736
41737
$
caudale	W.()
_	adj fem sg	caudale
_	adj fem pl	caudales
_	adj mas sg	caudal
_	adj mas pl	caudaux
$




caudataire	S.()
_	adj epi sg	caudataire
_	adj epi pl	caudataires
$
caudataire	S.()
_	nom mas sg	caudataire
_	nom mas pl	caudataires







>
>
>
>







41767
41768
41769
41770
41771
41772
41773
41774
41775
41776
41777
41778
41779
41780
41781
41782
41783
41784
$
caudale	W.()
_	adj fem sg	caudale
_	adj fem pl	caudales
_	adj mas sg	caudal
_	adj mas pl	caudaux
$
caudalie	S.()
_	nom fem sg	caudalie
_	nom fem pl	caudalies
$
caudataire	S.()
_	adj epi sg	caudataire
_	adj epi pl	caudataires
$
caudataire	S.()
_	nom mas sg	caudataire
_	nom mas pl	caudataires
58779
58780
58781
58782
58783
58784
58785




58786
58787
58788
58789
58790
58791
58792
_	nom mas sg	corselet
_	nom mas pl	corselets
$
corset	S.()
_	nom mas sg	corset
_	nom mas pl	corsets
$




corseterie	S.()
_	nom fem sg	corseterie
_	nom fem pl	corseteries
$
corsetière	F.()
_	nom adj fem sg	corsetière
_	nom adj fem pl	corsetières







>
>
>
>







58826
58827
58828
58829
58830
58831
58832
58833
58834
58835
58836
58837
58838
58839
58840
58841
58842
58843
_	nom mas sg	corselet
_	nom mas pl	corselets
$
corset	S.()
_	nom mas sg	corset
_	nom mas pl	corsets
$
corsetage	S.()
_	nom mas sg	corsetage
_	nom mas pl	corsetages
$
corseterie	S.()
_	nom fem sg	corseterie
_	nom fem pl	corseteries
$
corsetière	F.()
_	nom adj fem sg	corsetière
_	nom adj fem pl	corsetières
64250
64251
64252
64253
64254
64255
64256




64257
64258
64259
64260
64261
64262
64263
_	nom mas sg	czar
_	nom mas pl	czars
$
czimbalum	S.()
_	nom mas sg	czimbalum
_	nom mas pl	czimbalums
$




dacryoadénite	S.()
_	nom fem sg	dacryoadénite
_	nom fem pl	dacryoadénites
$
dacryocystite	S.()
_	nom fem sg	dacryocystite
_	nom fem pl	dacryocystites







>
>
>
>







64301
64302
64303
64304
64305
64306
64307
64308
64309
64310
64311
64312
64313
64314
64315
64316
64317
64318
_	nom mas sg	czar
_	nom mas pl	czars
$
czimbalum	S.()
_	nom mas sg	czimbalum
_	nom mas pl	czimbalums
$
daba	S.()
_	nom fem sg	daba
_	nom fem pl	dabas
$
dacryoadénite	S.()
_	nom fem sg	dacryoadénite
_	nom fem pl	dacryoadénites
$
dacryocystite	S.()
_	nom fem sg	dacryocystite
_	nom fem pl	dacryocystites
68224
68225
68226
68227
68228
68229
68230
68231
68232
68233
68234
68235
68236
68237
68238
68239
délitescente	F.()
_	adj fem sg	délitescente
_	adj fem pl	délitescentes
_	adj mas sg	délitescent
_	adj mas pl	délitescents
$
délivrable	S.()
_	nom mas sg	délivrable
_	nom mas pl	délivrables
$
délivrance	S.()
_	nom fem sg	délivrance
_	nom fem pl	délivrances
$
délivreur	S.()
_	nom mas sg	délivreur







|
|







68279
68280
68281
68282
68283
68284
68285
68286
68287
68288
68289
68290
68291
68292
68293
68294
délitescente	F.()
_	adj fem sg	délitescente
_	adj fem pl	délitescentes
_	adj mas sg	délitescent
_	adj mas pl	délitescents
$
délivrable	S.()
_	adj epi sg	délivrable
_	adj epi pl	délivrables
$
délivrance	S.()
_	nom fem sg	délivrance
_	nom fem pl	délivrances
$
délivreur	S.()
_	nom mas sg	délivreur
69403
69404
69405
69406
69407
69408
69409




69410
69411
69412
69413
69414
69415
69416
$
dénominative	F.()
_	nom adj fem sg	dénominative
_	nom adj fem pl	dénominatives
_	nom adj mas sg	dénominatif
_	nom adj mas pl	dénominatifs
$




dénonciation	S.()
_	nom fem sg	dénonciation
_	nom fem pl	dénonciations
$
dénonciatrice	F.()
_	nom adj fem sg	dénonciatrice
_	nom adj fem pl	dénonciatrices







>
>
>
>







69458
69459
69460
69461
69462
69463
69464
69465
69466
69467
69468
69469
69470
69471
69472
69473
69474
69475
$
dénominative	F.()
_	nom adj fem sg	dénominative
_	nom adj fem pl	dénominatives
_	nom adj mas sg	dénominatif
_	nom adj mas pl	dénominatifs
$
dénommable	S.()
_	adj epi sg	dénommable
_	adj epi pl	dénommables
$
dénonciation	S.()
_	nom fem sg	dénonciation
_	nom fem pl	dénonciations
$
dénonciatrice	F.()
_	nom adj fem sg	dénonciatrice
_	nom adj fem pl	dénonciatrices
71700
71701
71702
71703
71704
71705
71706






71707
71708
71709
71710
71711
71712
71713
_	nom fem sg	désirabilité
_	nom fem pl	désirabilités
$
désirable	S.()
_	adj epi sg	désirable
_	adj epi pl	désirables
$






désireuse	W.()
_	adj fem sg	désireuse
_	adj fem pl	désireuses
_	adj mas inv	désireux
$
désistement	S.()
_	nom mas sg	désistement







>
>
>
>
>
>







71759
71760
71761
71762
71763
71764
71765
71766
71767
71768
71769
71770
71771
71772
71773
71774
71775
71776
71777
71778
_	nom fem sg	désirabilité
_	nom fem pl	désirabilités
$
désirable	S.()
_	adj epi sg	désirable
_	adj epi pl	désirables
$
désirante	F.()
_	adj fem sg	désirante
_	adj fem pl	désirantes
_	adj mas sg	désirant
_	adj mas pl	désirants
$
désireuse	W.()
_	adj fem sg	désireuse
_	adj fem pl	désireuses
_	adj mas inv	désireux
$
désistement	S.()
_	nom mas sg	désistement
72745
72746
72747
72748
72749
72750
72751
72752
72753
72754
72755
72756
72757
72758
72759
72760
72761
72762
_	nom mas pl	déverbatifs
$
dévergondage	S.()
_	nom mas sg	dévergondage
_	nom mas pl	dévergondages
$
dévergondée	F.()
_	nom adj fem sg	dévergondée
_	nom adj fem pl	dévergondées
_	nom adj mas sg	dévergondé
_	nom adj mas pl	dévergondés
$
déverminage	S.()
_	nom mas sg	déverminage
_	nom mas pl	déverminages
$
dévernissage	S.()
_	nom mas sg	dévernissage







|
|
|
|







72810
72811
72812
72813
72814
72815
72816
72817
72818
72819
72820
72821
72822
72823
72824
72825
72826
72827
_	nom mas pl	déverbatifs
$
dévergondage	S.()
_	nom mas sg	dévergondage
_	nom mas pl	dévergondages
$
dévergondée	F.()
_	nom fem sg	dévergondée
_	nom fem pl	dévergondées
_	nom mas sg	dévergondé
_	nom mas pl	dévergondés
$
déverminage	S.()
_	nom mas sg	déverminage
_	nom mas pl	déverminages
$
dévernissage	S.()
_	nom mas sg	dévernissage
73562
73563
73564
73565
73566
73567
73568




73569
73570
73571
73572
73573
73574
73575
_	nom mas sg	diascordium
_	nom mas pl	diascordiums
$
diaspora	S.()
_	nom fem sg	diaspora
_	nom fem pl	diasporas
$




diastase	S.()
_	nom fem sg	diastase
_	nom fem pl	diastases
$
diastasique	S.()
_	adj epi sg	diastasique
_	adj epi pl	diastasiques







>
>
>
>







73627
73628
73629
73630
73631
73632
73633
73634
73635
73636
73637
73638
73639
73640
73641
73642
73643
73644
_	nom mas sg	diascordium
_	nom mas pl	diascordiums
$
diaspora	S.()
_	nom fem sg	diaspora
_	nom fem pl	diasporas
$
diasporique	S.()
_	adj epi sg	diasporique
_	adj epi pl	diasporiques
$
diastase	S.()
_	nom fem sg	diastase
_	nom fem pl	diastases
$
diastasique	S.()
_	adj epi sg	diastasique
_	adj epi pl	diastasiques
76205
76206
76207
76208
76209
76210
76211




76212
76213
76214
76215
76216
76217
76218
_	adj epi sg	diversiforme
_	adj epi pl	diversiformes
$
diversion	S.()
_	nom fem sg	diversion
_	nom fem pl	diversions
$




diversité	S.()
_	nom fem sg	diversité
_	nom fem pl	diversités
$
diverticule	S.()
_	nom mas sg	diverticule
_	nom mas pl	diverticules







>
>
>
>







76274
76275
76276
76277
76278
76279
76280
76281
76282
76283
76284
76285
76286
76287
76288
76289
76290
76291
_	adj epi sg	diversiforme
_	adj epi pl	diversiformes
$
diversion	S.()
_	nom fem sg	diversion
_	nom fem pl	diversions
$
diversitaire	S.()
_	adj epi sg	diversitaire
_	adj epi pl	diversitaires
$
diversité	S.()
_	nom fem sg	diversité
_	nom fem pl	diversités
$
diverticule	S.()
_	nom mas sg	diverticule
_	nom mas pl	diverticules
84897
84898
84899
84900
84901
84902
84903




84904
84905
84906
84907
84908
84909
84910
_	adj epi sg	endogène
_	adj epi pl	endogènes
$
endogénéité	S*()
_	nom fem sg	endogénéité
_	nom fem pl	endogénéités
$




endolocalisation	S*()
_	nom fem sg	endolocalisation
_	nom fem pl	endolocalisations
$
endolorissement	S*()
_	nom mas sg	endolorissement
_	nom mas pl	endolorissements







>
>
>
>







84970
84971
84972
84973
84974
84975
84976
84977
84978
84979
84980
84981
84982
84983
84984
84985
84986
84987
_	adj epi sg	endogène
_	adj epi pl	endogènes
$
endogénéité	S*()
_	nom fem sg	endogénéité
_	nom fem pl	endogénéités
$
endogroupe	S*()
_	nom mas sg	endogroupe
_	nom mas pl	endogroupes
$
endolocalisation	S*()
_	nom fem sg	endolocalisation
_	nom fem pl	endolocalisations
$
endolorissement	S*()
_	nom mas sg	endolorissement
_	nom mas pl	endolorissements
90701
90702
90703
90704
90705
90706
90707








90708
90709
90710
90711
90712
90713
90714
_	nom mas sg	ethnarque
_	nom mas pl	ethnarques
$
ethnicisation	S*()
_	nom fem sg	ethnicisation
_	nom fem pl	ethnicisations
$








ethnicité	S*()
_	nom fem sg	ethnicité
_	nom fem pl	ethnicités
$
ethnico-religieuse	W*()
_	adj fem sg	ethnico-religieuse
_	adj fem pl	ethnico-religieuses







>
>
>
>
>
>
>
>







90778
90779
90780
90781
90782
90783
90784
90785
90786
90787
90788
90789
90790
90791
90792
90793
90794
90795
90796
90797
90798
90799
_	nom mas sg	ethnarque
_	nom mas pl	ethnarques
$
ethnicisation	S*()
_	nom fem sg	ethnicisation
_	nom fem pl	ethnicisations
$
ethnicisme	S*()
_	nom mas sg	ethnicisme
_	nom mas pl	ethnicismes
$
ethniciste	S*()
_	nom adj epi sg	ethniciste
_	nom adj epi pl	ethnicistes
$
ethnicité	S*()
_	nom fem sg	ethnicité
_	nom fem pl	ethnicités
$
ethnico-religieuse	W*()
_	adj fem sg	ethnico-religieuse
_	adj fem pl	ethnico-religieuses
90846
90847
90848
90849
90850
90851
90852






90853
90854
90855
90856
90857
90858
90859
_	nom fem sg	ethnopsychiatrie
_	nom fem pl	ethnopsychiatries
$
ethnopsychologie	S*()
_	nom fem sg	ethnopsychologie
_	nom fem pl	ethnopsychologies
$






ethnoreligieuse	W*()
_	adj fem sg	ethnoreligieuse
_	adj fem pl	ethnoreligieuses
_	adj mas inv	ethnoreligieux
$
éthographie	S*()
_	nom fem sg	éthographie







>
>
>
>
>
>







90931
90932
90933
90934
90935
90936
90937
90938
90939
90940
90941
90942
90943
90944
90945
90946
90947
90948
90949
90950
_	nom fem sg	ethnopsychiatrie
_	nom fem pl	ethnopsychiatries
$
ethnopsychologie	S*()
_	nom fem sg	ethnopsychologie
_	nom fem pl	ethnopsychologies
$
ethno-raciale	W*()
_	adj fem sg	ethno-raciale
_	adj fem pl	ethno-raciales
_	adj mas sg	ethno-racial
_	adj mas pl	ethno-raciaux
$
ethnoreligieuse	W*()
_	adj fem sg	ethnoreligieuse
_	adj fem pl	ethnoreligieuses
_	adj mas inv	ethnoreligieux
$
éthographie	S*()
_	nom fem sg	éthographie
92962
92963
92964
92965
92966
92967
92968




92969
92970
92971
92972
92973
92974
92975
_	adj epi sg	exogène
_	adj epi pl	exogènes
$
exogénéité	S*()
_	nom fem sg	exogénéité
_	nom fem pl	exogénéités
$




exomphale	S*()
_	nom fem sg	exomphale
_	nom fem pl	exomphales
$
exon	S*()
_	nom mas sg	exon
_	nom mas pl	exons







>
>
>
>







93053
93054
93055
93056
93057
93058
93059
93060
93061
93062
93063
93064
93065
93066
93067
93068
93069
93070
_	adj epi sg	exogène
_	adj epi pl	exogènes
$
exogénéité	S*()
_	nom fem sg	exogénéité
_	nom fem pl	exogénéités
$
exogroupe	S*()
_	nom mas sg	exogroupe
_	nom mas pl	exogroupes
$
exomphale	S*()
_	nom fem sg	exomphale
_	nom fem pl	exomphales
$
exon	S*()
_	nom mas sg	exon
_	nom mas pl	exons
93687
93688
93689
93690
93691
93692
93693








93694
93695
93696
93697
93698
93699
93700
_	nom fem sg	extensivité
_	nom fem pl	extensivités
$
extensomètre	S*()
_	nom mas sg	extensomètre
_	nom mas pl	extensomètres
$








exténuante	F*()
_	adj fem sg	exténuante
_	adj fem pl	exténuantes
_	adj mas sg	exténuant
_	adj mas pl	exténuants
$
exténuation	S*()







>
>
>
>
>
>
>
>







93782
93783
93784
93785
93786
93787
93788
93789
93790
93791
93792
93793
93794
93795
93796
93797
93798
93799
93800
93801
93802
93803
_	nom fem sg	extensivité
_	nom fem pl	extensivités
$
extensomètre	S*()
_	nom mas sg	extensomètre
_	nom mas pl	extensomètres
$
extensométrie	S*()
_	nom fem sg	extensométrie
_	nom fem pl	extensométries
$
extensométrique	S*()
_	adj epi sg	extensométrique
_	adj epi pl	extensométriques
$
exténuante	F*()
_	adj fem sg	exténuante
_	adj fem pl	exténuantes
_	adj mas sg	exténuant
_	adj mas pl	exténuants
$
exténuation	S*()
97824
97825
97826
97827
97828
97829
97830




97831
97832
97833
97834
97835
97836
97837
_	nom mas sg	filoutage
_	nom mas pl	filoutages
$
filouterie	S.()
_	nom fem sg	filouterie
_	nom fem pl	filouteries
$




filtrable	S.()
_	adj epi sg	filtrable
_	adj epi pl	filtrables
$
filtrage	S.()
_	nom mas sg	filtrage
_	nom mas pl	filtrages







>
>
>
>







97927
97928
97929
97930
97931
97932
97933
97934
97935
97936
97937
97938
97939
97940
97941
97942
97943
97944
_	nom mas sg	filoutage
_	nom mas pl	filoutages
$
filouterie	S.()
_	nom fem sg	filouterie
_	nom fem pl	filouteries
$
filsdeputerie	S.()
_	nom fem sg	filsdeputerie
_	nom fem pl	filsdeputeries
$
filtrable	S.()
_	adj epi sg	filtrable
_	adj epi pl	filtrables
$
filtrage	S.()
_	nom mas sg	filtrage
_	nom mas pl	filtrages
101000
101001
101002
101003
101004
101005
101006




101007
101008
101009
101010
101011
101012
101013
_	nom adj epi sg	foutraque
_	nom adj epi pl	foutraques
$
foutre	S.()
_	nom mas sg	foutre
_	nom mas pl	foutres
$




foutriquet	S.()
_	nom mas sg	foutriquet
_	nom mas pl	foutriquets
$
foutue	F.()
_	adj fem sg	foutue
_	adj fem pl	foutues







>
>
>
>







101107
101108
101109
101110
101111
101112
101113
101114
101115
101116
101117
101118
101119
101120
101121
101122
101123
101124
_	nom adj epi sg	foutraque
_	nom adj epi pl	foutraques
$
foutre	S.()
_	nom mas sg	foutre
_	nom mas pl	foutres
$
foutrerie	S.()
_	nom fem sg	foutrerie
_	nom fem pl	foutreries
$
foutriquet	S.()
_	nom mas sg	foutriquet
_	nom mas pl	foutriquets
$
foutue	F.()
_	adj fem sg	foutue
_	adj fem pl	foutues
113518
113519
113520
113521
113522
113523
113524




113525
113526
113527
113528
113529
113530
113531
_	nom mas sg	harakiri
_	nom mas pl	harakiris
$
hara-kiri	S.()
_	nom mas sg	hara-kiri
_	nom mas pl	hara-kiris
$




harangue	S.()
_	nom fem sg	harangue
_	nom fem pl	harangues
$
harangueuse	F.()
_	nom fem sg	harangueuse
_	nom fem pl	harangueuses







>
>
>
>







113629
113630
113631
113632
113633
113634
113635
113636
113637
113638
113639
113640
113641
113642
113643
113644
113645
113646
_	nom mas sg	harakiri
_	nom mas pl	harakiris
$
hara-kiri	S.()
_	nom mas sg	hara-kiri
_	nom mas pl	hara-kiris
$
haram	S.()
_	adj epi sg	haram
_	adj epi pl	harams
$
harangue	S.()
_	nom fem sg	harangue
_	nom fem pl	harangues
$
harangueuse	F.()
_	nom fem sg	harangueuse
_	nom fem pl	harangueuses
118115
118116
118117
118118
118119
118120
118121






118122
118123
118124
118125
118126
118127
118128
_	nom fem sg	huée
_	nom fem pl	huées
$
huerta	S.()
_	nom fem sg	huerta
_	nom fem pl	huertas
$






huguenote	F.()
_	nom adj fem sg	huguenote
_	nom adj fem pl	huguenotes
_	nom adj mas sg	huguenot
_	nom adj mas pl	huguenots
$
huilage	S*()







>
>
>
>
>
>







118230
118231
118232
118233
118234
118235
118236
118237
118238
118239
118240
118241
118242
118243
118244
118245
118246
118247
118248
118249
_	nom fem sg	huée
_	nom fem pl	huées
$
huerta	S.()
_	nom fem sg	huerta
_	nom fem pl	huertas
$
hugolienne	F*()
_	adj fem sg	hugolienne
_	adj fem pl	hugoliennes
_	adj mas sg	hugolien
_	adj mas pl	hugoliens
$
huguenote	F.()
_	nom adj fem sg	huguenote
_	nom adj fem pl	huguenotes
_	nom adj mas sg	huguenot
_	nom adj mas pl	huguenots
$
huilage	S*()
120044
120045
120046
120047
120048
120049
120050










120051
120052
120053
120054
120055
120056
120057
_	nom fem sg	hyperventilation
_	nom fem pl	hyperventilations
$
hypervigilance	S*()
_	nom fem sg	hypervigilance
_	nom fem pl	hypervigilances
$










hyperviscosité	S*()
_	nom fem sg	hyperviscosité
_	nom fem pl	hyperviscosités
$
hyperviseur	S*()
_	nom mas sg	hyperviseur
_	nom mas pl	hyperviseurs







>
>
>
>
>
>
>
>
>
>







120165
120166
120167
120168
120169
120170
120171
120172
120173
120174
120175
120176
120177
120178
120179
120180
120181
120182
120183
120184
120185
120186
120187
120188
_	nom fem sg	hyperventilation
_	nom fem pl	hyperventilations
$
hypervigilance	S*()
_	nom fem sg	hypervigilance
_	nom fem pl	hypervigilances
$
hyperviolence	S*()
_	nom fem sg	hyperviolence
_	nom fem pl	hyperviolences
$
hyperviolente	F*()
_	adj fem sg	hyperviolente
_	adj fem pl	hyperviolentes
_	adj mas sg	hyperviolent
_	adj mas pl	hyperviolents
$
hyperviscosité	S*()
_	nom fem sg	hyperviscosité
_	nom fem pl	hyperviscosités
$
hyperviseur	S*()
_	nom mas sg	hyperviseur
_	nom mas pl	hyperviseurs
122402
122403
122404
122405
122406
122407
122408




122409
122410
122411
122412
122413
122414
122415
_	adj mas sg	impartial
_	adj mas pl	impartiaux
$
impartialité	S*()
_	nom fem sg	impartialité
_	nom fem pl	impartialités
$




impasse	S*()
_	nom fem sg	impasse
_	nom fem pl	impasses
$
impassibilité	S*()
_	nom fem sg	impassibilité
_	nom fem pl	impassibilités







>
>
>
>







122533
122534
122535
122536
122537
122538
122539
122540
122541
122542
122543
122544
122545
122546
122547
122548
122549
122550
_	adj mas sg	impartial
_	adj mas pl	impartiaux
$
impartialité	S*()
_	nom fem sg	impartialité
_	nom fem pl	impartialités
$
impassable	S*()
_	adj epi sg	impassable
_	adj epi pl	impassables
$
impasse	S*()
_	nom fem sg	impasse
_	nom fem pl	impasses
$
impassibilité	S*()
_	nom fem sg	impassibilité
_	nom fem pl	impassibilités
133612
133613
133614
133615
133616
133617
133618




133619
133620
133621
133622
133623
133624
133625
_	nom adj epi sg	jihadiste
_	nom adj epi pl	jihadistes
$
jingle	S.()
_	nom mas sg	jingle
_	nom mas pl	jingles
$




jiujitsu	S.()
_	nom mas sg	jiujitsu
_	nom mas pl	jiujitsus
$
joaillère	F.()
_	nom adj fem sg	joaillère
_	nom adj fem pl	joaillères







>
>
>
>







133747
133748
133749
133750
133751
133752
133753
133754
133755
133756
133757
133758
133759
133760
133761
133762
133763
133764
_	nom adj epi sg	jihadiste
_	nom adj epi pl	jihadistes
$
jingle	S.()
_	nom mas sg	jingle
_	nom mas pl	jingles
$
jinn	S.()
_	nom mas sg	jinn
_	nom mas pl	jinns
$
jiujitsu	S.()
_	nom mas sg	jiujitsu
_	nom mas pl	jiujitsus
$
joaillère	F.()
_	nom adj fem sg	joaillère
_	nom adj fem pl	joaillères
134673
134674
134675
134676
134677
134678
134679




134680
134681
134682
134683
134684
134685
134686
_	nom adj epi sg	kachoube
_	nom adj epi pl	kachoubes
$
kaddish	S.()
_	nom mas sg	kaddish
_	nom mas pl	kaddishs
$




kafir	S.()
_	nom adj epi sg	kafir
_	nom adj epi pl	kafirs
$
kafkaïenne	F.()
_	adj fem sg	kafkaïenne
_	adj fem pl	kafkaïennes







>
>
>
>







134812
134813
134814
134815
134816
134817
134818
134819
134820
134821
134822
134823
134824
134825
134826
134827
134828
134829
_	nom adj epi sg	kachoube
_	nom adj epi pl	kachoubes
$
kaddish	S.()
_	nom mas sg	kaddish
_	nom mas pl	kaddishs
$
kadi	S.()
_	nom mas sg	kadi
_	nom mas pl	kadis
$
kafir	S.()
_	nom adj epi sg	kafir
_	nom adj epi pl	kafirs
$
kafkaïenne	F.()
_	adj fem sg	kafkaïenne
_	adj fem pl	kafkaïennes
158049
158050
158051
158052
158053
158054
158055




158056
158057
158058
158059
158060
158061
158062
_	adj mas sg	multidirectionnel
_	adj mas pl	multidirectionnels
$
multidisciplinaire	S.()
_	adj epi sg	multidisciplinaire
_	adj epi pl	multidisciplinaires
$




multiethnique	S.()
_	adj epi sg	multiethnique
_	adj epi pl	multiethniques
$
multi-ethnique	S.()
_	adj epi sg	multi-ethnique
_	adj epi pl	multi-ethniques







>
>
>
>







158192
158193
158194
158195
158196
158197
158198
158199
158200
158201
158202
158203
158204
158205
158206
158207
158208
158209
_	adj mas sg	multidirectionnel
_	adj mas pl	multidirectionnels
$
multidisciplinaire	S.()
_	adj epi sg	multidisciplinaire
_	adj epi pl	multidisciplinaires
$
multidisciplinarité	S.()
_	nom fem sg	multidisciplinarité
_	nom fem pl	multidisciplinarités
$
multiethnique	S.()
_	adj epi sg	multiethnique
_	adj epi pl	multiethniques
$
multi-ethnique	S.()
_	adj epi sg	multi-ethnique
_	adj epi pl	multi-ethniques
167051
167052
167053
167054
167055
167056
167057
167058
167059
167060
167061
167062
167063
167064
167065
167066
167067
167068
167069
167070
167071
167072
_	nom mas sg	oligodendrogliome
_	nom mas pl	oligodendrogliomes
$
oligoélément	S*()
_	nom mas sg	oligoélément
_	nom mas pl	oligoéléments
$
oligoélément	S*()
_	nom mas sg	oligoélément
_	nom mas pl	oligoéléments
$
oligo-élément	S*()
_	nom mas sg	oligo-élément
_	nom mas pl	oligo-éléments
$
oligo-élément	S*()
_	nom mas sg	oligo-élément
_	nom mas pl	oligo-éléments
$
oligogalacturonate	S*()
_	nom mas sg	oligogalacturonate
_	nom mas pl	oligogalacturonates







<
<
<
<
<
<
<
<







167198
167199
167200
167201
167202
167203
167204








167205
167206
167207
167208
167209
167210
167211
_	nom mas sg	oligodendrogliome
_	nom mas pl	oligodendrogliomes
$
oligoélément	S*()
_	nom mas sg	oligoélément
_	nom mas pl	oligoéléments
$








oligo-élément	S*()
_	nom mas sg	oligo-élément
_	nom mas pl	oligo-éléments
$
oligogalacturonate	S*()
_	nom mas sg	oligogalacturonate
_	nom mas pl	oligogalacturonates
183952
183953
183954
183955
183956
183957
183958




183959
183960
183961
183962
183963
183964
183965
_	nom mas sg	placage
_	nom mas pl	placages
$
placard	S.()
_	nom mas sg	placard
_	nom mas pl	placards
$




placardisation	S.()
_	nom fem sg	placardisation
_	nom fem pl	placardisations
$
place	S.()
_	nom fem sg	place
_	nom fem pl	places







>
>
>
>







184091
184092
184093
184094
184095
184096
184097
184098
184099
184100
184101
184102
184103
184104
184105
184106
184107
184108
_	nom mas sg	placage
_	nom mas pl	placages
$
placard	S.()
_	nom mas sg	placard
_	nom mas pl	placards
$
placardage	S.()
_	nom mas sg	placardage
_	nom mas pl	placardages
$
placardisation	S.()
_	nom fem sg	placardisation
_	nom fem pl	placardisations
$
place	S.()
_	nom fem sg	place
_	nom fem pl	places
184786
184787
184788
184789
184790
184791
184792




184793
184794
184795
184796
184797
184798
184799
_	adj epi sg	plausible
_	adj epi pl	plausibles
$
playback	S.()
_	nom mas sg	playback
_	nom mas pl	playbacks
$




playboy	S.()
_	nom mas sg	playboy
_	nom mas pl	playboys
$
play-boy	S.()
_	nom mas sg	play-boy
_	nom mas pl	play-boys







>
>
>
>







184929
184930
184931
184932
184933
184934
184935
184936
184937
184938
184939
184940
184941
184942
184943
184944
184945
184946
_	adj epi sg	plausible
_	adj epi pl	plausibles
$
playback	S.()
_	nom mas sg	playback
_	nom mas pl	playbacks
$
play-back	S.()
_	nom mas sg	play-back
_	nom mas pl	play-backs
$
playboy	S.()
_	nom mas sg	playboy
_	nom mas pl	playboys
$
play-boy	S.()
_	nom mas sg	play-boy
_	nom mas pl	play-boys
185290
185291
185292
185293
185294
185295
185296




185297
185298
185299
185300
185301
185302
185303
_	adj fem pl	plucheuses
_	adj mas inv	plucheux
$
plugin	S.()
_	nom mas sg	plugin
_	nom mas pl	plugins
$




pluie	S.()
_	nom fem sg	pluie
_	nom fem pl	pluies
$
plumage	S.()
_	nom mas sg	plumage
_	nom mas pl	plumages







>
>
>
>







185437
185438
185439
185440
185441
185442
185443
185444
185445
185446
185447
185448
185449
185450
185451
185452
185453
185454
_	adj fem pl	plucheuses
_	adj mas inv	plucheux
$
plugin	S.()
_	nom mas sg	plugin
_	nom mas pl	plugins
$
plug-in	S.()
_	nom mas sg	plug-in
_	nom mas pl	plug-ins
$
pluie	S.()
_	nom fem sg	pluie
_	nom fem pl	pluies
$
plumage	S.()
_	nom mas sg	plumage
_	nom mas pl	plumages
186847
186848
186849
186850
186851
186852
186853




186854
186855
186856
186857
186858
186859
186860
_	adj epi sg	polychrome
_	adj epi pl	polychromes
$
polychromie	S.()
_	nom fem sg	polychromie
_	nom fem pl	polychromies
$




polycistronique	S.()
_	adj epi sg	polycistronique
_	adj epi pl	polycistroniques
$
polyclinique	S.()
_	nom fem sg	polyclinique
_	nom fem pl	polycliniques







>
>
>
>







186998
186999
187000
187001
187002
187003
187004
187005
187006
187007
187008
187009
187010
187011
187012
187013
187014
187015
_	adj epi sg	polychrome
_	adj epi pl	polychromes
$
polychromie	S.()
_	nom fem sg	polychromie
_	nom fem pl	polychromies
$
polychromique	S.()
_	adj epi sg	polychromique
_	adj epi pl	polychromiques
$
polycistronique	S.()
_	adj epi sg	polycistronique
_	adj epi pl	polycistroniques
$
polyclinique	S.()
_	nom fem sg	polyclinique
_	nom fem pl	polycliniques
187938
187939
187940
187941
187942
187943
187944




187945
187946
187947
187948
187949
187950
187951
_	nom fem sg	popote
_	nom fem pl	popotes
$
popotin	S.()
_	nom mas sg	popotin
_	nom mas pl	popotins
$




populace	S.()
_	nom fem sg	populace
_	nom fem pl	populaces
$
populacière	F.()
_	adj fem sg	populacière
_	adj fem pl	populacières







>
>
>
>







188093
188094
188095
188096
188097
188098
188099
188100
188101
188102
188103
188104
188105
188106
188107
188108
188109
188110
_	nom fem sg	popote
_	nom fem pl	popotes
$
popotin	S.()
_	nom mas sg	popotin
_	nom mas pl	popotins
$
popstar	S.()
_	nom fem sg	popstar
_	nom fem pl	popstars
$
populace	S.()
_	nom fem sg	populace
_	nom fem pl	populaces
$
populacière	F.()
_	adj fem sg	populacière
_	adj fem pl	populacières
189481
189482
189483
189484
189485
189486
189487
189488


189489
189490
189491
189492
189493
189494
189495
189496
189497
189498
189499
189500
189501
189502
_	nom mas sg	poulbot
_	nom mas pl	poulbots
$
poule	S.()
_	nom fem sg	poule
_	nom fem pl	poules
$
poulet	S.()


_	nom mas sg	poulet
_	nom mas pl	poulets
$
poulette	S.()
_	nom fem sg	poulette
_	nom fem pl	poulettes
$
pouliage	S.()
_	nom mas sg	pouliage
_	nom mas pl	pouliages
$
pouliche	S.()
_	nom fem sg	pouliche
_	nom fem pl	pouliches







|
>
>



<
<
<
<







189640
189641
189642
189643
189644
189645
189646
189647
189648
189649
189650
189651
189652




189653
189654
189655
189656
189657
189658
189659
_	nom mas sg	poulbot
_	nom mas pl	poulbots
$
poule	S.()
_	nom fem sg	poule
_	nom fem pl	poules
$
poulette	F.()
_	nom fem sg	poulette
_	nom fem pl	poulettes
_	nom mas sg	poulet
_	nom mas pl	poulets
$




pouliage	S.()
_	nom mas sg	pouliage
_	nom mas pl	pouliages
$
pouliche	S.()
_	nom fem sg	pouliche
_	nom fem pl	pouliches
196542
196543
196544
196545
196546
196547
196548




196549
196550
196551
196552
196553
196554
196555
_	adj fem pl	pustuleuses
_	adj mas inv	pustuleux
$
putain	S.()
_	nom fem sg	putain
_	nom fem pl	putains
$




putassière	F.()
_	adj fem sg	putassière
_	adj fem pl	putassières
_	adj mas sg	putassier
_	adj mas pl	putassiers
$
putative	F.()







>
>
>
>







196699
196700
196701
196702
196703
196704
196705
196706
196707
196708
196709
196710
196711
196712
196713
196714
196715
196716
_	adj fem pl	pustuleuses
_	adj mas inv	pustuleux
$
putain	S.()
_	nom fem sg	putain
_	nom fem pl	putains
$
putasserie	S.()
_	nom fem sg	putasserie
_	nom fem pl	putasseries
$
putassière	F.()
_	adj fem sg	putassière
_	adj fem pl	putassières
_	adj mas sg	putassier
_	adj mas pl	putassiers
$
putative	F.()
214603
214604
214605
214606
214607
214608
214609




214610
214611
214612
214613
214614
214615
214616
_	nom fem sg	scélératesse
_	nom fem pl	scélératesses
$
scellage	S.()
_	nom mas sg	scellage
_	nom mas pl	scellages
$




scellement	S.()
_	nom mas sg	scellement
_	nom mas pl	scellements
$
scénarimage	S.()
_	nom mas sg	scénarimage
_	nom mas pl	scénarimages







>
>
>
>







214764
214765
214766
214767
214768
214769
214770
214771
214772
214773
214774
214775
214776
214777
214778
214779
214780
214781
_	nom fem sg	scélératesse
_	nom fem pl	scélératesses
$
scellage	S.()
_	nom mas sg	scellage
_	nom mas pl	scellages
$
scellé	S.()
_	nom mas sg	scellé
_	nom mas pl	scellés
$
scellement	S.()
_	nom mas sg	scellement
_	nom mas pl	scellements
$
scénarimage	S.()
_	nom mas sg	scénarimage
_	nom mas pl	scénarimages
231023
231024
231025
231026
231027
231028
231029





231030
231031
231032
231033
231034
231035
231036
_	nom fem sg	syringe
_	nom fem pl	syringes
$
syringomyélie	S.()
_	nom fem sg	syringomyélie
_	nom fem pl	syringomyélies
$





syrphe	S.()
_	nom mas sg	syrphe
_	nom mas pl	syrphes
$
sysadmin	S.()
_	nom epi sg	sysadmin
_	nom epi pl	sysadmins







>
>
>
>
>







231188
231189
231190
231191
231192
231193
231194
231195
231196
231197
231198
231199
231200
231201
231202
231203
231204
231205
231206
_	nom fem sg	syringe
_	nom fem pl	syringes
$
syringomyélie	S.()
_	nom fem sg	syringomyélie
_	nom fem pl	syringomyélies
$
syro-libanaise	F.()
_	nom adj fem sg	syro-libanaise
_	nom adj fem pl	syro-libanaises
_	nom adj mas inv	syro-libanais
$
syrphe	S.()
_	nom mas sg	syrphe
_	nom mas pl	syrphes
$
sysadmin	S.()
_	nom epi sg	sysadmin
_	nom epi pl	sysadmins
231716
231717
231718
231719
231720
231721
231722






231723
231724
231725
231726
231727
231728
231729
$
talibane	F.()
_	nom adj fem sg	talibane
_	nom adj fem pl	talibanes
_	nom adj mas sg	taliban
_	nom adj mas pl	talibans
$






talion	S.()
_	nom mas sg	talion
_	nom mas pl	talions
$
talisman	S.()
_	nom mas sg	talisman
_	nom mas pl	talismans







>
>
>
>
>
>







231886
231887
231888
231889
231890
231891
231892
231893
231894
231895
231896
231897
231898
231899
231900
231901
231902
231903
231904
231905
$
talibane	F.()
_	nom adj fem sg	talibane
_	nom adj fem pl	talibanes
_	nom adj mas sg	taliban
_	nom adj mas pl	talibans
$
talibée	F.()
_	nom fem sg	talibée
_	nom fem pl	talibées
_	nom mas sg	talibé
_	nom mas pl	talibés
$
talion	S.()
_	nom mas sg	talion
_	nom mas pl	talions
$
talisman	S.()
_	nom mas sg	talisman
_	nom mas pl	talismans
249640
249641
249642
249643
249644
249645
249646




249647
249648
249649
249650
249651
249652
249653
_	nom mas sg	vibrion
_	nom mas pl	vibrions
$
vibrisse	S.()
_	nom fem sg	vibrisse
_	nom fem pl	vibrisses
$




vibromasseur	S.()
_	nom mas sg	vibromasseur
_	nom mas pl	vibromasseurs
$
vicaire	S.()
_	nom mas sg	vicaire
_	nom mas pl	vicaires







>
>
>
>







249816
249817
249818
249819
249820
249821
249822
249823
249824
249825
249826
249827
249828
249829
249830
249831
249832
249833
_	nom mas sg	vibrion
_	nom mas pl	vibrions
$
vibrisse	S.()
_	nom fem sg	vibrisse
_	nom fem pl	vibrisses
$
vibro	S.()
_	nom mas sg	vibro
_	nom mas pl	vibros
$
vibromasseur	S.()
_	nom mas sg	vibromasseur
_	nom mas pl	vibromasseurs
$
vicaire	S.()
_	nom mas sg	vicaire
_	nom mas pl	vicaires

Modified gc_lang/fr/data/phonet_simil.txt from [8905288c4c] to [acd30a4cca].

1
2









3
4

5



6




7

8



9
10
11
12



13




14

15

16

17
18


19


20
21
22
23
24
25
26
27
28
29
30
31



32
33
34

35

36

37
38
39

40


41
42
43


44
45



46





47
48
49



50

51
52
53
54
55
56
57
58
59

60






61
62
63

64
65
66
67
68

69

70
71

72


73
74



75
76
77
78

79
80
81

82

83



84
85

86

87
88

89

90

91
92
93
94





95
96
97
98
99

100
101

102
103
104
105
106



107
108
109



110
111

112
113
114
115

116
117
118
119
120
121




122
123
124
125

126
127

128
129





130
131

132





133
134
135

136


137
138

139
140

141

142

143
144

145
146

147

148


149


150

151

152
153



154
155
156



157
158
159

160
161
162
163

164
165
166
167
168

169
170
171




172

173
174
175

176
177
178
179
180

181
182
183
184
185


186
187

188

189
190
191
192

193

194
195


196
197

198
199
200

201
202
203
204

205


206
207
208
209
210
211
212
213

214
215
216



217
218
219


220

221
222
223
224
225
226
227
228
229
230




231
232
233
234

235
236

237

238

239
240
241
242
243
244

245
246
247

248

249
250


251

252
253


254
255
256
257

258
259

260

261
262


263

264
265

266
267
268
269
270
271
272
273

274
275

276

277
278


279





280
281

282
283
284





285

286

287
288
289
290
291
292
293

294
295
296
297
298

299
300


301


302

303
304
305
306
307

308
309


310

311


312
313
314
315
316
317
318
319
320
321
322
323
324

325
326
327



328
329
330
331

332
333
334
335




336

337
338
339
340


341
342
343


344
345

346

347
348
349
350
351
352

353
354
355
356
357
358


359


360
361
362
363
364
365
366
367
368
369

370
371
372
373

374


375


376
377

378


379
380

381
382
383
384
385


386



387
388
389



390





391

392
393
394


395
396
397


398
399
400
401


402
403
404







405


406
407

408
409
410

411
412
413
414
415
416
417
418
419

420

421
422
423
424
425





426


427

428


429

430
431



432

433
434



435
436
437
438
439


440


441
442
443

444
445


446
447

448
449
450
451
452

453
454


455

456
457

458
459
460
461
462
463
464

465
466
467

468
469
470


471
472

473
474
475
476
477
478
479
480
481
482
483
484
485
486

487
488
489
490
491
492

493




















































































































494
495
496
497
498
499
500
# Homophonies










a as à ha ah
abaisse abaisses abaissent abbesse abbesses

abord abord abhorre abhorres abhorrent



accueil accueils accueille accueilles accueillent




acre acres âcre âcres

adhérant adhérent adhérents



ai ait aie aies aient ais hé eh es haie haies hais est et
air airs aire aires ère ères hère hères erre erres errent ers haire haires
ail aille ailles aillent aïe
aile ailes elle elles



aller allers allée allées allé allés allez allais allait allaient




amen amène amènes amènent

an ans en

antre antres entre entres entrent

appareil appareils appareille appareilles appareillent
appel appels appelle appelles appellent


appui appuis appuie appuies appuient


archée archées archer archers archet archets
arête arêtes arrête arrêtes arrêtent
assassinat assassinats assassina assassinas assassinât
assignat assignats assigna assignas assignât
assimilat assimilats assimila assimilas assimilât
atèle atèles attelle attelles attellent
attentat attentats attenta attentas attentât
attribut attributs attribue attribues attribuent
au aux ô eau eaux haut hauts
auteur auteurs auteure auteures hauteur hauteurs
avait avais avaient avez avé
aval avals avale avales avalent



bail baille bailles baillent bâille bâilles bâillent bâillent baye bayes bayent
bâillon bâillons baillons bayons
bal bals balle balles

balai balais balaie balaies balaient ballet ballets

bar bars barre barres barrent bard bards

bas bât bâts bah
bassinet bassinets bassiner bassinais bassinait bassinaient bassinez
basilic basilics basilique basiliques

beau beaux baux


beur beurs beurre beurre beurrent
bit bits bite bites bitent bitte bittes bittent
bloc blocs bloque bloques bloquent


bois boit
boîte boîtes boite boite boitent



boss bosse bosses bossent





bourg bourgs bourre bourres bourrent
bous boue boues bout bouts
box boxe boxes boxent



bric brick bricks brique briques briquent

bure bures burent
but buts bute butes butent butte buttes buttent bûtes
cal cals cale cales calent
calcul calculs calcule calcules calculent
camouflet camouflets camoufler camouflais camouflaient camouflez
camp camps quand quant khan khans
cap caps cape capes
cache caches cachent cash
cachet cachets cacher cachais cachait cachaient cachez

cadran cadrans cadrant






caret carets carré carrés carrais carrait carraient carrez
carné carnée carnés carnées carnet carnets
carte cartes cartent kart karts

ce se
céleri céleris sellerie selleries
celle celles sel sels selle selles sellent cèle cèles cèlent scelle scelles scellent
cendre cendres sandre sandres
cène saine saines scène scènes senne sennes sen Seine

centon centons santon santons sentons

cerf cerfs serre serres serrent sers sert serf serfs
ces ses sais sait

cet cette sept set sets


chant chants champ champs
chaud chauds chaux show shows chaut



chic chics chique chiques chiquent
choc chocs choque choques choquent
choix choie choies choient
choral chorals chorale chorales corral corrals

ci si scie scies scient six sis
cilice cilices silice silices
cire cires cirent sire sires cirre cirres cirrhe cirrhes

cite cites citent site sites scythe scythes

clair clairs claire claires clerc clercs



clic clics clique cliques cliquent
cliquet cliquets cliquer cliquais cliquait cliquaient cliquez

coffret coffrets coffrer coffrais coffrait coffraient coffrez

coïncidant coïncident coïncidents
col cols colle colles collent khôl khôls

collet collets coller collais collait collaient collez

combinat combinats combina combinas combinât

comité comités commiter commitais commitait commitaient commitez
commis commit commits commite commites commitent
communicant communicants communiquant
complet complets complais complait complaît





connexion connexions connections
conseil conseils conseille conseilles conseillent
conseiller conseillers conseiller conseillais conseillait conseillaient conseillez
consonne consonnes consone consones consonent
contact contacts contacte contactes contactent

conte contes content compte comptes comptent comte comtes
continu continus continue continues continuent

convaincant convaincants convainquant
convergeant convergent convergents
convoi convois convoie convoies convoient
cool cools coule coules coulent
coq coqs coque coques coke cokes



cote cotes cotent côte côtes cotte cottes
coter coté cotais cotait cotaient côté côtés
cou cous coût coûts coup coups coud couds



couplet couplets coupler couplais couplait couplaient couplez
cour cours court courts coure coures courent courre

crachat crachats cracha crachas crachât
crack cracks craque craques craquent krak kraks crac
créer créé créés créée créées crée crées créent créais créait créaient créez
crème crèmes chrême chrêmes

creuset creusets creuser creusais creusait creusaient creusez
cri cris crie cries crient
cric crics crique criques criquent
criquet criquets criquer criquais criquait criquaient criquez
crochet crochets crocher crochais crochait crochaient crochez
crois croit croient croîs croît croix




cuir cuirs cuire
cumul cumuls cumule cumules cumulent
cumulet cumulets cumuler cumulais cumulait cumulaient cumulez
cygne cygnes signe signes signent

dans dent dents
danse danses dansent dense denses

dé dés dès dais des
deal deals deale deales dealent





défi défis défie défies défient
dégel dégels dégèle dégèles dégèlent

délégant délégants déléguant





dépens dépends dépend
desceller déceler desseller
désir désirs désire désires désirent

détail détails détaille détailles détaillent


diagnostic diagnostics diagnostique diagnostiques diagnostiquent
différant différent différents

dîne dînes dînent dyne dynes
dis dit dît dix

discussion discussions discutions

divergeant divergent divergents

doigt doigts dois doit
don dons dont

doublet doublets doubler doublais doublait doublaient doublez
du dû dus due dues

dialysat dialysats dialysa dialysas dialysât

éclair éclairs éclaire éclaires éclairent


égal égale égales


éjaculat éjaculats éjacula éjaculas éjaculât

élisais élisait élisaient élisez Élysée Élysées

emploi emplois emploie emploies emploient
empreinte empreintes emprunte empruntes empruntent



ennui ennuis ennuie ennuies ennuient
entretien entretiens entretient
entrée entrées entrer entrais entrait entrez entraient



envoi envois envoie envoies envoient
envol envols envole envoles envolent
épais épée épées

équivalant équivalent équivalents
errâmes Éram
essai essais essaie essaies essaient essaye essayes essayent
essor essors essore essores essorent

étai étais était étaient été étés
étain étains éteint éteins
étal étals étale étales étalent
étang étangs étant étends étend
être êtres hêtre hêtres

eusse eusses eussent us
éveil éveils éveille éveilles éveillent
excellant excellent excellents




exsudat exsudats exsuda exsudas exsudât

extravagant extravagants extravaguant
fabriquant fabricant fabricants
face faces fasse fasses fassent fasce fasces

faire fer fers ferre ferres ferrent
faisan faisans faisant
fait faits fée fées
far fard fards phare phares
fatigant fatigants fatiguant

fausse fausses faussent fosses fosses
fausset faussets fossé fossés fausser faussais faussait faussaient faussez
faux faut
faîte faîtes fait faits faite faites fête fêtes fêtent
fèces fesse fesses fessent


feuillet feuillets feuillée feuillées
fi fis fit fît

fief fiefs fieffe fieffes fieffent

fil fils file files filent
filet filets filer filais filait filaient filez
film films filme filmes filment
filtrat filtrats filtra filtras filtrât

fin fins faim faims feins feint

flair flairs flaire flaires flairent
flan flan flanc flancs


flic flics flique fliques fliquent
flou flous floue floues flouent

foi fois foie foies
font fonts fond fonds
forçat forçats força forças forçât

foret forets forer forais forait foraient forêt forêts
format formats forma formas formât
fort forts for fore fores forent fors
fou fous fout

four fours fourre fourres fourrent


fumée fumées fumet fumets fumer fumais fumait fumaient fumez
fus fut fût
futé futés futée futées futaie futaies
gal gals gale gales galle galles
gang gangs gangue gangues
garantie garanties garantis garantit
gaule gaules goal goals
gai gais gaie gaies gay gays gué gués guet guets

gaz gaze gazes gazent
gel gels gèle gèles gèlent
gène gènes gêne gênes gênent



golf golfs golfe golfes golfent
gosse gosses gausse gausses gaussent gauss Gauss
goulet goulets goulée goulées


gré grès

guère guerre guerres
hâle hâles halle halles hall halls
haltère haltères altère altères altèrent
harde hardes arde ardes ardent
hausse hausses haussent os
haute hautes hôte hôtes hotte hotte ôte ôtes ôtent
héro héros héraut hérauts
heur heure heures heurt heurts
hochet hochets hocher hochais hochait hochaient hochez
homme hommes ohm ohms heaume heaumes




hydrolysat hydrolysats hydrolysa hydrolysas hydrolysât
hyène hyènes yen yens
i y
il ils île îles

incarnat incarnats incarna incarnas incarnât
indic indics indique indiques indiquent

infiltrat infiltrats infiltra infiltras infiltrât

institut instituts institue institues instituent

internat internats interna internas internât
intriguant intrigant intrigants
jar jars jard jards jarre jarres
jardinet jardinets jardiner jardinais jardinait jardinaient jardinez
jet jets jette jettes jettent
jeune jeunes jeûne jeûnes jeûnent

joue joues jouent joug jougs
jouer jouais jouait jouaient jouet jouets jouez
kermès kermesse kermesses

la là las

lac lacs laque laques laquent
lacet lacets lacer laçais laçait laçaient lacez lasser lassais lassait lassaient lassez


laîche laîches laiche laîches lèche lèches lèchent

legs lègue lègues lèguent
les laid laids lait laits laie laies lai


levée levées lever levers levais levait levaient levez
lieu lieux lieue lieues
lice lices lisse lisses lissent lys
lis lit lits lie lies lient

lire lires lyre lyres
livret livrets livrer livrais livrait livraient livrez

loch lochs loque loques

loir loirs Loir Loire
loup loups loue loues louent


luth luths luttes luttes luttent lut lute lutes lutent

lyophilisat lyophilisats lyophilisa lyophilisas lyophilisât
ma mas mât mâts

macro macros maquereau maquereaux
magazine magazines magasine magasines magasinent
mai mais mes met mets
main mains maint maints
maintien maintiens maintient
maire maires mer mers mère mères
maison maisons méson mésons
maître maîtres mètre mètres mettre

mal mâle mâles malle malles
mante mantes mente mentes mentent menthe menthes

marais marée marées marrais marrait marraient

marché marchés marcher marchais marchait marchez marchaient
mare mares marre marres marrent marc marcs


mark marks marque marques marquent





mec mecs Mecque
mél mêle mêles mêlent

mess messe messes
meurs meurt mœurs
mi mie mies mis mit mît





mir mirs mire mires mirent myrrhe myrrhes

mite mites mythe mythes

mol mols mole moles molle molles môle môles
mon mont monts
monitorat monitorats monitora monitoras monitorât
mort morts mors mords mord maure maures
mot mots maux
moi mois
mou mous moult moût moûts mouds moud moue moues

mur murs mûr mûrs mûre mûres mure mures murent
muret murets murer murais murait muraient murez
mu mus mû mue mues muent
nais nait nez
navigant navigants naviguant

négligeant négligent négligents
ni nid nids nie nies nient


noix noie noies noient


notre nôtre nôtres

nous noue noues nouent
nui nuis nuit nuits
octroi octrois octroie octroies octroient
œil œils œille œilles œillent
œillet œillets œiller

on ont
or ors hors


ou où houx houe houes hou

oubli oublis oublie oublies oublient


pain pains pin pins peins peint
pair pairs paire paires père pères perds perd pers
paix pet pets paie paies paient
pal pals pale pales pâle pâles
palier paliers pallier palliais palliait palliez palliaient
pan pans pend pends
panse panses pansent pense penses pensent
pansé pansés pansée pansées pensé pensés pensée pensées penser pensais pensait pensaient pensez pansais pensez pansait pansaient
par part parts par pare pares parent pars
parait paraît parais parer parez
parant parent parents
parc parcs parque parques parquent Parque Parques
parquet parquets parquer parquais parquait parquaient parquez

pari paris parie paries parient Paris
parquet parquets parquer parquais parquait parquaient parquez
parti partis partit partie parties



pause pauses pose poses posent
peau peaux pot pots Po Pau
pêche pêches pèche pèches pèchent
péché péchés pêcher pêchers péchais péchait péchaient pêchais pêchait pêchaient

peine peines peinent penne pennes pêne pênes
pèle pèles pèlent pelle pelles pellent
pellet pellets peler pelait pelais pelaient peller pellait pellais pellaient
pensionnat pensionnats pensionna pensionnas pensionnât




peu peux peut

pic pics pique piques piquent
pinson pinsons pinçons
piquer piquais piquait piquaient piqué piqués piquée piquées piquet piquets
pissat pissats pissa pissas pissât


plagiat plagiats plagia plagias plagiât
plaid plaids plaide plaides plaident
plain plains plaint plaints plein pleins


plais plaît plaie plaies
plan plans plant plants

pli plis plie plies plient

police polices policent polisse polisses polissent
poêle poêles poil poils
poignée poignées poignet poignets
poids pois poix pouah
point points poing poings
polissoir polissoirs polissoire polissoires

porc porcs port ports pore pores
pool pools poule poules
post poste postes postent
pou poux pouls
pouf poufs pouffe pouffes pouffent
pouce pouces pousse pousses poussent


précédant précédent précédents


prêt prêts près pré prés
primat primats prima primas primât
prix pris prit prît prie pries prient
profil profils profile profiles profilent
pronostic pronostics pronostique pronostiques pronostiquent
provoc provocs provoque provoques provoquent
provocant provocants provoquant
pu pue pues pus put
puce puces pucent pusse pusses pussent
puis puits

quadruplet quadruplets quadrupler quadruplais quadruplait quadruplaient quadruplez
quintuplet quintuplets quintupler quintuplais quintuplait quintuplaient quintuplez
rappel rappels rappelle rappelles rappellent
racket rackets raquette raquettes rackette rackettes rackettent

raffinat raffinats raffina raffinas raffinât


rail rails raille railles raillent raye rayes rayent


RAM rame rames rament
rauque rauques roc rocs roque roques roquent

recel recels recèle recèles recèlent


recueil recueils recueille recueilles recueillent
recul reculs recule recules reculent

régal régals régale régale régalent
reine reines renne rennes rêne rênes
relai relais relaye relayes relayent
remblai remblais remblaie remblaies remblaient
renvoi renvois renvoie renvoies renvoient


ressenti ressentis ressentit



restaurant restaurants restaurent
résultat résultats résulta résultât
réveil réveils réveille réveilles réveillent



ris rit rient rie ries riz





roue roues rouent roux

sac sacs saque saques saquent
sachet sachets sachez
sacret sacrets sacré sacrés sacrée sacrées sacrer sacrais sacrait sacraient sacrez


salariat salariats salaria salarias salariât
sale sales salent salles salles
salut saluts salue salues saluent


sang sangs sans cent cents sens sent cens
saoul saouls saoule saoules saoulent soûl soûls soûle soûles soûlent soul souls soule soules soulent
saké sakés saquer saquais saquait saquaient saquez
satire satires satyre satyres


saut sauts sot sots sceau sceaux seau seaux
saute sautes sautent sotte sottes
savon savons







sein seins saint saints sain sains ceins ceint ceints


ses ces sais sait
shoot shoots shoote shootes shootent

sifflet sifflets siffler sifflais sifflait sifflaient sifflez
signal signale signales signalent
signet signets signer signais signait signaient signez

soi soie soies soit sois soient
sol sols sole soles saule saules
somme sommes somment
sommeil sommeils sommeille sommeilles sommeillent
sommet sommets sommer sommais sommait sommaient sommez
son sons sont
sonnet sonnets sonner sonnais sonnait sonnaient sonnez
sors sort sorts
sortie sorties sortis sortit

souci soucis soucie soucies soucient

soupir soupirs soupire soupires soupirent
soutien soutiens soutient
soufflet soufflets soufflé soufflés souffler soufflais soufflait soufflaient soufflez
soufre soufres souffre souffres souffrent
souk souks souque souques souquent





stress stresse stresses stressent


substitut substituts substitue substitues substituent

sui suis suit suie suies


su sus sue sues suent

survie survies survis survit
survol survols survole survoles survolent



ta tas

taie taies tes thé thés
tain teint teints thym thyms tin tins tint teins



tant temps tends tend
tante tantes tente tentes tentent
tapir tapirs tapirent
tapis tapit tapît
tare tares tard


teinte teintes teintent tinte tintes tintent


test tests teste testes testent
tête têtes tète tètes tètent
tic tics tique tiques tiquent

tir tirs tire tires tirent
tien tiens tient


toc toque toques toquent
toi toit toits

ton tons thon thons tond tonds
tort torts tore tores taure taures tord tords tors
tournoi tournois tournoie tournoies tournoient
tout toux
tous tousse tousses toussent

trafic trafics trafique trafiques trafiquent
tram trams trame trames trament


travail travaille travailles travaillent

treuil treuils treuille treuilles treuillent
tri tris trie tries trient

triplet triplets tripler triplais triplait triplaient triplez
troc trocs troque troques troquent
troquet troquets troquer troquais troquait troquaient troquez
troll trolls trolle trolles trollent
troller trolley trolleys trollais trollait trollaient trollez
trou trous troue troues trouent
truc trucs truque truques truquent

tu tus tue tues tuent
tutorat tutorats tutora tutoras tutorât
usa usas USA

vacant vacants vaquant
vais vé vés
vain vains vin vins vint vingt vaincs vainc


val vals valent
valet valets valais valait valaient valez vallée vallées

vaux vaut vau veau veaux vos
vent vents vend vends van vans
ver vers verre verres vert verts vair
verrat verrats verra verras
verset versets verser versais versait versaient versez
veule veules veulent
veux veut vœu vœux
vil vils vile viles ville villes
vie vies vis vit
vis vice vices visse visses vissent
viol viols viole violes violent
violant violent violents
violat violats viola violas violât
violet violets violer violais violait violaient violez violé violés violée violées

voix voie voies voient vois voit
voir voire
vol vols vole voles volent
volet volets voler volais volait volaient volez
vomi vomis vomit
vous voue voues vouent

zigzagant zigzagants zigzaguant





















































































































# Construire des liens avec les mots préfixés par une graphie élidée?
# laide laides l’aide l’aides l’aident
# l’ire lire lires lyre lyres
# l’or lors
# dard d’art d’arts
# 


>
>
>
>
>
>
>
>
>


>

>
>
>

>
>
>
>

>

>
>
>
|

|
|
>
>
>
|
>
>
>
>

>

>

>


>
>

>
>










|

>
>
>



>

>

>

|

>

>
>



>
>


>
>
>

>
>
>
>
>



>
>
>

>




|

<

|
>

>
>
>
>
>
>



>





>

>

|
>

>
>


>
>
>




>



>

>

>
>
>

|
>
|
>


>
|
>

>
|



>
>
>
>
>


|


>


>





>
>
>

|
|
>
>
>
|

>

|
|

>
|


|
|
|
>
>
>
>


|

>


>


>
>
>
>
>
|

>

>
>
>
>
>



>

>
>

|
>


>

>

>


>
|
|
>

>

>
>
|
>
>

>

>


>
>
>


|
>
>
>



>




>
|




>



>
>
>
>

>

|

>





>

|



>
>

|
>

>
|
|


>

>


>
>


>



>
|



>

>
>
|
|






>



>
>
>



>
>

>


<





|

>
>
>
>


|

>


>

>

>



|
|

>

|

>

>

|
>
>

>

<
>
>
|



>

|
>

>


>
>

>


>








>


>

>
|

>
>

>
>
>
>
>


>



>
>
>
>
>

>

>







>

|

|

>


>
>
|
>
>

>





>


>
>

>

>
>




|
|

|

|


|
>

|
|
>
>
>



|
>


|

>
>
>
>

>


|

>
>



>
>
|

>

>


|

|

>






>
>

>
>










>
|
|


>

>
>

>
>


>

>
>


>


|


>
>

>
>
>



>
>
>

>
>
>
>
>

>


|
>
>



>
>


|

>
>



>
>
>
>
>
>
>
|
>
>


>
|

|
>




|

|


>

>


|


>
>
>
>
>

>
>

>

>
>
|
>


>
>
>

>
|

>
>
>
|




>
>

>
>



>

|
>
>


>





>


>
>

>


>
|

|




>
|


>



>
>


>




|








|
>
|


|


>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114

115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390

391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433

434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
# Homophonies

# Si un verbe du 1ᵉʳ groupe à l’infinitif est présent, toutes ses formes conjuguées homophones seront ajoutées.

# Envisager les automatismes suivants:
# V1: présent 3pl -> nom /adj /3sg (accrochent accroche) (alternent alterne)
# V1: infinitif -> nom pl (boucher bouchers)
# V1: infinitif+imparfait -> nom /ppas (accusée accusées accuser accusés accusez)
# V1: 1pl -> nom (aiguillon aiguillons)
# V2: présent 3sg -> nom /ppas (abrutie abruties abrutis abrutit)

a as à ha ah
abaisse abaisses abaissent abbesse abbesses
aboie aboies aboient abois
abord abord abhorre abhorres abhorrent
ace aces ès esse esses
accès axer
accent accents axant
accueil accueils accueille accueilles accueillent
accro accros accroc accrocs
achat achats hacha hachas
achète achètes achètent hachette hachettes
acier aciers assied assieds
acre acres âcre âcres
action actions axions
adhérant adhérent adhérents
affect affects affecte affectes affectent
affin affins afin
afflue afflues affluent afflux
ai ait aie aies aient ais hé eh es haie haies hais hait est et
air airs aire aires ère ères hère hères erre erres errent ers haire haires
ail aille ailles aillent aïe haï haïe haïs haïes
aile ailes elle elles hèle hèles hèlent
allaiterais allaiterez allaiterait halèterai halèterais halèterait halèteraient halèterez
allaiteras halètera halèteras
allaiterons allaiteront halèterons halèteront
aller allers allée allées
altère altères altèrent haltère haltères
amande amandes amende amendes amendent
amandaie amandaies amender
amanderaie amanderaies amenderais amenderait amenderaient
amen amène amènes amènent
ampli amplis emplis emplit
an ans en
anchois échoient échoit échoie échoient échouas échoua
antre antres entre entres entrent
appas appât appâts happa happas
appareil appareils appareille appareilles appareillent
appel appels appelle appelles appellent
aperçu aperçue aperçues aperçus aperçut
après apprêt apprêts
appui appuis appuie appuies appuient
acquis acquit acquits
ares arrhes art arts
archée archées archer archers archet archets
arête arêtes arrête arrêtes arrêtent
assassinat assassinats assassina assassinas assassinât
assignat assignats assigna assignas assignât
assimilat assimilats assimila assimilas assimilât
atèle atèles attelle attelles attellent
attentat attentats attenta attentas attentât
attribut attributs attribue attribues attribuent
au aux ô eau eaux haut hauts
auteur auteurs auteure auteures hauteur hauteurs
avait avais avaient avez avé haver
aval avals avale avales avalent
bafouillons bafouions
bagage baguage bagages baguages
bai bais baie baies baient bée bées béent
bail baille bailles baillent bâille bâilles bâillent bâillent baye bayes bayent
bâillon bâillons baillons bayons
bal bals balle balles
balade balades baladent ballade ballades
balai balais balaie balaies balaient ballet ballets
banc bancs ban bans
bar bars barre barres barrent bard bards
baron barons barrons
bas bât bâts bah
bassinet bassinets bassiner
basilic basilics basilique basiliques
bâton bâtons battons
beau beaux baux
beignet beignets baigner
bête bêtes bette bettes
beur beurs beurre beurre beurrent
bit bits bite bites bitent bitte bittes bittent
bloc blocs bloque bloques bloquent
blouse blouses blousent blues
bluff bluffs bluffe bluffes bluffent
bois boit
boîte boîtes boite boite boitent
#boot boots boote bootes bootent
bond bonds bon bons
bord bords bore bores
boss bosse bosses bossent
bot bots botte bottes bottent
bouchère bouchères bouchèrent 
bouillie bouillies bouillis bouillit
boulaie boulaies boulet boulets bouler
bouleau bouleaux boulot boulots
bourg bourgs bourre bourres bourrent
bous boue boues bout bouts
box boxe boxes boxent
boycott boycotts boycotte boycottes boycottent
brandy brandys brandis brandit
braquet braquets braquer
bric brick bricks brique briques briquent
brigand brigands briguant
bure bures burent
but buts bute butes butent butte buttes buttent bûtes
cal cals cale cales calent
calcul calculs calcule calcules calculent
camouflet camouflets camoufler
camp camps quand quant khan khans

cache caches cachent cash
cachet cachets cacher
cadi cadis kadi kadis caddie caddies caddy caddys
cadran cadrans cadrant
caftan caftans cafetan cafetans caftant
cahot cahots chaos
cane canes canne cannes Cannes
cantique cantiques quantique quantiques
cap caps cape capes
car cars carre carres carrent quart quarts
caret carets carré carrés carrais carrait carraient carrez
carné carnée carnés carnées carnet carnets
carte cartes cartent kart karts
casher kasher cachèrent
ce se
céleri céleris sellerie selleries
celle celles sel sels selle selles sellent cèle cèles cèlent scelle scelles scellent
cendre cendres sandre sandres
cène saine saines scène scènes senne sennes sen Seine
censé censés censée censées sensé sensés sensée sensées
centon centons santon santons sentons
cep ceps cèpe cèpes
cerf cerfs serre serres serrent sers sert serf serfs
ces ses sais sait saie saies
cessions session sessions
cet cette sept set sets
chaine chaines chainent chaîne chaînes chaînent chêne chênes
chair chairs chaire chaires cher chers chère chères
chant chants champ champs
chaud chauds chaux show shows chaut
chaume chaumes chôme chômes chôment
chas chat chats chah chahs shah shahs schah schahs
cheikh cheikhs chèque chèques
chic chics chique chiques chiquent
choc chocs choque choques choquent
choix choie choies choient
choral chorals chorale chorales corral corrals
chut chute chutes chutent
ci si scie scies scient six sis
cilice cilices silice silices
cire cires cirent sire sires cirre cirres cirrhe cirrhes
ciré cirés cirer scierais scierait scieraient scierez
cite cites citent site sites scythe scythes
cité cités citer
clair clairs claire claires clerc clercs
clam clams clame clames clament
clause clauses close closes closent
clé clés clef clefs
clic clics clique cliques cliquent
cliquet cliquets cliquer
clou clous cloue cloues clouent
coffret coffrets coffrer
coin coins coing coings
coïncidant coïncident coïncidents
col cols colle colles collent khôl khôls
cola colas colla collas kola kolas
collet collets coller
coloris colorie colories colorient
combinat combinats combina combinas combinât
comète comètes commette commettes commettent
comité comités commiter
commis commit commits commite commites commitent
communicant communicants communiquant
complet complets complais complait complaît
compost composts composte compostes compostent
compteur compteurs conteur conteurs
comté comtés compter conter
concours concourt concourent concoures concoures
confie confies confient confis confit confits
connexion connexions connections
conseil conseils conseille conseilles conseillent
conseiller conseillers
consonne consonnes consone consones consonent
contact contacts contacte contactes contactent
#contant content contents comptant comptants
conte contes content compte comptes comptent comte comtes
continu continus continue continues continuent
convaincs convainc convins convint
convaincant convaincants convainquant
convergeant convergent convergents
convoi convois convoie convoies convoient
cool cools coule coules coulent
coq coqs coque coques coke cokes
cor cors corps
coron corons corromps corrompt
corset corsets corser corsé
cote cotes cotent côte côtes cotte cottes
côté côtés coter
cou cous coût coûts cout couts coup coups coud couds
coucher couchers
coule coules coulent cool
coulomb coulombs coulons
couplet couplets coupler
cour cours court courts coure coures courent courre
couvant couvent couvents
crachat crachats cracha crachas crachât
crack cracks craque craques craquent krak kraks crac krach krachs
créer créé créés créée créées crée crées créent
crème crèmes chrême chrêmes
crépi crépis crépit crépît
creuset creusets creuser
cri cris crie cries crient
cric crics crique criques criquent
criquet criquets criquer
crochet crochets crocher
crois croit croient croie croies croîs croît croix
croquet croquets croquer
cross crosse crosses
cru crus crue crues crû crûe crûs crûes crut crût
cuillère cuillères cuiller cuillers
cuir cuirs cuire
cumul cumuls cumule cumules cumulent
cumulet cumulets cumuler
cygne cygnes signe signes signent
dan damne damnes damnent
dans dent dents
danse danses dansent dense denses
date dates datent datte dattes
dé dés dès dais des
deal deals deale deales dealent
déblai déblais déblaie déblaies déblaient
déchu déchue déchues déchus déchut
décolère décolères décolèrent décollèrent
décor décors décore décores décorent
décrue décrues décrus décrut
défi défis défie défies défient défit défît
dégel dégels dégèle dégèles dégèlent
délai délais délaie délaies délaient
délégant délégants déléguant
délit délits délie délies délient
dément déments démens
démente démentes démentent
déni dénis dénie dénies dénient
départ départs dépare dépares déparent
dépens dépends dépend
desceller déceler desseller
désir désirs désire désires désirent
desserre desserres desserrent dessers dessert desserts
détail détails détaille détailles détaillent
dévierai dévierais dévierait dévierez dévirer
devin devins devint devînt
diagnostic diagnostics diagnostique diagnostiques diagnostiquent
différant différent différents différend différends
digest digests digeste digestes
dîne dînes dînent dyne dynes
dis dit dît dix
discours discourt discourent discoure discoures
discussion discussions discutions
dissolu dissolus dissolue dissolues dissolut dissolût
divergeant divergent divergents
dot dots dote dotes dotent
doigt doigts dois doit
don dons dont
dore dores dorent dors dort
doublet doublets doublé doublés doubler
du dû dus due dues dut
dur durs dure dures durent
dialysat dialysats dialysa dialysas dialysât
écho échos écot écots
éclair éclairs éclaire éclaires éclairent
écrie écries écrient écrit écrits écris
écrou écrous écroue écroues écrouent
égal égale égales égalent
égailler égayer
égard égards égare égares égarent
éjaculat éjaculats éjacula éjaculas éjaculât
élan élans hélant
élisais élisait élisaient élisez Élysée Élysées
émir émirs émirent
emploi emplois emploie emploies emploient
empreinte empreintes emprunte empruntes empruntent
ancrage ancrages encrage encrages
en-cours encours encourt encoure encoures encourent
enfer enfers enferre enferres enferrent
ennui ennuis ennuie ennuies ennuient
entretien entretiens entretient
entrée entrées entrer
entrevoie entrevoies entrevois entrevoit entrevoient
envie envies envi envient
envierons envieront environ environs
envoi envois envoie envoies envoient
envol envols envole envoles envolent
épais épée épées
épi épis épie épies épient
équivalant équivalent équivalents
errâmes Éram
essai essais essaie essaies essaient essaye essayes essayent
essor essors essore essores essorent
étagère étagères étagèrent
étai étais était étaient été étés étaie étaies
étain étains éteint éteins
étal étals étale étales étalent
étang étangs étant étends étend
être êtres hêtre hêtres
eu eus eue eues eus eut us eux euh
eusse eusses eussent us
éveil éveils éveille éveilles éveillent
excellant excellent excellents
exclu exclue exclues exclus exclut excluent
exempt exempts exempte exemptes exemptent
exil exils exile exiles exilent
expierai expierais expierait expierez expieraient expirer
exsudat exsudats exsuda exsudas exsudât
extrait extraits extrais extraient extraie extraies 
extravagant extravagants extravaguant
fabricant fabricants fabriquant
face faces fasse fasses fassent fasce fasces
facilité facilités faciliter
faire fer fers ferre ferres ferrent
faisan faisans faisant
fait faits fée fées
far fard fards phare phares
fatigant fatigants fatiguant
faufil faufils faufile faufiles faufilent
fausse fausses faussent fosses fosses
fausset faussets fossé fossés fausser
faux faut
faîte faîtes fait faits faite faites fête fêtes fêtent
fèces fesse fesses fessent
félicité félicités féliciter
ferment ferments fermant fermants
feuillet feuillets feuillée feuillées
fi fie fies fient fis fit fît
fiction fictions fixions
fief fiefs fieffe fieffes fieffent
fier fiers fière fières fièrent
fil fils file files filent fille filles
filet filets filer
film films filme filmes filment
filtrat filtrats filtra filtras filtrât
filtre filtres filtrent philtre philtres
fin fins faim faims feins feint
flamand flamands flamant flamants
flair flairs flaire flaires flairent
flan flan flanc flancs
fleur fleurs fleure fleures fleurent
fleuret fleurets fleurer
flic flics flique fliques fliquent
flou flous floue floues flouent
folio folios foliot foliots
foi fois foie foies
font fonts fond fonds
forçat forçats força forças forçât
forgeron forgerons forgeront
foret forets forer forêt forêts
format formats forma formas formât
fort forts for fore fores forent fors
fou fous fout
foule foules foulent full fulls
four fours fourre fourres fourrent
frai frais fraie fraies fraient fret frets
frêne frênes freine freines freinent
fumée fumées fumé fumet fumets fumer
fus fut fût fûts futs
futé futés futée futées futaie futaies
gal gals gale gales galle galles
gang gangs gangue gangues
garantie garanties garantis garantit
gaule gaules goal goals
gai gais gaie gaies gay gays gué gués guet guets
gaieté gaietés gaîté gaîtés guetter
gaz gaze gazes gazent
gel gels gèle gèles gèlent
gène gènes gêne gênes gênent
genet genets genêt genêts gêner
gin gins jean jeans jinn jinns djinn djinns
glaciaire glaciaires glacière glacières glacèrent
golf golfs golfe golfes golfent
gosse gosses gausse gausses gaussent gauss Gauss
goulet goulets goulée goulées
grâce grâces grasse grasses
granit granits granite granites granitent
gré grès
grill grills gril grils grille grilles grillent
guère guerre guerres
hâle hâles halle halles hall halls

harde hardes arde ardes ardent
hausse hausses haussent os
haute hautes hôte hôtes hotte hotte ôte ôtes ôtent
héro héros héraut hérauts
heur heure heures heurt heurts
hochet hochets hocher
homme hommes ohm ohms heaume heaumes
Hun Huns un uns
hune hunes une unes
hunnique hunniques unique uniques
hutte huttes ut
hydrolysat hydrolysats hydrolysa hydrolysas hydrolysât
hyène hyènes yen yens
i y hie hies
il ils île îles
impair impairs impaire impaires imper impers
incarnat incarnats incarna incarnas incarnât
indic indics indique indiques indiquent
infect infects infecte infectes infectent
infiltrat infiltrats infiltra infiltras infiltrât
influx influe influes influent
institut instituts institue institues instituent
intercession intercessions intersession intersessions
internat internats interna internas internât
intriguant intrigant intrigants
jar jars jard jards jarre jarres
jardinet jardinets jardiner
jet jets jette jettes jettent geai geais jais
jeune jeunes jeûne jeûnes jeûnent
joie joies joua jouas
joue joues jouent joug jougs
jouer jouet jouets
kermès kermesse kermesses
kit kits quitte quittes quittent
la là las
labour labours laboure laboures labourent
lac lacs laque laques laquent
lacet lacets lacer lasser
laïc laïcs laïque laïques
laid laids lait laits laie laies lai les
laîche laîches laiche laîches lèche lèches lèchent
légat légats légua léguas
legs lègue lègues lèguent

lest lests leste lestes lestent
leur leurs leurre leurres leurrent
levée levées lever levers
lieu lieux lieue lieues
lice lices lisse lisses lissent lys
lis lit lits lie lies lient
lisser lissé lissée lissés lissées lycée lycées
lire lires lyre lyres
livret livrets livrer livrée livrée
lob lobs lobe lobes
loch lochs loque loques
loi lois loua louas
loir loirs Loir Loire
loup loups loue loues louent
louerai louerais louerait loueraient louerez lourer
lourd lourds loure loures lourent
luth luths luttes luttes luttent lut lute lutes lutent
lux luxe luxes luxent
lyophilisat lyophilisats lyophilisa lyophilisas lyophilisât
ma mas mât mâts
maçon maçons massons
macro macros maquereau maquereaux
magazine magazines magasine magasines magasinent
mai mais mes met mets
main mains maint maints
maintien maintiens maintient
maire maires mer mers mère mères
maison maisons méson mésons
maître maîtres mètre mètres mettre
major majors majore majores majorent
mal mâle mâles malle malles
mante mantes mente mentes mentent menthe menthes
manteau manteaux mentaux
marais marée marées marrais marrait marraient
marchand marchands marchant
marché marchés marcher
mare mares marre marres marrent marc marcs
marée marées marrer
mari maris marie maries marient Marie marrie marries marri marris
mark marks marque marques marquent
marocain marocains maroquin maroquins
maroquine maroquines maroquinent
martel martèle martèles martèlent
mate mates matent math maths mâte mâtes mâtent mat mats
matinée matinées mâtiner
mec mecs Mecque
mél mêle mêles mêlent
ménager ménagers
mess messe messes
meurs meurt mœurs
mi mie mies mis mit mît
microfilm microfilms microfilme microfilmes microfilment
miction mictions mixions
mime mimes miment
minet minets miner
minerai minerais minerait mineraient minerez
mir mirs mire mires mirent myrrhe myrrhes
mission missions
mite mites mythe mythes
moka mokas moqua moquas
mol mols mole moles molle molles môle môles
mon mont monts
monitorat monitorats monitora monitoras monitorât
mort morts mors mords mord maure maures
mot mots maux
moi mois
mou mous moult moût moûts mouds moud moue moues
muais muait muaient muet muets
mur murs mûr mûrs mûre mûres mure mures murent
muret murets murer
mu mus mû mue mues muent
nais nait nez né née
navigant navigants naviguant
nécessité nécessités nécessiter
négligeant négligent négligents
ni nid nids nie nies nient
niais niait niaient
nô nos
noix noie noies noient noua nouas
nom noms non
nome nomes nomme nommes nomment
notre nôtre nôtres
nourrice nourrices nourrisse nourrisses nourrissent
nous noue noues nouent
nui nuis nuit nuits
octroi octrois octroie octroies octroient
œil œils œille œilles œillent
œillet œillets œiller
oie oies ois oit oient
on ont
or ors hors
#orc orcs orque orques
ornais orner
ou où houx houe houes hou
ouate ouates watt watts
oubli oublis oublie oublies oublient
oui ouï ouïs ouïe ouïes ouïs ouït
pagaie pagaies pagaient pagaïe pagaïes pagaye pagayes pagayent pagaille pagailles
pain pains pin pins peins peint
pair pairs paire paires père pères perds perd pers
paix pet pets paie paies paient
pal pals pale pales pâle pâles
palier paliers pallier
pan pans paon paons pend pends
panse panses pansent pense penses pensent
pensé pensée pensées penser panser
par part parts par pare pares parent pars
parais parait paraît parer
parant parent parents
parc parcs parque parques parquent Parque Parques
parcours parcourt parcourent parcoure parcoures
paresse paresses paressent paraisse paraisses paraissent
pari paris parie paries parient Paris
parquet parquets parquer
parti partis partie parties partit partît
pâté pâtés pâtée pâtées
paume paumes paument pomme pommes pomment
paumier paumiers pommier pommiers paumiez
pause pauses pose poses posent
peau peaux pot pots Po Pau
pêche pêches pèche pèches pèchent
péché péchés pêcher pêchers pécher
peigné peignés peignée peignées peignez peigniez
peine peines peinent penne pennes pêne pênes
pèle pèles pèlent pelle pelles pellent
pellet pellets peler peller
pensionnat pensionnats pensionna pensionnas pensionnât
perce perces percent perse perses
percée percées percer Persée
percheron percherons percheront
pet pets pète pètes pètent
peu peux peut
pi pis pies
pic pics pique piques piquent
pinson pinsons pinçons
piquer piqué piqués piquée piquées piquet piquets
pissat pissats pissa pissas pissât
piton pitons python pythons
placet placets placer
plagiat plagiats plagia plagias plagiât
plaid plaids plaide plaides plaident
plain plains plaint plaints plein pleins
plaine plaines pleine pleines
plainte plaintes plinthe plinthes
plais plaît plait plaie plaies
plan plans plant plants
pleur pleurs pleure pleures pleurent
pli plis plie plies plient
plus plut
police polices policent polisse polisses polissent
poêle poêles poil poils
poignée poignées poignet poignets poignez poignais poignait poignaient
poids pois poix pouah
poins point points poing poings
polissoir polissoirs polissoire polissoires
pont ponts ponds pond
porc porcs port ports pore pores
pool pools poule poules
post poste postes postent
pou poux pouls
pouf poufs pouffe pouffes pouffent
pouce pouces pousse pousses poussent
poule poules pull pulls
pourvoi pourvois pourvoit pourvoient pourvoie pourvoies
précédant précédent précédents
pressant pressants pressens pressent
pressante pressantes pressente pressentes pressentent
prêt prêts près pré prés
primat primats prima primas primât
prix pris prit prît prie pries prient
profil profils profile profiles profilent
pronostic pronostics pronostique pronostiques pronostiquent
provoc provocs provoque provoques provoquent
provocant provocants provoquant
pu pue pues pus put
puce puces pucent pusse pusses pussent
puis puits
quadrillion quadrillions quadrillons
quadruplet quadruplets quadrupler
quintuplet quintuplets quintupler
rappel rappels rappelle rappelles rappellent
racket rackets raquette raquettes rackette rackettes rackettent
radie radies radient radis
raffinat raffinats raffina raffinas raffinât
rai rais raie raies raient
raid raids raide raides
rail rails raille railles raillent raye rayes rayent
rainette rainettes reinette reinettes
rallie rallies rallient rallye rallyes
RAM rame rames rament
rauque rauques roc rocs roque roques roquent
rayon rayons
recel recels recèle recèles recèlent
recours recourt recourent recoure recoures
recrue recrues recrus recrut recrût
recueil recueils recueille recueilles recueillent
recul reculs recule recules reculent
reflux reflue reflues refluent
régal régals régale régale régalent
reine reines renne rennes rêne rênes
relai relais relaie relaies relaient relaye relayes relayent
remblai remblais remblaie remblaies remblaient
renvoi renvois renvoie renvoies renvoient
repaire repaires repère repères repèrent reperds reperd
repli replis replie replies replient
ressenti ressentis ressentit
resserre resserres resserrent ressers ressert
ressors ressort ressorts
résidant résident résidents
restaurant restaurants restaurent
résultat résultats résulta résultât
réveil réveils réveille réveilles réveillent
revive revives revivent
rhum rhums rhume rhumes rom roms ROM Rome
ricochet ricochets ricocher
ris rit rient rie ries riz
rivet rivets river
rock rocks roc rocs roque roques roquent
roder rôder
romps rompt rond ronds
rot rots rôt rôts
roue roues rouent roux
ru rus rue rues ruent
sac sacs saque saques saquent
sachet sachets sachez
sacret sacrets sacré sacrer
saillie saillies saillis saillit saillît
saine saines scène scènes
salariat salariats salaria salarias salariât
sale sales salent salles salles
salut saluts salue salues saluent
saoul saouls soûl soûls saoule saoules saoulent soûle soûles soûlent soul souls
santé santés sentais sentait sentaient sentez
sang sangs sans cent cents sens sent cens
saoul saouls saoule saoules saoulent soûl soûls soûle soûles soûlent soul souls soule soules soulent
saké sakés saquer
satire satires satyre satyres
satirique satiriques satyrique satyriques
saurez saurer
saut sauts sot sots sceau sceaux seau seaux
saute sautes sautent sotte sottes
savon savons
scier sied siéent seyait seyaient siée siéent
scieur scieurs sieur sieurs
script scripts scripte scriptes scriptent
sèche sèches sèchent seiche seiches
secours secourt secourent secoure secoures
secouerai secouerais secouerait secouraient secouerez secourais secourait secouraient secourez secourrai secourrais secourrait secourraient secourrez
secouerons secoueront secourons secourrons secourront
sein seins saint saints sain sains ceins ceint ceints seing seings
serein sereins serin serins
serment serments serrement serrements
ses ces sais sait
shoot shoots shoote shootes shootent
si sis scie scies scient
sifflet sifflets siffler
signal signale signales signalent
signet signets signer
ski skis skie skies skient
soi soie soies soit sois soient
sol sols sole soles saule saules
somme sommes somment
sommeil sommeils sommeille sommeilles sommeillent
sommet sommets sommer
son sons sont
sonnet sonnets sonner
sors sort sorts
sortie sorties sortis sortit
sou sous soue soues
souci soucis soucie soucies soucient
souper soupers sous-paie sous-paies sous-paient
soupir soupirs soupire soupires soupirent
soutien soutiens soutient
soufflet soufflets soufflé soufflés souffler
soufre soufres souffre souffres souffrent
souk souks souque souques souquent
souris sourit sourient sourie souries
sprint sprints sprinte sprintes sprintent
statue statues statuent statut statuts status
stock stocks stocke stockes stockent
stop stops stoppe stoppes stoppent
stress stresse stresses stressent
su sus sue sues sut suent
subis subit subits
substitut substituts substitue substitues substituent
suce suces sucent susse susses sussent
sui suis suit suie suies
suffocant suffocants suffoquant
sur surs sure sures sûr sûre sûrs sûres surent
surf surfs surfe surfes surfent
surfait surfaits surfer
survie survies survis survit
survol survols survole survoles survolent
suspens suspends suspend
syndic syndics syndique syndiques syndiquent
syndicat syndicats syndiqua syndiquas
ta tas
tache taches tâche tâches tâchent
taie taies tes thé thés tais tait
tain teint teints thym thyms tin tins tint teins
taira tairas terra terras
taire ter terre terres terrent
taise taises taisent thèse thèses
tant temps tends tend taon taons
tante tantes tente tentes tentent
tapir tapirs tapirent
tapis tapit tapît
tare tares tard
tarif tarifs tarife tarifes tarifent
taule taules tôle tôles
teinte teintes teintent tinte tintes tintent
tendron tendrons tendront
terme termes thermes
test tests teste testes testent
tête têtes tète tètes tètent
tic tics tique tiques tiquent
tien tiens tient
tir tirs tire tires tirent
tiret tirets tirais tirait tiraient
tirant tyran tyrans
toast toasts toaste toastes toastent
toc toque toques toquent
toi toit toits
tome tomme tomes tommes
ton tons thon thons tond tonds
tort torts tore tores taure taures tord tords tors
tournoi tournois tournoie tournoies tournoient
tout toux
tous tousse tousses toussent
tract tracts tracte tractes tractent
trafic trafics trafique trafiques trafiquent
tram trams trame trames trament
transfert transferts transfère transfères transfèrent
transit transits transite transites transitent
travail travaille travailles travaillent
très trait traits trais traie traies traient
treuil treuils treuille treuilles treuillent
tri tris trie tries trient
tribu tribus tribut tributs
triplet triplets tripler
troc trocs troque troques troquent
troquet troquets troquer
troll trolls trolle trolles trollent
troller trolley trolleys trollais trollait trollaient trollez
trou trous troue troues trouent
truc trucs truque truques truquent
trust trusts truste trustes trustent
tu tus tue tues tuent tut
tutorat tutorats tutora tutoras tutorât
usa usas USA
usager usagers usagé usagée usagés usagées
vacant vacants vaquant
vais vé vés
vain vains vin vins vint vingt vaincs vainc
vaine vaines veine veines viennes
vairon vairons verrons verront
val vals valent
valet valets valais valait valaient valez vallée vallées
vallon vallons valons
vaux vaut vau veau veaux vos
vent vents vend vends van vans
ver vers verre verres vert verts vair
verrat verrats verra verras
verset versets verser
veule veules veulent
veux veut vœu vœux
vil vils vile viles ville villes
vie vies vis vit
vis vice vices visse visses vissent
viol viols viole violes violent
violant violent violents
violat violats viola violas violât
violet violets violer violé violés violée violées
vicier vissiez
voix voie voies voient vois voit voua vouas
voir voire
vol vols vole voles volent
volet volets voler volée volées
vomi vomis vomit
vous voue voues vouent
zigzag zigzags zigzague zigzagues zigzaguent
zigzagant zigzagants zigzaguant

# verbes semblables
ancrer encrer
exaucer exhausser
détoner détonner
différencier différentier
#goûter goutter (+ goûter(s))
#lacer lasser (+ lacet)
#panser penser (+ pensée)
#pêcher pécher (+ péché)
#teinter tinter (+ teinte)
#celer sceller seller (+ scellé)
#vanter venter (+ vente)

# confusion -aire -èrent
alimentaire alimentaires alimentèrent
arbitraire arbitraires arbitrèrent
argumentaire argumentaires argumentèrent
articulaire articulaires articulèrent
bénéficiaire bénéficiaires bénéficièrent
calcaire calcaires calquèrent
capitulaire capitulaires capitulèrent
circulaire circulaires circulèrent
commentaire commentaires commentèrent
contraire contraires contrèrent
corsaire corsaires corsèrent
disciplinaire disciplinaires disciplinèrent
dispensaire dispensaires dispensèrent
démissionnaire démissionnaires démissionnèrent
filaire filaires filèrent
fonctionnaire fonctionnaires fonctionnèrent
formulaire formulaires formulèrent
hypothécaire hypothécaires hypothéquèrent
imaginaire imaginaires imaginèrent
intercalaire intercalaires intercalèrent
inventaire inventaires inventèrent
jugulaire jugulaires jugulèrent
mandataire mandataires mandatèrent
militaire militaires militèrent
modulaire modulaires modulèrent
notaire notaires notèrent
parasitaire parasitaires parasitèrent
plagiaire plagiaires plagièrent
plantaire plantaires plantèrent
primaire primaires primèrent
questionnaire questionnaires questionnèrent
révolutionnaire révolutionnaires révolutionnèrent
salaire salaires salèrent
sommaire sommaires sommèrent
soumissionnaire soumissionnaires soumissionnèrent
stationnaire stationnaires stationnèrent
suicidaire suicidaires suicidèrent
tambourinaire tambourinaires tambourinèrent
tarifaire tarifaires tarifèrent
véhiculaire véhiculaires véhiculèrent

# confusions -ier -iez
amandier amandiers amendiez
aventurier aventuriers aventuriez
balancier balanciers balanciez
bombardier bombardiers bombardiez
bouclier boucliers boucliez
boitier boitiers boîtier boîtiers boitiez
cantonnier cantonniers cantonniez
carrossier carrossiers carrossiez
cellier celliers scelliez
chantier chantiers chantiez
charcutier charcutiers charcutiez
chicanier chicaniers chicaniez
chiffonnier chiffonniers chiffonniez
collier colliers colliez
coudrier coudriers coudriez
cuirassier cuirassiers cuirassiez
cuisinier cuisiniers cuisiniez
câblier câbliers câbliez
drapier drapiers drapiez
encrier encriers encriez
fichier fichiers fichiez
financier financiers financiez
foncier fonciers fonciez
fourrier fourriers fourriez
fumier fumiers fumiez
gravier graviers graviez
grimacier grimaciers grimaciez
huilier huiliers huiliez
héritier héritiers héritiez
infirmier infirmiers infirmiez
jardinier jardiniers jardiniez
levier leviers leviez
limier limiers limiez
luthier luthiers luttiez
manufacturier manufacturiers manufacturiez
mûrier mûriers muriez
nourricier nourriciers nourrissiez
ouvrier ouvriers ouvriez
peuplier peupliers peupliez
pilier piliers piliez
placier placiers placiez
plombier plombiers plombiez
poivrier poivriers poivriez
pompier pompiers pompiez
portier portiers portiez
postier postiers postiez
préfacier préfaciers préfaciez
pédalier pédaliers pédaliez
ramier ramiers ramiez
routier routiers routiez
sentier sentiers sentiez
sommier sommiers sommiez
tablier tabliers tabliez
terrassier terrassiers terrassiez
terrier terriers terriez
verrier verriers verriez
vivier viviers viviez
vivrier vivriers vivriez


# Construire des liens avec les mots préfixés par une graphie élidée?
# laide laides l’aide l’aides l’aident
# l’ire lire lires lyre lyres
# l’or lors
# dard d’art d’arts
# 

Modified gc_lang/fr/dictionnaire/orthographe/FRANCAIS.dic from [3873c50f49] to [65d5c1566b].

more than 10,000 changes

Modified gc_lang/fr/modules-js/conj.js from [55db24a585] to [fdb0ca6eac].

1
2


3
4
5
6
7
8

9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

29

30
31
32
33
34





35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88

89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132


133

134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182

183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284

285
286
287
288
289
290
291
292
293
294
295
296
// Grammalecte - Conjugueur
// License: GPL 3



"use strict";

${map}



let helpers = null; // module not loaded in Firefox content script

let _oData = {};
let _lVtyp = null;
let _lTags = null;
let _dPatternConj = {};
let _dVerb = {};


if (typeof(exports) !== 'undefined') {
    // used within Grammalecte library
    helpers = require("resource://grammalecte/helpers.js");
    _oData = JSON.parse(helpers.loadFile("resource://grammalecte/fr/conj_data.json"));
    _lVtyp = _oData.lVtyp;
    _lTags = _oData.lTags;
    _dPatternConj = _oData.dPatternConj;
    _dVerb = _oData.dVerb;
} else {
    // used within Firefox content script (conjugation panel).
    // can’t load JSON from here, so we do it in ui.js and send it here.

    self.port.on("provideConjData", function (sData) {

        _oData = JSON.parse(sData);
        _lVtyp = _oData.lVtyp;
        _lTags = _oData.lTags;
        _dPatternConj = _oData.dPatternConj;
        _dVerb = _oData.dVerb;





    });
}


const _zStartVoy = new RegExp("^[aeéiouœê]");
const _zNeedTeuph = new RegExp("[tdc]$");

const _dProSuj = new Map ([ [":1s", "je"], [":1ś", "je"], [":2s", "tu"], [":3s", "il"], [":1p", "nous"], [":2p", "vous"], [":3p", "ils"] ]);
const _dProObj = new Map ([ [":1s", "me "], [":1ś", "me "], [":2s", "te "], [":3s", "se "], [":1p", "nous "], [":2p", "vous "], [":3p", "se "] ]);
const _dProObjEl = new Map ([ [":1s", "m’"], [":1ś", "m’"], [":2s", "t’"], [":3s", "s’"], [":1p", "nous "], [":2p", "vous "], [":3p", "s’"] ]);
const _dImpePro = new Map ([ [":2s", "-toi"], [":1p", "-nous"], [":2p", "-vous"] ]);
const _dImpeProNeg = new Map ([ [":2s", "ne te "], [":1p", "ne nous "], [":2p", "ne vous "] ]);
const _dImpeProEn = new Map ([ [":2s", "-t’en"], [":1p", "-nous-en"], [":2p", "-vous-en"] ]);
const _dImpeProNegEn = new Map ([ [":2s", "ne t’en "], [":1p", "ne nous en "], [":2p", "ne vous en "] ]);

const _dGroup = new Map ([ ["0", "auxiliaire"], ["1", "1ᵉʳ groupe"], ["2", "2ᵉ groupe"], ["3", "3ᵉ groupe"] ]);

const _dTenseIdx = new Map ([ [":PQ", 0], [":Ip", 1], [":Iq", 2], [":Is", 3], [":If", 4], [":K", 5], [":Sp", 6], [":Sq", 7], [":E", 8] ]);


function isVerb (sVerb) {
    return _dVerb.hasOwnProperty(sVerb);
}

function getConj (sVerb, sTense, sWho) {
    // returns conjugation (can be an empty string)
    if (!_dVerb.hasOwnProperty(sVerb)) {
        return null;
    }
    if (!_dPatternConj[sTense][_lTags[_dVerb[sVerb][1]][_dTenseIdx.get(sTense)]].hasOwnProperty(sWho)) {
        return "";
    }
    return _modifyStringWithSuffixCode(sVerb, _dPatternConj[sTense][_lTags[_dVerb[sVerb][1]][_dTenseIdx.get(sTense)]][sWho]);
}

function hasConj (sVerb, sTense, sWho) {
    // returns false if no conjugation (also if empty) else true
    if (!_dVerb.hasOwnProperty(sVerb)) {
        return false;
    }
    if (_dPatternConj[sTense][_lTags[_dVerb[sVerb][1]][_dTenseIdx.get(sTense)]].hasOwnProperty(sWho)
            && _dPatternConj[sTense][_lTags[_dVerb[sVerb][1]][_dTenseIdx.get(sTense)]][sWho]) {
        return true;
    }
    return false;
}

function getVtyp (sVerb) {
    // returns raw informations about sVerb
    if (!_dVerb.hasOwnProperty(sVerb)) {
        return null;
    }
    return _lVtyp[_dVerb[sVerb][0]];
}


function getSimil (sWord, sMorph) {
    if (!sMorph.includes(":V")) {
        return new Set();
    }
    let sInfi = sMorph.slice(1, sMorph.indexOf(" "));
    let tTags = _getTags(sInfi);
    let aSugg = new Set();
    if (sMorph.includes(":Q")) {
        // we suggest conjugated forms
        if (sMorph.includes(":V1")) {
            aSugg.add(sInfi);
            aSugg.add(_getConjWithTags(sInfi, tTags, ":Ip", ":3s"));
            aSugg.add(_getConjWithTags(sInfi, tTags, ":Ip", ":2p"));
            aSugg.add(_getConjWithTags(sInfi, tTags, ":Iq", ":1s"));
            aSugg.add(_getConjWithTags(sInfi, tTags, ":Iq", ":3s"));
            aSugg.add(_getConjWithTags(sInfi, tTags, ":Iq", ":3p"));
        } else if (sMorph.includes(":V2")) {
            aSugg.add(_getConjWithTags(sInfi, tTags, ":Ip", ":1s"));
            aSugg.add(_getConjWithTags(sInfi, tTags, ":Ip", ":3s"));
        } else if (sMorph.includes(":V3")) {
            aSugg.add(_getConjWithTags(sInfi, tTags, ":Ip", ":1s"));
            aSugg.add(_getConjWithTags(sInfi, tTags, ":Ip", ":3s"));
            aSugg.add(_getConjWithTags(sInfi, tTags, ":Is", ":1s"));
            aSugg.add(_getConjWithTags(sInfi, tTags, ":Is", ":3s"));
        } else if (isMorph.includes(":V0a")) {
            aSugg.add("eus");
            aSugg.add("eut");
        } else {
            aSugg.add("étais");
            aSugg.add("était");
        }
        aSugg.delete("");
    } else {
        // we suggest past participles
        aSugg.add(_getConjWithTags(sInfi, tTags, ":PQ", ":Q1"));
        aSugg.add(_getConjWithTags(sInfi, tTags, ":PQ", ":Q2"));
        aSugg.add(_getConjWithTags(sInfi, tTags, ":PQ", ":Q3"));
        aSugg.add(_getConjWithTags(sInfi, tTags, ":PQ", ":Q4"));
        aSugg.delete("");
        // if there is only one past participle (epi inv), unreliable.
        if (aSugg.size === 1) {
            aSugg.clear();
        }


    }

    return aSugg;
}


function _getTags (sVerb) {
    // returns tuple of tags (usable with functions _getConjWithTags and _hasConjWithTags)
    if (!_dVerb.hasOwnProperty(sVerb)) {
        return null;
    }
    return _lTags[_dVerb[sVerb][1]];
}

function _getConjWithTags (sVerb, tTags, sTense, sWho) {
    // returns conjugation (can be an empty string)
    if (!_dPatternConj[sTense][tTags[_dTenseIdx.get(sTense)]].hasOwnProperty(sWho)) {
        return "";
    }
    return _modifyStringWithSuffixCode(sVerb, _dPatternConj[sTense][tTags[_dTenseIdx.get(sTense)]][sWho]);
}

function _hasConjWithTags (tTags, sTense, sWho) {
    // returns false if no conjugation (also if empty) else true
    if (_dPatternConj[sTense][tTags[_dTenseIdx.get(sTense)]].hasOwnProperty(sWho)
            && _dPatternConj[sTense][tTags[_dTenseIdx.get(sTense)]][sWho]) {
        return true;
    }
    return false;
}

function _modifyStringWithSuffixCode (sWord, sSfx) {
    // returns sWord modified by sSfx
    if (sSfx === "") {
        return "";
    }
    if (sSfx === "0") {
        return sWord;
    }
    try {
        if (sSfx[0] !== '0') {
            return sWord.slice(0, -(sSfx.charCodeAt(0)-48)) + sSfx.slice(1); // 48 is the ASCII code for "0"
        } else {
            return sWord + sSfx.slice(1);
        }
    }
    catch (e) {
        console.log(e);
        return "## erreur, code : " + sSfx + " ##";
    }
}



class Verb {

    constructor (sVerb) {
        if (typeof sVerb !== "string" || sVerb === "") {
            throw new TypeError ("The value should be a non-empty string");
        }
        this.sVerb = sVerb;
        this.sVerbAux = "";
        this._sRawInfo = getVtyp(this.sVerb);
        this.sInfo = this._readableInfo(this._sRawInfo);
        this._tTags = _getTags(sVerb);
        this._tTagsAux = _getTags(this.sVerbAux);
        this.bProWithEn = (this._sRawInfo[5] === "e");
        this.dConj = new Map ([
            [":Y", new Map ([
                ["label", "Infinitif"],
                [":Y", sVerb]
            ])],
            [":PQ", new Map ([
                ["label", "Participes passés et présent"],
                [":Q1", _getConjWithTags(sVerb, this._tTags, ":PQ", ":Q1")],
                [":Q2", _getConjWithTags(sVerb, this._tTags, ":PQ", ":Q2")],
                [":Q3", _getConjWithTags(sVerb, this._tTags, ":PQ", ":Q3")],
                [":Q4", _getConjWithTags(sVerb, this._tTags, ":PQ", ":Q4")],
                [":P", _getConjWithTags(sVerb, this._tTags, ":PQ", ":P")]
            ])],
            [":Ip", new Map ([
                ["label", "Présent"],
                [":1s", _getConjWithTags(sVerb, this._tTags, ":Ip", ":1s")],
                [":1ś", _getConjWithTags(sVerb, this._tTags, ":Ip", ":1ś")],
                [":2s", _getConjWithTags(sVerb, this._tTags, ":Ip", ":2s")],
                [":3s", _getConjWithTags(sVerb, this._tTags, ":Ip", ":3s")],
                [":1p", _getConjWithTags(sVerb, this._tTags, ":Ip", ":1p")],
                [":2p", _getConjWithTags(sVerb, this._tTags, ":Ip", ":2p")],
                [":3p", _getConjWithTags(sVerb, this._tTags, ":Ip", ":3p")]
            ])],
            [":Iq", new Map ([
                ["label", "Imparfait"],
                [":1s", _getConjWithTags(sVerb, this._tTags, ":Iq", ":1s")],
                [":2s", _getConjWithTags(sVerb, this._tTags, ":Iq", ":2s")],
                [":3s", _getConjWithTags(sVerb, this._tTags, ":Iq", ":3s")],
                [":1p", _getConjWithTags(sVerb, this._tTags, ":Iq", ":1p")],
                [":2p", _getConjWithTags(sVerb, this._tTags, ":Iq", ":2p")],
                [":3p", _getConjWithTags(sVerb, this._tTags, ":Iq", ":3p")]
            ])],
            [":Is", new Map ([
                ["label", "Passé simple"],
                [":1s", _getConjWithTags(sVerb, this._tTags, ":Is", ":1s")],
                [":2s", _getConjWithTags(sVerb, this._tTags, ":Is", ":2s")],
                [":3s", _getConjWithTags(sVerb, this._tTags, ":Is", ":3s")],
                [":1p", _getConjWithTags(sVerb, this._tTags, ":Is", ":1p")],
                [":2p", _getConjWithTags(sVerb, this._tTags, ":Is", ":2p")],
                [":3p", _getConjWithTags(sVerb, this._tTags, ":Is", ":3p")]
            ])],
            [":If", new Map ([
                ["label", "Futur"],
                [":1s", _getConjWithTags(sVerb, this._tTags, ":If", ":1s")],
                [":2s", _getConjWithTags(sVerb, this._tTags, ":If", ":2s")],
                [":3s", _getConjWithTags(sVerb, this._tTags, ":If", ":3s")],
                [":1p", _getConjWithTags(sVerb, this._tTags, ":If", ":1p")],
                [":2p", _getConjWithTags(sVerb, this._tTags, ":If", ":2p")],
                [":3p", _getConjWithTags(sVerb, this._tTags, ":If", ":3p")]
            ])],
            [":Sp", new Map ([
                ["label", "Présent subjonctif"],
                [":1s", _getConjWithTags(sVerb, this._tTags, ":Sp", ":1s")],
                [":1ś", _getConjWithTags(sVerb, this._tTags, ":Sp", ":1ś")],
                [":2s", _getConjWithTags(sVerb, this._tTags, ":Sp", ":2s")],
                [":3s", _getConjWithTags(sVerb, this._tTags, ":Sp", ":3s")],
                [":1p", _getConjWithTags(sVerb, this._tTags, ":Sp", ":1p")],
                [":2p", _getConjWithTags(sVerb, this._tTags, ":Sp", ":2p")],
                [":3p", _getConjWithTags(sVerb, this._tTags, ":Sp", ":3p")]
            ])],
            [":Sq", new Map ([
                ["label", "Imparfait subjonctif"],
                [":1s", _getConjWithTags(sVerb, this._tTags, ":Sq", ":1s")],
                [":1ś", _getConjWithTags(sVerb, this._tTags, ":Sq", ":1ś")],
                [":2s", _getConjWithTags(sVerb, this._tTags, ":Sq", ":2s")],
                [":3s", _getConjWithTags(sVerb, this._tTags, ":Sq", ":3s")],
                [":1p", _getConjWithTags(sVerb, this._tTags, ":Sq", ":1p")],
                [":2p", _getConjWithTags(sVerb, this._tTags, ":Sq", ":2p")],
                [":3p", _getConjWithTags(sVerb, this._tTags, ":Sq", ":3p")]
            ])],
            [":K", new Map ([
                ["label", "Conditionnel"],
                [":1s", _getConjWithTags(sVerb, this._tTags, ":K", ":1s")],
                [":2s", _getConjWithTags(sVerb, this._tTags, ":K", ":2s")],
                [":3s", _getConjWithTags(sVerb, this._tTags, ":K", ":3s")],
                [":1p", _getConjWithTags(sVerb, this._tTags, ":K", ":1p")],
                [":2p", _getConjWithTags(sVerb, this._tTags, ":K", ":2p")],
                [":3p", _getConjWithTags(sVerb, this._tTags, ":K", ":3p")]
            ])],
            [":E", new Map ([
                ["label", "Impératif"],
                [":2s", _getConjWithTags(sVerb, this._tTags, ":E", ":2s")],
                [":1p", _getConjWithTags(sVerb, this._tTags, ":E", ":1p")],
                [":2p", _getConjWithTags(sVerb, this._tTags, ":E", ":2p")]
            ])]
        ]);
    };


    _readableInfo () {
        // returns readable infos
        this.sVerbAux = (this._sRawInfo.slice(7,8) == "e") ? "être" : "avoir";
        let sGroup = _dGroup.get(this._sRawInfo[0]);
        let sInfo = "";
        if (this._sRawInfo.slice(3,4) == "t") {
            sInfo = "transitif";
        } else if (this._sRawInfo.slice(4,5) == "n") {
            sInfo = "transitif indirect";
        } else if (this._sRawInfo.slice(2,3) == "i") {
            sInfo = "intransitif";


>
>






>
|
|
<
<
<
<
<

|
<
<
<
<
|
|
|
|
|
<
<
>
|
>
|
|
|
|
|
>
>
>
>
>
<
|

<
|
|

|
|
|
|
|
|
|

|

|

<
|
|
|

|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
<
>

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
>
|
|

|
<
|
|
|
|
|
|

|
|
|
|
|
|
|

|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>










|

|
|








|
|
|
|
|



|
|
|
|
|
|
|



|
|
|
|
|
|



|
|
|
|
|
|



|
|
|
|
|
|



|
|
|
|
|
|
|



|
|
|
|
|
|
|



|
|
|
|
|
|



|
|
|


<
>




|







1
2
3
4
5
6
7
8
9
10
11
12
13





14
15




16
17
18
19
20


21
22
23
24
25
26
27
28
29
30
31
32
33

34
35

36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83

84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136

137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282

283
284
285
286
287
288
289
290
291
292
293
294
295
// Grammalecte - Conjugueur
// License: GPL 3
/*jslint esversion: 6*/
/*global console,require,exports,self,browser*/

"use strict";

${map}


if (typeof(require) !== 'undefined') {
    var helpers = require("resource://grammalecte/helpers.js");
}






var conj = {




    _lVtyp: [],
    _lTags: [],
    _dPatternConj: {},
    _dVerb: {},



    bInit: false,
    init: function (sJSONData) {
        try {
            let _oData = JSON.parse(sJSONData);
            this._lVtyp = _oData.lVtyp;
            this._lTags = _oData.lTags;
            this._dPatternConj = _oData.dPatternConj;
            this._dVerb = _oData.dVerb;
            this.bInit = true;
        }
        catch (e) {
            console.error(e);
        }

    },


    _zStartVoy: new RegExp("^[aeéiouœê]"),
    _zNeedTeuph: new RegExp("[tdc]$"),

    _dProSuj: new Map ([ [":1s", "je"], [":1ś", "je"], [":2s", "tu"], [":3s", "il"], [":1p", "nous"], [":2p", "vous"], [":3p", "ils"] ]),
    _dProObj: new Map ([ [":1s", "me "], [":1ś", "me "], [":2s", "te "], [":3s", "se "], [":1p", "nous "], [":2p", "vous "], [":3p", "se "] ]),
    _dProObjEl: new Map ([ [":1s", "m’"], [":1ś", "m’"], [":2s", "t’"], [":3s", "s’"], [":1p", "nous "], [":2p", "vous "], [":3p", "s’"] ]),
    _dImpePro: new Map ([ [":2s", "-toi"], [":1p", "-nous"], [":2p", "-vous"] ]),
    _dImpeProNeg: new Map ([ [":2s", "ne te "], [":1p", "ne nous "], [":2p", "ne vous "] ]),
    _dImpeProEn: new Map ([ [":2s", "-t’en"], [":1p", "-nous-en"], [":2p", "-vous-en"] ]),
    _dImpeProNegEn: new Map ([ [":2s", "ne t’en "], [":1p", "ne nous en "], [":2p", "ne vous en "] ]),

    _dGroup: new Map ([ ["0", "auxiliaire"], ["1", "1ᵉʳ groupe"], ["2", "2ᵉ groupe"], ["3", "3ᵉ groupe"] ]),

    _dTenseIdx: new Map ([ [":PQ", 0], [":Ip", 1], [":Iq", 2], [":Is", 3], [":If", 4], [":K", 5], [":Sp", 6], [":Sq", 7], [":E", 8] ]),


    isVerb: function (sVerb) {
        return this._dVerb.hasOwnProperty(sVerb);
    },

    getConj: function (sVerb, sTense, sWho) {
        // returns conjugation (can be an empty string)
        if (!this._dVerb.hasOwnProperty(sVerb)) {
            return null;
        }
        if (!this._dPatternConj[sTense][this._lTags[this._dVerb[sVerb][1]][this._dTenseIdx.get(sTense)]].hasOwnProperty(sWho)) {
            return "";
        }
        return this._modifyStringWithSuffixCode(sVerb, this._dPatternConj[sTense][this._lTags[this._dVerb[sVerb][1]][this._dTenseIdx.get(sTense)]][sWho]);
    },

    hasConj: function (sVerb, sTense, sWho) {
        // returns false if no conjugation (also if empty) else true
        if (!this._dVerb.hasOwnProperty(sVerb)) {
            return false;
        }
        if (this._dPatternConj[sTense][this._lTags[this._dVerb[sVerb][1]][this._dTenseIdx.get(sTense)]].hasOwnProperty(sWho)
                && this._dPatternConj[sTense][this._lTags[this._dVerb[sVerb][1]][this._dTenseIdx.get(sTense)]][sWho]) {
            return true;
        }
        return false;
    },

    getVtyp: function (sVerb) {
        // returns raw informations about sVerb
        if (!this._dVerb.hasOwnProperty(sVerb)) {
            return null;
        }
        return this._lVtyp[this._dVerb[sVerb][0]];

    },

    getSimil: function (sWord, sMorph, sFilter=null) {
        if (!sMorph.includes(":V")) {
            return new Set();
        }
        let sInfi = sMorph.slice(1, sMorph.indexOf(" "));
        let tTags = this._getTags(sInfi);
        let aSugg = new Set();
        if (sMorph.includes(":Q") || sMorph.includes(":Y")) {
            // we suggest conjugated forms
            if (sMorph.includes(":V1")) {
                aSugg.add(sInfi);
                aSugg.add(this._getConjWithTags(sInfi, tTags, ":Ip", ":3s"));
                aSugg.add(this._getConjWithTags(sInfi, tTags, ":Ip", ":2p"));
                aSugg.add(this._getConjWithTags(sInfi, tTags, ":Iq", ":1s"));
                aSugg.add(this._getConjWithTags(sInfi, tTags, ":Iq", ":3s"));
                aSugg.add(this._getConjWithTags(sInfi, tTags, ":Iq", ":3p"));
            } else if (sMorph.includes(":V2")) {
                aSugg.add(this._getConjWithTags(sInfi, tTags, ":Ip", ":1s"));
                aSugg.add(this._getConjWithTags(sInfi, tTags, ":Ip", ":3s"));
            } else if (sMorph.includes(":V3")) {
                aSugg.add(this._getConjWithTags(sInfi, tTags, ":Ip", ":1s"));
                aSugg.add(this._getConjWithTags(sInfi, tTags, ":Ip", ":3s"));
                aSugg.add(this._getConjWithTags(sInfi, tTags, ":Is", ":1s"));
                aSugg.add(this._getConjWithTags(sInfi, tTags, ":Is", ":3s"));
            } else if (sMorph.includes(":V0a")) {
                aSugg.add("eus");
                aSugg.add("eut");
            } else {
                aSugg.add("étais");
                aSugg.add("était");
            }
            aSugg.delete("");
        } else {
            // we suggest past participles
            aSugg.add(this._getConjWithTags(sInfi, tTags, ":PQ", ":Q1"));
            aSugg.add(this._getConjWithTags(sInfi, tTags, ":PQ", ":Q2"));
            aSugg.add(this._getConjWithTags(sInfi, tTags, ":PQ", ":Q3"));
            aSugg.add(this._getConjWithTags(sInfi, tTags, ":PQ", ":Q4"));
            aSugg.delete("");
            // if there is only one past participle (epi inv), unreliable.
            if (aSugg.size === 1) {
                aSugg.clear();
            }
            if (sMorph.includes(":V1")) {
                aSugg.add(sInfi);
            }
        }
        return aSugg;
    },

    _getTags: function (sVerb) {

        // returns tuple of tags (usable with functions _getConjWithTags and _hasConjWithTags)
        if (!this._dVerb.hasOwnProperty(sVerb)) {
            return null;
        }
        return this._lTags[this._dVerb[sVerb][1]];
    },

    _getConjWithTags: function (sVerb, tTags, sTense, sWho) {
        // returns conjugation (can be an empty string)
        if (!this._dPatternConj[sTense][tTags[this._dTenseIdx.get(sTense)]].hasOwnProperty(sWho)) {
            return "";
        }
        return this._modifyStringWithSuffixCode(sVerb, this._dPatternConj[sTense][tTags[this._dTenseIdx.get(sTense)]][sWho]);
    },

    _hasConjWithTags: function (tTags, sTense, sWho) {
        // returns false if no conjugation (also if empty) else true
        if (this._dPatternConj[sTense][tTags[this._dTenseIdx.get(sTense)]].hasOwnProperty(sWho)
                && this._dPatternConj[sTense][tTags[this._dTenseIdx.get(sTense)]][sWho]) {
            return true;
        }
        return false;
    },

    _modifyStringWithSuffixCode: function (sWord, sSfx) {
        // returns sWord modified by sSfx
        if (sSfx === "") {
            return "";
        }
        if (sSfx === "0") {
            return sWord;
        }
        try {
            if (sSfx[0] !== '0') {
                return sWord.slice(0, -(sSfx.charCodeAt(0)-48)) + sSfx.slice(1); // 48 is the ASCII code for "0"
            } else {
                return sWord + sSfx.slice(1);
            }
        }
        catch (e) {
            console.log(e);
            return "## erreur, code : " + sSfx + " ##";
        }
    }
};


class Verb {

    constructor (sVerb) {
        if (typeof sVerb !== "string" || sVerb === "") {
            throw new TypeError ("The value should be a non-empty string");
        }
        this.sVerb = sVerb;
        this.sVerbAux = "";
        this._sRawInfo = conj.getVtyp(this.sVerb);
        this.sInfo = this._readableInfo(this._sRawInfo);
        this._tTags = conj._getTags(sVerb);
        this._tTagsAux = conj._getTags(this.sVerbAux);
        this.bProWithEn = (this._sRawInfo[5] === "e");
        this.dConj = new Map ([
            [":Y", new Map ([
                ["label", "Infinitif"],
                [":Y", sVerb]
            ])],
            [":PQ", new Map ([
                ["label", "Participes passés et présent"],
                [":Q1", conj._getConjWithTags(sVerb, this._tTags, ":PQ", ":Q1")],
                [":Q2", conj._getConjWithTags(sVerb, this._tTags, ":PQ", ":Q2")],
                [":Q3", conj._getConjWithTags(sVerb, this._tTags, ":PQ", ":Q3")],
                [":Q4", conj._getConjWithTags(sVerb, this._tTags, ":PQ", ":Q4")],
                [":P", conj._getConjWithTags(sVerb, this._tTags, ":PQ", ":P")]
            ])],
            [":Ip", new Map ([
                ["label", "Présent"],
                [":1s", conj._getConjWithTags(sVerb, this._tTags, ":Ip", ":1s")],
                [":1ś", conj._getConjWithTags(sVerb, this._tTags, ":Ip", ":1ś")],
                [":2s", conj._getConjWithTags(sVerb, this._tTags, ":Ip", ":2s")],
                [":3s", conj._getConjWithTags(sVerb, this._tTags, ":Ip", ":3s")],
                [":1p", conj._getConjWithTags(sVerb, this._tTags, ":Ip", ":1p")],
                [":2p", conj._getConjWithTags(sVerb, this._tTags, ":Ip", ":2p")],
                [":3p", conj._getConjWithTags(sVerb, this._tTags, ":Ip", ":3p")]
            ])],
            [":Iq", new Map ([
                ["label", "Imparfait"],
                [":1s", conj._getConjWithTags(sVerb, this._tTags, ":Iq", ":1s")],
                [":2s", conj._getConjWithTags(sVerb, this._tTags, ":Iq", ":2s")],
                [":3s", conj._getConjWithTags(sVerb, this._tTags, ":Iq", ":3s")],
                [":1p", conj._getConjWithTags(sVerb, this._tTags, ":Iq", ":1p")],
                [":2p", conj._getConjWithTags(sVerb, this._tTags, ":Iq", ":2p")],
                [":3p", conj._getConjWithTags(sVerb, this._tTags, ":Iq", ":3p")]
            ])],
            [":Is", new Map ([
                ["label", "Passé simple"],
                [":1s", conj._getConjWithTags(sVerb, this._tTags, ":Is", ":1s")],
                [":2s", conj._getConjWithTags(sVerb, this._tTags, ":Is", ":2s")],
                [":3s", conj._getConjWithTags(sVerb, this._tTags, ":Is", ":3s")],
                [":1p", conj._getConjWithTags(sVerb, this._tTags, ":Is", ":1p")],
                [":2p", conj._getConjWithTags(sVerb, this._tTags, ":Is", ":2p")],
                [":3p", conj._getConjWithTags(sVerb, this._tTags, ":Is", ":3p")]
            ])],
            [":If", new Map ([
                ["label", "Futur"],
                [":1s", conj._getConjWithTags(sVerb, this._tTags, ":If", ":1s")],
                [":2s", conj._getConjWithTags(sVerb, this._tTags, ":If", ":2s")],
                [":3s", conj._getConjWithTags(sVerb, this._tTags, ":If", ":3s")],
                [":1p", conj._getConjWithTags(sVerb, this._tTags, ":If", ":1p")],
                [":2p", conj._getConjWithTags(sVerb, this._tTags, ":If", ":2p")],
                [":3p", conj._getConjWithTags(sVerb, this._tTags, ":If", ":3p")]
            ])],
            [":Sp", new Map ([
                ["label", "Présent subjonctif"],
                [":1s", conj._getConjWithTags(sVerb, this._tTags, ":Sp", ":1s")],
                [":1ś", conj._getConjWithTags(sVerb, this._tTags, ":Sp", ":1ś")],
                [":2s", conj._getConjWithTags(sVerb, this._tTags, ":Sp", ":2s")],
                [":3s", conj._getConjWithTags(sVerb, this._tTags, ":Sp", ":3s")],
                [":1p", conj._getConjWithTags(sVerb, this._tTags, ":Sp", ":1p")],
                [":2p", conj._getConjWithTags(sVerb, this._tTags, ":Sp", ":2p")],
                [":3p", conj._getConjWithTags(sVerb, this._tTags, ":Sp", ":3p")]
            ])],
            [":Sq", new Map ([
                ["label", "Imparfait subjonctif"],
                [":1s", conj._getConjWithTags(sVerb, this._tTags, ":Sq", ":1s")],
                [":1ś", conj._getConjWithTags(sVerb, this._tTags, ":Sq", ":1ś")],
                [":2s", conj._getConjWithTags(sVerb, this._tTags, ":Sq", ":2s")],
                [":3s", conj._getConjWithTags(sVerb, this._tTags, ":Sq", ":3s")],
                [":1p", conj._getConjWithTags(sVerb, this._tTags, ":Sq", ":1p")],
                [":2p", conj._getConjWithTags(sVerb, this._tTags, ":Sq", ":2p")],
                [":3p", conj._getConjWithTags(sVerb, this._tTags, ":Sq", ":3p")]
            ])],
            [":K", new Map ([
                ["label", "Conditionnel"],
                [":1s", conj._getConjWithTags(sVerb, this._tTags, ":K", ":1s")],
                [":2s", conj._getConjWithTags(sVerb, this._tTags, ":K", ":2s")],
                [":3s", conj._getConjWithTags(sVerb, this._tTags, ":K", ":3s")],
                [":1p", conj._getConjWithTags(sVerb, this._tTags, ":K", ":1p")],
                [":2p", conj._getConjWithTags(sVerb, this._tTags, ":K", ":2p")],
                [":3p", conj._getConjWithTags(sVerb, this._tTags, ":K", ":3p")]
            ])],
            [":E", new Map ([
                ["label", "Impératif"],
                [":2s", conj._getConjWithTags(sVerb, this._tTags, ":E", ":2s")],
                [":1p", conj._getConjWithTags(sVerb, this._tTags, ":E", ":1p")],
                [":2p", conj._getConjWithTags(sVerb, this._tTags, ":E", ":2p")]
            ])]
        ]);

    }

    _readableInfo () {
        // returns readable infos
        this.sVerbAux = (this._sRawInfo.slice(7,8) == "e") ? "être" : "avoir";
        let sGroup = conj._dGroup.get(this._sRawInfo[0]);
        let sInfo = "";
        if (this._sRawInfo.slice(3,4) == "t") {
            sInfo = "transitif";
        } else if (this._sRawInfo.slice(4,5) == "n") {
            sInfo = "transitif indirect";
        } else if (this._sRawInfo.slice(2,3) == "i") {
            sInfo = "intransitif";
305
306
307
308
309
310
311
312

313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338

339
340
341
342

343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375

376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426

427
428
429
430
431
432
433
434
435
436
437
438
439

440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472

473
474
475
476
477
478
479
480
481
482
483
484
485
486
487


488
















489
490





491











492
493
494
495
496
497

498

499
500
        if (this._sRawInfo.slice(6,7) == "m") {
            sInfo = sInfo + " impersonnel";
        }
        if (sInfo === "") {
            sInfo = "# erreur - code : " + this._sRawInfo;
        }
        return sGroup + " · " + sInfo;
    };


    infinitif (bPro, bNeg, bTpsCo, bInt, bFem) {
        let sInfi;
        if (bTpsCo) {
            sInfi = (bPro) ? "être" : this.sVerbAux;
        } else {
            sInfi = this.sVerb;
        }
        if (bPro) {
            if (this.bProWithEn) {
                sInfi = "s’en " + sInfi;
            } else {
                sInfi = (_zStartVoy.test(sInfi)) ? "s’" + sInfi : "se " + sInfi;
            }
        }
        if (bNeg) {
            sInfi = "ne pas " + sInfi;
        }
        if (bTpsCo) {
            sInfi += " " + this._seekPpas(bPro, bFem, (this._sRawInfo[5] == "r"));
        }
        if (bInt) {
            sInfi += " … ?";
        }
        return sInfi;
    };


    participePasse (sWho) {
        return this.dConj.get(":PQ").get(sWho);
    };


    participePresent (bPro, bNeg, bTpsCo, bInt, bFem) {
        if (!this.dConj.get(":PQ").get(":P")) {
            return "";
        }
        let sPartPre;
        if (bTpsCo) {
            sPartPre = (!bPro) ? _getConjWithTags(this.sVerbAux, this._tTagsAux, ":PQ", ":P") : getConj("être", ":PQ", ":P");
        } else {
            sPartPre = this.dConj.get(":PQ").get(":P");
        }
        if (sPartPre === "") {
            return "";
        }
        let bEli = _zStartVoy.test(sPartPre);
        if (bPro) {
            if (this.bProWithEn) {
                sPartPre = "s’en " + sPartPre;
            } else {
                sPartPre = (bEli) ? "s’" + sPartPre : "se " + sPartPre;
            }
        }
        if (bNeg) {
            sPartPre = (bEli && !bPro) ? "n’" + sPartPre + " pas" : "ne " + sPartPre + " pas";
        }
        if (bTpsCo) {
            sPartPre += " " + this._seekPpas(bPro, bFem, this._sRawInfo[5] == "r");
        }
        if (bInt) {
            sPartPre += " … ?";
        }
        return sPartPre;
    };


    conjugue (sTemps, sWho, bPro, bNeg, bTpsCo, bInt, bFem) {
        if (!this.dConj.get(sTemps).get(sWho)) {
            return "";
        }
        let sConj;
        if (!bTpsCo && bInt && sWho == ":1s" && this.dConj.get(sTemps)._get(":1ś", false)) {
            sWho = ":1ś";
        }
        if (bTpsCo) {
            sConj = (!bPro) ? _getConjWithTags(this.sVerbAux, this._tTagsAux, sTemps, sWho) : getConj("être", sTemps, sWho);
        } else {
            sConj = this.dConj.get(sTemps).get(sWho);
        }
        if (sConj === "") {
            return "";
        }
        let bEli = _zStartVoy.test(sConj);
        if (bPro) {
            if (!this.bProWithEn) {
                sConj = (bEli) ? _dProObjEl.get(sWho) + sConj : _dProObj.get(sWho) + sConj;
            } else {
                sConj = _dProObjEl.get(sWho) + "en " + sConj;
            }
        }
        if (bNeg) {
            sConj = (bEli && !bPro) ? "n’" + sConj : "ne " + sConj;
        }
        if (bInt) {
            if (sWho == ":3s" && !_zNeedTeuph.test(sConj)) {
                sConj += "-t";
            }
            sConj += "-" + this._getPronom(sWho, bFem);
        } else {
            if (sWho == ":1s" && bEli && !bNeg && !bPro) {
                sConj = "j’" + sConj;
            } else {
                sConj = this._getPronom(sWho, bFem) + " " + sConj;
            }
        }
        if (bNeg) {
            sConj += " pas";
        }
        if (bTpsCo) {
            sConj += " " + this._seekPpas(bPro, bFem, sWho.endsWith("p") || this._sRawInfo[5] == "r");
        }
        if (bInt) {
            sConj += " … ?";
        }
        return sConj;
    };


    _getPronom (sWho, bFem) {
        if (sWho == ":3s") {
            if (this._sRawInfo[5] == "r") {
                return "on";
            } else if (bFem) {
                return "elle";
            }
        } else if (sWho == ":3p" && bFem) {
            return "elles";
        }
        return _dProSuj.get(sWho);
    };


    imperatif (sWho, bPro, bNeg, bTpsCo, bFem) {
        if (!this.dConj.get(":E").get(sWho)) {
            return "";
        }
        let sImpe;
        if (bTpsCo) {
            sImpe = (!bPro) ? _getConjWithTags(this.sVerbAux, this._tTagsAux, ":E", sWho) : getConj("être", ":E", sWho);
        } else {
            sImpe = this.dConj.get(":E").get(sWho);
        }
        if (sImpe === "") {
            return "";
        }
        let bEli = _zStartVoy.test(sImpe);
        if (bNeg) {
            if (bPro) {
                if (!this.bProWithEn) {
                    sImpe = (bEli && sWho == ":2s") ? "ne t’" + sImpe + " pas" : _dImpeProNeg.get(sWho) + sImpe + " pas";
                } else {
                    sImpe = _dImpeProNegEn.get(sWho) + sImpe + " pas";
                }
            } else {
                sImpe = (bEli) ? "n’" + sImpe + " pas" : "ne " + sImpe + " pas";
            }
        } else if (bPro) {
            sImpe = (this.bProWithEn) ? sImpe + _dImpeProEn.get(sWho) : sImpe + _dImpePro.get(sWho);
        }
        if (bTpsCo) {
            return sImpe + " " + this._seekPpas(bPro, bFem, sWho.endsWith("p") || this._sRawInfo[5] == "r");
        }
        return sImpe;
    };


    _seekPpas (bPro, bFem, bPlur) {
        if (!bPro && this.sVerbAux == "avoir") {
            return this.dConj.get(":PQ").get(":Q1");
        }
        if (!bFem) {
            return (bPlur && this.dConj.get(":PQ").get(":Q2")) ? this.dConj.get(":PQ").get(":Q2") : this.dConj.get(":PQ").get(":Q1");
        }
        if (!bPlur) {
            return (this.dConj.get(":PQ").get(":Q3")) ? this.dConj.get(":PQ").get(":Q3") : this.dConj.get(":PQ").get(":Q1");
        }
        return (this.dConj.get(":PQ").get(":Q4")) ? this.dConj.get(":PQ").get(":Q4") : this.dConj.get(":PQ").get(":Q1");
    }
}



if (typeof(exports) !== 'undefined') {
















    // Used for Grammalecte library.
    // In content scripts, these variable are directly reachable





    exports.Verb = Verb;











    exports.isVerb = isVerb;
    exports.getConj = getConj;
    exports.hasConj = hasConj;
    exports.getVtyp = getVtyp;
    exports.getSimil = getSimil;
    exports._getTags = _getTags;

    exports._hasConjWithTags = _hasConjWithTags;

    exports._getConjWithTags = _getConjWithTags;
}







<
>












|












<
>



<
>







|






|

















<
>






|



|






|


|

|






|




















<
>











|
<
>







|






|



|

|





|





<
>















>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
|
|
|
|
|
|
>
|
>
|

304
305
306
307
308
309
310

311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336

337
338
339
340

341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373

374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424

425
426
427
428
429
430
431
432
433
434
435
436
437

438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470

471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
        if (this._sRawInfo.slice(6,7) == "m") {
            sInfo = sInfo + " impersonnel";
        }
        if (sInfo === "") {
            sInfo = "# erreur - code : " + this._sRawInfo;
        }
        return sGroup + " · " + sInfo;

    }

    infinitif (bPro, bNeg, bTpsCo, bInt, bFem) {
        let sInfi;
        if (bTpsCo) {
            sInfi = (bPro) ? "être" : this.sVerbAux;
        } else {
            sInfi = this.sVerb;
        }
        if (bPro) {
            if (this.bProWithEn) {
                sInfi = "s’en " + sInfi;
            } else {
                sInfi = (conj._zStartVoy.test(sInfi)) ? "s’" + sInfi : "se " + sInfi;
            }
        }
        if (bNeg) {
            sInfi = "ne pas " + sInfi;
        }
        if (bTpsCo) {
            sInfi += " " + this._seekPpas(bPro, bFem, (this._sRawInfo[5] == "r"));
        }
        if (bInt) {
            sInfi += " … ?";
        }
        return sInfi;

    }

    participePasse (sWho) {
        return this.dConj.get(":PQ").get(sWho);

    }

    participePresent (bPro, bNeg, bTpsCo, bInt, bFem) {
        if (!this.dConj.get(":PQ").get(":P")) {
            return "";
        }
        let sPartPre;
        if (bTpsCo) {
            sPartPre = (!bPro) ? conj._getConjWithTags(this.sVerbAux, this._tTagsAux, ":PQ", ":P") : conj.getConj("être", ":PQ", ":P");
        } else {
            sPartPre = this.dConj.get(":PQ").get(":P");
        }
        if (sPartPre === "") {
            return "";
        }
        let bEli = conj._zStartVoy.test(sPartPre);
        if (bPro) {
            if (this.bProWithEn) {
                sPartPre = "s’en " + sPartPre;
            } else {
                sPartPre = (bEli) ? "s’" + sPartPre : "se " + sPartPre;
            }
        }
        if (bNeg) {
            sPartPre = (bEli && !bPro) ? "n’" + sPartPre + " pas" : "ne " + sPartPre + " pas";
        }
        if (bTpsCo) {
            sPartPre += " " + this._seekPpas(bPro, bFem, this._sRawInfo[5] == "r");
        }
        if (bInt) {
            sPartPre += " … ?";
        }
        return sPartPre;

    }

    conjugue (sTemps, sWho, bPro, bNeg, bTpsCo, bInt, bFem) {
        if (!this.dConj.get(sTemps).get(sWho)) {
            return "";
        }
        let sConj;
        if (!bTpsCo && bInt && sWho == ":1s" && this.dConj.get(sTemps).gl_get(":1ś", false)) {
            sWho = ":1ś";
        }
        if (bTpsCo) {
            sConj = (!bPro) ? conj._getConjWithTags(this.sVerbAux, this._tTagsAux, sTemps, sWho) : conj.getConj("être", sTemps, sWho);
        } else {
            sConj = this.dConj.get(sTemps).get(sWho);
        }
        if (sConj === "") {
            return "";
        }
        let bEli = conj._zStartVoy.test(sConj);
        if (bPro) {
            if (!this.bProWithEn) {
                sConj = (bEli) ? conj._dProObjEl.get(sWho) + sConj : conj._dProObj.get(sWho) + sConj;
            } else {
                sConj = conj._dProObjEl.get(sWho) + "en " + sConj;
            }
        }
        if (bNeg) {
            sConj = (bEli && !bPro) ? "n’" + sConj : "ne " + sConj;
        }
        if (bInt) {
            if (sWho == ":3s" && !conj._zNeedTeuph.test(sConj)) {
                sConj += "-t";
            }
            sConj += "-" + this._getPronom(sWho, bFem);
        } else {
            if (sWho == ":1s" && bEli && !bNeg && !bPro) {
                sConj = "j’" + sConj;
            } else {
                sConj = this._getPronom(sWho, bFem) + " " + sConj;
            }
        }
        if (bNeg) {
            sConj += " pas";
        }
        if (bTpsCo) {
            sConj += " " + this._seekPpas(bPro, bFem, sWho.endsWith("p") || this._sRawInfo[5] == "r");
        }
        if (bInt) {
            sConj += " … ?";
        }
        return sConj;

    }

    _getPronom (sWho, bFem) {
        if (sWho == ":3s") {
            if (this._sRawInfo[5] == "r") {
                return "on";
            } else if (bFem) {
                return "elle";
            }
        } else if (sWho == ":3p" && bFem) {
            return "elles";
        }
        return conj._dProSuj.get(sWho);

    }

    imperatif (sWho, bPro, bNeg, bTpsCo, bFem) {
        if (!this.dConj.get(":E").get(sWho)) {
            return "";
        }
        let sImpe;
        if (bTpsCo) {
            sImpe = (!bPro) ? conj._getConjWithTags(this.sVerbAux, this._tTagsAux, ":E", sWho) : conj.getConj("être", ":E", sWho);
        } else {
            sImpe = this.dConj.get(":E").get(sWho);
        }
        if (sImpe === "") {
            return "";
        }
        let bEli = conj._zStartVoy.test(sImpe);
        if (bNeg) {
            if (bPro) {
                if (!this.bProWithEn) {
                    sImpe = (bEli && sWho == ":2s") ? "ne t’" + sImpe + " pas" : conj._dImpeProNeg.get(sWho) + sImpe + " pas";
                } else {
                    sImpe = conj._dImpeProNegEn.get(sWho) + sImpe + " pas";
                }
            } else {
                sImpe = (bEli) ? "n’" + sImpe + " pas" : "ne " + sImpe + " pas";
            }
        } else if (bPro) {
            sImpe = (this.bProWithEn) ? sImpe + conj._dImpeProEn.get(sWho) : sImpe + conj._dImpePro.get(sWho);
        }
        if (bTpsCo) {
            return sImpe + " " + this._seekPpas(bPro, bFem, sWho.endsWith("p") || this._sRawInfo[5] == "r");
        }
        return sImpe;

    }

    _seekPpas (bPro, bFem, bPlur) {
        if (!bPro && this.sVerbAux == "avoir") {
            return this.dConj.get(":PQ").get(":Q1");
        }
        if (!bFem) {
            return (bPlur && this.dConj.get(":PQ").get(":Q2")) ? this.dConj.get(":PQ").get(":Q2") : this.dConj.get(":PQ").get(":Q1");
        }
        if (!bPlur) {
            return (this.dConj.get(":PQ").get(":Q3")) ? this.dConj.get(":PQ").get(":Q3") : this.dConj.get(":PQ").get(":Q1");
        }
        return (this.dConj.get(":PQ").get(":Q4")) ? this.dConj.get(":PQ").get(":Q4") : this.dConj.get(":PQ").get(":Q1");
    }
}


// Initialization
if (!conj.bInit && typeof(browser) !== 'undefined') {
    // WebExtension (but not in Worker)
    conj.init(helpers.loadFile(browser.extension.getURL("grammalecte/fr/conj_data.json")));
} else if (!conj.bInit && typeof(require) !== 'undefined') {
    // Add-on SDK and Thunderbird
    conj.init(helpers.loadFile("resource://grammalecte/fr/conj_data.json"));
} else if ( !conj.bInit && typeof(self) !== 'undefined' && typeof(self.port) !== 'undefined' && typeof(self.port.on) !== "undefined") {
    // used within Firefox content script (conjugation panel).
    // can’t load JSON from here, so we do it in ui.js and send it here.
    self.port.on("provideConjData", function (sJSONData) {
        conj.init(sJSONData);
    });    
} else if (conj.bInit){
    console.log("Module conj déjà initialisé");
} else {
    console.log("Module conj non initialisé");
}


if (typeof(exports) !== 'undefined') {
    exports._lVtyp = conj._lVtyp;
    exports._lTags = conj._lTags;
    exports._dPatternConj = conj._dPatternConj;
    exports._dVerb = conj._dVerb;
    exports.init = conj.init;
    exports._zStartVoy = conj._zStartVoy;
    exports._zNeedTeuph = conj._zNeedTeuph;
    exports._dProSuj = conj._dProSuj;
    exports._dProObj = conj._dProObj;
    exports._dProObjEl = conj._dProObjEl;
    exports._dImpePro = conj._dImpePro;
    exports._dImpeProNeg = conj._dImpeProNeg;
    exports._dImpeProEn = conj._dImpeProEn;
    exports._dImpeProNegEn = conj._dImpeProNegEn;
    exports._dGroup = conj._dGroup;
    exports._dTenseIdx = conj._dTenseIdx;
    exports.isVerb = conj.isVerb;
    exports.getConj = conj.getConj;
    exports.hasConj = conj.hasConj;
    exports.getVtyp = conj.getVtyp;
    exports.getSimil = conj.getSimil;
    exports._getTags = conj._getTags;
    exports._getConjWithTags = conj._getConjWithTags;
    exports._hasConjWithTags = conj._hasConjWithTags;
    exports._modifyStringWithSuffixCode = conj._modifyStringWithSuffixCode;
    exports.Verb = Verb;
}

Modified gc_lang/fr/modules-js/conj_data.json from [71266ea76e] to [73c9d13d66].

cannot compute difference between binary files

Modified gc_lang/fr/modules-js/cregex.js from [eb814cc494] to [97d67d03aa].

1

2
3

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233

234














235
236
237
238
239
240
241
242
243
244
245
246
247
248
249

250
251
252
253

254
255
256
257















258
259
260
261
262

263
264
265
266
267






















268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300

//// Grammalecte - Compiled regular expressions




///// Lemme
const zLemma = new RegExp("^>([a-zà-öø-ÿ0-9Ā-ʯ][a-zà-öø-ÿ0-9Ā-ʯ-]+)");

///// Masculin / féminin / singulier / pluriel
const zGender = new RegExp(":[mfe]");
const zNumber = new RegExp(":[spi]");

///// Nom et adjectif
const zNA = new RegExp(":[NA]");

//// nombre
const zNAs = new RegExp(":[NA].*:s");
const zNAp = new RegExp(":[NA].*:p");
const zNAi = new RegExp(":[NA].*:i");
const zNAsi = new RegExp(":[NA].*:[si]");
const zNApi = new RegExp(":[NA].*:[pi]");

//// genre
const zNAm = new RegExp(":[NA].*:m");
const zNAf = new RegExp(":[NA].*:f");
const zNAe = new RegExp(":[NA].*:e");
const zNAme = new RegExp(":[NA].*:[me]");
const zNAfe = new RegExp(":[NA].*:[fe]");

//// nombre et genre
// singuilier
const zNAms = new RegExp(":[NA].*:m.*:s");
const zNAfs = new RegExp(":[NA].*:f.*:s");
const zNAes = new RegExp(":[NA].*:e.*:s");
const zNAmes = new RegExp(":[NA].*:[me].*:s");
const zNAfes = new RegExp(":[NA].*:[fe].*:s");

// singulier et invariable
const zNAmsi = new RegExp(":[NA].*:m.*:[si]");
const zNAfsi = new RegExp(":[NA].*:f.*:[si]");
const zNAesi = new RegExp(":[NA].*:e.*:[si]");
const zNAmesi = new RegExp(":[NA].*:[me].*:[si]");
const zNAfesi = new RegExp(":[NA].*:[fe].*:[si]");

// pluriel
const zNAmp = new RegExp(":[NA].*:m.*:p");
const zNAfp = new RegExp(":[NA].*:f.*:p");
const zNAep = new RegExp(":[NA].*:e.*:p");
const zNAmep = new RegExp(":[NA].*:[me].*:p");
const zNAfep = new RegExp(":[NA].*:[me].*:p");

// pluriel et invariable
const zNAmpi = new RegExp(":[NA].*:m.*:[pi]");
const zNAfpi = new RegExp(":[NA].*:f.*:[pi]");
const zNAepi = new RegExp(":[NA].*:e.*:[pi]");
const zNAmepi = new RegExp(":[NA].*:[me].*:[pi]");
const zNAfepi = new RegExp(":[NA].*:[fe].*:[pi]");

//// Divers
const zAD = new RegExp(":[AB]");

///// Verbe
const zVconj = new RegExp(":[123][sp]");
const zVconj123 = new RegExp(":V[123].*:[123][sp]");

///// Nom | Adjectif | Verbe
const zNVconj = new RegExp(":(?:N|[123][sp])");
const zNAVconj = new RegExp(":(?:N|A|[123][sp])");

///// Spécifique
const zNnotA = new RegExp(":N(?!:A)");
const zPNnotA = new RegExp(":(?:N(?!:A)|Q)");

///// Noms propres
const zNP = new RegExp(":(?:M[12P]|T)");
const zNPm = new RegExp(":(?:M[12P]|T):m");
const zNPf = new RegExp(":(?:M[12P]|T):f");
const zNPe = new RegExp(":(?:M[12P]|T):e");


///// FONCTIONS

function getLemmaOfMorph (sMorph) {
    return zLemma.exec(sMorph)[1];
}

function checkAgreement (l1, l2) {
    // check number agreement
    if (!mbInv(l1) && !mbInv(l2)) {
        if (mbSg(l1) && !mbSg(l2)) {
            return false;
        }
        if (mbPl(l1) && !mbPl(l2)) {
            return false;
        }
    }
    // check gender agreement
    if (mbEpi(l1) || mbEpi(l2)) {
        return true;
    }
    if (mbMas(l1) && !mbMas(l2)) {
        return false;
    }
    if (mbFem(l1) && !mbFem(l2)) {
        return false;
    }
    return true;
}

function checkConjVerb (lMorph, sReqConj) {
    return lMorph.some(s  =>  s.includes(sReqConj));
}

function getGender (lMorph) {
    // returns gender of word (':m', ':f', ':e' or empty string).
    let sGender = "";
    for (let sMorph of lMorph) {
        let m = zGender.exec(sMorph);
        if (m) {
            if (!sGender) {
                sGender = m[0];
            } else if (sGender != m[0]) {
                return ":e";
            }
        }
    }
    return sGender;
}

function getNumber (lMorph) {
    // returns number of word (':s', ':p', ':i' or empty string).
    let sNumber = "";
    for (let sMorph of lMorph) {
        let m = zNumber.exec(sWord);
        if (m) {
            if (!sNumber) {
                sNumber = m[0];
            } else if (sNumber != m[0]) {
                return ":i";
            }
        }
    }
    return sNumber;
}

// NOTE :  isWhat (lMorph)    returns true   if lMorph contains nothing else than What
//         mbWhat (lMorph)    returns true   if lMorph contains What at least once

//// isXXX = it’s certain

function isNom (lMorph) {
    return lMorph.every(s  =>  s.includes(":N"));
}

function isNomNotAdj (lMorph) {
    return lMorph.every(s  =>  zNnotA.test(s));
}

function isAdj (lMorph) {
    return lMorph.every(s  =>  s.includes(":A"));
}

function isNomAdj (lMorph) {
    return lMorph.every(s  =>  zNA.test(s));
}

function isNomVconj (lMorph) {
    return lMorph.every(s  =>  zNVconj.test(s));
}

function isInv (lMorph) {
    return lMorph.every(s  =>  s.includes(":i"));
}
function isSg (lMorph) {
    return lMorph.every(s  =>  s.includes(":s"));
}
function isPl (lMorph) {
    return lMorph.every(s  =>  s.includes(":p"));
}
function isEpi (lMorph) {
    return lMorph.every(s  =>  s.includes(":e"));
}
function isMas (lMorph) {
    return lMorph.every(s  =>  s.includes(":m"));
}
function isFem (lMorph) {
    return lMorph.every(s  =>  s.includes(":f"));
}


//// mbXXX = MAYBE XXX

function mbNom (lMorph) {
    return lMorph.some(s  =>  s.includes(":N"));
}

function mbAdj (lMorph) {
    return lMorph.some(s  =>  s.includes(":A"));
}

function mbAdjNb (lMorph) {
    return lMorph.some(s  =>  zAD.test(s));
}

function mbNomAdj (lMorph) {
    return lMorph.some(s  =>  zNA.test(s));
}

function mbNomNotAdj (lMorph) {
    let b = false;
    for (let s of lMorph) {
        if (s.includes(":A")) {
            return false;
        }
        if (s.includes(":N")) {
            b = true;
        }
    }
    return b;
}

function mbPpasNomNotAdj (lMorph) {
    return lMorph.some(s  =>  zPNnotA.test(s));
}

function mbVconj (lMorph) {
    return lMorph.some(s  =>  zVconj.test(s));
}

function mbVconj123 (lMorph) {
    return lMorph.some(s  =>  zVconj123.test(s));
}

function mbMG (lMorph) {
    return lMorph.some(s  =>  s.includes(":G"));

}















function mbInv (lMorph) {
    return lMorph.some(s  =>  s.includes(":i"));
}
function mbSg (lMorph) {
    return lMorph.some(s  =>  s.includes(":s"));
}
function mbPl (lMorph) {
    return lMorph.some(s  =>  s.includes(":p"));
}
function mbEpi (lMorph) {
    return lMorph.some(s  =>  s.includes(":e"));
}
function mbMas (lMorph) {
    return lMorph.some(s  =>  s.includes(":m"));

}
function mbFem (lMorph) {
    return lMorph.some(s  =>  s.includes(":f"));
}


function mbNpr (lMorph) {
    return lMorph.some(s  =>  zNP.test(s));
}
















function mbNprMasNotFem (lMorph) {
    if (lMorph.some(s  =>  zNPf.test(s))) {
        return false;
    }

    return lMorph.some(s  =>  zNPm.test(s));
}

























exports.getLemmaOfMorph = getLemmaOfMorph;
exports.checkAgreement = checkAgreement;
exports.checkConjVerb = checkConjVerb;
exports.getGender = getGender;
exports.getNumber = getNumber;
exports.isNom = isNom;
exports.isNomNotAdj = isNomNotAdj;
exports.isAdj = isAdj;
exports.isNomAdj = isNomAdj;
exports.isNomVconj = isNomVconj;
exports.isInv = isInv;
exports.isSg = isSg;
exports.isPl = isPl;
exports.isEpi = isEpi;
exports.isMas = isMas;
exports.isFem = isFem;
exports.mbNom = mbNom;
exports.mbAdj = mbAdj;
exports.mbAdjNb = mbAdjNb;
exports.mbNomAdj = mbNomAdj;
exports.mbNomNotAdj = mbNomNotAdj;
exports.mbPpasNomNotAdj = mbPpasNomNotAdj;
exports.mbVconj = mbVconj;
exports.mbVconj123 = mbVconj123;
exports.mbMG = mbMG;
exports.mbInv = mbInv;
exports.mbSg = mbSg;
exports.mbPl = mbPl;
exports.mbEpi = mbEpi;
exports.mbMas = mbMas;
exports.mbFem = mbFem;
exports.mbNpr = mbNpr;
exports.mbNprMasNotFem = mbNprMasNotFem;


>


>
|
|

|
|
|

|
|

|
|
|
|
|
|

|
|
|
|
|
|

|
|
|
|
|
|
|

|
|
|
|
|
|

|
|
|
|
|
|

|
|
|
|
|
|

|
|

|
|
|

|
|
|

|
|
|

|
|
|
|
|


|

|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|

|

|
|
|

|
|
|

|
|
|

|
|
|

|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|


|

|
|
|

|
|
|

|
|
|

|
|
|

|
|
|
|
|
|
|
|
|
|
|
|

|
|
|

|
|
|

|
|
|

|
|
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|
|
|
<
<
|
|
|
|
<
<
|
|
|
>
|
<
|
|
>

<
<
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|
|
|
<
>
|
<
|
|
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255


256
257
258
259


260
261
262
263
264

265
266
267
268


269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288

289
290

291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
//// Grammalecte - Compiled regular expressions
/*jslint esversion: 6*/


var cregex = {
    ///// Lemme
    _zLemma: new RegExp(">([a-zà-öø-ÿ0-9Ā-ʯ][a-zà-öø-ÿ0-9Ā-ʯ-]+)"),

    ///// Masculin / féminin / singulier / pluriel
    _zGender: new RegExp(":[mfe]"),
    _zNumber: new RegExp(":[spi]"),

    ///// Nom et adjectif
    _zNA: new RegExp(":[NA]"),

    //// nombre
    _zNAs: new RegExp(":[NA].*:s"),
    _zNAp: new RegExp(":[NA].*:p"),
    _zNAi: new RegExp(":[NA].*:i"),
    _zNAsi: new RegExp(":[NA].*:[si]"),
    _zNApi: new RegExp(":[NA].*:[pi]"),

    //// genre
    _zNAm: new RegExp(":[NA].*:m"),
    _zNAf: new RegExp(":[NA].*:f"),
    _zNAe: new RegExp(":[NA].*:e"),
    _zNAme: new RegExp(":[NA].*:[me]"),
    _zNAfe: new RegExp(":[NA].*:[fe]"),

    //// nombre et genre
    // singuilier
    _zNAms: new RegExp(":[NA].*:m.*:s"),
    _zNAfs: new RegExp(":[NA].*:f.*:s"),
    _zNAes: new RegExp(":[NA].*:e.*:s"),
    _zNAmes: new RegExp(":[NA].*:[me].*:s"),
    _zNAfes: new RegExp(":[NA].*:[fe].*:s"),

    // singulier et invariable
    _zNAmsi: new RegExp(":[NA].*:m.*:[si]"),
    _zNAfsi: new RegExp(":[NA].*:f.*:[si]"),
    _zNAesi: new RegExp(":[NA].*:e.*:[si]"),
    _zNAmesi: new RegExp(":[NA].*:[me].*:[si]"),
    _zNAfesi: new RegExp(":[NA].*:[fe].*:[si]"),

    // pluriel
    _zNAmp: new RegExp(":[NA].*:m.*:p"),
    _zNAfp: new RegExp(":[NA].*:f.*:p"),
    _zNAep: new RegExp(":[NA].*:e.*:p"),
    _zNAmep: new RegExp(":[NA].*:[me].*:p"),
    _zNAfep: new RegExp(":[NA].*:[me].*:p"),

    // pluriel et invariable
    _zNAmpi: new RegExp(":[NA].*:m.*:[pi]"),
    _zNAfpi: new RegExp(":[NA].*:f.*:[pi]"),
    _zNAepi: new RegExp(":[NA].*:e.*:[pi]"),
    _zNAmepi: new RegExp(":[NA].*:[me].*:[pi]"),
    _zNAfepi: new RegExp(":[NA].*:[fe].*:[pi]"),

    //// Divers
    _zAD: new RegExp(":[AB]"),

    ///// Verbe
    _zVconj: new RegExp(":[123][sp]"),
    _zVconj123: new RegExp(":V[123].*:[123][sp]"),

    ///// Nom | Adjectif | Verbe
    _zNVconj: new RegExp(":(?:N|[123][sp])"),
    _zNAVconj: new RegExp(":(?:N|A|[123][sp])"),

    ///// Spécifique
    _zNnotA: new RegExp(":N(?!:A)"),
    _zPNnotA: new RegExp(":(?:N(?!:A)|Q)"),

    ///// Noms propres
    _zNP: new RegExp(":(?:M[12P]|T)"),
    _zNPm: new RegExp(":(?:M[12P]|T):m"),
    _zNPf: new RegExp(":(?:M[12P]|T):f"),
    _zNPe: new RegExp(":(?:M[12P]|T):e"),


    ///// FONCTIONS

    getLemmaOfMorph: function (sMorph) {
        return this._zLemma.exec(sMorph)[1];
    },

    checkAgreement: function (l1, l2) {
        // check number agreement
        if (!this.mbInv(l1) && !this.mbInv(l2)) {
            if (this.mbSg(l1) && !this.mbSg(l2)) {
                return false;
            }
            if (this.mbPl(l1) && !this.mbPl(l2)) {
                return false;
            }
        }
        // check gender agreement
        if (this.mbEpi(l1) || this.mbEpi(l2)) {
            return true;
        }
        if (this.mbMas(l1) && !this.mbMas(l2)) {
            return false;
        }
        if (this.mbFem(l1) && !this.mbFem(l2)) {
            return false;
        }
        return true;
    },

    checkConjVerb: function (lMorph, sReqConj) {
        return lMorph.some(s  =>  s.includes(sReqConj));
    },

    getGender: function (lMorph) {
        // returns gender of word (':m', ':f', ':e' or empty string).
        let sGender = "";
        for (let sMorph of lMorph) {
            let m = this._zGender.exec(sMorph);
            if (m) {
                if (!sGender) {
                    sGender = m[0];
                } else if (sGender != m[0]) {
                    return ":e";
                }
            }
        }
        return sGender;
    },

    getNumber: function (lMorph) {
        // returns number of word (':s', ':p', ':i' or empty string).
        let sNumber = "";
        for (let sMorph of lMorph) {
            let m = this._zNumber.exec(sWord);
            if (m) {
                if (!sNumber) {
                    sNumber = m[0];
                } else if (sNumber != m[0]) {
                    return ":i";
                }
            }
        }
        return sNumber;
    },

    // NOTE :  isWhat (lMorph)    returns true   if lMorph contains nothing else than What
    //         mbWhat (lMorph)    returns true   if lMorph contains What at least once

    //// isXXX = it’s certain

    isNom: function (lMorph) {
        return lMorph.every(s  =>  s.includes(":N"));
    },

    isNomNotAdj: function (lMorph) {
        return lMorph.every(s  =>  this._zNnotA.test(s));
    },

    isAdj: function (lMorph) {
        return lMorph.every(s  =>  s.includes(":A"));
    },

    isNomAdj: function (lMorph) {
        return lMorph.every(s  =>  this._zNA.test(s));
    },

    isNomVconj: function (lMorph) {
        return lMorph.every(s  =>  this._zNVconj.test(s));
    },

    isInv: function (lMorph) {
        return lMorph.every(s  =>  s.includes(":i"));
    },
    isSg: function (lMorph) {
        return lMorph.every(s  =>  s.includes(":s"));
    },
    isPl: function (lMorph) {
        return lMorph.every(s  =>  s.includes(":p"));
    },
    isEpi: function (lMorph) {
        return lMorph.every(s  =>  s.includes(":e"));
    },
    isMas: function (lMorph) {
        return lMorph.every(s  =>  s.includes(":m"));
    },
    isFem: function (lMorph) {
        return lMorph.every(s  =>  s.includes(":f"));
    },


    //// mbXXX = MAYBE XXX

    mbNom: function (lMorph) {
        return lMorph.some(s  =>  s.includes(":N"));
    },

    mbAdj: function (lMorph) {
        return lMorph.some(s  =>  s.includes(":A"));
    },

    mbAdjNb: function (lMorph) {
        return lMorph.some(s  =>  this._zAD.test(s));
    },

    mbNomAdj: function (lMorph) {
        return lMorph.some(s  =>  this._zNA.test(s));
    },

    mbNomNotAdj: function (lMorph) {
        let b = false;
        for (let s of lMorph) {
            if (s.includes(":A")) {
                return false;
            }
            if (s.includes(":N")) {
                b = true;
            }
        }
        return b;
    },

    mbPpasNomNotAdj: function (lMorph) {
        return lMorph.some(s  =>  this._zPNnotA.test(s));
    },

    mbVconj: function (lMorph) {
        return lMorph.some(s  =>  this._zVconj.test(s));
    },

    mbVconj123: function (lMorph) {
        return lMorph.some(s  =>  this._zVconj123.test(s));
    },

    mbMG: function (lMorph) {
        return lMorph.some(s  =>  s.includes(":G"));
    },

    mbInv: function (lMorph) {
        return lMorph.some(s  =>  s.includes(":i"));
    },
    mbSg: function (lMorph) {
        return lMorph.some(s  =>  s.includes(":s"));
    },
    mbPl: function (lMorph) {
        return lMorph.some(s  =>  s.includes(":p"));
    },
    mbEpi: function (lMorph) {
        return lMorph.some(s  =>  s.includes(":e"));
    },
    mbMas: function (lMorph) {
        return lMorph.some(s  =>  s.includes(":m"));
    },
    mbFem: function (lMorph) {
        return lMorph.some(s  =>  s.includes(":f"));
    },



    mbNpr: function (lMorph) {
        return lMorph.some(s  =>  this._zNP.test(s));
    },



    mbNprMasNotFem: function (lMorph) {
        if (lMorph.some(s  =>  this._zNPf.test(s))) {
            return false;
        }

        return lMorph.some(s  =>  this._zNPm.test(s));
    }
};




if (typeof(exports) !== 'undefined') {
    exports._zLemma = cregex._zLemma;
    exports._zGender = cregex._zGender;
    exports._zNumber = cregex._zNumber;
    exports._zNA = cregex._zNA;
    exports._zNAs = cregex._zNAs;
    exports._zNAp = cregex._zNAp;
    exports._zNAi = cregex._zNAi;
    exports._zNAsi = cregex._zNAsi;
    exports._zNApi = cregex._zNApi;
    exports._zNAm = cregex._zNAm;
    exports._zNAf = cregex._zNAf;
    exports._zNAe = cregex._zNAe;
    exports._zNAme = cregex._zNAme;
    exports._zNAfe = cregex._zNAfe;
    exports._zNAms = cregex._zNAms;
    exports._zNAfs = cregex._zNAfs;
    exports._zNAes = cregex._zNAes;
    exports._zNAmes = cregex._zNAmes;

    exports._zNAfes = cregex._zNAfes;
    exports._zNAmsi = cregex._zNAmsi;

    exports._zNAfsi = cregex._zNAfsi;
    exports._zNAesi = cregex._zNAesi;
    exports._zNAmesi = cregex._zNAmesi;
    exports._zNAfesi = cregex._zNAfesi;
    exports._zNAmp = cregex._zNAmp;
    exports._zNAfp = cregex._zNAfp;
    exports._zNAep = cregex._zNAep;
    exports._zNAmep = cregex._zNAmep;
    exports._zNAfep = cregex._zNAfep;
    exports._zNAmpi = cregex._zNAmpi;
    exports._zNAfpi = cregex._zNAfpi;
    exports._zNAepi = cregex._zNAepi;
    exports._zNAmepi = cregex._zNAmepi;
    exports._zNAfepi = cregex._zNAfepi;
    exports._zAD = cregex._zAD;
    exports._zVconj = cregex._zVconj;
    exports._zVconj123 = cregex._zVconj123;
    exports._zNVconj = cregex._zNVconj;
    exports._zNAVconj = cregex._zNAVconj;
    exports._zNnotA = cregex._zNnotA;
    exports._zPNnotA = cregex._zPNnotA;
    exports._zNP = cregex._zNP;
    exports._zNPm = cregex._zNPm;
    exports._zNPf = cregex._zNPf;
    exports._zNPe = cregex._zNPe;
    exports.getLemmaOfMorph = cregex.getLemmaOfMorph;
    exports.checkAgreement = cregex.checkAgreement;
    exports.checkConjVerb = cregex.checkConjVerb;
    exports.getGender = cregex.getGender;
    exports.getNumber = cregex.getNumber;
    exports.isNom = cregex.isNom;
    exports.isNomNotAdj = cregex.isNomNotAdj;
    exports.isAdj = cregex.isAdj;
    exports.isNomAdj = cregex.isNomAdj;
    exports.isNomVconj = cregex.isNomVconj;
    exports.isInv = cregex.isInv;
    exports.isSg = cregex.isSg;
    exports.isPl = cregex.isPl;
    exports.isEpi = cregex.isEpi;
    exports.isMas = cregex.isMas;
    exports.isFem = cregex.isFem;
    exports.mbNom = cregex.mbNom;
    exports.mbAdj = cregex.mbAdj;
    exports.mbAdjNb = cregex.mbAdjNb;
    exports.mbNomAdj = cregex.mbNomAdj;
    exports.mbNomNotAdj = cregex.mbNomNotAdj;
    exports.mbPpasNomNotAdj = cregex.mbPpasNomNotAdj;
    exports.mbVconj = cregex.mbVconj;
    exports.mbVconj123 = cregex.mbVconj123;
    exports.mbMG = cregex.mbMG;
    exports.mbInv = cregex.mbInv;
    exports.mbSg = cregex.mbSg;
    exports.mbPl = cregex.mbPl;
    exports.mbEpi = cregex.mbEpi;
    exports.mbMas = cregex.mbMas;
    exports.mbFem = cregex.mbFem;
    exports.mbNpr = cregex.mbNpr;
    exports.mbNprMasNotFem = cregex.mbNprMasNotFem;
}

Modified gc_lang/fr/modules-js/gce_analyseur.js from [7588af7481] to [e2613ddcd2].

1

2
3
4
5
6
7
8
//// GRAMMAR CHECKING ENGINE PLUGIN: Parsing functions for French language


function rewriteSubject (s1, s2) {
    // s1 is supposed to be prn/patr/npr (M[12P])
    if (s2 == "lui") {
        return "ils";
    }
    if (s2 == "moi") {

>







1
2
3
4
5
6
7
8
9
//// GRAMMAR CHECKING ENGINE PLUGIN: Parsing functions for French language
/*jslint esversion: 6*/

function rewriteSubject (s1, s2) {
    // s1 is supposed to be prn/patr/npr (M[12P])
    if (s2 == "lui") {
        return "ils";
    }
    if (s2 == "moi") {
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
        return "vous";
    }
    if (s2 == "eux") {
        return "ils";
    }
    if (s2 == "elle" || s2 == "elles") {
        // We don’t check if word exists in _dAnalyses, for it is assumed it has been done before
        if (cr.mbNprMasNotFem(_dAnalyses._get(s1, ""))) {
            return "ils";
        }
        // si épicène, indéterminable, mais OSEF, le féminin l’emporte
        return "elles";
    }
    return s1 + " et " + s2;
}

function apposition (sWord1, sWord2) {
    // returns true if nom + nom (no agreement required)
    // We don’t check if word exists in _dAnalyses, for it is assumed it has been done before
    return cr.mbNomNotAdj(_dAnalyses._get(sWord2, "")) && cr.mbPpasNomNotAdj(_dAnalyses._get(sWord1, ""));
}

function isAmbiguousNAV (sWord) {
    // words which are nom|adj and verb are ambiguous (except être and avoir)
    if (!_dAnalyses.has(sWord) && !_storeMorphFromFSA(sWord)) {
        return false;
    }
    if (!cr.mbNomAdj(_dAnalyses._get(sWord, "")) || sWord == "est") {
        return false;
    }
    if (cr.mbVconj(_dAnalyses._get(sWord, "")) && !cr.mbMG(_dAnalyses._get(sWord, ""))) {
        return true;
    }
    return false;
}

function isAmbiguousAndWrong (sWord1, sWord2, sReqMorphNA, sReqMorphConj) {
    //// use it if sWord1 won’t be a verb; word2 is assumed to be true via isAmbiguousNAV
    // We don’t check if word exists in _dAnalyses, for it is assumed it has been done before
    let a2 = _dAnalyses._get(sWord2, null);
    if (!a2 || a2.length === 0) {
        return false;
    }
    if (cr.checkConjVerb(a2, sReqMorphConj)) {
        // verb word2 is ok
        return false;
    }
    let a1 = _dAnalyses._get(sWord1, null);
    if (!a1 || a1.length === 0) {
        return false;
    }
    if (cr.checkAgreement(a1, a2) && (cr.mbAdj(a2) || cr.mbAdj(a1))) {
        return false;
    }
    return true;
}

function isVeryAmbiguousAndWrong (sWord1, sWord2, sReqMorphNA, sReqMorphConj, bLastHopeCond) {
    //// use it if sWord1 can be also a verb; word2 is assumed to be true via isAmbiguousNAV
    // We don’t check if word exists in _dAnalyses, for it is assumed it has been done before
    let a2 = _dAnalyses._get(sWord2, null)
    if (!a2 || a2.length === 0) {
        return false;
    }
    if (cr.checkConjVerb(a2, sReqMorphConj)) {
        // verb word2 is ok
        return false;
    }
    let a1 = _dAnalyses._get(sWord1, null);
    if (!a1 || a1.length === 0) {
        return false;
    }
    if (cr.checkAgreement(a1, a2) && (cr.mbAdj(a2) || cr.mbAdjNb(a1))) {
        return false;
    }
    // now, we know there no agreement, and conjugation is also wrong
    if (cr.isNomAdj(a1)) {
        return true;
    }
    //if cr.isNomAdjVerb(a1): # considered true
    if (bLastHopeCond) {
        return true;
    }
    return false;
}

function checkAgreement (sWord1, sWord2) {
    // We don’t check if word exists in _dAnalyses, for it is assumed it has been done before
    let a2 = _dAnalyses._get(sWord2, null)
    if (!a2 || a2.length === 0) {
        return true;
    }
    let a1 = _dAnalyses._get(sWord1, null);
    if (!a1 || a1.length === 0) {
        return true;
    }
    return cr.checkAgreement(a1, a2);
}

function mbUnit (s) {
    if (/[µ\/⁰¹²³⁴⁵⁶⁷⁸⁹Ωℓ·]/.test(s)) {
        return true;
    }
    if (s.length > 1 && s.length < 16 && s.slice(0, 1)._isLowerCase() && (!s.slice(1)._isLowerCase() || /[0-9]/.test(s))) {
        return true;
    }
    return false;
}


//// Syntagmes

const _zEndOfNG1 = new RegExp ("^ *$|^ +(?:, +|)(?:n(?:’|e |o(?:u?s|tre) )|l(?:’|e(?:urs?|s|) |a )|j(?:’|e )|m(?:’|es? |a |on )|t(?:’|es? |a |u )|s(?:’|es? |a )|c(?:’|e(?:t|tte|s|) )|ç(?:a |’)|ils? |vo(?:u?s|tre) )");
const _zEndOfNG2 = new RegExp ("^ +([a-zà-öA-Zø-ÿÀ-Ö0-9_Ø-ßĀ-ʯ][a-zà-öA-Zø-ÿÀ-Ö0-9_Ø-ßĀ-ʯ-]+)");
const _zEndOfNG3 = new RegExp ("^ *, +([a-zà-öA-Zø-ÿÀ-Ö0-9_Ø-ßĀ-ʯ][a-zà-öA-Zø-ÿÀ-Ö0-9_Ø-ßĀ-ʯ-]+)");

function isEndOfNG (dDA, s, iOffset) {
    if (_zEndOfNG1.test(s)) {
        return true;
    }
    let m = _zEndOfNG2._exec2(s, ["$"]);
    if (m && morphex(dDA, [iOffset+m.start[1], m[1]], ":[VR]", ":[NAQP]")) {
        return true;
    }
    m = _zEndOfNG3._exec2(s, ["$"]);
    if (m && !morph(dDA, [iOffset+m.start[1], m[1]], ":[NA]", false)) {
        return true;
    }
    return false;
}


const _zNextIsNotCOD1 = new RegExp ("^ *,");
const _zNextIsNotCOD2 = new RegExp ("^ +(?:[mtsnj](e +|’)|[nv]ous |tu |ils? |elles? )");
const _zNextIsNotCOD3 = new RegExp ("^ +([a-zéèî][a-zà-öA-Zø-ÿÀ-ÖØ-ßĀ-ʯ-]+)");

function isNextNotCOD (dDA, s, iOffset) {
    if (_zNextIsNotCOD1.test(s) || _zNextIsNotCOD2.test(s)) {
        return true;
    }
    let m = _zNextIsNotCOD3._exec2(s, ["$"]);
    if (m && morphex(dDA, [iOffset+m.start[1], m[1]], ":[123][sp]", ":[DM]")) {
        return true;
    }
    return false;
}


const _zNextIsVerb1 = new RegExp ("^ +[nmts](?:e |’)");
const _zNextIsVerb2 = new RegExp ("^ +([a-zà-öA-Zø-ÿÀ-Ö0-9_Ø-ßĀ-ʯ][a-zà-öA-Zø-ÿÀ-Ö0-9_Ø-ßĀ-ʯ-]+)");

function isNextVerb (dDA, s, iOffset) {
    if (_zNextIsVerb1.test(s)) {
        return true;
    }
    let m = _zNextIsVerb2._exec2(s, ["$"]);
    if (m && morph(dDA, [iOffset+m.start[1], m[1]], ":[123][sp]", false)) {
        return true;
    }
    return false;
}


//// Exceptions

const aREGULARPLURAL = new Set(["abricot", "amarante", "aubergine", "acajou", "anthracite", "brique", "caca", "café",
                                "carotte", "cerise", "chataigne", "corail", "citron", "crème", "grave", "groseille",
                                "jonquille", "marron", "olive", "pervenche", "prune", "sable"]);
const aSHOULDBEVERB = new Set(["aller", "manger"]);







|











|







|


|








|



|



|



|








|



|



|



|



|


|








|



|



|






|
















|



|















|














|













19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
        return "vous";
    }
    if (s2 == "eux") {
        return "ils";
    }
    if (s2 == "elle" || s2 == "elles") {
        // We don’t check if word exists in _dAnalyses, for it is assumed it has been done before
        if (cregex.mbNprMasNotFem(_dAnalyses.gl_get(s1, ""))) {
            return "ils";
        }
        // si épicène, indéterminable, mais OSEF, le féminin l’emporte
        return "elles";
    }
    return s1 + " et " + s2;
}

function apposition (sWord1, sWord2) {
    // returns true if nom + nom (no agreement required)
    // We don’t check if word exists in _dAnalyses, for it is assumed it has been done before
    return cregex.mbNomNotAdj(_dAnalyses.gl_get(sWord2, "")) && cregex.mbPpasNomNotAdj(_dAnalyses.gl_get(sWord1, ""));
}

function isAmbiguousNAV (sWord) {
    // words which are nom|adj and verb are ambiguous (except être and avoir)
    if (!_dAnalyses.has(sWord) && !_storeMorphFromFSA(sWord)) {
        return false;
    }
    if (!cregex.mbNomAdj(_dAnalyses.gl_get(sWord, "")) || sWord == "est") {
        return false;
    }
    if (cregex.mbVconj(_dAnalyses.gl_get(sWord, "")) && !cregex.mbMG(_dAnalyses.gl_get(sWord, ""))) {
        return true;
    }
    return false;
}

function isAmbiguousAndWrong (sWord1, sWord2, sReqMorphNA, sReqMorphConj) {
    //// use it if sWord1 won’t be a verb; word2 is assumed to be true via isAmbiguousNAV
    // We don’t check if word exists in _dAnalyses, for it is assumed it has been done before
    let a2 = _dAnalyses.gl_get(sWord2, null);
    if (!a2 || a2.length === 0) {
        return false;
    }
    if (cregex.checkConjVerb(a2, sReqMorphConj)) {
        // verb word2 is ok
        return false;
    }
    let a1 = _dAnalyses.gl_get(sWord1, null);
    if (!a1 || a1.length === 0) {
        return false;
    }
    if (cregex.checkAgreement(a1, a2) && (cregex.mbAdj(a2) || cregex.mbAdj(a1))) {
        return false;
    }
    return true;
}

function isVeryAmbiguousAndWrong (sWord1, sWord2, sReqMorphNA, sReqMorphConj, bLastHopeCond) {
    //// use it if sWord1 can be also a verb; word2 is assumed to be true via isAmbiguousNAV
    // We don’t check if word exists in _dAnalyses, for it is assumed it has been done before
    let a2 = _dAnalyses.gl_get(sWord2, null);
    if (!a2 || a2.length === 0) {
        return false;
    }
    if (cregex.checkConjVerb(a2, sReqMorphConj)) {
        // verb word2 is ok
        return false;
    }
    let a1 = _dAnalyses.gl_get(sWord1, null);
    if (!a1 || a1.length === 0) {
        return false;
    }
    if (cregex.checkAgreement(a1, a2) && (cregex.mbAdj(a2) || cregex.mbAdjNb(a1))) {
        return false;
    }
    // now, we know there no agreement, and conjugation is also wrong
    if (cregex.isNomAdj(a1)) {
        return true;
    }
    //if cregex.isNomAdjVerb(a1): # considered true
    if (bLastHopeCond) {
        return true;
    }
    return false;
}

function checkAgreement (sWord1, sWord2) {
    // We don’t check if word exists in _dAnalyses, for it is assumed it has been done before
    let a2 = _dAnalyses.gl_get(sWord2, null);
    if (!a2 || a2.length === 0) {
        return true;
    }
    let a1 = _dAnalyses.gl_get(sWord1, null);
    if (!a1 || a1.length === 0) {
        return true;
    }
    return cregex.checkAgreement(a1, a2);
}

function mbUnit (s) {
    if (/[µ\/⁰¹²³⁴⁵⁶⁷⁸⁹Ωℓ·]/.test(s)) {
        return true;
    }
    if (s.length > 1 && s.length < 16 && s.slice(0, 1).gl_isLowerCase() && (!s.slice(1).gl_isLowerCase() || /[0-9]/.test(s))) {
        return true;
    }
    return false;
}


//// Syntagmes

const _zEndOfNG1 = new RegExp ("^ *$|^ +(?:, +|)(?:n(?:’|e |o(?:u?s|tre) )|l(?:’|e(?:urs?|s|) |a )|j(?:’|e )|m(?:’|es? |a |on )|t(?:’|es? |a |u )|s(?:’|es? |a )|c(?:’|e(?:t|tte|s|) )|ç(?:a |’)|ils? |vo(?:u?s|tre) )");
const _zEndOfNG2 = new RegExp ("^ +([a-zà-öA-Zø-ÿÀ-Ö0-9_Ø-ßĀ-ʯ][a-zà-öA-Zø-ÿÀ-Ö0-9_Ø-ßĀ-ʯ-]+)");
const _zEndOfNG3 = new RegExp ("^ *, +([a-zà-öA-Zø-ÿÀ-Ö0-9_Ø-ßĀ-ʯ][a-zà-öA-Zø-ÿÀ-Ö0-9_Ø-ßĀ-ʯ-]+)");

function isEndOfNG (dDA, s, iOffset) {
    if (_zEndOfNG1.test(s)) {
        return true;
    }
    let m = _zEndOfNG2.gl_exec2(s, ["$"]);
    if (m && morphex(dDA, [iOffset+m.start[1], m[1]], ":[VR]", ":[NAQP]")) {
        return true;
    }
    m = _zEndOfNG3.gl_exec2(s, ["$"]);
    if (m && !morph(dDA, [iOffset+m.start[1], m[1]], ":[NA]", false)) {
        return true;
    }
    return false;
}


const _zNextIsNotCOD1 = new RegExp ("^ *,");
const _zNextIsNotCOD2 = new RegExp ("^ +(?:[mtsnj](e +|’)|[nv]ous |tu |ils? |elles? )");
const _zNextIsNotCOD3 = new RegExp ("^ +([a-zéèî][a-zà-öA-Zø-ÿÀ-ÖØ-ßĀ-ʯ-]+)");

function isNextNotCOD (dDA, s, iOffset) {
    if (_zNextIsNotCOD1.test(s) || _zNextIsNotCOD2.test(s)) {
        return true;
    }
    let m = _zNextIsNotCOD3.gl_exec2(s, ["$"]);
    if (m && morphex(dDA, [iOffset+m.start[1], m[1]], ":[123][sp]", ":[DM]")) {
        return true;
    }
    return false;
}


const _zNextIsVerb1 = new RegExp ("^ +[nmts](?:e |’)");
const _zNextIsVerb2 = new RegExp ("^ +([a-zà-öA-Zø-ÿÀ-Ö0-9_Ø-ßĀ-ʯ][a-zà-öA-Zø-ÿÀ-Ö0-9_Ø-ßĀ-ʯ-]+)");

function isNextVerb (dDA, s, iOffset) {
    if (_zNextIsVerb1.test(s)) {
        return true;
    }
    let m = _zNextIsVerb2.gl_exec2(s, ["$"]);
    if (m && morph(dDA, [iOffset+m.start[1], m[1]], ":[123][sp]", false)) {
        return true;
    }
    return false;
}


//// Exceptions

const aREGULARPLURAL = new Set(["abricot", "amarante", "aubergine", "acajou", "anthracite", "brique", "caca", "café",
                                "carotte", "cerise", "chataigne", "corail", "citron", "crème", "grave", "groseille",
                                "jonquille", "marron", "olive", "pervenche", "prune", "sable"]);
const aSHOULDBEVERB = new Set(["aller", "manger"]);

Modified gc_lang/fr/modules-js/gce_date_verif.js from [de4d3b5e04] to [f30dbe242e].

1

2
3
4
5
6
7
8
//// GRAMMAR CHECKING ENGINE PLUGIN


// Check date validity

// WARNING: when creating a Date, month must be between 0 and 11


const _lDay = ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"];

>







1
2
3
4
5
6
7
8
9
//// GRAMMAR CHECKING ENGINE PLUGIN
/*jslint esversion: 6*/

// Check date validity

// WARNING: when creating a Date, month must be between 0 and 11


const _lDay = ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"];

Modified gc_lang/fr/modules-js/gce_suggestions.js from [66a9ce5ee4] to [0d3c06e52f].

1


2

3
4
5

6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//// GRAMMAR CHECKING ENGINE PLUGIN: Suggestion mechanisms




const conj = require("resource://grammalecte/fr/conj.js");
const mfsp = require("resource://grammalecte/fr/mfsp.js");
const phonet = require("resource://grammalecte/fr/phonet.js");



//// verbs

function suggVerb (sFlex, sWho, funcSugg2=null) {
    // we don’t check if word exists in _dAnalyses, for it is assumed it has been done before
    let aSugg = new Set();
    for (let sStem of stem(sFlex)) {
        let tTags = conj._getTags(sStem);
        if (tTags) {
            // we get the tense
            let aTense = new Set();
            for (let sMorph of _dAnalyses._get(sFlex, [])) {
                let m;
                let zVerb = new RegExp (sStem+" .*?(:(?:Y|I[pqsf]|S[pq]|K))", "g");
                while (m = zVerb.exec(sMorph)) {
                    // stem must be used in regex to prevent confusion between different verbs (e.g. sauras has 2 stems: savoir and saurer)
                    if (m) {
                        if (m[1] === ":Y") {
                            aTense.add(":Ip");
                            aTense.add(":Iq");
                            aTense.add(":Is");
                        } else if (m[1] === ":P") {

>
>

>
|
|
|
>












|

|
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//// GRAMMAR CHECKING ENGINE PLUGIN: Suggestion mechanisms
/*jslint esversion: 6*/
/*global require*/

if (typeof(require) !== 'undefined') {
    var conj = require("resource://grammalecte/fr/conj.js");
    var mfsp = require("resource://grammalecte/fr/mfsp.js");
    var phonet = require("resource://grammalecte/fr/phonet.js");
}


//// verbs

function suggVerb (sFlex, sWho, funcSugg2=null) {
    // we don’t check if word exists in _dAnalyses, for it is assumed it has been done before
    let aSugg = new Set();
    for (let sStem of stem(sFlex)) {
        let tTags = conj._getTags(sStem);
        if (tTags) {
            // we get the tense
            let aTense = new Set();
            for (let sMorph of _dAnalyses.gl_get(sFlex, [])) {
                let m;
                let zVerb = new RegExp (">"+sStem+" .*?(:(?:Y|I[pqsf]|S[pq]|K))", "g");
                while ((m = zVerb.exec(sMorph)) !== null) {
                    // stem must be used in regex to prevent confusion between different verbs (e.g. sauras has 2 stems: savoir and saurer)
                    if (m) {
                        if (m[1] === ":Y") {
                            aTense.add(":Ip");
                            aTense.add(":Iq");
                            aTense.add(":Is");
                        } else if (m[1] === ":P") {
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
    if (aSugg.size > 0) {
        return Array.from(aSugg).join("|");
    }
    return "";
}

function suggVerbInfi (sFlex) {
    //return stem(sFlex).join("|");
    return [ for (sStem of stem(sFlex)) if (conj.isVerb(sStem)) sStem ].join("|");
}


const _dQuiEst = new Map ([
    ["je", ":1s"], ["j’", ":1s"], ["j’en", ":1s"], ["j’y", ":1s"],
    ["tu", ":2s"], ["il", ":3s"], ["on", ":3s"], ["elle", ":3s"],
    ["nous", ":1p"], ["vous", ":2p"], ["ils", ":3p"], ["elles", ":3p"]







|
<







141
142
143
144
145
146
147
148

149
150
151
152
153
154
155
    if (aSugg.size > 0) {
        return Array.from(aSugg).join("|");
    }
    return "";
}

function suggVerbInfi (sFlex) {
    return stem(sFlex).filter(sStem => conj.isVerb(sStem)).join("|");

}


const _dQuiEst = new Map ([
    ["je", ":1s"], ["j’", ":1s"], ["j’en", ":1s"], ["j’y", ":1s"],
    ["tu", ":2s"], ["il", ":3s"], ["on", ":3s"], ["elle", ":3s"],
    ["nous", ":1p"], ["vous", ":2p"], ["ils", ":3p"], ["elles", ":3p"]
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
    } else if (cMode == ":S") {
        lMode = _lSubjonctif;
    } else if (cMode.startsWith(":I") || cMode.startsWith(":S")) {
        lMode = [cMode];
    } else {
        return "";
    }
    let sWho = _dQuiEst._get(sSuj.toLowerCase(), null);
    if (!sWho) {
        if (sSuj[0]._isLowerCase()) { // pas un pronom, ni un nom propre
            return "";
        }
        sWho = ":3s";
    }
    let aSugg = new Set();
    for (let sStem of stem(sFlex)) {
        let tTags = conj._getTags(sStem);







|

|







164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
    } else if (cMode == ":S") {
        lMode = _lSubjonctif;
    } else if (cMode.startsWith(":I") || cMode.startsWith(":S")) {
        lMode = [cMode];
    } else {
        return "";
    }
    let sWho = _dQuiEst.gl_get(sSuj.toLowerCase(), null);
    if (!sWho) {
        if (sSuj[0].gl_isLowerCase()) { // pas un pronom, ni un nom propre
            return "";
        }
        sWho = ":3s";
    }
    let aSugg = new Set();
    for (let sStem of stem(sFlex)) {
        let tTags = conj._getTags(sStem);
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207

function suggPlur (sFlex, sWordToAgree=null) {
    // returns plural forms assuming sFlex is singular
    if (sWordToAgree) {
        if (!_dAnalyses.has(sWordToAgree) && !_storeMorphFromFSA(sWordToAgree)) {
            return "";
        }
        let sGender = cr.getGender(_dAnalyses._get(sWordToAgree, []));
        if (sGender == ":m") {
            return suggMasPlur(sFlex);
        } else if (sGender == ":f") {
            return suggFemPlur(sFlex);
        }
    }
    let aSugg = new Set();







|







196
197
198
199
200
201
202
203
204
205
206
207
208
209
210

function suggPlur (sFlex, sWordToAgree=null) {
    // returns plural forms assuming sFlex is singular
    if (sWordToAgree) {
        if (!_dAnalyses.has(sWordToAgree) && !_storeMorphFromFSA(sWordToAgree)) {
            return "";
        }
        let sGender = cregex.getGender(_dAnalyses.gl_get(sWordToAgree, []));
        if (sGender == ":m") {
            return suggMasPlur(sFlex);
        } else if (sGender == ":f") {
            return suggFemPlur(sFlex);
        }
    }
    let aSugg = new Set();
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
    return "";
}

function suggMasSing (sFlex, bSuggSimil=false) {
    // returns masculine singular forms
    // we don’t check if word exists in _dAnalyses, for it is assumed it has been done before
    let aSugg = new Set();
    for (let sMorph of _dAnalyses._get(sFlex, [])) {
        if (!sMorph.includes(":V")) {
            // not a verb
            if (sMorph.includes(":m") || sMorph.includes(":e")) {
                aSugg.add(suggSing(sFlex));
            } else {
                let sStem = cr.getLemmaOfMorph(sMorph);
                if (mfsp.isFemForm(sStem)) {
                    mfsp.getMasForm(sStem, false).forEach(function(x) { aSugg.add(x); });
                }
            }
        } else {
            // a verb
            let sVerb = cr.getLemmaOfMorph(sMorph);
            if (conj.hasConj(sVerb, ":PQ", ":Q1") && conj.hasConj(sVerb, ":PQ", ":Q3")) {
                // We also check if the verb has a feminine form.
                // If not, we consider it’s better to not suggest the masculine one, as it can be considered invariable.
                aSugg.add(conj.getConj(sVerb, ":PQ", ":Q1"));
            }
        }
    }







|





|






|







256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
    return "";
}

function suggMasSing (sFlex, bSuggSimil=false) {
    // returns masculine singular forms
    // we don’t check if word exists in _dAnalyses, for it is assumed it has been done before
    let aSugg = new Set();
    for (let sMorph of _dAnalyses.gl_get(sFlex, [])) {
        if (!sMorph.includes(":V")) {
            // not a verb
            if (sMorph.includes(":m") || sMorph.includes(":e")) {
                aSugg.add(suggSing(sFlex));
            } else {
                let sStem = cregex.getLemmaOfMorph(sMorph);
                if (mfsp.isFemForm(sStem)) {
                    mfsp.getMasForm(sStem, false).forEach(function(x) { aSugg.add(x); });
                }
            }
        } else {
            // a verb
            let sVerb = cregex.getLemmaOfMorph(sMorph);
            if (conj.hasConj(sVerb, ":PQ", ":Q1") && conj.hasConj(sVerb, ":PQ", ":Q3")) {
                // We also check if the verb has a feminine form.
                // If not, we consider it’s better to not suggest the masculine one, as it can be considered invariable.
                aSugg.add(conj.getConj(sVerb, ":PQ", ":Q1"));
            }
        }
    }
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
    return "";
}

function suggMasPlur (sFlex, bSuggSimil=false) {
    // returns masculine plural forms
    // we don’t check if word exists in _dAnalyses, for it is assumed it has been done before
    let aSugg = new Set();
    for (let sMorph of _dAnalyses._get(sFlex, [])) {
        if (!sMorph.includes(":V")) {
            // not a verb
            if (sMorph.includes(":m") || sMorph.includes(":e")) {
                aSugg.add(suggPlur(sFlex));
            } else {
                let sStem = cr.getLemmaOfMorph(sMorph);
                if (mfsp.isFemForm(sStem)) {
                    mfsp.getMasForm(sStem, true).forEach(function(x) { aSugg.add(x); });
                }
            }
        } else {
            // a verb
            let sVerb = cr.getLemmaOfMorph(sMorph);
            if (conj.hasConj(sVerb, ":PQ", ":Q2")) {
                aSugg.add(conj.getConj(sVerb, ":PQ", ":Q2"));
            } else if (conj.hasConj(sVerb, ":PQ", ":Q1")) {
                let sSugg = conj.getConj(sVerb, ":PQ", ":Q1");
                // it is necessary to filter these flexions, like “succédé” or “agi” that are not masculine plural
                if (sSugg.endsWith("s")) {
                    aSugg.add(sSugg);







|





|






|







292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
    return "";
}

function suggMasPlur (sFlex, bSuggSimil=false) {
    // returns masculine plural forms
    // we don’t check if word exists in _dAnalyses, for it is assumed it has been done before
    let aSugg = new Set();
    for (let sMorph of _dAnalyses.gl_get(sFlex, [])) {
        if (!sMorph.includes(":V")) {
            // not a verb
            if (sMorph.includes(":m") || sMorph.includes(":e")) {
                aSugg.add(suggPlur(sFlex));
            } else {
                let sStem = cregex.getLemmaOfMorph(sMorph);
                if (mfsp.isFemForm(sStem)) {
                    mfsp.getMasForm(sStem, true).forEach(function(x) { aSugg.add(x); });
                }
            }
        } else {
            // a verb
            let sVerb = cregex.getLemmaOfMorph(sMorph);
            if (conj.hasConj(sVerb, ":PQ", ":Q2")) {
                aSugg.add(conj.getConj(sVerb, ":PQ", ":Q2"));
            } else if (conj.hasConj(sVerb, ":PQ", ":Q1")) {
                let sSugg = conj.getConj(sVerb, ":PQ", ":Q1");
                // it is necessary to filter these flexions, like “succédé” or “agi” that are not masculine plural
                if (sSugg.endsWith("s")) {
                    aSugg.add(sSugg);
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
}


function suggFemSing (sFlex, bSuggSimil=false) {
    // returns feminine singular forms
    // we don’t check if word exists in _dAnalyses, for it is assumed it has been done before
    let aSugg = new Set();
    for (let sMorph of _dAnalyses._get(sFlex, [])) {
        if (!sMorph.includes(":V")) {
            // not a verb
            if (sMorph.includes(":f") || sMorph.includes(":e")) {
                aSugg.add(suggSing(sFlex));
            } else {
                let sStem = cr.getLemmaOfMorph(sMorph);
                if (mfsp.isFemForm(sStem)) {
                    aSugg.add(sStem);
                }
            }
        } else {
            // a verb
            let sVerb = cr.getLemmaOfMorph(sMorph);
            if (conj.hasConj(sVerb, ":PQ", ":Q3")) {
                aSugg.add(conj.getConj(sVerb, ":PQ", ":Q3"));
            }
        }
    }
    if (bSuggSimil) {
        for (let e of phonet.selectSimil(sFlex, ":f:[si]")) {
            aSugg.add(e);
        }
    }
    if (aSugg.size > 0) {
        return Array.from(aSugg).join("|");
    }
    return "";
}

function suggFemPlur (sFlex, bSuggSimil=false) {
    // returns feminine plural forms
    // we don’t check if word exists in _dAnalyses, for it is assumed it has been done before
    let aSugg = new Set();
    for (let sMorph of _dAnalyses._get(sFlex, [])) {
        if (!sMorph.includes(":V")) {
            // not a verb
            if (sMorph.includes(":f") || sMorph.includes(":e")) {
                aSugg.add(suggPlur(sFlex));
            } else {
                let sStem = cr.getLemmaOfMorph(sMorph);
                if (mfsp.isFemForm(sStem)) {
                    aSugg.add(sStem+"s");
                }
            }
        } else {
            // a verb
            let sVerb = cr.getLemmaOfMorph(sMorph);
            if (conj.hasConj(sVerb, ":PQ", ":Q4")) {
                aSugg.add(conj.getConj(sVerb, ":PQ", ":Q4"));
            }
        }
    }
    if (bSuggSimil) {
        for (let e of phonet.selectSimil(sFlex, ":f:[pi]")) {







|





|






|




















|





|






|







333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
}


function suggFemSing (sFlex, bSuggSimil=false) {
    // returns feminine singular forms
    // we don’t check if word exists in _dAnalyses, for it is assumed it has been done before
    let aSugg = new Set();
    for (let sMorph of _dAnalyses.gl_get(sFlex, [])) {
        if (!sMorph.includes(":V")) {
            // not a verb
            if (sMorph.includes(":f") || sMorph.includes(":e")) {
                aSugg.add(suggSing(sFlex));
            } else {
                let sStem = cregex.getLemmaOfMorph(sMorph);
                if (mfsp.isFemForm(sStem)) {
                    aSugg.add(sStem);
                }
            }
        } else {
            // a verb
            let sVerb = cregex.getLemmaOfMorph(sMorph);
            if (conj.hasConj(sVerb, ":PQ", ":Q3")) {
                aSugg.add(conj.getConj(sVerb, ":PQ", ":Q3"));
            }
        }
    }
    if (bSuggSimil) {
        for (let e of phonet.selectSimil(sFlex, ":f:[si]")) {
            aSugg.add(e);
        }
    }
    if (aSugg.size > 0) {
        return Array.from(aSugg).join("|");
    }
    return "";
}

function suggFemPlur (sFlex, bSuggSimil=false) {
    // returns feminine plural forms
    // we don’t check if word exists in _dAnalyses, for it is assumed it has been done before
    let aSugg = new Set();
    for (let sMorph of _dAnalyses.gl_get(sFlex, [])) {
        if (!sMorph.includes(":V")) {
            // not a verb
            if (sMorph.includes(":f") || sMorph.includes(":e")) {
                aSugg.add(suggPlur(sFlex));
            } else {
                let sStem = cregex.getLemmaOfMorph(sMorph);
                if (mfsp.isFemForm(sStem)) {
                    aSugg.add(sStem+"s");
                }
            }
        } else {
            // a verb
            let sVerb = cregex.getLemmaOfMorph(sMorph);
            if (conj.hasConj(sVerb, ":PQ", ":Q4")) {
                aSugg.add(conj.getConj(sVerb, ":PQ", ":Q4"));
            }
        }
    }
    if (bSuggSimil) {
        for (let e of phonet.selectSimil(sFlex, ":f:[pi]")) {
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
    return false;
}

function switchGender (sFlex, bPlur=null) {
    // we don’t check if word exists in _dAnalyses, for it is assumed it has been done before
    let aSugg = new Set();
    if (bPlur === null) {
        for (let sMorph of _dAnalyses._get(sFlex, [])) {
            if (sMorph.includes(":f")) {
                if (sMorph.includes(":s")) {
                    aSugg.add(suggMasSing(sFlex));
                } else if (sMorph.includes(":p")) {
                    aSugg.add(suggMasPlur(sFlex));
                }
            } else if (sMorph.includes(":m")) {
                if (sMorph.includes(":s")) {
                    aSugg.add(suggFemSing(sFlex));
                } else if (sMorph.includes(":p")) {
                    aSugg.add(suggFemPlur(sFlex));
                } else {
                    aSugg.add(suggFemSing(sFlex));
                    aSugg.add(suggFemPlur(sFlex));
                }
            }
        }
    } else if (bPlur) {
        for (let sMorph of _dAnalyses._get(sFlex, [])) {
            if (sMorph.includes(":f")) {
                aSugg.add(suggMasPlur(sFlex));
            } else if (sMorph.includes(":m")) {
                aSugg.add(suggFemPlur(sFlex));
            }
        }
    } else {
        for (let sMorph of _dAnalyses._get(sFlex, [])) {
            if (sMorph.includes(":f")) {
                aSugg.add(suggMasSing(sFlex));
            } else if (sMorph.includes(":m")) {
                aSugg.add(suggFemSing(sFlex));
            }
        }
    }
    if (aSugg.size > 0) {
        return Array.from(aSugg).join("|");
    }
    return "";
}

function switchPlural (sFlex) {
    let aSugg = new Set();
    for (let sMorph of _dAnalyses._get(sFlex, [])) { // we don’t check if word exists in _dAnalyses, for it is assumed it has been done before
        if (sMorph.includes(":s")) {
            aSugg.add(suggPlur(sFlex));
        } else if (sMorph.includes(":p")) {
            aSugg.add(suggSing(sFlex));
        }
    }
    if (aSugg.size > 0) {
        return Array.from(aSugg).join("|");
    }
    return "";
}

function hasSimil (sWord, sPattern=null) {
    return phonet.hasSimil(sWord, sPattern);
}

function suggSimil (sWord, sPattern) {
    // return list of words phonetically similar to sWord and whom POS is matching sPattern
    let aSugg = phonet.selectSimil(sWord, sPattern);
    for (let sMorph of _dAnalyses._get(sWord, [])) {
        for (let e of conj.getSimil(sWord, sMorph)) {
            aSugg.add(e); 
        }
    }
    if (aSugg.size > 0) {
        return Array.from(aSugg).join("|");
    }
    return "";







|


















|







|















|



















|
|







426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
    return false;
}

function switchGender (sFlex, bPlur=null) {
    // we don’t check if word exists in _dAnalyses, for it is assumed it has been done before
    let aSugg = new Set();
    if (bPlur === null) {
        for (let sMorph of _dAnalyses.gl_get(sFlex, [])) {
            if (sMorph.includes(":f")) {
                if (sMorph.includes(":s")) {
                    aSugg.add(suggMasSing(sFlex));
                } else if (sMorph.includes(":p")) {
                    aSugg.add(suggMasPlur(sFlex));
                }
            } else if (sMorph.includes(":m")) {
                if (sMorph.includes(":s")) {
                    aSugg.add(suggFemSing(sFlex));
                } else if (sMorph.includes(":p")) {
                    aSugg.add(suggFemPlur(sFlex));
                } else {
                    aSugg.add(suggFemSing(sFlex));
                    aSugg.add(suggFemPlur(sFlex));
                }
            }
        }
    } else if (bPlur) {
        for (let sMorph of _dAnalyses.gl_get(sFlex, [])) {
            if (sMorph.includes(":f")) {
                aSugg.add(suggMasPlur(sFlex));
            } else if (sMorph.includes(":m")) {
                aSugg.add(suggFemPlur(sFlex));
            }
        }
    } else {
        for (let sMorph of _dAnalyses.gl_get(sFlex, [])) {
            if (sMorph.includes(":f")) {
                aSugg.add(suggMasSing(sFlex));
            } else if (sMorph.includes(":m")) {
                aSugg.add(suggFemSing(sFlex));
            }
        }
    }
    if (aSugg.size > 0) {
        return Array.from(aSugg).join("|");
    }
    return "";
}

function switchPlural (sFlex) {
    let aSugg = new Set();
    for (let sMorph of _dAnalyses.gl_get(sFlex, [])) { // we don’t check if word exists in _dAnalyses, for it is assumed it has been done before
        if (sMorph.includes(":s")) {
            aSugg.add(suggPlur(sFlex));
        } else if (sMorph.includes(":p")) {
            aSugg.add(suggSing(sFlex));
        }
    }
    if (aSugg.size > 0) {
        return Array.from(aSugg).join("|");
    }
    return "";
}

function hasSimil (sWord, sPattern=null) {
    return phonet.hasSimil(sWord, sPattern);
}

function suggSimil (sWord, sPattern) {
    // return list of words phonetically similar to sWord and whom POS is matching sPattern
    let aSugg = phonet.selectSimil(sWord, sPattern);
    for (let sMorph of _dAnalyses.gl_get(sWord, [])) {
        for (let e of conj.getSimil(sWord, sMorph, sPattern)) {
            aSugg.add(e); 
        }
    }
    if (aSugg.size > 0) {
        return Array.from(aSugg).join("|");
    }
    return "";
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
        return "ce|cet";
    }
    return "ce";
}

function suggLesLa (sWord) {
    // we don’t check if word exists in _dAnalyses, for it is assumed it has been done before
    if (_dAnalyses._get(sWord, []).some(s  =>  s.includes(":p"))) {
        return "les|la";
    }
    return "la";
}

function formatNumber (s) {
    let nLen = s.length;
    if (nLen <= 4 ) {
        return s;
    }
    let sRes = "";
    // nombre ordinaire
    let nEnd = nLen;
    while (nEnd > 0) {
        let nStart = Math.max(nEnd-3, 0);
        sRes = sRes ? s.slice(nStart, nEnd) + " " + sRes : sRes = s.slice(nStart, nEnd);
        nEnd = nEnd - 3;
    }
    // binaire
    if (/^[01]+$/.test(s)) {
        nEnd = nLen;
        let sBin = "";
        while (nEnd > 0) {
            let nStart = Math.max(nEnd-4, 0);
            sBin = sBin ? s.slice(nStart, nEnd) + " " + sBin : sBin = s.slice(nStart, nEnd);
            nEnd = nEnd - 4;
        }
        sRes += "|" + sBin;
    }
    // numéros de téléphone
    if (nLen == 10) {
        if (s.startsWith("0")) {
            sRes += "|" + s.slice(0,2) + " " + s.slice(2,4) + " " + s.slice(4,6) + " " + s.slice(6,8) + " " + s.slice(8);   // téléphone français
            if (s[1] == "4" && (s[2]=="7" || s[2]=="8" || s[2]=="9")) {
                sRes += "|" + s.slice(0,4) + " " + s.slice(4,6) + " " + s.slice(6,8) + " " + s.slice(8);    // mobile belge
            }
            sRes += "|" + s.slice(0,3) + " " + s.slice(3,6) + " " + s.slice(6,8) + " " + s.slice(8);        // téléphone suisse
        }
        sRes += "|" + s.slice(0,4) + " " + s.slice(4,7) + "-" + s.slice(7);                                 // téléphone canadien ou américain
    } else if (nLen == 9 && s.startsWith("0")) {
        sRes += "|" + s.slice(0,3) + " " + s.slice(3,5) + " " + s.slice(5,7) + " " + s.slice(7,9);          // fixe belge 1
        sRes += "|" + s.slice(0,2) + " " + s.slice(2,5) + " " + s.slice(5,7) + " " + s.slice(7,9);          // fixe belge 2
    }
    return sRes;
}

function formatNF (s) {
    try {
        let m = /NF[  -]?(C|E|P|Q|S|X|Z|EN(?:[  -]ISO|))[  -]?([0-9]+(?:[\/‑-][0-9]+|))/i.exec(s);







|







|







|








|







|

|

|

|

|
|







512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
        return "ce|cet";
    }
    return "ce";
}

function suggLesLa (sWord) {
    // we don’t check if word exists in _dAnalyses, for it is assumed it has been done before
    if (_dAnalyses.gl_get(sWord, []).some(s  =>  s.includes(":p"))) {
        return "les|la";
    }
    return "la";
}

function formatNumber (s) {
    let nLen = s.length;
    if (nLen < 4 ) {
        return s;
    }
    let sRes = "";
    // nombre ordinaire
    let nEnd = nLen;
    while (nEnd > 0) {
        let nStart = Math.max(nEnd-3, 0);
        sRes = sRes ? s.slice(nStart, nEnd) + "" + sRes : sRes = s.slice(nStart, nEnd);
        nEnd = nEnd - 3;
    }
    // binaire
    if (/^[01]+$/.test(s)) {
        nEnd = nLen;
        let sBin = "";
        while (nEnd > 0) {
            let nStart = Math.max(nEnd-4, 0);
            sBin = sBin ? s.slice(nStart, nEnd) + "" + sBin : sBin = s.slice(nStart, nEnd);
            nEnd = nEnd - 4;
        }
        sRes += "|" + sBin;
    }
    // numéros de téléphone
    if (nLen == 10) {
        if (s.startsWith("0")) {
            sRes += "|" + s.slice(0,2) + "" + s.slice(2,4) + "" + s.slice(4,6) + "" + s.slice(6,8) + "" + s.slice(8);   // téléphone français
            if (s[1] == "4" && (s[2]=="7" || s[2]=="8" || s[2]=="9")) {
                sRes += "|" + s.slice(0,4) + "" + s.slice(4,6) + "" + s.slice(6,8) + "" + s.slice(8);    // mobile belge
            }
            sRes += "|" + s.slice(0,3) + "" + s.slice(3,6) + "" + s.slice(6,8) + "" + s.slice(8);        // téléphone suisse
        }
        sRes += "|" + s.slice(0,4) + "" + s.slice(4,7) + "-" + s.slice(7);                                 // téléphone canadien ou américain
    } else if (nLen == 9 && s.startsWith("0")) {
        sRes += "|" + s.slice(0,3) + "" + s.slice(3,5) + "" + s.slice(5,7) + "" + s.slice(7,9);          // fixe belge 1
        sRes += "|" + s.slice(0,2) + "" + s.slice(2,5) + "" + s.slice(5,7) + "" + s.slice(7,9);          // fixe belge 2
    }
    return sRes;
}

function formatNF (s) {
    try {
        let m = /NF[  -]?(C|E|P|Q|S|X|Z|EN(?:[  -]ISO|))[  -]?([0-9]+(?:[\/‑-][0-9]+|))/i.exec(s);

Modified gc_lang/fr/modules-js/lexicographe.js from [7e54b6b49b] to [fd0872dfca].

1
2


3
4
5
6

7
8

9
10
11
12
13
14
15
16
17
// Grammalecte - Lexicographe
// License: MPL 2



"use strict";

${string}




const helpers = require("resource://grammalecte/helpers.js");


const _dTAGS = new Map ([
    [':G', "[mot grammatical]"],
    [':N', " nom,"],
    [':A', " adjectif,"],
    [':M1', " prénom,"],
    [':M2', " patronyme,"],


>
>




>


>
|
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Grammalecte - Lexicographe
// License: MPL 2
/*jslint esversion: 6*/
/*global require,exports*/

"use strict";

${string}
${map}


if (typeof(require) !== 'undefined') {
    var helpers = require("resource://grammalecte/helpers.js");
}

const _dTAGS = new Map ([
    [':G', "[mot grammatical]"],
    [':N', " nom,"],
    [':A', " adjectif,"],
    [':M1', " prénom,"],
    [':M2', " patronyme,"],
153
154
155
156
157
158
159
































160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178

179
180
181
182
183
184
185


186








187


188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205

206

207
208
209
210
211
212




213
214
215
216
217
218

219
220
221
222
223
224
225

226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249

250
251
252
253
254
255
256
257
258
259
260
261
262
263

264
265
266

267


    ['en', " pronom adverbial"],
    ["m'en", " (me) pronom personnel objet + (en) pronom adverbial"],
    ["t'en", " (te) pronom personnel objet + (en) pronom adverbial"],
    ["s'en", " (se) pronom personnel objet + (en) pronom adverbial"]
]);


































class Lexicographe {

    constructor (oDict) {
        this.oDict = oDict;
        this._zElidedPrefix = new RegExp ("^([dljmtsncç]|quoiqu|lorsqu|jusqu|puisqu|qu)['’](.+)", "i");
        this._zCompoundWord = new RegExp ("([a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ]+)-((?:les?|la)-(?:moi|toi|lui|[nv]ous|leur)|t-(?:il|elle|on)|y|en|[mts][’'](?:y|en)|les?|l[aà]|[mt]oi|leur|lui|je|tu|ils?|elles?|on|[nv]ous)$", "i");
        this._zTag = new RegExp ("[:;/][a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ*][^:;/]*", "g");
    };

    analyzeText (sText) {
        sText = sText.replace(/[.,.?!:;…\/()\[\]“”«»"„{}–—#+*<>%=\n]/g, " ").replace(/\s+/g, " ");
        let iStart = 0;
        let iEnd = 0;
        let sHtml = '<div class="paragraph">\n';
        while ((iEnd = sText.indexOf(" ", iStart)) !== -1) {
            sHtml += this.analyzeWord(sText.slice(iStart, iEnd));
            iStart = iEnd + 1;
        }

        sHtml += this.analyzeWord(sText.slice(iStart));
        return sHtml + '</div>\n';
    }

    analyzeWord (sWord) {
        try {
            if (!sWord) {


                return "";








            }


            if (sWord._count("-") > 4) {
                return '<p><b class="mbok">' + sWord + "</b> <s>:</s> élément complexe indéterminé</p>\n";
            }
            if (sWord._isDigit()) {
                return '<p><b class="nb">' + sWord + "</b> <s>:</s> nombre</p>\n";
            }

            let sHtml = "";
            // préfixes élidés
            let m = this._zElidedPrefix.exec(sWord);
            if (m !== null) {
                sWord = m[2];
                sHtml += "<p><b>" + m[1] + "’</b> <s>:</s> " + _dPFX.get(m[1].toLowerCase()) + " </p>\n";
            }
            // mots composés
            let m2 = this._zCompoundWord.exec(sWord);
            if (m2 !== null) {
                sWord = m2[1];

            }

            // Morphologies
            let lMorph = this.oDict.getMorph(sWord);
            if (lMorph.length === 1) {
                sHtml += "<p><b>" + sWord + "</b> <s>:</s> " + this.formatTags(lMorph[0]) + "</p>\n";
            } else if (lMorph.length > 1) {
                sHtml += "<p><b>" + sWord + "</b><ul><li>" + [for (s of lMorph) if (s.includes(":")) this.formatTags(s)].join(" </li><li> ") + "</li></ul></p>\n";




            } else {
                sHtml += '<p><b class="unknown">' + sWord + "</b> <s>:</s>  absent du dictionnaire<p>\n";
            }
            // suffixe d’un mot composé
            if (m2) {
                sHtml += "<p>-<b>" + m2[2] + "</b> <s>:</s> " + this._formatSuffix(m2[2].toLowerCase()) + "</p>\n";

            }
            // Verbes
            //let aVerb = new Set([ for (s of lMorph) if (s.includes(":V")) s.slice(1, s.indexOf(" ")) ]);
            return sHtml;
        }
        catch (e) {
            helpers.logerror(e);

            return "#erreur";
        }
    };

    formatTags (sTags) {
        let sRes = "";
        sTags = sTags.replace(/V([0-3][ea]?)[itpqnmr_eaxz]+/, "V$1");
        let m;
        while ((m = this._zTag.exec(sTags)) !== null) {
            sRes += _dTAGS.get(m[0]);
            if (sRes.length > 100) {
                break;
            }
        }
        if (sRes.startsWith(" verbe") && !sRes.endsWith("infinitif")) {
            sRes += " [" + sTags.slice(1, sTags.indexOf(" ")) + "]";
        }
        if (!sRes) {
            sRes = "#Erreur. Étiquette inconnue : [" + sTags + "]";
            helpers.echo(sRes);
            return sRes;
        }
        return sRes._trimRight(",");
    };


    _formatSuffix (s) {
        if (s.startsWith("t-")) {
            return "“t” euphonique +" + _dAD.get(s.slice(2));
        }
        if (!s.includes("-")) {
            return _dAD.get(s.replace("’", "'"));
        }
        if (s.endsWith("ous")) {
            s += '2';
        }
        let nPos = s.indexOf("-");
        return _dAD.get(s.slice(0, nPos)) + " +" + _dAD.get(s.slice(nPos+1));
    };

}



exports.Lexicographe = Lexicographe;








>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>








<
|
<
<
<
<
<
<
<
<
|
>
|
|
<
|
<

|
>
>
|
>
>
>
>
>
>
>
>
|
>
>
|
|
|
|
<
<
|
|
<
|
|
<
<
|
<
<
<
<
>
|
>
|
|
|
<
|
|
>
>
>
>
|
|
|
<
<
<
>

<
<
<



>
|
|
<

|

















|
<
>













<
>



>
|
>
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203

204








205
206
207
208

209

210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229


230
231

232
233


234




235
236
237
238
239
240

241
242
243
244
245
246
247
248
249



250
251



252
253
254
255
256
257

258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277

278
279
280
281
282
283
284
285
286
287
288
289
290
291

292
293
294
295
296
297
298

    ['en', " pronom adverbial"],
    ["m'en", " (me) pronom personnel objet + (en) pronom adverbial"],
    ["t'en", " (te) pronom personnel objet + (en) pronom adverbial"],
    ["s'en", " (se) pronom personnel objet + (en) pronom adverbial"]
]);

const _dSeparator = new Map ([
    ['.', "point"],
    ['·', "point médian"],
    ['…', "points de suspension"],
    [':', "deux-points"],
    [';', "point-virgule"],
    [',', "virgule"],
    ['?', "point d’interrogation"],
    ['!', "point d’exclamation"],
    ['(', "parenthèse ouvrante"],
    [')', "parenthèse fermante"],
    ['[', "crochet ouvrante"],
    [']', "crochet fermante"],
    ['{', "accolade ouvrante"],
    ['}', "accolade fermante"],
    ['-', "tiret"],
    ['—', "tiret cadratin"],
    ['–', "tiret demi-cadratin"],
    ['«', "guillemet ouvrant (chevrons)"],
    ['»', "guillemet fermant (chevrons)"],
    ['“', "guillemet ouvrant double"],
    ['”', "guillemet fermant double"],
    ['‘', "guillemet ouvrant"],
    ['’', "guillemet fermant"],
    ['/', "signe de la division"],
    ['+', "signe de l’addition"],
    ['*', "signe de la multiplication"],
    ['=', "signe de l’égalité"],
    ['<', "inférieur à"],
    ['>', "supérieur à"],
]);


class Lexicographe {

    constructor (oDict) {
        this.oDict = oDict;
        this._zElidedPrefix = new RegExp ("^([dljmtsncç]|quoiqu|lorsqu|jusqu|puisqu|qu)['’](.+)", "i");
        this._zCompoundWord = new RegExp ("([a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ]+)-((?:les?|la)-(?:moi|toi|lui|[nv]ous|leur)|t-(?:il|elle|on)|y|en|[mts][’'](?:y|en)|les?|l[aà]|[mt]oi|leur|lui|je|tu|ils?|elles?|on|[nv]ous)$", "i");
        this._zTag = new RegExp ("[:;/][a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ*][^:;/]*", "g");

    }









    getInfoForToken (oToken) {
        // Token: .sType, .sValue, .nStart, .nEnd
        // return a list [type, token_string, values]

        let m = null;

        try {
            switch (oToken.sType) {
                case 'SEPARATOR':
                    return { sType: oToken.sType, sValue: oToken.sValue, aLabel: [_dSeparator.gl_get(oToken.sValue, "caractère indéterminé")] };
                    break;
                case 'NUM':
                    return { sType: oToken.sType, sValue: oToken.sValue, aLabel: ["nombre"] };
                    break;
                case 'LINK':
                    return { sType: oToken.sType, sValue: oToken.sValue.slice(0,40)+"…", aLabel: ["hyperlien"] };
                    break;
                case 'ELPFX':
                    let sTemp = oToken.sValue.replace("’", "").replace("'", "").replace("`", "").toLowerCase();
                    return { sType: oToken.sType, sValue: oToken.sValue, aLabel: [_dPFX.gl_get(sTemp, "préfixe élidé inconnu")] };
                    break;
                case 'WORD': 
                    if (oToken.sValue.gl_count("-") > 4) {
                        return { sType: "COMPLEX", sValue: oToken.sValue, aLabel: ["élément complexe indéterminé"] };
                    }
                    else if (this.oDict.isValidToken(oToken.sValue)) {


                        let lMorph = this.oDict.getMorph(oToken.sValue);
                        let aElem = [];

                        for (let s of lMorph){
                            if (s.includes(":"))  aElem.push( this._formatTags(s) );


                        }




                        return { sType: oToken.sType, sValue: oToken.sValue, aLabel: aElem};
                    }
                    else if (m = this._zCompoundWord.exec(oToken.sValue)) {
                        // mots composés
                        let lMorph = this.oDict.getMorph(m[1]);
                        let aElem = [];

                        for (let s of lMorph){
                            if (s.includes(":"))  aElem.push( this._formatTags(s) );
                        }
                        aElem.push("-" + m[2] + ": " + this._formatSuffix(m[2].toLowerCase()));
                        return { sType: oToken.sType, sValue: oToken.sValue, aLabel: aElem };
                    }
                    else {
                        return { sType: "UNKNOWN", sValue: oToken.sValue, aLabel: ["inconnu du dictionnaire"] };
                    }



                    break;
            }



        }
        catch (e) {
            helpers.logerror(e);
        }
        return null;
    }


    _formatTags (sTags) {
        let sRes = "";
        sTags = sTags.replace(/V([0-3][ea]?)[itpqnmr_eaxz]+/, "V$1");
        let m;
        while ((m = this._zTag.exec(sTags)) !== null) {
            sRes += _dTAGS.get(m[0]);
            if (sRes.length > 100) {
                break;
            }
        }
        if (sRes.startsWith(" verbe") && !sRes.endsWith("infinitif")) {
            sRes += " [" + sTags.slice(1, sTags.indexOf(" ")) + "]";
        }
        if (!sRes) {
            sRes = "#Erreur. Étiquette inconnue : [" + sTags + "]";
            helpers.echo(sRes);
            return sRes;
        }
        return sRes.gl_trimRight(",");

    }

    _formatSuffix (s) {
        if (s.startsWith("t-")) {
            return "“t” euphonique +" + _dAD.get(s.slice(2));
        }
        if (!s.includes("-")) {
            return _dAD.get(s.replace("’", "'"));
        }
        if (s.endsWith("ous")) {
            s += '2';
        }
        let nPos = s.indexOf("-");
        return _dAD.get(s.slice(0, nPos)) + " +" + _dAD.get(s.slice(nPos+1));

    }
}


if (typeof(exports) !== 'undefined') {
    exports.Lexicographe = Lexicographe;
}

Modified gc_lang/fr/modules-js/mfsp.js from [eacc870aa5] to [4ade9720c3].

1


2
3
4


5
6
7
8
9

10
11
12
13
14
15
16
17









18

19


20

21
22
23
24
25

26
27
28
29


30
31


32
33
34
35
36
37
38
39
40
41
42


43
44


45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79

80
81




















82
83
84
85



// Grammalecte



"use strict";



const helpers = require("resource://grammalecte/helpers.js");
const echo = helpers.echo;

const oData = JSON.parse(helpers.loadFile("resource://grammalecte/fr/mfsp_data.json"));


// list of affix codes
const _lTagMiscPlur = oData.lTagMiscPlur;
const _lTagMasForm = oData.lTagMasForm;

// dictionary of words with uncommon plurals (-x, -ux, english, latin and italian plurals) and tags to generate them
const _dMiscPlur = helpers.objectToMap(oData.dMiscPlur);

// dictionary of feminine forms and tags to generate masculine forms (singular and plural)









const _dMasForm = helpers.objectToMap(oData.dMasForm);







function isFemForm (sWord) {
    // returns True if sWord exists in _dMasForm
    return _dMasForm.has(sWord);
}


function getMasForm (sWord, bPlur) {
    // returns masculine form with feminine form
    if (_dMasForm.has(sWord)) {


        return [ for (sTag of _whatSuffixCodes(sWord, bPlur))  _modifyStringWithSuffixCode(sWord, sTag) ];
    }


    return [];
}

function hasMiscPlural (sWord) {
    // returns True if sWord exists in dMiscPlur
    return _dMiscPlur.has(sWord);
}

function getMiscPlural (sWord) {
    // returns plural form with singular form
    if (_dMiscPlur.has(sWord)) {


        return [ for (sTag of _lTagMiscPlur[_dMiscPlur.get(sWord)].split("|"))  _modifyStringWithSuffixCode(sWord, sTag) ];
    }


    return [];
}

function _whatSuffixCodes (sWord, bPlur) {
    // necessary only for dMasFW
    let sSfx = _lTagMasForm[_dMasForm.get(sWord)];
    if (sSfx.includes("/")) {
        if (bPlur) {
            return sSfx.slice(sSfx.indexOf("/")+1).split("|");
        }
        return sSfx.slice(0, sSfx.indexOf("/")).split("|");
    }
    return sSfx.split("|");
}

function _modifyStringWithSuffixCode (sWord, sSfx) {
    // returns sWord modified by sSfx
    if (!sWord) {
        return "";
    }
    if (sSfx === "0") {
        return sWord;
    }
    try {
        if (sSfx[0] !== '0') {
            return sWord.slice(0, -(sSfx.charCodeAt(0)-48)) + sSfx.slice(1); // 48 is the ASCII code for "0"
        } else {
            return sWord + sSfx.slice(1);
        }
    }
    catch (e) {
        console.log(e);
        return "## erreur, code : " + sSfx + " ##";
    }
}























exports.isFemForm = isFemForm;
exports.getMasForm = getMasForm;
exports.hasMiscPlural = hasMiscPlural;
exports.getMiscPlural = getMiscPlural;




>
>



>
>
|
<
|
|

>
|
|
|
<
|
<
|
|
>
>
>
>
>
>
>
>
>
|
>
|
>
>
|
>

|
|
|
<
>

|
|
|
>
>
|
|
>
>
|
|

|
|
|
|

|
|
|
>
>
|
|
>
>
|
|

|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>


>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|
|
|
>
>
>
1
2
3
4
5
6
7
8
9

10
11
12
13
14
15
16

17

18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// Grammalecte
/*jslint esversion: 6*/
/*global console,require,exports,browser*/

"use strict";


if (typeof(require) !== 'undefined') {
    var helpers = require("resource://grammalecte/helpers.js");

}


var mfsp = {
    // list of affix codes
    _lTagMiscPlur: [],
    _lTagMasForm: [],

    // dictionary of words with uncommon plurals (-x, -ux, english, latin and italian plurals) and tags to generate them

    _dMiscPlur: new Map(),
    // dictionary of feminine forms and tags to generate masculine forms (singular and plural)
    _dMasForm: new Map(),

    bInit: false,
    init: function (sJSONData) {
        try {
            let _oData = JSON.parse(sJSONData);
            this._lTagMiscPlur = _oData.lTagMiscPlur;
            this._lTagMasForm = _oData.lTagMasForm;
            this._dMiscPlur = helpers.objectToMap(_oData.dMiscPlur);
            this._dMasForm = helpers.objectToMap(_oData.dMasForm);
            this.bInit = true;
        }
        catch (e) {
            console.error(e);
        }
    },

    isFemForm: function (sWord) {
        // returns True if sWord exists in this._dMasForm
        return this._dMasForm.has(sWord);

    },

    getMasForm: function (sWord, bPlur) {
        // returns masculine form with feminine form
        if (this._dMasForm.has(sWord)) {
            let aMasForm = [];
            for (let sTag of this._whatSuffixCode(sWord, bPlur)){
                aMasForm.push( this._modifyStringWithSuffixCode(sWord, sTag) );
            }
            return aMasForm;
        }
        return [];
    },

    hasMiscPlural: function (sWord) {
        // returns True if sWord exists in dMiscPlur
        return this._dMiscPlur.has(sWord);
    },

    getMiscPlural: function (sWord) {
        // returns plural form with singular form
        if (this._dMiscPlur.has(sWord)) {
            let aMiscPlural = [];
            for (let sTag of this._lTagMiscPlur[this._dMiscPlur.get(sWord)].split("|")){
                aMiscPlural.push( this._modifyStringWithSuffixCode(sWord, sTag) );
            }
            return aMiscPlural;
        }
        return [];
    },

    _whatSuffixCode: function (sWord, bPlur) {
        // necessary only for dMasFW
        let sSfx = this._lTagMasForm[this._dMasForm.get(sWord)];
        if (sSfx.includes("/")) {
            if (bPlur) {
                return sSfx.slice(sSfx.indexOf("/")+1).split("|");
            }
            return sSfx.slice(0, sSfx.indexOf("/")).split("|");
        }
        return sSfx.split("|");
    },

    _modifyStringWithSuffixCode: function (sWord, sSfx) {
        // returns sWord modified by sSfx
        if (!sWord) {
            return "";
        }
        if (sSfx === "0") {
            return sWord;
        }
        try {
            if (sSfx[0] !== '0') {
                return sWord.slice(0, -(sSfx.charCodeAt(0)-48)) + sSfx.slice(1); // 48 is the ASCII code for "0"
            } else {
                return sWord + sSfx.slice(1);
            }
        }
        catch (e) {
            console.log(e);
            return "## erreur, code : " + sSfx + " ##";
        }
    }
};


// Initialization
if (!mfsp.bInit && typeof(browser) !== 'undefined') {
    // WebExtension
    mfsp.init(helpers.loadFile(browser.extension.getURL("grammalecte/fr/mfsp_data.json")));
} else if (!mfsp.bInit && typeof(require) !== 'undefined') {
    // Add-on SDK and Thunderbird
    mfsp.init(helpers.loadFile("resource://grammalecte/fr/mfsp_data.json"));
} else if (mfsp.bInit){
    console.log("Module mfsp déjà initialisé");
} else {
    console.log("Module mfsp non initialisé");
}


if (typeof(exports) !== 'undefined') {
    exports._lTagMiscPlur = mfsp._lTagMiscPlur;
    exports._lTagMasForm = mfsp._lTagMasForm;
    exports._dMiscPlur = mfsp._dMiscPlur;
    exports._dMasForm = mfsp._dMasForm;
    exports.init = mfsp.init;
    exports.isFemForm = mfsp.isFemForm;
    exports.getMasForm = mfsp.getMasForm;
    exports.hasMiscPlural = mfsp.hasMiscPlural;
    exports.getMiscPlural = mfsp.getMiscPlural;
    exports._whatSuffixCode = mfsp._whatSuffixCode;
    exports._modifyStringWithSuffixCode = mfsp._modifyStringWithSuffixCode;
}

Modified gc_lang/fr/modules-js/mfsp_data.json from [9cc6f3064c] to [e5057cbf5b].

cannot compute difference between binary files

Modified gc_lang/fr/modules-js/phonet.js from [1ddd439263] to [b4e35b2c18].

1

2

3

4
5
6



7




8
9
10

11


12

13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

28
29
30
31
32
33


34

35
36
37
38
39
40
41
42
43
44
45
46
47

48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

66
67



















68
69
70

// Grammalecte - Suggestion phonétique



const helpers = require("resource://grammalecte/helpers.js");

const echo = helpers.echo;

const oData = JSON.parse(helpers.loadFile("resource://grammalecte/fr/phonet_data.json"));








const _dWord = helpers.objectToMap(oData.dWord);
const _lSet = oData.lSet;
const _dMorph = helpers.objectToMap(oData.dMorph);







function hasSimil (sWord, sPattern=null) {
    // return True if there is list of words phonetically similar to sWord
    if (!sWord) {
        return false;
    }
    if (_dWord.has(sWord)) {
        if (sPattern) {
            return getSimil(sWord).some(sSimil => _dMorph._get(sSimil, []).some(sMorph => sMorph.search(sPattern) >= 0));
        }
        return true;
    }
    if (sWord.slice(0,1)._isUpperCase()) {
        sWord = sWord.toLowerCase();
    }

    if (sPattern) {
        return getSimil(sWord).some(sSimil => _dMorph._get(sSimil, []).some(sMorph => sMorph.search(sPattern) >= 0));
    }
    return _dWord.has(sWord);
}



function getSimil (sWord) {

    // return list of words phonetically similar to sWord
    if (!sWord) {
        return [];
    }
    if (_dWord.has(sWord)) {
        return _lSet[_dWord.get(sWord)];
    }
    if (sWord.slice(0,1)._isUpperCase()) {
        sWord = sWord.toLowerCase();
    }
    if (_dWord.has(sWord)) {
        return _lSet[_dWord.get(sWord)];
    }

    return [];
}

function selectSimil (sWord, sPattern) {
    // return list of words phonetically similar to sWord and whom POS is matching sPattern
    if (!sPattern) {
        return new Set(getSimil(sWord));
    }
    let aSelect = new Set();
    for (let sSimil of getSimil(sWord)) {
        for (let sMorph of _dMorph._get(sSimil, [])) {
            if (sMorph.search(sPattern) >= 0) {
                aSelect.add(sSimil);
            }
        }
    }
    return aSelect;
}






















exports.hasSimil = hasSimil;
exports.getSimil = getSimil;
exports.selectSimil = selectSimil;


>

>
|
>
|

|
>
>
>

>
>
>
>
|
|
|
>
|
>
>
|
>

|
|
|
|
|
|
|
|
|
|
|
|
|
<
>
|
|
|
|
|
|
>
>
|
>
|
|
|
|
|
|
|
|
|
<
|
|
|
>
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>


>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|
|
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
// Grammalecte - Suggestion phonétique
/*jslint esversion: 6*/

if (typeof(require) !== 'undefined') {
    var helpers = require("resource://grammalecte/helpers.js");
}


var phonet = {
    _dWord: new Map(),
    _lSet: [],
    _dMorph: new Map(),

    bInit: false,
    init: function (sJSONData) {
        try {
            let _oData = JSON.parse(sJSONData);
            this._dWord = helpers.objectToMap(_oData.dWord);
            this._lSet = _oData.lSet;
            this._dMorph = helpers.objectToMap(_oData.dMorph);
            this.bInit = true;
        }
        catch (e) {
            console.error(e);
        }
    },

    hasSimil: function (sWord, sPattern=null) {
        // return True if there is list of words phonetically similar to sWord
        if (!sWord) {
            return false;
        }
        if (this._dWord.has(sWord)) {
            if (sPattern) {
                return this.getSimil(sWord).some(sSimil => this._dMorph.gl_get(sSimil, []).some(sMorph => sMorph.search(sPattern) >= 0));
            }
            return true;
        }
        if (sWord.slice(0,1).gl_isUpperCase()) {
            sWord = sWord.toLowerCase();

            if (this._dWord.has(sWord)) {
                if (sPattern) {
                    return this.getSimil(sWord).some(sSimil => this._dMorph.gl_get(sSimil, []).some(sMorph => sMorph.search(sPattern) >= 0));
                }
                return true;
            }
        }
        return false;
    },

    getSimil: function (sWord) {
        // return list of words phonetically similar to sWord
        if (!sWord) {
            return [];
        }
        if (this._dWord.has(sWord)) {
            return this._lSet[this._dWord.get(sWord)];
        }
        if (sWord.slice(0,1).gl_isUpperCase()) {
            sWord = sWord.toLowerCase();

            if (this._dWord.has(sWord)) {
                return this._lSet[this._dWord.get(sWord)];
            }
        }
        return [];
    },

    selectSimil: function (sWord, sPattern) {
        // return list of words phonetically similar to sWord and whom POS is matching sPattern
        if (!sPattern) {
            return new Set(this.getSimil(sWord));
        }
        let aSelect = new Set();
        for (let sSimil of this.getSimil(sWord)) {
            for (let sMorph of this._dMorph.gl_get(sSimil, [])) {
                if (sMorph.search(sPattern) >= 0) {
                    aSelect.add(sSimil);
                }
            }
        }
        return aSelect;
    }
};


// Initialization
if (!phonet.bInit && typeof(browser) !== 'undefined') {
    // WebExtension
    phonet.init(helpers.loadFile(browser.extension.getURL("grammalecte/fr/phonet_data.json")));
} else if (!phonet.bInit && typeof(require) !== 'undefined') {
    // Add-on SDK and Thunderbird
    phonet.init(helpers.loadFile("resource://grammalecte/fr/phonet_data.json"));
} else if (phonet.bInit){
    console.log("Module phonet déjà initialisé");
} else {
    console.log("Module phonet non initialisé");
}


if (typeof(exports) !== 'undefined') {
    exports._dWord = phonet._dWord;
    exports._lSet = phonet._lSet;
    exports._dMorph = phonet._dMorph;
    exports.init = phonet.init;
    exports.hasSimil = phonet.hasSimil;
    exports.getSimil = phonet.getSimil;
    exports.selectSimil = phonet.selectSimil;
}

Modified gc_lang/fr/modules-js/phonet_data.json from [41faff5ff9] to [93017c34d1].

cannot compute difference between binary files

Modified gc_lang/fr/modules-js/textformatter.js from [694a6a3f2d] to [1785f80db7].

1


2
3
4
5
6
7
8
// Grammalecte - text formatter



"use strict";

${map}


// Latin letters: http://unicode-table.com/fr/

>
>







1
2
3
4
5
6
7
8
9
10
// Grammalecte - text formatter
/*jslint esversion: 6*/
/*global exports*/

"use strict";

${map}


// Latin letters: http://unicode-table.com/fr/
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
    "nbsp_repair":                [ [/([\[(])[   ]([!?:;])/g, "$1$2"],
                                    [/(https?|ftp)[   ]:\/\//g, "$1://"],
                                    [/&([a-z]+)[   ];/g, "&$1;"],
                                    [/&#([0-9]+|x[0-9a-fA-F]+)[   ];/g, "&#$1;"] ],
    //// missing spaces
    "add_space_after_punctuation":[ [/[;!…](?=[a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ])/g, "$& "],
                                    [/[?](?=[A-ZÀ-ÖØ-ßĀ-ʯ])/g, "? "],
                                    [/\.(?=[a-zA-Zà-öÀ-Öø-ÿØ-ßĀ-ʯ][a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ])/g, ". "],
                                    [/\.(?=À)/g, ". "],
                                    [/[,:](?=[a-zA-Zà-öÀ-Öø-ÿØ-ßĀ-ʯ])/g, "$& "],
                                    [/([a-zA-Zà-öÀ-Öø-ÿØ-ßĀ-ʯ]),(?=[0-9])/g, "$1, "] ],
    "add_space_around_hyphens":   [ [/ [-–—](?=[a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ"«“'‘])/g, "$& "],
                                    [/([a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ"»”'’])([-–—]) /g, "$1 $2 "] ],
    "add_space_repair":           [ [/DnT, ([wA])\b/g, "DnT,$1"] ],
    //// erase







|







62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
    "nbsp_repair":                [ [/([\[(])[   ]([!?:;])/g, "$1$2"],
                                    [/(https?|ftp)[   ]:\/\//g, "$1://"],
                                    [/&([a-z]+)[   ];/g, "&$1;"],
                                    [/&#([0-9]+|x[0-9a-fA-F]+)[   ];/g, "&#$1;"] ],
    //// missing spaces
    "add_space_after_punctuation":[ [/[;!…](?=[a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ])/g, "$& "],
                                    [/[?](?=[A-ZÀ-ÖØ-ßĀ-ʯ])/g, "? "],
                                    [/\.(?=[A-ZÀ-ÖØ-ßĀ-ʯ][a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ])/g, ". "],
                                    [/\.(?=À)/g, ". "],
                                    [/[,:](?=[a-zA-Zà-öÀ-Öø-ÿØ-ßĀ-ʯ])/g, "$& "],
                                    [/([a-zA-Zà-öÀ-Öø-ÿØ-ßĀ-ʯ]),(?=[0-9])/g, "$1, "] ],
    "add_space_around_hyphens":   [ [/ [-–—](?=[a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ"«“'‘])/g, "$& "],
                                    [/([a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ"»”'’])([-–—]) /g, "$1 $2 "] ],
    "add_space_repair":           [ [/DnT, ([wA])\b/g, "DnT,$1"] ],
    //// erase
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
                                    [/^(qu|lorsqu|puisqu|quoiqu|presqu|jusqu|aujourd|entr|quelqu|prud) /ig, "$1’"] ],
    "ma_1letter_lowercase":       [ [/[  ]([ldjnmtscç]) (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])/g, "$1’"] ],
    "ma_1letter_uppercase":       [ [/[  ]([LDJNMTSCÇ]) (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])/g, "$1’"],
                                    [/^([LDJNMTSCÇ]) (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])/g, "$1’"] ]
};


const dDefaultOptions = new Map ([
    ["ts_units", true],
    ["start_of_paragraph", true],
    ["end_of_paragraph", true],
    ["between_words", true],
    ["before_punctuation", true],
    ["within_parenthesis", true],
    ["within_square_brackets", true],







|







196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
                                    [/^(qu|lorsqu|puisqu|quoiqu|presqu|jusqu|aujourd|entr|quelqu|prud) /ig, "$1’"] ],
    "ma_1letter_lowercase":       [ [/[  ]([ldjnmtscç]) (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])/g, "$1’"] ],
    "ma_1letter_uppercase":       [ [/[  ]([LDJNMTSCÇ]) (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])/g, "$1’"],
                                    [/^([LDJNMTSCÇ]) (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])/g, "$1’"] ]
};


const dTFDefaultOptions = new Map ([
    ["ts_units", true],
    ["start_of_paragraph", true],
    ["end_of_paragraph", true],
    ["between_words", true],
    ["before_punctuation", true],
    ["within_parenthesis", true],
    ["within_square_brackets", true],
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261

262
263
264
265
266
267
268
269
270
271
272
273
274
275
276

277
278
279
280

281
282
283
284
285
    ["etc", true],
    ["missing_hyphens", true],
    ["ma_word", true],
    ["ma_1letter_lowercase", false],
    ["ma_1letter_uppercase", false]
]);

const dOptions = dDefaultOptions._shallowCopy();


class TextFormatter {

    constructor () {
        this.sLang = "fr";
    };


    formatText (sText, dOpt=null) {
        if (dOpt !== null) {
            dOptions._updateOnlyExistingKeys(dOpt);
        }
        for (let [sOptName, bVal] of dOptions) {
            if (bVal && oReplTable.has(sOptName)) {
                for (let [zRgx, sRep] of oReplTable[sOptName]) {
                    sText = sText.replace(zRgx, sRep);
                }
            }
        }
        return sText;
    };


    getDefaultOptions () {
        return dDefaultOptions;
    }
}


if (typeof(exports) !== 'undefined') {
    exports.TextFormatter = TextFormatter;
    exports.oReplTable = oReplTable;
}







|






<
>



|

|







<
|
>

|


>





249
250
251
252
253
254
255
256
257
258
259
260
261
262

263
264
265
266
267
268
269
270
271
272
273
274
275
276

277
278
279
280
281
282
283
284
285
286
287
288
    ["etc", true],
    ["missing_hyphens", true],
    ["ma_word", true],
    ["ma_1letter_lowercase", false],
    ["ma_1letter_uppercase", false]
]);

const dTFOptions = dTFDefaultOptions.gl_shallowCopy();


class TextFormatter {

    constructor () {
        this.sLang = "fr";

    }

    formatText (sText, dOpt=null) {
        if (dOpt !== null) {
            dTFOptions.gl_updateOnlyExistingKeys(dOpt);
        }
        for (let [sOptName, bVal] of dTFOptions) {
            if (bVal && oReplTable.has(sOptName)) {
                for (let [zRgx, sRep] of oReplTable[sOptName]) {
                    sText = sText.replace(zRgx, sRep);
                }
            }
        }
        return sText;

    }

    getDefaultOptions () {
        return dTFDefaultOptions;
    }
}


if (typeof(exports) !== 'undefined') {
    exports.TextFormatter = TextFormatter;
    exports.oReplTable = oReplTable;
}

Modified gc_lang/fr/modules/conj.py from [55e5497434] to [ec8e754549].

51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
def getVtyp (sVerb):
    "returns raw informations about sVerb"
    if sVerb not in _dVerb:
        return None
    return _lVtyp[_dVerb[sVerb][0]]


def getSimil (sWord, sMorph):
    if ":V" not in sMorph:
        return set()
    sInfi = sMorph[1:sMorph.find(" ")]
    tTags = _getTags(sInfi)
    aSugg = set()
    if ":Q" in sMorph:
        # we suggest conjugated forms
        if ":V1" in sMorph:
            aSugg.add(sInfi)
            aSugg.add(_getConjWithTags(sInfi, tTags, ":Ip", ":3s"))
            aSugg.add(_getConjWithTags(sInfi, tTags, ":Ip", ":2p"))
            aSugg.add(_getConjWithTags(sInfi, tTags, ":Iq", ":1s"))
            aSugg.add(_getConjWithTags(sInfi, tTags, ":Iq", ":3s"))







|





|







51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
def getVtyp (sVerb):
    "returns raw informations about sVerb"
    if sVerb not in _dVerb:
        return None
    return _lVtyp[_dVerb[sVerb][0]]


def getSimil (sWord, sMorph, sFilter=None):
    if ":V" not in sMorph:
        return set()
    sInfi = sMorph[1:sMorph.find(" ")]
    tTags = _getTags(sInfi)
    aSugg = set()
    if ":Q" in sMorph or ":Y" in sMorph:
        # we suggest conjugated forms
        if ":V1" in sMorph:
            aSugg.add(sInfi)
            aSugg.add(_getConjWithTags(sInfi, tTags, ":Ip", ":3s"))
            aSugg.add(_getConjWithTags(sInfi, tTags, ":Ip", ":2p"))
            aSugg.add(_getConjWithTags(sInfi, tTags, ":Iq", ":1s"))
            aSugg.add(_getConjWithTags(sInfi, tTags, ":Iq", ":3s"))
91
92
93
94
95
96
97

















98
99
100
101
102
103
104
        aSugg.add(_getConjWithTags(sInfi, tTags, ":PQ", ":Q2"))
        aSugg.add(_getConjWithTags(sInfi, tTags, ":PQ", ":Q3"))
        aSugg.add(_getConjWithTags(sInfi, tTags, ":PQ", ":Q4"))
        aSugg.discard("")
        # if there is only one past participle (epi inv), unreliable.
        if len(aSugg) == 1:
            aSugg.clear()

















    return aSugg


def _getTags (sVerb):
    "returns tuple of tags (usable with functions _getConjWithTags and _hasConjWithTags)"
    if sVerb not in _dVerb:
        return None







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
        aSugg.add(_getConjWithTags(sInfi, tTags, ":PQ", ":Q2"))
        aSugg.add(_getConjWithTags(sInfi, tTags, ":PQ", ":Q3"))
        aSugg.add(_getConjWithTags(sInfi, tTags, ":PQ", ":Q4"))
        aSugg.discard("")
        # if there is only one past participle (epi inv), unreliable.
        if len(aSugg) == 1:
            aSugg.clear()
        if ":V1" in sMorph:
            aSugg.add(sInfi)
    return aSugg


def getConjSimilInfiV1 (sInfi):
    if sInfi not in _dVerb:
        return set()
    tTags = _getTags(sInfi)
    aSugg = set()
    aSugg.add(_getConjWithTags(sInfi, tTags, ":Iq", ":2s"))
    aSugg.add(_getConjWithTags(sInfi, tTags, ":Iq", ":3s"))
    aSugg.add(_getConjWithTags(sInfi, tTags, ":Iq", ":3p"))
    aSugg.add(_getConjWithTags(sInfi, tTags, ":Is", ":1s"))
    aSugg.add(_getConjWithTags(sInfi, tTags, ":Ip", ":2p"))
    aSugg.add(_getConjWithTags(sInfi, tTags, ":Iq", ":2p"))
    aSugg.discard("")
    return aSugg


def _getTags (sVerb):
    "returns tuple of tags (usable with functions _getConjWithTags and _hasConjWithTags)"
    if sVerb not in _dVerb:
        return None

Modified gc_lang/fr/modules/conj_data.py from [964dbf9799] to [96768c85b8].

cannot compute difference between binary files

Modified gc_lang/fr/modules/gce_suggestions.py from [69bb078e98] to [e839f7efe5].

11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    aSugg = set()
    for sStem in stem(sFlex):
        tTags = conj._getTags(sStem)
        if tTags:
            # we get the tense
            aTense = set()
            for sMorph in _dAnalyses.get(sFlex, []): # we don’t check if word exists in _dAnalyses, for it is assumed it has been done before
                for m in re.finditer(sStem+" .*?(:(?:Y|I[pqsf]|S[pq]|K|P))", sMorph):
                    # stem must be used in regex to prevent confusion between different verbs (e.g. sauras has 2 stems: savoir and saurer)
                    if m:
                        if m.group(1) == ":Y":
                            aTense.add(":Ip")
                            aTense.add(":Iq")
                            aTense.add(":Is")
                        elif m.group(1) == ":P":







|







11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    aSugg = set()
    for sStem in stem(sFlex):
        tTags = conj._getTags(sStem)
        if tTags:
            # we get the tense
            aTense = set()
            for sMorph in _dAnalyses.get(sFlex, []): # we don’t check if word exists in _dAnalyses, for it is assumed it has been done before
                for m in re.finditer(">"+sStem+" .*?(:(?:Y|I[pqsf]|S[pq]|K|P))", sMorph):
                    # stem must be used in regex to prevent confusion between different verbs (e.g. sauras has 2 stems: savoir and saurer)
                    if m:
                        if m.group(1) == ":Y":
                            aTense.add(":Ip")
                            aTense.add(":Iq")
                            aTense.add(":Is")
                        elif m.group(1) == ":P":
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388


def suggSimil (sWord, sPattern=None):
    "return list of words phonetically similar to sWord and whom POS is matching sPattern"
    # we don’t check if word exists in _dAnalyses, for it is assumed it has been done before
    aSugg = phonet.selectSimil(sWord, sPattern)
    for sMorph in _dAnalyses.get(sWord, []):
        for e in conj.getSimil(sWord, sMorph):
            aSugg.add(e)
        #aSugg = aSugg.union(conj.getSimil(sWord, sMorph))
    if aSugg:
        return "|".join(aSugg)
    return ""









|







374
375
376
377
378
379
380
381
382
383
384
385
386
387
388


def suggSimil (sWord, sPattern=None):
    "return list of words phonetically similar to sWord and whom POS is matching sPattern"
    # we don’t check if word exists in _dAnalyses, for it is assumed it has been done before
    aSugg = phonet.selectSimil(sWord, sPattern)
    for sMorph in _dAnalyses.get(sWord, []):
        for e in conj.getSimil(sWord, sMorph, sPattern):
            aSugg.add(e)
        #aSugg = aSugg.union(conj.getSimil(sWord, sMorph))
    if aSugg:
        return "|".join(aSugg)
    return ""


401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
    return "la"


_zBinary = re.compile("^[01]+$")

def formatNumber (s):
    nLen = len(s)
    if nLen <= 4:
        return s
    sRes = ""
    # nombre ordinaire
    nEnd = nLen
    while nEnd > 0:
        nStart = max(nEnd-3, 0)
        sRes = s[nStart:nEnd] + " " + sRes  if sRes  else s[nStart:nEnd]







|







401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
    return "la"


_zBinary = re.compile("^[01]+$")

def formatNumber (s):
    nLen = len(s)
    if nLen < 4:
        return s
    sRes = ""
    # nombre ordinaire
    nEnd = nLen
    while nEnd > 0:
        nStart = max(nEnd-3, 0)
        sRes = s[nStart:nEnd] + " " + sRes  if sRes  else s[nStart:nEnd]

Modified gc_lang/fr/modules/mfsp_data.py from [1852623acf] to [8457d42cd4].

cannot compute difference between binary files

Modified gc_lang/fr/modules/phonet.py from [31589198ae] to [d03956eafb].

14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
        return False
    if sWord in _dWord:
        if sPattern:
            return any(re.search(sPattern, sMorph)  for sSimil in getSimil(sWord)  for sMorph in _dMorph.get(sSimil, []))
        return True
    if sWord[0:1].isupper():
        sWord = sWord.lower()
    if sWord in _dWord:
        if sPattern:
            return any(re.search(sPattern, sMorph)  for sSimil in getSimil(sWord)  for sMorph in _dMorph.get(sSimil, []))
        return True
    return False


def getSimil (sWord):
    "return list of words phonetically similar to sWord"
    if not sWord:
        return []
    if sWord in _dWord:
        return _lSet[_dWord[sWord]]
    if sWord[0:1].isupper():
        sWord = sWord.lower()
    if sWord in _dWord:
        return _lSet[_dWord[sWord]]
    return []


def selectSimil (sWord, sPattern):
    "return list of words phonetically similar to sWord and whom POS is matching sPattern"
    if not sPattern:
        return set(getSimil(sWord))
    aSelect = set()
    for sSimil in getSimil(sWord):
        for sMorph in _dMorph.get(sSimil, []):
            if re.search(sPattern, sMorph):
                aSelect.add(sSimil)
    return aSelect







|
|
|
|











|
|













14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
        return False
    if sWord in _dWord:
        if sPattern:
            return any(re.search(sPattern, sMorph)  for sSimil in getSimil(sWord)  for sMorph in _dMorph.get(sSimil, []))
        return True
    if sWord[0:1].isupper():
        sWord = sWord.lower()
        if sWord in _dWord:
            if sPattern:
                return any(re.search(sPattern, sMorph)  for sSimil in getSimil(sWord)  for sMorph in _dMorph.get(sSimil, []))
            return True
    return False


def getSimil (sWord):
    "return list of words phonetically similar to sWord"
    if not sWord:
        return []
    if sWord in _dWord:
        return _lSet[_dWord[sWord]]
    if sWord[0:1].isupper():
        sWord = sWord.lower()
        if sWord in _dWord:
            return _lSet[_dWord[sWord]]
    return []


def selectSimil (sWord, sPattern):
    "return list of words phonetically similar to sWord and whom POS is matching sPattern"
    if not sPattern:
        return set(getSimil(sWord))
    aSelect = set()
    for sSimil in getSimil(sWord):
        for sMorph in _dMorph.get(sSimil, []):
            if re.search(sPattern, sMorph):
                aSelect.add(sSimil)
    return aSelect

Modified gc_lang/fr/modules/phonet_data.py from [98fafd6c52] to [522351bc79].

cannot compute difference between binary files

Modified gc_lang/fr/modules/tests.py from [43f5975205] to [78ace698ff].

72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
    def setUpClass (cls):
        cls.lSet = [
            ["ce", "se"],
            ["ces", "ses", "sais", "sait"],
            ["cet", "cette", "sept", "set", "sets"],
            ["dé", "dés", "dès", "dais", "des"],
            ["don", "dons", "dont"],
            ["été", "étais", "était", "étai", "étés", "étaient"],
            ["faire", "fer", "fers", "ferre", "ferres", "ferrent"],
            ["fois", "foi", "foie", "foies"],
            ["la", "là", "las"],
            ["mes", "mets", "met", "mai", "mais"],
            ["mon", "mont", "monts"],
            ["mot", "mots", "maux"],
            ["moi", "mois"],
            ["notre", "nôtre", "nôtres"],
            ["or", "ors", "hors"],
            ["hou", "houe", "houes", "ou", "où", "houx"],
            ["peu", "peux", "peut"],
            ["ses", "ces", "sais", "sait"],
            ["son", "sons", "sont"],
            ["tes", "taie", "taies", "thé", "thés"],
            ["toi", "toit", "toits"],
            ["ton", "tons", "thon", "thons", "tond", "tonds"],
            ["voir", "voire"]
        ]

    def test_getsimil (self):
        for aSet in self.lSet:







|













|







72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
    def setUpClass (cls):
        cls.lSet = [
            ["ce", "se"],
            ["ces", "ses", "sais", "sait"],
            ["cet", "cette", "sept", "set", "sets"],
            ["dé", "dés", "dès", "dais", "des"],
            ["don", "dons", "dont"],
            ["été", "étaie", "étaies", "étais", "était", "étai", "étés", "étaient"],
            ["faire", "fer", "fers", "ferre", "ferres", "ferrent"],
            ["fois", "foi", "foie", "foies"],
            ["la", "là", "las"],
            ["mes", "mets", "met", "mai", "mais"],
            ["mon", "mont", "monts"],
            ["mot", "mots", "maux"],
            ["moi", "mois"],
            ["notre", "nôtre", "nôtres"],
            ["or", "ors", "hors"],
            ["hou", "houe", "houes", "ou", "où", "houx"],
            ["peu", "peux", "peut"],
            ["ses", "ces", "sais", "sait"],
            ["son", "sons", "sont"],
            ["tes", "tais", "tait", "taie", "taies", "thé", "thés"],
            ["toi", "toit", "toits"],
            ["ton", "tons", "thon", "thons", "tond", "tonds"],
            ["voir", "voire"]
        ]

    def test_getsimil (self):
        for aSet in self.lSet:

Modified gc_lang/fr/oxt/About/About.py from [03886f10df] to [030798e09e].

37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
    def run (self, sLang):
        try:
            dUI = ab_strings.getUI(sLang)

            # dialog
            self.xDialog = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialogModel', self.ctx)
            self.xDialog.Width = 160
            self.xDialog.Height = 175
            self.xDialog.Title = dUI.get('windowtitle', "#err")
            xWindowSize = helpers.getWindowSize()
            self.xDialog.PositionX = int((xWindowSize.Width / 2) - (self.xDialog.Width / 2))
            self.xDialog.PositionY = int((xWindowSize.Height / 2) - (self.xDialog.Height / 2))
            
            # xWidgets
            hspace = 60
            nLblWidth = 140
            nLblHeight = 20
            nDescWidth = 140
            nDescHeight = 40
            nURLcolor = 0x4444FF
            
            xFD0 = uno.createUnoStruct("com.sun.star.awt.FontDescriptor")
            xFD0.Height = 20
            #xFD0.Weight = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD")
            xFD0.Name = "Verdana"
            







|






<

<
<
<







37
38
39
40
41
42
43
44
45
46
47
48
49
50

51



52
53
54
55
56
57
58
    def run (self, sLang):
        try:
            dUI = ab_strings.getUI(sLang)

            # dialog
            self.xDialog = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialogModel', self.ctx)
            self.xDialog.Width = 160
            self.xDialog.Height = 320
            self.xDialog.Title = dUI.get('windowtitle', "#err")
            xWindowSize = helpers.getWindowSize()
            self.xDialog.PositionX = int((xWindowSize.Width / 2) - (self.xDialog.Width / 2))
            self.xDialog.PositionY = int((xWindowSize.Height / 2) - (self.xDialog.Height / 2))
            
            # xWidgets

            nLblWidth = 140



            nURLcolor = 0x4444FF
            
            xFD0 = uno.createUnoStruct("com.sun.star.awt.FontDescriptor")
            xFD0.Height = 20
            #xFD0.Weight = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD")
            xFD0.Name = "Verdana"
            
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88

89







90
91
92
93
94
95
96

97
98
99
100
101



102
103
104
105
106
107
108
109
            xFD2.Name = "Verdana"

            xFD3 = uno.createUnoStruct("com.sun.star.awt.FontDescriptor")
            xFD3.Height = 12
            xFD3.Weight = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD")
            xFD3.Name = "Verdana"
            
            # Infos
            lblTitle = self._addWidget('lblTitle', 'FixedText', 60, 5, 100, 20, Label = dUI.get('title', "#err"), Align = 0, FontDescriptor = xFD0)
            lblVersion = self._addWidget('lblVersion', 'FixedText', 62, 25, 80, 10, Label = dUI.get('version', "#err"), Align = 0, FontDescriptor = xFD2)
            lblLicense = self._addWidget('lblLicense', 'FixedText', 62, 35, 80, 10, Label = dUI.get('license', "#err"), Align = 0, FontDescriptor = xFD2)
            lblWebsite = self._addWidget('lblWebsite', 'FixedHyperlink', 62, 45, 60, 10, Label = dUI.get('website', "#err"), Align = 0, \
                                         URL="http://www.dicollecte.org/grammalecte", FontDescriptor = xFD1, TextColor = nURLcolor)

            # logo
            xDefaultContext = self.ctx.ServiceManager.DefaultContext
            xPackageInfoProvider = xDefaultContext.getValueByName("/singletons/com.sun.star.deployment.PackageInformationProvider")
            sExtPath = xPackageInfoProvider.getPackageLocation("French.linguistic.resources.from.Dicollecte.by.OlivierR")
            imgLogo = self._addWidget('imgLogo', 'ImageControl', 5, 5, 50, 50, ImageURL = sExtPath+"/img/logo100.png", Border = 0, ScaleMode = 1)









            # Python version
            self._addWidget('lblpython', 'FixedText', 10, 60, 140, 10, Align = 1, TextColor = 0x888888, FontDescriptor = xFD2, \
                            Label = dUI.get('pythonver', "#err") + "{0[0]}.{0[1]}.{0[2]}".format(sys.version_info))

            # other
            line = self._addWidget('line', 'FixedLine', 10, 73, nDescWidth, 10)


            lblMsg = self._addWidget('lblMsg', 'FixedText', 10, 85, nDescWidth, 10, Label = dUI.get('message', "#err"), FontDescriptor = xFD2, Align = 1)
            lblURL1 = self._addWidget('lblURL1', 'FixedHyperlink', 10, 95, nDescWidth, 10, Label = dUI.get('sponsor', "#err"), \
                                      Align = 1, URL="http://www.lamouette.org/", FontDescriptor = xFD3, TextColor = nURLcolor)
            imgSponsor = self._addWidget('imgSponsor', 'ImageControl', 5, 107, 150, 50, ImageURL = sExtPath+"/img/LaMouette_small.png", Border = 0, ScaleMode = 1)
            lblURL2 = self._addWidget('lblURL2', 'FixedHyperlink', 10, 160, nDescWidth, 10, Label = dUI.get('link', "#err"), \



                                      Align = 1, URL="http://www.dicollecte.org/grammalecte/soutiens.php", FontDescriptor = xFD1, TextColor = nURLcolor)
            # button            
            #button = self._addWidget('close', 'Button', self.xDialog.Width - 25, self.xDialog.Height - 20, 20, 14, \
            #                         Label = dUI.get('close', "#err"), FontDescriptor = xFD1, TextColor = 0x004400)
            
            # container
            self.xContainer = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialog', self.ctx)
            self.xContainer.setModel(self.xDialog)







<
<
<
<
<
<
<




|
>

>
>
>
>
>
>
>

|



|

>
|
|
|
|
|
>
>
>
|







66
67
68
69
70
71
72







73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
            xFD2.Name = "Verdana"

            xFD3 = uno.createUnoStruct("com.sun.star.awt.FontDescriptor")
            xFD3.Height = 12
            xFD3.Weight = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD")
            xFD3.Name = "Verdana"
            







            # logo
            xDefaultContext = self.ctx.ServiceManager.DefaultContext
            xPackageInfoProvider = xDefaultContext.getValueByName("/singletons/com.sun.star.deployment.PackageInformationProvider")
            sExtPath = xPackageInfoProvider.getPackageLocation("French.linguistic.resources.from.Dicollecte.by.OlivierR")
            #imgLogo = self._addWidget('imgLogo', 'ImageControl', 5, 5, 50, 50, ImageURL = sExtPath+"/img/logo100.png", Border = 0, ScaleMode = 1)
            imgMainLogo = self._addWidget('imgMainLogo', 'ImageControl', 5, 5, 150, 80, ImageURL = sExtPath+"/img/logo120_text.png", Border = 0, ScaleMode = 1)

            # Infos
            #lblTitle = self._addWidget('lblTitle', 'FixedText', 60, 5, 100, 20, Label = dUI.get('title', "#err"), Align = 0, FontDescriptor = xFD0)            
            lblVersion = self._addWidget('lblVersion', 'FixedText', 5, 90, nLblWidth, 10, Label = dUI.get('version', "#err"), Align = 1, FontDescriptor = xFD2)
            lblLicense = self._addWidget('lblLicense', 'FixedText', 5, 100, nLblWidth, 10, Label = dUI.get('license', "#err"), Align = 1, FontDescriptor = xFD2)
            lblWebsite = self._addWidget('lblWebsite', 'FixedHyperlink', 5, 110, nLblWidth, 10, Label = dUI.get('website', "#err"), Align = 1, \
                                         URL="http://www.dicollecte.org/?from=grammalecte-lo", FontDescriptor = xFD1, TextColor = nURLcolor)

            # Python version
            self._addWidget('lblpython', 'FixedText', 10, 125, nLblWidth, 10, Align = 1, TextColor = 0x888888, FontDescriptor = xFD2, \
                            Label = dUI.get('pythonver', "#err") + "{0[0]}.{0[1]}.{0[2]}".format(sys.version_info))

            # other
            line = self._addWidget('line', 'FixedLine', 10, 140, nLblWidth, 10)

            # sponsors
            lblMsg = self._addWidget('lblMsg', 'FixedText', 10, 155, nLblWidth, 10, Label = dUI.get('message', "#err"), FontDescriptor = xFD2, Align = 1)
            lblURL1 = self._addWidget('lblURL1', 'FixedHyperlink', 10, 170, nLblWidth, 10, Label = dUI.get('sponsor', "#err"), \
                                      Align = 1, URL="http://lamouette.org/?from=grammalecte-lo", FontDescriptor = xFD3, TextColor = nURLcolor)
            imgSponsor = self._addWidget('imgSponsor', 'ImageControl', 5, 180, 150, 50, ImageURL = sExtPath+"/img/LaMouette_small.png", Border = 0, ScaleMode = 1)
            lblURL2 = self._addWidget('lblURL2', 'FixedHyperlink', 10, 235, nLblWidth, 10, Label = dUI.get('sponsor2', "#err"), \
                                      Align = 1, URL="https://www.algoo.fr/?from=grammalecte-lo", FontDescriptor = xFD3, TextColor = nURLcolor)
            imgSponsor2 = self._addWidget('imgSponsor2', 'ImageControl', 5, 245, 150, 50, ImageURL = sExtPath+"/img/Algoo_logo.png", Border = 0, ScaleMode = 1)
            lblURL3 = self._addWidget('lblURL3', 'FixedHyperlink', 10, 300, nLblWidth, 10, Label = dUI.get('link', "#err"), \
                                      Align = 1, URL="http://www.dicollecte.org/#thanks", FontDescriptor = xFD1, TextColor = nURLcolor)
            # button            
            #button = self._addWidget('close', 'Button', self.xDialog.Width - 25, self.xDialog.Height - 20, 20, 14, \
            #                         Label = dUI.get('close', "#err"), FontDescriptor = xFD1, TextColor = 0x004400)
            
            # container
            self.xContainer = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialog', self.ctx)
            self.xContainer.setModel(self.xDialog)

Modified gc_lang/fr/oxt/About/ab_strings.py from [e915407fb3] to [cb9cefc663].

13
14
15
16
17
18
19

20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

35
36
37
38
39
            "license": "Licence : GPL 3",
            "website": "Site web",

            "pythonver": "Machine virtuelle Python : v",

            "message": "Avec le soutien de",
            "sponsor": "La Mouette…",

            "link": "… et de nombreux contributeurs.",

            "close": "~OK"
          },
    "en": {
            "windowtitle": "About…",
            "title": "Grammalecte",
            "version": "Version: ${version}",
            "license": "License: GPL 3",
            "website": "Web site",

            "pythonver": "Python virtual machine: v",

            "message": "With the support of",
            "sponsor": "La Mouette…",

            "link": "… and many contributors.",

            "close": "~OK"
          }
}







>















>





13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
            "license": "Licence : GPL 3",
            "website": "Site web",

            "pythonver": "Machine virtuelle Python : v",

            "message": "Avec le soutien de",
            "sponsor": "La Mouette…",
            "sponsor2": "Algoo…",
            "link": "… et de nombreux contributeurs.",

            "close": "~OK"
          },
    "en": {
            "windowtitle": "About…",
            "title": "Grammalecte",
            "version": "Version: ${version}",
            "license": "License: GPL 3",
            "website": "Web site",

            "pythonver": "Python virtual machine: v",

            "message": "With the support of",
            "sponsor": "La Mouette…",
            "sponsor2": "Algoo…",
            "link": "… and many contributors.",

            "close": "~OK"
          }
}

Modified gc_lang/fr/oxt/Dictionnaires/dictionaries/README_dict_fr.txt from [b339c2b007] to [5f4220f497].

1
2
3
4
5
6
7
8
9
10
11
_______________________________________________________________________________

   DICTIONNAIRES ORTHOGRAPHIQUES FRANÇAIS
   version 6.1

   Olivier R. - dicollecte<at>free<dot>fr
   Dicollecte : http://www.dicollecte.org/

   Licence :
     MPL : Mozilla Public License
     version 2.0  --  http://www.mozilla.org/MPL/2.0/



|







1
2
3
4
5
6
7
8
9
10
11
_______________________________________________________________________________

   DICTIONNAIRES ORTHOGRAPHIQUES FRANÇAIS
   version 6.2

   Olivier R. - dicollecte<at>free<dot>fr
   Dicollecte : http://www.dicollecte.org/

   Licence :
     MPL : Mozilla Public License
     version 2.0  --  http://www.mozilla.org/MPL/2.0/

Modified gc_lang/fr/oxt/Dictionnaires/dictionaries/fr-classique.aff from [72d1113ea1] to [9ff9f77367].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# AFFIXES DU DICTIONNAIRE ORTHOGRAPHIQUE FRANÇAIS “CLASSIQUE” v6.1
# par Olivier R. -- licence MPL 2.0
# Généré le 03-06-2017 à 22:26
# Pour améliorer le dictionnaire, allez sur http://www.dicollecte.org/



SET UTF-8

WORDCHARS -’'1234567890.




|

|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# AFFIXES DU DICTIONNAIRE ORTHOGRAPHIQUE FRANÇAIS “CLASSIQUE” v6.2
# par Olivier R. -- licence MPL 2.0
# Généré le 26-07-2017 à 09:33
# Pour améliorer le dictionnaire, allez sur http://www.dicollecte.org/



SET UTF-8

WORDCHARS -’'1234567890.

Modified gc_lang/fr/oxt/Dictionnaires/dictionaries/fr-classique.dic from [e917007d9d] to [15ed4f1dbd].

1
2
3
4
5
6
7
8
80033
&
1er/--
1ers/--
1re/--
1res/--
1ʳᵉ/--
1ʳᵉˢ/--
|







1
2
3
4
5
6
7
8
80108
&
1er/--
1ers/--
1re/--
1res/--
1ʳᵉ/--
1ʳᵉˢ/--
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
Aïcha/L'D'Q'
Aïd/L'D'Q'
Aida/L'D'Q'
Aidan/L'D'Q'
Aïd-el-Adha/L'
Aïd-el-Kébir/L'
Aiden/L'D'Q'
Aignan
Aigoual/L'D'
Aigrain/L'D'Q'
Aimé/L'D'Q'
Aimée/L'D'Q'
Ain/L'
Airaines/L'D'Q'
Airbnb/L'D'Q'







|







187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
Aïcha/L'D'Q'
Aïd/L'D'Q'
Aida/L'D'Q'
Aidan/L'D'Q'
Aïd-el-Adha/L'
Aïd-el-Kébir/L'
Aiden/L'D'Q'
Aignan/L'D'Q'
Aigoual/L'D'
Aigrain/L'D'Q'
Aimé/L'D'Q'
Aimée/L'D'Q'
Ain/L'
Airaines/L'D'Q'
Airbnb/L'D'Q'
529
530
531
532
533
534
535

536
537
538
539
540
541
542
Arion/L'D'Q'
Aristarque/L'D'Q'
Aristide/L'D'Q'
Aristophane/L'D'Q'
Aristote/L'D'Q'
Arizona/L'D'
Arjuna/L'D'Q'

Arkansas/L'D'
Arkema/L'D'Q'
Arkham/L'D'Q'
Arkhangelsk/L'D'Q'
Arlene/L'D'Q'
Arlène/L'D'Q'
Arles/L'D'Q'







>







529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
Arion/L'D'Q'
Aristarque/L'D'Q'
Aristide/L'D'Q'
Aristophane/L'D'Q'
Aristote/L'D'Q'
Arizona/L'D'
Arjuna/L'D'Q'
Arkady/L'D'Q'
Arkansas/L'D'
Arkema/L'D'Q'
Arkham/L'D'Q'
Arkhangelsk/L'D'Q'
Arlene/L'D'Q'
Arlène/L'D'Q'
Arles/L'D'Q'
651
652
653
654
655
656
657

658
659
660
661
662
663
664
Aurélien/L'D'Q'
Aurelio/L'D'Q'
Auriane/L'D'Q'
Aurillac/L'D'Q'
Auriol/L'D'Q'
Aurore/L'D'Q'
Auschwitz/L'D'Q'

Austerlitz/L'D'Q'
Austin/L'D'Q'
Australasie/L'D'Q'
Australie/L'D'
Australie-Méridionale/L'D'
Australie-Occidentale/L'D'
Austrasie/L'D'







>







652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
Aurélien/L'D'Q'
Aurelio/L'D'Q'
Auriane/L'D'Q'
Aurillac/L'D'Q'
Auriol/L'D'Q'
Aurore/L'D'Q'
Auschwitz/L'D'Q'
Austen/L'D'Q'
Austerlitz/L'D'Q'
Austin/L'D'Q'
Australasie/L'D'Q'
Australie/L'D'
Australie-Méridionale/L'D'
Australie-Occidentale/L'D'
Austrasie/L'D'
896
897
898
899
900
901
902

903
904
905
906
907
908
909
Benoîte
Benozillo
Benpro
Bentama
Bentham
Bentley
Benveniste

Berchem-Sainte-Agathe
Berck
Bercy
Bérenger
Bérengère
Bérénice
Bérézina







>







898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
Benoîte
Benozillo
Benpro
Bentama
Bentham
Bentley
Benveniste
Bérangère
Berchem-Sainte-Agathe
Berck
Bercy
Bérenger
Bérengère
Bérénice
Bérézina
1330
1331
1332
1333
1334
1335
1336

1337
1338
1339
1340
1341
1342
1343
Caine
Caïphe
Caire
Caitlin
Caitlyn
Calabre
Calais

Calc
Calcutta
Calderón
Caleb
Calédonie
Calestienne
Calgary







>







1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
Caine
Caïphe
Caire
Caitlin
Caitlyn
Calabre
Calais
Calaisis
Calc
Calcutta
Calderón
Caleb
Calédonie
Calestienne
Calgary
1646
1647
1648
1649
1650
1651
1652

1653
1654
1655
1656
1657
1658
1659
Chostakovitch
Chris
Christa
Christel
Christèle
Christelle
Christian

Christiane
Christie
Christina
Christine
Christmas
Christoffel
Christoph







>







1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
Chostakovitch
Chris
Christa
Christel
Christèle
Christelle
Christian
Christiana
Christiane
Christie
Christina
Christine
Christmas
Christoffel
Christoph
1674
1675
1676
1677
1678
1679
1680

1681
1682
1683
1684
1685
1686
1687
Cincinnati
Cindy
Ciney
Ciotat
Circassie
Circé
Cirey-sur-Vezouze

Cisjordanie
Cîteaux
Citroën
City
Claire
Clamart
Clara







>







1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
Cincinnati
Cindy
Ciney
Ciotat
Circassie
Circé
Cirey-sur-Vezouze
Cisco
Cisjordanie
Cîteaux
Citroën
City
Claire
Clamart
Clara
2486
2487
2488
2489
2490
2491
2492

2493
2494
2495
2496
2497
2498
2499
Eure-et-Loir/L'D'
Euripide/L'D'Q'
Eurobaromètre/S*
Eurogroupe/L'
Euronext/L'D'Q'
Europe/L'D'
Europol/D'Q'

Eurozone/L'
Eurydice/L'D'Q'
Eusèbe/L'D'Q'
Euterpe/L'D'Q'
Eva/L'D'Q'
Éva/L'D'Q'
Évaine/L'D'Q'







>







2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
Eure-et-Loir/L'D'
Euripide/L'D'Q'
Eurobaromètre/S*
Eurogroupe/L'
Euronext/L'D'Q'
Europe/L'D'
Europol/D'Q'
Eurotunnel/L'D'Q'
Eurozone/L'
Eurydice/L'D'Q'
Eusèbe/L'D'Q'
Euterpe/L'D'Q'
Eva/L'D'Q'
Éva/L'D'Q'
Évaine/L'D'Q'
2596
2597
2598
2599
2600
2601
2602

2603
2604
2605
2606
2607
2608
2609
Fayard
Fayçal
Fayette
Fécamp
Fed
FedEx
Federer

Federico
Fehling
Feist
Feïza
Feldane
Felicia
Félicie







>







2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
Fayard
Fayçal
Fayette
Fécamp
Fed
FedEx
Federer
Federica
Federico
Fehling
Feist
Feïza
Feldane
Felicia
Félicie
3217
3218
3219
3220
3221
3222
3223

3224
3225
3226
3227
3228
3229
3230
Halluin/L'D'Q'
Ham/L'D'Q'
Hamas
Hambourg
Hamel
Hamid/L'D'Q'
Hamilton

Hamme
HammerFall
Hammourabi
Hamont-Achel/L'D'Q'
Hampshire
Ham-sur-Heure-Nalinnes/L'D'Q'
Hamza/L'D'Q'







>







3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
Halluin/L'D'Q'
Ham/L'D'Q'
Hamas
Hambourg
Hamel
Hamid/L'D'Q'
Hamilton
Hamlet/L'D'Q'
Hamme
HammerFall
Hammourabi
Hamont-Achel/L'D'Q'
Hampshire
Ham-sur-Heure-Nalinnes/L'D'Q'
Hamza/L'D'Q'
3462
3463
3464
3465
3466
3467
3468

3469
3470
3471
3472
3473
3474
3475
Howard
Hubble
Hubei
Hubert/L'D'Q'
Hubscher
Hudson/L'D'Q'
Huelgoat

Hugo/L'D'Q'
Hugo/L'D'Q'
Hugues/L'D'Q'
Huguette
Hulshout/L'D'Q'
Hume
Hun/S.







>







3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
Howard
Hubble
Hubei
Hubert/L'D'Q'
Hubscher
Hudson/L'D'Q'
Huelgoat
Hugh/L'D'Q'
Hugo/L'D'Q'
Hugo/L'D'Q'
Hugues/L'D'Q'
Huguette
Hulshout/L'D'Q'
Hume
Hun/S.
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
IMSI/L'D'Q'
INED/L'D'Q'
INPI/L'D'Q'
INRA/L'D'Q'
INRI/L'D'Q'
INRIA/L'D'Q'
INSA/L'D'Q'
INSERM/L'D'Q'
IP/L'D'Q'
IRA/L'
IRD/L'D'Q'
IRFM/L'D'Q'
IRL
IRM/L'D'Q'
IRSTEA/L'D'Q'







<







3526
3527
3528
3529
3530
3531
3532

3533
3534
3535
3536
3537
3538
3539
IMSI/L'D'Q'
INED/L'D'Q'
INPI/L'D'Q'
INRA/L'D'Q'
INRI/L'D'Q'
INRIA/L'D'Q'
INSA/L'D'Q'

IP/L'D'Q'
IRA/L'
IRD/L'D'Q'
IRFM/L'D'Q'
IRL
IRM/L'D'Q'
IRSTEA/L'D'Q'
3595
3596
3597
3598
3599
3600
3601

3602
3603
3604
3605
3606
3607
3608
Ingrid/L'D'Q'
Inkscape/L'D'Q'
Inn/L'D'
Inna/L'D'Q'
Innsmouth/L'D'Q'
Inovia/L'D'Q'
Insee/L'D'Q'

Insulinde/L'D'
Intel/L'D'Q'
Internet/D'Q'
Interpol/D'Q'
Io/L'D'Q'
Ionesco/L'D'Q'
Ioulia/L'D'Q'







>







3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
Ingrid/L'D'Q'
Inkscape/L'D'Q'
Inn/L'D'
Inna/L'D'Q'
Innsmouth/L'D'Q'
Inovia/L'D'Q'
Insee/L'D'Q'
Inserm/L'D'Q'
Insulinde/L'D'
Intel/L'D'Q'
Internet/D'Q'
Interpol/D'Q'
Io/L'D'Q'
Ionesco/L'D'Q'
Ioulia/L'D'Q'
4297
4298
4299
4300
4301
4302
4303

4304
4305
4306
4307
4308
4309
4310
Léonore
Léontine
Léopold
Léopoldine
Leopoldt
Léopoldville
Leroy

Lesbos
Lesieur
Lesley
Leslie
Lesneven
Lesotho
Lesse







>







4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
Léonore
Léontine
Léopold
Léopoldine
Leopoldt
Léopoldville
Leroy
Lesage
Lesbos
Lesieur
Lesley
Leslie
Lesneven
Lesotho
Lesse
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
Noisy-le-Grand
Noisy-le-Sec
Nokia
Nolan
Nolwenn
Nora
Norbert
Nord
Nord-Kivu
Nord-Pas-de-Calais
Nord-du-Québec
Nordine
Norfolk
Norique
Norma







<







5485
5486
5487
5488
5489
5490
5491

5492
5493
5494
5495
5496
5497
5498
Noisy-le-Grand
Noisy-le-Sec
Nokia
Nolan
Nolwenn
Nora
Norbert

Nord-Kivu
Nord-Pas-de-Calais
Nord-du-Québec
Nordine
Norfolk
Norique
Norma
6210
6211
6212
6213
6214
6215
6216

6217
6218
6219
6220
6221
6222
6223
Reidemeister
Reiko
Reims
Reiten
Relecq-Kerhuon
Rellich
Rembrandt

Rémi
Remich
Remire-Montjoly
Remus
Rémy
Renaix
Renan







>







6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
Reidemeister
Reiko
Reims
Reiten
Relecq-Kerhuon
Rellich
Rembrandt
Remi
Rémi
Remich
Remire-Montjoly
Remus
Rémy
Renaix
Renan
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
Rosita
Rosny-sous-Bois
Ross
Rossini
Rossinière
Rostand
Roswell
Roth
Roth
Rothbard
Rothschild
Rotin
Rotselaar
Rotterdam
Roubaix







<







6391
6392
6393
6394
6395
6396
6397

6398
6399
6400
6401
6402
6403
6404
Rosita
Rosny-sous-Bois
Ross
Rossini
Rossinière
Rostand
Roswell

Roth
Rothbard
Rothschild
Rotin
Rotselaar
Rotterdam
Roubaix
9074
9075
9076
9077
9078
9079
9080
9081
9082
9083
9084
9085

9086
9087
9088
9089
9090
9091
9092
additionnelle/F*
additionnellement/D'Q'
additionner/a4p+
additionneuse/F*
additive/F*
additivement/D'Q'
additivité/S*
addon/S*
adducteur/S*
adduction/S*
adduit/S*
adèle/S*

adelphophagie/S*
adénine/S*
adénite/S*
adénocarcinome/S*
adénogramme/S*
adénoïde/S*
adénoïdectomie/S*







|




>







9084
9085
9086
9087
9088
9089
9090
9091
9092
9093
9094
9095
9096
9097
9098
9099
9100
9101
9102
9103
additionnelle/F*
additionnellement/D'Q'
additionner/a4p+
additionneuse/F*
additive/F*
additivement/D'Q'
additivité/S*
add-on/S*
adducteur/S*
adduction/S*
adduit/S*
adèle/S*
adelphe/S*
adelphophagie/S*
adénine/S*
adénite/S*
adénocarcinome/S*
adénogramme/S*
adénoïde/S*
adénoïdectomie/S*
9307
9308
9309
9310
9311
9312
9313

9314
9315
9316
9317
9318
9319
9320
aérobie/S*
aérobie/S*
aérobiologie/S*
aérobiologique/S*
aérobiose/S*
aérobique/S*
aérocâble/S*

aéro-club/S*
aérocolie/S*
aérodigestive/F*
aérodistorsion/S*
aérodrome/S*
aérodynamicienne/F*
aérodynamique/S*







>







9318
9319
9320
9321
9322
9323
9324
9325
9326
9327
9328
9329
9330
9331
9332
aérobie/S*
aérobie/S*
aérobiologie/S*
aérobiologique/S*
aérobiose/S*
aérobique/S*
aérocâble/S*
aéroclub/S*
aéro-club/S*
aérocolie/S*
aérodigestive/F*
aérodistorsion/S*
aérodrome/S*
aérodynamicienne/F*
aérodynamique/S*
9758
9759
9760
9761
9762
9763
9764

9765
9766
9767
9768
9769
9770
9771
agroalimentaire/S*
agro-alimentaire/S*
agroalimentaire/S*
agro-alimentaire/S*
agrobiologie/S*
agrobiologique/S*
agrobiologiste/S*

agrocarburant/S*
agro-carburant/S*
agrochimie/S*
agrochimique/S*
agrochimiste/S*
agroclimatique/S*
agro-climatique/S*







>







9770
9771
9772
9773
9774
9775
9776
9777
9778
9779
9780
9781
9782
9783
9784
agroalimentaire/S*
agro-alimentaire/S*
agroalimentaire/S*
agro-alimentaire/S*
agrobiologie/S*
agrobiologique/S*
agrobiologiste/S*
agrobusiness/L'D'Q'
agrocarburant/S*
agro-carburant/S*
agrochimie/S*
agrochimique/S*
agrochimiste/S*
agroclimatique/S*
agro-climatique/S*
9900
9901
9902
9903
9904
9905
9906

9907
9908
9909
9910
9911
9912
9913
aillade/S*
ailler/a2p+
ailleurs/L'D'Q'
ailloli/S*
aimable/S*
aimablement/D'Q'
aimant/S*

aimantation/S*
aimante/F*
aimanter/a4p+
aimantin/S*
aimantine/F*
aimée/F*
aimer/a4p+







>







9913
9914
9915
9916
9917
9918
9919
9920
9921
9922
9923
9924
9925
9926
9927
aillade/S*
ailler/a2p+
ailleurs/L'D'Q'
ailloli/S*
aimable/S*
aimablement/D'Q'
aimant/S*
aimantable/S*
aimantation/S*
aimante/F*
aimanter/a4p+
aimantin/S*
aimantine/F*
aimée/F*
aimer/a4p+
10544
10545
10546
10547
10548
10549
10550
10551
10552
10553
10554
10555
10556
10557
10558
amathie/S*
amatir/f2p+
amatrice/F*
amaurose/S*
amazone/S*
amazonienne/F*
amazonite/S*
ambages/D'Q'
ambassade/S*
ambassadrice/F*
ambiance/S*
ambiancer/a1p.
ambianceuse/F*
ambiante/F*
ambidextre/S*







|







10558
10559
10560
10561
10562
10563
10564
10565
10566
10567
10568
10569
10570
10571
10572
amathie/S*
amatir/f2p+
amatrice/F*
amaurose/S*
amazone/S*
amazonienne/F*
amazonite/S*
ambage/S*
ambassade/S*
ambassadrice/F*
ambiance/S*
ambiancer/a1p.
ambianceuse/F*
ambiante/F*
ambidextre/S*
11399
11400
11401
11402
11403
11404
11405

11406
11407
11408
11409
11410
11411
11412
annuité/S*
annulabilité/S*
annulable/S*
annulaire/S*
annulation/S*
annulative/F*
annulatrice/F*

annuler/a4p+
annuus
anoblir/f4p+
anoblissante/F*
anoblissement/S*
anode/S*
anodine/F*







>







11413
11414
11415
11416
11417
11418
11419
11420
11421
11422
11423
11424
11425
11426
11427
annuité/S*
annulabilité/S*
annulable/S*
annulaire/S*
annulation/S*
annulative/F*
annulatrice/F*
annulement/S*
annuler/a4p+
annuus
anoblir/f4p+
anoblissante/F*
anoblissement/S*
anode/S*
anodine/F*
11726
11727
11728
11729
11730
11731
11732


11733
11734
11735
11736
11737
11738
11739
antiémeute/L'D'Q'
antienne/S*
antienzyme/S*
anti-enzyme/S*
antiépileptique/S*
antiesclavagiste/S*
antiétatique/S*


antifading/S*
antifascisme/S*
antifasciste/S*
antiféminisme/S*
antiféministe/S*
antiferment/S*
antiferroélectricité/S*







>
>







11741
11742
11743
11744
11745
11746
11747
11748
11749
11750
11751
11752
11753
11754
11755
11756
antiémeute/L'D'Q'
antienne/S*
antienzyme/S*
anti-enzyme/S*
antiépileptique/S*
antiesclavagiste/S*
antiétatique/S*
antiétatisme/S*
antifa/S*
antifading/S*
antifascisme/S*
antifasciste/S*
antiféminisme/S*
antiféministe/S*
antiferment/S*
antiferroélectricité/S*
12550
12551
12552
12553
12554
12555
12556

12557
12558
12559
12560
12561
12562
12563
arc/S*
arcade/S*
arcane/S*
arcanson/S*
arcasse/S*
arcature/S*
arc-boutant/L'D'Q'

arc-bouter/a4p+
arccos
arccosh
arccotan
arccotanh
arc-doubleau/L'D'Q'
arceau/X*







>







12567
12568
12569
12570
12571
12572
12573
12574
12575
12576
12577
12578
12579
12580
12581
arc/S*
arcade/S*
arcane/S*
arcanson/S*
arcasse/S*
arcature/S*
arc-boutant/L'D'Q'
arc-boutement
arc-bouter/a4p+
arccos
arccosh
arccotan
arccotanh
arc-doubleau/L'D'Q'
arceau/X*
12647
12648
12649
12650
12651
12652
12653

12654
12655
12656
12657
12658
12659
12660
archontat/S*
archonte/S*
archosaurien/S*
archure/S*
arçon/S*
arçonner/a2p+
arcs-boutants/D'Q'

arcs-doubleaux/D'Q'
arcs-en-ciel/D'Q'
arcsin
arcsinh
arctan
arctanh
arctique/S*







>







12665
12666
12667
12668
12669
12670
12671
12672
12673
12674
12675
12676
12677
12678
12679
archontat/S*
archonte/S*
archosaurien/S*
archure/S*
arçon/S*
arçonner/a2p+
arcs-boutants/D'Q'
arcs-boutements
arcs-doubleaux/D'Q'
arcs-en-ciel/D'Q'
arcsin
arcsinh
arctan
arctanh
arctique/S*
15085
15086
15087
15088
15089
15090
15091

15092
15093
15094
15095
15096
15097
15098
bascule/S.
basculement/S.
basculer/a0p+
basculeur/S.
bas-culotte/S.
bas-de-casse
base/S.

base-ball/S.
baselle/S.
baser/a0p+
bas-fond/S.
basicité/S.
baside/S.
basidiomycète/S.







>







15104
15105
15106
15107
15108
15109
15110
15111
15112
15113
15114
15115
15116
15117
15118
bascule/S.
basculement/S.
basculer/a0p+
basculeur/S.
bas-culotte/S.
bas-de-casse
base/S.
baseball/S.
base-ball/S.
baselle/S.
baser/a0p+
bas-fond/S.
basicité/S.
baside/S.
basidiomycète/S.
15106
15107
15108
15109
15110
15111
15112

15113
15114
15115
15116
15117
15118
15119
basilique/S.
basin/S.
basiphile/S.
basique/S.
basiquement
bas-jointée/F.
basket/S.

basket-ball/S.
basketteuse/F.
bas-mât/S.
basmati/S.
basocellulaire/S.
basoche/S.
basochienne/F.







>







15126
15127
15128
15129
15130
15131
15132
15133
15134
15135
15136
15137
15138
15139
15140
basilique/S.
basin/S.
basiphile/S.
basique/S.
basiquement
bas-jointée/F.
basket/S.
basketball/S.
basket-ball/S.
basketteuse/F.
bas-mât/S.
basmati/S.
basocellulaire/S.
basoche/S.
basochienne/F.
15609
15610
15611
15612
15613
15614
15615

15616
15617
15618
15619
15620
15621
15622
bernard-l'hermite
berne/S.
berner/a0p+
berneuse/F.
bernicle/S.
bernique
bernique/S.

berrichonne/F.
bersaglier/S.
berthon/S.
bertillonnage/S.
béryl/S.
bérylliose/S.
béryllium/S.







>







15630
15631
15632
15633
15634
15635
15636
15637
15638
15639
15640
15641
15642
15643
15644
bernard-l'hermite
berne/S.
berner/a0p+
berneuse/F.
bernicle/S.
bernique
bernique/S.
bernoise/F.
berrichonne/F.
bersaglier/S.
berthon/S.
bertillonnage/S.
béryl/S.
bérylliose/S.
béryllium/S.
16759
16760
16761
16762
16763
16764
16765

16766
16767
16768
16769
16770
16771
16772
bongo/S.
bonheur/S.
bonheur-du-jour
bonheurs-du-jour
bonhomie/S.
bonhomme
bonhomme/S.

boni/S.
bonichon/S.
bonifiante/F.
bonification/S.
bonifier/a0p+
boniment/S.
bonimenter/a0p.







>







16781
16782
16783
16784
16785
16786
16787
16788
16789
16790
16791
16792
16793
16794
16795
bongo/S.
bonheur/S.
bonheur-du-jour
bonheurs-du-jour
bonhomie/S.
bonhomme
bonhomme/S.
bonhommie/S.
boni/S.
bonichon/S.
bonifiante/F.
bonification/S.
bonifier/a0p+
boniment/S.
bonimenter/a0p.
17890
17891
17892
17893
17894
17895
17896

17897
17898
17899
17900
17901
17902
17903
bugne/S.
bugrane/S.
buguée/F.
build/S.
building/S.
buire/S.
buis

buisson/S.
buisson-ardent
buissonnante/F.
buissonnet/S.
buissonneuse/W.
buissonnière/F.
buissons-ardents







>







17913
17914
17915
17916
17917
17918
17919
17920
17921
17922
17923
17924
17925
17926
17927
bugne/S.
bugrane/S.
buguée/F.
build/S.
building/S.
buire/S.
buis
buissaie/S.
buisson/S.
buisson-ardent
buissonnante/F.
buissonnet/S.
buissonneuse/W.
buissonnière/F.
buissons-ardents
18232
18233
18234
18235
18236
18237
18238

18239
18240
18241
18242
18243
18244
18245
cadrer/a0p+
cadreuse/F.
cadriciel/S.
caduc/S.
caducée/S.
caducifoliée/F.
caducité/S.

caduque/S.
cæcale/W.
cæcotrophie/S.
cæcum/S.
caennaise/F.
cænogenèse/S.
cæsine







>







18256
18257
18258
18259
18260
18261
18262
18263
18264
18265
18266
18267
18268
18269
18270
cadrer/a0p+
cadreuse/F.
cadriciel/S.
caduc/S.
caducée/S.
caducifoliée/F.
caducité/S.
caduque/F.
caduque/S.
cæcale/W.
cæcotrophie/S.
cæcum/S.
caennaise/F.
cænogenèse/S.
cæsine
18632
18633
18634
18635
18636
18637
18638
18639
18640
18641
18642
18643
18644
18645
18646
18647
camping-car/S.
camping-caravaning/S.
camping-gaz
campinoise/F.
campo/S.
campus
camuse/F.
canada
canada/S.
canadianisme/S.
canadienne/F.
canado-américaine/F.
canaille/S.
canaillement
canaillerie/S.
canaillocratie/S.







|
|







18657
18658
18659
18660
18661
18662
18663
18664
18665
18666
18667
18668
18669
18670
18671
18672
camping-car/S.
camping-caravaning/S.
camping-gaz
campinoise/F.
campo/S.
campus
camuse/F.
canada/S.
canadair/S.
canadianisme/S.
canadienne/F.
canado-américaine/F.
canaille/S.
canaillement
canaillerie/S.
canaillocratie/S.
19626
19627
19628
19629
19630
19631
19632

19633
19634
19635
19636
19637
19638
19639
caucasique/S.
cauchemar/S.
cauchemarder/a0p.
cauchemardesque/S.
cauchemardeuse/W.
caucus
caudale/W.

caudataire/S.
caudataire/S.
caudillo/S.
caudine/S.
caudrette/S.
caulescente/F.
caulicole/S.







>







19651
19652
19653
19654
19655
19656
19657
19658
19659
19660
19661
19662
19663
19664
19665
caucasique/S.
cauchemar/S.
cauchemarder/a0p.
cauchemardesque/S.
cauchemardeuse/W.
caucus
caudale/W.
caudalie/S.
caudataire/S.
caudataire/S.
caudillo/S.
caudine/S.
caudrette/S.
caulescente/F.
caulicole/S.
24296
24297
24298
24299
24300
24301
24302

24303
24304
24305
24306
24307
24308
24309
corruptrice/F.
corsage/S.
corsaire/S.
corse/S.
corselet/S.
corser/a0p+
corset/S.

corseter/b0p+
corseterie/S.
corsetière/F.
corso/S.
cortège/S.
cortès
cortex







>







24322
24323
24324
24325
24326
24327
24328
24329
24330
24331
24332
24333
24334
24335
24336
corruptrice/F.
corsage/S.
corsaire/S.
corse/S.
corselet/S.
corser/a0p+
corset/S.
corsetage/S.
corseter/b0p+
corseterie/S.
corsetière/F.
corso/S.
cortège/S.
cortès
cortex
24742
24743
24744
24745
24746
24747
24748

24749
24750
24751
24752
24753
24754
24755
covenant/S.
covendeuse/F.
cover-girl/S.
covoiturage/S.
covoiturer/a0p+
covoitureuse/F.
covolume/S.

cow-boy/S.
cowper/S.
coxale/W.
coxalgie/S.
coxalgique/S.
coxarthrose/S.
coxer/a0p+







>







24769
24770
24771
24772
24773
24774
24775
24776
24777
24778
24779
24780
24781
24782
24783
covenant/S.
covendeuse/F.
cover-girl/S.
covoiturage/S.
covoiturer/a0p+
covoitureuse/F.
covolume/S.
cowboy/S.
cow-boy/S.
cowper/S.
coxale/W.
coxalgie/S.
coxalgique/S.
coxarthrose/S.
coxer/a0p+
25820
25821
25822
25823
25824
25825
25826

25827
25828
25829
25830
25831
25832
25833
cytotoxique/S.
czar/S.
czardas
czimbalum/S.
d
d/||--
dB/||--

dacryoadénite/S.
dacryocystite/S.
dactyle/S.
dactylique/S.
dactylo/S.
dactylogramme/S.
dactylographe/S.







>







25848
25849
25850
25851
25852
25853
25854
25855
25856
25857
25858
25859
25860
25861
25862
cytotoxique/S.
czar/S.
czardas
czimbalum/S.
d
d/||--
dB/||--
daba/S.
dacryoadénite/S.
dacryocystite/S.
dactyle/S.
dactylique/S.
dactylo/S.
dactylogramme/S.
dactylographe/S.
27613
27614
27615
27616
27617
27618
27619

27620
27621
27622
27623
27624
27625
27626
dénombrabilité/S.
dénombrable/S.
dénombrement/S.
dénombrer/a0p+
dénominateur/S.
dénomination/S.
dénominative/F.

dénommer/a0p+
dénoncer/a0p+
dénonciation/S.
dénonciatrice/F.
dénotation/S.
dénotationnelle/F.
dénotative/F.







>







27642
27643
27644
27645
27646
27647
27648
27649
27650
27651
27652
27653
27654
27655
27656
dénombrabilité/S.
dénombrable/S.
dénombrement/S.
dénombrer/a0p+
dénominateur/S.
dénomination/S.
dénominative/F.
dénommable/S.
dénommer/a0p+
dénoncer/a0p+
dénonciation/S.
dénonciatrice/F.
dénotation/S.
dénotationnelle/F.
dénotative/F.
28412
28413
28414
28415
28416
28417
28418

28419
28420
28421
28422
28423
28424
28425
désincorporer/a0p+
désincrustation/S.
désincruster/a0p+
désinculper/a0p+
désindenter/a0p+
désindexation/S.
désindexer/a0p+

désindustrialisation/S.
désindustrialiser/a0p+
désinence/S.
désinentielle/F.
désinfectante/F.
désinfecter/a0p+
désinfection/S.







>







28442
28443
28444
28445
28446
28447
28448
28449
28450
28451
28452
28453
28454
28455
28456
désincorporer/a0p+
désincrustation/S.
désincruster/a0p+
désinculper/a0p+
désindenter/a0p+
désindexation/S.
désindexer/a0p+
désindividualiser/a0p+
désindustrialisation/S.
désindustrialiser/a0p+
désinence/S.
désinentielle/F.
désinfectante/F.
désinfecter/a0p+
désinfection/S.
28461
28462
28463
28464
28465
28466
28467

28468
28469
28470
28471
28472
28473
28474
désinviter/a0p+
désinvolte/S.
désinvoltement
désinvolture/S.
désir/S.
désirabilité/S.
désirable/S.

désirer/a0p+
désireuse/W.
désistement/S.
désister/a0p+
desman/S.
desmine/S.
desmodonte/S.







>







28492
28493
28494
28495
28496
28497
28498
28499
28500
28501
28502
28503
28504
28505
28506
désinviter/a0p+
désinvolte/S.
désinvoltement
désinvolture/S.
désir/S.
désirabilité/S.
désirable/S.
désirante/F.
désirer/a0p+
désireuse/W.
désistement/S.
désister/a0p+
desman/S.
desmine/S.
desmodonte/S.
29091
29092
29093
29094
29095
29096
29097

29098
29099
29100
29101
29102
29103
29104
diarrhée/S.
diarrhéique/S.
diarthrose/S.
diascope/S.
diascopie/S.
diascordium/S.
diaspora/S.

diastase/S.
diastasique/S.
diastème/S.
diastéréo-isomère/S.
diastole/S.
diastolique/S.
diastratique/S.







>







29123
29124
29125
29126
29127
29128
29129
29130
29131
29132
29133
29134
29135
29136
29137
diarrhée/S.
diarrhéique/S.
diarthrose/S.
diascope/S.
diascopie/S.
diascordium/S.
diaspora/S.
diasporique/S.
diastase/S.
diastasique/S.
diastème/S.
diastéréo-isomère/S.
diastole/S.
diastolique/S.
diastratique/S.
29806
29807
29808
29809
29810
29811
29812

29813
29814
29815
29816
29817
29818
29819
diversement
diverses
diversifiable/S.
diversification/S.
diversifier/a0p+
diversiforme/S.
diversion/S.

diversité/S.
diverticule/S.
diverticulite/S.
diverticulose/S.
divertimento/S.
divertir/f0p+
divertissante/F.







>







29839
29840
29841
29842
29843
29844
29845
29846
29847
29848
29849
29850
29851
29852
29853
diversement
diverses
diversifiable/S.
diversification/S.
diversifier/a0p+
diversiforme/S.
diversion/S.
diversitaire/S.
diversité/S.
diverticule/S.
diverticulite/S.
diverticulose/S.
divertimento/S.
divertir/f0p+
divertissante/F.
32415
32416
32417
32418
32419
32420
32421

32422
32423
32424
32425
32426
32427
32428
endoénergétique/S*
endogame/S*
endogamie/S*
endogamique/S*
endogée/F*
endogène/S*
endogénéité/S*

endolocalisation/S*
endolorir/f2p+
endolorissement/S*
endolymphe/S*
endomètre/S*
endométriose/S*
endométrite/S*







>







32449
32450
32451
32452
32453
32454
32455
32456
32457
32458
32459
32460
32461
32462
32463
endoénergétique/S*
endogame/S*
endogamie/S*
endogamique/S*
endogée/F*
endogène/S*
endogénéité/S*
endogroupe/S*
endolocalisation/S*
endolorir/f2p+
endolorissement/S*
endolymphe/S*
endomètre/S*
endométriose/S*
endométrite/S*
34197
34198
34199
34200
34201
34202
34203


34204
34205
34206
34207
34208
34209
34210
ethmoïdale/W*
ethmoïde/S*
ethmoïdite/S*
ethnarchie/S*
ethnarque/S*
ethnicisation/S*
ethniciser/a2p+


ethnicité/S*
ethnico-religieuse/W*
ethnie/S*
ethnique/S*
ethniquement/D'Q'
ethnobiologie/S*
ethnobotanique/S*







>
>







34232
34233
34234
34235
34236
34237
34238
34239
34240
34241
34242
34243
34244
34245
34246
34247
ethmoïdale/W*
ethmoïde/S*
ethmoïdite/S*
ethnarchie/S*
ethnarque/S*
ethnicisation/S*
ethniciser/a2p+
ethnicisme/S*
ethniciste/S*
ethnicité/S*
ethnico-religieuse/W*
ethnie/S*
ethnique/S*
ethniquement/D'Q'
ethnobiologie/S*
ethnobotanique/S*
34232
34233
34234
34235
34236
34237
34238

34239
34240
34241
34242
34243
34244
34245
ethnométhodologue/S*
ethnomusicologie/S*
ethnomusicologue/S*
ethnonyme/S*
ethnonymie/S*
ethnopsychiatrie/S*
ethnopsychologie/S*

ethnoreligieuse/W*
éthographie/S*
éthologie/S*
éthologique/S*
éthologiste/S*
éthologue/S*
ethos/L'D'Q'







>







34269
34270
34271
34272
34273
34274
34275
34276
34277
34278
34279
34280
34281
34282
34283
ethnométhodologue/S*
ethnomusicologie/S*
ethnomusicologue/S*
ethnonyme/S*
ethnonymie/S*
ethnopsychiatrie/S*
ethnopsychologie/S*
ethno-raciale/W*
ethnoreligieuse/W*
éthographie/S*
éthologie/S*
éthologique/S*
éthologiste/S*
éthologue/S*
ethos/L'D'Q'
34827
34828
34829
34830
34831
34832
34833

34834
34835
34836
34837
34838
34839
34840
exode/S*
exoderme/S*
exogame/S*
exogamie/S*
exogamique/S*
exogène/S*
exogénéité/S*

exomphale/S*
exon/S*
exondation/S*
exondement/S*
exonder/a3p+
exonération/S*
exonérer/c4p+







>







34865
34866
34867
34868
34869
34870
34871
34872
34873
34874
34875
34876
34877
34878
34879
exode/S*
exoderme/S*
exogame/S*
exogamie/S*
exogamique/S*
exogène/S*
exogénéité/S*
exogroupe/S*
exomphale/S*
exon/S*
exondation/S*
exondement/S*
exonder/a3p+
exonération/S*
exonérer/c4p+
35033
35034
35035
35036
35037
35038
35039


35040
35041
35042
35043
35044
35045
35046
extensionnelle/F*
extensité/S*
extensive/F*
extensivement/L'D'Q'
extensivité/S*
extenso
extensomètre/S*


exténuante/F*
exténuation/S*
exténuée/F*
exténuement/S*
exténuer/a4p+
extérieur/S*
extérieure/F*







>
>







35072
35073
35074
35075
35076
35077
35078
35079
35080
35081
35082
35083
35084
35085
35086
35087
extensionnelle/F*
extensité/S*
extensive/F*
extensivement/L'D'Q'
extensivité/S*
extenso
extensomètre/S*
extensométrie/S*
extensométrique/S*
exténuante/F*
exténuation/S*
exténuée/F*
exténuement/S*
exténuer/a4p+
extérieur/S*
extérieure/F*
36200
36201
36202
36203
36204
36205
36206

36207
36208
36209
36210
36211
36212
36213
filoselle/S.
filou/S.
filoutage/S.
filouter/a0p+
filouterie/S.
filovirus
fils

filtrable/S.
filtrage/S.
filtrante/F.
filtrat/S.
filtration/S.
filtre/S.
filtre-presse







>







36241
36242
36243
36244
36245
36246
36247
36248
36249
36250
36251
36252
36253
36254
36255
filoselle/S.
filou/S.
filoutage/S.
filouter/a0p+
filouterie/S.
filovirus
fils
filsdeputerie/S.
filtrable/S.
filtrage/S.
filtrante/F.
filtrat/S.
filtration/S.
filtre/S.
filtre-presse
36410
36411
36412
36413
36414
36415
36416

36417
36418
36419
36420
36421
36422
36423
flanquer/a0p+
flapie/F.
flaque/S.
flaquer/a0p.
flash/A.
flashage/S.
flash-back

flash-ball/S.
flasher/a0p+
flasheuse/F.
flashmètre/S.
flashy
flasque/S.
flasquement







>







36452
36453
36454
36455
36456
36457
36458
36459
36460
36461
36462
36463
36464
36465
36466
flanquer/a0p+
flapie/F.
flaque/S.
flaquer/a0p.
flash/A.
flashage/S.
flash-back
flashball/S.
flash-ball/S.
flasher/a0p+
flasheuse/F.
flashmètre/S.
flashy
flasque/S.
flasquement
37080
37081
37082
37083
37084
37085
37086

37087
37088
37089
37090
37091
37092
37093
foutou/S.
foutrale/F.
foutraque/S.
foutre/S.
foutre/tM
foutredieu
foutrement

foutriquet/S.
foutue/F.
fovéa/S.
fovéale/W.
fox
foxée/F.
fox-hound/S.







>







37123
37124
37125
37126
37127
37128
37129
37130
37131
37132
37133
37134
37135
37136
37137
foutou/S.
foutrale/F.
foutraque/S.
foutre/S.
foutre/tM
foutredieu
foutrement
foutrerie/S.
foutriquet/S.
foutue/F.
fovéa/S.
fovéale/W.
fox
foxée/F.
fox-hound/S.
40503
40504
40505
40506
40507
40508
40509

40510
40511
40512
40513
40514
40515
40516
haptique/S*
haptonomie/S*
haptonomique/S*
haquebute/S.
haquenée/S.
haquet/S.
hara-kiri/S.

harangue/S.
haranguer/a0p+
harangueuse/F.
haras
harassante/F.
harassement/S.
harasser/a0p+







>







40547
40548
40549
40550
40551
40552
40553
40554
40555
40556
40557
40558
40559
40560
40561
haptique/S*
haptonomie/S*
haptonomique/S*
haquebute/S.
haquenée/S.
haquet/S.
hara-kiri/S.
haram
harangue/S.
haranguer/a0p+
harangueuse/F.
haras
harassante/F.
harassement/S.
harasser/a0p+
41655
41656
41657
41658
41659
41660
41661

41662
41663
41664
41665
41666
41667
41668
hors-bilan
hors-bord
hors-champ
hors-concours
hors-cote
hors-cote
hors-d'œuvre

horse-ball/S.
horse-guard/S.
horse-power
horse-pox
hors-jeu
hors-la-loi
hors-ligne







>







41700
41701
41702
41703
41704
41705
41706
41707
41708
41709
41710
41711
41712
41713
41714
hors-bilan
hors-bord
hors-champ
hors-concours
hors-cote
hors-cote
hors-d'œuvre
horseball/S.
horse-ball/S.
horse-guard/S.
horse-power
horse-pox
hors-jeu
hors-la-loi
hors-ligne
41771
41772
41773
41774
41775
41776
41777

41778
41779
41780
41781
41782
41783
41784

41785
41786
41787
41788
41789
41790
41791
hoyau/X.
hpz/||--
http/S=
huard/S.
huart/S.
hub/S.
hublot/S.

huche/S.
hucher/a0p+
huchet/S.
hue
huée/S.
huer/a0p+
huerta/S.

huguenote/F.
huilage/S*
huile/S*
huiler/a2p+
huilerie/S*
huileuse/W*
huilière/F*







>







>







41817
41818
41819
41820
41821
41822
41823
41824
41825
41826
41827
41828
41829
41830
41831
41832
41833
41834
41835
41836
41837
41838
41839
hoyau/X.
hpz/||--
http/S=
huard/S.
huart/S.
hub/S.
hublot/S.
hubris/L'D'Q'
huche/S.
hucher/a0p+
huchet/S.
hue
huée/S.
huer/a0p+
huerta/S.
hugolienne/F*
huguenote/F.
huilage/S*
huile/S*
huiler/a2p+
huilerie/S*
huileuse/W*
huilière/F*
42277
42278
42279
42280
42281
42282
42283


42284
42285
42286
42287
42288
42289
42290
hypertrophier/a4p+
hypertrophique/S*
hyperuricémie/S*
hypervariable/S*
hyperventilation/S*
hyperventiler/a1p.
hypervigilance/S*


hyperviscosité/S*
hyperviseur/S*
hypervitaminose/S*
hyphe/S*
hypholome/S*
hypnagogique/S*
hypnogramme/S*







>
>







42325
42326
42327
42328
42329
42330
42331
42332
42333
42334
42335
42336
42337
42338
42339
42340
hypertrophier/a4p+
hypertrophique/S*
hyperuricémie/S*
hypervariable/S*
hyperventilation/S*
hyperventiler/a1p.
hypervigilance/S*
hyperviolence/S*
hyperviolente/F*
hyperviscosité/S*
hyperviseur/S*
hypervitaminose/S*
hyphe/S*
hypholome/S*
hypnagogique/S*
hypnogramme/S*
42666
42667
42668
42669
42670
42671
42672

42673
42674
42675
42676
42677
42678
42679
illisibilité/S*
illisible/S*
illisiblement/D'Q'
illogique/S*
illogiquement/D'Q'
illogisme/S*
illuminante/F*

illumination/S*
illuminative/F*
illuminatrice/F*
illuminée/F*
illuminer/a4p+
illuminisme/S*
illusion/S*







>







42716
42717
42718
42719
42720
42721
42722
42723
42724
42725
42726
42727
42728
42729
42730
illisibilité/S*
illisible/S*
illisiblement/D'Q'
illogique/S*
illogiquement/D'Q'
illogisme/S*
illuminante/F*
illuminati/L'D'Q'
illumination/S*
illuminative/F*
illuminatrice/F*
illuminée/F*
illuminer/a4p+
illuminisme/S*
illusion/S*
42907
42908
42909
42910
42911
42912
42913

42914
42915
42916
42917
42918
42919
42920
imparisyllabique/S*
imparité/S*
impartageable/S*
impartiale/W*
impartialement/D'Q'
impartialité/S*
impartir/fC

impasse/S*
impassibilité/S*
impassible/S*
impassiblement/D'Q'
impatiemment/D'Q'
impatience/S*
impatiens/L'D'Q'







>







42958
42959
42960
42961
42962
42963
42964
42965
42966
42967
42968
42969
42970
42971
42972
imparisyllabique/S*
imparité/S*
impartageable/S*
impartiale/W*
impartialement/D'Q'
impartialité/S*
impartir/fC
impassable/S*
impasse/S*
impassibilité/S*
impassible/S*
impassiblement/D'Q'
impatiemment/D'Q'
impatience/S*
impatiens/L'D'Q'
45910
45911
45912
45913
45914
45915
45916

45917
45918
45919
45920
45921
45922
45923
jeuniste/S.
jeunotte/F.
jigger/S.
jihad/S.
jihadisme/S.
jihadiste/S.
jingle/S.

jiu-jitsu
joaillerie/S.
joaillière/F.
job/S.
job/S.
jobarde/F.
jobarder/a0p+







>







45962
45963
45964
45965
45966
45967
45968
45969
45970
45971
45972
45973
45974
45975
45976
jeuniste/S.
jeunotte/F.
jigger/S.
jihad/S.
jihadisme/S.
jihadiste/S.
jingle/S.
jinn/S.
jiu-jitsu
joaillerie/S.
joaillière/F.
job/S.
job/S.
jobarde/F.
jobarder/a0p+
46208
46209
46210
46211
46212
46213
46214

46215
46216
46217
46218
46219
46220
46221
kabic/S.
kabig/S.
kabuki/S.
kabyle/S.
kacha/S.
kachoube/S.
kaddish/S.

kafir/S.
kafkaïenne/F.
kaïnite/S.
kaiser/S.
kakapo/S.
kakatoès
kakawi/S.







>







46261
46262
46263
46264
46265
46266
46267
46268
46269
46270
46271
46272
46273
46274
46275
kabic/S.
kabig/S.
kabuki/S.
kabyle/S.
kacha/S.
kachoube/S.
kaddish/S.
kadi/S.
kafir/S.
kafkaïenne/F.
kaïnite/S.
kaiser/S.
kakapo/S.
kakatoès
kakawi/S.
46280
46281
46282
46283
46284
46285
46286

46287
46288
46289
46290
46291
46292
46293
karst/S.
karstification/S.
karstique/S.
karstologie/S.
kart/S.
karting/S.
kascher

kashrout
kat/U.||--
kata/S.
katakana
katakana/S.
katal/Um
katana/S.







>







46334
46335
46336
46337
46338
46339
46340
46341
46342
46343
46344
46345
46346
46347
46348
karst/S.
karstification/S.
karstique/S.
karstologie/S.
kart/S.
karting/S.
kascher
kasher
kashrout
kat/U.||--
kata/S.
katakana
katakana/S.
katal/Um
katana/S.
52664
52665
52666
52667
52668
52669
52670

52671
52672
52673
52674
52675
52676
52677
multidevise/S.
multidiffusion/S.
multidimensionnalité/S.
multidimensionnelle/F.
multidirectionnalité/S.
multidirectionnelle/F.
multidisciplinaire/S.

multiethnique/S.
multi-ethnique/S.
multifactorielle/F.
multifamiliale/W.
multifilaire/S.
multiflore/S.
multifonction/S.







>







52719
52720
52721
52722
52723
52724
52725
52726
52727
52728
52729
52730
52731
52732
52733
multidevise/S.
multidiffusion/S.
multidimensionnalité/S.
multidimensionnelle/F.
multidirectionnalité/S.
multidirectionnelle/F.
multidisciplinaire/S.
multidisciplinarité/S.
multiethnique/S.
multi-ethnique/S.
multifactorielle/F.
multifamiliale/W.
multifilaire/S.
multiflore/S.
multifonction/S.
55094
55095
55096
55097
55098
55099
55100
55101
55102
55103
55104
55105
55106
55107
55108
55109
oligoasthénotératospermie/S*
oligocène/S*
oligochète/S*
oligoclase/S*
oligodendrocyte/S*
oligodendrogliome/S*
oligoélément/S*
oligoélément/S*
oligo-élément/S*
oligo-élément/S*
oligogalacturonate/S*
oligo-galacturonate/S*
oligomère/S*
oligomérique/S*
oligomérisation/S*
oligonucléotide/S*







<
<







55150
55151
55152
55153
55154
55155
55156


55157
55158
55159
55160
55161
55162
55163
oligoasthénotératospermie/S*
oligocène/S*
oligochète/S*
oligoclase/S*
oligodendrocyte/S*
oligodendrogliome/S*
oligoélément/S*


oligo-élément/S*
oligogalacturonate/S*
oligo-galacturonate/S*
oligomère/S*
oligomérique/S*
oligomérisation/S*
oligonucléotide/S*
58116
58117
58118
58119
58120
58121
58122

58123
58124
58125
58126
58127
58128
58129
perceptiblement
perception/S.
perceptionnisme/S.
perceptionniste/S.
perceptive/F.
perceptrice/F.
perceptuelle/F.

percer/a0p+
percerette/S.
perceuse/F.
percevable/S.
percevoir/pK
perche/S.
percher/a0p+







>







58170
58171
58172
58173
58174
58175
58176
58177
58178
58179
58180
58181
58182
58183
58184
perceptiblement
perception/S.
perceptionnisme/S.
perceptionniste/S.
perceptive/F.
perceptrice/F.
perceptuelle/F.
perceptuellement
percer/a0p+
percerette/S.
perceuse/F.
percevable/S.
percevoir/pK
perche/S.
percher/a0p+
59816
59817
59818
59819
59820
59821
59822

59823
59824
59825
59826
59827
59828
59829
pizza/S.
pizzaiolo/I.
pizzaïolo/S.
pizzeria/S.
pizzicato/I.
placage/S.
placard/S.

placarder/a0p+
placardisation/S.
placardiser/a0p+
place/S.
placebo/S.
placement/S.
placenta/S.







>







59871
59872
59873
59874
59875
59876
59877
59878
59879
59880
59881
59882
59883
59884
59885
pizza/S.
pizzaiolo/I.
pizzaïolo/S.
pizzeria/S.
pizzicato/I.
placage/S.
placard/S.
placardage/S.
placarder/a0p+
placardisation/S.
placardiser/a0p+
place/S.
placebo/S.
placement/S.
placenta/S.
60063
60064
60065
60066
60067
60068
60069

60070

60071
60072
60073
60074
60075
60076
60077
plâtrerie/S.
plâtreuse/W.
plâtrière/F.
plats-bords
plausibilité/S.
plausible/S.
plausiblement

play-back

play-boy/S.
playlist/S.
play-list/S.
playon/S.
pléban/S.
plèbe/S.
plébéienne/F.







>
|
>







60119
60120
60121
60122
60123
60124
60125
60126
60127
60128
60129
60130
60131
60132
60133
60134
60135
plâtrerie/S.
plâtreuse/W.
plâtrière/F.
plats-bords
plausibilité/S.
plausible/S.
plausiblement
playback/S.
play-back/S.
playboy/S.
play-boy/S.
playlist/S.
play-list/S.
playon/S.
pléban/S.
plèbe/S.
plébéienne/F.
60208
60209
60210
60211
60212
60213
60214

60215
60216
60217
60218
60219
60220
60221
ployage/S.
ployante/F.
ployer/a0p+
pluche/S.
plucher/a0p.
plucheuse/W.
plugin/S.

pluie/S.
plumage/S.
plumaison/S.
plumard/S.
plumasseau/X.
plumasserie/S.
plumassière/F.







>







60266
60267
60268
60269
60270
60271
60272
60273
60274
60275
60276
60277
60278
60279
60280
ployage/S.
ployante/F.
ployer/a0p+
pluche/S.
plucher/a0p.
plucheuse/W.
plugin/S.
plug-in/S.
pluie/S.
plumage/S.
plumaison/S.
plumard/S.
plumasseau/X.
plumasserie/S.
plumassière/F.
60624
60625
60626
60627
60628
60629
60630

60631
60632
60633
60634
60635
60636
60637
polychète/S.
polychlorobenzène/S.
polychlorure/S.
polychroïque/S.
polychroïsme/S.
polychrome/S.
polychromie/S.

polycistronique/S.
polyclinique/S.
polycondensat/S.
polycondensation/S.
polycopie/S.
polycopier/a0p+
polycourant







>







60683
60684
60685
60686
60687
60688
60689
60690
60691
60692
60693
60694
60695
60696
60697
polychète/S.
polychlorobenzène/S.
polychlorure/S.
polychroïque/S.
polychroïsme/S.
polychrome/S.
polychromie/S.
polychromique/S.
polycistronique/S.
polyclinique/S.
polycondensat/S.
polycondensation/S.
polycopie/S.
polycopier/a0p+
polycourant
60901
60902
60903
60904
60905
60906
60907

60908
60909
60910
60911
60912
60913
60914
pop-corn
pope/S.
popeline/S.
popinée/S.
poplitée/F.
popote/S.
popotin/S.

populace/S.
populacière/F.
populage/S.
populaire/S.
populairement
popularisation/S.
populariser/a0p+







>







60961
60962
60963
60964
60965
60966
60967
60968
60969
60970
60971
60972
60973
60974
60975
pop-corn
pope/S.
popeline/S.
popinée/S.
poplitée/F.
popote/S.
popotin/S.
popstar/S.
populace/S.
populacière/F.
populage/S.
populaire/S.
populairement
popularisation/S.
populariser/a0p+
61354
61355
61356
61357
61358
61359
61360
61361
61362
61363
61364
61365
61366
61367
61368
61369
poulaille/S.
poulailler/S.
poulaine/F.
poulamon/S.
poularde/S.
poulbot/S.
poule/S.
poulet/S.
poulette/S.
pouliage/S.
pouliche/S.
poulie/S.
pouliner/a0p.
poulinière/S.
poulinière/S.
pouliot/S.







<
|







61415
61416
61417
61418
61419
61420
61421

61422
61423
61424
61425
61426
61427
61428
61429
poulaille/S.
poulailler/S.
poulaine/F.
poulamon/S.
poularde/S.
poulbot/S.
poule/S.

poulette/F.
pouliage/S.
pouliche/S.
poulie/S.
pouliner/a0p.
poulinière/S.
poulinière/S.
pouliot/S.
62769
62770
62771
62772
62773
62774
62775

62776
62777
62778
62779
62780
62781
62782
protoplasme/S.
protoplasmique/S.
protoplaste/S.
protoptère/S.
protosulfure/S.
prototypage/S.
prototype/S.

prototypique/S.
prototypiste/S.
protoure/S.
protoxyde/S.
protozoaire/S.
protozoologie/S.
protractile/S.







>







62829
62830
62831
62832
62833
62834
62835
62836
62837
62838
62839
62840
62841
62842
62843
protoplasme/S.
protoplasmique/S.
protoplaste/S.
protoptère/S.
protosulfure/S.
prototypage/S.
prototype/S.
prototyper/a0p+
prototypique/S.
prototypiste/S.
protoure/S.
protoxyde/S.
protozoaire/S.
protozoologie/S.
protractile/S.
62852
62853
62854
62855
62856
62857
62858


62859
62860
62861

62862
62863
62864
62865
62866
62867
62868
prudemment
prudence/S.
prudente/F.
prudentielle/F.
pruderie/S.
prud'homale/W.
prud'homie/S.


prud'homme/S.
prudhommerie/S.
prudhommesque/S.

pruine/S.
prune
prune/S.
pruneau/X.
prunelaie/S.
prunelée/S.
prunelle/S.







>
>



>







62913
62914
62915
62916
62917
62918
62919
62920
62921
62922
62923
62924
62925
62926
62927
62928
62929
62930
62931
62932
prudemment
prudence/S.
prudente/F.
prudentielle/F.
pruderie/S.
prud'homale/W.
prud'homie/S.
prudhommale/W.
prudhomme/S.
prud'homme/S.
prudhommerie/S.
prudhommesque/S.
prudhommie/S.
pruine/S.
prune
prune/S.
pruneau/X.
prunelaie/S.
prunelée/S.
prunelle/S.
63292
63293
63294
63295
63296
63297
63298

63299
63300
63301
63302
63303
63304
63305
pusillanime/S.
pusillanimement
pusillanimité/S.
pustule/S.
pustuler/a0p+
pustuleuse/W.
putain/S.

putassière/F.
putative/F.
pute/S.
putier/S.
putiet/S.
putois
putréfaction/S.







>







63356
63357
63358
63359
63360
63361
63362
63363
63364
63365
63366
63367
63368
63369
63370
pusillanime/S.
pusillanimement
pusillanimité/S.
pustule/S.
pustuler/a0p+
pustuleuse/W.
putain/S.
putasserie/S.
putassière/F.
putative/F.
pute/S.
putier/S.
putiet/S.
putois
putréfaction/S.
68940
68941
68942
68943
68944
68945
68946

68947
68948
68949
68950
68951
68952
68953
sceau/X.
sceau-de-Salomon
sceaux-de-Salomon
scélérate/F.
scélératement
scélératesse/S.
scellage/S.

scellement/S.
sceller/a0p+
scénarimage/S.
scenario/I.
scénario/S.
scénarisation/S.
scénariser/a0p+







>







69005
69006
69007
69008
69009
69010
69011
69012
69013
69014
69015
69016
69017
69018
69019
sceau/X.
sceau-de-Salomon
sceaux-de-Salomon
scélérate/F.
scélératement
scélératesse/S.
scellage/S.
scellé/S.
scellement/S.
sceller/a0p+
scénarimage/S.
scenario/I.
scénario/S.
scénarisation/S.
scénariser/a0p+
69198
69199
69200
69201
69202
69203
69204

69205
69206
69207
69208
69209
69210
69211
scripturale/W.
scripturalisme/S.
scrofulaire/S.
scrofulariacée/S.
scrofule/S.
scrofuleuse/W.
scrogneugneu/X.

scrolling/S.
scrotale/W.
scrotum/S.
scrub/S.
scrubber/S.
scrupule/S.
scrupuleuse/W.







>







69264
69265
69266
69267
69268
69269
69270
69271
69272
69273
69274
69275
69276
69277
69278
scripturale/W.
scripturalisme/S.
scrofulaire/S.
scrofulariacée/S.
scrofule/S.
scrofuleuse/W.
scrogneugneu/X.
scroller/a0p.
scrolling/S.
scrotale/W.
scrotum/S.
scrub/S.
scrubber/S.
scrupule/S.
scrupuleuse/W.
71783
71784
71785
71786
71787
71788
71789

71790
71791
71792
71793
71794
71795
71796
stariser/a0p+
starlette/S.
staroste/S.
star-system/S.
starter/S.
starting-block/S.
starting-gate/S.

start-up/S.
stase/S.
stater/a0p+
statère/S.
stathouder/S.
stathoudérat/S.
statice/S.







>







71850
71851
71852
71853
71854
71855
71856
71857
71858
71859
71860
71861
71862
71863
71864
stariser/a0p+
starlette/S.
staroste/S.
star-system/S.
starter/S.
starting-block/S.
starting-gate/S.
startup/S.
start-up/S.
stase/S.
stater/a0p+
statère/S.
stathouder/S.
stathoudérat/S.
statice/S.
73460
73461
73462
73463
73464
73465
73466

73467
73468
73469
73470
73471
73472
73473
syrah/S.
syriaque/S.
syriaque/S.
syrienne/F.
syringe/S.
syringomyélie/S.
syrinx

syrphe/S.
sysadmin/S.
systématicienne/F.
systématicité/S.
systématique/S.
systématique/S.
systématiquement







>







73528
73529
73530
73531
73532
73533
73534
73535
73536
73537
73538
73539
73540
73541
73542
syrah/S.
syriaque/S.
syriaque/S.
syrienne/F.
syringe/S.
syringomyélie/S.
syrinx
syro-libanaise/F.
syrphe/S.
sysadmin/S.
systématicienne/F.
systématicité/S.
systématique/S.
systématique/S.
systématiquement
73611
73612
73613
73614
73615
73616
73617

73618

73619
73620
73621
73622
73623
73624
73625
tagliatelle/S.
tagme/S.
taguer/a0p+
tagueuse/F.
tahitienne/F.
taïaut
taï-chi

taï-chi-chuan

taie/S.
taïga/S.
taiji/S.
taijiquan/S.
taïkonaute/S.
taillable/S.
taillade/S.







>

>







73680
73681
73682
73683
73684
73685
73686
73687
73688
73689
73690
73691
73692
73693
73694
73695
73696
tagliatelle/S.
tagme/S.
taguer/a0p+
tagueuse/F.
tahitienne/F.
taïaut
taï-chi
taïchi/S.
taï-chi-chuan
taïchichuan/S.
taie/S.
taïga/S.
taiji/S.
taijiquan/S.
taïkonaute/S.
taillable/S.
taillade/S.
73656
73657
73658
73659
73660
73661
73662

73663
73664
73665
73666
73667
73668
73669
taleb/S.
talent/S.
talentueuse/W.
talentueusement
taler/a0p+
taleth/S.
talibane/F.

talion/S.
talisman/S.
talismanique/S.
talith/S.
talitre/S.
talkies-walkies
talkie-walkie







>







73727
73728
73729
73730
73731
73732
73733
73734
73735
73736
73737
73738
73739
73740
73741
taleb/S.
talent/S.
talentueuse/W.
talentueusement
taler/a0p+
taleth/S.
talibane/F.
talibée/F.
talion/S.
talisman/S.
talismanique/S.
talith/S.
talitre/S.
talkies-walkies
talkie-walkie
76259
76260
76261
76262
76263
76264
76265

76266
76267
76268
76269
76270
76271
76272
trantran/S.
trapèze/S.
trapéziste/S.
trapézoèdre/S.
trapézoïdale/W.
trapézoïde/S.
trappe/S.

trappeuse/F.
trappillon/S.
trappiste/S.
trappistine/S.
trapue/F.
traque/S.
traquée/F.







>







76331
76332
76333
76334
76335
76336
76337
76338
76339
76340
76341
76342
76343
76344
76345
trantran/S.
trapèze/S.
trapéziste/S.
trapézoèdre/S.
trapézoïdale/W.
trapézoïde/S.
trappe/S.
trapper/a0p+
trappeuse/F.
trappillon/S.
trappiste/S.
trappistine/S.
trapue/F.
traque/S.
traquée/F.
77388
77389
77390
77391
77392
77393
77394

77395
77396
77397
77398
77399
77400
77401
ultimement/D'Q'
ultimité/S*
ultimo
ultra/S*
ultrabasique/S*
ultracentrifugation/S*
ultracentrifugeuse/S*

ultra-chic/S*
ultracolonialisme/S*
ultra-colonialisme/S*
ultracolonialiste/S*
ultra-colonialiste/S*
ultraconfidentielle/F*
ultra-confidentielle/F*







>







77461
77462
77463
77464
77465
77466
77467
77468
77469
77470
77471
77472
77473
77474
77475
ultimement/D'Q'
ultimité/S*
ultimo
ultra/S*
ultrabasique/S*
ultracentrifugation/S*
ultracentrifugeuse/S*
ultrachic/S*
ultra-chic/S*
ultracolonialisme/S*
ultra-colonialisme/S*
ultracolonialiste/S*
ultra-colonialiste/S*
ultraconfidentielle/F*
ultra-confidentielle/F*
78636
78637
78638
78639
78640
78641
78642

78643
78644
78645
78646
78647
78648
78649
vibrato/S.
vibratoire/S.
vibrer/a0p+
vibreur/S.
vibrion/S.
vibrionner/a0p.
vibrisse/S.

vibromasseur/S.
vicaire/S.
vicariale/W.
vicariance/S.
vicariante/F.
vicariat/S.
vice/S.







>







78710
78711
78712
78713
78714
78715
78716
78717
78718
78719
78720
78721
78722
78723
78724
vibrato/S.
vibratoire/S.
vibrer/a0p+
vibreur/S.
vibrion/S.
vibrionner/a0p.
vibrisse/S.
vibro/S.
vibromasseur/S.
vicaire/S.
vicariale/W.
vicariance/S.
vicariante/F.
vicariat/S.
vice/S.

Modified gc_lang/fr/oxt/Dictionnaires/dictionaries/fr-moderne.aff from [e59049a83a] to [2943eb6b1b].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# AFFIXES DU DICTIONNAIRE ORTHOGRAPHIQUE FRANÇAIS “MODERNE” v6.1
# par Olivier R. -- licence MPL 2.0
# Généré le 03-06-2017 à 22:26
# Pour améliorer le dictionnaire, allez sur http://www.dicollecte.org/



SET UTF-8

WORDCHARS -’'1234567890.




|

|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# AFFIXES DU DICTIONNAIRE ORTHOGRAPHIQUE FRANÇAIS “MODERNE” v6.2
# par Olivier R. -- licence MPL 2.0
# Généré le 26-07-2017 à 09:33
# Pour améliorer le dictionnaire, allez sur http://www.dicollecte.org/



SET UTF-8

WORDCHARS -’'1234567890.

Modified gc_lang/fr/oxt/Dictionnaires/dictionaries/fr-moderne.dic from [cfbaa4802e] to [4be27e23e8].

1
2
3
4
5
6
7
8
78805
&
1er/--
1ers/--
1re/--
1res/--
1ʳᵉ/--
1ʳᵉˢ/--
|







1
2
3
4
5
6
7
8
78858
&
1er/--
1ers/--
1re/--
1res/--
1ʳᵉ/--
1ʳᵉˢ/--
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
Aïcha/L'D'Q'
Aïd/L'D'Q'
Aida/L'D'Q'
Aidan/L'D'Q'
Aïd-el-Adha/L'
Aïd-el-Kébir/L'
Aiden/L'D'Q'
Aignan
Aigoual/L'D'
Aigrain/L'D'Q'
Aimé/L'D'Q'
Aimée/L'D'Q'
Ain/L'
Airaines/L'D'Q'
Airbnb/L'D'Q'







|







187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
Aïcha/L'D'Q'
Aïd/L'D'Q'
Aida/L'D'Q'
Aidan/L'D'Q'
Aïd-el-Adha/L'
Aïd-el-Kébir/L'
Aiden/L'D'Q'
Aignan/L'D'Q'
Aigoual/L'D'
Aigrain/L'D'Q'
Aimé/L'D'Q'
Aimée/L'D'Q'
Ain/L'
Airaines/L'D'Q'
Airbnb/L'D'Q'
529
530
531
532
533
534
535

536
537
538
539
540
541
542
Arion/L'D'Q'
Aristarque/L'D'Q'
Aristide/L'D'Q'
Aristophane/L'D'Q'
Aristote/L'D'Q'
Arizona/L'D'
Arjuna/L'D'Q'

Arkansas/L'D'
Arkema/L'D'Q'
Arkham/L'D'Q'
Arkhangelsk/L'D'Q'
Arlene/L'D'Q'
Arlène/L'D'Q'
Arles/L'D'Q'







>







529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
Arion/L'D'Q'
Aristarque/L'D'Q'
Aristide/L'D'Q'
Aristophane/L'D'Q'
Aristote/L'D'Q'
Arizona/L'D'
Arjuna/L'D'Q'
Arkady/L'D'Q'
Arkansas/L'D'
Arkema/L'D'Q'
Arkham/L'D'Q'
Arkhangelsk/L'D'Q'
Arlene/L'D'Q'
Arlène/L'D'Q'
Arles/L'D'Q'
651
652
653
654
655
656
657

658
659
660
661
662
663
664
Aurélien/L'D'Q'
Aurelio/L'D'Q'
Auriane/L'D'Q'
Aurillac/L'D'Q'
Auriol/L'D'Q'
Aurore/L'D'Q'
Auschwitz/L'D'Q'

Austerlitz/L'D'Q'
Austin/L'D'Q'
Australasie/L'D'Q'
Australie/L'D'
Australie-Méridionale/L'D'
Australie-Occidentale/L'D'
Austrasie/L'D'







>







652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
Aurélien/L'D'Q'
Aurelio/L'D'Q'
Auriane/L'D'Q'
Aurillac/L'D'Q'
Auriol/L'D'Q'
Aurore/L'D'Q'
Auschwitz/L'D'Q'
Austen/L'D'Q'
Austerlitz/L'D'Q'
Austin/L'D'Q'
Australasie/L'D'Q'
Australie/L'D'
Australie-Méridionale/L'D'
Australie-Occidentale/L'D'
Austrasie/L'D'
896
897
898
899
900
901
902

903
904
905
906
907
908
909
Benoîte
Benozillo
Benpro
Bentama
Bentham
Bentley
Benveniste

Berchem-Sainte-Agathe
Berck
Bercy
Bérenger
Bérengère
Bérénice
Bérézina







>







898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
Benoîte
Benozillo
Benpro
Bentama
Bentham
Bentley
Benveniste
Bérangère
Berchem-Sainte-Agathe
Berck
Bercy
Bérenger
Bérengère
Bérénice
Bérézina
1330
1331
1332
1333
1334
1335
1336

1337
1338
1339
1340
1341
1342
1343
Caine
Caïphe
Caire
Caitlin
Caitlyn
Calabre
Calais

Calc
Calcutta
Calderón
Caleb
Calédonie
Calestienne
Calgary







>







1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
Caine
Caïphe
Caire
Caitlin
Caitlyn
Calabre
Calais
Calaisis
Calc
Calcutta
Calderón
Caleb
Calédonie
Calestienne
Calgary
1646
1647
1648
1649
1650
1651
1652

1653
1654
1655
1656
1657
1658
1659
Chostakovitch
Chris
Christa
Christel
Christèle
Christelle
Christian

Christiane
Christie
Christina
Christine
Christmas
Christoffel
Christoph







>







1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
Chostakovitch
Chris
Christa
Christel
Christèle
Christelle
Christian
Christiana
Christiane
Christie
Christina
Christine
Christmas
Christoffel
Christoph
1674
1675
1676
1677
1678
1679
1680

1681
1682
1683
1684
1685
1686
1687
Cincinnati
Cindy
Ciney
Ciotat
Circassie
Circé
Cirey-sur-Vezouze

Cisjordanie
Cîteaux
Citroën
City
Claire
Clamart
Clara







>







1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
Cincinnati
Cindy
Ciney
Ciotat
Circassie
Circé
Cirey-sur-Vezouze
Cisco
Cisjordanie
Cîteaux
Citroën
City
Claire
Clamart
Clara
2486
2487
2488
2489
2490
2491
2492

2493
2494
2495
2496
2497
2498
2499
Eure-et-Loir/L'D'
Euripide/L'D'Q'
Eurobaromètre/S*
Eurogroupe/L'
Euronext/L'D'Q'
Europe/L'D'
Europol/D'Q'

Eurozone/L'
Eurydice/L'D'Q'
Eusèbe/L'D'Q'
Euterpe/L'D'Q'
Eva/L'D'Q'
Éva/L'D'Q'
Évaine/L'D'Q'







>







2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
Eure-et-Loir/L'D'
Euripide/L'D'Q'
Eurobaromètre/S*
Eurogroupe/L'
Euronext/L'D'Q'
Europe/L'D'
Europol/D'Q'
Eurotunnel/L'D'Q'
Eurozone/L'
Eurydice/L'D'Q'
Eusèbe/L'D'Q'
Euterpe/L'D'Q'
Eva/L'D'Q'
Éva/L'D'Q'
Évaine/L'D'Q'
2596
2597
2598
2599
2600
2601
2602

2603
2604
2605
2606
2607
2608
2609
Fayard
Fayçal
Fayette
Fécamp
Fed
FedEx
Federer

Federico
Fehling
Feist
Feïza
Feldane
Felicia
Félicie







>







2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
Fayard
Fayçal
Fayette
Fécamp
Fed
FedEx
Federer
Federica
Federico
Fehling
Feist
Feïza
Feldane
Felicia
Félicie
3217
3218
3219
3220
3221
3222
3223

3224
3225
3226
3227
3228
3229
3230
Halluin/L'D'Q'
Ham/L'D'Q'
Hamas
Hambourg
Hamel
Hamid/L'D'Q'
Hamilton

Hamme
HammerFall
Hammourabi
Hamont-Achel/L'D'Q'
Hampshire
Ham-sur-Heure-Nalinnes/L'D'Q'
Hamza/L'D'Q'







>







3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
Halluin/L'D'Q'
Ham/L'D'Q'
Hamas
Hambourg
Hamel
Hamid/L'D'Q'
Hamilton
Hamlet/L'D'Q'
Hamme
HammerFall
Hammourabi
Hamont-Achel/L'D'Q'
Hampshire
Ham-sur-Heure-Nalinnes/L'D'Q'
Hamza/L'D'Q'
3461
3462
3463
3464
3465
3466
3467

3468
3469
3470
3471
3472
3473
3474
Howard
Hubble
Hubei
Hubert/L'D'Q'
Hubscher
Hudson/L'D'Q'
Huelgoat

Hugo/L'D'Q'
Hugo/L'D'Q'
Hugues/L'D'Q'
Huguette
Hulshout/L'D'Q'
Hume
Hun/S.







>







3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
Howard
Hubble
Hubei
Hubert/L'D'Q'
Hubscher
Hudson/L'D'Q'
Huelgoat
Hugh/L'D'Q'
Hugo/L'D'Q'
Hugo/L'D'Q'
Hugues/L'D'Q'
Huguette
Hulshout/L'D'Q'
Hume
Hun/S.
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
IMSI/L'D'Q'
INED/L'D'Q'
INPI/L'D'Q'
INRA/L'D'Q'
INRI/L'D'Q'
INRIA/L'D'Q'
INSA/L'D'Q'
INSERM/L'D'Q'
IP/L'D'Q'
IRA/L'
IRD/L'D'Q'
IRFM/L'D'Q'
IRL
IRM/L'D'Q'
IRSTEA/L'D'Q'







<







3525
3526
3527
3528
3529
3530
3531

3532
3533
3534
3535
3536
3537
3538
IMSI/L'D'Q'
INED/L'D'Q'
INPI/L'D'Q'
INRA/L'D'Q'
INRI/L'D'Q'
INRIA/L'D'Q'
INSA/L'D'Q'

IP/L'D'Q'
IRA/L'
IRD/L'D'Q'
IRFM/L'D'Q'
IRL
IRM/L'D'Q'
IRSTEA/L'D'Q'
3594
3595
3596
3597
3598
3599
3600

3601
3602
3603
3604
3605
3606
3607
Ingrid/L'D'Q'
Inkscape/L'D'Q'
Inn/L'D'
Inna/L'D'Q'
Innsmouth/L'D'Q'
Inovia/L'D'Q'
Insee/L'D'Q'

Insulinde/L'D'
Intel/L'D'Q'
Internet/D'Q'
Interpol/D'Q'
Io/L'D'Q'
Ionesco/L'D'Q'
Ioulia/L'D'Q'







>







3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
Ingrid/L'D'Q'
Inkscape/L'D'Q'
Inn/L'D'
Inna/L'D'Q'
Innsmouth/L'D'Q'
Inovia/L'D'Q'
Insee/L'D'Q'
Inserm/L'D'Q'
Insulinde/L'D'
Intel/L'D'Q'
Internet/D'Q'
Interpol/D'Q'
Io/L'D'Q'
Ionesco/L'D'Q'
Ioulia/L'D'Q'
4296
4297
4298
4299
4300
4301
4302

4303
4304
4305
4306
4307
4308
4309
Léonore
Léontine
Léopold
Léopoldine
Leopoldt
Léopoldville
Leroy

Lesbos
Lesieur
Lesley
Leslie
Lesneven
Lesotho
Lesse







>







4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
Léonore
Léontine
Léopold
Léopoldine
Leopoldt
Léopoldville
Leroy
Lesage
Lesbos
Lesieur
Lesley
Leslie
Lesneven
Lesotho
Lesse
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
Noisy-le-Grand
Noisy-le-Sec
Nokia
Nolan
Nolwenn
Nora
Norbert
Nord
Nord-Kivu
Nord-Pas-de-Calais
Nord-du-Québec
Nordine
Norfolk
Norique
Norma







<







5484
5485
5486
5487
5488
5489
5490

5491
5492
5493
5494
5495
5496
5497
Noisy-le-Grand
Noisy-le-Sec
Nokia
Nolan
Nolwenn
Nora
Norbert

Nord-Kivu
Nord-Pas-de-Calais
Nord-du-Québec
Nordine
Norfolk
Norique
Norma
6209
6210
6211
6212
6213
6214
6215

6216
6217
6218
6219
6220
6221
6222
Reidemeister
Reiko
Reims
Reiten
Relecq-Kerhuon
Rellich
Rembrandt

Rémi
Remich
Remire-Montjoly
Remus
Rémy
Renaix
Renan







>







6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
Reidemeister
Reiko
Reims
Reiten
Relecq-Kerhuon
Rellich
Rembrandt
Remi
Rémi
Remich
Remire-Montjoly
Remus
Rémy
Renaix
Renan
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
Rosita
Rosny-sous-Bois
Ross
Rossini
Rossinière
Rostand
Roswell
Roth
Roth
Rothbard
Rothschild
Rotin
Rotselaar
Rotterdam
Roubaix







<







6390
6391
6392
6393
6394
6395
6396

6397
6398
6399
6400
6401
6402
6403
Rosita
Rosny-sous-Bois
Ross
Rossini
Rossinière
Rostand
Roswell

Roth
Rothbard
Rothschild
Rotin
Rotselaar
Rotterdam
Roubaix
9055
9056
9057
9058
9059
9060
9061
9062
9063
9064
9065
9066

9067
9068
9069
9070
9071
9072
9073
additionnelle/F*
additionnellement/D'Q'
additionner/a4p+
additionneuse/F*
additive/F*
additivement/D'Q'
additivité/S*
addon/S*
adducteur/S*
adduction/S*
adduit/S*
adèle/S*

adelphophagie/S*
adénine/S*
adénite/S*
adénocarcinome/S*
adénogramme/S*
adénoïde/S*
adénoïdectomie/S*







|




>







9065
9066
9067
9068
9069
9070
9071
9072
9073
9074
9075
9076
9077
9078
9079
9080
9081
9082
9083
9084
additionnelle/F*
additionnellement/D'Q'
additionner/a4p+
additionneuse/F*
additive/F*
additivement/D'Q'
additivité/S*
add-on/S*
adducteur/S*
adduction/S*
adduit/S*
adèle/S*
adelphe/S*
adelphophagie/S*
adénine/S*
adénite/S*
adénocarcinome/S*
adénogramme/S*
adénoïde/S*
adénoïdectomie/S*
9288
9289
9290
9291
9292
9293
9294
9295
9296
9297
9298
9299
9300
9301
9302
aérobie/S*
aérobie/S*
aérobiologie/S*
aérobiologique/S*
aérobiose/S*
aérobique/S*
aérocâble/S*
aéro-club/S*
aérocolie/S*
aérodigestive/F*
aérodistorsion/S*
aérodrome/S*
aérodynamicienne/F*
aérodynamique/S*
aérodynamique/S*







|







9299
9300
9301
9302
9303
9304
9305
9306
9307
9308
9309
9310
9311
9312
9313
aérobie/S*
aérobie/S*
aérobiologie/S*
aérobiologique/S*
aérobiose/S*
aérobique/S*
aérocâble/S*
aéroclub/S*
aérocolie/S*
aérodigestive/F*
aérodistorsion/S*
aérodrome/S*
aérodynamicienne/F*
aérodynamique/S*
aérodynamique/S*
9731
9732
9733
9734
9735
9736
9737

9738
9739
9740
9741
9742
9743
9744
agripper/a4p+
agritourisme/S*
agroalimentaire/S*
agroalimentaire/S*
agrobiologie/S*
agrobiologique/S*
agrobiologiste/S*

agrocarburant/S*
agro-carburant/S*
agrochimie/S*
agrochimique/S*
agrochimiste/S*
agroclimatique/S*
agro-climatique/S*







>







9742
9743
9744
9745
9746
9747
9748
9749
9750
9751
9752
9753
9754
9755
9756
agripper/a4p+
agritourisme/S*
agroalimentaire/S*
agroalimentaire/S*
agrobiologie/S*
agrobiologique/S*
agrobiologiste/S*
agrobusiness/L'D'Q'
agrocarburant/S*
agro-carburant/S*
agrochimie/S*
agrochimique/S*
agrochimiste/S*
agroclimatique/S*
agro-climatique/S*
9872
9873
9874
9875
9876
9877
9878

9879
9880
9881
9882
9883
9884
9885
aillade/S*
ailler/a2p+
ailleurs/L'D'Q'
ailloli/S*
aimable/S*
aimablement/D'Q'
aimant/S*

aimantation/S*
aimante/F*
aimanter/a4p+
aimantin/S*
aimantine/F*
aimée/F*
aimer/a4p+







>







9884
9885
9886
9887
9888
9889
9890
9891
9892
9893
9894
9895
9896
9897
9898
aillade/S*
ailler/a2p+
ailleurs/L'D'Q'
ailloli/S*
aimable/S*
aimablement/D'Q'
aimant/S*
aimantable/S*
aimantation/S*
aimante/F*
aimanter/a4p+
aimantin/S*
aimantine/F*
aimée/F*
aimer/a4p+
10508
10509
10510
10511
10512
10513
10514
10515
10516
10517
10518
10519
10520
10521
10522
amathie/S*
amatir/f2p+
amatrice/F*
amaurose/S*
amazone/S*
amazonienne/F*
amazonite/S*
ambages/D'Q'
ambassade/S*
ambassadrice/F*
ambiance/S*
ambiancer/a1p.
ambianceuse/F*
ambiante/F*
ambidextre/S*







|







10521
10522
10523
10524
10525
10526
10527
10528
10529
10530
10531
10532
10533
10534
10535
amathie/S*
amatir/f2p+
amatrice/F*
amaurose/S*
amazone/S*
amazonienne/F*
amazonite/S*
ambage/S*
ambassade/S*
ambassadrice/F*
ambiance/S*
ambiancer/a1p.
ambianceuse/F*
ambiante/F*
ambidextre/S*
11352
11353
11354
11355
11356
11357
11358

11359
11360
11361
11362
11363
11364
11365
annuité/S*
annulabilité/S*
annulable/S*
annulaire/S*
annulation/S*
annulative/F*
annulatrice/F*

annuler/a4p+
annuus
anoblir/f4p+
anoblissante/F*
anoblissement/S*
anode/S*
anodine/F*







>







11365
11366
11367
11368
11369
11370
11371
11372
11373
11374
11375
11376
11377
11378
11379
annuité/S*
annulabilité/S*
annulable/S*
annulaire/S*
annulation/S*
annulative/F*
annulatrice/F*
annulement/S*
annuler/a4p+
annuus
anoblir/f4p+
anoblissante/F*
anoblissement/S*
anode/S*
anodine/F*
11668
11669
11670
11671
11672
11673
11674


11675
11676
11677
11678
11679
11680
11681
antiémétique/S*
antiémeute/L'D'Q'
antienne/S*
antienzyme/S*
antiépileptique/S*
antiesclavagiste/S*
antiétatique/S*


antifading/S*
antifascisme/S*
antifasciste/S*
antiféminisme/S*
antiféministe/S*
antiferment/S*
antiferroélectricité/S*







>
>







11682
11683
11684
11685
11686
11687
11688
11689
11690
11691
11692
11693
11694
11695
11696
11697
antiémétique/S*
antiémeute/L'D'Q'
antienne/S*
antienzyme/S*
antiépileptique/S*
antiesclavagiste/S*
antiétatique/S*
antiétatisme/S*
antifa/S*
antifading/S*
antifascisme/S*
antifasciste/S*
antiféminisme/S*
antiféministe/S*
antiferment/S*
antiferroélectricité/S*
12472
12473
12474
12475
12476
12477
12478

12479
12480
12481
12482
12483
12484
12485
arc/S*
arcade/S*
arcane/S*
arcanson/S*
arcasse/S*
arcature/S*
arc-boutant/L'D'Q'

arc-bouter/a4p+
arccos
arccosh
arccotan
arccotanh
arc-doubleau/L'D'Q'
arceau/X*







>







12488
12489
12490
12491
12492
12493
12494
12495
12496
12497
12498
12499
12500
12501
12502
arc/S*
arcade/S*
arcane/S*
arcanson/S*
arcasse/S*
arcature/S*
arc-boutant/L'D'Q'
arc-boutement
arc-bouter/a4p+
arccos
arccosh
arccotan
arccotanh
arc-doubleau/L'D'Q'
arceau/X*
12569
12570
12571
12572
12573
12574
12575

12576
12577
12578
12579
12580
12581
12582
archontat/S*
archonte/S*
archosaurien/S*
archure/S*
arçon/S*
arçonner/a2p+
arcs-boutants/D'Q'

arcs-doubleaux/D'Q'
arcs-en-ciel/D'Q'
arcsin
arcsinh
arctan
arctanh
arctique/S*







>







12586
12587
12588
12589
12590
12591
12592
12593
12594
12595
12596
12597
12598
12599
12600
archontat/S*
archonte/S*
archosaurien/S*
archure/S*
arçon/S*
arçonner/a2p+
arcs-boutants/D'Q'
arcs-boutements
arcs-doubleaux/D'Q'
arcs-en-ciel/D'Q'
arcsin
arcsinh
arctan
arctanh
arctique/S*
14953
14954
14955
14956
14957
14958
14959
14960
14961
14962
14963
14964
14965
14966
14967
14968
14969
14970
14971
14972
14973
14974
14975
14976
14977
14978
14979
14980
14981
14982
14983
14984
14985
14986
14987
bascule/S.
basculement/S.
basculer/a0p+
basculeur/S.
bas-culotte/S.
bas-de-casse
base/S.
base-ball/S.
baselle/S.
baser/a0p+
bas-fond/S.
basicité/S.
baside/S.
basidiomycète/S.
basidiomycète/S.
basidiospore/S.
basilaire/S.
basileus
basilic/S.
basilicale/W.
basilique/S.
basin/S.
basiphile/S.
basique/S.
basiquement
bas-jointée/F.
basket/S.
basket-ball/S.
basketteuse/F.
bas-mât/S.
basmati/S.
basocellulaire/S.
basoche/S.
basochienne/F.
bas-officier/S.







|



















|







14971
14972
14973
14974
14975
14976
14977
14978
14979
14980
14981
14982
14983
14984
14985
14986
14987
14988
14989
14990
14991
14992
14993
14994
14995
14996
14997
14998
14999
15000
15001
15002
15003
15004
15005
bascule/S.
basculement/S.
basculer/a0p+
basculeur/S.
bas-culotte/S.
bas-de-casse
base/S.
baseball/S.
baselle/S.
baser/a0p+
bas-fond/S.
basicité/S.
baside/S.
basidiomycète/S.
basidiomycète/S.
basidiospore/S.
basilaire/S.
basileus
basilic/S.
basilicale/W.
basilique/S.
basin/S.
basiphile/S.
basique/S.
basiquement
bas-jointée/F.
basket/S.
basketball/S.
basketteuse/F.
bas-mât/S.
basmati/S.
basocellulaire/S.
basoche/S.
basochienne/F.
bas-officier/S.
15469
15470
15471
15472
15473
15474
15475

15476
15477
15478
15479
15480
15481
15482
bernard-l'hermite
berne/S.
berner/a0p+
berneuse/F.
bernicle/S.
bernique
bernique/S.

berrichonne/F.
bersaglier/S.
berthon/S.
bertillonnage/S.
béryl/S.
bérylliose/S.
béryllium/S.







>







15487
15488
15489
15490
15491
15492
15493
15494
15495
15496
15497
15498
15499
15500
15501
bernard-l'hermite
berne/S.
berner/a0p+
berneuse/F.
bernicle/S.
bernique
bernique/S.
bernoise/F.
berrichonne/F.
bersaglier/S.
berthon/S.
bertillonnage/S.
béryl/S.
bérylliose/S.
béryllium/S.
16592
16593
16594
16595
16596
16597
16598
16599
16600
16601
16602
16603
16604
16605
16606
16607
16608
bondonnière/S.
bondrée/S.
bonellie/S.
bongo/S.
bonheur/S.
bonheur-du-jour
bonheurs-du-jour
bonhomie/S.
bonhomme
bonhomme/S.
boni/S.
bonichon/S.
bonifiante/F.
bonification/S.
bonifier/a0p+
boniment/S.
bonimenter/a0p.







|
|
|







16611
16612
16613
16614
16615
16616
16617
16618
16619
16620
16621
16622
16623
16624
16625
16626
16627
bondonnière/S.
bondrée/S.
bonellie/S.
bongo/S.
bonheur/S.
bonheur-du-jour
bonheurs-du-jour
bonhomme
bonhomme/S.
bonhommie/S.
boni/S.
bonichon/S.
bonifiante/F.
bonification/S.
bonifier/a0p+
boniment/S.
bonimenter/a0p.
17715
17716
17717
17718
17719
17720
17721

17722
17723
17724
17725
17726
17727
17728
bugne/S.
bugrane/S.
buguée/F.
build/S.
building/S.
buire/S.
buis

buisson/S.
buisson-ardent
buissonnante/F.
buissonnet/S.
buissonneuse/W.
buissonnière/F.
buissons-ardents







>







17734
17735
17736
17737
17738
17739
17740
17741
17742
17743
17744
17745
17746
17747
17748
bugne/S.
bugrane/S.
buguée/F.
build/S.
building/S.
buire/S.
buis
buissaie/S.
buisson/S.
buisson-ardent
buissonnante/F.
buissonnet/S.
buissonneuse/W.
buissonnière/F.
buissons-ardents
18055
18056
18057
18058
18059
18060
18061

18062
18063
18064
18065
18066
18067
18068
cadrer/a0p+
cadreuse/F.
cadriciel/S.
caduc/S.
caducée/S.
caducifoliée/F.
caducité/S.

caduque/S.
cæcale/W.
cæcotrophie/S.
cæcum/S.
caennaise/F.
cænogenèse/S.
cæsine







>







18075
18076
18077
18078
18079
18080
18081
18082
18083
18084
18085
18086
18087
18088
18089
cadrer/a0p+
cadreuse/F.
cadriciel/S.
caduc/S.
caducée/S.
caducifoliée/F.
caducité/S.
caduque/F.
caduque/S.
cæcale/W.
cæcotrophie/S.
cæcum/S.
caennaise/F.
cænogenèse/S.
cæsine
18452
18453
18454
18455
18456
18457
18458

18459
18460
18461
18462
18463
18464
18465
camping-caravaning/S.
camping-gaz
campinoise/F.
campo/S.
campus
camuse/F.
canada/S.

canadianisme/S.
canadienne/F.
canado-américaine/F.
canaille/S.
canaillement
canaillerie/S.
canaillocratie/S.







>







18473
18474
18475
18476
18477
18478
18479
18480
18481
18482
18483
18484
18485
18486
18487
camping-caravaning/S.
camping-gaz
campinoise/F.
campo/S.
campus
camuse/F.
canada/S.
canadair/S.
canadianisme/S.
canadienne/F.
canado-américaine/F.
canaille/S.
canaillement
canaillerie/S.
canaillocratie/S.
19428
19429
19430
19431
19432
19433
19434

19435
19436
19437
19438
19439
19440
19441
caucasique/S.
cauchemar/S.
cauchemarder/a0p.
cauchemardesque/S.
cauchemardeuse/W.
caucus
caudale/W.

caudataire/S.
caudataire/S.
caudillo/S.
caudine/S.
caudrette/S.
caulescente/F.
caulicole/S.







>







19450
19451
19452
19453
19454
19455
19456
19457
19458
19459
19460
19461
19462
19463
19464
caucasique/S.
cauchemar/S.
cauchemarder/a0p.
cauchemardesque/S.
cauchemardeuse/W.
caucus
caudale/W.
caudalie/S.
caudataire/S.
caudataire/S.
caudillo/S.
caudine/S.
caudrette/S.
caulescente/F.
caulicole/S.
24029
24030
24031
24032
24033
24034
24035

24036
24037
24038
24039
24040
24041
24042
corruptrice/F.
corsage/S.
corsaire/S.
corse/S.
corselet/S.
corser/a0p+
corset/S.

corseter/b0p+
corseterie/S.
corsetière/F.
corso/S.
cortège/S.
cortès
cortex







>







24052
24053
24054
24055
24056
24057
24058
24059
24060
24061
24062
24063
24064
24065
24066
corruptrice/F.
corsage/S.
corsaire/S.
corse/S.
corselet/S.
corser/a0p+
corset/S.
corsetage/S.
corseter/b0p+
corseterie/S.
corsetière/F.
corso/S.
cortège/S.
cortès
cortex
24472
24473
24474
24475
24476
24477
24478
24479
24480
24481
24482
24483
24484
24485
24486
covenant/S.
covendeuse/F.
cover-girl/S.
covoiturage/S.
covoiturer/a0p+
covoitureuse/F.
covolume/S.
cow-boy/S.
cowper/S.
coxale/W.
coxalgie/S.
coxalgique/S.
coxarthrose/S.
coxer/a0p+
coxofémorale/W.







|







24496
24497
24498
24499
24500
24501
24502
24503
24504
24505
24506
24507
24508
24509
24510
covenant/S.
covendeuse/F.
cover-girl/S.
covoiturage/S.
covoiturer/a0p+
covoitureuse/F.
covolume/S.
cowboy/S.
cowper/S.
coxale/W.
coxalgie/S.
coxalgique/S.
coxarthrose/S.
coxer/a0p+
coxofémorale/W.
25530
25531
25532
25533
25534
25535
25536

25537
25538
25539
25540
25541
25542
25543
cytotoxicité/S.
cytotoxique/S.
czardas
czimbalum/S.
d
d/||--
dB/||--

dacryoadénite/S.
dacryocystite/S.
dactyle/S.
dactylique/S.
dactylo/S.
dactylogramme/S.
dactylographe/S.







>







25554
25555
25556
25557
25558
25559
25560
25561
25562
25563
25564
25565
25566
25567
25568
cytotoxicité/S.
cytotoxique/S.
czardas
czimbalum/S.
d
d/||--
dB/||--
daba/S.
dacryoadénite/S.
dacryocystite/S.
dactyle/S.
dactylique/S.
dactylo/S.
dactylogramme/S.
dactylographe/S.
27316
27317
27318
27319
27320
27321
27322

27323
27324
27325
27326
27327
27328
27329
dénombrabilité/S.
dénombrable/S.
dénombrement/S.
dénombrer/a0p+
dénominateur/S.
dénomination/S.
dénominative/F.

dénommer/a0p+
dénoncer/a0p+
dénonciation/S.
dénonciatrice/F.
dénotation/S.
dénotationnelle/F.
dénotative/F.







>







27341
27342
27343
27344
27345
27346
27347
27348
27349
27350
27351
27352
27353
27354
27355
dénombrabilité/S.
dénombrable/S.
dénombrement/S.
dénombrer/a0p+
dénominateur/S.
dénomination/S.
dénominative/F.
dénommable/S.
dénommer/a0p+
dénoncer/a0p+
dénonciation/S.
dénonciatrice/F.
dénotation/S.
dénotationnelle/F.
dénotative/F.
28114
28115
28116
28117
28118
28119
28120

28121
28122
28123
28124
28125
28126
28127
désincorporer/a0p+
désincrustation/S.
désincruster/a0p+
désinculper/a0p+
désindenter/a0p+
désindexation/S.
désindexer/a0p+

désindustrialisation/S.
désindustrialiser/a0p+
désinence/S.
désinentielle/F.
désinfectante/F.
désinfecter/a0p+
désinfection/S.







>







28140
28141
28142
28143
28144
28145
28146
28147
28148
28149
28150
28151
28152
28153
28154
désincorporer/a0p+
désincrustation/S.
désincruster/a0p+
désinculper/a0p+
désindenter/a0p+
désindexation/S.
désindexer/a0p+
désindividualiser/a0p+
désindustrialisation/S.
désindustrialiser/a0p+
désinence/S.
désinentielle/F.
désinfectante/F.
désinfecter/a0p+
désinfection/S.
28163
28164
28165
28166
28167
28168
28169

28170
28171
28172
28173
28174
28175
28176
désinviter/a0p+
désinvolte/S.
désinvoltement
désinvolture/S.
désir/S.
désirabilité/S.
désirable/S.

désirer/a0p+
désireuse/W.
désistement/S.
désister/a0p+
desman/S.
desmine/S.
desmodonte/S.







>







28190
28191
28192
28193
28194
28195
28196
28197
28198
28199
28200
28201
28202
28203
28204
désinviter/a0p+
désinvolte/S.
désinvoltement
désinvolture/S.
désir/S.
désirabilité/S.
désirable/S.
désirante/F.
désirer/a0p+
désireuse/W.
désistement/S.
désister/a0p+
desman/S.
desmine/S.
desmodonte/S.
28793
28794
28795
28796
28797
28798
28799

28800
28801
28802
28803
28804
28805
28806
diarrhée/S.
diarrhéique/S.
diarthrose/S.
diascope/S.
diascopie/S.
diascordium/S.
diaspora/S.

diastase/S.
diastasique/S.
diastème/S.
diastéréo-isomère/S.
diastole/S.
diastolique/S.
diastratique/S.







>







28821
28822
28823
28824
28825
28826
28827
28828
28829
28830
28831
28832
28833
28834
28835
diarrhée/S.
diarrhéique/S.
diarthrose/S.
diascope/S.
diascopie/S.
diascordium/S.
diaspora/S.
diasporique/S.
diastase/S.
diastasique/S.
diastème/S.
diastéréo-isomère/S.
diastole/S.
diastolique/S.
diastratique/S.
29507
29508
29509
29510
29511
29512
29513

29514
29515
29516
29517
29518
29519
29520
diversement
diverses
diversifiable/S.
diversification/S.
diversifier/a0p+
diversiforme/S.
diversion/S.

diversité/S.
diverticule/S.
diverticulite/S.
diverticulose/S.
divertimento/S.
divertir/f0p+
divertissante/F.







>







29536
29537
29538
29539
29540
29541
29542
29543
29544
29545
29546
29547
29548
29549
29550
diversement
diverses
diversifiable/S.
diversification/S.
diversifier/a0p+
diversiforme/S.
diversion/S.
diversitaire/S.
diversité/S.
diverticule/S.
diverticulite/S.
diverticulose/S.
divertimento/S.
divertir/f0p+
divertissante/F.
30618
30619
30620
30621
30622
30623
30624
30625
30626
30627
30628
30629
30630
30631
30632
écocertifiée/F*
écocide/S*
écocitoyenne/F*
écocitoyenneté/S*
écoconception/S*
écoconduite/S*
écoconstruction/S*
éco-construction/S*
écoemballage/S*
éco-environnementale/F*
écœurante/F*
écœurement/S*
écœurer/a2p+
écogeste/S*
écohabitat/S*







<







30648
30649
30650
30651
30652
30653
30654

30655
30656
30657
30658
30659
30660
30661
écocertifiée/F*
écocide/S*
écocitoyenne/F*
écocitoyenneté/S*
écoconception/S*
écoconduite/S*
écoconstruction/S*

écoemballage/S*
éco-environnementale/F*
écœurante/F*
écœurement/S*
écœurer/a2p+
écogeste/S*
écohabitat/S*
32080
32081
32082
32083
32084
32085
32086

32087
32088
32089
32090
32091
32092
32093
endoénergétique/S*
endogame/S*
endogamie/S*
endogamique/S*
endogée/F*
endogène/S*
endogénéité/S*

endolocalisation/S*
endolorir/f2p+
endolorissement/S*
endolymphe/S*
endomètre/S*
endométriose/S*
endométrite/S*







>







32109
32110
32111
32112
32113
32114
32115
32116
32117
32118
32119
32120
32121
32122
32123
endoénergétique/S*
endogame/S*
endogamie/S*
endogamique/S*
endogée/F*
endogène/S*
endogénéité/S*
endogroupe/S*
endolocalisation/S*
endolorir/f2p+
endolorissement/S*
endolymphe/S*
endomètre/S*
endométriose/S*
endométrite/S*
33849
33850
33851
33852
33853
33854
33855


33856
33857
33858
33859
33860
33861
33862
ethmoïdale/W*
ethmoïde/S*
ethmoïdite/S*
ethnarchie/S*
ethnarque/S*
ethnicisation/S*
ethniciser/a2p+


ethnicité/S*
ethnico-religieuse/W*
ethnie/S*
ethnique/S*
ethniquement/D'Q'
ethnobiologie/S*
ethnobotanique/S*







>
>







33879
33880
33881
33882
33883
33884
33885
33886
33887
33888
33889
33890
33891
33892
33893
33894
ethmoïdale/W*
ethmoïde/S*
ethmoïdite/S*
ethnarchie/S*
ethnarque/S*
ethnicisation/S*
ethniciser/a2p+
ethnicisme/S*
ethniciste/S*
ethnicité/S*
ethnico-religieuse/W*
ethnie/S*
ethnique/S*
ethniquement/D'Q'
ethnobiologie/S*
ethnobotanique/S*
33884
33885
33886
33887
33888
33889
33890

33891
33892
33893
33894
33895
33896
33897
ethnométhodologue/S*
ethnomusicologie/S*
ethnomusicologue/S*
ethnonyme/S*
ethnonymie/S*
ethnopsychiatrie/S*
ethnopsychologie/S*

ethnoreligieuse/W*
éthographie/S*
éthologie/S*
éthologique/S*
éthologiste/S*
éthologue/S*
ethos/L'D'Q'







>







33916
33917
33918
33919
33920
33921
33922
33923
33924
33925
33926
33927
33928
33929
33930
ethnométhodologue/S*
ethnomusicologie/S*
ethnomusicologue/S*
ethnonyme/S*
ethnonymie/S*
ethnopsychiatrie/S*
ethnopsychologie/S*
ethno-raciale/W*
ethnoreligieuse/W*
éthographie/S*
éthologie/S*
éthologique/S*
éthologiste/S*
éthologue/S*
ethos/L'D'Q'
34478
34479
34480
34481
34482
34483
34484

34485
34486
34487
34488
34489
34490
34491
exode/S*
exoderme/S*
exogame/S*
exogamie/S*
exogamique/S*
exogène/S*
exogénéité/S*

exomphale/S*
exon/S*
exondation/S*
exondement/S*
exonder/a3p+
exonération/S*
exonérer/c4p+







>







34511
34512
34513
34514
34515
34516
34517
34518
34519
34520
34521
34522
34523
34524
34525
exode/S*
exoderme/S*
exogame/S*
exogamie/S*
exogamique/S*
exogène/S*
exogénéité/S*
exogroupe/S*
exomphale/S*
exon/S*
exondation/S*
exondement/S*
exonder/a3p+
exonération/S*
exonérer/c4p+
34684
34685
34686
34687
34688
34689
34690


34691
34692
34693
34694
34695
34696
34697
extensionnelle/F*
extensité/S*
extensive/F*
extensivement/L'D'Q'
extensivité/S*
extenso
extensomètre/S*


exténuante/F*
exténuation/S*
exténuée/F*
exténuement/S*
exténuer/a4p+
extérieur/S*
extérieure/F*







>
>







34718
34719
34720
34721
34722
34723
34724
34725
34726
34727
34728
34729
34730
34731
34732
34733
extensionnelle/F*
extensité/S*
extensive/F*
extensivement/L'D'Q'
extensivité/S*
extenso
extensomètre/S*
extensométrie/S*
extensométrique/S*
exténuante/F*
exténuation/S*
exténuée/F*
exténuement/S*
exténuer/a4p+
extérieur/S*
extérieure/F*
35807
35808
35809
35810
35811
35812
35813

35814
35815
35816
35817
35818
35819
35820
filoselle/S.
filou/S.
filoutage/S.
filouter/a0p+
filouterie/S.
filovirus
fils

filtrable/S.
filtrage/S.
filtrante/F.
filtrat/S.
filtration/S.
filtre/S.
filtre-presse







>







35843
35844
35845
35846
35847
35848
35849
35850
35851
35852
35853
35854
35855
35856
35857
filoselle/S.
filou/S.
filoutage/S.
filouter/a0p+
filouterie/S.
filovirus
fils
filsdeputerie/S.
filtrable/S.
filtrage/S.
filtrante/F.
filtrat/S.
filtration/S.
filtre/S.
filtre-presse
36017
36018
36019
36020
36021
36022
36023
36024
36025
36026
36027
36028
36029
36030
36031
flanquer/a0p+
flapie/F.
flaque/S.
flaquer/a0p.
flash/A.
flashage/S.
flash-back
flash-ball/S.
flasher/a0p+
flasheuse/F.
flashmètre/S.
flashy
flasque/S.
flasquement
flatter/a0p+







|







36054
36055
36056
36057
36058
36059
36060
36061
36062
36063
36064
36065
36066
36067
36068
flanquer/a0p+
flapie/F.
flaque/S.
flaquer/a0p.
flash/A.
flashage/S.
flash-back
flashball/S.
flasher/a0p+
flasheuse/F.
flashmètre/S.
flashy
flasque/S.
flasquement
flatter/a0p+
36680
36681
36682
36683
36684
36685
36686

36687
36688
36689
36690
36691
36692
36693
foutou/S.
foutrale/F.
foutraque/S.
foutre/S.
foutre/tM
foutredieu
foutrement

foutriquet/S.
foutue/F.
fovéa/S.
fovéale/W.
fox
foxée/F.
fox-hound/S.







>







36717
36718
36719
36720
36721
36722
36723
36724
36725
36726
36727
36728
36729
36730
36731
foutou/S.
foutrale/F.
foutraque/S.
foutre/S.
foutre/tM
foutredieu
foutrement
foutrerie/S.
foutriquet/S.
foutue/F.
fovéa/S.
fovéale/W.
fox
foxée/F.
fox-hound/S.
40056
40057
40058
40059
40060
40061
40062

40063
40064
40065
40066
40067
40068
40069
haptique/S*
haptonomie/S*
haptonomique/S*
haquebute/S.
haquenée/S.
haquet/S.
hara-kiri/S.

harangue/S.
haranguer/a0p+
harangueuse/F.
haras
harassante/F.
harassement/S.
harasser/a0p+







>







40094
40095
40096
40097
40098
40099
40100
40101
40102
40103
40104
40105
40106
40107
40108
haptique/S*
haptonomie/S*
haptonomique/S*
haquebute/S.
haquenée/S.
haquet/S.
hara-kiri/S.
haram
harangue/S.
haranguer/a0p+
harangueuse/F.
haras
harassante/F.
harassement/S.
harasser/a0p+
41188
41189
41190
41191
41192
41193
41194
41195
41196
41197
41198
41199
41200
41201
41202
hors-bilan
hors-bord
hors-champ
hors-concours
hors-cote
hors-cote
hors-d'œuvre
horse-ball/S.
horse-guard/S.
horse-power
horse-pox
hors-jeu
hors-la-loi
hors-ligne
hors-média







|







41227
41228
41229
41230
41231
41232
41233
41234
41235
41236
41237
41238
41239
41240
41241
hors-bilan
hors-bord
hors-champ
hors-concours
hors-cote
hors-cote
hors-d'œuvre
horseball/S.
horse-guard/S.
horse-power
horse-pox
hors-jeu
hors-la-loi
hors-ligne
hors-média
41301
41302
41303
41304
41305
41306
41307

41308
41309
41310
41311
41312
41313
41314

41315
41316
41317
41318
41319
41320
41321
hoyau/X.
hpz/||--
http/S=
huard/S.
huart/S.
hub/S.
hublot/S.

huche/S.
hucher/a0p+
huchet/S.
hue
huée/S.
huer/a0p+
huerta/S.

huguenote/F.
huilage/S*
huile/S*
huiler/a2p+
huilerie/S*
huileuse/W*
huilière/F*







>







>







41340
41341
41342
41343
41344
41345
41346
41347
41348
41349
41350
41351
41352
41353
41354
41355
41356
41357
41358
41359
41360
41361
41362
hoyau/X.
hpz/||--
http/S=
huard/S.
huart/S.
hub/S.
hublot/S.
hubris/L'D'Q'
huche/S.
hucher/a0p+
huchet/S.
hue
huée/S.
huer/a0p+
huerta/S.
hugolienne/F*
huguenote/F.
huilage/S*
huile/S*
huiler/a2p+
huilerie/S*
huileuse/W*
huilière/F*
41799
41800
41801
41802
41803
41804
41805


41806
41807
41808
41809
41810
41811
41812
hypertrophier/a4p+
hypertrophique/S*
hyperuricémie/S*
hypervariable/S*
hyperventilation/S*
hyperventiler/a1p.
hypervigilance/S*


hyperviscosité/S*
hyperviseur/S*
hypervitaminose/S*
hyphe/S*
hypholome/S*
hypnagogique/S*
hypnogramme/S*







>
>







41840
41841
41842
41843
41844
41845
41846
41847
41848
41849
41850
41851
41852
41853
41854
41855
hypertrophier/a4p+
hypertrophique/S*
hyperuricémie/S*
hypervariable/S*
hyperventilation/S*
hyperventiler/a1p.
hypervigilance/S*
hyperviolence/S*
hyperviolente/F*
hyperviscosité/S*
hyperviseur/S*
hypervitaminose/S*
hyphe/S*
hypholome/S*
hypnagogique/S*
hypnogramme/S*
42184
42185
42186
42187
42188
42189
42190

42191
42192
42193
42194
42195
42196
42197
illisibilité/S*
illisible/S*
illisiblement/D'Q'
illogique/S*
illogiquement/D'Q'
illogisme/S*
illuminante/F*

illumination/S*
illuminative/F*
illuminatrice/F*
illuminée/F*
illuminer/a4p+
illuminisme/S*
illusion/S*







>







42227
42228
42229
42230
42231
42232
42233
42234
42235
42236
42237
42238
42239
42240
42241
illisibilité/S*
illisible/S*
illisiblement/D'Q'
illogique/S*
illogiquement/D'Q'
illogisme/S*
illuminante/F*
illuminati/L'D'Q'
illumination/S*
illuminative/F*
illuminatrice/F*
illuminée/F*
illuminer/a4p+
illuminisme/S*
illusion/S*
42370
42371
42372
42373
42374
42375
42376
42377
42378
42379
42380
42381
42382
42383
42384
immunodéficiente/F*
immunodéficitaire/S*
immunodépresseur/S*
immunodépression/S*
immunodépressive/F*
immunodéprimée/F*
immunofluorescence/S*
immuno-fluorescence/S*
immunogène/S*
immunogénétique/S*
immunogénicité/S*
immunogénique/S*
immunoglobuline/S*
immunohistochimie/S*
immunologie/S*







<







42414
42415
42416
42417
42418
42419
42420

42421
42422
42423
42424
42425
42426
42427
immunodéficiente/F*
immunodéficitaire/S*
immunodépresseur/S*
immunodépression/S*
immunodépressive/F*
immunodéprimée/F*
immunofluorescence/S*

immunogène/S*
immunogénétique/S*
immunogénicité/S*
immunogénique/S*
immunoglobuline/S*
immunohistochimie/S*
immunologie/S*
42425
42426
42427
42428
42429
42430
42431

42432
42433
42434
42435
42436
42437
42438
imparisyllabique/S*
imparité/S*
impartageable/S*
impartiale/W*
impartialement/D'Q'
impartialité/S*
impartir/fC

impasse/S*
impassibilité/S*
impassible/S*
impassiblement/D'Q'
impatiemment/D'Q'
impatience/S*
impatiens/L'D'Q'







>







42468
42469
42470
42471
42472
42473
42474
42475
42476
42477
42478
42479
42480
42481
42482
imparisyllabique/S*
imparité/S*
impartageable/S*
impartiale/W*
impartialement/D'Q'
impartialité/S*
impartir/fC
impassable/S*
impasse/S*
impassibilité/S*
impassible/S*
impassiblement/D'Q'
impatiemment/D'Q'
impatience/S*
impatiens/L'D'Q'
52022
52023
52024
52025
52026
52027
52028

52029
52030
52031
52032
52033
52034
52035
multidevise/S.
multidiffusion/S.
multidimensionnalité/S.
multidimensionnelle/F.
multidirectionnalité/S.
multidirectionnelle/F.
multidisciplinaire/S.

multiethnique/S.
multifactorielle/F.
multifamiliale/W.
multifilaire/S.
multiflore/S.
multifonction/S.
multifonctionnalité/S.







>







52066
52067
52068
52069
52070
52071
52072
52073
52074
52075
52076
52077
52078
52079
52080
multidevise/S.
multidiffusion/S.
multidimensionnalité/S.
multidimensionnelle/F.
multidirectionnalité/S.
multidirectionnelle/F.
multidisciplinaire/S.
multidisciplinarité/S.
multiethnique/S.
multifactorielle/F.
multifamiliale/W.
multifilaire/S.
multiflore/S.
multifonction/S.
multifonctionnalité/S.
54369
54370
54371
54372
54373
54374
54375
54376
54377
54378
54379
54380
54381
54382
54383
54384
oligoasthénotératospermie/S*
oligocène/S*
oligochète/S*
oligoclase/S*
oligodendrocyte/S*
oligodendrogliome/S*
oligoélément/S*
oligoélément/S*
oligo-élément/S*
oligogalacturonate/S*
oligo-galacturonate/S*
oligomère/S*
oligomérique/S*
oligomérisation/S*
oligonucléotide/S*
oligo-nucléotide/S*







<
<







54414
54415
54416
54417
54418
54419
54420


54421
54422
54423
54424
54425
54426
54427
oligoasthénotératospermie/S*
oligocène/S*
oligochète/S*
oligoclase/S*
oligodendrocyte/S*
oligodendrogliome/S*
oligoélément/S*


oligogalacturonate/S*
oligo-galacturonate/S*
oligomère/S*
oligomérique/S*
oligomérisation/S*
oligonucléotide/S*
oligo-nucléotide/S*
57331
57332
57333
57334
57335
57336
57337

57338
57339
57340
57341
57342
57343
57344
perceptiblement
perception/S.
perceptionnisme/S.
perceptionniste/S.
perceptive/F.
perceptrice/F.
perceptuelle/F.

percer/a0p+
percerette/S.
perceuse/F.
percevable/S.
percevoir/pK
perche/S.
percher/a0p+







>







57374
57375
57376
57377
57378
57379
57380
57381
57382
57383
57384
57385
57386
57387
57388
perceptiblement
perception/S.
perceptionnisme/S.
perceptionniste/S.
perceptive/F.
perceptrice/F.
perceptuelle/F.
perceptuellement
percer/a0p+
percerette/S.
perceuse/F.
percevable/S.
percevoir/pK
perche/S.
percher/a0p+
58993
58994
58995
58996
58997
58998
58999

59000
59001
59002
59003
59004
59005
59006
pixellisation/S.
pizza/S.
pizzaïolo/S.
pizzeria/S.
pizzicato/I.
placage/S.
placard/S.

placarder/a0p+
placardisation/S.
placardiser/a0p+
place/S.
placebo/S.
placement/S.
placenta/S.







>







59037
59038
59039
59040
59041
59042
59043
59044
59045
59046
59047
59048
59049
59050
59051
pixellisation/S.
pizza/S.
pizzaïolo/S.
pizzeria/S.
pizzicato/I.
placage/S.
placard/S.
placardage/S.
placarder/a0p+
placardisation/S.
placardiser/a0p+
place/S.
placebo/S.
placement/S.
placenta/S.
59236
59237
59238
59239
59240
59241
59242
59243
59244
59245
59246
59247
59248
59249
59250
59251
plâtrerie/S.
plâtreuse/W.
plâtrière/F.
plats-bords
plausibilité/S.
plausible/S.
plausiblement
play-back
play-boy/S.
playlist/S.
playon/S.
pléban/S.
plèbe/S.
plébéienne/F.
plébiscitaire/S.
plébiscite/S.







|
|







59281
59282
59283
59284
59285
59286
59287
59288
59289
59290
59291
59292
59293
59294
59295
59296
plâtrerie/S.
plâtreuse/W.
plâtrière/F.
plats-bords
plausibilité/S.
plausible/S.
plausiblement
playback/S.
playboy/S.
playlist/S.
playon/S.
pléban/S.
plèbe/S.
plébéienne/F.
plébiscitaire/S.
plébiscite/S.
59379
59380
59381
59382
59383
59384
59385

59386
59387
59388
59389
59390
59391
59392
ployage/S.
ployante/F.
ployer/a0p+
pluche/S.
plucher/a0p.
plucheuse/W.
plugin/S.

pluie/S.
plumage/S.
plumaison/S.
plumard/S.
plumasseau/X.
plumasserie/S.
plumassière/F.







>







59424
59425
59426
59427
59428
59429
59430
59431
59432
59433
59434
59435
59436
59437
59438
ployage/S.
ployante/F.
ployer/a0p+
pluche/S.
plucher/a0p.
plucheuse/W.
plugin/S.
plug-in/S.
pluie/S.
plumage/S.
plumaison/S.
plumard/S.
plumasseau/X.
plumasserie/S.
plumassière/F.
59415
59416
59417
59418
59419
59420
59421
59422
59423
59424
59425
59426
59427
59428
59429
59430
59431
59432
59433
59434
59435
59436
59437
59438
59439
59440
59441
59442
59443
59444
59445
59446
59447
59448
pluriannuelle/F.
pluricellulaire/S.
pluriculturelle/F.
pluridimensionnalité/S.
pluridimensionnelle/F.
pluridisciplinaire/S.
pluridisciplinaire/S.
pluri-disciplinaire/S.
pluridisciplinarité/S.
plurielle/F.
pluriethnique/S.
plurilatérale/W.
plurilingue/S.
plurilinguisme/S.
plurimillénaire/S.
plurimodale/W.
plurinationale/W.
plurinominale/W.
pluripartisme/S.
pluripartite/S.
pluripotence/S.
pluripotente/F.
pluriséculaire/S.
plurisousharmonique/S.
plurispécifique/S.
plurithématique/S.
pluri-thématique/S.
plurithérapie/S.
plurivalente/F.
plurivocité/S.
plurivoque/S.
plus
plus
plusieurs







<


















<







59461
59462
59463
59464
59465
59466
59467

59468
59469
59470
59471
59472
59473
59474
59475
59476
59477
59478
59479
59480
59481
59482
59483
59484
59485

59486
59487
59488
59489
59490
59491
59492
pluriannuelle/F.
pluricellulaire/S.
pluriculturelle/F.
pluridimensionnalité/S.
pluridimensionnelle/F.
pluridisciplinaire/S.
pluridisciplinaire/S.

pluridisciplinarité/S.
plurielle/F.
pluriethnique/S.
plurilatérale/W.
plurilingue/S.
plurilinguisme/S.
plurimillénaire/S.
plurimodale/W.
plurinationale/W.
plurinominale/W.
pluripartisme/S.
pluripartite/S.
pluripotence/S.
pluripotente/F.
pluriséculaire/S.
plurisousharmonique/S.
plurispécifique/S.
plurithématique/S.

plurithérapie/S.
plurivalente/F.
plurivocité/S.
plurivoque/S.
plus
plus
plusieurs
59794
59795
59796
59797
59798
59799
59800

59801
59802
59803
59804
59805
59806
59807
polychète/S.
polychlorobenzène/S.
polychlorure/S.
polychroïque/S.
polychroïsme/S.
polychrome/S.
polychromie/S.

polycistronique/S.
polyclinique/S.
polycondensat/S.
polycondensation/S.
polycopie/S.
polycopier/a0p+
polycourant







>







59838
59839
59840
59841
59842
59843
59844
59845
59846
59847
59848
59849
59850
59851
59852
polychète/S.
polychlorobenzène/S.
polychlorure/S.
polychroïque/S.
polychroïsme/S.
polychrome/S.
polychromie/S.
polychromique/S.
polycistronique/S.
polyclinique/S.
polycondensat/S.
polycondensation/S.
polycopie/S.
polycopier/a0p+
polycourant
60068
60069
60070
60071
60072
60073
60074

60075
60076
60077
60078
60079
60080
60081
pop-corn
pope/S.
popeline/S.
popinée/S.
poplitée/F.
popote/S.
popotin/S.

populace/S.
populacière/F.
populage/S.
populaire/S.
populairement
popularisation/S.
populariser/a0p+







>







60113
60114
60115
60116
60117
60118
60119
60120
60121
60122
60123
60124
60125
60126
60127
pop-corn
pope/S.
popeline/S.
popinée/S.
poplitée/F.
popote/S.
popotin/S.
popstar/S.
populace/S.
populacière/F.
populage/S.
populaire/S.
populairement
popularisation/S.
populariser/a0p+
60466
60467
60468
60469
60470
60471
60472
60473
60474
60475
60476
60477
60478
60479
60480
60481
poulaille/S.
poulailler/S.
poulaine/F.
poulamon/S.
poularde/S.
poulbot/S.
poule/S.
poulet/S.
poulette/S.
pouliage/S.
pouliche/S.
poulie/S.
pouliner/a0p.
poulinière/S.
poulinière/S.
pouliot/S.







<
|







60512
60513
60514
60515
60516
60517
60518

60519
60520
60521
60522
60523
60524
60525
60526
poulaille/S.
poulailler/S.
poulaine/F.
poulamon/S.
poularde/S.
poulbot/S.
poule/S.

poulette/F.
pouliage/S.
pouliche/S.
poulie/S.
pouliner/a0p.
poulinière/S.
poulinière/S.
pouliot/S.
61863
61864
61865
61866
61867
61868
61869

61870
61871
61872
61873
61874
61875
61876
protoplasme/S.
protoplasmique/S.
protoplaste/S.
protoptère/S.
protosulfure/S.
prototypage/S.
prototype/S.

prototypique/S.
prototypiste/S.
protoure/S.
protoxyde/S.
protozoaire/S.
protozoologie/S.
protractile/S.







>







61908
61909
61910
61911
61912
61913
61914
61915
61916
61917
61918
61919
61920
61921
61922
protoplasme/S.
protoplasmique/S.
protoplaste/S.
protoptère/S.
protosulfure/S.
prototypage/S.
prototype/S.
prototyper/a0p+
prototypique/S.
prototypiste/S.
protoure/S.
protoxyde/S.
protozoaire/S.
protozoologie/S.
protractile/S.
61944
61945
61946
61947
61948
61949
61950
61951
61952
61953
61954
61955

61956
61957
61958
61959
61960
61961
61962
pruche/S.
prude/S.
prudemment
prudence/S.
prudente/F.
prudentielle/F.
pruderie/S.
prud'homale/W.
prud'homie/S.
prud'homme/S.
prudhommerie/S.
prudhommesque/S.

pruine/S.
prune
prune/S.
pruneau/X.
prunelaie/S.
prunelée/S.
prunelle/S.







|
<
|


>







61990
61991
61992
61993
61994
61995
61996
61997

61998
61999
62000
62001
62002
62003
62004
62005
62006
62007
62008
pruche/S.
prude/S.
prudemment
prudence/S.
prudente/F.
prudentielle/F.
pruderie/S.
prudhommale/W.

prudhomme/S.
prudhommerie/S.
prudhommesque/S.
prudhommie/S.
pruine/S.
prune
prune/S.
pruneau/X.
prunelaie/S.
prunelée/S.
prunelle/S.
62370
62371
62372
62373
62374
62375
62376

62377
62378
62379
62380
62381
62382
62383
pusillanime/S.
pusillanimement
pusillanimité/S.
pustule/S.
pustuler/a0p+
pustuleuse/W.
putain/S.

putassière/F.
putative/F.
pute/S.
putier/S.
putiet/S.
putois
putréfaction/S.







>







62416
62417
62418
62419
62420
62421
62422
62423
62424
62425
62426
62427
62428
62429
62430
pusillanime/S.
pusillanimement
pusillanimité/S.
pustule/S.
pustuler/a0p+
pustuleuse/W.
putain/S.
putasserie/S.
putassière/F.
putative/F.
pute/S.
putier/S.
putiet/S.
putois
putréfaction/S.
67945
67946
67947
67948
67949
67950
67951

67952
67953
67954
67955
67956
67957
67958
sceau/X.
sceau-de-Salomon
sceaux-de-Salomon
scélérate/F.
scélératement
scélératesse/S.
scellage/S.

scellement/S.
sceller/a0p+
scénarimage/S.
scénario/S.
scénarisation/S.
scénariser/a0p+
scénariste/S.







>







67992
67993
67994
67995
67996
67997
67998
67999
68000
68001
68002
68003
68004
68005
68006
sceau/X.
sceau-de-Salomon
sceaux-de-Salomon
scélérate/F.
scélératement
scélératesse/S.
scellage/S.
scellé/S.
scellement/S.
sceller/a0p+
scénarimage/S.
scénario/S.
scénarisation/S.
scénariser/a0p+
scénariste/S.
68192
68193
68194
68195
68196
68197
68198

68199
68200
68201
68202
68203
68204
68205
scripturale/W.
scripturalisme/S.
scrofulaire/S.
scrofulariacée/S.
scrofule/S.
scrofuleuse/W.
scrogneugneu/X.

scrolling/S.
scrotale/W.
scrotum/S.
scrub/S.
scrubber/S.
scrupule/S.
scrupuleuse/W.







>







68240
68241
68242
68243
68244
68245
68246
68247
68248
68249
68250
68251
68252
68253
68254
scripturale/W.
scripturalisme/S.
scrofulaire/S.
scrofulariacée/S.
scrofule/S.
scrofuleuse/W.
scrogneugneu/X.
scroller/a0p.
scrolling/S.
scrotale/W.
scrotum/S.
scrub/S.
scrubber/S.
scrupule/S.
scrupuleuse/W.
70723
70724
70725
70726
70727
70728
70729
70730
70731
70732
70733
70734
70735
70736
70737
stariser/a0p+
starlette/S.
staroste/S.
star-system/S.
starter/S.
starting-block/S.
starting-gate/S.
start-up/S.
stase/S.
stater/a0p+
statère/S.
stathouder/S.
stathoudérat/S.
statice/S.
statif/S.







|







70772
70773
70774
70775
70776
70777
70778
70779
70780
70781
70782
70783
70784
70785
70786
stariser/a0p+
starlette/S.
staroste/S.
star-system/S.
starter/S.
starting-block/S.
starting-gate/S.
startup/S.
stase/S.
stater/a0p+
statère/S.
stathouder/S.
stathoudérat/S.
statice/S.
statif/S.
72382
72383
72384
72385
72386
72387
72388

72389
72390
72391
72392
72393
72394
72395
syrah/S.
syriaque/S.
syriaque/S.
syrienne/F.
syringe/S.
syringomyélie/S.
syrinx

syrphe/S.
sysadmin/S.
systématicienne/F.
systématicité/S.
systématique/S.
systématique/S.
systématiquement







>







72431
72432
72433
72434
72435
72436
72437
72438
72439
72440
72441
72442
72443
72444
72445
syrah/S.
syriaque/S.
syriaque/S.
syrienne/F.
syringe/S.
syringomyélie/S.
syrinx
syro-libanaise/F.
syrphe/S.
sysadmin/S.
systématicienne/F.
systématicité/S.
systématique/S.
systématique/S.
systématiquement
72531
72532
72533
72534
72535
72536
72537
72538
72539
72540
72541
72542
72543
72544
72545
72546
tagine/S.
tagliatelle/S.
tagme/S.
taguer/a0p+
tagueuse/F.
tahitienne/F.
taïaut
taï-chi
taï-chi-chuan
taie/S.
taïga/S.
taiji/S.
taijiquan/S.
taïkonaute/S.
taillable/S.
taillade/S.







|
|







72581
72582
72583
72584
72585
72586
72587
72588
72589
72590
72591
72592
72593
72594
72595
72596
tagine/S.
tagliatelle/S.
tagme/S.
taguer/a0p+
tagueuse/F.
tahitienne/F.
taïaut
taïchi/S.
taïchichuan/S.
taie/S.
taïga/S.
taiji/S.
taijiquan/S.
taïkonaute/S.
taillable/S.
taillade/S.
72576
72577
72578
72579
72580
72581
72582

72583
72584
72585
72586
72587
72588
72589
taleb/S.
talent/S.
talentueuse/W.
talentueusement
taler/a0p+
taleth/S.
talibane/F.

talion/S.
talisman/S.
talismanique/S.
talith/S.
talitre/S.
talkies-walkies
talkie-walkie







>







72626
72627
72628
72629
72630
72631
72632
72633
72634
72635
72636
72637
72638
72639
72640
taleb/S.
talent/S.
talentueuse/W.
talentueusement
taler/a0p+
taleth/S.
talibane/F.
talibée/F.
talion/S.
talisman/S.
talismanique/S.
talith/S.
talitre/S.
talkies-walkies
talkie-walkie
75113
75114
75115
75116
75117
75118
75119

75120
75121
75122
75123
75124
75125
75126
trantran/S.
trapèze/S.
trapéziste/S.
trapézoèdre/S.
trapézoïdale/W.
trapézoïde/S.
trappe/S.

trappeuse/F.
trappillon/S.
trappiste/S.
trappistine/S.
trapue/F.
traque/S.
traquée/F.







>







75164
75165
75166
75167
75168
75169
75170
75171
75172
75173
75174
75175
75176
75177
75178
trantran/S.
trapèze/S.
trapéziste/S.
trapézoèdre/S.
trapézoïdale/W.
trapézoïde/S.
trappe/S.
trapper/a0p+
trappeuse/F.
trappillon/S.
trappiste/S.
trappistine/S.
trapue/F.
traque/S.
traquée/F.
76217
76218
76219
76220
76221
76222
76223
76224
76225
76226
76227
76228
76229
76230
76231
ultimement/D'Q'
ultimité/S*
ultimo
ultra/S*
ultrabasique/S*
ultracentrifugation/S*
ultracentrifugeuse/S*
ultra-chic/S*
ultracolonialisme/S*
ultracolonialiste/S*
ultraconfidentielle/F*
ultraconservatrice/F*
ultracourte/F*
ultradienne/F*
ultradroite/S*







|







76269
76270
76271
76272
76273
76274
76275
76276
76277
76278
76279
76280
76281
76282
76283
ultimement/D'Q'
ultimité/S*
ultimo
ultra/S*
ultrabasique/S*
ultracentrifugation/S*
ultracentrifugeuse/S*
ultrachic/S*
ultracolonialisme/S*
ultracolonialiste/S*
ultraconfidentielle/F*
ultraconservatrice/F*
ultracourte/F*
ultradienne/F*
ultradroite/S*
77429
77430
77431
77432
77433
77434
77435

77436
77437
77438
77439
77440
77441
77442
vibrato/S.
vibratoire/S.
vibrer/a0p+
vibreur/S.
vibrion/S.
vibrionner/a0p.
vibrisse/S.

vibromasseur/S.
vicaire/S.
vicariale/W.
vicariance/S.
vicariante/F.
vicariat/S.
vice/S.







>







77481
77482
77483
77484
77485
77486
77487
77488
77489
77490
77491
77492
77493
77494
77495
vibrato/S.
vibratoire/S.
vibrer/a0p+
vibreur/S.
vibrion/S.
vibrionner/a0p.
vibrisse/S.
vibro/S.
vibromasseur/S.
vicaire/S.
vicariale/W.
vicariance/S.
vicariante/F.
vicariat/S.
vice/S.

Modified gc_lang/fr/oxt/Dictionnaires/dictionaries/fr-reforme1990.aff from [f5624fc7bf] to [c48aa6e466].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# AFFIXES DU DICTIONNAIRE ORTHOGRAPHIQUE FRANÇAIS “RÉFORME 1990” v6.1
# par Olivier R. -- licence MPL 2.0
# Généré le 03-06-2017 à 22:26
# Pour améliorer le dictionnaire, allez sur http://www.dicollecte.org/



SET UTF-8

WORDCHARS -’'1234567890.




|

|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# AFFIXES DU DICTIONNAIRE ORTHOGRAPHIQUE FRANÇAIS “RÉFORME 1990” v6.2
# par Olivier R. -- licence MPL 2.0
# Généré le 26-07-2017 à 09:33
# Pour améliorer le dictionnaire, allez sur http://www.dicollecte.org/



SET UTF-8

WORDCHARS -’'1234567890.

Modified gc_lang/fr/oxt/Dictionnaires/dictionaries/fr-reforme1990.dic from [5191f244cd] to [1c3d8999ad].

1
2
3
4
5
6
7
8
78701
&
1er/--
1ers/--
1re/--
1res/--
1ʳᵉ/--
1ʳᵉˢ/--
|







1
2
3
4
5
6
7
8
78754
&
1er/--
1ers/--
1re/--
1res/--
1ʳᵉ/--
1ʳᵉˢ/--
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
Aïcha/L'D'Q'
Aïd/L'D'Q'
Aida/L'D'Q'
Aidan/L'D'Q'
Aïd-el-Adha/L'
Aïd-el-Kébir/L'
Aiden/L'D'Q'
Aignan
Aigoual/L'D'
Aigrain/L'D'Q'
Aimé/L'D'Q'
Aimée/L'D'Q'
Ain/L'
Airaines/L'D'Q'
Airbnb/L'D'Q'







|







187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
Aïcha/L'D'Q'
Aïd/L'D'Q'
Aida/L'D'Q'
Aidan/L'D'Q'
Aïd-el-Adha/L'
Aïd-el-Kébir/L'
Aiden/L'D'Q'
Aignan/L'D'Q'
Aigoual/L'D'
Aigrain/L'D'Q'
Aimé/L'D'Q'
Aimée/L'D'Q'
Ain/L'
Airaines/L'D'Q'
Airbnb/L'D'Q'
529
530
531
532
533
534
535

536
537
538
539
540
541
542
Arion/L'D'Q'
Aristarque/L'D'Q'
Aristide/L'D'Q'
Aristophane/L'D'Q'
Aristote/L'D'Q'
Arizona/L'D'
Arjuna/L'D'Q'

Arkansas/L'D'
Arkema/L'D'Q'
Arkham/L'D'Q'
Arkhangelsk/L'D'Q'
Arlene/L'D'Q'
Arlène/L'D'Q'
Arles/L'D'Q'







>







529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
Arion/L'D'Q'
Aristarque/L'D'Q'
Aristide/L'D'Q'
Aristophane/L'D'Q'
Aristote/L'D'Q'
Arizona/L'D'
Arjuna/L'D'Q'
Arkady/L'D'Q'
Arkansas/L'D'
Arkema/L'D'Q'
Arkham/L'D'Q'
Arkhangelsk/L'D'Q'
Arlene/L'D'Q'
Arlène/L'D'Q'
Arles/L'D'Q'
651
652
653
654
655
656
657

658
659
660
661
662
663
664
Aurélien/L'D'Q'
Aurelio/L'D'Q'
Auriane/L'D'Q'
Aurillac/L'D'Q'
Auriol/L'D'Q'
Aurore/L'D'Q'
Auschwitz/L'D'Q'

Austerlitz/L'D'Q'
Austin/L'D'Q'
Australasie/L'D'Q'
Australie/L'D'
Australie-Méridionale/L'D'
Australie-Occidentale/L'D'
Austrasie/L'D'







>







652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
Aurélien/L'D'Q'
Aurelio/L'D'Q'
Auriane/L'D'Q'
Aurillac/L'D'Q'
Auriol/L'D'Q'
Aurore/L'D'Q'
Auschwitz/L'D'Q'
Austen/L'D'Q'
Austerlitz/L'D'Q'
Austin/L'D'Q'
Australasie/L'D'Q'
Australie/L'D'
Australie-Méridionale/L'D'
Australie-Occidentale/L'D'
Austrasie/L'D'
896
897
898
899
900
901
902

903
904
905
906
907
908
909
Benoîte
Benozillo
Benpro
Bentama
Bentham
Bentley
Benveniste

Berchem-Sainte-Agathe
Berck
Bercy
Bérenger
Bérengère
Bérénice
Bérézina







>







898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
Benoîte
Benozillo
Benpro
Bentama
Bentham
Bentley
Benveniste
Bérangère
Berchem-Sainte-Agathe
Berck
Bercy
Bérenger
Bérengère
Bérénice
Bérézina
1330
1331
1332
1333
1334
1335
1336

1337
1338
1339
1340
1341
1342
1343
Caine
Caïphe
Caire
Caitlin
Caitlyn
Calabre
Calais

Calc
Calcutta
Calderón
Caleb
Calédonie
Calestienne
Calgary







>







1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
Caine
Caïphe
Caire
Caitlin
Caitlyn
Calabre
Calais
Calaisis
Calc
Calcutta
Calderón
Caleb
Calédonie
Calestienne
Calgary
1646
1647
1648
1649
1650
1651
1652

1653
1654
1655
1656
1657
1658
1659
Chostakovitch
Chris
Christa
Christel
Christèle
Christelle
Christian

Christiane
Christie
Christina
Christine
Christmas
Christoffel
Christoph







>







1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
Chostakovitch
Chris
Christa
Christel
Christèle
Christelle
Christian
Christiana
Christiane
Christie
Christina
Christine
Christmas
Christoffel
Christoph
1674
1675
1676
1677
1678
1679
1680

1681
1682
1683
1684
1685
1686
1687
Cincinnati
Cindy
Ciney
Ciotat
Circassie
Circé
Cirey-sur-Vezouze

Cisjordanie
Cîteaux
Citroën
City
Claire
Clamart
Clara







>







1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
Cincinnati
Cindy
Ciney
Ciotat
Circassie
Circé
Cirey-sur-Vezouze
Cisco
Cisjordanie
Cîteaux
Citroën
City
Claire
Clamart
Clara
2486
2487
2488
2489
2490
2491
2492

2493
2494
2495
2496
2497
2498
2499
Eure-et-Loir/L'D'
Euripide/L'D'Q'
Eurobaromètre/S*
Eurogroupe/L'
Euronext/L'D'Q'
Europe/L'D'
Europol/D'Q'

Eurozone/L'
Eurydice/L'D'Q'
Eusèbe/L'D'Q'
Euterpe/L'D'Q'
Eva/L'D'Q'
Éva/L'D'Q'
Évaine/L'D'Q'







>







2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
Eure-et-Loir/L'D'
Euripide/L'D'Q'
Eurobaromètre/S*
Eurogroupe/L'
Euronext/L'D'Q'
Europe/L'D'
Europol/D'Q'
Eurotunnel/L'D'Q'
Eurozone/L'
Eurydice/L'D'Q'
Eusèbe/L'D'Q'
Euterpe/L'D'Q'
Eva/L'D'Q'
Éva/L'D'Q'
Évaine/L'D'Q'
2596
2597
2598
2599
2600
2601
2602

2603
2604
2605
2606
2607
2608
2609
Fayard
Fayçal
Fayette
Fécamp
Fed
FedEx
Federer

Federico
Fehling
Feist
Feïza
Feldane
Felicia
Félicie







>







2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
Fayard
Fayçal
Fayette
Fécamp
Fed
FedEx
Federer
Federica
Federico
Fehling
Feist
Feïza
Feldane
Felicia
Félicie
3217
3218
3219
3220
3221
3222
3223

3224
3225
3226
3227
3228
3229
3230
Halluin/L'D'Q'
Ham/L'D'Q'
Hamas
Hambourg
Hamel
Hamid/L'D'Q'
Hamilton

Hamme
HammerFall
Hammourabi
Hamont-Achel/L'D'Q'
Hampshire
Ham-sur-Heure-Nalinnes/L'D'Q'
Hamza/L'D'Q'







>







3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
Halluin/L'D'Q'
Ham/L'D'Q'
Hamas
Hambourg
Hamel
Hamid/L'D'Q'
Hamilton
Hamlet/L'D'Q'
Hamme
HammerFall
Hammourabi
Hamont-Achel/L'D'Q'
Hampshire
Ham-sur-Heure-Nalinnes/L'D'Q'
Hamza/L'D'Q'
3461
3462
3463
3464
3465
3466
3467

3468
3469
3470
3471
3472
3473
3474
Howard
Hubble
Hubei
Hubert/L'D'Q'
Hubscher
Hudson/L'D'Q'
Huelgoat

Hugo/L'D'Q'
Hugo/L'D'Q'
Hugues/L'D'Q'
Huguette
Hulshout/L'D'Q'
Hume
Hun/S.







>







3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
Howard
Hubble
Hubei
Hubert/L'D'Q'
Hubscher
Hudson/L'D'Q'
Huelgoat
Hugh/L'D'Q'
Hugo/L'D'Q'
Hugo/L'D'Q'
Hugues/L'D'Q'
Huguette
Hulshout/L'D'Q'
Hume
Hun/S.
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
IMSI/L'D'Q'
INED/L'D'Q'
INPI/L'D'Q'
INRA/L'D'Q'
INRI/L'D'Q'
INRIA/L'D'Q'
INSA/L'D'Q'
INSERM/L'D'Q'
IP/L'D'Q'
IRA/L'
IRD/L'D'Q'
IRFM/L'D'Q'
IRL
IRM/L'D'Q'
IRSTEA/L'D'Q'







<







3525
3526
3527
3528
3529
3530
3531

3532
3533
3534
3535
3536
3537
3538
IMSI/L'D'Q'
INED/L'D'Q'
INPI/L'D'Q'
INRA/L'D'Q'
INRI/L'D'Q'
INRIA/L'D'Q'
INSA/L'D'Q'

IP/L'D'Q'
IRA/L'
IRD/L'D'Q'
IRFM/L'D'Q'
IRL
IRM/L'D'Q'
IRSTEA/L'D'Q'
3594
3595
3596
3597
3598
3599
3600

3601
3602
3603
3604
3605
3606
3607
Ingrid/L'D'Q'
Inkscape/L'D'Q'
Inn/L'D'
Inna/L'D'Q'
Innsmouth/L'D'Q'
Inovia/L'D'Q'
Insee/L'D'Q'

Insulinde/L'D'
Intel/L'D'Q'
Internet/D'Q'
Interpol/D'Q'
Io/L'D'Q'
Ionesco/L'D'Q'
Ioulia/L'D'Q'







>







3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
Ingrid/L'D'Q'
Inkscape/L'D'Q'
Inn/L'D'
Inna/L'D'Q'
Innsmouth/L'D'Q'
Inovia/L'D'Q'
Insee/L'D'Q'
Inserm/L'D'Q'
Insulinde/L'D'
Intel/L'D'Q'
Internet/D'Q'
Interpol/D'Q'
Io/L'D'Q'
Ionesco/L'D'Q'
Ioulia/L'D'Q'
4294
4295
4296
4297
4298
4299
4300

4301
4302
4303
4304
4305
4306
4307
Léonore
Léontine
Léopold
Léopoldine
Leopoldt
Léopoldville
Leroy

Lesbos
Lesieur
Lesley
Leslie
Lesneven
Lesotho
Lesse







>







4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
Léonore
Léontine
Léopold
Léopoldine
Leopoldt
Léopoldville
Leroy
Lesage
Lesbos
Lesieur
Lesley
Leslie
Lesneven
Lesotho
Lesse
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
Noisy-le-Grand
Noisy-le-Sec
Nokia
Nolan
Nolwenn
Nora
Norbert
Nord
Nord-Kivu
Nord-Pas-de-Calais
Nord-du-Québec
Nordine
Norfolk
Norique
Norma







<







5482
5483
5484
5485
5486
5487
5488

5489
5490
5491
5492
5493
5494
5495
Noisy-le-Grand
Noisy-le-Sec
Nokia
Nolan
Nolwenn
Nora
Norbert

Nord-Kivu
Nord-Pas-de-Calais
Nord-du-Québec
Nordine
Norfolk
Norique
Norma
6206
6207
6208
6209
6210
6211
6212

6213
6214
6215
6216
6217
6218
6219
Reidemeister
Reiko
Reims
Reiten
Relecq-Kerhuon
Rellich
Rembrandt

Rémi
Remich
Remire-Montjoly
Remus
Rémy
Renaix
Renan







>







6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
Reidemeister
Reiko
Reims
Reiten
Relecq-Kerhuon
Rellich
Rembrandt
Remi
Rémi
Remich
Remire-Montjoly
Remus
Rémy
Renaix
Renan
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
Rosita
Rosny-sous-Bois
Ross
Rossini
Rossinière
Rostand
Roswell
Roth
Roth
Rothbard
Rothschild
Rotin
Rotselaar
Rotterdam
Roubaix







<







6387
6388
6389
6390
6391
6392
6393

6394
6395
6396
6397
6398
6399
6400
Rosita
Rosny-sous-Bois
Ross
Rossini
Rossinière
Rostand
Roswell

Roth
Rothbard
Rothschild
Rotin
Rotselaar
Rotterdam
Roubaix
9051
9052
9053
9054
9055
9056
9057
9058
9059
9060
9061
9062

9063
9064
9065
9066
9067
9068
9069
additionnelle/F*
additionnellement/D'Q'
additionner/a4p+
additionneuse/F*
additive/F*
additivement/D'Q'
additivité/S*
addon/S*
adducteur/S*
adduction/S*
adduit/S*
adèle/S*

adelphophagie/S*
adénine/S*
adénite/S*
adénocarcinome/S*
adénogramme/S*
adénoïde/S*
adénoïdectomie/S*







|




>







9061
9062
9063
9064
9065
9066
9067
9068
9069
9070
9071
9072
9073
9074
9075
9076
9077
9078
9079
9080
additionnelle/F*
additionnellement/D'Q'
additionner/a4p+
additionneuse/F*
additive/F*
additivement/D'Q'
additivité/S*
add-on/S*
adducteur/S*
adduction/S*
adduit/S*
adèle/S*
adelphe/S*
adelphophagie/S*
adénine/S*
adénite/S*
adénocarcinome/S*
adénogramme/S*
adénoïde/S*
adénoïdectomie/S*
9723
9724
9725
9726
9727
9728
9729

9730
9731
9732
9733
9734
9735
9736
agripper/a4p+
agritourisme/S*
agroalimentaire/S*
agroalimentaire/S*
agrobiologie/S*
agrobiologique/S*
agrobiologiste/S*

agrocarburant/S*
agro-carburant/S*
agrochimie/S*
agrochimique/S*
agrochimiste/S*
agroclimatique/S*
agro-climatique/S*







>







9734
9735
9736
9737
9738
9739
9740
9741
9742
9743
9744
9745
9746
9747
9748
agripper/a4p+
agritourisme/S*
agroalimentaire/S*
agroalimentaire/S*
agrobiologie/S*
agrobiologique/S*
agrobiologiste/S*
agrobusiness/L'D'Q'
agrocarburant/S*
agro-carburant/S*
agrochimie/S*
agrochimique/S*
agrochimiste/S*
agroclimatique/S*
agro-climatique/S*
9864
9865
9866
9867
9868
9869
9870

9871
9872
9873
9874
9875
9876
9877
aillade/S*
ailler/a2p+
ailleurs/L'D'Q'
ailloli/S*
aimable/S*
aimablement/D'Q'
aimant/S*

aimantation/S*
aimante/F*
aimanter/a4p+
aimantin/S*
aimantine/F*
aimée/F*
aimer/a4p+







>







9876
9877
9878
9879
9880
9881
9882
9883
9884
9885
9886
9887
9888
9889
9890
aillade/S*
ailler/a2p+
ailleurs/L'D'Q'
ailloli/S*
aimable/S*
aimablement/D'Q'
aimant/S*
aimantable/S*
aimantation/S*
aimante/F*
aimanter/a4p+
aimantin/S*
aimantine/F*
aimée/F*
aimer/a4p+
10500
10501
10502
10503
10504
10505
10506
10507
10508
10509
10510
10511
10512
10513
10514
amathie/S*
amatir/f2p+
amatrice/F*
amaurose/S*
amazone/S*
amazonienne/F*
amazonite/S*
ambages/D'Q'
ambassade/S*
ambassadrice/F*
ambiance/S*
ambiancer/a1p.
ambianceuse/F*
ambiante/F*
ambidextre/S*







|







10513
10514
10515
10516
10517
10518
10519
10520
10521
10522
10523
10524
10525
10526
10527
amathie/S*
amatir/f2p+
amatrice/F*
amaurose/S*
amazone/S*
amazonienne/F*
amazonite/S*
ambage/S*
ambassade/S*
ambassadrice/F*
ambiance/S*
ambiancer/a1p.
ambianceuse/F*
ambiante/F*
ambidextre/S*
11343
11344
11345
11346
11347
11348
11349

11350
11351
11352
11353
11354
11355
11356
annuité/S*
annulabilité/S*
annulable/S*
annulaire/S*
annulation/S*
annulative/F*
annulatrice/F*

annuler/a4p+
annuus
anoblir/f4p+
anoblissante/F*
anoblissement/S*
anode/S*
anodine/F*







>







11356
11357
11358
11359
11360
11361
11362
11363
11364
11365
11366
11367
11368
11369
11370
annuité/S*
annulabilité/S*
annulable/S*
annulaire/S*
annulation/S*
annulative/F*
annulatrice/F*
annulement/S*
annuler/a4p+
annuus
anoblir/f4p+
anoblissante/F*
anoblissement/S*
anode/S*
anodine/F*
11660
11661
11662
11663
11664
11665
11666


11667
11668
11669
11670
11671
11672
11673
antienne/S*
antienzyme/S*
antiépileptique/S*
antiesclavagiste/S*
antiestrogène/S*
antiestrogène/S*
antiétatique/S*


antifading/S*
antifascisme/S*
antifasciste/S*
antiféminisme/S*
antiféministe/S*
antiferment/S*
antiferroélectricité/S*







>
>







11674
11675
11676
11677
11678
11679
11680
11681
11682
11683
11684
11685
11686
11687
11688
11689
antienne/S*
antienzyme/S*
antiépileptique/S*
antiesclavagiste/S*
antiestrogène/S*
antiestrogène/S*
antiétatique/S*
antiétatisme/S*
antifa/S*
antifading/S*
antifascisme/S*
antifasciste/S*
antiféminisme/S*
antiféministe/S*
antiferment/S*
antiferroélectricité/S*
12464
12465
12466
12467
12468
12469
12470

12471
12472
12473
12474
12475
12476
12477
arc/S*
arcade/S*
arcane/S*
arcanson/S*
arcasse/S*
arcature/S*
arcboutant/S*

arcbouter/a4p+
arccos
arccosh
arccotan
arccotanh
arcdoubleau/X*
arceau/X*







>







12480
12481
12482
12483
12484
12485
12486
12487
12488
12489
12490
12491
12492
12493
12494
arc/S*
arcade/S*
arcane/S*
arcanson/S*
arcasse/S*
arcature/S*
arcboutant/S*
arc-boutement
arcbouter/a4p+
arccos
arccosh
arccotan
arccotanh
arcdoubleau/X*
arceau/X*
12560
12561
12562
12563
12564
12565
12566

12567
12568
12569
12570
12571
12572
12573
archivolte/S*
archontat/S*
archonte/S*
archosaurien/S*
archure/S*
arçon/S*
arçonner/a2p+

arcs-en-ciel/D'Q'
arcsin
arcsinh
arctan
arctanh
arctique/S*
arcure/S*







>







12577
12578
12579
12580
12581
12582
12583
12584
12585
12586
12587
12588
12589
12590
12591
archivolte/S*
archontat/S*
archonte/S*
archosaurien/S*
archure/S*
arçon/S*
arçonner/a2p+
arcs-boutements
arcs-en-ciel/D'Q'
arcsin
arcsinh
arctan
arctanh
arctique/S*
arcure/S*
15450
15451
15452
15453
15454
15455
15456

15457
15458
15459
15460
15461
15462
15463
bernard-l'ermite
berne/S.
berner/a0p+
berneuse/F.
bernicle/S.
bernique
bernique/S.

berrichonne/F.
bersaglier/S.
berthon/S.
bertillonnage/S.
béryl/S.
bérylliose/S.
béryllium/S.







>







15468
15469
15470
15471
15472
15473
15474
15475
15476
15477
15478
15479
15480
15481
15482
bernard-l'ermite
berne/S.
berner/a0p+
berneuse/F.
bernicle/S.
bernique
bernique/S.
bernoise/F.
berrichonne/F.
bersaglier/S.
berthon/S.
bertillonnage/S.
béryl/S.
bérylliose/S.
béryllium/S.
17699
17700
17701
17702
17703
17704
17705

17706
17707
17708
17709
17710
17711
17712
bugne/S.
bugrane/S.
buguée/F.
build/S.
building/S.
buire/S.
buis

buisson/S.
buisson-ardent
buissonnante/F.
buissonnet/S.
buissonneuse/W.
buissonnière/F.
buissons-ardents







>







17718
17719
17720
17721
17722
17723
17724
17725
17726
17727
17728
17729
17730
17731
17732
bugne/S.
bugrane/S.
buguée/F.
build/S.
building/S.
buire/S.
buis
buissaie/S.
buisson/S.
buisson-ardent
buissonnante/F.
buissonnet/S.
buissonneuse/W.
buissonnière/F.
buissons-ardents
18040
18041
18042
18043
18044
18045
18046

18047
18048
18049
18050
18051
18052
18053
cadrer/a0p+
cadreuse/F.
cadriciel/S.
caduc/S.
caducée/S.
caducifoliée/F.
caducité/S.

caduque/S.
cæcale/W.
cæcotrophie/S.
cæcum/S.
caennaise/F.
cænogenèse/S.
cæsine







>







18060
18061
18062
18063
18064
18065
18066
18067
18068
18069
18070
18071
18072
18073
18074
cadrer/a0p+
cadreuse/F.
cadriciel/S.
caduc/S.
caducée/S.
caducifoliée/F.
caducité/S.
caduque/F.
caduque/S.
cæcale/W.
cæcotrophie/S.
cæcum/S.
caennaise/F.
cænogenèse/S.
cæsine
18439
18440
18441
18442
18443
18444
18445

18446
18447
18448
18449
18450
18451
18452
camping-caravaning/S.
camping-gaz
campinoise/F.
campo/S.
campus
camuse/F.
canada/S.

canadianisme/S.
canadienne/F.
canado-américaine/F.
canaille/S.
canaillement
canaillerie/S.
canaillocratie/S.







>







18460
18461
18462
18463
18464
18465
18466
18467
18468
18469
18470
18471
18472
18473
18474
camping-caravaning/S.
camping-gaz
campinoise/F.
campo/S.
campus
camuse/F.
canada/S.
canadair/S.
canadianisme/S.
canadienne/F.
canado-américaine/F.
canaille/S.
canaillement
canaillerie/S.
canaillocratie/S.
19418
19419
19420
19421
19422
19423
19424

19425
19426
19427
19428
19429
19430
19431
caucasique/S.
cauchemar/S.
cauchemarder/a0p.
cauchemardesque/S.
cauchemardeuse/W.
caucus
caudale/W.

caudataire/S.
caudataire/S.
caudillo/S.
caudine/S.
caudrette/S.
caulescente/F.
caulicole/S.







>







19440
19441
19442
19443
19444
19445
19446
19447
19448
19449
19450
19451
19452
19453
19454
caucasique/S.
cauchemar/S.
cauchemarder/a0p.
cauchemardesque/S.
cauchemardeuse/W.
caucus
caudale/W.
caudalie/S.
caudataire/S.
caudataire/S.
caudillo/S.
caudine/S.
caudrette/S.
caulescente/F.
caulicole/S.
24015
24016
24017
24018
24019
24020
24021

24022
24023
24024
24025
24026
24027
24028
corruptrice/F.
corsage/S.
corsaire/S.
corse/S.
corselet/S.
corser/a0p+
corset/S.

corseter/b0p+
corseterie/S.
corsetière/F.
corso/S.
cortège/S.
cortès
cortex







>







24038
24039
24040
24041
24042
24043
24044
24045
24046
24047
24048
24049
24050
24051
24052
corruptrice/F.
corsage/S.
corsaire/S.
corse/S.
corselet/S.
corser/a0p+
corset/S.
corsetage/S.
corseter/b0p+
corseterie/S.
corsetière/F.
corso/S.
cortège/S.
cortès
cortex
25520
25521
25522
25523
25524
25525
25526

25527
25528
25529
25530
25531
25532
25533
cytotoxicité/S.
cytotoxique/S.
czardas
czimbalum/S.
d
d/||--
dB/||--

dacryoadénite/S.
dacryocystite/S.
dactyle/S.
dactylique/S.
dactylo/S.
dactylogramme/S.
dactylographe/S.







>







25544
25545
25546
25547
25548
25549
25550
25551
25552
25553
25554
25555
25556
25557
25558
cytotoxicité/S.
cytotoxique/S.
czardas
czimbalum/S.
d
d/||--
dB/||--
daba/S.
dacryoadénite/S.
dacryocystite/S.
dactyle/S.
dactylique/S.
dactylo/S.
dactylogramme/S.
dactylographe/S.
27305
27306
27307
27308
27309
27310
27311

27312
27313
27314
27315
27316
27317
27318
dénombrabilité/S.
dénombrable/S.
dénombrement/S.
dénombrer/a0p+
dénominateur/S.
dénomination/S.
dénominative/F.

dénommer/a0p+
dénoncer/a0p+
dénonciation/S.
dénonciatrice/F.
dénotation/S.
dénotationnelle/F.
dénotative/F.







>







27330
27331
27332
27333
27334
27335
27336
27337
27338
27339
27340
27341
27342
27343
27344
dénombrabilité/S.
dénombrable/S.
dénombrement/S.
dénombrer/a0p+
dénominateur/S.
dénomination/S.
dénominative/F.
dénommable/S.
dénommer/a0p+
dénoncer/a0p+
dénonciation/S.
dénonciatrice/F.
dénotation/S.
dénotationnelle/F.
dénotative/F.
28103
28104
28105
28106
28107
28108
28109

28110
28111
28112
28113
28114
28115
28116
désincorporer/a0p+
désincrustation/S.
désincruster/a0p+
désinculper/a0p+
désindenter/a0p+
désindexation/S.
désindexer/a0p+

désindustrialisation/S.
désindustrialiser/a0p+
désinence/S.
désinentielle/F.
désinfectante/F.
désinfecter/a0p+
désinfection/S.







>







28129
28130
28131
28132
28133
28134
28135
28136
28137
28138
28139
28140
28141
28142
28143
désincorporer/a0p+
désincrustation/S.
désincruster/a0p+
désinculper/a0p+
désindenter/a0p+
désindexation/S.
désindexer/a0p+
désindividualiser/a0p+
désindustrialisation/S.
désindustrialiser/a0p+
désinence/S.
désinentielle/F.
désinfectante/F.
désinfecter/a0p+
désinfection/S.
28152
28153
28154
28155
28156
28157
28158

28159
28160
28161
28162
28163
28164
28165
désinviter/a0p+
désinvolte/S.
désinvoltement
désinvolture/S.
désir/S.
désirabilité/S.
désirable/S.

désirer/a0p+
désireuse/W.
désistement/S.
désister/a0p+
desman/S.
desmine/S.
desmodonte/S.







>







28179
28180
28181
28182
28183
28184
28185
28186
28187
28188
28189
28190
28191
28192
28193
désinviter/a0p+
désinvolte/S.
désinvoltement
désinvolture/S.
désir/S.
désirabilité/S.
désirable/S.
désirante/F.
désirer/a0p+
désireuse/W.
désistement/S.
désister/a0p+
desman/S.
desmine/S.
desmodonte/S.
28781
28782
28783
28784
28785
28786
28787

28788
28789
28790
28791
28792
28793
28794
diarrhée/S.
diarrhéique/S.
diarthrose/S.
diascope/S.
diascopie/S.
diascordium/S.
diaspora/S.

diastase/S.
diastasique/S.
diastème/S.
diastéréo-isomère/S.
diastole/S.
diastolique/S.
diastratique/S.







>







28809
28810
28811
28812
28813
28814
28815
28816
28817
28818
28819
28820
28821
28822
28823
diarrhée/S.
diarrhéique/S.
diarthrose/S.
diascope/S.
diascopie/S.
diascordium/S.
diaspora/S.
diasporique/S.
diastase/S.
diastasique/S.
diastème/S.
diastéréo-isomère/S.
diastole/S.
diastolique/S.
diastratique/S.
29497
29498
29499
29500
29501
29502
29503

29504
29505
29506
29507
29508
29509
29510
diversement
diverses
diversifiable/S.
diversification/S.
diversifier/a0p+
diversiforme/S.
diversion/S.

diversité/S.
diverticule/S.
diverticulite/S.
diverticulose/S.
divertimento/S.
divertir/f0p+
divertissante/F.







>







29526
29527
29528
29529
29530
29531
29532
29533
29534
29535
29536
29537
29538
29539
29540
diversement
diverses
diversifiable/S.
diversification/S.
diversifier/a0p+
diversiforme/S.
diversion/S.
diversitaire/S.
diversité/S.
diverticule/S.
diverticulite/S.
diverticulose/S.
divertimento/S.
divertir/f0p+
divertissante/F.
30612
30613
30614
30615
30616
30617
30618
30619
30620
30621
30622
30623
30624
30625
30626
écocertifiée/F*
écocide/S*
écocitoyenne/F*
écocitoyenneté/S*
écoconception/S*
écoconduite/S*
écoconstruction/S*
éco-construction/S*
écoemballage/S*
éco-environnementale/F*
écœurante/F*
écœurement/S*
écœurer/a2p+
écogeste/S*
écohabitat/S*







<







30642
30643
30644
30645
30646
30647
30648

30649
30650
30651
30652
30653
30654
30655
écocertifiée/F*
écocide/S*
écocitoyenne/F*
écocitoyenneté/S*
écoconception/S*
écoconduite/S*
écoconstruction/S*

écoemballage/S*
éco-environnementale/F*
écœurante/F*
écœurement/S*
écœurer/a2p+
écogeste/S*
écohabitat/S*
32074
32075
32076
32077
32078
32079
32080

32081
32082
32083
32084
32085
32086
32087
endoénergétique/S*
endogame/S*
endogamie/S*
endogamique/S*
endogée/F*
endogène/S*
endogénéité/S*

endolocalisation/S*
endolorir/f2p+
endolorissement/S*
endolymphe/S*
endomètre/S*
endométriose/S*
endométrite/S*







>







32103
32104
32105
32106
32107
32108
32109
32110
32111
32112
32113
32114
32115
32116
32117
endoénergétique/S*
endogame/S*
endogamie/S*
endogamique/S*
endogée/F*
endogène/S*
endogénéité/S*
endogroupe/S*
endolocalisation/S*
endolorir/f2p+
endolorissement/S*
endolymphe/S*
endomètre/S*
endométriose/S*
endométrite/S*
33850
33851
33852
33853
33854
33855
33856


33857
33858
33859
33860
33861
33862
33863
ethmoïdale/W*
ethmoïde/S*
ethmoïdite/S*
ethnarchie/S*
ethnarque/S*
ethnicisation/S*
ethniciser/a2p+


ethnicité/S*
ethnico-religieuse/W*
ethnie/S*
ethnique/S*
ethniquement/D'Q'
ethnobiologie/S*
ethnobotanique/S*







>
>







33880
33881
33882
33883
33884
33885
33886
33887
33888
33889
33890
33891
33892
33893
33894
33895
ethmoïdale/W*
ethmoïde/S*
ethmoïdite/S*
ethnarchie/S*
ethnarque/S*
ethnicisation/S*
ethniciser/a2p+
ethnicisme/S*
ethniciste/S*
ethnicité/S*
ethnico-religieuse/W*
ethnie/S*
ethnique/S*
ethniquement/D'Q'
ethnobiologie/S*
ethnobotanique/S*
33885
33886
33887
33888
33889
33890
33891

33892
33893
33894
33895
33896
33897
33898
ethnométhodologue/S*
ethnomusicologie/S*
ethnomusicologue/S*
ethnonyme/S*
ethnonymie/S*
ethnopsychiatrie/S*
ethnopsychologie/S*

ethnoreligieuse/W*
éthographie/S*
éthologie/S*
éthologique/S*
éthologiste/S*
éthologue/S*
éthos/L'D'Q'







>







33917
33918
33919
33920
33921
33922
33923
33924
33925
33926
33927
33928
33929
33930
33931
ethnométhodologue/S*
ethnomusicologie/S*
ethnomusicologue/S*
ethnonyme/S*
ethnonymie/S*
ethnopsychiatrie/S*
ethnopsychologie/S*
ethno-raciale/W*
ethnoreligieuse/W*
éthographie/S*
éthologie/S*
éthologique/S*
éthologiste/S*
éthologue/S*
éthos/L'D'Q'
34481
34482
34483
34484
34485
34486
34487

34488
34489
34490
34491
34492
34493
34494
exode/S*
exoderme/S*
exogame/S*
exogamie/S*
exogamique/S*
exogène/S*
exogénéité/S*

exomphale/S*
exon/S*
exondation/S*
exondement/S*
exonder/a3p+
exonération/S*
exonérer/c4p+







>







34514
34515
34516
34517
34518
34519
34520
34521
34522
34523
34524
34525
34526
34527
34528
exode/S*
exoderme/S*
exogame/S*
exogamie/S*
exogamique/S*
exogène/S*
exogénéité/S*
exogroupe/S*
exomphale/S*
exon/S*
exondation/S*
exondement/S*
exonder/a3p+
exonération/S*
exonérer/c4p+
34687
34688
34689
34690
34691
34692
34693


34694
34695
34696
34697
34698
34699
34700
extensionnelle/F*
extensité/S*
extensive/F*
extensivement/L'D'Q'
extensivité/S*
extenso
extensomètre/S*


exténuante/F*
exténuation/S*
exténuée/F*
exténuement/S*
exténuer/a4p+
extérieur/S*
extérieure/F*







>
>







34721
34722
34723
34724
34725
34726
34727
34728
34729
34730
34731
34732
34733
34734
34735
34736
extensionnelle/F*
extensité/S*
extensive/F*
extensivement/L'D'Q'
extensivité/S*
extenso
extensomètre/S*
extensométrie/S*
extensométrique/S*
exténuante/F*
exténuation/S*
exténuée/F*
exténuement/S*
exténuer/a4p+
extérieur/S*
extérieure/F*
35813
35814
35815
35816
35817
35818
35819

35820
35821
35822
35823
35824
35825
35826
filoselle/S.
filou/S.
filoutage/S.
filouter/a0p+
filouterie/S.
filovirus
fils

filtrable/S.
filtrage/S.
filtrante/F.
filtrat/S.
filtration/S.
filtre/S.
filtre-presse







>







35849
35850
35851
35852
35853
35854
35855
35856
35857
35858
35859
35860
35861
35862
35863
filoselle/S.
filou/S.
filoutage/S.
filouter/a0p+
filouterie/S.
filovirus
fils
filsdeputerie/S.
filtrable/S.
filtrage/S.
filtrante/F.
filtrat/S.
filtration/S.
filtre/S.
filtre-presse
36691
36692
36693
36694
36695
36696
36697

36698
36699
36700
36701
36702
36703
36704
foutou/S.
foutrale/F.
foutraque/S.
foutre/S.
foutre/tM
foutredieu
foutrement

foutriquet/S.
foutue/F.
fovéa/S.
fovéale/W.
fox
foxée/F.
fox-hound/S.







>







36728
36729
36730
36731
36732
36733
36734
36735
36736
36737
36738
36739
36740
36741
36742
foutou/S.
foutrale/F.
foutraque/S.
foutre/S.
foutre/tM
foutredieu
foutrement
foutrerie/S.
foutriquet/S.
foutue/F.
fovéa/S.
fovéale/W.
fox
foxée/F.
fox-hound/S.
40055
40056
40057
40058
40059
40060
40061

40062
40063
40064
40065
40066
40067
40068
haptique/S*
haptonomie/S*
haptonomique/S*
haquebute/S.
haquenée/S.
haquet/S.
harakiri/S.

harangue/S.
haranguer/a0p+
harangueuse/F.
haras
harassante/F.
harassement/S.
harasser/a0p+







>







40093
40094
40095
40096
40097
40098
40099
40100
40101
40102
40103
40104
40105
40106
40107
haptique/S*
haptonomie/S*
haptonomique/S*
haquebute/S.
haquenée/S.
haquet/S.
harakiri/S.
haram/S.
harangue/S.
haranguer/a0p+
harangueuse/F.
haras
harassante/F.
harassement/S.
harasser/a0p+
41280
41281
41282
41283
41284
41285
41286

41287
41288
41289
41290
41291
41292
41293

41294
41295
41296
41297
41298
41299
41300
hoyau/X.
hpz/||--
http/S=
huard/S.
huart/S.
hub/S.
hublot/S.

huche/S.
hucher/a0p+
huchet/S.
hue
huée/S.
huer/a0p+
huerta/S.

huguenote/F.
huilage/S*
huile/S*
huiler/a2p+
huilerie/S*
huileuse/W*
huilière/F*







>







>







41319
41320
41321
41322
41323
41324
41325
41326
41327
41328
41329
41330
41331
41332
41333
41334
41335
41336
41337
41338
41339
41340
41341
hoyau/X.
hpz/||--
http/S=
huard/S.
huart/S.
hub/S.
hublot/S.
hubris/L'D'Q'
huche/S.
hucher/a0p+
huchet/S.
hue
huée/S.
huer/a0p+
huerta/S.
hugolienne/F*
huguenote/F.
huilage/S*
huile/S*
huiler/a2p+
huilerie/S*
huileuse/W*
huilière/F*
41775
41776
41777
41778
41779
41780
41781


41782
41783
41784
41785
41786
41787
41788
hypertrophier/a4p+
hypertrophique/S*
hyperuricémie/S*
hypervariable/S*
hyperventilation/S*
hyperventiler/a1p.
hypervigilance/S*


hyperviscosité/S*
hyperviseur/S*
hypervitaminose/S*
hyphe/S*
hypholome/S*
hypnagogique/S*
hypnogramme/S*







>
>







41816
41817
41818
41819
41820
41821
41822
41823
41824
41825
41826
41827
41828
41829
41830
41831
hypertrophier/a4p+
hypertrophique/S*
hyperuricémie/S*
hypervariable/S*
hyperventilation/S*
hyperventiler/a1p.
hypervigilance/S*
hyperviolence/S*
hyperviolente/F*
hyperviscosité/S*
hyperviseur/S*
hypervitaminose/S*
hyphe/S*
hypholome/S*
hypnagogique/S*
hypnogramme/S*
42162
42163
42164
42165
42166
42167
42168

42169
42170
42171
42172
42173
42174
42175
illisibilité/S*
illisible/S*
illisiblement/D'Q'
illogique/S*
illogiquement/D'Q'
illogisme/S*
illuminante/F*

illumination/S*
illuminative/F*
illuminatrice/F*
illuminée/F*
illuminer/a4p+
illuminisme/S*
illusion/S*







>







42205
42206
42207
42208
42209
42210
42211
42212
42213
42214
42215
42216
42217
42218
42219
illisibilité/S*
illisible/S*
illisiblement/D'Q'
illogique/S*
illogiquement/D'Q'
illogisme/S*
illuminante/F*
illuminati/L'D'Q'
illumination/S*
illuminative/F*
illuminatrice/F*
illuminée/F*
illuminer/a4p+
illuminisme/S*
illusion/S*
42347
42348
42349
42350
42351
42352
42353
42354
42355
42356
42357
42358
42359
42360
42361
immunodéficiente/F*
immunodéficitaire/S*
immunodépresseur/S*
immunodépression/S*
immunodépressive/F*
immunodéprimée/F*
immunofluorescence/S*
immuno-fluorescence/S*
immunogène/S*
immunogénétique/S*
immunogénicité/S*
immunogénique/S*
immunoglobuline/S*
immunohistochimie/S*
immunologie/S*







<







42391
42392
42393
42394
42395
42396
42397

42398
42399
42400
42401
42402
42403
42404
immunodéficiente/F*
immunodéficitaire/S*
immunodépresseur/S*
immunodépression/S*
immunodépressive/F*
immunodéprimée/F*
immunofluorescence/S*

immunogène/S*
immunogénétique/S*
immunogénicité/S*
immunogénique/S*
immunoglobuline/S*
immunohistochimie/S*
immunologie/S*
42402
42403
42404
42405
42406
42407
42408

42409
42410
42411
42412
42413
42414
42415
imparisyllabique/S*
imparité/S*
impartageable/S*
impartiale/W*
impartialement/D'Q'
impartialité/S*
impartir/fC

impasse/S*
impassibilité/S*
impassible/S*
impassiblement/D'Q'
impatiemment/D'Q'
impatience/S*
impatiens/L'D'Q'







>







42445
42446
42447
42448
42449
42450
42451
42452
42453
42454
42455
42456
42457
42458
42459
imparisyllabique/S*
imparité/S*
impartageable/S*
impartiale/W*
impartialement/D'Q'
impartialité/S*
impartir/fC
impassable/S*
impasse/S*
impassibilité/S*
impassible/S*
impassiblement/D'Q'
impatiemment/D'Q'
impatience/S*
impatiens/L'D'Q'
51969
51970
51971
51972
51973
51974
51975

51976
51977
51978
51979
51980
51981
51982
multidevise/S.
multidiffusion/S.
multidimensionnalité/S.
multidimensionnelle/F.
multidirectionnalité/S.
multidirectionnelle/F.
multidisciplinaire/S.

multiethnique/S.
multifactorielle/F.
multifamiliale/W.
multifilaire/S.
multiflore/S.
multifonction/S.
multifonctionnalité/S.







>







52013
52014
52015
52016
52017
52018
52019
52020
52021
52022
52023
52024
52025
52026
52027
multidevise/S.
multidiffusion/S.
multidimensionnalité/S.
multidimensionnelle/F.
multidirectionnalité/S.
multidirectionnelle/F.
multidisciplinaire/S.
multidisciplinarité/S.
multiethnique/S.
multifactorielle/F.
multifamiliale/W.
multifilaire/S.
multiflore/S.
multifonction/S.
multifonctionnalité/S.
54310
54311
54312
54313
54314
54315
54316
54317
54318
54319
54320
54321
54322
54323
54324
54325
oligoasthénotératospermie/S*
oligocène/S*
oligochète/S*
oligoclase/S*
oligodendrocyte/S*
oligodendrogliome/S*
oligoélément/S*
oligoélément/S*
oligo-élément/S*
oligogalacturonate/S*
oligo-galacturonate/S*
oligomère/S*
oligomérique/S*
oligomérisation/S*
oligonucléotide/S*
oligo-nucléotide/S*







<
<







54355
54356
54357
54358
54359
54360
54361


54362
54363
54364
54365
54366
54367
54368
oligoasthénotératospermie/S*
oligocène/S*
oligochète/S*
oligoclase/S*
oligodendrocyte/S*
oligodendrogliome/S*
oligoélément/S*


oligogalacturonate/S*
oligo-galacturonate/S*
oligomère/S*
oligomérique/S*
oligomérisation/S*
oligonucléotide/S*
oligo-nucléotide/S*
57268
57269
57270
57271
57272
57273
57274

57275
57276
57277
57278
57279
57280
57281
perceptiblement
perception/S.
perceptionnisme/S.
perceptionniste/S.
perceptive/F.
perceptrice/F.
perceptuelle/F.

percer/a0p+
percerette/S.
perceuse/F.
percevable/S.
percevoir/pK
perche/S.
percher/a0p+







>







57311
57312
57313
57314
57315
57316
57317
57318
57319
57320
57321
57322
57323
57324
57325
perceptiblement
perception/S.
perceptionnisme/S.
perceptionniste/S.
perceptive/F.
perceptrice/F.
perceptuelle/F.
perceptuellement
percer/a0p+
percerette/S.
perceuse/F.
percevable/S.
percevoir/pK
perche/S.
percher/a0p+
58920
58921
58922
58923
58924
58925
58926

58927
58928
58929
58930
58931
58932
58933
pixellisation/S.
pizza/S.
pizzaïolo/S.
pizzéria/S.
pizzicato/I.
placage/S.
placard/S.

placarder/a0p+
placardisation/S.
placardiser/a0p+
place/S.
placébo/S.
placement/S.
placenta/S.







>







58964
58965
58966
58967
58968
58969
58970
58971
58972
58973
58974
58975
58976
58977
58978
pixellisation/S.
pizza/S.
pizzaïolo/S.
pizzéria/S.
pizzicato/I.
placage/S.
placard/S.
placardage/S.
placarder/a0p+
placardisation/S.
placardiser/a0p+
place/S.
placébo/S.
placement/S.
placenta/S.
59306
59307
59308
59309
59310
59311
59312

59313
59314
59315
59316
59317
59318
59319
ployage/S.
ployante/F.
ployer/a0p+
pluche/S.
plucher/a0p.
plucheuse/W.
plugin/S.

pluie/S.
plumage/S.
plumaison/S.
plumard/S.
plumasseau/X.
plumasserie/S.
plumassière/F.







>







59351
59352
59353
59354
59355
59356
59357
59358
59359
59360
59361
59362
59363
59364
59365
ployage/S.
ployante/F.
ployer/a0p+
pluche/S.
plucher/a0p.
plucheuse/W.
plugin/S.
plug-in/S.
pluie/S.
plumage/S.
plumaison/S.
plumard/S.
plumasseau/X.
plumasserie/S.
plumassière/F.
59342
59343
59344
59345
59346
59347
59348
59349
59350
59351
59352
59353
59354
59355
59356
59357
59358
59359
59360
59361
59362
59363
59364
59365
59366
59367
59368
59369
59370
59371
59372
59373
59374
59375
pluriannuelle/F.
pluricellulaire/S.
pluriculturelle/F.
pluridimensionnalité/S.
pluridimensionnelle/F.
pluridisciplinaire/S.
pluridisciplinaire/S.
pluri-disciplinaire/S.
pluridisciplinarité/S.
plurielle/F.
pluriethnique/S.
plurilatérale/W.
plurilingue/S.
plurilinguisme/S.
plurimillénaire/S.
plurimodale/W.
plurinationale/W.
plurinominale/W.
pluripartisme/S.
pluripartite/S.
pluripotence/S.
pluripotente/F.
pluriséculaire/S.
plurisousharmonique/S.
plurispécifique/S.
plurithématique/S.
pluri-thématique/S.
plurithérapie/S.
plurivalente/F.
plurivocité/S.
plurivoque/S.
plus
plus
plusieurs







<


















<







59388
59389
59390
59391
59392
59393
59394

59395
59396
59397
59398
59399
59400
59401
59402
59403
59404
59405
59406
59407
59408
59409
59410
59411
59412

59413
59414
59415
59416
59417
59418
59419
pluriannuelle/F.
pluricellulaire/S.
pluriculturelle/F.
pluridimensionnalité/S.
pluridimensionnelle/F.
pluridisciplinaire/S.
pluridisciplinaire/S.

pluridisciplinarité/S.
plurielle/F.
pluriethnique/S.
plurilatérale/W.
plurilingue/S.
plurilinguisme/S.
plurimillénaire/S.
plurimodale/W.
plurinationale/W.
plurinominale/W.
pluripartisme/S.
pluripartite/S.
pluripotence/S.
pluripotente/F.
pluriséculaire/S.
plurisousharmonique/S.
plurispécifique/S.
plurithématique/S.

plurithérapie/S.
plurivalente/F.
plurivocité/S.
plurivoque/S.
plus
plus
plusieurs
59719
59720
59721
59722
59723
59724
59725

59726
59727
59728
59729
59730
59731
59732
polychète/S.
polychlorobenzène/S.
polychlorure/S.
polychroïque/S.
polychroïsme/S.
polychrome/S.
polychromie/S.

polycistronique/S.
polyclinique/S.
polycondensat/S.
polycondensation/S.
polycopie/S.
polycopier/a0p+
polycourant







>







59763
59764
59765
59766
59767
59768
59769
59770
59771
59772
59773
59774
59775
59776
59777
polychète/S.
polychlorobenzène/S.
polychlorure/S.
polychroïque/S.
polychroïsme/S.
polychrome/S.
polychromie/S.
polychromique/S.
polycistronique/S.
polyclinique/S.
polycondensat/S.
polycondensation/S.
polycopie/S.
polycopier/a0p+
polycourant
59995
59996
59997
59998
59999
60000
60001

60002
60003
60004
60005
60006
60007
60008
popcorn/S.
pope/S.
popeline/S.
popinée/S.
poplitée/F.
popote/S.
popotin/S.

populace/S.
populacière/F.
populage/S.
populaire/S.
populairement
popularisation/S.
populariser/a0p+







>







60040
60041
60042
60043
60044
60045
60046
60047
60048
60049
60050
60051
60052
60053
60054
popcorn/S.
pope/S.
popeline/S.
popinée/S.
poplitée/F.
popote/S.
popotin/S.
popstar/S.
populace/S.
populacière/F.
populage/S.
populaire/S.
populairement
popularisation/S.
populariser/a0p+
60390
60391
60392
60393
60394
60395
60396
60397
60398
60399
60400
60401
60402
60403
60404
60405
poulaille/S.
poulailler/S.
poulaine/F.
poulamon/S.
poularde/S.
poulbot/S.
poule/S.
poulet/S.
poulette/S.
pouliage/S.
pouliche/S.
poulie/S.
pouliner/a0p.
poulinière/S.
poulinière/S.
pouliot/S.







<
|







60436
60437
60438
60439
60440
60441
60442

60443
60444
60445
60446
60447
60448
60449
60450
poulaille/S.
poulailler/S.
poulaine/F.
poulamon/S.
poularde/S.
poulbot/S.
poule/S.

poulette/F.
pouliage/S.
pouliche/S.
poulie/S.
pouliner/a0p.
poulinière/S.
poulinière/S.
pouliot/S.
61785
61786
61787
61788
61789
61790
61791

61792
61793
61794
61795
61796
61797
61798
protoplasme/S.
protoplasmique/S.
protoplaste/S.
protoptère/S.
protosulfure/S.
prototypage/S.
prototype/S.

prototypique/S.
prototypiste/S.
protoure/S.
protoxyde/S.
protozoaire/S.
protozoologie/S.
protractile/S.







>







61830
61831
61832
61833
61834
61835
61836
61837
61838
61839
61840
61841
61842
61843
61844
protoplasme/S.
protoplasmique/S.
protoplaste/S.
protoptère/S.
protosulfure/S.
prototypage/S.
prototype/S.
prototyper/a0p+
prototypique/S.
prototypiste/S.
protoure/S.
protoxyde/S.
protozoaire/S.
protozoologie/S.
protractile/S.
62290
62291
62292
62293
62294
62295
62296

62297
62298
62299
62300
62301
62302
62303
pusillanime/S.
pusillanimement
pusillanimité/S.
pustule/S.
pustuler/a0p+
pustuleuse/W.
putain/S.

putassière/F.
putative/F.
pute/S.
putier/S.
putiet/S.
putois
putréfaction/S.







>







62336
62337
62338
62339
62340
62341
62342
62343
62344
62345
62346
62347
62348
62349
62350
pusillanime/S.
pusillanimement
pusillanimité/S.
pustule/S.
pustuler/a0p+
pustuleuse/W.
putain/S.
putasserie/S.
putassière/F.
putative/F.
pute/S.
putier/S.
putiet/S.
putois
putréfaction/S.
67852
67853
67854
67855
67856
67857
67858

67859
67860
67861
67862
67863
67864
67865
sceau/X.
sceau-de-Salomon
sceaux-de-Salomon
scélérate/F.
scélératement
scélératesse/S.
scellage/S.

scellement/S.
sceller/a0p+
scénarimage/S.
scénario/S.
scénarisation/S.
scénariser/a0p+
scénariste/S.







>







67899
67900
67901
67902
67903
67904
67905
67906
67907
67908
67909
67910
67911
67912
67913
sceau/X.
sceau-de-Salomon
sceaux-de-Salomon
scélérate/F.
scélératement
scélératesse/S.
scellage/S.
scellé/S.
scellement/S.
sceller/a0p+
scénarimage/S.
scénario/S.
scénarisation/S.
scénariser/a0p+
scénariste/S.
68096
68097
68098
68099
68100
68101
68102

68103
68104
68105
68106
68107
68108
68109
scripturale/W.
scripturalisme/S.
scrofulaire/S.
scrofulariacée/S.
scrofule/S.
scrofuleuse/W.
scrogneugneu/X.

scrolling/S.
scrotale/W.
scrotum/S.
scrub/S.
scrubber/S.
scrupule/S.
scrupuleuse/W.







>







68144
68145
68146
68147
68148
68149
68150
68151
68152
68153
68154
68155
68156
68157
68158
scripturale/W.
scripturalisme/S.
scrofulaire/S.
scrofulariacée/S.
scrofule/S.
scrofuleuse/W.
scrogneugneu/X.
scroller/a0p.
scrolling/S.
scrotale/W.
scrotum/S.
scrub/S.
scrubber/S.
scrupule/S.
scrupuleuse/W.
72283
72284
72285
72286
72287
72288
72289

72290
72291
72292
72293
72294
72295
72296
syrah/S.
syriaque/S.
syriaque/S.
syrienne/F.
syringe/S.
syringomyélie/S.
syrinx

syrphe/S.
sysadmin/S.
systématicienne/F.
systématicité/S.
systématique/S.
systématique/S.
systématiquement







>







72332
72333
72334
72335
72336
72337
72338
72339
72340
72341
72342
72343
72344
72345
72346
syrah/S.
syriaque/S.
syriaque/S.
syrienne/F.
syringe/S.
syringomyélie/S.
syrinx
syro-libanaise/F.
syrphe/S.
sysadmin/S.
systématicienne/F.
systématicité/S.
systématique/S.
systématique/S.
systématiquement
72477
72478
72479
72480
72481
72482
72483

72484
72485
72486
72487
72488
72489
72490
talent/S.
talentueuse/W.
talentueusement
taler/a0p+
taleth/S.
taliatelle/S.
talibane/F.

talion/S.
talisman/S.
talismanique/S.
talith/S.
talitre/S.
talkiewalkie/S.
talkshow/S.







>







72527
72528
72529
72530
72531
72532
72533
72534
72535
72536
72537
72538
72539
72540
72541
talent/S.
talentueuse/W.
talentueusement
taler/a0p+
taleth/S.
taliatelle/S.
talibane/F.
talibée/F.
talion/S.
talisman/S.
talismanique/S.
talith/S.
talitre/S.
talkiewalkie/S.
talkshow/S.
75013
75014
75015
75016
75017
75018
75019

75020
75021
75022
75023
75024
75025
75026
trantran/S.
trapèze/S.
trapéziste/S.
trapézoèdre/S.
trapézoïdale/W.
trapézoïde/S.
trappe/S.

trappeuse/F.
trappillon/S.
trappiste/S.
trappistine/S.
trapue/F.
traque/S.
traquée/F.







>







75064
75065
75066
75067
75068
75069
75070
75071
75072
75073
75074
75075
75076
75077
75078
trantran/S.
trapèze/S.
trapéziste/S.
trapézoèdre/S.
trapézoïdale/W.
trapézoïde/S.
trappe/S.
trapper/a0p+
trappeuse/F.
trappillon/S.
trappiste/S.
trappistine/S.
trapue/F.
traque/S.
traquée/F.
77331
77332
77333
77334
77335
77336
77337

77338
77339
77340
77341
77342
77343
77344
vibrato/S.
vibratoire/S.
vibrer/a0p+
vibreur/S.
vibrion/S.
vibrionner/a0p.
vibrisse/S.

vibromasseur/S.
vicaire/S.
vicariale/W.
vicariance/S.
vicariante/F.
vicariat/S.
vice/S.







>







77383
77384
77385
77386
77387
77388
77389
77390
77391
77392
77393
77394
77395
77396
77397
vibrato/S.
vibratoire/S.
vibrer/a0p+
vibreur/S.
vibrion/S.
vibrionner/a0p.
vibrisse/S.
vibro/S.
vibromasseur/S.
vicaire/S.
vicariale/W.
vicariance/S.
vicariante/F.
vicariat/S.
vice/S.

Modified gc_lang/fr/oxt/Dictionnaires/dictionaries/fr-toutesvariantes.aff from [01e05b71db] to [0e3d2f8f2d].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# AFFIXES DU DICTIONNAIRE ORTHOGRAPHIQUE FRANÇAIS “TOUTES VARIANTES” v6.1
# par Olivier R. -- licence MPL 2.0
# Généré le 03-06-2017 à 22:26
# Pour améliorer le dictionnaire, allez sur http://www.dicollecte.org/



SET UTF-8

WORDCHARS -’'1234567890.




|

|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# AFFIXES DU DICTIONNAIRE ORTHOGRAPHIQUE FRANÇAIS “TOUTES VARIANTES” v6.2
# par Olivier R. -- licence MPL 2.0
# Généré le 26-07-2017 à 09:33
# Pour améliorer le dictionnaire, allez sur http://www.dicollecte.org/



SET UTF-8

WORDCHARS -’'1234567890.

Modified gc_lang/fr/oxt/Dictionnaires/dictionaries/fr-toutesvariantes.dic from [ae19739268] to [9463186eff].

1
2
3
4
5
6
7
8
82379
&
1er/--
1ers/--
1re/--
1res/--
1ʳᵉ/--
1ʳᵉˢ/--
|







1
2
3
4
5
6
7
8
82439
&
1er/--
1ers/--
1re/--
1res/--
1ʳᵉ/--
1ʳᵉˢ/--
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
Aïcha/L'D'Q'
Aïd/L'D'Q'
Aida/L'D'Q'
Aidan/L'D'Q'
Aïd-el-Adha/L'
Aïd-el-Kébir/L'
Aiden/L'D'Q'
Aignan
Aigoual/L'D'
Aigrain/L'D'Q'
Aimé/L'D'Q'
Aimée/L'D'Q'
Ain/L'
Airaines/L'D'Q'
Airbnb/L'D'Q'







|







187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
Aïcha/L'D'Q'
Aïd/L'D'Q'
Aida/L'D'Q'
Aidan/L'D'Q'
Aïd-el-Adha/L'
Aïd-el-Kébir/L'
Aiden/L'D'Q'
Aignan/L'D'Q'
Aigoual/L'D'
Aigrain/L'D'Q'
Aimé/L'D'Q'
Aimée/L'D'Q'
Ain/L'
Airaines/L'D'Q'
Airbnb/L'D'Q'
529
530
531
532
533
534
535

536
537
538
539
540
541
542
Arion/L'D'Q'
Aristarque/L'D'Q'
Aristide/L'D'Q'
Aristophane/L'D'Q'
Aristote/L'D'Q'
Arizona/L'D'
Arjuna/L'D'Q'

Arkansas/L'D'
Arkema/L'D'Q'
Arkham/L'D'Q'
Arkhangelsk/L'D'Q'
Arlene/L'D'Q'
Arlène/L'D'Q'
Arles/L'D'Q'







>







529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
Arion/L'D'Q'
Aristarque/L'D'Q'
Aristide/L'D'Q'
Aristophane/L'D'Q'
Aristote/L'D'Q'
Arizona/L'D'
Arjuna/L'D'Q'
Arkady/L'D'Q'
Arkansas/L'D'
Arkema/L'D'Q'
Arkham/L'D'Q'
Arkhangelsk/L'D'Q'
Arlene/L'D'Q'
Arlène/L'D'Q'
Arles/L'D'Q'
651
652
653
654
655
656
657

658
659
660
661
662
663
664
Aurélien/L'D'Q'
Aurelio/L'D'Q'
Auriane/L'D'Q'
Aurillac/L'D'Q'
Auriol/L'D'Q'
Aurore/L'D'Q'
Auschwitz/L'D'Q'

Austerlitz/L'D'Q'
Austin/L'D'Q'
Australasie/L'D'Q'
Australie/L'D'
Australie-Méridionale/L'D'
Australie-Occidentale/L'D'
Austrasie/L'D'







>







652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
Aurélien/L'D'Q'
Aurelio/L'D'Q'
Auriane/L'D'Q'
Aurillac/L'D'Q'
Auriol/L'D'Q'
Aurore/L'D'Q'
Auschwitz/L'D'Q'
Austen/L'D'Q'
Austerlitz/L'D'Q'
Austin/L'D'Q'
Australasie/L'D'Q'
Australie/L'D'
Australie-Méridionale/L'D'
Australie-Occidentale/L'D'
Austrasie/L'D'
896
897
898
899
900
901
902

903
904
905
906
907
908
909
Benoîte
Benozillo
Benpro
Bentama
Bentham
Bentley
Benveniste

Berchem-Sainte-Agathe
Berck
Bercy
Bérenger
Bérengère
Bérénice
Bérézina







>







898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
Benoîte
Benozillo
Benpro
Bentama
Bentham
Bentley
Benveniste
Bérangère
Berchem-Sainte-Agathe
Berck
Bercy
Bérenger
Bérengère
Bérénice
Bérézina
1330
1331
1332
1333
1334
1335
1336

1337
1338
1339
1340
1341
1342
1343
Caine
Caïphe
Caire
Caitlin
Caitlyn
Calabre
Calais

Calc
Calcutta
Calderón
Caleb
Calédonie
Calestienne
Calgary







>







1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
Caine
Caïphe
Caire
Caitlin
Caitlyn
Calabre
Calais
Calaisis
Calc
Calcutta
Calderón
Caleb
Calédonie
Calestienne
Calgary
1646
1647
1648
1649
1650
1651
1652

1653
1654
1655
1656
1657
1658
1659
Chostakovitch
Chris
Christa
Christel
Christèle
Christelle
Christian

Christiane
Christie
Christina
Christine
Christmas
Christoffel
Christoph







>







1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
Chostakovitch
Chris
Christa
Christel
Christèle
Christelle
Christian
Christiana
Christiane
Christie
Christina
Christine
Christmas
Christoffel
Christoph
1674
1675
1676
1677
1678
1679
1680

1681
1682
1683
1684
1685
1686
1687
Cincinnati
Cindy
Ciney
Ciotat
Circassie
Circé
Cirey-sur-Vezouze

Cisjordanie
Cîteaux
Citroën
City
Claire
Clamart
Clara







>







1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
Cincinnati
Cindy
Ciney
Ciotat
Circassie
Circé
Cirey-sur-Vezouze
Cisco
Cisjordanie
Cîteaux
Citroën
City
Claire
Clamart
Clara
2487
2488
2489
2490
2491
2492
2493

2494
2495
2496
2497
2498
2499
2500
Eure-et-Loir/L'D'
Euripide/L'D'Q'
Eurobaromètre/S*
Eurogroupe/L'
Euronext/L'D'Q'
Europe/L'D'
Europol/D'Q'

Eurozone/L'
Eurydice/L'D'Q'
Eusèbe/L'D'Q'
Euterpe/L'D'Q'
Eva/L'D'Q'
Éva/L'D'Q'
Évaine/L'D'Q'







>







2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
Eure-et-Loir/L'D'
Euripide/L'D'Q'
Eurobaromètre/S*
Eurogroupe/L'
Euronext/L'D'Q'
Europe/L'D'
Europol/D'Q'
Eurotunnel/L'D'Q'
Eurozone/L'
Eurydice/L'D'Q'
Eusèbe/L'D'Q'
Euterpe/L'D'Q'
Eva/L'D'Q'
Éva/L'D'Q'
Évaine/L'D'Q'
2597
2598
2599
2600
2601
2602
2603

2604
2605
2606
2607
2608
2609
2610
Fayard
Fayçal
Fayette
Fécamp
Fed
FedEx
Federer

Federico
Fehling
Feist
Feïza
Feldane
Felicia
Félicie







>







2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
Fayard
Fayçal
Fayette
Fécamp
Fed
FedEx
Federer
Federica
Federico
Fehling
Feist
Feïza
Feldane
Felicia
Félicie
3219
3220
3221
3222
3223
3224
3225

3226
3227
3228
3229
3230
3231
3232
Halluin/L'D'Q'
Ham/L'D'Q'
Hamas
Hambourg
Hamel
Hamid/L'D'Q'
Hamilton

Hamme
HammerFall
Hammourabi
Hamont-Achel/L'D'Q'
Hampshire
Ham-sur-Heure-Nalinnes/L'D'Q'
Hamza/L'D'Q'







>







3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
Halluin/L'D'Q'
Ham/L'D'Q'
Hamas
Hambourg
Hamel
Hamid/L'D'Q'
Hamilton
Hamlet/L'D'Q'
Hamme
HammerFall
Hammourabi
Hamont-Achel/L'D'Q'
Hampshire
Ham-sur-Heure-Nalinnes/L'D'Q'
Hamza/L'D'Q'
3465
3466
3467
3468
3469
3470
3471

3472
3473
3474
3475
3476
3477
3478
Howard
Hubble
Hubei
Hubert/L'D'Q'
Hubscher
Hudson/L'D'Q'
Huelgoat

Hugo/L'D'Q'
Hugo/L'D'Q'
Hugues/L'D'Q'
Huguette
Hulshout/L'D'Q'
Hume
Hun/S.







>







3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
Howard
Hubble
Hubei
Hubert/L'D'Q'
Hubscher
Hudson/L'D'Q'
Huelgoat
Hugh/L'D'Q'
Hugo/L'D'Q'
Hugo/L'D'Q'
Hugues/L'D'Q'
Huguette
Hulshout/L'D'Q'
Hume
Hun/S.
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
IMSI/L'D'Q'
INED/L'D'Q'
INPI/L'D'Q'
INRA/L'D'Q'
INRI/L'D'Q'
INRIA/L'D'Q'
INSA/L'D'Q'
INSERM/L'D'Q'
IP/L'D'Q'
IRA/L'
IRD/L'D'Q'
IRFM/L'D'Q'
IRL
IRM/L'D'Q'
IRSTEA/L'D'Q'







<







3529
3530
3531
3532
3533
3534
3535

3536
3537
3538
3539
3540
3541
3542
IMSI/L'D'Q'
INED/L'D'Q'
INPI/L'D'Q'
INRA/L'D'Q'
INRI/L'D'Q'
INRIA/L'D'Q'
INSA/L'D'Q'

IP/L'D'Q'
IRA/L'
IRD/L'D'Q'
IRFM/L'D'Q'
IRL
IRM/L'D'Q'
IRSTEA/L'D'Q'
3598
3599
3600
3601
3602
3603
3604

3605
3606
3607
3608
3609
3610
3611
Ingrid/L'D'Q'
Inkscape/L'D'Q'
Inn/L'D'
Inna/L'D'Q'
Innsmouth/L'D'Q'
Inovia/L'D'Q'
Insee/L'D'Q'

Insulinde/L'D'
Intel/L'D'Q'
Internet/D'Q'
Interpol/D'Q'
Io/L'D'Q'
Ionesco/L'D'Q'
Ioulia/L'D'Q'







>







3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
Ingrid/L'D'Q'
Inkscape/L'D'Q'
Inn/L'D'
Inna/L'D'Q'
Innsmouth/L'D'Q'
Inovia/L'D'Q'
Insee/L'D'Q'
Inserm/L'D'Q'
Insulinde/L'D'
Intel/L'D'Q'
Internet/D'Q'
Interpol/D'Q'
Io/L'D'Q'
Ionesco/L'D'Q'
Ioulia/L'D'Q'
4300
4301
4302
4303
4304
4305
4306

4307
4308
4309
4310
4311
4312
4313
Léonore
Léontine
Léopold
Léopoldine
Leopoldt
Léopoldville
Leroy

Lesbos
Lesieur
Lesley
Leslie
Lesneven
Lesotho
Lesse







>







4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
Léonore
Léontine
Léopold
Léopoldine
Leopoldt
Léopoldville
Leroy
Lesage
Lesbos
Lesieur
Lesley
Leslie
Lesneven
Lesotho
Lesse
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
Noisy-le-Grand
Noisy-le-Sec
Nokia
Nolan
Nolwenn
Nora
Norbert
Nord
Nord-Kivu
Nord-Pas-de-Calais
Nord-du-Québec
Nordine
Norfolk
Norique
Norma







<







5488
5489
5490
5491
5492
5493
5494

5495
5496
5497
5498
5499
5500
5501
Noisy-le-Grand
Noisy-le-Sec
Nokia
Nolan
Nolwenn
Nora
Norbert

Nord-Kivu
Nord-Pas-de-Calais
Nord-du-Québec
Nordine
Norfolk
Norique
Norma
6213
6214
6215
6216
6217
6218
6219

6220
6221
6222
6223
6224
6225
6226
Reidemeister
Reiko
Reims
Reiten
Relecq-Kerhuon
Rellich
Rembrandt

Rémi
Remich
Remire-Montjoly
Remus
Rémy
Renaix
Renan







>







6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
Reidemeister
Reiko
Reims
Reiten
Relecq-Kerhuon
Rellich
Rembrandt
Remi
Rémi
Remich
Remire-Montjoly
Remus
Rémy
Renaix
Renan
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
Rosita
Rosny-sous-Bois
Ross
Rossini
Rossinière
Rostand
Roswell
Roth
Roth
Rothbard
Rothschild
Rotin
Rotselaar
Rotterdam
Roubaix







<







6394
6395
6396
6397
6398
6399
6400

6401
6402
6403
6404
6405
6406
6407
Rosita
Rosny-sous-Bois
Ross
Rossini
Rossinière
Rostand
Roswell

Roth
Rothbard
Rothschild
Rotin
Rotselaar
Rotterdam
Roubaix
9094
9095
9096
9097
9098
9099
9100
9101
9102
9103
9104
9105

9106
9107
9108
9109
9110
9111
9112
additionnelle/F*
additionnellement/D'Q'
additionner/a4p+
additionneuse/F*
additive/F*
additivement/D'Q'
additivité/S*
addon/S*
adducteur/S*
adduction/S*
adduit/S*
adèle/S*

adelphophagie/S*
adénine/S*
adénite/S*
adénocarcinome/S*
adénogramme/S*
adénoïde/S*
adénoïdectomie/S*







|




>







9104
9105
9106
9107
9108
9109
9110
9111
9112
9113
9114
9115
9116
9117
9118
9119
9120
9121
9122
9123
additionnelle/F*
additionnellement/D'Q'
additionner/a4p+
additionneuse/F*
additive/F*
additivement/D'Q'
additivité/S*
add-on/S*
adducteur/S*
adduction/S*
adduit/S*
adèle/S*
adelphe/S*
adelphophagie/S*
adénine/S*
adénite/S*
adénocarcinome/S*
adénogramme/S*
adénoïde/S*
adénoïdectomie/S*
9791
9792
9793
9794
9795
9796
9797

9798
9799
9800
9801
9802
9803
9804
agroalimentaire/S*
agro-alimentaire/S*
agroalimentaire/S*
agro-alimentaire/S*
agrobiologie/S*
agrobiologique/S*
agrobiologiste/S*

agrocarburant/S*
agro-carburant/S*
agrochimie/S*
agrochimique/S*
agrochimiste/S*
agroclimatique/S*
agro-climatique/S*







>







9802
9803
9804
9805
9806
9807
9808
9809
9810
9811
9812
9813
9814
9815
9816
agroalimentaire/S*
agro-alimentaire/S*
agroalimentaire/S*
agro-alimentaire/S*
agrobiologie/S*
agrobiologique/S*
agrobiologiste/S*
agrobusiness/L'D'Q'
agrocarburant/S*
agro-carburant/S*
agrochimie/S*
agrochimique/S*
agrochimiste/S*
agroclimatique/S*
agro-climatique/S*
9940
9941
9942
9943
9944
9945
9946

9947
9948
9949
9950
9951
9952
9953
aillade/S*
ailler/a2p+
ailleurs/L'D'Q'
ailloli/S*
aimable/S*
aimablement/D'Q'
aimant/S*

aimantation/S*
aimante/F*
aimanter/a4p+
aimantin/S*
aimantine/F*
aimée/F*
aimer/a4p+







>







9952
9953
9954
9955
9956
9957
9958
9959
9960
9961
9962
9963
9964
9965
9966
aillade/S*
ailler/a2p+
ailleurs/L'D'Q'
ailloli/S*
aimable/S*
aimablement/D'Q'
aimant/S*
aimantable/S*
aimantation/S*
aimante/F*
aimanter/a4p+
aimantin/S*
aimantine/F*
aimée/F*
aimer/a4p+
10600
10601
10602
10603
10604
10605
10606
10607
10608
10609
10610
10611
10612
10613
10614
amathie/S*
amatir/f2p+
amatrice/F*
amaurose/S*
amazone/S*
amazonienne/F*
amazonite/S*
ambages/D'Q'
ambassade/S*
ambassadrice/F*
ambiance/S*
ambiancer/a1p.
ambianceuse/F*
ambiante/F*
ambidextre/S*







|







10613
10614
10615
10616
10617
10618
10619
10620
10621
10622
10623
10624
10625
10626
10627
amathie/S*
amatir/f2p+
amatrice/F*
amaurose/S*
amazone/S*
amazonienne/F*
amazonite/S*
ambage/S*
ambassade/S*
ambassadrice/F*
ambiance/S*
ambiancer/a1p.
ambianceuse/F*
ambiante/F*
ambidextre/S*
11471
11472
11473
11474
11475
11476
11477

11478
11479
11480
11481
11482
11483
11484
annuité/S*
annulabilité/S*
annulable/S*
annulaire/S*
annulation/S*
annulative/F*
annulatrice/F*

annuler/a4p+
annuus
anoblir/f4p+
anoblissante/F*
anoblissement/S*
anode/S*
anodine/F*







>







11484
11485
11486
11487
11488
11489
11490
11491
11492
11493
11494
11495
11496
11497
11498
annuité/S*
annulabilité/S*
annulable/S*
annulaire/S*
annulation/S*
annulative/F*
annulatrice/F*
annulement/S*
annuler/a4p+
annuus
anoblir/f4p+
anoblissante/F*
anoblissement/S*
anode/S*
anodine/F*
11818
11819
11820
11821
11822
11823
11824


11825
11826
11827
11828
11829
11830
11831
antienzyme/S*
anti-enzyme/S*
antiépileptique/S*
antiesclavagiste/S*
antiestrogène/S*
antiestrogène/S*
antiétatique/S*


antifading/S*
antifascisme/S*
antifasciste/S*
antiféminisme/S*
antiféministe/S*
antiferment/S*
antiferroélectricité/S*







>
>







11832
11833
11834
11835
11836
11837
11838
11839
11840
11841
11842
11843
11844
11845
11846
11847
antienzyme/S*
anti-enzyme/S*
antiépileptique/S*
antiesclavagiste/S*
antiestrogène/S*
antiestrogène/S*
antiétatique/S*
antiétatisme/S*
antifa/S*
antifading/S*
antifascisme/S*
antifasciste/S*
antiféminisme/S*
antiféministe/S*
antiferment/S*
antiferroélectricité/S*
12690
12691
12692
12693
12694
12695
12696

12697
12698
12699
12700
12701
12702
12703
arcade/S*
arcane/S*
arcanson/S*
arcasse/S*
arcature/S*
arc-boutant/L'D'Q'
arcboutant/S*

arcbouter/a4p+
arc-bouter/a4p+
arccos
arccosh
arccotan
arccotanh
arc-doubleau/L'D'Q'







>







12706
12707
12708
12709
12710
12711
12712
12713
12714
12715
12716
12717
12718
12719
12720
arcade/S*
arcane/S*
arcanson/S*
arcasse/S*
arcature/S*
arc-boutant/L'D'Q'
arcboutant/S*
arc-boutement
arcbouter/a4p+
arc-bouter/a4p+
arccos
arccosh
arccotan
arccotanh
arc-doubleau/L'D'Q'
12789
12790
12791
12792
12793
12794
12795

12796
12797
12798
12799
12800
12801
12802
archontat/S*
archonte/S*
archosaurien/S*
archure/S*
arçon/S*
arçonner/a2p+
arcs-boutants/D'Q'

arcs-doubleaux/D'Q'
arcs-en-ciel/D'Q'
arcsin
arcsinh
arctan
arctanh
arctique/S*







>







12806
12807
12808
12809
12810
12811
12812
12813
12814
12815
12816
12817
12818
12819
12820
archontat/S*
archonte/S*
archosaurien/S*
archure/S*
arçon/S*
arçonner/a2p+
arcs-boutants/D'Q'
arcs-boutements
arcs-doubleaux/D'Q'
arcs-en-ciel/D'Q'
arcsin
arcsinh
arctan
arctanh
arctique/S*
15840
15841
15842
15843
15844
15845
15846

15847
15848
15849
15850
15851
15852
15853
bernard-l'hermite
berne/S.
berner/a0p+
berneuse/F.
bernicle/S.
bernique
bernique/S.

berrichonne/F.
bersaglier/S.
berthon/S.
bertillonnage/S.
béryl/S.
bérylliose/S.
béryllium/S.







>







15858
15859
15860
15861
15862
15863
15864
15865
15866
15867
15868
15869
15870
15871
15872
bernard-l'hermite
berne/S.
berner/a0p+
berneuse/F.
bernicle/S.
bernique
bernique/S.
bernoise/F.
berrichonne/F.
bersaglier/S.
berthon/S.
bertillonnage/S.
béryl/S.
bérylliose/S.
béryllium/S.
18240
18241
18242
18243
18244
18245
18246

18247
18248
18249
18250
18251
18252
18253
bugne/S.
bugrane/S.
buguée/F.
build/S.
building/S.
buire/S.
buis

buisson/S.
buisson-ardent
buissonnante/F.
buissonnet/S.
buissonneuse/W.
buissonnière/F.
buissons-ardents







>







18259
18260
18261
18262
18263
18264
18265
18266
18267
18268
18269
18270
18271
18272
18273
bugne/S.
bugrane/S.
buguée/F.
build/S.
building/S.
buire/S.
buis
buissaie/S.
buisson/S.
buisson-ardent
buissonnante/F.
buissonnet/S.
buissonneuse/W.
buissonnière/F.
buissons-ardents
18614
18615
18616
18617
18618
18619
18620

18621
18622
18623
18624
18625
18626
18627
cadrer/a0p+
cadreuse/F.
cadriciel/S.
caduc/S.
caducée/S.
caducifoliée/F.
caducité/S.

caduque/S.
cæcale/W.
cæcotrophie/S.
cæcum/S.
caennaise/F.
cænogenèse/S.
cæsine







>







18634
18635
18636
18637
18638
18639
18640
18641
18642
18643
18644
18645
18646
18647
18648
cadrer/a0p+
cadreuse/F.
cadriciel/S.
caduc/S.
caducée/S.
caducifoliée/F.
caducité/S.
caduque/F.
caduque/S.
cæcale/W.
cæcotrophie/S.
cæcum/S.
caennaise/F.
cænogenèse/S.
cæsine
19021
19022
19023
19024
19025
19026
19027
19028
19029
19030
19031
19032
19033
19034
19035
19036
camping-car/S.
camping-caravaning/S.
camping-gaz
campinoise/F.
campo/S.
campus
camuse/F.
canada
canada/S.
canadianisme/S.
canadienne/F.
canado-américaine/F.
canaille/S.
canaillement
canaillerie/S.
canaillocratie/S.







|
|







19042
19043
19044
19045
19046
19047
19048
19049
19050
19051
19052
19053
19054
19055
19056
19057
camping-car/S.
camping-caravaning/S.
camping-gaz
campinoise/F.
campo/S.
campus
camuse/F.
canada/S.
canadair/S.
canadianisme/S.
canadienne/F.
canado-américaine/F.
canaille/S.
canaillement
canaillerie/S.
canaillocratie/S.
20043
20044
20045
20046
20047
20048
20049

20050
20051
20052
20053
20054
20055
20056
caucasique/S.
cauchemar/S.
cauchemarder/a0p.
cauchemardesque/S.
cauchemardeuse/W.
caucus
caudale/W.

caudataire/S.
caudataire/S.
caudillo/S.
caudine/S.
caudrette/S.
caulescente/F.
caulicole/S.







>







20064
20065
20066
20067
20068
20069
20070
20071
20072
20073
20074
20075
20076
20077
20078
caucasique/S.
cauchemar/S.
cauchemarder/a0p.
cauchemardesque/S.
cauchemardeuse/W.
caucus
caudale/W.
caudalie/S.
caudataire/S.
caudataire/S.
caudillo/S.
caudine/S.
caudrette/S.
caulescente/F.
caulicole/S.
24961
24962
24963
24964
24965
24966
24967

24968
24969
24970
24971
24972
24973
24974
corruptrice/F.
corsage/S.
corsaire/S.
corse/S.
corselet/S.
corser/a0p+
corset/S.

corseter/b0p+
corseterie/S.
corsetière/F.
corso/S.
cortège/S.
cortès
cortex







>







24983
24984
24985
24986
24987
24988
24989
24990
24991
24992
24993
24994
24995
24996
24997
corruptrice/F.
corsage/S.
corsaire/S.
corse/S.
corselet/S.
corser/a0p+
corset/S.
corsetage/S.
corseter/b0p+
corseterie/S.
corsetière/F.
corso/S.
cortège/S.
cortès
cortex
26567
26568
26569
26570
26571
26572
26573

26574
26575
26576
26577
26578
26579
26580
cytotoxique/S.
czar/S.
czardas
czimbalum/S.
d
d/||--
dB/||--

dacryoadénite/S.
dacryocystite/S.
dactyle/S.
dactylique/S.
dactylo/S.
dactylogramme/S.
dactylographe/S.







>







26590
26591
26592
26593
26594
26595
26596
26597
26598
26599
26600
26601
26602
26603
26604
cytotoxique/S.
czar/S.
czardas
czimbalum/S.
d
d/||--
dB/||--
daba/S.
dacryoadénite/S.
dacryocystite/S.
dactyle/S.
dactylique/S.
dactylo/S.
dactylogramme/S.
dactylographe/S.
28388
28389
28390
28391
28392
28393
28394

28395
28396
28397
28398
28399
28400
28401
dénombrabilité/S.
dénombrable/S.
dénombrement/S.
dénombrer/a0p+
dénominateur/S.
dénomination/S.
dénominative/F.

dénommer/a0p+
dénoncer/a0p+
dénonciation/S.
dénonciatrice/F.
dénotation/S.
dénotationnelle/F.
dénotative/F.







>







28412
28413
28414
28415
28416
28417
28418
28419
28420
28421
28422
28423
28424
28425
28426
dénombrabilité/S.
dénombrable/S.
dénombrement/S.
dénombrer/a0p+
dénominateur/S.
dénomination/S.
dénominative/F.
dénommable/S.
dénommer/a0p+
dénoncer/a0p+
dénonciation/S.
dénonciatrice/F.
dénotation/S.
dénotationnelle/F.
dénotative/F.
29201
29202
29203
29204
29205
29206
29207

29208
29209
29210
29211
29212
29213
29214
désincorporer/a0p+
désincrustation/S.
désincruster/a0p+
désinculper/a0p+
désindenter/a0p+
désindexation/S.
désindexer/a0p+

désindustrialisation/S.
désindustrialiser/a0p+
désinence/S.
désinentielle/F.
désinfectante/F.
désinfecter/a0p+
désinfection/S.







>







29226
29227
29228
29229
29230
29231
29232
29233
29234
29235
29236
29237
29238
29239
29240
désincorporer/a0p+
désincrustation/S.
désincruster/a0p+
désinculper/a0p+
désindenter/a0p+
désindexation/S.
désindexer/a0p+
désindividualiser/a0p+
désindustrialisation/S.
désindustrialiser/a0p+
désinence/S.
désinentielle/F.
désinfectante/F.
désinfecter/a0p+
désinfection/S.
29250
29251
29252
29253
29254
29255
29256

29257
29258
29259
29260
29261
29262
29263
désinviter/a0p+
désinvolte/S.
désinvoltement
désinvolture/S.
désir/S.
désirabilité/S.
désirable/S.

désirer/a0p+
désireuse/W.
désistement/S.
désister/a0p+
desman/S.
desmine/S.
desmodonte/S.







>







29276
29277
29278
29279
29280
29281
29282
29283
29284
29285
29286
29287
29288
29289
29290
désinviter/a0p+
désinvolte/S.
désinvoltement
désinvolture/S.
désir/S.
désirabilité/S.
désirable/S.
désirante/F.
désirer/a0p+
désireuse/W.
désistement/S.
désister/a0p+
desman/S.
desmine/S.
desmodonte/S.
29886
29887
29888
29889
29890
29891
29892

29893
29894
29895
29896
29897
29898
29899
diarrhée/S.
diarrhéique/S.
diarthrose/S.
diascope/S.
diascopie/S.
diascordium/S.
diaspora/S.

diastase/S.
diastasique/S.
diastème/S.
diastéréo-isomère/S.
diastole/S.
diastolique/S.
diastratique/S.







>







29913
29914
29915
29916
29917
29918
29919
29920
29921
29922
29923
29924
29925
29926
29927
diarrhée/S.
diarrhéique/S.
diarthrose/S.
diascope/S.
diascopie/S.
diascordium/S.
diaspora/S.
diasporique/S.
diastase/S.
diastasique/S.
diastème/S.
diastéréo-isomère/S.
diastole/S.
diastolique/S.
diastratique/S.
30621
30622
30623
30624
30625
30626
30627

30628
30629
30630
30631
30632
30633
30634
diversement
diverses
diversifiable/S.
diversification/S.
diversifier/a0p+
diversiforme/S.
diversion/S.

diversité/S.
diverticule/S.
diverticulite/S.
diverticulose/S.
divertimento/S.
divertir/f0p+
divertissante/F.







>







30649
30650
30651
30652
30653
30654
30655
30656
30657
30658
30659
30660
30661
30662
30663
diversement
diverses
diversifiable/S.
diversification/S.
diversifier/a0p+
diversiforme/S.
diversion/S.
diversitaire/S.
diversité/S.
diverticule/S.
diverticulite/S.
diverticulose/S.
divertimento/S.
divertir/f0p+
divertissante/F.
33289
33290
33291
33292
33293
33294
33295

33296
33297
33298
33299
33300
33301
33302
endoénergétique/S*
endogame/S*
endogamie/S*
endogamique/S*
endogée/F*
endogène/S*
endogénéité/S*

endolocalisation/S*
endolorir/f2p+
endolorissement/S*
endolymphe/S*
endomètre/S*
endométriose/S*
endométrite/S*







>







33318
33319
33320
33321
33322
33323
33324
33325
33326
33327
33328
33329
33330
33331
33332
endoénergétique/S*
endogame/S*
endogamie/S*
endogamique/S*
endogée/F*
endogène/S*
endogénéité/S*
endogroupe/S*
endolocalisation/S*
endolorir/f2p+
endolorissement/S*
endolymphe/S*
endomètre/S*
endométriose/S*
endométrite/S*
35133
35134
35135
35136
35137
35138
35139


35140
35141
35142
35143
35144
35145
35146
ethmoïdale/W*
ethmoïde/S*
ethmoïdite/S*
ethnarchie/S*
ethnarque/S*
ethnicisation/S*
ethniciser/a2p+


ethnicité/S*
ethnico-religieuse/W*
ethnie/S*
ethnique/S*
ethniquement/D'Q'
ethnobiologie/S*
ethnobotanique/S*







>
>







35163
35164
35165
35166
35167
35168
35169
35170
35171
35172
35173
35174
35175
35176
35177
35178
ethmoïdale/W*
ethmoïde/S*
ethmoïdite/S*
ethnarchie/S*
ethnarque/S*
ethnicisation/S*
ethniciser/a2p+
ethnicisme/S*
ethniciste/S*
ethnicité/S*
ethnico-religieuse/W*
ethnie/S*
ethnique/S*
ethniquement/D'Q'
ethnobiologie/S*
ethnobotanique/S*
35170
35171
35172
35173
35174
35175
35176

35177
35178
35179
35180
35181
35182
35183
ethnométhodologue/S*
ethnomusicologie/S*
ethnomusicologue/S*
ethnonyme/S*
ethnonymie/S*
ethnopsychiatrie/S*
ethnopsychologie/S*

ethnoreligieuse/W*
éthographie/S*
éthologie/S*
éthologique/S*
éthologiste/S*
éthologue/S*
ethos/L'D'Q'







>







35202
35203
35204
35205
35206
35207
35208
35209
35210
35211
35212
35213
35214
35215
35216
ethnométhodologue/S*
ethnomusicologie/S*
ethnomusicologue/S*
ethnonyme/S*
ethnonymie/S*
ethnopsychiatrie/S*
ethnopsychologie/S*
ethno-raciale/W*
ethnoreligieuse/W*
éthographie/S*
éthologie/S*
éthologique/S*
éthologiste/S*
éthologue/S*
ethos/L'D'Q'
35781
35782
35783
35784
35785
35786
35787

35788
35789
35790
35791
35792
35793
35794
exode/S*
exoderme/S*
exogame/S*
exogamie/S*
exogamique/S*
exogène/S*
exogénéité/S*

exomphale/S*
exon/S*
exondation/S*
exondement/S*
exonder/a3p+
exonération/S*
exonérer/c4p+







>







35814
35815
35816
35817
35818
35819
35820
35821
35822
35823
35824
35825
35826
35827
35828
exode/S*
exoderme/S*
exogame/S*
exogamie/S*
exogamique/S*
exogène/S*
exogénéité/S*
exogroupe/S*
exomphale/S*
exon/S*
exondation/S*
exondement/S*
exonder/a3p+
exonération/S*
exonérer/c4p+
35989
35990
35991
35992
35993
35994
35995


35996
35997
35998
35999
36000
36001
36002
extensionnelle/F*
extensité/S*
extensive/F*
extensivement/L'D'Q'
extensivité/S*
extenso
extensomètre/S*


exténuante/F*
exténuation/S*
exténuée/F*
exténuement/S*
exténuer/a4p+
extérieur/S*
extérieure/F*







>
>







36023
36024
36025
36026
36027
36028
36029
36030
36031
36032
36033
36034
36035
36036
36037
36038
extensionnelle/F*
extensité/S*
extensive/F*
extensivement/L'D'Q'
extensivité/S*
extenso
extensomètre/S*
extensométrie/S*
extensométrique/S*
exténuante/F*
exténuation/S*
exténuée/F*
exténuement/S*
exténuer/a4p+
extérieur/S*
extérieure/F*
37191
37192
37193
37194
37195
37196
37197

37198
37199
37200
37201
37202
37203
37204
filoselle/S.
filou/S.
filoutage/S.
filouter/a0p+
filouterie/S.
filovirus
fils

filtrable/S.
filtrage/S.
filtrante/F.
filtrat/S.
filtration/S.
filtre/S.
filtre-presse







>







37227
37228
37229
37230
37231
37232
37233
37234
37235
37236
37237
37238
37239
37240
37241
filoselle/S.
filou/S.
filoutage/S.
filouter/a0p+
filouterie/S.
filovirus
fils
filsdeputerie/S.
filtrable/S.
filtrage/S.
filtrante/F.
filtrat/S.
filtration/S.
filtre/S.
filtre-presse
38097
38098
38099
38100
38101
38102
38103

38104
38105
38106
38107
38108
38109
38110
foutou/S.
foutrale/F.
foutraque/S.
foutre/S.
foutre/tM
foutredieu
foutrement

foutriquet/S.
foutue/F.
fovéa/S.
fovéale/W.
fox
foxée/F.
fox-hound/S.







>







38134
38135
38136
38137
38138
38139
38140
38141
38142
38143
38144
38145
38146
38147
38148
foutou/S.
foutrale/F.
foutraque/S.
foutre/S.
foutre/tM
foutredieu
foutrement
foutrerie/S.
foutriquet/S.
foutue/F.
fovéa/S.
fovéale/W.
fox
foxée/F.
fox-hound/S.
41660
41661
41662
41663
41664
41665
41666


41667
41668
41669
41670
41671
41672
41673
haptonomie/S*
haptonomique/S*
haquebute/S.
haquenée/S.
haquet/S.
harakiri/S.
hara-kiri/S.


harangue/S.
haranguer/a0p+
harangueuse/F.
haras
harassante/F.
harassement/S.
harasser/a0p+







>
>







41698
41699
41700
41701
41702
41703
41704
41705
41706
41707
41708
41709
41710
41711
41712
41713
haptonomie/S*
haptonomique/S*
haquebute/S.
haquenée/S.
haquet/S.
harakiri/S.
hara-kiri/S.
haram
haram/S.
harangue/S.
haranguer/a0p+
harangueuse/F.
haras
harassante/F.
harassement/S.
harasser/a0p+
42977
42978
42979
42980
42981
42982
42983

42984
42985
42986
42987
42988
42989
42990

42991
42992
42993
42994
42995
42996
42997
hoyau/X.
hpz/||--
http/S=
huard/S.
huart/S.
hub/S.
hublot/S.

huche/S.
hucher/a0p+
huchet/S.
hue
huée/S.
huer/a0p+
huerta/S.

huguenote/F.
huilage/S*
huile/S*
huiler/a2p+
huilerie/S*
huileuse/W*
huilière/F*







>







>







43017
43018
43019
43020
43021
43022
43023
43024
43025
43026
43027
43028
43029
43030
43031
43032
43033
43034
43035
43036
43037
43038
43039
hoyau/X.
hpz/||--
http/S=
huard/S.
huart/S.
hub/S.
hublot/S.
hubris/L'D'Q'
huche/S.
hucher/a0p+
huchet/S.
hue
huée/S.
huer/a0p+
huerta/S.
hugolienne/F*
huguenote/F.
huilage/S*
huile/S*
huiler/a2p+
huilerie/S*
huileuse/W*
huilière/F*
43489
43490
43491
43492
43493
43494
43495


43496
43497
43498
43499
43500
43501
43502
hypertrophier/a4p+
hypertrophique/S*
hyperuricémie/S*
hypervariable/S*
hyperventilation/S*
hyperventiler/a1p.
hypervigilance/S*


hyperviscosité/S*
hyperviseur/S*
hypervitaminose/S*
hyphe/S*
hypholome/S*
hypnagogique/S*
hypnogramme/S*







>
>







43531
43532
43533
43534
43535
43536
43537
43538
43539
43540
43541
43542
43543
43544
43545
43546
hypertrophier/a4p+
hypertrophique/S*
hyperuricémie/S*
hypervariable/S*
hyperventilation/S*
hyperventiler/a1p.
hypervigilance/S*
hyperviolence/S*
hyperviolente/F*
hyperviscosité/S*
hyperviseur/S*
hypervitaminose/S*
hyphe/S*
hypholome/S*
hypnagogique/S*
hypnogramme/S*
43893
43894
43895
43896
43897
43898
43899

43900
43901
43902
43903
43904
43905
43906
illisibilité/S*
illisible/S*
illisiblement/D'Q'
illogique/S*
illogiquement/D'Q'
illogisme/S*
illuminante/F*

illumination/S*
illuminative/F*
illuminatrice/F*
illuminée/F*
illuminer/a4p+
illuminisme/S*
illusion/S*







>







43937
43938
43939
43940
43941
43942
43943
43944
43945
43946
43947
43948
43949
43950
43951
illisibilité/S*
illisible/S*
illisiblement/D'Q'
illogique/S*
illogiquement/D'Q'
illogisme/S*
illuminante/F*
illuminati/L'D'Q'
illumination/S*
illuminative/F*
illuminatrice/F*
illuminée/F*
illuminer/a4p+
illuminisme/S*
illusion/S*
44141
44142
44143
44144
44145
44146
44147

44148
44149
44150
44151
44152
44153
44154
imparisyllabique/S*
imparité/S*
impartageable/S*
impartiale/W*
impartialement/D'Q'
impartialité/S*
impartir/fC

impasse/S*
impassibilité/S*
impassible/S*
impassiblement/D'Q'
impatiemment/D'Q'
impatience/S*
impatiens/L'D'Q'







>







44186
44187
44188
44189
44190
44191
44192
44193
44194
44195
44196
44197
44198
44199
44200
imparisyllabique/S*
imparité/S*
impartageable/S*
impartiale/W*
impartialement/D'Q'
impartialité/S*
impartir/fC
impassable/S*
impasse/S*
impassibilité/S*
impassible/S*
impassiblement/D'Q'
impatiemment/D'Q'
impatience/S*
impatiens/L'D'Q'
47189
47190
47191
47192
47193
47194
47195

47196
47197
47198
47199
47200
47201
47202
jeuniste/S.
jeunotte/F.
jigger/S.
jihad/S.
jihadisme/S.
jihadiste/S.
jingle/S.

jiu-jitsu
jiujitsu/S.
joaillère/F.
joaillerie/S.
joaillière/F.
job/S.
job/S.







>







47235
47236
47237
47238
47239
47240
47241
47242
47243
47244
47245
47246
47247
47248
47249
jeuniste/S.
jeunotte/F.
jigger/S.
jihad/S.
jihadisme/S.
jihadiste/S.
jingle/S.
jinn/S.
jiu-jitsu
jiujitsu/S.
joaillère/F.
joaillerie/S.
joaillière/F.
job/S.
job/S.
47491
47492
47493
47494
47495
47496
47497

47498
47499
47500
47501
47502
47503
47504
kabic/S.
kabig/S.
kabuki/S.
kabyle/S.
kacha/S.
kachoube/S.
kaddish/S.

kafir/S.
kafkaïenne/F.
kaïnite/S.
kaiser/S.
kakapo/S.
kakatoès
kakawi/S.







>







47538
47539
47540
47541
47542
47543
47544
47545
47546
47547
47548
47549
47550
47551
47552
kabic/S.
kabig/S.
kabuki/S.
kabyle/S.
kacha/S.
kachoube/S.
kaddish/S.
kadi/S.
kafir/S.
kafkaïenne/F.
kaïnite/S.
kaiser/S.
kakapo/S.
kakatoès
kakawi/S.
47567
47568
47569
47570
47571
47572
47573

47574
47575
47576
47577
47578
47579
47580
karst/S.
karstification/S.
karstique/S.
karstologie/S.
kart/S.
karting/S.
kascher

kashrout
kat/U.||--
kata/S.
katakana
katakana/S.
katal/Um
katana/S.







>







47615
47616
47617
47618
47619
47620
47621
47622
47623
47624
47625
47626
47627
47628
47629
karst/S.
karstification/S.
karstique/S.
karstologie/S.
kart/S.
karting/S.
kascher
kasher
kashrout
kat/U.||--
kata/S.
katakana
katakana/S.
katal/Um
katana/S.
54170
54171
54172
54173
54174
54175
54176

54177
54178
54179
54180
54181
54182
54183
multidevise/S.
multidiffusion/S.
multidimensionnalité/S.
multidimensionnelle/F.
multidirectionnalité/S.
multidirectionnelle/F.
multidisciplinaire/S.

multiethnique/S.
multi-ethnique/S.
multifactorielle/F.
multifamiliale/W.
multifilaire/S.
multiflore/S.
multifonction/S.







>







54219
54220
54221
54222
54223
54224
54225
54226
54227
54228
54229
54230
54231
54232
54233
multidevise/S.
multidiffusion/S.
multidimensionnalité/S.
multidimensionnelle/F.
multidirectionnalité/S.
multidirectionnelle/F.
multidisciplinaire/S.
multidisciplinarité/S.
multiethnique/S.
multi-ethnique/S.
multifactorielle/F.
multifamiliale/W.
multifilaire/S.
multiflore/S.
multifonction/S.
56653
56654
56655
56656
56657
56658
56659
56660
56661
56662
56663
56664
56665
56666
56667
56668
oligoasthénotératospermie/S*
oligocène/S*
oligochète/S*
oligoclase/S*
oligodendrocyte/S*
oligodendrogliome/S*
oligoélément/S*
oligoélément/S*
oligo-élément/S*
oligo-élément/S*
oligogalacturonate/S*
oligo-galacturonate/S*
oligomère/S*
oligomérique/S*
oligomérisation/S*
oligonucléotide/S*







<
<







56703
56704
56705
56706
56707
56708
56709


56710
56711
56712
56713
56714
56715
56716
oligoasthénotératospermie/S*
oligocène/S*
oligochète/S*
oligoclase/S*
oligodendrocyte/S*
oligodendrogliome/S*
oligoélément/S*


oligo-élément/S*
oligogalacturonate/S*
oligo-galacturonate/S*
oligomère/S*
oligomérique/S*
oligomérisation/S*
oligonucléotide/S*
59760
59761
59762
59763
59764
59765
59766

59767
59768
59769
59770
59771
59772
59773
perceptiblement
perception/S.
perceptionnisme/S.
perceptionniste/S.
perceptive/F.
perceptrice/F.
perceptuelle/F.

percer/a0p+
percerette/S.
perceuse/F.
percevable/S.
percevoir/pK
perche/S.
percher/a0p+







>







59808
59809
59810
59811
59812
59813
59814
59815
59816
59817
59818
59819
59820
59821
59822
perceptiblement
perception/S.
perceptionnisme/S.
perceptionniste/S.
perceptive/F.
perceptrice/F.
perceptuelle/F.
perceptuellement
percer/a0p+
percerette/S.
perceuse/F.
percevable/S.
percevoir/pK
perche/S.
percher/a0p+
61518
61519
61520
61521
61522
61523
61524

61525
61526
61527
61528
61529
61530
61531
pizzaiolo/I.
pizzaïolo/S.
pizzeria/S.
pizzéria/S.
pizzicato/I.
placage/S.
placard/S.

placarder/a0p+
placardisation/S.
placardiser/a0p+
place/S.
placebo/S.
placébo/S.
placement/S.







>







61567
61568
61569
61570
61571
61572
61573
61574
61575
61576
61577
61578
61579
61580
61581
pizzaiolo/I.
pizzaïolo/S.
pizzeria/S.
pizzéria/S.
pizzicato/I.
placage/S.
placard/S.
placardage/S.
placarder/a0p+
placardisation/S.
placardiser/a0p+
place/S.
placebo/S.
placébo/S.
placement/S.
61766
61767
61768
61769
61770
61771
61772
61773
61774

61775
61776
61777
61778
61779
61780
61781
plâtrerie/S.
plâtreuse/W.
plâtrière/F.
plats-bords
plausibilité/S.
plausible/S.
plausiblement
play-back
playback/S.

playboy/S.
play-boy/S.
playlist/S.
play-list/S.
playon/S.
pléban/S.
plèbe/S.







<

>







61816
61817
61818
61819
61820
61821
61822

61823
61824
61825
61826
61827
61828
61829
61830
61831
plâtrerie/S.
plâtreuse/W.
plâtrière/F.
plats-bords
plausibilité/S.
plausible/S.
plausiblement

playback/S.
play-back/S.
playboy/S.
play-boy/S.
playlist/S.
play-list/S.
playon/S.
pléban/S.
plèbe/S.
61914
61915
61916
61917
61918
61919
61920

61921
61922
61923
61924
61925
61926
61927
ployage/S.
ployante/F.
ployer/a0p+
pluche/S.
plucher/a0p.
plucheuse/W.
plugin/S.

pluie/S.
plumage/S.
plumaison/S.
plumard/S.
plumasseau/X.
plumasserie/S.
plumassière/F.







>







61964
61965
61966
61967
61968
61969
61970
61971
61972
61973
61974
61975
61976
61977
61978
ployage/S.
ployante/F.
ployer/a0p+
pluche/S.
plucher/a0p.
plucheuse/W.
plugin/S.
plug-in/S.
pluie/S.
plumage/S.
plumaison/S.
plumard/S.
plumasseau/X.
plumasserie/S.
plumassière/F.
62336
62337
62338
62339
62340
62341
62342

62343
62344
62345
62346
62347
62348
62349
polychète/S.
polychlorobenzène/S.
polychlorure/S.
polychroïque/S.
polychroïsme/S.
polychrome/S.
polychromie/S.

polycistronique/S.
polyclinique/S.
polycondensat/S.
polycondensation/S.
polycopie/S.
polycopier/a0p+
polycourant







>







62387
62388
62389
62390
62391
62392
62393
62394
62395
62396
62397
62398
62399
62400
62401
polychète/S.
polychlorobenzène/S.
polychlorure/S.
polychroïque/S.
polychroïsme/S.
polychrome/S.
polychromie/S.
polychromique/S.
polycistronique/S.
polyclinique/S.
polycondensat/S.
polycondensation/S.
polycopie/S.
polycopier/a0p+
polycourant
62619
62620
62621
62622
62623
62624
62625

62626
62627
62628
62629
62630
62631
62632
popcorn/S.
pope/S.
popeline/S.
popinée/S.
poplitée/F.
popote/S.
popotin/S.

populace/S.
populacière/F.
populage/S.
populaire/S.
populairement
popularisation/S.
populariser/a0p+







>







62671
62672
62673
62674
62675
62676
62677
62678
62679
62680
62681
62682
62683
62684
62685
popcorn/S.
pope/S.
popeline/S.
popinée/S.
poplitée/F.
popote/S.
popotin/S.
popstar/S.
populace/S.
populacière/F.
populage/S.
populaire/S.
populairement
popularisation/S.
populariser/a0p+
63113
63114
63115
63116
63117
63118
63119
63120
63121
63122
63123
63124
63125
63126
63127
63128
poulaille/S.
poulailler/S.
poulaine/F.
poulamon/S.
poularde/S.
poulbot/S.
poule/S.
poulet/S.
poulette/S.
pouliage/S.
pouliche/S.
poulie/S.
pouliner/a0p.
poulinière/S.
poulinière/S.
pouliot/S.







<
|







63166
63167
63168
63169
63170
63171
63172

63173
63174
63175
63176
63177
63178
63179
63180
poulaille/S.
poulailler/S.
poulaine/F.
poulamon/S.
poularde/S.
poulbot/S.
poule/S.

poulette/F.
pouliage/S.
pouliche/S.
poulie/S.
pouliner/a0p.
poulinière/S.
poulinière/S.
pouliot/S.
64564
64565
64566
64567
64568
64569
64570

64571
64572
64573
64574
64575
64576
64577
protoplasme/S.
protoplasmique/S.
protoplaste/S.
protoptère/S.
protosulfure/S.
prototypage/S.
prototype/S.

prototypique/S.
prototypiste/S.
protoure/S.
protoxyde/S.
protozoaire/S.
protozoologie/S.
protractile/S.







>







64616
64617
64618
64619
64620
64621
64622
64623
64624
64625
64626
64627
64628
64629
64630
protoplasme/S.
protoplasmique/S.
protoplaste/S.
protoptère/S.
protosulfure/S.
prototypage/S.
prototype/S.
prototyper/a0p+
prototypique/S.
prototypiste/S.
protoure/S.
protoxyde/S.
protozoaire/S.
protozoologie/S.
protractile/S.
65100
65101
65102
65103
65104
65105
65106

65107
65108
65109
65110
65111
65112
65113
pusillanime/S.
pusillanimement
pusillanimité/S.
pustule/S.
pustuler/a0p+
pustuleuse/W.
putain/S.

putassière/F.
putative/F.
pute/S.
putier/S.
putiet/S.
putois
putréfaction/S.







>







65153
65154
65155
65156
65157
65158
65159
65160
65161
65162
65163
65164
65165
65166
65167
pusillanime/S.
pusillanimement
pusillanimité/S.
pustule/S.
pustuler/a0p+
pustuleuse/W.
putain/S.
putasserie/S.
putassière/F.
putative/F.
pute/S.
putier/S.
putiet/S.
putois
putréfaction/S.
70928
70929
70930
70931
70932
70933
70934

70935
70936
70937
70938
70939
70940
70941
sceau/X.
sceau-de-Salomon
sceaux-de-Salomon
scélérate/F.
scélératement
scélératesse/S.
scellage/S.

scellement/S.
sceller/a0p+
scénarimage/S.
scenario/I.
scénario/S.
scénarisation/S.
scénariser/a0p+







>







70982
70983
70984
70985
70986
70987
70988
70989
70990
70991
70992
70993
70994
70995
70996
sceau/X.
sceau-de-Salomon
sceaux-de-Salomon
scélérate/F.
scélératement
scélératesse/S.
scellage/S.
scellé/S.
scellement/S.
sceller/a0p+
scénarimage/S.
scenario/I.
scénario/S.
scénarisation/S.
scénariser/a0p+
71193
71194
71195
71196
71197
71198
71199

71200
71201
71202
71203
71204
71205
71206
scripturale/W.
scripturalisme/S.
scrofulaire/S.
scrofulariacée/S.
scrofule/S.
scrofuleuse/W.
scrogneugneu/X.

scrolling/S.
scrotale/W.
scrotum/S.
scrub/S.
scrubber/S.
scrupule/S.
scrupuleuse/W.







>







71248
71249
71250
71251
71252
71253
71254
71255
71256
71257
71258
71259
71260
71261
71262
scripturale/W.
scripturalisme/S.
scrofulaire/S.
scrofulariacée/S.
scrofule/S.
scrofuleuse/W.
scrogneugneu/X.
scroller/a0p.
scrolling/S.
scrotale/W.
scrotum/S.
scrub/S.
scrubber/S.
scrupule/S.
scrupuleuse/W.
75602
75603
75604
75605
75606
75607
75608

75609
75610
75611
75612
75613
75614
75615
syrah/S.
syriaque/S.
syriaque/S.
syrienne/F.
syringe/S.
syringomyélie/S.
syrinx

syrphe/S.
sysadmin/S.
systématicienne/F.
systématicité/S.
systématique/S.
systématique/S.
systématiquement







>







75658
75659
75660
75661
75662
75663
75664
75665
75666
75667
75668
75669
75670
75671
75672
syrah/S.
syriaque/S.
syriaque/S.
syrienne/F.
syringe/S.
syringomyélie/S.
syrinx
syro-libanaise/F.
syrphe/S.
sysadmin/S.
systématicienne/F.
systématicité/S.
systématique/S.
systématique/S.
systématiquement
75809
75810
75811
75812
75813
75814
75815

75816
75817
75818
75819
75820
75821
75822
talent/S.
talentueuse/W.
talentueusement
taler/a0p+
taleth/S.
taliatelle/S.
talibane/F.

talion/S.
talisman/S.
talismanique/S.
talith/S.
talitre/S.
talkies-walkies
talkie-walkie







>







75866
75867
75868
75869
75870
75871
75872
75873
75874
75875
75876
75877
75878
75879
75880
talent/S.
talentueuse/W.
talentueusement
taler/a0p+
taleth/S.
taliatelle/S.
talibane/F.
talibée/F.
talion/S.
talisman/S.
talismanique/S.
talith/S.
talitre/S.
talkies-walkies
talkie-walkie
78516
78517
78518
78519
78520
78521
78522

78523
78524
78525
78526
78527
78528
78529
trantran/S.
trapèze/S.
trapéziste/S.
trapézoèdre/S.
trapézoïdale/W.
trapézoïde/S.
trappe/S.

trappeuse/F.
trappillon/S.
trappiste/S.
trappistine/S.
trapue/F.
traque/S.
traquée/F.







>







78574
78575
78576
78577
78578
78579
78580
78581
78582
78583
78584
78585
78586
78587
78588
trantran/S.
trapèze/S.
trapéziste/S.
trapézoèdre/S.
trapézoïdale/W.
trapézoïde/S.
trappe/S.
trapper/a0p+
trappeuse/F.
trappillon/S.
trappiste/S.
trappistine/S.
trapue/F.
traque/S.
traquée/F.
80941
80942
80943
80944
80945
80946
80947

80948
80949
80950
80951
80952
80953
80954
vibrato/S.
vibratoire/S.
vibrer/a0p+
vibreur/S.
vibrion/S.
vibrionner/a0p.
vibrisse/S.

vibromasseur/S.
vicaire/S.
vicariale/W.
vicariance/S.
vicariante/F.
vicariat/S.
vice/S.







>







81000
81001
81002
81003
81004
81005
81006
81007
81008
81009
81010
81011
81012
81013
81014
vibrato/S.
vibratoire/S.
vibrer/a0p+
vibreur/S.
vibrion/S.
vibrionner/a0p.
vibrisse/S.
vibro/S.
vibromasseur/S.
vicaire/S.
vicariale/W.
vicariance/S.
vicariante/F.
vicariat/S.
vice/S.

Modified gc_lang/fr/oxt/TextFormatter/TextFormatter.py from [32ab9b6099] to [6fb58f6672].

11
12
13
14
15
16
17

18
19
20
21
22
23
24
import time

if sys.version_info.major == 3:
    import imp

import tf_strings
import tf_options

import helpers


from com.sun.star.task import XJobExecutor
from com.sun.star.awt import XActionListener









>







11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import time

if sys.version_info.major == 3:
    import imp

import tf_strings
import tf_options
import tf_tabrep
import helpers


from com.sun.star.task import XJobExecutor
from com.sun.star.awt import XActionListener


421
422
423
424
425
426
427

428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523

524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601

602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
            # change pointer
            xPointer = self.ctx.ServiceManager.createInstanceWithContext("com.sun.star.awt.Pointer", self.ctx)
            xPointer.setType(uno.getConstantByName("com.sun.star.awt.SystemPointer.WAIT"))
            xWindowPeer = self.xContainer.getPeer()
            xWindowPeer.setPointer(xPointer)
            for x in xWindowPeer.Windows:
                x.setPointer(xPointer)

            # NOTE: A LOT OF REGEX COULD BE MERGED IF ICU ENGINE WAS NOT SO BUGGY
            # "([;?!…])(?=[:alnum:])" => "$1 " doesn’t work properly
            # "(?<=[:alnum:])([;?!…])" => " $1 " doesn’t work properly
            self.pbar.ProgressValue = 0
            # Restructuration
            if self.struct.State:
                if self.struct1.State:
                    n = self._replaceText(xElem, "\\n", "\\n", True) # end of line => end of paragraph
                    self.struct1_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.struct2.State:
                    n = self._replaceText(xElem, "([:alpha:])- *\n([:alpha:])", "$1$2", True)  # EOL
                    n += self._replaceHyphenAtEndOfParagraphs(xElem) # EOP
                    self.struct2_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.struct3.State:
                    n = self._mergeContiguousParagraphs(xElem)
                    self.struct3_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                self.struct.State = False
                self._switchCheckBox(self.struct)
            self.pbar.ProgressValue = 3
            # espaces surnuméraires
            if self.ssp.State:
                if self.ssp3.State:
                    n = self._replaceText(xElem, "[  ]+$", "", True)
                    self.ssp3_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.ssp2.State:
                    n = self._replaceText(xElem, "  ", " ", False) # espace + espace insécable -> espace
                    n += self._replaceText(xElem, "  ", " ", False) # espace insécable + espace -> espace
                    n += self._replaceText(xElem, "  +", " ", True) # espaces surnuméraires
                    n += self._replaceText(xElem, "  +", " ", True) # espaces insécables surnuméraires
                    self.ssp2_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.ssp1.State:
                    n = self._replaceText(xElem, "^[  ]+", "", True)
                    self.ssp1_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.ssp4.State:
                    n = self._replaceText(xElem, " +(?=[.,…])", "", True)
                    self.ssp4_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.ssp5.State:
                    n = self._replaceText(xElem, "\\([  ]+", "(", True)
                    n += self._replaceText(xElem, "[  ]+\\)", ")", True)
                    self.ssp5_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.ssp6.State:
                    n = self._replaceText(xElem, "\\[[  ]+", "[", True)
                    n += self._replaceText(xElem, "[  ]+\\]", "]", True)
                    self.ssp6_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.ssp7.State:
                    n = self._replaceText(xElem, "“[  ]+", "“", True)
                    n += self._replaceText(xElem, "[  ]”", "”", True)
                    self.ssp7_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                self.ssp.State = False
                self._switchCheckBox(self.ssp)
            self.pbar.ProgressValue = 10
            # espaces typographiques
            if self.nbsp.State:
                if self.nbsp1.State:
                    if self.nnbsp1.State:
                        # espaces insécables fines
                        n = self._replaceText(xElem, "(?<=[:alnum:]);", " ;", True)
                        n += self._replaceText(xElem, "(?<=[:alnum:])[?][   ]", " ? ", True)
                        n += self._replaceText(xElem, "(?<=[:alnum:])[?]$", " ?", True)
                        n += self._replaceText(xElem, "(?<=[:alnum:])!", " !", True)
                        n += self._replaceText(xElem, "(?<=[]…)»}]);", " ;", True)
                        n += self._replaceText(xElem, "(?<=[]…)»}])[?][   ]", " ? ", True)
                        n += self._replaceText(xElem, "(?<=[]…)»}])[?]$", " ?", True)
                        n += self._replaceText(xElem, "(?<=[]…)»}])!", " !", True)
                        n += self._replaceText(xElem, "[  ]+([;?!])", " $1", True)
                        n += self._replaceText(xElem, "(?<=[:alnum:]):[   ]", " : ", True)
                        n += self._replaceText(xElem, "(?<=[:alnum:]):$", " :", True)
                        n += self._replaceText(xElem, "(?<=[]…)»}]):", " :", True)
                        n += self._replaceText(xElem, "[  ]+:", " :", True)
                    else:
                        # espaces insécables
                        n = self._replaceText(xElem, "(?<=[:alnum:]):[   ]", " : ", True)
                        n += self._replaceText(xElem, "(?<=[:alnum:]):$", " :", True)
                        n += self._replaceText(xElem, "(?<=[:alnum:]);", " ;", True)
                        n += self._replaceText(xElem, "(?<=[:alnum:])[?][   ]", " ? ", True)
                        n += self._replaceText(xElem, "(?<=[:alnum:])[?]$", " ?", True)
                        n += self._replaceText(xElem, "(?<=[:alnum:])!", " !", True)
                        n += self._replaceText(xElem, "(?<=[]…)»}]):", " :", True)
                        n += self._replaceText(xElem, "(?<=[]…)»}]);", " ;", True)
                        n += self._replaceText(xElem, "(?<=[]…)»}])[?][   ]", " ? ", True)
                        n += self._replaceText(xElem, "(?<=[]…)»}])[?]$", " ?", True)
                        n += self._replaceText(xElem, "(?<=[]…)»}])!", " !", True)
                        n += self._replaceText(xElem, "[  ]+([:;?!])", " $1", True)
                    n -= self._replaceText(xElem, "([[(])[   ]([!?:;])", "$1$2", True)
                    n -= self._replaceText(xElem, "(?<=http)[   ]://", "://", True)
                    n -= self._replaceText(xElem, "(?<=https)[   ]://", "://", True)

                    n -= self._replaceText(xElem, "(?<=ftp)[   ]://", "://", True)
                    n -= self._replaceText(xElem, "(?<=&)amp[   ];", "amp;", True)          # ICU: & is $0 in replacement field
                    n -= self._replaceText(xElem, "(?<=&)nbsp[   ];", "nbsp;", True)        # ICU: & is $0 in replacement field
                    n -= self._replaceText(xElem, "(?<=&)lt[   ];", "lt;", True)            # ICU: & is $0 in replacement field
                    n -= self._replaceText(xElem, "(?<=&)gt[   ];", "gt;", True)            # ICU: & is $0 in replacement field
                    n -= self._replaceText(xElem, "(?<=&)apos[   ];", "apos;", True)        # ICU: & is $0 in replacement field
                    n -= self._replaceText(xElem, "(?<=&)quot[   ];", "quot;", True)        # ICU: & is $0 in replacement field
                    n -= self._replaceText(xElem, "(?<=&)thinsp[   ];", "thinsp;", True)    # ICU: & is $0 in replacement field
                    self.nbsp1_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.nbsp2.State:
                    if self.nnbsp2.State:
                        # espaces insécables fines
                        n = self._replaceText(xElem, "«(?=[:alnum:])", "« ", True)
                        n += self._replaceText(xElem, "«[  ]+", "« ", True)
                        n += self._replaceText(xElem, "(?<=[:alnum:]|[.!?])»", " »", True)
                        n += self._replaceText(xElem, "[  ]+»", " »", True)
                    else:
                        # espaces insécables
                        n = self._replaceText(xElem, "«(?=[:alnum:])", "« ", True)
                        n += self._replaceText(xElem, "«[  ]+", "« ", True)
                        n += self._replaceText(xElem, "(?<=[:alnum:]|[.!?])»", " »", True)
                        n += self._replaceText(xElem, "[  ]+»", " »", True)
                    self.nbsp2_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.nbsp3.State:
                    n = self._replaceText(xElem, "([:digit:])([%‰€$£¥˚℃])", "$1 $2", True)
                    n += self._replaceText(xElem, "([:digit:]) ([%‰€$£¥˚℃])", "$1 $2", True)
                    self.nbsp3_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.nbsp4.State:
                    if self.nnbsp4.State:
                        # espaces insécables fines
                        n = self._replaceText(xElem, "([:digit:])[  ]([:digit:])", "$1 $2", True)
                    else:
                        # espaces insécables
                        n = self._replaceText(xElem, "([:digit:])[  ]([:digit:])", "$1 $2", True)
                    self.nbsp4_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.nbsp5.State:
                    n = self._replaceText(xElem, "(?<=[0-9⁰¹²³⁴⁵⁶⁷⁸⁹]) ?([kcmµnd]?(?:[slgJKΩΩℓ]|m[²³]?|Wh?|Hz|dB)|[%‰]|°C)\\b", " $1", True, True)
                    self.nbsp5_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if False:
                    n = self._replaceText(xElem, "\\b(MM?\\.|Mlle|Mgr) ", "$1 ", True)
                    self.nbsp3_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                self.nbsp.State = False
                self._switchCheckBox(self.nbsp)
            self.pbar.ProgressValue = 15
            # espaces manquants
            if self.typo.State:
                if self.typo6.State:
                    n = self._replaceText(xElem, "\\bN\\.([ms])\\b", "N·$1", True, True) # N·m et N·m-1, N·s
                    n += self._replaceText(xElem, "\\bW\\.h\\b", "W·h", True, True)
                    n += self._replaceText(xElem, "\\bPa\\.s\\b", "Pa·s", True, True)
                    n += self._replaceText(xElem, "\\bA\\.h\\b", "A·h", True, True)
                    n += self._replaceText(xElem, "\\bΩ\\.m\\b", "Ω·m", True, True)
                    n += self._replaceText(xElem, "\\bS\\.m\\b", "S·m", True, True)
                    n += self._replaceText(xElem, "\\bg\\.s(?=-1)\\b", "g·s", True, True)
                    n += self._replaceText(xElem, "\\bm\\.s(?=-[12])\\b", "m·s", True, True)
                    n += self._replaceText(xElem, "\\bg\\.m(?=2|-3)\\b", "g·m", True, True)
                    n += self._replaceText(xElem, "\\bA\\.m(?=-1)\\b", "A·m", True, True)
                    n += self._replaceText(xElem, "\\bJ\\.K(?=-1)\\b", "J·K", True, True)
                    n += self._replaceText(xElem, "\\bW\\.m(?=-2)\\b", "W·m", True, True)
                    n += self._replaceText(xElem, "\\bcd\\.m(?=-2)\\b", "cd·m", True, True)
                    n += self._replaceText(xElem, "\\bC\\.kg(?=-1)\\b", "C·kg", True, True)
                    n += self._replaceText(xElem, "\\bH\\.m(?=-1)\\b", "H·m", True, True)
                    n += self._replaceText(xElem, "\\bJ\\.kg(?=-1)\\b", "J·kg", True, True)
                    n += self._replaceText(xElem, "\\bJ\\.m(?=-3)\\b", "J·m", True, True)
                    n += self._replaceText(xElem, "\\bm[2²]\\.s\\b", "m²·s", True, True)
                    n += self._replaceText(xElem, "\\bm[3³]\\.s(?=-1)\\b", "m³·s", True, True)
                    #n += self._replaceText(xElem, "\\bJ.kg-1.K-1\\b", "J·kg-1·K-1", True, True)
                    #n += self._replaceText(xElem, "\\bW.m-1.K-1\\b", "W·m-1·K-1", True, True)
                    #n += self._replaceText(xElem, "\\bW.m-2.K-1\\b", "W·m-2·K-1", True, True)
                    n += self._replaceText(xElem, "\\b(Y|Z|E|P|T|G|M|k|h|da|d|c|m|µ|n|p|f|a|z|y)Ω\\b", "$1Ω", True, True)
                    self.typo6_res.Label = str(n)
                    self.pbar.ProgressValue += 1

            if self.space.State:
                if self.space1.State:
                    n = self._replaceText(xElem, ";(?=[:alnum:])", "; ", True)
                    n += self._replaceText(xElem, "\\?(?=[A-ZÉÈÊÂÀÎ])", "? ", True)
                    n += self._replaceText(xElem, "!(?=[:alnum:])", "! ", True)
                    n += self._replaceText(xElem, "…(?=[:alnum:])", "… ", True)
                    n += self._replaceText(xElem, "\\.(?=[A-ZÉÈÎ][:alpha:])", ". ", True, True)
                    n += self._replaceText(xElem, "\\.(?=À)", ". ", True, True)
                    n += self._replaceText(xElem, ",(?=[:alpha:])", ", ", True)
                    n += self._replaceText(xElem, "([:alpha:]),([0-9])", "$1, $2", True)
                    n += self._replaceText(xElem, ":(?=[:alpha:])", ": ", True)
                    # exceptions:
                    n -= self._replaceText(xElem, "(?<=DnT), w\\b", ",w", True, True)
                    n -= self._replaceText(xElem, "(?<=DnT), A\\b", ",A", True, True)
                    self.space1_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.space2.State:
                    n = self._replaceText(xElem, " -(?=[:alpha:]|[\"«“'‘])", " - ", True)
                    n += self._replaceText(xElem, " –(?=[:alpha:]|[\"«“'‘])", " – ", True) # demi-cadratin
                    n += self._replaceText(xElem, " —(?=[:alpha:]|[\"«“'‘])", " — ", True) # cadratin
                    n += self._replaceText(xElem, "(?<=[:alpha:])– ", " – ", True)
                    n += self._replaceText(xElem, "(?<=[:alpha:])— ", " — ", True)
                    n += self._replaceText(xElem, "(?<=[:alpha:])- ", " - ", True)
                    n += self._replaceText(xElem, "(?<=[\"»”'’])– ", " – ", True)
                    n += self._replaceText(xElem, "(?<=[\"»”'’])— ", " — ", True)
                    n += self._replaceText(xElem, "(?<=[\"»”'’])- ", " - ", True)
                    self.space2_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                self.space.State = False
                self._switchCheckBox(self.space)
            self.pbar.ProgressValue = 17
            # Suppression
            if self.delete.State:
                if self.delete1.State:
                    n = self._replaceText(xElem, "­", "", False) # tiret conditionnel / soft hyphen
                    self.delete1_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.delete2.State:
                    n = self._replaceBulletsByEmDash(xElem)
                    self.delete2_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                self.delete.State = False
                self._switchCheckBox(self.delete)
            self.pbar.ProgressValue = 20
            # signes typographiques
            if self.typo.State:
                if self.typo1.State:
                    n = self._replaceText(xElem, "\\bl['´‘′`](?=[:alnum:])", "l’", True, True)
                    n += self._replaceText(xElem, "\\bj['´‘′`](?=[:alnum:])", "j’", True, True)
                    n += self._replaceText(xElem, "\\bm['´‘′`](?=[:alnum:])", "m’", True, True)
                    n += self._replaceText(xElem, "\\bt['´‘′`](?=[:alnum:])", "t’", True, True)
                    n += self._replaceText(xElem, "\\bs['´‘′`](?=[:alnum:])", "s’", True, True)
                    n += self._replaceText(xElem, "\\bc['´‘′`](?=[:alnum:])", "c’", True, True)
                    n += self._replaceText(xElem, "\\bd['´‘′`](?=[:alnum:])", "d’", True, True)
                    n += self._replaceText(xElem, "\\bn['´‘′`](?=[:alnum:])", "n’", True, True)
                    n += self._replaceText(xElem, "\\bç['´‘′`](?=[:alnum:])", "ç’", True, True)
                    n += self._replaceText(xElem, "\\bL['´‘′`](?=[:alnum:])", "L’", True, True)
                    n += self._replaceText(xElem, "\\bJ['´‘′`](?=[:alnum:])", "J’", True, True)
                    n += self._replaceText(xElem, "\\bM['´‘′`](?=[:alnum:])", "M’", True, True)
                    n += self._replaceText(xElem, "\\bT['´‘′`](?=[:alnum:])", "T’", True, True)
                    n += self._replaceText(xElem, "\\bS['´‘′`](?=[:alnum:])", "S’", True, True)
                    n += self._replaceText(xElem, "\\bC['´‘′`](?=[:alnum:])", "C’", True, True)
                    n += self._replaceText(xElem, "\\bD['´‘′`](?=[:alnum:])", "D’", True, True)
                    n += self._replaceText(xElem, "\\bN['´‘′`](?=[:alnum:])", "N’", True, True)
                    n += self._replaceText(xElem, "\\bÇ['´‘′`](?=[:alnum:])", "Ç’", True, True)
                    n += self._replaceText(xElem, "(qu|jusqu|lorsqu|puisqu|quoiqu|quelqu|presqu|entr|aujourd|prud)['´‘′`]", "$1’", True)
                    self.typo1_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.typo2.State:
                    n = self._replaceText(xElem, "...", "…", False)
                    n += self._replaceText(xElem, "(?<=…)[.][.]", "…", True)
                    n += self._replaceText(xElem, "…[.](?![.])", "…", True)
                    self.typo2_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.typo3.State:
                    if self.typo3b.State:
                        # demi-cadratin
                        n = self._replaceText(xElem, " - ", " – ", False)
                        n += self._replaceText(xElem, " — ", " – ", False)
                        n += self._replaceText(xElem, " -,", " –,", False)
                        n += self._replaceText(xElem, " —,", " –,", False)
                    else:
                        # cadratin
                        n = self._replaceText(xElem, " - ", " — ", False)
                        n += self._replaceText(xElem, " – ", " — ", False)
                        n += self._replaceText(xElem, " -,", " —,", False)
                        n += self._replaceText(xElem, " –,", " —,", False)
                    self.typo3_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.typo4.State:
                    if self.typo4a.State:
                        # cadratin
                        n = self._replaceText(xElem, "^-[  ]", "— ", True)
                        n += self._replaceText(xElem, "^–[  ]", "— ", True)
                        n += self._replaceText(xElem, "^— ", "— ", True)
                        n += self._replaceText(xElem, "^«[  ][—–-][  ]", "« — ", True)
                        n += self._replaceText(xElem, "^[-–—](?=[:alnum:])", "— ", True)
                    else:
                        # demi-cadratin
                        n = self._replaceText(xElem, "^-[  ]", "– ", True)
                        n += self._replaceText(xElem, "^—[  ]", "– ", True)
                        n += self._replaceText(xElem, "^– ", "– ", True)
                        n += self._replaceText(xElem, "^[-–—](?=[:alnum:])", "– ", True)
                    self.typo4_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.typo5.State:
                    n = self._replaceText(xElem, '"([:alpha:]+)"', "“$1”", True)
                    n += self._replaceText(xElem, "''([:alpha:]+)''", "“$1”", True)
                    n += self._replaceText(xElem, "'([:alpha:]+)'", "“$1”", True)
                    n += self._replaceText(xElem, '^"(?=[:alnum:])', "« ", True)
                    n += self._replaceText(xElem, "^''(?=[:alnum:])", "« ", True)
                    n += self._replaceText(xElem, ' "(?=[:alnum:])', " « ", True)
                    n += self._replaceText(xElem, " ''(?=[:alnum:])", " « ", True)
                    n += self._replaceText(xElem, '\\("(?=[:alnum:])', "(« ", True)
                    n += self._replaceText(xElem, "\\(''(?=[:alnum:])", "(« ", True)
                    n += self._replaceText(xElem, '(?<=[:alnum:])"$', " »", True)
                    n += self._replaceText(xElem, "(?<=[:alnum:])''$", " »", True)
                    n += self._replaceText(xElem, '(?<=[:alnum:])"(?=[] ,.:;?!…)])', " »", True)
                    n += self._replaceText(xElem, "(?<=[:alnum:])''(?=[] ,.:;?!…)])", " »", True)
                    n += self._replaceText(xElem, '(?<=[.!?…])" ', " » ", True)
                    n += self._replaceText(xElem, '(?<=[.!?…])"$', " »", True)
                    self.typo5_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.typo7.State:
                    # ligatures: no initial cap
                    n = self._replaceText(xElem, "coeur", "cœur", False, True)
                    n += self._replaceText(xElem, "coel([aeio])", "cœl$1", True, True)
                    n += self._replaceText(xElem, "choeur", "chœur", False, True)
                    n += self._replaceText(xElem, "foet", "fœt", False, True)
                    n += self._replaceText(xElem, "oeil", "œil", False, True)
                    n += self._replaceText(xElem, "oeno", "œno", False, True)
                    n += self._replaceText(xElem, "oesoph", "œsoph", False, True)
                    n += self._replaceText(xElem, "oestro", "œstro", False, True)
                    n += self._replaceText(xElem, "oeuf", "œuf", False, True)
                    n += self._replaceText(xElem, "oeuvr", "œuvr", False, True)
                    n += self._replaceText(xElem, "moeur", "mœur", False, True)
                    n += self._replaceText(xElem, "noeu", "nœu", False, True)
                    n += self._replaceText(xElem, "soeur", "sœur", False, True)
                    n += self._replaceText(xElem, "voeu", "vœu", False, True)
                    n += self._replaceText(xElem, "aequo", "æquo", False, True)
                    # ligatures: with initial cap
                    n += self._replaceText(xElem, "Coeur", "Cœur", False, True)
                    n += self._replaceText(xElem, "Coel([aeio])", "Cœl$1", True, True)
                    n += self._replaceText(xElem, "Choeur", "Chœur", False, True)
                    n += self._replaceText(xElem, "Foet", "Fœt", False, True)
                    n += self._replaceText(xElem, "Oeil", "Œil", False, True)
                    n += self._replaceText(xElem, "Oeno", "Œno", False, True)
                    n += self._replaceText(xElem, "Oesoph", "Œsoph", False, True)
                    n += self._replaceText(xElem, "Oestro", "Œstro", False, True)
                    n += self._replaceText(xElem, "Oeuf", "Œuf", False, True)
                    n += self._replaceText(xElem, "Oeuvr", "Œuvr", False, True)
                    n += self._replaceText(xElem, "Moeur", "Mœur", False, True)
                    n += self._replaceText(xElem, "Noeu", "Nœu", False, True)
                    n += self._replaceText(xElem, "Soeur", "Sœur", False, True)
                    n += self._replaceText(xElem, "Voeu", "Vœu", False, True)
                    n += self._replaceText(xElem, "Aequo", "Æquo", False, True)
                    # common words with missing diacritics
                    n += self._replaceText(xElem, "\\bCa\\b", "Ça", True, True)
                    n += self._replaceText(xElem, " ca\\b", " ça", True, True)
                    n += self._replaceText(xElem, "\\bdej[aà]\\b", "déjà", True, True)
                    n += self._replaceText(xElem, "\\bDej[aà]\\b", "Déjà", True, True)
                    n += self._replaceText(xElem, "\\bplutot\\b", "plutôt", True, True)
                    n += self._replaceText(xElem, "\\bPlutot\\b", "Plutôt", True, True)
                    n += self._replaceText(xElem, "\\b([cC]e(?:ux|lles?|lui))-la\\b", "$1-là", True, True)
                    n += self._replaceText(xElem, "\\bmalgre\\b", "malgré", True, True)
                    n += self._replaceText(xElem, "\\bMalgre\\b", "Malgré", True, True)
                    n += self._replaceText(xElem, "\\betre\\b", "être", True, True)
                    n += self._replaceText(xElem, "\\bEtre\\b", "Être", True, True)
                    n += self._replaceText(xElem, "\\btres\\b", "très", True, True)
                    n += self._replaceText(xElem, "\\bTres\\b", "Très", True, True)
                    n += self._replaceText(xElem, "\\bEtai([ts]|ent)\\b", "Étai$1", True, True)
                    n += self._replaceText(xElem, "\\bE(tat|cole|crit|poque|tude|ducation|glise|conomi(?:qu|)e|videmment|lysée|tienne|thiopie|cosse|gypt(?:e|ien)|rythrée|pinal|vreux)", "É$1", True, True)
                    self.typo7_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.typo8.State:
                    # ligatures typographiques : fi, fl, ff, ffi, ffl, ft, st
                    n = 0
                    if self.typo8a.State:
                        if self.typo_ffi.State:







>







|



|













|



|
<
<
<



|



|



|
<



|
<



|
<










|
<
<
<
<
<
<
<
<
<
<
<
<


|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
>
|
<
<
<
<
<
<
<





|
<
<
<


|
<
<
<



|
<





|


|



|



|





|


<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


>


|
<
<
<
<
<
<
<
<
|
|
<



|
<
<
<
<
<
<
<
<








|












|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<



|
<
<





|
<
<
<


|
<
<
<





|
<
<
<
<


|
<
<
<



|
<
<
<
<
<
<
<
<
<
<
<
<
<
<



<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459



460
461
462
463
464
465
466
467
468
469
470
471

472
473
474
475

476
477
478
479

480
481
482
483
484
485
486
487
488
489
490












491
492
493














494
495







496
497
498
499
500
501



502
503
504



505
506
507
508

509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533

534





















535
536
537
538
539
540








541
542

543
544
545
546








547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568


















569
570
571
572


573
574
575
576
577
578



579
580
581



582
583
584
585
586
587




588
589
590



591
592
593
594














595
596
597

598














































599
600
601
602
603
604
605
            # change pointer
            xPointer = self.ctx.ServiceManager.createInstanceWithContext("com.sun.star.awt.Pointer", self.ctx)
            xPointer.setType(uno.getConstantByName("com.sun.star.awt.SystemPointer.WAIT"))
            xWindowPeer = self.xContainer.getPeer()
            xWindowPeer.setPointer(xPointer)
            for x in xWindowPeer.Windows:
                x.setPointer(xPointer)
            # ICU: & is $0 in replacement field
            # NOTE: A LOT OF REGEX COULD BE MERGED IF ICU ENGINE WAS NOT SO BUGGY
            # "([;?!…])(?=[:alnum:])" => "$1 " doesn’t work properly
            # "(?<=[:alnum:])([;?!…])" => " $1 " doesn’t work properly
            self.pbar.ProgressValue = 0
            # Restructuration
            if self.struct.State:
                if self.struct1.State:
                    n = self._replaceList(xElem, "struct1")
                    self.struct1_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.struct2.State:
                    n = self._replaceList(xElem, "struct2")
                    n += self._replaceHyphenAtEndOfParagraphs(xElem) # EOP
                    self.struct2_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.struct3.State:
                    n = self._mergeContiguousParagraphs(xElem)
                    self.struct3_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                self.struct.State = False
                self._switchCheckBox(self.struct)
            self.pbar.ProgressValue = 3
            # espaces surnuméraires
            if self.ssp.State:
                if self.ssp3.State:
                    n = self._replaceList(xElem, "ssp3")
                    self.ssp3_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.ssp2.State:
                    n = self._replaceList(xElem, "ssp2")



                    self.ssp2_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.ssp1.State:
                    n = self._replaceList(xElem, "ssp1")
                    self.ssp1_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.ssp4.State:
                    n = self._replaceList(xElem, "ssp4")
                    self.ssp4_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.ssp5.State:
                    n = self._replaceList(xElem, "ssp5")

                    self.ssp5_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.ssp6.State:
                    n = self._replaceList(xElem, "ssp6")

                    self.ssp6_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.ssp7.State:
                    n = self._replaceList(xElem, "ssp7")

                    self.ssp7_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                self.ssp.State = False
                self._switchCheckBox(self.ssp)
            self.pbar.ProgressValue = 10
            # espaces typographiques
            if self.nbsp.State:
                if self.nbsp1.State:
                    if self.nnbsp1.State:
                        # espaces insécables fines
                        n = self._replaceList(xElem, "nnbsp1")












                    else:
                        # espaces insécables
                        n = self._replaceList(xElem, "nbsp1")














                    # réparations
                    n -= self._replaceList(xElem, "nbsp1_fix")







                    self.nbsp1_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.nbsp2.State:
                    if self.nnbsp2.State:
                        # espaces insécables fines
                        n = self._replaceList(xElem, "nnbsp2")



                    else:
                        # espaces insécables
                        n = self._replaceList(xElem, "nbsp2")



                    self.nbsp2_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.nbsp3.State:
                    n = self._replaceList(xElem, "nbsp3")

                    self.nbsp3_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.nbsp4.State:
                    if self.nnbsp4.State:
                        # espaces insécables fines
                        n = self._replaceList(xElem, "nnbsp4")
                    else:
                        # espaces insécables
                        n = self._replaceList(xElem, "nbsp4")
                    self.nbsp4_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.nbsp5.State:
                    n = self._replaceList(xElem, "nbsp5")
                    self.nbsp5_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if False:
                    n = self._replaceList(xElem, "nbsp6")
                    self.nbsp3_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                self.nbsp.State = False
                self._switchCheckBox(self.nbsp)
            self.pbar.ProgressValue = 15
            # points médians
            if self.typo.State:
                if self.typo6.State:

                    n = self._replaceList(xElem, "typo6")





















                    self.typo6_res.Label = str(n)
                    self.pbar.ProgressValue += 1
            # espaces manquants
            if self.space.State:
                if self.space1.State:
                    n = self._replaceList(xElem, "space1")








                    # réparations
                    n -= self._replaceList(xElem, "space1_fix")

                    self.space1_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.space2.State:
                    n = self._replaceList(xElem, "space2")








                    self.space2_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                self.space.State = False
                self._switchCheckBox(self.space)
            self.pbar.ProgressValue = 17
            # Suppression
            if self.delete.State:
                if self.delete1.State:
                    n = self._replaceList(xElem, "delete1")
                    self.delete1_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.delete2.State:
                    n = self._replaceBulletsByEmDash(xElem)
                    self.delete2_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                self.delete.State = False
                self._switchCheckBox(self.delete)
            self.pbar.ProgressValue = 20
            # signes typographiques
            if self.typo.State:
                if self.typo1.State:
                    n = self._replaceList(xElem, "typo1")


















                    self.typo1_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.typo2.State:
                    n = self._replaceList(xElem, "typo2")


                    self.typo2_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.typo3.State:
                    if self.typo3b.State:
                        # demi-cadratin
                        n = self._replaceList(xElem, "typo3b")



                    else:
                        # cadratin
                        n = self._replaceList(xElem, "typo3a")



                    self.typo3_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.typo4.State:
                    if self.typo4a.State:
                        # cadratin
                        n = self._replaceList(xElem, "typo4a")




                    else:
                        # demi-cadratin
                        n = self._replaceList(xElem, "typo4b")



                    self.typo4_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.typo5.State:
                    n = self._replaceList(xElem, "typo5")














                    self.typo5_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.typo7.State:

                    n = self._replaceList(xElem, "typo7")














































                    self.typo7_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.typo8.State:
                    # ligatures typographiques : fi, fl, ff, ffi, ffl, ft, st
                    n = 0
                    if self.typo8a.State:
                        if self.typo_ffi.State:
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903














904
905
906
907
908
909
910
911
912
913
914
915
916
917


918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938


939
940
941
942
943
944
945
946


947
948
949
950
951
952
953
954
955
956
957
958
959
960
961


962
963
964
965
966
967
968
969
970
971
972
973
974
                self.typo.State = False
                self._switchCheckBox(self.typo)
            self.pbar.ProgressValue = 28
            # divers
            if self.misc.State:
                if self.misc1.State:
                    if self.misc1a.State:
                        n = self._replaceText(xElem, "(?<=\\b[0-9][0-9][0-9][0-9])(i?[èe]me|è|e)\\b", "ᵉ", True)
                        n += self._replaceText(xElem, "(?<=\\b[0-9][0-9][0-9])(i?[èe]me|è|e)\\b", "ᵉ", True)
                        n += self._replaceText(xElem, "(?<=\\b[0-9][0-9])(i?[èe]me|è|e)\\b", "ᵉ", True)
                        n += self._replaceText(xElem, "(?<=\\b[0-9])(i?[èe]me|è|e)\\b", "ᵉ", True)
                        n += self._replaceText(xElem, "(?<=\\b[XVICL][XVICL][XVICL][XVICL])(i?[èe]me|è|e)\\b", "ᵉ", True, True)
                        n += self._replaceText(xElem, "(?<=\\b[XVICL][XVICL][XVICL])(i?[èe]me|è|e)\\b", "ᵉ", True, True)
                        n += self._replaceText(xElem, "(?<=\\b[XVICL][XVICL])(i?[èe]me|è|e)\\b", "ᵉ", True, True)
                        n += self._replaceText(xElem, "(?<=\\b[XVICL])(i?[èe]me|è)\\b", "ᵉ", True, True)
                        n += self._replaceText(xElem, "(?<=\\b(au|l[ea]|du) [XVICL])e\\b", "ᵉ", True, True)
                        n += self._replaceText(xElem, "(?<=\\b[XVI])e(?= siècle)", "ᵉ", True, True)
                        n += self._replaceText(xElem, "(?<=\\b[1I])er\\b", "ᵉʳ", True, True)
                        n += self._replaceText(xElem, "(?<=\\b[1I])re\\b", "ʳᵉ", True, True)
                    else:
                        n = self._replaceText(xElem, "(?<=\\b[0-9][0-9][0-9][0-9])(i?[èe]me|è|ᵉ)\\b", "e", True)
                        n += self._replaceText(xElem, "(?<=\\b[0-9][0-9][0-9])(i?[èe]me|è|ᵉ)\\b", "e", True)
                        n += self._replaceText(xElem, "(?<=\\b[0-9][0-9])(i?[èe]me|è|ᵉ)\\b", "e", True)
                        n += self._replaceText(xElem, "(?<=\\b[0-9])(i?[èe]me|è|ᵉ)\\b", "e", True)
                        n += self._replaceText(xElem, "(?<=\\b[XVICL][XVICL][XVICL][XVICL])(i?[èe]me|è|ᵉ)\\b", "e", True, True)
                        n += self._replaceText(xElem, "(?<=\\b[XVICL][XVICL][XVICL])(i?[èe]me|è|ᵉ)\\b", "e", True, True)
                        n += self._replaceText(xElem, "(?<=\\b[XVICL][XVICL])(i?[èe]me|è|ᵉ)\\b", "e", True, True)
                        n += self._replaceText(xElem, "(?<=\\b[XVICL])(i?[èe]me|è|ᵉ)\\b", "e", True, True)
                        n += self._replaceText(xElem, "(?<=\\b[1I])ᵉʳ\\b", "er", True, True)
                        n += self._replaceText(xElem, "(?<=\\b[1I])ʳᵉ\\b", "er", True, True)
                    self.misc1_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.misc2.State:
                    n = self._replaceText(xElem, "etc(…|[.][.][.]?)", "etc.", True, True)
                    n += self._replaceText(xElem, "(?<!,) etc[.]", ", etc.", True, True)
                    self.misc2_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.misc3.State:
                    n = self._replaceText(xElem, "[ -]t[’'](?=il\\b|elle|on\\b)", "-t-", True)
                    n += self._replaceText(xElem, " t-(?=il|elle|on)", "-t-", True)
                    n += self._replaceText(xElem, "[ -]t[’'-](?=ils|elles)", "-", True)
                    n += self._replaceText(xElem, "(?<=[td])-t-(?=il|elle|on)", "-", True)
                    n += self._replaceText(xElem, "(celles?|celui|ceux) (ci|là)\\b", "$1-$2", True)
                    n += self._replaceText(xElem, "\\bdix (sept|huit|neuf)", "dix-$1", True)
                    n += self._replaceText(xElem, "quatre vingt", "quatre-vingt", False)
                    n += self._replaceText(xElem, "(soixante|quatre-vingt) dix", "$1-dix", True)
                    n += self._replaceText(xElem, "(vingt|trente|quarante|cinquante|soixante(?:-dix|)|quatre-vingt(?:-dix|)) (deux|trois|quatre|cinq|six|sept|huit|neuf)", "$1-$2", True)
                    n += self._replaceText(xElem, "(?<!-)\\b(ci) (joint|desso?us|contre|devant|avant|après|incluse|g[îi]t|gisent)", "$1-$2", True)
                    n += self._replaceText(xElem, "\\bvis à vis", "vis-à-vis", False, True)
                    n += self._replaceText(xElem, "\\bVis à vis", "Vis-à-vis", False, True)
                    n += self._replaceText(xElem, "week end", "week-end", False, True)
                    n += self._replaceText(xElem, "Week end", "Week-end", False, True)
                    n += self._replaceText(xElem, "(plus|moins) value", "$1-value", True)
                    self.misc3_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.misc5.State:
                    n = self._replaceText(xElem, "(qu|lorsqu|puisqu|quoiqu|presqu|jusqu|aujourd|entr|quelqu) ", "$1’", True, True)
                    if self.misc5b.State:
                        n += self._replaceText(xElem, "\\bj (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])", "j’", True, True)
                        n += self._replaceText(xElem, "\\bn (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])", "n’", True, True)
                        n += self._replaceText(xElem, "\\bm (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])", "m’", True, True)
                        n += self._replaceText(xElem, "\\bt (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])", "t’", True, True)
                        n += self._replaceText(xElem, "\\bs (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])", "s’", True, True)
                        n += self._replaceText(xElem, "\\bc (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])", "c’", True, True)
                        n += self._replaceText(xElem, "\\bç (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])", "ç’", True, True)
                        n += self._replaceText(xElem, "\\bl (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])", "l’", True, True)
                        n += self._replaceText(xElem, "\\bd (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])", "d’", True, True)
                        if self.misc5c.State:
                            n += self._replaceText(xElem, "\\bJ (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])", "J’", True, True)
                            n += self._replaceText(xElem, "\\bN (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])", "N’", True, True)
                            n += self._replaceText(xElem, "\\bM (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])", "M’", True, True)
                            n += self._replaceText(xElem, "\\bT (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])", "T’", True, True)
                            n += self._replaceText(xElem, "\\bS (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])", "S’", True, True)
                            n += self._replaceText(xElem, "\\bC (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])", "C’", True, True)
                            n += self._replaceText(xElem, "\\bÇ (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])", "Ç’", True, True)
                            n += self._replaceText(xElem, "\\bL (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])", "L’", True, True)
                            n += self._replaceText(xElem, "\\bD (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])", "D’", True, True)
                    self.misc5_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                self.misc.State = False
                self._switchCheckBox(self.misc)
            self.pbar.ProgressValue = self.pbar.ProgressValueMax
            # end of processing
            xPointer.setType(uno.getConstantByName("com.sun.star.awt.SystemPointer.ARROW"))
            xWindowPeer.setPointer(xPointer)
            for x in xWindowPeer.Windows:
                x.setPointer(xPointer)
            self.xContainer.setVisible(True) # seems necessary to refresh the dialog box and text widgets (why?)
            nEndTime = time.clock()
            self.time_res.Label = getTimeRes(nEndTime-nStartTime)
        except:
            traceback.print_exc()















    def _replaceText (self, xElem, sPattern, sRep, bRegex, bCaseSensitive=False):
        try:
            xRD = xElem.createReplaceDescriptor()
            xRD.SearchString = sPattern
            xRD.ReplaceString = sRep
            xRD.SearchRegularExpression = bRegex
            xRD.SearchCaseSensitive = bCaseSensitive
            return xElem.replaceAll(xRD)
        except:
            traceback.print_exc()
        return 0

    def _replaceHyphenAtEndOfParagraphs (self, xDoc):
        self._replaceText(xDoc, "-[  ]+$", "-", True) # remove spaces at end of paragraphs if - is the last character


        xHunspell = self.xSvMgr.createInstanceWithContext("com.sun.star.linguistic2.SpellChecker", self.ctx)
        xCursor = xDoc.Text.createTextCursor()
        xCursor.gotoStart(False)
        n = 0
        while xCursor.gotoNextParagraph(False):
            xCursor.goLeft(2, True)
            if xCursor.String.startswith("-"):
                xCursor.gotoStartOfWord(False)
                xLocale = xCursor.CharLocale
                xCursor.gotoEndOfWord(True)
                sWord1 = xCursor.String
                xCursor.gotoNextParagraph(False)
                xCursor.gotoEndOfWord(True)
                sWord2 = xCursor.String
                if sWord1 and sWord2 and xHunspell.isValid(sWord1+sWord2, xLocale, ()):
                    xCursor.gotoStartOfParagraph(False)
                    xCursor.goLeft(2, True)
                    xCursor.setString("")
                    n += 1
            else:
                xCursor.goRight(2, False)


        return n

    def _mergeContiguousParagraphs (self, xDoc):
        self._replaceText(xDoc, "^[  ]+$", "", True) # clear empty paragraphs
        xCursor = xDoc.Text.createTextCursor()
        xCursor.gotoStart(False)
        n = 0
        try:


            while xCursor.gotoNextParagraph(False):
                xCursor.gotoEndOfParagraph(True)
                if xCursor.String != "":
                    xCursor.gotoStartOfParagraph(False)
                    xCursor.goLeft(1, True)
                    xCursor.setString(" ")
                    n += 1
        except:
            traceback.print_exc()
        self._replaceText(xDoc, "  +", " ", True)
        return n

    def _replaceBulletsByEmDash (self, xDoc):
        xCursor = xDoc.Text.createTextCursor()
        helpers.xray(xCursor)


        xCursor.gotoStart(False)
        sParaStyleName = ""
        if not self.delete2c.State:
            sParaStyleName = "Standard"  if self.delete2a.State  else "Text body"
        n = 0
        try:
            if xCursor.NumberingStyleName != "":
                xCursor.NumberingStyleName = ""
                if sParaStyleName:
                    xCursor.ParaStyleName = sParaStyleName
                xDoc.Text.insertString(xCursor, "— ", False)
                n += 1
            while xCursor.gotoNextParagraph(False):







<
<
<
<
<
<
<
<
<
<
|
<

<
<
<
<
<
<
<
<
|
<



|
<



|
<
<
<
<
<
<
<
<
<
<
<
<
<
<



|

|
<
<
<
<
<
<
<
<

|
<
<
<
<
<
<
<
<
















>
>
>
>
>
>
>
>
>
>
>
>
>
>
|



|









>
>
|
|
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>



|
<
<


>
>














|
>
>
|
|
|
|
<
<







636
637
638
639
640
641
642










643

644








645

646
647
648
649

650
651
652
653














654
655
656
657
658
659








660
661








662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710

711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733


734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758


759
760
761
762
763
764
765
                self.typo.State = False
                self._switchCheckBox(self.typo)
            self.pbar.ProgressValue = 28
            # divers
            if self.misc.State:
                if self.misc1.State:
                    if self.misc1a.State:










                        n = self._replaceList(xElem, "misc1a")

                    else:








                        n = self._replaceList(xElem, "misc1b")

                    self.misc1_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.misc2.State:
                    n = self._replaceList(xElem, "misc2")

                    self.misc2_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.misc3.State:
                    n = self._replaceList(xElem, "misc3")














                    self.misc3_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                if self.misc5.State:
                    n = self._replaceList(xElem, "misc5a")
                    if self.misc5b.State:
                        n += self._replaceList(xElem, "misc5b")








                        if self.misc5c.State:
                            n += self._replaceList(xElem, "misc5c")








                    self.misc5_res.Label = str(n)
                    self.pbar.ProgressValue += 1
                self.misc.State = False
                self._switchCheckBox(self.misc)
            self.pbar.ProgressValue = self.pbar.ProgressValueMax
            # end of processing
            xPointer.setType(uno.getConstantByName("com.sun.star.awt.SystemPointer.ARROW"))
            xWindowPeer.setPointer(xPointer)
            for x in xWindowPeer.Windows:
                x.setPointer(xPointer)
            self.xContainer.setVisible(True) # seems necessary to refresh the dialog box and text widgets (why?)
            nEndTime = time.clock()
            self.time_res.Label = getTimeRes(nEndTime-nStartTime)
        except:
            traceback.print_exc()

    def _replaceList (self, xElem, sList):
        if sList not in tf_tabrep.dTableRepl:
            print("# Error. List <"+sList+"> not found")
            return 0
        n = 0
        try:
            for sPattern, sRepl, bRegex, bCaseSensitive in tf_tabrep.dTableRepl[sList]:
                n += self._replaceText(xElem, sPattern, sRepl, bRegex, bCaseSensitive)
        except:
            print("# Error with "+sList)
            traceback.print_exc()
        return n


    def _replaceText (self, xElem, sPattern, sRepl, bRegex, bCaseSensitive=False):
        try:
            xRD = xElem.createReplaceDescriptor()
            xRD.SearchString = sPattern
            xRD.ReplaceString = sRepl
            xRD.SearchRegularExpression = bRegex
            xRD.SearchCaseSensitive = bCaseSensitive
            return xElem.replaceAll(xRD)
        except:
            traceback.print_exc()
        return 0

    def _replaceHyphenAtEndOfParagraphs (self, xDoc):
        self._replaceText(xDoc, "-[  ]+$", "-", True) # remove spaces at end of paragraphs if - is the last character
        n = 0
        try:
            xHunspell = self.xSvMgr.createInstanceWithContext("com.sun.star.linguistic2.SpellChecker", self.ctx)
            xCursor = xDoc.Text.createTextCursor()
            xCursor.gotoStart(False)

            while xCursor.gotoNextParagraph(False):
                xCursor.goLeft(2, True)
                if xCursor.String.startswith("-"):
                    xCursor.gotoStartOfWord(False)
                    xLocale = xCursor.CharLocale
                    xCursor.gotoEndOfWord(True)
                    sWord1 = xCursor.String
                    xCursor.gotoNextParagraph(False)
                    xCursor.gotoEndOfWord(True)
                    sWord2 = xCursor.String
                    if sWord1 and sWord2 and xHunspell.isValid(sWord1+sWord2, xLocale, ()):
                        xCursor.gotoStartOfParagraph(False)
                        xCursor.goLeft(2, True)
                        xCursor.setString("")
                        n += 1
                else:
                    xCursor.goRight(2, False)
        except:
            traceback.print_exc()
        return n

    def _mergeContiguousParagraphs (self, xDoc):
        self._replaceText(xDoc, "^[  ]+$", "", True) # clear empty paragraphs    


        n = 0
        try:
            xCursor = xDoc.Text.createTextCursor()
            xCursor.gotoStart(False)
            while xCursor.gotoNextParagraph(False):
                xCursor.gotoEndOfParagraph(True)
                if xCursor.String != "":
                    xCursor.gotoStartOfParagraph(False)
                    xCursor.goLeft(1, True)
                    xCursor.setString(" ")
                    n += 1
        except:
            traceback.print_exc()
        self._replaceText(xDoc, "  +", " ", True)
        return n

    def _replaceBulletsByEmDash (self, xDoc):
        xCursor = xDoc.Text.createTextCursor()
        #helpers.xray(xCursor)
        n = 0
        try:
            xCursor.gotoStart(False)
            sParaStyleName = ""
            if not self.delete2c.State:
                sParaStyleName = "Standard"  if self.delete2a.State  else "Text body"


            if xCursor.NumberingStyleName != "":
                xCursor.NumberingStyleName = ""
                if sParaStyleName:
                    xCursor.ParaStyleName = sParaStyleName
                xDoc.Text.insertString(xCursor, "— ", False)
                n += 1
            while xCursor.gotoNextParagraph(False):

Added gc_lang/fr/oxt/TextFormatter/tf_tabrep.py version [89da85a6c2].















































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
# Regular expressions for the text formatter of LO
# working with ICU (bag of bugs)


# ICU: & is $0 in replacement field

# NOTE: A LOT OF REGEX COULD BE MERGED IF ICU ENGINE WAS NOT SO BUGGY
# "([;?!…])(?=[:alnum:])" => "$1 " doesn’t work properly
# "(?<=[:alnum:])([;?!…])" => " $1 " doesn’t work properly



#
#                   String to replace                   replacement     regex?  case sensitive?
#

dTableRepl = {
    # Restructuration
    "struct1": [
                    ("\\n",                             "\\n",          True,   True)   # end of line => end of paragraph
    ],
    "struct2": [
                    ("([:alpha:])- *\n([:alpha:])",     "$1$2",         True,   False)  # EOL
    ],

    # espaces surnuméraires
    "ssp1": [
                    ("^[  ]+",                          "",             True,   True)
    ],
    "ssp2": [
                    ("  ",                              " ",            False,  True),  # espace + espace insécable -> espace
                    ("  ",                              " ",            False,  True),  # espace insécable + espace -> espace
                    ("  +",                             " ",            True,   True),  # espaces surnuméraires
                    ("  +",                             " ",            True,   True)   # espaces insécables surnuméraires
    ],
    "ssp3": [
                    ("[  ]+$",                          "",             True,   True)
    ],
    "ssp4": [
                    (" +(?=[.,…])",                     "",             True,   True)
    ],
    "ssp5": [
                    ("\\([  ]+",                        "(",            True,   True),
                    ("[  ]+\\)",                        ")",            True,   True)
    ],
    "ssp6": [
                    ("\\[[  ]+",                        "[",            True,   True),
                    ("[  ]+\\]",                        "]",            True,   True)
    ],
    "ssp7": [
                    ("“[  ]+",                          "“",            True,   True),
                    ("[  ]”",                           "”",            True,   True)
    ],

    # espaces insécables
    "nbsp1": [
                    ("(?<=[:alnum:]):[   ]",            " : ",          True,   False),
                    ("(?<=[:alnum:]):$",                " :",           True,   False),
                    ("(?<=[:alnum:]);",                 " ;",           True,   False),
                    ("(?<=[:alnum:])[?][   ]",          " ? ",          True,   False),
                    ("(?<=[:alnum:])[?]$",              " ?",           True,   False),
                    ("(?<=[:alnum:])!",                 " !",           True,   False),
                    ("(?<=[]…)»}]):",                   " :",           True,   False),
                    ("(?<=[]…)»}]);",                   " ;",           True,   False),
                    ("(?<=[]…)»}])[?][   ]",            " ? ",          True,   False),
                    ("(?<=[]…)»}])[?]$",                " ?",           True,   False),
                    ("(?<=[]…)»}])!",                   " !",           True,   False),
                    ("[  ]+([:;?!])",                   " $1",          True,   False)
    ],
    "nnbsp1": [
                    ("(?<=[:alnum:]);",                 " ;",           True,   False),
                    ("(?<=[:alnum:])[?][   ]",          " ? ",          True,   False),
                    ("(?<=[:alnum:])[?]$",              " ?",           True,   False),
                    ("(?<=[:alnum:])!",                 " !",           True,   False),
                    ("(?<=[]…)»}]);",                   " ;",           True,   False),
                    ("(?<=[]…)»}])[?][   ]",            " ? ",          True,   False),
                    ("(?<=[]…)»}])[?]$",                " ?",           True,   False),
                    ("(?<=[]…)»}])!",                   " !",           True,   False),
                    ("[  ]+([;?!])",                    " $1",          True,   False),
                    ("(?<=[:alnum:]):[   ]",            " : ",          True,   False),
                    ("(?<=[:alnum:]):$",                " :",           True,   False),
                    ("(?<=[]…)»}]):",                   " :",           True,   False),
                    ("[  ]+:",                          " :",           True,   False)
    ],
    "nbsp1_fix": [
                    ("([[(])[   ]([!?:;])",             "$1$2",         True,   False),
                    ("(?<=http)[   ]://",               "://",          True,   False),
                    ("(?<=https)[   ]://",              "://",          True,   False),
                    ("(?<=ftp)[   ]://",                "://",          True,   False),
                    ("(?<=&)amp[   ];",                 "amp;",         True,   False),
                    ("(?<=&)nbsp[   ];",                "nbsp;",        True,   False),
                    ("(?<=&)lt[   ];",                  "lt;",          True,   False),
                    ("(?<=&)gt[   ];",                  "gt;",          True,   False),
                    ("(?<=&)apos[   ];",                "apos;",        True,   False),
                    ("(?<=&)quot[   ];",                "quot;",        True,   False),
                    ("(?<=&)thinsp[   ];",              "thinsp;",      True,   False)
    ],
    "nbsp2": [
                    ("«(?=[:alnum:])",                  "« ",           True,   False),
                    ("«[  ]+",                          "« ",           True,   False),
                    ("(?<=[:alnum:]|[.!?])»",           " »",           True,   False),
                    ("[  ]+»",                          " »",           True,   False)
    ],
    "nnbsp2": [
                    ("«(?=[:alnum:])",                  "« ",           True,   False),
                    ("«[  ]+",                          "« ",           True,   False),
                    ("(?<=[:alnum:]|[.!?])»",           " »",           True,   False),
                    ("[  ]+»",                          " »",           True,   False)
    ],
    "nbsp3": [
                    ("([:digit:])([%‰€$£¥˚℃])",         "$1 $2",        True,   True),
                    ("([:digit:]) ([%‰€$£¥˚℃])",        "$1 $2",        True,   True),
    ],
    "nbsp4": [
                    ("([:digit:])[  ]([:digit:])",      "$1 $2",        True,   True)
    ],
    "nnbsp4": [
                    ("([:digit:])[  ]([:digit:])",      "$1 $2",        True,   True)
    ],
    "nbsp5": [
                    ("(?<=[0-9⁰¹²³⁴⁵⁶⁷⁸⁹]) ?([kcmµnd]?(?:[slgJKΩΩℓ]|m[²³]?|Wh?|Hz|dB)|[%‰]|°C)\\b", " $1", True, True)
    ],
    "nbsp6": [
                    ("\\b(MM?\\.|Mlle|Mgr) ",           "$1 ",          True,   True)
    ],

    # espaces manquants
    "space1": [
                    (";(?=[:alnum:])",                  "; ",           True,   True),
                    ("\\?(?=[A-ZÉÈÊÂÀÎ])",              "? ",           True,   True),
                    ("!(?=[:alnum:])",                  "! ",           True,   True),
                    ("…(?=[:alnum:])",                  "… ",           True,   True),
                    ("\\.(?=[A-ZÉÈÎ][:alpha:])",        ". ",           True,   True),
                    ("\\.(?=À)",                        ". ",           True,   True),
                    (",(?=[:alpha:])",                  ", ",           True,   True),
                    ("([:alpha:]),([0-9])",             "$1, $2",       True,   True),
                    (":(?=[:alpha:])",                  ": ",           True,   True)
    ],
    "space1_fix": [
                    ("(?<=DnT), w\\b",                  ",w",           True,   True),
                    ("(?<=DnT), A\\b",                  ",A",           True,   True)
    ],
    "space2": [
                    (" -(?=[:alpha:]|[\"«“'‘])",        " - ",          True,   False),
                    (" –(?=[:alpha:]|[\"«“'‘])",        " – ",          True,   False), # demi-cadratin
                    (" —(?=[:alpha:]|[\"«“'‘])",        " — ",          True,   False), # cadratin
                    ("(?<=[:alpha:])– ",                " – ",          True,   False),
                    ("(?<=[:alpha:])— ",                " — ",          True,   False),
                    ("(?<=[:alpha:])- ",                " - ",          True,   False),
                    ("(?<=[\"»”'’])– ",                 " – ",          True,   False),
                    ("(?<=[\"»”'’])— ",                 " — ",          True,   False),
                    ("(?<=[\"»”'’])- ",                 " - ",          True,   False)
    ],

    # Suppressions
    "delete1": [
                    ("­",                               "",             False,  True)
    ],

    # Signes typographiques
    "typo1": [
                    ("\\bl['´‘′`](?=[:alnum:])",        "l’",           True,   True),
                    ("\\bj['´‘′`](?=[:alnum:])",        "j’",           True,   True),
                    ("\\bm['´‘′`](?=[:alnum:])",        "m’",           True,   True),
                    ("\\bt['´‘′`](?=[:alnum:])",        "t’",           True,   True),
                    ("\\bs['´‘′`](?=[:alnum:])",        "s’",           True,   True),
                    ("\\bc['´‘′`](?=[:alnum:])",        "c’",           True,   True),
                    ("\\bd['´‘′`](?=[:alnum:])",        "d’",           True,   True),
                    ("\\bn['´‘′`](?=[:alnum:])",        "n’",           True,   True),
                    ("\\bç['´‘′`](?=[:alnum:])",        "ç’",           True,   True),
                    ("\\bL['´‘′`](?=[:alnum:])",        "L’",           True,   True),
                    ("\\bJ['´‘′`](?=[:alnum:])",        "J’",           True,   True),
                    ("\\bM['´‘′`](?=[:alnum:])",        "M’",           True,   True),
                    ("\\bT['´‘′`](?=[:alnum:])",        "T’",           True,   True),
                    ("\\bS['´‘′`](?=[:alnum:])",        "S’",           True,   True),
                    ("\\bC['´‘′`](?=[:alnum:])",        "C’",           True,   True),
                    ("\\bD['´‘′`](?=[:alnum:])",        "D’",           True,   True),
                    ("\\bN['´‘′`](?=[:alnum:])",        "N’",           True,   True),
                    ("\\bÇ['´‘′`](?=[:alnum:])",        "Ç’",           True,   True),
                    ("(qu|jusqu|lorsqu|puisqu|quoiqu|quelqu|presqu|entr|aujourd|prud)['´‘′`]", "$1’", True, False)
    ],
    "typo2": [
                    ("...",                             "…",            False,  True),
                    ("(?<=…)[.][.]",                    "…",            True,   True),
                    ("…[.](?![.])",                     "…",            True,   True)
    ],
    "typo3a": [     # cadratin
                    (" - ",                             " — ",          False,  True),
                    (" – ",                             " — ",          False,  True),
                    (" -,",                             " —,",          False,  True),
                    (" –,",                             " —,",          False,  True)
    ],
    "typo3b": [     # demi-cadratin
                    (" - ",                             " – ",          False,  True),
                    (" — ",                             " – ",          False,  True),
                    (" -,",                             " –,",          False,  True),
                    (" —,",                             " –,",          False,  True)
    ],
    "typo4a": [     # cadratin
                    ("^-[  ]",                          "— ",           True,   True),
                    ("^–[  ]",                          "— ",           True,   True),
                    ("^— ",                             "— ",           True,   True),
                    ("^«[  ][—–-][  ]",                 "« — ",         True,   True),
                    ("^[-–—](?=[:alnum:])",             "— ",           True,   False)
    ],
    "typo4b": [     # demin-cadratin
                    ("^-[  ]",                          "– ",           True,   True),
                    ("^—[  ]",                          "– ",           True,   True),
                    ("^– ",                             "– ",           True,   True),
                    ("^«[  ][—–-][  ]",                 "« – ",         True,   True),
                    ("^[-–—](?=[:alnum:])",             "– ",           True,   False)
    ],
    "typo5": [
                    ('"([:alpha:]+)"',                      "“$1”",         True,   False),
                    ("''([:alpha:]+)''",                    "“$1”",         True,   False),
                    ("'([:alpha:]+)'",                      "“$1”",         True,   False),
                    ('^"(?=[:alnum:])',                     "« ",           True,   False),
                    ("^''(?=[:alnum:])",                    "« ",           True,   False),
                    (' "(?=[:alnum:])',                     " « ",          True,   False),
                    (" ''(?=[:alnum:])",                    " « ",          True,   False),
                    ('\\("(?=[:alnum:])',                   "(« ",          True,   False),
                    ("\\(''(?=[:alnum:])",                  "(« ",          True,   False),
                    ('(?<=[:alnum:])"$',                    " »",           True,   False),
                    ("(?<=[:alnum:])''$",                   " »",           True,   False),
                    ('(?<=[:alnum:])"(?=[] ,.:;?!…)])',     " »",           True,   False),
                    ("(?<=[:alnum:])''(?=[] ,.:;?!…)])",    " »",           True,   False),
                    ('(?<=[.!?…])" ',                       " » ",          True,   False),
                    ('(?<=[.!?…])"$',                       " »",           True,   False)
    ],
    "typo6": [
                    ("\\bN\\.([ms])\\b",                    "N·$1",         True,   True),  # N·m et N·m-1, N·s
                    ("\\bW\\.h\\b",                         "W·h",          True,   True),
                    ("\\bPa\\.s\\b",                        "Pa·s",         True,   True),
                    ("\\bA\\.h\\b",                         "A·h",          True,   True),
                    ("\\bΩ\\.m\\b",                         "Ω·m",          True,   True),
                    ("\\bS\\.m\\b",                         "S·m",          True,   True),
                    ("\\bg\\.s(?=-1)\\b",                   "g·s",          True,   True),
                    ("\\bm\\.s(?=-[12])\\b",                "m·s",          True,   True),
                    ("\\bg\\.m(?=2|-3)\\b",                 "g·m",          True,   True),
                    ("\\bA\\.m(?=-1)\\b",                   "A·m",          True,   True),
                    ("\\bJ\\.K(?=-1)\\b",                   "J·K",          True,   True),
                    ("\\bW\\.m(?=-2)\\b",                   "W·m",          True,   True),
                    ("\\bcd\\.m(?=-2)\\b",                  "cd·m",         True,   True),
                    ("\\bC\\.kg(?=-1)\\b",                  "C·kg",         True,   True),
                    ("\\bH\\.m(?=-1)\\b",                   "H·m",          True,   True),
                    ("\\bJ\\.kg(?=-1)\\b",                  "J·kg",         True,   True),
                    ("\\bJ\\.m(?=-3)\\b",                   "J·m",          True,   True),
                    ("\\bm[2²]\\.s\\b",                     "m²·s",         True,   True),
                    ("\\bm[3³]\\.s(?=-1)\\b",               "m³·s",         True,   True),
                    #("\\bJ.kg-1.K-1\\b",                   "J·kg-1·K-1",   True,   True),
                    #("\\bW.m-1.K-1\\b",                    "W·m-1·K-1",    True,   True),
                    #("\\bW.m-2.K-1\\b",                    "W·m-2·K-1",    True,   True),
                    ("\\b(Y|Z|E|P|T|G|M|k|h|da|d|c|m|µ|n|p|f|a|z|y)Ω\\b", "$1Ω", True, True)
    ],
    "typo7": [
                    # ligatures: pas de majuscules
                    ("coeur",                               "cœur",         False,  True),
                    ("coel([aeio])",                        "cœl$1",        True,   True),
                    ("choeur",                              "chœur",        False,  True),
                    ("foet",                                "fœt",          False,  True),
                    ("oeil",                                "œil",          False,  True),
                    ("oeno",                                "œno",          False,  True),
                    ("oesoph",                              "œsoph",        False,  True),
                    ("oestro",                              "œstro",        False,  True),
                    ("oeuf",                                "œuf",          False,  True),
                    ("oeuvr",                               "œuvr",         False,  True),
                    ("moeur",                               "mœur",         False,  True),
                    ("noeu",                                "nœu",          False,  True),
                    ("soeur",                               "sœur",         False,  True),
                    ("voeu",                                "vœu",          False,  True),
                    ("aequo",                               "æquo",         False,  True),
                    # ligatures: majuscules
                    ("Coeur",                               "Cœur",         False,  True),
                    ("Coel([aeio])",                        "Cœl$1",        True,   True),
                    ("Choeur",                              "Chœur",        False,  True),
                    ("Foet",                                "Fœt",          False,  True),
                    ("Oeil",                                "Œil",          False,  True),
                    ("Oeno",                                "Œno",          False,  True),
                    ("Oesoph",                              "Œsoph",        False,  True),
                    ("Oestro",                              "Œstro",        False,  True),
                    ("Oeuf",                                "Œuf",          False,  True),
                    ("Oeuvr",                               "Œuvr",         False,  True),
                    ("Moeur",                               "Mœur",         False,  True),
                    ("Noeu",                                "Nœu",          False,  True),
                    ("Soeur",                               "Sœur",         False,  True),
                    ("Voeu",                                "Vœu",          False,  True),
                    ("Aequo",                               "Æquo",         False,  True),
                    # mots communs avec diacritiques manquants
                    ("\\bCa\\b",                            "Ça",           True,   True),
                    (" ca\\b",                              " ça",          True,   True),
                    ("\\bdej[aà]\\b",                       "déjà",         True,   True),
                    ("\\bDej[aà]\\b",                       "Déjà",         True,   True),
                    ("\\bplutot\\b",                        "plutôt",       True,   True),
                    ("\\bPlutot\\b",                        "Plutôt",       True,   True),
                    ("\\b([cC]e(?:ux|lles?|lui))-la\\b",    "$1-là",        True,   True),
                    ("\\bmalgre\\b",                        "malgré",       True,   True),
                    ("\\bMalgre\\b",                        "Malgré",       True,   True),
                    ("\\betre\\b",                          "être",         True,   True),
                    ("\\bEtre\\b",                          "Être",         True,   True),
                    ("\\btres\\b",                          "très",         True,   True),
                    ("\\bTres\\b",                          "Très",         True,   True),
                    ("\\bEtai([ts]|ent)\\b",                "Étai$1",       True,   True),
                    ("\\bE(tat|cole|crit|poque|tude|ducation|glise|conomi(?:qu|)e|videmment|lysée|tienne|thiopie|cosse|gypt(?:e|ien)|rythrée|pinal|vreux)", "É$1", True, True)
    ],
    # faire ligatures
    "typo_ffi_do": [
                    ("ffi",                                 "ffi",            False,  True)
    ],
    "typo_ffl_do": [
                    ("ffl",                                 "ffl",            False,  True)
    ],
    "typo_fi_do": [
                    ("fi",                                  "fi",            False,  True)
    ],
    "typo_fl_do": [
                    ("fl",                                  "fl",            False,  True)
    ],
    "typo_ff_do": [
                    ("ff",                                  "ff",            False,  True)
    ],
    "typo_ft_do": [
                    ("ft",                                  "ſt",            False,  True)
    ],
    "typo_st_do": [
                    ("st",                                  "st",            False,  True)
    ],
    # défaire ligatures
    "typo_fi_undo": [
                    ("fi",                                   "fi",           False,  True)
    ],
    "typo_fl_undo": [
                    ("fl",                                   "fl",           False,  True)
    ],
    "typo_ff_undo": [
                    ("ff",                                   "ff",           False,  True)
    ],
    "typo_ff_undo": [
                    ("ffi",                                   "ffi",          False,  True)
    ],
    "typo_ff_undo": [
                    ("ffl",                                   "ffl",          False,  True)
    ],
    "typo_ft_undo": [
                    ("ſt",                                   "ft",           False,  True)
    ],
    "typo_st_undo": [
                    ("st",                                   "st",           False,  True)
    ],

    # Divers
    "misc1a": [
                    ("(?<=\\b[0-9][0-9][0-9][0-9])(i?[èe]me|è|e)\\b",           "ᵉ",    True, False),
                    ("(?<=\\b[0-9][0-9][0-9])(i?[èe]me|è|e)\\b",                "ᵉ",    True, False),
                    ("(?<=\\b[0-9][0-9])(i?[èe]me|è|e)\\b",                     "ᵉ",    True, False),
                    ("(?<=\\b[0-9])(i?[èe]me|è|e)\\b",                          "ᵉ",    True, False),
                    ("(?<=\\b[XVICL][XVICL][XVICL][XVICL])(i?[èe]me|è|e)\\b",   "ᵉ",    True, True),
                    ("(?<=\\b[XVICL][XVICL][XVICL])(i?[èe]me|è|e)\\b",          "ᵉ",    True, True),
                    ("(?<=\\b[XVICL][XVICL])(i?[èe]me|è|e)\\b",                 "ᵉ",    True, True),
                    ("(?<=\\b[XVICL])(i?[èe]me|è)\\b",                          "ᵉ",    True, True),
                    ("(?<=\\b(au|l[ea]|du) [XVICL])e\\b",                       "ᵉ",    True, True),
                    ("(?<=\\b[XVI])e(?= siècle)",                               "ᵉ",    True, True),
                    ("(?<=\\b[1I])er\\b",                                       "ᵉʳ",   True, True),
                    ("(?<=\\b[1I])re\\b",                                       "ʳᵉ",   True, True)
    ],
    "misc1b": [
                    ("(?<=\\b[0-9][0-9][0-9][0-9])(i?[èe]me|è|ᵉ)\\b",           "e",    True, False),
                    ("(?<=\\b[0-9][0-9][0-9])(i?[èe]me|è|ᵉ)\\b",                "e",    True, False),
                    ("(?<=\\b[0-9][0-9])(i?[èe]me|è|ᵉ)\\b",                     "e",    True, False),
                    ("(?<=\\b[0-9])(i?[èe]me|è|ᵉ)\\b",                          "e",    True, False),
                    ("(?<=\\b[XVICL][XVICL][XVICL][XVICL])(i?[èe]me|è|ᵉ)\\b",   "e",    True, True),
                    ("(?<=\\b[XVICL][XVICL][XVICL])(i?[èe]me|è|ᵉ)\\b",          "e",    True, True),
                    ("(?<=\\b[XVICL][XVICL])(i?[èe]me|è|ᵉ)\\b",                 "e",    True, True),
                    ("(?<=\\b[XVICL])(i?[èe]me|è|ᵉ)\\b",                        "e",    True, True),
                    ("(?<=\\b[1I])ᵉʳ\\b",                                       "er",   True, True),
                    ("(?<=\\b[1I])ʳᵉ\\b",                                       "er",   True, True)
    ],
    "misc2": [
                    ("etc(…|[.][.][.]?)",                       "etc.",         True,   True),
                    ("(?<!,) etc[.]",                           ", etc.",       True,   True)
    ],
    "misc3": [
                    ("[ -]t[’'](?=il\\b|elle|on\\b)",           "-t-",          True,   True),
                    (" t-(?=il|elle|on)",                       "-t-",          True,   True),
                    ("[ -]t[’'-](?=ils|elles)",                 "-",            True,   True),
                    ("(?<=[td])-t-(?=il|elle|on)",              "-",            True,   True),
                    ("(celles?|celui|ceux) (ci|là)\\b",         "$1-$2",        True,   False),
                    ("\\bdix (sept|huit|neuf)",                 "dix-$1",       True,   False),
                    ("quatre vingt",                            "quatre-vingt", False,  True),
                    ("(soixante|quatre-vingt) dix",             "$1-dix",       True,   False),
                    ("(vingt|trente|quarante|cinquante|soixante(?:-dix|)|quatre-vingt(?:-dix|)) (deux|trois|quatre|cinq|six|sept|huit|neuf)", "$1-$2", True, False),
                    ("(?<!-)\\b(ci) (joint|desso?us|contre|devant|avant|après|incluse|g[îi]t|gisent)", "$1-$2", True, False),
                    ("\\bvis à vis",                            "vis-à-vis",    False,  True),
                    ("\\bVis à vis",                            "Vis-à-vis",    False,  True),
                    ("week end",                                "week-end",     False,  True),
                    ("Week end",                                "Week-end",     False,  True),
                    ("(plus|moins) value",                      "$1-value",     True,   False)
    ],
    "misc5a": [
                    ("(qu|lorsqu|puisqu|quoiqu|presqu|jusqu|aujourd|entr|quelqu) ", "$1’", True, True),
    ],
    "misc5b": [
                    ("\\bj (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])",     "j’",           True,   True),
                    ("\\bn (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])",     "n’",           True,   True),
                    ("\\bm (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])",     "m’",           True,   True),
                    ("\\bt (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])",     "t’",           True,   True),
                    ("\\bs (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])",     "s’",           True,   True),
                    ("\\bc (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])",     "c’",           True,   True),
                    ("\\bç (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])",     "ç’",           True,   True),
                    ("\\bl (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])",     "l’",           True,   True),
                    ("\\bd (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])",     "d’",           True,   True)
    ],
    "misc5c": [
                    ("\\bJ (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])",     "J’",           True,   True),
                    ("\\bN (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])",     "N’",           True,   True),
                    ("\\bM (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])",     "M’",           True,   True),
                    ("\\bT (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])",     "T’",           True,   True),
                    ("\\bS (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])",     "S’",           True,   True),
                    ("\\bC (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])",     "C’",           True,   True),
                    ("\\bÇ (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])",     "Ç’",           True,   True),
                    ("\\bL (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])",     "L’",           True,   True),
                    ("\\bD (?=[aàeéêiîoôuyhAÀEÉÊIÎOÔUYH])",     "D’",           True,   True)
    ]
}

Added gc_lang/fr/oxt/_img/Algoo_logo.png version [9509b33506].

cannot compute difference between binary files

Added gc_lang/fr/oxt/_img/logo120_text.png version [c438dd0680].

cannot compute difference between binary files

Modified gc_lang/fr/rules.grx from [8af257ba9e] to [ac186d9af6].

54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103

104
105
106
107
108
109
110
OPTGROUP/basic: typo apos, esp tab, nbsp unit, tu maj, num virg, nf chim, ocr mapos, liga
OPTGROUP/gramm: conf sgpl gn
OPTGROUP/verbs: infi conj ppas, imp inte vmode
OPTGROUP/style: bs pleo, redon1 redon2, neg
OPTGROUP/misc: date mc
OPTGROUP/debug: idrule

# pour l’instant, seuls les colonnes Python et JavaScript sont utiles

OPTSOFTWARE:        Python      JavaScript  Writer      Firefox     Thunderbird
OPT/typo:           True        True        True        True        True
OPT/apos:           True        True        True        True        True
OPT/esp:            True        False       True        False       False
OPT/tab:            False       False       True        False       False
OPT/nbsp:           True        False       True        False       False
OPT/tu:             True        True        True        True        True
OPT/maj:            True        True        True        True        True
OPT/num:            True        True        True        True        True
OPT/virg:           True        True        True        True        True
OPT/unit:           True        False       True        False       False
OPT/nf:             True        True        True        True        True
OPT/liga:           False       False       False       False       False
OPT/mapos:          False       False       False       False       False
OPT/chim:           False       False       False       False       False
OPT/ocr:            False       False       False       False       False
OPT/conf:           True        True        True        True        True
OPT/sgpl:           True        True        True        True        True
OPT/gn:             True        True        True        True        True
OPT/infi:           True        True        True        True        True
OPT/conj:           True        True        True        True        True
OPT/ppas:           True        True        True        True        True
OPT/imp:            True        True        True        True        True
OPT/inte:           True        True        True        True        True
OPT/vmode:          True        True        True        True        True
OPT/bs:             True        True        True        True        True
OPT/pleo:           True        True        True        True        True
OPT/redon1:         False       False       False       False       False
OPT/redon2:         False       False       False       False       False
OPT/neg:            False       False       False       False       False
OPT/date:           True        True        True        True        True
OPT/mc:             False       False       False       False       False
OPT/idrule:         False       False       False       False       False
OPT/html:           False       True        False       True        True
OPT/latex:          False       False       False       False       False

# Priority: from 0 to 9. Default priority is 4.
OPTPRIORITY/tu:     6
OPTPRIORITY/conf:   5
OPTPRIORITY/ocr:    3



# Labels
OPTLANG/fr_FR:      Grammalecte (Français)
OPTLABEL/basic:     Typographie
OPTLABEL/typo:      Signes typographiques
OPTLABEL/apos:      Apostrophe typographique|Correction des apostrophes droites. Automatisme possible dans le menu Outils > Options d’autocorrection > Options linguistiques > Guillemets simples > Remplacer (à cocher)
OPTLABEL/esp:       Espaces surnuméraires|Signale les espaces inutiles entre les mots, en début et en fin de ligne.







<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|






>







54
55
56
57
58
59
60

61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
OPTGROUP/basic: typo apos, esp tab, nbsp unit, tu maj, num virg, nf chim, ocr mapos, liga
OPTGROUP/gramm: conf sgpl gn
OPTGROUP/verbs: infi conj ppas, imp inte vmode
OPTGROUP/style: bs pleo, redon1 redon2, neg
OPTGROUP/misc: date mc
OPTGROUP/debug: idrule


# Names of options is used in dictionaries keys: dOptPython, dOptJavaScript, etc.
OPTSOFTWARE:        Python      Server      Writer      JavaScript  Firefox     Thunderbird
OPT/typo:           True        True        True        True        True        True
OPT/apos:           True        True        True        True        True        True
OPT/esp:            True        True        True        False       False       False
OPT/tab:            False       True        False       False       False       False
OPT/nbsp:           True        True        True        False       False       False
OPT/tu:             True        True        True        True        True        True
OPT/maj:            True        True        True        True        True        True
OPT/num:            True        True        True        True        True        True
OPT/virg:           True        True        True        True        True        True
OPT/unit:           True        True        True        False       False       False
OPT/nf:             True        True        True        True        True        True
OPT/liga:           False       False       False       False       False       False
OPT/mapos:          False       False       False       False       False       False
OPT/chim:           False       False       False       False       False       False
OPT/ocr:            False       False       False       False       False       False
OPT/conf:           True        True        True        True        True        True
OPT/sgpl:           True        True        True        True        True        True
OPT/gn:             True        True        True        True        True        True
OPT/infi:           True        True        True        True        True        True
OPT/conj:           True        True        True        True        True        True
OPT/ppas:           True        True        True        True        True        True
OPT/imp:            True        True        True        True        True        True
OPT/inte:           True        True        True        True        True        True
OPT/vmode:          True        True        True        True        True        True
OPT/bs:             True        True        True        True        True        True
OPT/pleo:           True        True        True        True        True        True
OPT/redon1:         False       False       False       False       False       False
OPT/redon2:         False       False       False       False       False       False
OPT/neg:            False       False       False       False       False       False
OPT/date:           True        True        True        True        True        True
OPT/mc:             False       False       False       False       False       False
OPT/idrule:         False       False       False       False       False       False
OPT/html:           False       False       False       True        True        True
OPT/latex:          False       False       False       False       False       False

# Priority: from 0 to 9. Default priority is 4.
OPTPRIORITY/tu:     6
OPTPRIORITY/conf:   5
OPTPRIORITY/ocr:    3

OPTDEFAULTUILANG: fr_FR

# Labels
OPTLANG/fr_FR:      Grammalecte (Français)
OPTLABEL/basic:     Typographie
OPTLABEL/typo:      Signes typographiques
OPTLABEL/apos:      Apostrophe typographique|Correction des apostrophes droites. Automatisme possible dans le menu Outils > Options d’autocorrection > Options linguistiques > Guillemets simples > Remplacer (à cocher)
OPTLABEL/esp:       Espaces surnuméraires|Signale les espaces inutiles entre les mots, en début et en fin de ligne.
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
!! Définitions pour les regex                                                                       
!!
!!

DEF: avoir          [aeo]\w*
DEF: etre           [êeésf]\w+
DEF: avoir_etre     [aeêésfo]\w*
DEF: aller          (?:all|v|ir)\w+
DEF: ppas           \w[\w-]+[éiust]e?s?
DEF: infi           \w[\w-]+(?:er|ir|re)
DEF: w_1            \w[\w-]*
DEF: w_2            \w[\w-]+
DEF: w_3            \w[\w-]+\w
DEF: w_4            \w[\w-][\w-]+\w
DEF: w1             \w+







|







201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
!! Définitions pour les regex                                                                       
!!
!!

DEF: avoir          [aeo]\w*
DEF: etre           [êeésf]\w+
DEF: avoir_etre     [aeêésfo]\w*
DEF: aller          (?:ai?ll|v[ao]|ir[aio])\w*
DEF: ppas           \w[\w-]+[éiust]e?s?
DEF: infi           \w[\w-]+(?:er|ir|re)
DEF: w_1            \w[\w-]*
DEF: w_2            \w[\w-]+
DEF: w_3            \w[\w-]+\w
DEF: w_4            \w[\w-][\w-]+\w
DEF: w1             \w+
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423




424
425
426
427
428
429
430
    ^\d+(?:  +|\t+) <<- ~>> *

# bibliographie
__[s>(p_chap_coll_cf)__     [cC](?:f|hap|oll?)([.]) @@$ <<- ~1>> *
__[s](p_page)__             p[.] ?\d+(?:-\d+|) <<- ~>> *
__[s](p_pages)__            pp[.] ?\d+-\d+ <<- ~>> *
__[i](p_figure)__           figure (\d+(?:[.:-]\d+|))  @@0 <<- ~1>> *
__[i](p_article)__          art(?:icle|[.]) (1er|\d+(?:[.:-]\w+|)) @@$ <<- ~1>> *
__[s>(p_av)__               av[.] <<- ~>> av

# versus
__[s>(p_vs)__
    vs[.]
    <<- ->> "vs "               # Pas de point après cette abréviation.
    <<- ~>> vs





# sigles
__<s>(p_sigle1)__
    ([A-Z][.][A-Z][.](?:[A-Z][.])*) +[A-ZÉÀÂÊÎÈÔ]  @@0  <<- ~1>> =\1.replace(".", "")+"."
__[s>(p_sigle2)__
    [a-zA-Z][.][a-zA-Z][.](?:[a-zA-Z][.])*
    <<- not re.search(r"(?i)^(?:i\.e\.|s\.[tv]\.p\.|e\.g\.|a\.k\.a\.|c\.q\.f\.d\.|b\.a\.|n\.b\.)$", \0) ->> =\0.replace(".", "").upper()
    # Sigle. Il est recommandé d’ôter les points pour les sigles.|https://fr.wikipedia.org/wiki/Sigle#Typographie







|








>
>
>
>







408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
    ^\d+(?:  +|\t+) <<- ~>> *

# bibliographie
__[s>(p_chap_coll_cf)__     [cC](?:f|hap|oll?)([.]) @@$ <<- ~1>> *
__[s](p_page)__             p[.] ?\d+(?:-\d+|) <<- ~>> *
__[s](p_pages)__            pp[.] ?\d+-\d+ <<- ~>> *
__[i](p_figure)__           figure (\d+(?:[.:-]\d+|))  @@0 <<- ~1>> *
__[i](p_article)__          art(?:icle|[.]) (1(?:er|ᵉʳ)|\d+(?:[.:-]\w+|)) @@$ <<- ~1>> *
__[s>(p_av)__               av[.] <<- ~>> av

# versus
__[s>(p_vs)__
    vs[.]
    <<- ->> "vs "               # Pas de point après cette abréviation.
    <<- ~>> vs

# version
__[i](p_version_numéro)__
    versions? ([0-9]+(?:[.][0-9]+[a-z]?)*) @@$ <<- ~1>> *

# sigles
__<s>(p_sigle1)__
    ([A-Z][.][A-Z][.](?:[A-Z][.])*) +[A-ZÉÀÂÊÎÈÔ]  @@0  <<- ~1>> =\1.replace(".", "")+"."
__[s>(p_sigle2)__
    [a-zA-Z][.][a-zA-Z][.](?:[a-zA-Z][.])*
    <<- not re.search(r"(?i)^(?:i\.e\.|s\.[tv]\.p\.|e\.g\.|a\.k\.a\.|c\.q\.f\.d\.|b\.a\.|n\.b\.)$", \0) ->> =\0.replace(".", "").upper()
    # Sigle. Il est recommandé d’ôter les points pour les sigles.|https://fr.wikipedia.org/wiki/Sigle#Typographie
488
489
490
491
492
493
494

495
496
497
498
499
500
501
    cac 40 <<- ~>> CAC40



TEST: l’{{A.N.P.E.}} n’existe plus
TEST: ce chien […] ne {{semblez}} pas perdu.
TEST: ce chat {{(…)}} ne {{semblez}} pas perdu.

TEST: ce nouveau moteur de recherche (http://www.cherche-moi-ça.fr/home.php&lang=fr) fonctionne pas mal.
TEST: l’A.M. Turing Award 2015
TEST: Retrouvez-nous sur le Monde.fr
TEST: Arthur D. vient chez nous.
TEST: Arthur D., de toute façon, vient chez nous.
TEST: N.B. : ceci est en réalité superflu.
TEST: Arthur D. « viendra ».







>







492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
    cac 40 <<- ~>> CAC40



TEST: l’{{A.N.P.E.}} n’existe plus
TEST: ce chien […] ne {{semblez}} pas perdu.
TEST: ce chat {{(…)}} ne {{semblez}} pas perdu.
TEST: les tests de la version 3.17.8 {{commence}} demain.
TEST: ce nouveau moteur de recherche (http://www.cherche-moi-ça.fr/home.php&lang=fr) fonctionne pas mal.
TEST: l’A.M. Turing Award 2015
TEST: Retrouvez-nous sur le Monde.fr
TEST: Arthur D. vient chez nous.
TEST: Arthur D., de toute façon, vient chez nous.
TEST: N.B. : ceci est en réalité superflu.
TEST: Arthur D. « viendra ».
557
558
559
560
561
562
563
564
565
566
567
568
569









570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
TEST: rendez-vous avec des {{écrivain(e)s}}                             ->> écrivains et écrivaines|écrivaines et écrivains|écrivain·e·s
TEST: la graphie “{{militant(e)s}}”.
TEST: ces militant·e·s {{acharné}}.


__[i](typo_écriture_épicène_singulier)__
    ({w_2}[éuitsrn])(?:[-·–—./]e|[(]e[)])  @@0
    <<- option("typo") and not \0.endswith("·e") ->> \1·e                                           # Écriture épicène. Utilisez les points médians. (Note : écriture journalistique brouillon.)
    <<- ~>> \1-e

TEST: je suis {{déconsidéré.e}} par ma hiérarchie.
TEST: il faut en parler à l’{{auteur(e)}} et à son agent.











# Majuscules après un point
__[s]/maj(majuscule_après_point)__
    ({w_2})[.] ([a-zéàèî]\w*)  @@0,$
    <<- not re.search("(?i)^(?:etc|[A-Z]|chap|cf|fig|hab|litt|circ|coll|r[eé]f|étym|suppl|bibl|bibliogr|cit|op|vol|déc|nov|oct|janv|juil|avr|sept)$", \1)
    and morph(\1, ":", False) and morph(\2, ":", False)
    -2>> =\2.capitalize()                                                                           # Après un point, une majuscule est généralement requise.

TEST: Je suis là. {{viens}}.                                              ->> Viens
TEST: Ils sont devenus idiots. {{c}}’est peine perdue.

__[s]/maj(majuscule_en_début_phrase)__
    ^ *([a-zéèâàô][\w-]+)  @@$
    <<- after("\w\w[.] +\w+") -1>> =\1.capitalize()                                                     # Majuscule en début de phrase, sauf éventuellement lors d’une énumération.

TEST: {{je}} suis disponible quand tu veux. Mais pas aujourd’hui.


## virgules manquantes
__[i>/virg(virgule_manquante_avant_etc)__   {w_1}( etc[.])  @@$ <<- -1>> , etc.                     # Avant « etc. », il faut mettre une virgule.
__[i>/virg(virgule_manquante_avant_car)__







|





>
>
>
>
>
>
>
>
>













|







562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
TEST: rendez-vous avec des {{écrivain(e)s}}                             ->> écrivains et écrivaines|écrivaines et écrivains|écrivain·e·s
TEST: la graphie “{{militant(e)s}}”.
TEST: ces militant·e·s {{acharné}}.


__[i](typo_écriture_épicène_singulier)__
    ({w_2}[éuitsrn])(?:[-·–—./]e|[(]e[)])  @@0
    <<- option("typo") and not \0.endswith("·e") ->> \1·e                                           # Écriture épicène. Utilisez un point médian. (Note : écriture journalistique brouillon.)
    <<- ~>> \1-e

TEST: je suis {{déconsidéré.e}} par ma hiérarchie.
TEST: il faut en parler à l’{{auteur(e)}} et à son agent.


#__[i](typo_écriture_nombre_invariable)__
#    ({w_2})(?:[-·–—./]s|[(]s[)])  @@0
#    <<- option("typo") and not \0.endswith("·s") ->> \1·s                                           # Utilisez un point médian. (Note : écriture journalistique brouillon.)
#    <<- ~>> \1-s    
#
#TEST: le ou les partis {{appelé(s)}}
#TEST: Appelé·s, levez-vous.


# Majuscules après un point
__[s]/maj(majuscule_après_point)__
    ({w_2})[.] ([a-zéàèî]\w*)  @@0,$
    <<- not re.search("(?i)^(?:etc|[A-Z]|chap|cf|fig|hab|litt|circ|coll|r[eé]f|étym|suppl|bibl|bibliogr|cit|op|vol|déc|nov|oct|janv|juil|avr|sept)$", \1)
    and morph(\1, ":", False) and morph(\2, ":", False)
    -2>> =\2.capitalize()                                                                           # Après un point, une majuscule est généralement requise.

TEST: Je suis là. {{viens}}.                                              ->> Viens
TEST: Ils sont devenus idiots. {{c}}’est peine perdue.

__[s]/maj(majuscule_en_début_phrase)__
    ^ *([a-zéèâàô][\w-]+)  @@$
    <<- after("\w\w[.] +\w+") -1>> =\1.capitalize()                                                 # Majuscule en début de phrase, sauf éventuellement lors d’une énumération.

TEST: {{je}} suis disponible quand tu veux. Mais pas aujourd’hui.


## virgules manquantes
__[i>/virg(virgule_manquante_avant_etc)__   {w_1}( etc[.])  @@$ <<- -1>> , etc.                     # Avant « etc. », il faut mettre une virgule.
__[i>/virg(virgule_manquante_avant_car)__
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
TEST: Mouais{{, ;}}
TEST: Vraiment, bof {{;;}} on ne sait guère qu’en penser.
TEST: Raisons {{:.}} trop, c’est trop.


#__<s]/typo__  °C <<- ->> ℃                                                      # Typographie. Utilisez le signe des degrés approprié.

# Espaces insécables avant unités de mesure
__[s]/unit(unit_nbsp_avant_unités1)__
    ((\d+(?:,\d+[⁰¹²³⁴⁵⁶⁷⁸⁹]?|[⁰¹²³⁴⁵⁶⁷⁸⁹]|)) ?)(?:[kcmµn]?(?:[slgJKΩ]|m[²³]?|Wh?|Hz|dB)|[%‰€$£¥Åℓhj]|min|°C|℃)(?![’'])  @@0,0
    <<- -1>> "\2 "
    # Avec une unité de mesure, mettez un espace insécable.
__[s]/unit(unit_nbsp_avant_unités2)__
    ((\d+(?:,\d+[⁰¹²³⁴⁵⁶⁷⁸⁹]?|[⁰¹²³⁴⁵⁶⁷⁸⁹])) ?)([a-zA-Zµ][a-zA-Z0-9Ωℓ⁰¹²³⁴⁵⁶⁷⁸⁹/·]*)  @@0,0,$
    <<- morphex(\3, ";S", ":[VCR]") or mbUnit(\3) or not spell(\3)
    -1>> "\2 "
    # Si “\3” est une unité de mesure, il manque un espace insécable. Si le nombre se rapporte au mot suivant, c’est aussi valable.
__[s]/unit(unit_nbsp_avant_unités3)__
    ((\d+) )([a-zA-Zµ][a-zA-Z0-9Ωℓ⁰¹²³⁴⁵⁶⁷⁸⁹/·]*)(?![’'])  @@0,0,$
    <<- (not re.search("^[0-9][0-9]{1,3}$", \2) and not spell(\3)) or morphex(\3, ";S", ":[VCR]") or mbUnit(\3)
    -1>> "\2 "
    # Si “\3” est une unité de mesure, il manque un espace insécable. Si le nombre se rapporte au mot suivant, c’est aussi valable.

TEST: Ça a duré {{3}}µs
TEST: Ça a duré {{3,5 }}µs
TEST: il y en a {{3 }}m²
TEST: il a fait {{10}}%
TEST: Ça coûte {{13,4}}¥.
TEST: il mesure {{30,3 }}cm
TEST: il est monté à {{18 }}%
TEST: une température de {{22,4 }}°C
TEST: il en veut {{18}}kg
TEST: il me le propose pour {{243 }}gCO2/kWh
TEST: il me le propose pour {{243,4 }}gCO2/kWh
TEST: en l’an 2000 Urgondorletroll eut une idée
TEST: 1998 s’annonce grandiose.
TEST: il y en a 3,43 milliards.
TEST: je veux 200 euros.


# Espaces insécables
__<s>/nbsp(nbsp_ajout_avant_double_ponctuation)__   \b[?!;]  <<- sCountry != "CA" ->> =" "+\0               # Il manque un espace insécable.
__<s>/nbsp(nbsp_avant_double_ponctuation)__         " ([?!;])"  @@1 <<- ->> " \1"                           # Il manque un espace insécable.
__<s>/nbsp(nbsp_avant_deux_points)__                (?: |\b):(?= |$)  <<- ->> " :"                          # Il manque un espace insécable.
__<s>/nbsp(nbsp_après_chevrons_ouvrants)__          «(?: |\b)  <<- ->> "« "                                 # Il manque un espace insécable.
__<s>/nbsp(nbsp_après_chevrons_fermants)__      ^»(?: |\b)  <<- ->> "» |« "     # Il manque un espace insécable. Le sens de ce guillemet n’est justifié que si ce paragraphe continue le discours du paragraphe précédent.







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







725
726
727
728
729
730
731
































732
733
734
735
736
737
738
TEST: Mouais{{, ;}}
TEST: Vraiment, bof {{;;}} on ne sait guère qu’en penser.
TEST: Raisons {{:.}} trop, c’est trop.


#__<s]/typo__  °C <<- ->> ℃                                                      # Typographie. Utilisez le signe des degrés approprié.


































# Espaces insécables
__<s>/nbsp(nbsp_ajout_avant_double_ponctuation)__   \b[?!;]  <<- sCountry != "CA" ->> =" "+\0               # Il manque un espace insécable.
__<s>/nbsp(nbsp_avant_double_ponctuation)__         " ([?!;])"  @@1 <<- ->> " \1"                           # Il manque un espace insécable.
__<s>/nbsp(nbsp_avant_deux_points)__                (?: |\b):(?= |$)  <<- ->> " :"                          # Il manque un espace insécable.
__<s>/nbsp(nbsp_après_chevrons_ouvrants)__          «(?: |\b)  <<- ->> "« "                                 # Il manque un espace insécable.
__<s>/nbsp(nbsp_après_chevrons_fermants)__      ^»(?: |\b)  <<- ->> "» |« "     # Il manque un espace insécable. Le sens de ce guillemet n’est justifié que si ce paragraphe continue le discours du paragraphe précédent.
912
913
914
915
916
917
918
919


































920
921
922
923
924





925




926
927
928
929
930
931
932
933
934



935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
## Chimie
__[s]/chim(chim_molécules)__
    (?:Ca(?:CO3|SO4)|CO2|(?:H2|Na2)(?:CO3|O|SO4)|[HNO]2|HNO3|Fe2O3|KMnO4|NO2|SiO2|SO[23])
    <<- ->> =\0.replace("2", "₂").replace("3", "₃").replace("4", "₄")                               # Typographie des composés chimiques. [!]

TEST: __chim__ les molécules {{CaCO3}} et {{H2O}}…




































!!!! Grands nombres                                                                                 

__[s]/num(num_grand_nombre_soudé)__
    \d\d\d\d\d+
    <<- not before("NF[  -]?(C|E|P|Q|X|Z|EN(?:[  -]ISO|)) *") ->> =formatNumber(\0)                 # Formatage des grands nombres.










TEST: {{12345}}                               ->> 12 345
TEST: {{123456}}                              ->> 123 456
TEST: {{1234567}}                             ->> 1 234 567
TEST: {{12345678}}                            ->> 12 345 678
TEST: {{023456789}}                           ->> 023 456 789|023 45 67 89|02 345 67 89
TEST: {{0234567890}}                          ->> 0 234 567 890|02 34 56 78 90|023 456 78 90|0234 567-890
TEST: {{12345678901}}                         ->> 12 345 678 901
TEST: {{112798931830912839}}                  ->> 112 798 931 830 912 839
TEST: {{2308393909}}                          ->> 2 308 393 909|2308 393-909





__[s>(num_grand_nombre_avec_points)__
    \d\d?\d?(?:[.]\d\d\d)+(?![0-9])
    <<- option("num") ->> =\0.replace(".", " ")                                                     # Grands nombres : utilisez des espaces insécables plutôt que des points.
    <<- ~>> =\0.replace(".", "")

TEST: il cumule {{200.000.000}} de pertes sèches


__[s](num_grand_nombre_avec_espaces)__
    \d\d?\d?(?: \d\d\d)+
    <<- option("num") ->> =\0.replace(" ", " ")                                                     # Grands nombres : utilisez des espaces insécables.
    <<- ~>> =\0.replace(" ", "")

TEST: Il a perdu {{20 000}} euros à la Bourse en un seul mois.



!!!! Dates                                                                                          









>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>



|
|
>
>
>
>
>

>
>
>
>
|
|
|
|
|
|
|
|
|
>
>
>





|







|







894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
## Chimie
__[s]/chim(chim_molécules)__
    (?:Ca(?:CO3|SO4)|CO2|(?:H2|Na2)(?:CO3|O|SO4)|[HNO]2|HNO3|Fe2O3|KMnO4|NO2|SiO2|SO[23])
    <<- ->> =\0.replace("2", "₂").replace("3", "₃").replace("4", "₄")                               # Typographie des composés chimiques. [!]

TEST: __chim__ les molécules {{CaCO3}} et {{H2O}}…


!!!! Espaces insécables avant unités de mesure                                                      

__[s]/unit(unit_nbsp_avant_unités1)__
    ((\d+(?:,\d+[⁰¹²³⁴⁵⁶⁷⁸⁹]?|[⁰¹²³⁴⁵⁶⁷⁸⁹]|)) ?)(?:[kcmµn]?(?:[slgJKΩ]|m[²³]?|Wh?|Hz|dB)|[%‰€$£¥Åℓhj]|min|°C|℃)(?![’'])  @@0,0
    <<- -1>> "\2 "
    # Avec une unité de mesure, mettez un espace insécable.
__[s]/unit(unit_nbsp_avant_unités2)__
    ((\d+(?:,\d+[⁰¹²³⁴⁵⁶⁷⁸⁹]?|[⁰¹²³⁴⁵⁶⁷⁸⁹])) ?)([a-zA-Zµ][a-zA-Z0-9Ωℓ⁰¹²³⁴⁵⁶⁷⁸⁹/·]*)  @@0,0,$
    <<- morphex(\3, ";S", ":[VCR]") or mbUnit(\3) or not spell(\3)
    -1>> "\2 "
    # Si “\3” est une unité de mesure, il manque un espace insécable. Si le nombre se rapporte au mot suivant, c’est aussi valable.
__[s]/unit(unit_nbsp_avant_unités3)__
    ((\d+) )([a-zA-Zµ][a-zA-Z0-9Ωℓ⁰¹²³⁴⁵⁶⁷⁸⁹/·]*)(?![’'])  @@0,0,$
    <<- (\2.__len__() > 4 and not spell(\3)) or morphex(\3, ";S", ":[VCR]") or mbUnit(\3)
    -1>> "\2 "
    # Si “\3” est une unité de mesure, il manque un espace insécable. Si le nombre se rapporte au mot suivant, c’est aussi valable.

TEST: Ça a duré {{3}}µs
TEST: Ça a duré {{3,5 }}µs
TEST: il y en a {{3 }}m²
TEST: il a fait {{10}}%
TEST: Ça coûte {{13,4}}¥.
TEST: il mesure {{30,3 }}cm
TEST: il est monté à {{18 }}%
TEST: une température de {{22,4 }}°C
TEST: il en veut {{18}}kg
TEST: il me le propose pour {{243 }}gCO2/kWh
TEST: il me le propose pour {{243,4 }}gCO2/kWh
TEST: en l’an 2000 Urgondorletroll eut une idée
TEST: 1998 s’annonce grandiose.
TEST: il y en a 3,43 milliards.
TEST: je veux 200 euros.


!!!! Grands nombres                                                                                 

__[s]/num(num_grand_nombre_soudé)__
    \d\d\d\d+
    <<- not before("NF[  -]?(C|E|P|Q|X|Z|EN(?:[  -]ISO|)) *$") >>>
    <<- \0.__len__() > 4 ->> =formatNumber(\0)                                                      # Formatage des grands nombres.
    <<- __else__
        and after("^(?:,\d+[⁰¹²³⁴⁵⁶⁷⁸⁹]?|[⁰¹²³⁴⁵⁶⁷⁸⁹])")
        or after(r"^[   ]*(?:[kcmµn]?(?:[slgJKΩ]|m[²³]?|Wh?|Hz|dB)|[%‰€$£¥Åℓhj]|min|°C|℃)(?![\w’'])")
    ->> =formatNumber(\0)                                                                           # Formatage des grands nombres.

__[s]/num(num_nombre_quatre_chiffres)__
    (?<!,)(\d\d\d\d)[  ]([a-zA-Zµ][a-zA-Z0-9Ωℓ⁰¹²³⁴⁵⁶⁷⁸⁹/·]*) @@0,$
    <<- morphex(\2, ";S", ":[VCR]") or mbUnit(\2) -1>> =formatNumber(\1)                            # Formatage des grands nombres

TEST: {{12345}}                                 ->> 12 345
TEST: {{123456}}                                ->> 123 456
TEST: {{1234567}}                               ->> 1 234 567
TEST: {{12345678}}                              ->> 12 345 678
TEST: {{023456789}}                             ->> 023 456 789|023 45 67 89|02 345 67 89
TEST: {{0234567890}}                            ->> 0 234 567 890|02 34 56 78 90|023 456 78 90|0234 567-890
TEST: {{12345678901}}                           ->> 12 345 678 901
TEST: {{112798931830912839}}                    ->> 112 798 931 830 912 839
TEST: {{2308393909}}                            ->> 2 308 393 909|2308 393-909
TEST: {{2024}},9                                ->> 2 024
TEST: {{4000}} Å                                ->> 4 000
TEST: {{3240}} µA                               ->> 3 240


__[s>(num_grand_nombre_avec_points)__
    \d\d?\d?(?:[.]\d\d\d)+(?![0-9])
    <<- option("num") ->> =\0.replace(".", " ")                                                     # Grands nombres : utilisez des espaces insécables plutôt que des points.
    <<- ~>> =\0.replace(".", "_")

TEST: il cumule {{200.000.000}} de pertes sèches


__[s](num_grand_nombre_avec_espaces)__
    \d\d?\d?(?: \d\d\d)+
    <<- option("num") ->> =\0.replace(" ", " ")                                                     # Grands nombres : utilisez des espaces insécables.
    <<- ~>> =\0.replace(" ", "_")

TEST: Il a perdu {{20 000}} euros à la Bourse en un seul mois.



!!!! Dates                                                                                          

1063
1064
1065
1066
1067
1068
1069








1070











1071




1072

1073


1074
1075



1076
1077
1078
1079
1080
1081
1082
1083
1084
__[s]/num(num_lettre_O_zéro2)__  [1-9]O <<- not option("ocr") ->> =\0.replace("O", "0")             # S’il s’agit d’un nombre, utilisez le chiffre « 0 » plutôt que la lettre « O ».

TEST: année {{2O11}}                                                      ->> 2011
TEST: {{3O}} (chiffre avec un O).                                         ->> 30


# Nombres ordinaux








__[s]/typo(typo_ordinaux)__              ([0-9]+) ?(?:è|i?[èe]mes?)  @@0 <<- ->> \1ᵉ|\1e            # Nombre ordinal.











__[s]/typo(typo_ordinaux_romains)__      ([IVXLCM]{1,3}) ?(?:è|i?[èe]mes?)  @@0 <<- ->> \1ᵉ|\1e     # Nombre ordinal romain.






TEST: le {{VIième}} siècle                      ->> VI|VIe


TEST: C’est la {{3ème}} fois…                   ->> 3ᵉ|3e
TEST: Non, la {{2è}} fois.                      ->> 2ᵉ|2e



TEST: Le {{XXIème}} siècle.                     ->> XXIᵉ|XXIe
TEST: le {{XXè}} siècle.                        ->> XXᵉ|XXe



!!!! Écritures épicènes invariables                                                                 

__[i](d_typo_écriture_épicène_pluriel)__
    ({w_1}[éuitsrn])-(?:[nt]|)e-s  @@0







>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>

>
|
>
>
|
|
>
>
>
|
|







1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
__[s]/num(num_lettre_O_zéro2)__  [1-9]O <<- not option("ocr") ->> =\0.replace("O", "0")             # S’il s’agit d’un nombre, utilisez le chiffre « 0 » plutôt que la lettre « O ».

TEST: année {{2O11}}                                                      ->> 2011
TEST: {{3O}} (chiffre avec un O).                                         ->> 30


# Nombres ordinaux
__[s]/typo(typo_ordinaux_premier)__
    1 ?(?:ier|i?ère)s?
    <<- ->> =\0.replace(" ", "").replace("è", "").replace("i", "").replace("e", "ᵉ").replace("r", "ʳ").replace("s", "ˢ")
    # Nombre ordinal. Premier : 1ᵉʳ. Première : 1ʳᵉ. Premier : 1ᵉʳˢ. Première : 1ʳᵉˢ.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=4271
__[s]/typo(typo_ordinaux_deuxième)__
    2 ?nde?s?
    <<- ->> =\0.replace(" ", "").replace("n", "").replace("d", "ᵈ").replace("e", "ᵉ").replace("s", "ˢ")
    # Nombre ordinal. Second : 2ᵈ. Seconde : 2ᵈᵉ. Seconds : 2ᵈˢ. Secondes : 2ᵈᵉˢ.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=4271
__[s]/typo(typo_ordinaux_nième)__
    ([0-9]+) ?(?:è|i?[èe]me)s?  @@0
    <<- \0.endswith("s") ->> \1ᵉˢ                                                                   # Nombre ordinal singulier. Exemples : 2ᵉ, 3ᵉ, 4ᵉ…|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=4271
    <<- __else__ ->> \1ᵉ                                                                            # Nombre ordinal pluriel. Exemples : 2ᵉˢ, 3ᵉˢ, 4ᵉˢ…|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=4271
__[s]/typo(typo_ordinaux_romain_premier)__
    I ?(?:ier|i?ère)s?
    <<- ->> =\0.replace(" ", "").replace("è", "").replace("i", "").replace("e", "ᵉ").replace("r", "ʳ").replace("s", "ˢ")
    # Nombre ordinal romain. Premier : 1ᵉʳ. Première : Iʳᵉ. Premier : Iᵉʳˢ. Première : Iʳᵉˢ.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=4271
__[s]/typo(typo_ordinaux_romain_deuxième)__
    II ?nde?s?
    <<- ->> =\0.replace(" ", "").replace("n", "").replace("d", "ᵈ").replace("e", "ᵉ").replace("s", "ˢ")
    # Nombre ordinal romain. Second : IIᵈ. Seconde : IIᵈᵉ. Seconds : IIᵈˢ. Secondes : IIᵈᵉˢ.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=4271
__[s]/typo(typo_ordinaux_romains_nième)__
    ([IVXLCM]{1,3}) ?(?:è|i?[èe]me)s?  @@0
    <<- not morph(\0, ":G", False) >>>
    <<- \0.endswith("s") ->> \1ᵉˢ                                                                   # Nombre ordinal romain singulier. Exemples : IIᵉ, IIIᵉ, IVᵉ…|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=4271
    <<- __else__ ->> \1ᵉ                                                                            # Nombre ordinal romain pluriel. Exemples : IIᵉˢ, IIIᵉˢ, IVᵉˢ…|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=4271

TEST: la {{1ière}} fois, c’est la plus dure     ->> 1ʳᵉ
TEST: le {{1ier}} de chaque semaine             ->> 1ʳ
TEST: le {{2nd}} du mois                        ->> 2ᵈ
TEST: les {{3ièmes}} années                     ->> 3ᵉˢ
TEST: C’est la {{3ème}} fois…                   ->> 3ᵉ
TEST: Non, la {{2è}} fois.                      ->> 2ᵉ
TEST: François {{Iier}}                         ->> Iᵉʳ
TEST: le {{IInd}} siècle                        ->> IIᵈ
TEST: le {{VIième}} siècle                      ->> VIᵉ
TEST: Le {{XXIème}} siècle.                     ->> XXIᵉ
TEST: le {{XXè}} siècle.                        ->> XXᵉ



!!!! Écritures épicènes invariables                                                                 

__[i](d_typo_écriture_épicène_pluriel)__
    ({w_1}[éuitsrn])-(?:[nt]|)e-s  @@0
1647
1648
1649
1650
1651
1652
1653

1654
1655
1656
1657
1658
1659
1660
1661
1662
1663


1664


1665
1666
1667
1668
1669
1670
1671


!!!! A / À: accentuation la préposition en début de phrase

__<s]/typo(typo_À_début_phrase1)__
    ^ *(A) (?!t[’-](?:ils?|elles?|on))({w_2})  @@*,$
    <<- morphex(\2, ":[GNAY]", ":(?:Q|3s)|>(?:priori|post[eé]riori|contrario|capella|fortiori) ")

    -1>> À                                                                                          # S’il s’agit de la préposition « à », il faut accentuer la majuscule.
__<s>/typo(typo_À_début_phrase2)__
    ^ *(A) [ldnms]’  @@*  <<- -1>> À                                                                # S’il s’agit de la préposition « à », il faut accentuer la majuscule.
__<s>/typo(typo_À_début_phrase3)__
    ^ *(A) t’(?!il |elle |ont? )  @@*  <<- -1>> À                                                   # S’il s’agit de la préposition « à », il faut accentuer la majuscule.

TEST: {{A}} vaincre sans péril, on triomphe sans gloire.
TEST: « {{A}} partir de maintenant, ce ne sera plus comme avant.
TEST: — {{A}} n’en plus pouvoir
TEST: — {{A}} t’emmener loin de tout ceci.


TEST: A priori, nul ne peut y parvenir sans une aide extérieure.





!!!
!!!
!!! Désambiguïsation                                                                                
!!!







>










>
>

>
>







1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733


!!!! A / À: accentuation la préposition en début de phrase

__<s]/typo(typo_À_début_phrase1)__
    ^ *(A) (?!t[’-](?:ils?|elles?|on))({w_2})  @@*,$
    <<- morphex(\2, ":[GNAY]", ":(?:Q|3s)|>(?:priori|post[eé]riori|contrario|capella|fortiori) ")
        or (\2 == "bientôt" and isEnd())
    -1>> À                                                                                          # S’il s’agit de la préposition « à », il faut accentuer la majuscule.
__<s>/typo(typo_À_début_phrase2)__
    ^ *(A) [ldnms]’  @@*  <<- -1>> À                                                                # S’il s’agit de la préposition « à », il faut accentuer la majuscule.
__<s>/typo(typo_À_début_phrase3)__
    ^ *(A) t’(?!il |elle |ont? )  @@*  <<- -1>> À                                                   # S’il s’agit de la préposition « à », il faut accentuer la majuscule.

TEST: {{A}} vaincre sans péril, on triomphe sans gloire.
TEST: « {{A}} partir de maintenant, ce ne sera plus comme avant.
TEST: — {{A}} n’en plus pouvoir
TEST: — {{A}} t’emmener loin de tout ceci.
TEST: {{A}} bientôt, mon ami.
TEST: A bientôt fini son devoir.
TEST: A priori, nul ne peut y parvenir sans une aide extérieure.
TEST: A devient notre meilleure chance d’y parvenir.




!!!
!!!
!!! Désambiguïsation                                                                                
!!!
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842

1843
1844
1845
1846
1847
1848
1849
# C’était / Celait
__[i]/ocr(ocr_c_était)__    celait <<- ->> c’était                                                  # Erreur de numérisation ?

TEST: __ocr__ {{celait}} perdu d’avance.


# cette / celte
__[i]/ocr(ocr_cette1)__     (celte) ({w_2})  @@0,$ <<- morph(\2, ":N.*:f:s", False) -1>> cette      # Erreur de numérisation ?

TEST: __ocr__ mais {{celte}} femme semblait savoir ce qu’elle faisait.



# cette / cotte
__[i]/ocr(ocr_cette2)__     cotte <<- not morph(word(-1), ":D.*:f:[si]") ->> cette                  # Erreur de numérisation ?

TEST: __ocr__ on poirautait, {{cotte}} mariée n’arrivait pas à se décider.








|


>







1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
# C’était / Celait
__[i]/ocr(ocr_c_était)__    celait <<- ->> c’était                                                  # Erreur de numérisation ?

TEST: __ocr__ {{celait}} perdu d’avance.


# cette / celte
__[i]/ocr(ocr_cette1)__     (cel[tl]e) ({w_2})  @@0,$ <<- morph(\2, ":N.*:f:s", False) -1>> cette   # Erreur de numérisation ?

TEST: __ocr__ mais {{celte}} femme semblait savoir ce qu’elle faisait.
TEST: __ocr__ avec {{celle}} tentative d’humour, il pensait nous faire rire.


# cette / cotte
__[i]/ocr(ocr_cette2)__     cotte <<- not morph(word(-1), ":D.*:f:[si]") ->> cette                  # Erreur de numérisation ?

TEST: __ocr__ on poirautait, {{cotte}} mariée n’arrivait pas à se décider.

2343
2344
2345
2346
2347
2348
2349









2350
2351
2352
2353
2354
2355
2356
2357
TEST: __ocr__ d’un fil de plastique transparent, {{Il}} l’agite
TEST: __ocr__ sur une glace noire {{Les}} lumières du port
TEST: __ocr__ le roulis du bateau {{Le}} faisant heurter
TEST: __ocr__ si vous {{La}} désirez
TEST: __ocr__ sa main se referme sur {{Je}} livre











__[s>/ocr(ocr_casse2)__
    [LDNMTSCÇ]’
    <<- before(r"(?i)\w") ->> =\0.lower()                                                           # Erreur de numérisation ? Casse douteuse.

TEST: __ocr__ regarde dans l’obscurité de {{L’}}entrepôt


## Lettres isolées







>
>
>
>
>
>
>
>
>
|







2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
TEST: __ocr__ d’un fil de plastique transparent, {{Il}} l’agite
TEST: __ocr__ sur une glace noire {{Les}} lumières du port
TEST: __ocr__ le roulis du bateau {{Le}} faisant heurter
TEST: __ocr__ si vous {{La}} désirez
TEST: __ocr__ sa main se referme sur {{Je}} livre


__[s]/ocr(ocr_casse2)__
    {w2}-(On|Ils?|Elles?|Tu|Je|Nous|Vous|Mêmes?|Ci|Là|Une?s) @@$
    <<- -1>> =\1.lower()                                                                            # Erreur de numérisation ? Casse douteuse.

TEST: __ocr__ Part-{{On}} demain ?
TEST: __ocr__ À ce compte-{{Ci}}, on n’en viendra jamais à bout.
TEST: __ocr__ Quelques-{{Uns}} sont incapables d’y parvenir.


__[s>/ocr(ocr_casse3)__
    [LDNMTSCÇ]’
    <<- before(r"(?i)\w") ->> =\0.lower()                                                           # Erreur de numérisation ? Casse douteuse.

TEST: __ocr__ regarde dans l’obscurité de {{L’}}entrepôt


## Lettres isolées
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402































2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
    # Double négation : les mots « pas \1 » ne devraient pas se succéder. Si ces mots appartiennent à des propositions distinctes, une virgule est peut-être préférable.

TEST: Ce que tu ne fais {{pas jamais}}.


### incohérences globales (attention à la casse du 2e mot, car beaucoup de sigles peuvent tromper)
__[s](incohérences_globales1)__
    ([clmtsCLMTS]es|[nvNV]os|[aA]ux) ([cdlmst]es|[nv]os|cettes?|[mts]a|mon|je|tu|ils?|elle?|[vn]ous|on)  @@0,$
    <<- -2>> =suggSimil(\2, ":[NA].*:[pi]")         # Incohérence : les mots “\1” et “\2” ne devraient pas se succéder.
__[s](incohérences_globales2)__
    ([cC]e(?:tte|t|)|[mtsMTS]a|[mM]on|[aA]u) ([cdlmst]es|[nv]os|cettes?|[mts]a|mon|je|tu|ils?|elle?|[vn]ous|on)  @@0,$
    <<- -2>> =suggSimil(\2, ":[NA].*:[si]")         # Incohérence : les mots “\1” et “\2” ne devraient pas se succéder.































__[s](incohérences_globales3)__
    ([dD]es) ([cdlmst]es|[nv]os|cettes?|[mts]a|mon|je|tu|ils?|elle?|[vn]ous|on)  @@0,$
    <<- -2>> =suggSimil(\2, ":[NA].*:[pi]")         # Incohérence : les mots “\1” et “\2” ne devraient pas se succéder.
    <<- -1>> de                                     # Incohérence : les mots “\1” et “\2” ne devraient pas se succéder.

TEST: Au MES, rien de nouveau
TEST: {{Ces}} {{cette}} canaille qui nous a donné tant de fil à retordre.
TEST: Mon {{il}} est une merveille.
TEST: je ne sais {{des}} {{ses}} choses.



!!
!!
!!!! Style                                                                                          







|


|

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>





<
<
<







2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510



2511
2512
2513
2514
2515
2516
2517
    # Double négation : les mots « pas \1 » ne devraient pas se succéder. Si ces mots appartiennent à des propositions distinctes, une virgule est peut-être préférable.

TEST: Ce que tu ne fais {{pas jamais}}.


### incohérences globales (attention à la casse du 2e mot, car beaucoup de sigles peuvent tromper)
__[s](incohérences_globales1)__
    ([clmtsCLMTS]es|[nvNV]os) ([cdlmst]es|[nv]os|cettes?|[mts]a|mon|je|tu|ils?|elle?|[vn]ous|on)  @@0,$
    <<- -2>> =suggSimil(\2, ":[NA].*:[pi]")         # Incohérence : les mots “\1” et “\2” ne devraient pas se succéder.
__[s](incohérences_globales2)__
    ([cC]e(?:tte|t|)|[mtsMTS]a|[mM]on) ([cdlmst]es|[nv]os|cettes?|[mts]a|mon|je|tu|ils?|elle?|[vn]ous|on)  @@0,$
    <<- -2>> =suggSimil(\2, ":[NA].*:[si]")         # Incohérence : les mots “\1” et “\2” ne devraient pas se succéder.

TEST: {{Ces}} {{cette}} canaille qui nous a donné tant de fil à retordre.
TEST: Mon {{il}} est une merveille.


__[s](incohérence_globale_au_qqch)__
    ([aA]u) ({w2})  @@0,$
    <<- not \2.isupper() >>>
    <<- morph(\2, ">(?:[cdlmst]es|[nv]os|cettes?|[mts]a|mon|je|tu|ils?|elle?|[vn]ous|on|parce) ", False)
    -2>> =suggSimil(\2, ":[NA].*:[si]")                                                             # Incohérence : les mots “\1” et “\2” ne devraient pas se succéder.
    <<- __else__ and morph(\2, ">quelle ", False) ->> auquel|auxquels|auxquelles                    # Incohérence. Soudez les deux mots.|https://fr.wiktionary.org/wiki/auquel
    <<- __else__ and \2 == "combien" and morph(word(1), ":[AY]", False) -1>> ô                      # Incohérence probable.|https://fr.wiktionary.org/wiki/%C3%B4_combien

TEST: au {{nos}} enfants.
TEST: {{Au quel}} faut-il s’adresser ?
TEST: Au MES, rien de nouveau.


__[s](incohérence_globale_aux_qqch)__
    ([aA]ux) ({w2})  @@0,$
    <<- not \2.isupper() >>>
    <<- morph(\2, ">(?:[cdlmst]es|[nv]os|cettes?|[mts]a|mon|je|tu|ils?|elle?|[vn]ous|on|parce) ", False)
    -2>> =suggSimil(\2, ":[NA].*:[pi]")                                                             # Incohérence : les mots “\1” et “\2” ne devraient pas se succéder.
    <<- __else__ and morph(\2, ">quelle ", False) ->> auxquels|auxquelles                           # Incohérence. Soudez les deux mots.|https://fr.wiktionary.org/wiki/auquel
    <<- __else__ and \2 == "combien" and morph(word(1), ":[AY]", False) -1>> ô                      # Incohérence probable.|https://fr.wiktionary.org/wiki/%C3%B4_combien

TEST: ils jouent aux {{des}}.
TEST: {{Aux quels}} a-t-il adressé sa requête. ?
TEST: Des individus {{aux}} combien sensibles aux usages.


__[s](incohérences_globales3)__
    ([dD]es) ([cdlmst]es|[nv]os|cettes?|[mts]a|mon|je|tu|ils?|elle?|[vn]ous|on)  @@0,$
    <<- -2>> =suggSimil(\2, ":[NA].*:[pi]")         # Incohérence : les mots “\1” et “\2” ne devraient pas se succéder.
    <<- -1>> de                                     # Incohérence : les mots “\1” et “\2” ne devraient pas se succéder.




TEST: je ne sais {{des}} {{ses}} choses.



!!
!!
!!!! Style                                                                                          
2546
2547
2548
2549
2550
2551
2552

2553
2554
2555
2556
2557
2558
2559
__[i]/pleo(pleo_cirrhose)__             (cirrhoses?) du foie @@0 <<- ->> \1                                                                     # Pléonasme.
__[i]/pleo(pleo_collaborer)__           (collabor\w+) ensemble @@0 <<- morph(\1, ">collaborer ", False) ->> \1                                  # Pléonasme.
__[i]/pleo(pleo_comme_par_exemple)__    comme par exemple <<- ->> comme|par exemple                                                             # Pléonasme.
__[i]/pleo(pleo_comparer)__             (compar\w+) entre (?:eux|elles) @@0 <<- morph(\1, ">comparer ", False) ->> \1                           # Pléonasme.
__[i]/pleo(pleo_contraindre)__          (contrai\w+) malgré (?:soi|eux|lui|moi|elle|toi) @@0 <<- morph(\1, ">contraindre ", False) ->> \1       # Pléonasme.
__[i]/pleo(pleo_descendre)__            (descend\w+) en bas(?! de) @@0 <<- ->> \1                                                               # Pléonasme.
__[i]/pleo(pleo_dessiner)__             (dessin\w+) un dessin @@0 <<- ->> \1                                                                    # Pléonasme.

__[i]/pleo(pleo_donc_par_conséquent)__  donc par conséquent <<- ->> donc|par conséquent|c’est pourquoi                                          # Pléonasme.
__[i]/pleo(pleo_enchevêtrer)__          (enchevêtr\w+) les uns dans les autres @@0 <<- morph(\1, ">enchevêtrer ", False) ->> \1                 # Pléonasme.
__[i]/pleo(pleo_entraider)__            (entraid\w+) (?:mutuellement|les uns les autres) @@0 <<- morph(\1, ">entraider ", False) ->> \1         # Pléonasme.
__[i]/pleo(pleo_entraide)__             (entraides?) mutuelles? @@0 <<- ->> \1                                                                  # Pléonasme.
__[i]/pleo(pleo_erreur)__               (erreurs?) involontaires? @@0 <<- ->> \1                                                                # Pléonasme.
__[i]/pleo(pleo_étape)__                (étapes?) intermédiaires? @@0 <<- ->> \1                                                                # Pléonasme.
__[i]/pleo(pleo_hasard)__               (hasards?) imprévus? @@0 <<- ->> \1                                                                     # Pléonasme.







>







2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
__[i]/pleo(pleo_cirrhose)__             (cirrhoses?) du foie @@0 <<- ->> \1                                                                     # Pléonasme.
__[i]/pleo(pleo_collaborer)__           (collabor\w+) ensemble @@0 <<- morph(\1, ">collaborer ", False) ->> \1                                  # Pléonasme.
__[i]/pleo(pleo_comme_par_exemple)__    comme par exemple <<- ->> comme|par exemple                                                             # Pléonasme.
__[i]/pleo(pleo_comparer)__             (compar\w+) entre (?:eux|elles) @@0 <<- morph(\1, ">comparer ", False) ->> \1                           # Pléonasme.
__[i]/pleo(pleo_contraindre)__          (contrai\w+) malgré (?:soi|eux|lui|moi|elle|toi) @@0 <<- morph(\1, ">contraindre ", False) ->> \1       # Pléonasme.
__[i]/pleo(pleo_descendre)__            (descend\w+) en bas(?! de) @@0 <<- ->> \1                                                               # Pléonasme.
__[i]/pleo(pleo_dessiner)__             (dessin\w+) un dessin @@0 <<- ->> \1                                                                    # Pléonasme.
__[i]/pleo(pleo_dorénavant)__           à (?:partir|compter) de dorénavant <<- ->> dorénavant|à partir de maintenant                            # Pléonasme.
__[i]/pleo(pleo_donc_par_conséquent)__  donc par conséquent <<- ->> donc|par conséquent|c’est pourquoi                                          # Pléonasme.
__[i]/pleo(pleo_enchevêtrer)__          (enchevêtr\w+) les uns dans les autres @@0 <<- morph(\1, ">enchevêtrer ", False) ->> \1                 # Pléonasme.
__[i]/pleo(pleo_entraider)__            (entraid\w+) (?:mutuellement|les uns les autres) @@0 <<- morph(\1, ">entraider ", False) ->> \1         # Pléonasme.
__[i]/pleo(pleo_entraide)__             (entraides?) mutuelles? @@0 <<- ->> \1                                                                  # Pléonasme.
__[i]/pleo(pleo_erreur)__               (erreurs?) involontaires? @@0 <<- ->> \1                                                                # Pléonasme.
__[i]/pleo(pleo_étape)__                (étapes?) intermédiaires? @@0 <<- ->> \1                                                                # Pléonasme.
__[i]/pleo(pleo_hasard)__               (hasards?) imprévus? @@0 <<- ->> \1                                                                     # Pléonasme.
2614
2615
2616
2617
2618
2619
2620

2621
2622
2623
2624
2625
2626
2627
TEST: {{cirrhose du foie}}                          ->> cirrhose
TEST: {{s’avérer vrai}}                             ->> s’avérer exact
TEST: {{avérées vraies}}                            ->> avérées
TEST: {{bourrasques de vent}}                       ->> bourrasques
TEST: {{contraint malgré lui}}                      ->> contraint
TEST: {{contraindre malgré eux}}                    ->> contraindre
TEST: {{applaudir des deux mains}}                  ->> applaudir

TEST: {{erreurs involontaires}}                     ->> erreurs
TEST: {{hasards imprévus}}                          ->> hasards
TEST: {{méandres sinueux}}                          ->> méandres
TEST: {{hémorragies de sang}}                       ->> hémorragies
TEST: des {{orages électriques}}                    ->> orages
TEST: {{perspectives d’avenir}}                     ->> perspectives
TEST: {{marche à pied}}                             ->> marche







>







2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
TEST: {{cirrhose du foie}}                          ->> cirrhose
TEST: {{s’avérer vrai}}                             ->> s’avérer exact
TEST: {{avérées vraies}}                            ->> avérées
TEST: {{bourrasques de vent}}                       ->> bourrasques
TEST: {{contraint malgré lui}}                      ->> contraint
TEST: {{contraindre malgré eux}}                    ->> contraindre
TEST: {{applaudir des deux mains}}                  ->> applaudir
TEST: Car {{à partir de dorénavant}}, ce sera…      ->> dorénavant|à partir de maintenant
TEST: {{erreurs involontaires}}                     ->> erreurs
TEST: {{hasards imprévus}}                          ->> hasards
TEST: {{méandres sinueux}}                          ->> méandres
TEST: {{hémorragies de sang}}                       ->> hémorragies
TEST: des {{orages électriques}}                    ->> orages
TEST: {{perspectives d’avenir}}                     ->> perspectives
TEST: {{marche à pied}}                             ->> marche
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943








2944
2945
2946
2947
2948
2949
2950
#__[i]/conf__
#    très +(bien|\w+ent) +({w2})  @@w,$
#    <<- morph(\1, ":W", False) and morphex(\2, ":[123][sp]", ":[GAQW]") -2>> _
#    # Incohérence avec « très » : « \2 » n’est ni un adjectif, ni un participe passé, ni un adverbe.

 
__[i]/conf(conf_très_verbe)__
    très +(?!envie)({w2})  @@$
    <<- morphex(\1, ":(?:Y|[123][sp])", ":[AQW]") -1>> =suggSimil(\1, ":[AW]")              # Incohérence avec « très » : « \1 » n’est ni un adjectif, ni un participe passé, ni un adverbe.

TEST: Il est très {{cite}}.
TEST: très {{suivit}} par ce détective
TEST: il était très {{habille}}


__[i]/conf(conf_presque_trop_vconj)__
    (presque|trop) +({w2})  @@0,$
    <<- morphex(\2, ":[123][sp]", ":[GNAQWM]") and not before(r"(?i)\bce que? ") -2>> _     # Incohérence probable avec « \1 » : « \2 » n’est ni un adjectif, ni un participe passé, ni un adverbe.

TEST: J’ai trop {{mangeais}}.
TEST: Ce que nous réussissons presque sera considéré comme un échec.










# élimination de presque
__[i](p_presque)__
    presque <<- ~>> *

__[i]/conf(conf_chez_vconj)__
    chez +({w2})  @@$







|
|






|
|
|




>
>
>
>
>
>
>
>







3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
#__[i]/conf__
#    très +(bien|\w+ent) +({w2})  @@w,$
#    <<- morph(\1, ":W", False) and morphex(\2, ":[123][sp]", ":[GAQW]") -2>> _
#    # Incohérence avec « très » : « \2 » n’est ni un adjectif, ni un participe passé, ni un adverbe.

 
__[i]/conf(conf_très_verbe)__
    très +(?!envie)({w_2})  @@$
    <<- morphex(\1, ":(?:Y|[123][sp])", ":[AQW]") -1>> =suggSimil(\1, ":[AW]")                      # Incohérence avec « très » : « \1 » n’est ni un adjectif, ni un participe passé, ni un adverbe.

TEST: Il est très {{cite}}.
TEST: très {{suivit}} par ce détective
TEST: il était très {{habille}}


__[i]/conf(conf_trop_vconj)__
    trop +({w_2})  @@$
    <<- morphex(\1, ":[123][sp]", ":(?:[GNAQWM]|3p)") and not before(r"(?i)\bce que? ") -1>> _      # Incohérence probable avec « trop » : « \1 » n’est ni un adjectif, ni un participe passé, ni un adverbe.

TEST: J’ai trop {{mangeais}}.
TEST: Ce que nous réussissons presque sera considéré comme un échec.


__[i]/conf(conf_presque_trop_vconj)__
    presque +({w2})  @@$
    <<- morphex(\1, ":[123][sp]", ":[GNAQWM]") and not before(r"(?i)\bce que? |ou $") -1>> _        # Incohérence probable avec « presque » : « \1 » n’est ni un adjectif, ni un participe passé, ni un adverbe.

TEST: presque {{délaissait}} par tout le monde.
TEST: Tout le monde ou presque déteste ces gens-là.


# élimination de presque
__[i](p_presque)__
    presque <<- ~>> *

__[i]/conf(conf_chez_vconj)__
    chez +({w2})  @@$
3025
3026
3027
3028
3029
3030
3031

3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083

3084
3085
3086
3087
3088
3089
3090
__[i]/conf(conf_a_à_qui_pronom_à)__
    qui (?:l(?:ui|eur)(?: en|)|nous|vous|en|y) +(à)  @@$ <<- -1>> a                                 # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez :
__[i]/conf(conf_a_à_qui_a)__
    qui (à) +({w_2})  @@4,$  <<- morphex(\2, ":Q", ":M[12P]") -1>> a                                # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez :
__[i]/conf(conf_a_à_le)__
    (à le) ({w_2})  @@0,5
    <<- morphex(\2, ":[NAQ].*:[me]", ":(?:Y|Oo)") -1>> a le|au

    <<- morphex(\2, ":[NAQ].*:f", ":(?:Y|Oo)") -1>> à la
    # Confusion. Ou vous confondez “a” (préposition) avec “a” (avoir), ou vous devez employer “au”. Exemple : _à_ midi, il _a_ pris son déjeuner _au_ restaurant.
__[i]/conf(conf_a_à_les)__
    (à les) ({w_2})  @@0,6  <<- morphex(\2, ":[NAQ]", ":(?:Y|Oo)") -1>> a les|aux
    # Confusion. Ou vous confondez “a” (préposition) avec “a” (avoir), ou vous devez employer “aux”. Exemple : Elle _a_ donné du travail _aux_ employés _à_ profusion.
__[i]/conf(conf_a_à_au_aux)__
    (à) aux?(?! (?:moins|plus)) @@0 <<- -1>> a                                                      # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez :
__[i]/conf(conf_a_à_base_cause)__
    (a) (?:base|cause) d(?:es?|u) @@0 <<- not before(r"(?i)\bce que?\b") -1>> à                     # Confusion. Utilisez la préposition « à ».
__[i]/conf(conf_a_à_faim_peur_honte_soif)__
    (à) +(?:faim|peur|honte|soif) @@0 <<- -1>> a                                                    # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez : 
__[i]/conf(conf_a_à_part)__
    (a) part ({w1}) @@0,7 <<- morph(\2, ":(?:M[12]|D|Oo)") -1>> à                                   # Confusion probable.
__[i]/conf(conf_a_à_les_à)__
    les (à)(?! côtés| peu près| prioris?| post[eé]rioris?| valoirs?| pics?| propos) @@4 <<- -1>> a
    # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez : 
__[i]/conf(conf_a_à_avant_conj_prep)__
    (à) +(?:a(?:fin|lors|près|uprès|ux?(?! moins| plus| mieux)|vant|vec)|au-de(?:dans|hors|là|sso?us|vant)|chez|d(?:ans|evant|ès|déjà|onc|urant)|lorsque?|malgré|par(?:ce|mi|)|p(?:endant|our|uisque)|que?|sur|tandis)  @@0
    <<- -1>> a                                                                                      # Confusion probable : “à” est une préposition. Écrivez “a” pour la conjugaison de “avoir”.
__[i]/conf(conf_a_participe_passé_ou_vconj)__
    (à) +({w_2})  @@0,$
    <<- \2.islower() and \2 != "coté" >>>
    <<- morphex(\2, ":(?:V.......[_z][az].*:Q|V1.*:Ip:2p)", ":[MGWNY]") -1>> a                      # Confusion probable : “à” est une préposition. Pour le verbe “avoir”, écrivez :
    <<- __also__ and morph(\2, "V1.*:(?:Ip:2p|Q)", False) and not before(r"(?i)\b(?:il +|elle +|on +|l(?:es|ui|leur) +|[nv]ous +|y +|en +|[nmtsld]’)$")
    -2>> =suggVerbInfi(@)                                                                           # Le verbe devrait être à l’infinitif.
    <<- __else__ and morph(\2, ":[123][sp]") and not \2.startswith("tord") >>>
    <<- morph(\2, ":V2.*:Ip:3s") -2>> =suggVerbPpas(@, ":m:s")                                      # Incohérence : “\1” est une préposition. “\2” est un verbe conjugué.
    <<- __also__ -1>> a                                                                             # Confusion probable : “à” est une préposition. Pour le verbe “avoir”, écrivez :
    <<- __else__ -2>> _                                                                             # Incohérence : “\1” est une préposition. “\2” est un verbe conjugué.

__[i]/conf(conf_a_à_locutions1)__
    (a) (?:nouveau|présent|(?:bonne distance|bord|cause|contre-courant|côté|court|défaut|droite|gauche|l’(?:arrière|autre bout|écart|égard|extérieur|aune|avant|encontre|ins(?:u|tar)|intérieur|opposé)|la (?:portée|suite)|partir|portée|propos|rebours) d(?:es?|u))  @@0
    <<- -1>> à                                                                                      # Confusion. Utilisez la préposition “à”.
__[s]/conf(conf_a_à_locutions2)__
    (a) (?:califourchon|contre(?:cœur|temps)|côté d(?:e|’\w[\w-]+)|demi-mot|nouveau|présent|rebrousse-poil|regret|travers|tout-va|l’(?:heure (?:actuelle|qu il est)|accoutumée|amiable|avance|aven(?:ir|ant)|air libre|aveuglette|emporte-pièce|évidence|exclusion de toute autre chose|improviste|inverse|ordre du jour|œil nu|en croire|un(?:animité| (?:d’entre eux|des leurs)|e (?:d’entre elles|des leurs)))|la (?:bonne franquette|con|dér(?:ive|obée)|diable|fois|limite du supportable|lumière de tout ce(?:ci|la)|mords-moi-le-nœud|papa|petite semaine|pointe du progrès|queue leu leu|rescousse|sauvette|surprise générale|virgule près|volée)|partir (?:de (?:demain|là|maintenant|rien)|d’(?:aujourd’hui|hier|ici))|au(?:cun prix|trui|tre chose)|bas co[ûu]t|bâ(?:bord|tons rompus)|beaucoup près|belles dents|bien (?:des égards|y (?:penser|réfléchir|songer))|bon (?:compte|escient|droit)|bout (?:de (?:bras|souffle|forces?)|portant|touchant)|bras (?:ouverts|le corps)|brève échéance|but non lucratif|cause d(?:e (?:ça|[mt]oi|lui|[nv]ous)|’e(?:lles?|ux))|ce (?:compte-là|moment-là|titre)|cet (?:égard|instant(?: précis|))|cette (?:époque(?: de l’année|)|heure de la (?:journée|nuit))|chaque (?:fois|instant)|chaudes larmes|cœur (?:joie|ouvert|perdu)|ciel ouvert|contre-cœur|corps perdu|cou(?:p sûr|per le souffle|rt terme|rte (?:échéance|portée))|de nombreuses reprises|des kilomètres à la ronde|double (?:titre|tranchant)|durée limitée|en (?:juger par (?:[mts]on|[nv]otre|leur) expérience|perdre (?:haleine|la tête))|faible (?:allure|revenu)|feu et à sang|flanc de (?:colline|montagne)|fleur de peau|géométrie variable|grand(?:-peine|e échelle)|haut risque|hue et à dia|huis clos|intervalles (?:ir|)réguliers|juste (?:raison|titre)|long terme|longue(?: échéance| portée|ur (?:de (?:temps|journée))|d’année)|loyer modéré|main (?:armée|droite|gauche|levée)|maint(?:s égards|es reprises)|marche forcée|merveille|mi-(?:course|distance|temps)|mi(?:di|nuit)(?: pile|)|moindres frais|moyen(?: terme|ne échéance)|mots couverts|ne (?:jamais|pas|rien|guère)|n’en (?:pas douter|point douter|plus finir)|outrance|parler franc|part (?:entière|ça|ce(?:la|ci))|partir de là|part(?:ir de rien|s égales)|pas de (?:géant|loup|tortue|velours)|personne en danger|perte de vue|petit(?: feu|e (?:dose|échelle))|peu (?:de choses? |)près|pieds joints|pile ou face|plat(?: ventre|e couture)|plein(?: (?:régime|temps|nez)|s poumons)|plus (?:forte raison|d’un titre)|point nommé|portée de main|première vue|prix (?:cassé|modique)s?|proprement parler|qui (?:mieux mieux|que ce soit|de droit)|quelque distance|quelques exceptions près|ras bords?|rude épreuve|tel point|temps (?:plein|partiel|complet)|tête reposée|tire[ -]d’aile|titre (?:conservatoire|d’exemple|indicatif|informatif|grâcieux|personnel|posthume)|tombeau ouvert|tort (?:ou à raison|et à travers)|tour de (?:bras|rôle)|tous (?:crins|points de vue)|tout(?: (?:âge|bout de champ|crin|instant|jamais|le (?:moins|monde)|moment|point de vue|prix|un chacun)|e (?:allure|bride|épreuve|force|heure|vitesse|volée))|toutes (?:fins utiles|jambes)|tribord|un moment donné|usage interne|visage découvert|vive allure|voix (?:haute|basse)|vol d’oiseau|vrai dire|vue d’œil|y (?:regarder de plus près|réfléchir))  @@0
    <<- not before(r"(?i)[ln]’$|(?<!-)\b(?:il|elle|on|y|n’en) +$")
    -1>> à                  # Confusion probable : “a” est la conjugaison du verbe “avoir”. Utilisez la préposition “à”.|http://fr.wiktionary.org/wiki/%C3%A0
__[s]/conf(conf_a_à_locutions3)__
    (a) (?:confesse|mi(?:di|nuit)|r(?:allonge|eculons|enverse|isque)|tâtons|la (?:manque|ramasse|re(?:dresse|nverse)))  @@0
    <<- not before(r"(?i)(?:\bque? |[ln]’$|(?<!-)\b(?:il|elle|on|y|n’en) +$)")
    -1>> à                  # Confusion probable : “a” est la conjugaison du verbe “avoir”. Utilisez la préposition “à”.|http://fr.wiktionary.org/wiki/%C3%A0
__[s]/conf(conf_a_à_locutions4)__
    (a) (?:[mts](?:es|on|a)|[nv]o(?:s|tre)|leurs?) (?:avis|c(?:onnaissance|ôtés)|c(?:œur|orps) défendant|dé(?:pens|triment)|disposition|encontre|égard|grand(?: désarroi|e (?:surprise|tristesse))|guise|insu|portée|risques et périls|sujet|tour)  @@0
    <<- not before(r"(?i)(?:\bque? |[ln]’$|(?<!-)\b(?:il|elle|on|y|n’en) +$)")
    -1>> à                  # Confusion probable : “a” est la conjugaison du verbe “avoir”. Utilisez la préposition “à”.|http://fr.wiktionary.org/wiki/%C3%A0
__[s]/conf(conf_a_à_infi)__
    (?<![mtn]’)(a) (?:[mts](?:’|e +)|[nv]ous|)({w_2}(?:er|re|ir))  @@0,2
    <<- morph(\2, ":Y", False) and not before(r"(?i)\bque? |(?:il|elle|on|n’(?:en|y)) +$") 
    -1>> à                  # Confusion probable : “a” est la conjugaison du verbe “avoir”. Utilisez la préposition “à”.|http://fr.wiktionary.org/wiki/%C3%A0
__[s]/conf(conf_a_à_après_interrogative)__
    \w+-(?:je|ils?|elles?|je|tu|on|vous|nous) (a)(?! priori| posteriori| fortiori)  @@$
    <<- -1>> à              # Confusion probable : “a” est la conjugaison du verbe “avoir”. Utilisez la préposition “à”.|http://fr.wiktionary.org/wiki/%C3%A0


TEST: Cette femme {{à}} été confondue avec une autre.
TEST: L’homme {{à}} ouvert la boîte.
TEST: Il ne nous reste plus qu’{{à}} {{vérifié}} si votre maquette.
TEST: Je veux {{à}} {{mangé}}.
TEST: Ne pas hésiter {{à}} {{demandé}} des conseils.
TEST: cette femme, dans son délire, {{à}} {{jetez}} son argent à la poubelle.







>








|




















<




|



|







|





>







3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171

3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
__[i]/conf(conf_a_à_qui_pronom_à)__
    qui (?:l(?:ui|eur)(?: en|)|nous|vous|en|y) +(à)  @@$ <<- -1>> a                                 # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez :
__[i]/conf(conf_a_à_qui_a)__
    qui (à) +({w_2})  @@4,$  <<- morphex(\2, ":Q", ":M[12P]") -1>> a                                # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez :
__[i]/conf(conf_a_à_le)__
    (à le) ({w_2})  @@0,5
    <<- morphex(\2, ":[NAQ].*:[me]", ":(?:Y|Oo)") -1>> a le|au
    # Confusion. Ou vous confondez “a” (préposition) avec “a” (avoir), ou vous devez employer “au”. Exemple : _à_ midi, il _a_ pris son déjeuner _au_ restaurant.
    <<- morphex(\2, ":[NAQ].*:f", ":(?:Y|Oo)") -1>> à la
    # Confusion. Ou vous confondez “a” (préposition) avec “a” (avoir), ou vous devez employer “au”. Exemple : _à_ midi, il _a_ pris son déjeuner _au_ restaurant.
__[i]/conf(conf_a_à_les)__
    (à les) ({w_2})  @@0,6  <<- morphex(\2, ":[NAQ]", ":(?:Y|Oo)") -1>> a les|aux
    # Confusion. Ou vous confondez “a” (préposition) avec “a” (avoir), ou vous devez employer “aux”. Exemple : Elle _a_ donné du travail _aux_ employés _à_ profusion.
__[i]/conf(conf_a_à_au_aux)__
    (à) aux?(?! (?:moins|plus)) @@0 <<- -1>> a                                                      # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez :
__[i]/conf(conf_a_à_base_cause)__
    (a) (?:base|cause) d(?:es?|u|) @@0 <<- not before(r"(?i)\bce que?\b") -1>> à                    # Confusion. Utilisez la préposition « à ».
__[i]/conf(conf_a_à_faim_peur_honte_soif)__
    (à) +(?:faim|peur|honte|soif) @@0 <<- -1>> a                                                    # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez : 
__[i]/conf(conf_a_à_part)__
    (a) part ({w1}) @@0,7 <<- morph(\2, ":(?:M[12]|D|Oo)") -1>> à                                   # Confusion probable.
__[i]/conf(conf_a_à_les_à)__
    les (à)(?! côtés| peu près| prioris?| post[eé]rioris?| valoirs?| pics?| propos) @@4 <<- -1>> a
    # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez : 
__[i]/conf(conf_a_à_avant_conj_prep)__
    (à) +(?:a(?:fin|lors|près|uprès|ux?(?! moins| plus| mieux)|vant|vec)|au-de(?:dans|hors|là|sso?us|vant)|chez|d(?:ans|evant|ès|déjà|onc|urant)|lorsque?|malgré|par(?:ce|mi|)|p(?:endant|our|uisque)|que?|sur|tandis)  @@0
    <<- -1>> a                                                                                      # Confusion probable : “à” est une préposition. Écrivez “a” pour la conjugaison de “avoir”.
__[i]/conf(conf_a_participe_passé_ou_vconj)__
    (à) +({w_2})  @@0,$
    <<- \2.islower() and \2 != "coté" >>>
    <<- morphex(\2, ":(?:V.......[_z][az].*:Q|V1.*:Ip:2p)", ":[MGWNY]") -1>> a                      # Confusion probable : “à” est une préposition. Pour le verbe “avoir”, écrivez :
    <<- __also__ and morph(\2, "V1.*:(?:Ip:2p|Q)", False) and not before(r"(?i)\b(?:il +|elle +|on +|l(?:es|ui|leur) +|[nv]ous +|y +|en +|[nmtsld]’)$")
    -2>> =suggVerbInfi(@)                                                                           # Le verbe devrait être à l’infinitif.
    <<- __else__ and morph(\2, ":[123][sp]") and not \2.startswith("tord") >>>
    <<- morph(\2, ":V2.*:Ip:3s") -2>> =suggVerbPpas(@, ":m:s")                                      # Incohérence : “\1” est une préposition. “\2” est un verbe conjugué.
    <<- __also__ -1>> a                                                                             # Confusion probable : “à” est une préposition. Pour le verbe “avoir”, écrivez :
    <<- __else__ -2>> _                                                                             # Incohérence : “\1” est une préposition. “\2” est un verbe conjugué.

__[i]/conf(conf_a_à_locutions1)__
    (a) (?:nouveau|présent|(?:bonne distance|bord|cause|contre-courant|côté|court|défaut|droite|gauche|l’(?:arrière|autre bout|écart|égard|extérieur|aune|avant|encontre|ins(?:u|tar)|intérieur|opposé)|la (?:portée|suite)|partir|portée|propos|rebours) d(?:es?|u))  @@0
    <<- -1>> à                                                                                      # Confusion. Utilisez la préposition “à”.
__[s]/conf(conf_a_à_locutions2)__
    (a) (?:califourchon|contre(?:cœur|temps)|côté d(?:e|’\w[\w-]+)|demi-mot|nouveau|présent|rebrousse-poil|regret|travers|tout-va|l’(?:heure (?:actuelle|qu il est)|accoutumée|amiable|avance|aven(?:ir|ant)|air libre|aveuglette|emporte-pièce|évidence|exclusion de toute autre chose|improviste|inverse|ordre du jour|œil nu|en croire|un(?:animité| (?:d’entre eux|des leurs)|e (?:d’entre elles|des leurs)))|la (?:bonne franquette|con|dér(?:ive|obée)|diable|fois|limite du supportable|lumière de tout ce(?:ci|la)|mords-moi-le-nœud|papa|petite semaine|pointe du progrès|queue leu leu|rescousse|sauvette|surprise générale|virgule près|volée)|partir (?:de (?:demain|là|maintenant|rien)|d’(?:aujourd’hui|hier|ici))|au(?:cun prix|trui|tre chose)|bas co[ûu]t|bâ(?:bord|tons rompus)|beaucoup près|belles dents|bien (?:des égards|y (?:penser|réfléchir|songer))|bon (?:compte|escient|droit)|bout (?:de (?:bras|souffle|forces?)|portant|touchant)|bras (?:ouverts|le corps)|brève échéance|but non lucratif|cause d(?:e (?:ça|[mt]oi|lui|[nv]ous)|’e(?:lles?|ux))|ce (?:compte-là|moment-là|titre)|cet (?:égard|instant(?: précis|))|cette (?:époque(?: de l’année|)|heure de la (?:journée|nuit))|chaque (?:fois|instant)|chaudes larmes|cœur (?:joie|ouvert|perdu)|ciel ouvert|contre-cœur|corps perdu|cou(?:p sûr|per le souffle|rt terme|rte (?:échéance|portée))|couilles rabattues|de nombreuses reprises|des kilomètres à la ronde|dose homéopathique|double (?:titre|tranchant)|durée limitée|en (?:juger par (?:[mts]on|[nv]otre|leur) expérience|perdre (?:haleine|la tête))|faible (?:allure|revenu)|feu et à sang|flanc de (?:colline|montagne)|fleur de peau|géométrie variable|grand(?:-peine|e échelle)|haut risque|hue et à dia|huis clos|intervalles (?:ir|)réguliers|juste (?:raison|titre)|long terme|longue(?: échéance| portée|ur (?:de (?:temps|journée))|d’année)|loyer modéré|main (?:armée|droite|gauche|levée)|maint(?:s égards|es reprises)|marche forcée|merveille|mi-(?:course|distance|temps)|mi(?:di|nuit)(?: pile|)|moindres frais|moyen(?: terme|ne échéance)|mots couverts|ne (?:jamais|pas|rien|guère)|n’en (?:pas douter|point douter|plus finir)|outrance|parler franc|part (?:entière|ça|ce(?:la|ci))|partir de là|part(?:ir de rien|s égales)|pas de (?:géant|loup|tortue|velours)|personne en danger|perte de vue|petit(?: feu|e (?:dose|échelle))|peu (?:de choses? |)près|pieds joints|pile ou face|plat(?: ventre|e couture)|plein(?: (?:régime|temps|nez)|s poumons)|plus (?:forte raison|d’un titre)|point nommé|portée de main|première vue|prix (?:cassé|modique)s?|proprement parler|qui (?:mieux mieux|que ce soit|de droit)|quelque distance|quelques exceptions près|ras bords?|rude épreuve|tel point|temps (?:plein|partiel|complet)|tête reposée|tire[ -]d’aile|titre (?:conservatoire|d’exemple|indicatif|informatif|grâcieux|personnel|posthume)|tombeau ouvert|tort (?:ou à raison|et à travers)|tour de (?:bras|rôle)|tous (?:crins|points de vue)|tout(?: (?:âge|bout de champ|crin|instant|jamais|le (?:moins|monde)|moment|point de vue|prix|un chacun)|e (?:allure|bride|épreuve|force|heure|vitesse|volée))|toutes (?:fins utiles|jambes)|tribord|un moment donné|usage interne|visage découvert|vive allure|voix (?:haute|basse)|vol d’oiseau|vrai dire|vue d’œil|y (?:regarder de plus près|réfléchir))  @@0
    <<- not before(r"(?i)[ln]’$|(?<!-)\b(?:il|elle|on|y|n’en) +$")
    -1>> à                  # Confusion probable : “a” est la conjugaison du verbe “avoir”. Utilisez la préposition “à”.|http://fr.wiktionary.org/wiki/%C3%A0
__[s]/conf(conf_a_à_locutions3)__
    (a) (?:confesse|mi(?:di|nuit)|r(?:allonge|eculons|enverse|isque)|tâtons|vélo|la (?:manque|ramasse|re(?:dresse|nverse)))  @@0
    <<- not before(r"(?i)(?:\bque? |[ln]’$|(?<!-)\b(?:il|elle|on|y|n’en) +$)")
    -1>> à                  # Confusion probable : “a” est la conjugaison du verbe “avoir”. Utilisez la préposition “à”.|http://fr.wiktionary.org/wiki/%C3%A0
__[s]/conf(conf_a_à_locutions4)__
    (a) (?:[mts](?:es|on|a)|[nv]o(?:s|tre)|leurs?) (?:avis|c(?:onnaissance|ôtés)|c(?:œur|orps) défendant|dé(?:pens|triment)|disposition|encontre|égard|grand(?: désarroi|e (?:surprise|tristesse))|guise|insu|portée|risques et périls|sujet|tour)  @@0
    <<- not before(r"(?i)(?:\bque? |[ln]’$|(?<!-)\b(?:il|elle|on|y|n’en) +$)")
    -1>> à                  # Confusion probable : “a” est la conjugaison du verbe “avoir”. Utilisez la préposition “à”.|http://fr.wiktionary.org/wiki/%C3%A0
__[s]/conf(conf_a_à_infi)__
    (?<![mtn]’)(a) (?:[mts](?:’(?:en +|y +|)|e +)|[nv]ous|)({w_2}(?:er|re|ir))  @@0,2
    <<- morph(\2, ":Y", False) and not before(r"(?i)\bque? |(?:il|elle|on|n’(?:en|y)) +$") 
    -1>> à                  # Confusion probable : “a” est la conjugaison du verbe “avoir”. Utilisez la préposition “à”.|http://fr.wiktionary.org/wiki/%C3%A0
__[s]/conf(conf_a_à_après_interrogative)__
    \w+-(?:je|ils?|elles?|je|tu|on|vous|nous) (a)(?! priori| posteriori| fortiori)  @@$
    <<- -1>> à              # Confusion probable : “a” est la conjugaison du verbe “avoir”. Utilisez la préposition “à”.|http://fr.wiktionary.org/wiki/%C3%A0


TEST: Cette femme {{à}} été confondue avec une autre.
TEST: L’homme {{à}} ouvert la boîte.
TEST: Il ne nous reste plus qu’{{à}} {{vérifié}} si votre maquette.
TEST: Je veux {{à}} {{mangé}}.
TEST: Ne pas hésiter {{à}} {{demandé}} des conseils.
TEST: cette femme, dans son délire, {{à}} {{jetez}} son argent à la poubelle.
3109
3110
3111
3112
3113
3114
3115

3116
3117
3118
3119
3120
3121
3122
TEST: il me l’{{à}} donné
TEST: qui en {{à}} ?
TEST: Il l’a fait {{a}} cause de toi.
TEST: Il ne m’{{à}} jamais vu.
TEST: Que fait-il {{a}} cette conférence ?
TEST: Il m’en {{à}} donné.
TEST: Il y en {{à}}.

TEST: ce que cet homme, dans son garage, {{à}} alors une importance.
TEST: Il les y {{à}}.
TEST: On {{à}} faim.
TEST: Elle en {{à}} pris.
TEST: Elle {{à}} froid.
TEST: Elle l’en {{à}} averti.
TEST: lui, avec ceux-là, nous en {{à}} donnés trois.







>







3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
TEST: il me l’{{à}} donné
TEST: qui en {{à}} ?
TEST: Il l’a fait {{a}} cause de toi.
TEST: Il ne m’{{à}} jamais vu.
TEST: Que fait-il {{a}} cette conférence ?
TEST: Il m’en {{à}} donné.
TEST: Il y en {{à}}.
TEST: un machin ennuyeux {{a}} s’en tirer une balle dans la tête.
TEST: ce que cet homme, dans son garage, {{à}} alors une importance.
TEST: Il les y {{à}}.
TEST: On {{à}} faim.
TEST: Elle en {{à}} pris.
TEST: Elle {{à}} froid.
TEST: Elle l’en {{à}} averti.
TEST: lui, avec ceux-là, nous en {{à}} donnés trois.
3139
3140
3141
3142
3143
3144
3145



























3146
3147
3148
3149
3150
3151
3152
3153









3154
3155
3156
3157
3158
3159
3160
TEST: Je tenais à le lui faire savoir.
TEST: ce que cette personne, dans son esprit trouble et vindicatif, {{à}} aux hommes à dire, nul ne le sait.
TEST: il va falloir songer à les leur donner
TEST: le coût est estimé à au moins 1000 milliards de dollars
TEST: elle à qui nous avons donné notre cœur et pour laquelle nous avons tout tenté pour la faire aimer de nos concitoyens.
TEST: jusqu’à parfois se mettre en danger





























__[s]/conf(conf_m_a_tuer)__
    m’a +(tuer) @@$
    <<- -1>> tué|tuée
    # Cliché. Évitez cette erreur de grammaire délibérée, faite d’innombrables fois, pour mimer l’affaire Omar Raddad.|https://fr.wikipedia.org/wiki/Omar_m'a_tuer

TEST: la réalité m’a {{tuer}}











# aux dépens
__[i]/conf(conf_aux_dépens)__
    (aux?) (dépend?s?)  @@0,$
    <<- not \1.endswith("x") and not \1.endswith("X") -1>> aux              # Locution prépositive : « aux dépens de ».|https://fr.wiktionary.org/wiki/aux_d%C3%A9pens_de
    <<- not \2.endswith("ens") and not \2.endswith("ENS") -2>> dépens       # Locution prépositive : « aux dépens de ».|https://fr.wiktionary.org/wiki/aux_d%C3%A9pens_de








>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>








>
>
>
>
>
>
>
>
>







3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
TEST: Je tenais à le lui faire savoir.
TEST: ce que cette personne, dans son esprit trouble et vindicatif, {{à}} aux hommes à dire, nul ne le sait.
TEST: il va falloir songer à les leur donner
TEST: le coût est estimé à au moins 1000 milliards de dollars
TEST: elle à qui nous avons donné notre cœur et pour laquelle nous avons tout tenté pour la faire aimer de nos concitoyens.
TEST: jusqu’à parfois se mettre en danger


__[i]/conf(conf_celui_celle_à_qui)__
    ce(?:lui|lles?|ux) (a) qui  @@w
    <<- -1>> à                                  # Confusion. Utilisez la préposition “à”.|http://fr.wiktionary.org/wiki/%C3%A0

TEST: Ceux {{a}} qui nous avons notifié le problème sont partis.
TEST: Il y a qui au dîner ce soir ?


__[i]/conf(conf_mener_à_bien)__
    (m[eèé]n\w+) (a) bien  @@0,w
    <<- morph(\1, ">mener ", False) and ( not before(r"\bque? ") or morph(word(-1), ">(?:falloir|aller|pouvoir) ", False, True) )
    -2>> à                  # Confusion probable. Dans cette locution, utilisez la préposition « à ».|https://fr.wiktionary.org/wiki/mener_%C3%A0_bien
    <<- __also__ ~>> \1

TEST: Mener {{a}} bien cette guerre sera plus difficile qu’on le pense.
TEST: Je peux mener {{a}} bien cette opération.
TEST: Cette coalition que tu penses mener a bien l’intention de te trahir.


__[i]/conf(conf_mettre_à_profit)__
    (m(?:i[st]|ett)\w*).* (a) profit  @@0,w
    <<- morph(\1, ">mettre ", False) -2>> à     # Confusion probable. Dans « mettre à profit », utilisez la préposition « à ».|https://fr.wiktionary.org/wiki/mettre_%C3%A0_profit

TEST: Mettre {{a}} profit ses compétences
TEST: Il a mis son talent {{a}} profit.


__[s]/conf(conf_m_a_tuer)__
    m’a +(tuer) @@$
    <<- -1>> tué|tuée
    # Cliché. Évitez cette erreur de grammaire délibérée, faite d’innombrables fois, pour mimer l’affaire Omar Raddad.|https://fr.wikipedia.org/wiki/Omar_m'a_tuer

TEST: la réalité m’a {{tuer}}


# après avoir
__[i]/conf(conf_après_avoir)__
    [àa] pr(?:êt|é|è)s? [aà] ?voire?
    <<- ->> après avoir                                                     # Confusion générale.

TEST: après avoir réussi son examen
TEST: {{a pré a voire}} monté les marches


# aux dépens
__[i]/conf(conf_aux_dépens)__
    (aux?) (dépend?s?)  @@0,$
    <<- not \1.endswith("x") and not \1.endswith("X") -1>> aux              # Locution prépositive : « aux dépens de ».|https://fr.wiktionary.org/wiki/aux_d%C3%A9pens_de
    <<- not \2.endswith("ens") and not \2.endswith("ENS") -2>> dépens       # Locution prépositive : « aux dépens de ».|https://fr.wiktionary.org/wiki/aux_d%C3%A9pens_de

3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207

3208
3209
3210
3211
3212
3213
3214
TEST: il faut s’y prendre comme {{sa}}
TEST: on fait {{sa}} lorsqu’on a tout perdu
TEST: avec sa presque belle-mère
TEST: sa toute nouvelle application de synchronisation de fichiers


# ce / se / ceux
__[i]/conf(conf_se_verbe1)__
    (ce) (?!faire)({infi})  @@0,3
    <<- morph(\2, ":Y")  and \1 != "CE" -1>> se                             # Confusion. Ce chien, ce chat… Se demander, se croire…
__[i]/conf(conf_se_verbe2)__
    (ce) (?!faire)({w_2})  @@0,3
    <<- morph(\2, ":V[123].*:(?:Y|[123][sp])") and not morph(\2, ">(?:devoir|pouvoir|sembler) ") and \2[0].islower() and \1 != "CE"

    -1>> se                                                                 # Confusion : « \2 » est un verbe. Exemples : ce bâtiment, se perdre.
__[i]/conf(conf_pour_ce_faire)__
    pour (se) faire,? ({w_2})  @@5,$
    <<- (\0.find(",") >= 0 or morphex(\2, ":G", ":[AYD]"))
    -1>> ce                                                                 # Confusion probable. Dans cette locution, il faut employer “ce”.|http://fr.wiktionary.org/wiki/pour_ce_faire
__[i]/conf(conf_ne_se1)!6__
    ne (ce) @@3 <<- -1>> se                                                 # Confusion. Ce chien, ce chat… Se demander, se croire…







|
<
<
<
|
|
>







3343
3344
3345
3346
3347
3348
3349
3350



3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
TEST: il faut s’y prendre comme {{sa}}
TEST: on fait {{sa}} lorsqu’on a tout perdu
TEST: avec sa presque belle-mère
TEST: sa toute nouvelle application de synchronisation de fichiers


# ce / se / ceux
__[s]/conf(conf_se_verbe)__



    ([cC]e) ({w_2})  @@0,3
    <<- \2[0].islower() and \2 != "faire"
    and ( morphex(\2, ":V[123].*:(?:Y|[123][sp])", ":[NAGM]|>(?:devoir|pouvoir|sembler) ") or re.search("-(?:ils?|elles?|on)$", \2) )
    -1>> se                                                                 # Confusion : « \2 » est un verbe. Exemples : ce bâtiment, se perdre.
__[i]/conf(conf_pour_ce_faire)__
    pour (se) faire,? ({w_2})  @@5,$
    <<- (\0.find(",") >= 0 or morphex(\2, ":G", ":[AYD]"))
    -1>> ce                                                                 # Confusion probable. Dans cette locution, il faut employer “ce”.|http://fr.wiktionary.org/wiki/pour_ce_faire
__[i]/conf(conf_ne_se1)!6__
    ne (ce) @@3 <<- -1>> se                                                 # Confusion. Ce chien, ce chat… Se demander, se croire…
3251
3252
3253
3254
3255
3256
3257

3258
3259
3260
3261
3262
3263








3264
3265
3266
3267
3268
3269
3270
TEST: tout {{se}} qu’il entend
TEST: {{Ce}} {{promener}} est relaxant.
TEST: Il {{ce}} {{sent}} seul
TEST: {{se}} {{train}} est en retard
TEST: {{ceux}} train arrive trop vite.
TEST: {{ceux}} ne doit pas nous faire oublier ce désastre
TEST: qui {{ce}} donne en spectacle.

TEST: les expatriés éloignés ou ceux habitant ici
TEST: les photographies de ceux n’ayant pas dépassé sept sur vingt.
TEST: Pensez-vous que ceux ne sachant même pas ce qu’est une VHS peuvent y trouver leur compte ?
TEST: la réduction de ma liberté intellectuelle et celle de ceux autour de moi
TEST: […] qui ne peut être si ardente qu’elle ne se doive, ce semble, éteindre par la moindre goutte de sang qui sorte de leurs plaies.










# ces / ses / c’est
__[s]/conf(conf_c_est1)__
    ([scSC]es) (?:à|au-dessus|avec|aux?|contre|derrière|devant|par|pour|sans) (?:l(?:es?|a|)|une?|[cs]es?|cette|de?s?|du|lui|elles?|eux|nous|vous)  @@0
    <<- -1>> c’est                                                                          # Confusion. Écrivez « c’est » pour dire « ceci est… ».
__[s>/conf(conf_c_est2)__
    ([scSC]es) [ld]’(?![A-Z])  @@0







>






>
>
>
>
>
>
>
>







3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
TEST: tout {{se}} qu’il entend
TEST: {{Ce}} {{promener}} est relaxant.
TEST: Il {{ce}} {{sent}} seul
TEST: {{se}} {{train}} est en retard
TEST: {{ceux}} train arrive trop vite.
TEST: {{ceux}} ne doit pas nous faire oublier ce désastre
TEST: qui {{ce}} donne en spectacle.
TEST: {{ce}} prennent-ils pour des experts ?
TEST: les expatriés éloignés ou ceux habitant ici
TEST: les photographies de ceux n’ayant pas dépassé sept sur vingt.
TEST: Pensez-vous que ceux ne sachant même pas ce qu’est une VHS peuvent y trouver leur compte ?
TEST: la réduction de ma liberté intellectuelle et celle de ceux autour de moi
TEST: […] qui ne peut être si ardente qu’elle ne se doive, ce semble, éteindre par la moindre goutte de sang qui sorte de leurs plaies.


# ce à quoi
__[i]/conf(conf_ce_à_quoi)__
    (?:se [àa] quoi|ce a quoi)
    <<- ->> ce à quoi                                   # Confusion.|https://fr.wiktionary.org/wiki/ce_%C3%A0_quoi

TEST: c’est {{se a quoi}} il pensait qui le minait.


# ces / ses / c’est
__[s]/conf(conf_c_est1)__
    ([scSC]es) (?:à|au-dessus|avec|aux?|contre|derrière|devant|par|pour|sans) (?:l(?:es?|a|)|une?|[cs]es?|cette|de?s?|du|lui|elles?|eux|nous|vous)  @@0
    <<- -1>> c’est                                                                          # Confusion. Écrivez « c’est » pour dire « ceci est… ».
__[s>/conf(conf_c_est2)__
    ([scSC]es) [ld]’(?![A-Z])  @@0
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348




3349
3350
3351
3352
3353
3354
3355
TEST: ils sont {{d’avantages}} perdus que les autres.


# différend / différent
__[i]/conf(conf_différent)__
    différends?
    <<- morph(word(-1), ":W", False, False) ->> =\0.replace("end", "ent")           # Confusion probable : “un différend” est un désaccord. Pour l’adjectif qualifiant une différence, écrivez :
__[i]/conf(conf_différend)__
    (?:[mts]on|[vn]otre|leur) +(différent) @@$
    <<- morphex(word(1), ":[GVX]", ":[NAQ]", True)
    -1>> différend                                          # Confusion : « différent » est un adjectif, « différend » est le nom qui signifie désaccord.




__[i]/conf(conf_un_différend)__
    un (différent)  @@3
    <<- morphex(word(1), ":[GV]", ":[NAQ]", False)
    -1>> différend                                          # Confusion : « différent » est un adjectif, « différend » est le nom qui signifie désaccord.
__[i]/conf(conf_différends)__
    (?:leurs|[mts]es|[nv]os) (différents) @@$
    <<- morphex(word(1), ":[GV]", ":[NAQ]", True)







|
|


>
>
>
>







3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
TEST: ils sont {{d’avantages}} perdus que les autres.


# différend / différent
__[i]/conf(conf_différent)__
    différends?
    <<- morph(word(-1), ":W", False, False) ->> =\0.replace("end", "ent")           # Confusion probable : “un différend” est un désaccord. Pour l’adjectif qualifiant une différence, écrivez :
__[i]/conf(conf_différend1)__
    (?:mon|[vn]otre|leur) +(différent) @@$
    <<- morphex(word(1), ":[GVX]", ":[NAQ]", True)
    -1>> différend                                          # Confusion : « différent » est un adjectif, « différend » est le nom qui signifie désaccord.
__[i]/conf(conf_différend2)__
    [ts]on +(différent) @@$
    <<- morphex(word(1), ":[GVX]", ":[NAQ]", True) and not morph(word(-1), ":D", False, False)
    -1>> différend                                          # Confusion : « différent » est un adjectif, « différend » est le nom qui signifie désaccord.
__[i]/conf(conf_un_différend)__
    un (différent)  @@3
    <<- morphex(word(1), ":[GV]", ":[NAQ]", False)
    -1>> différend                                          # Confusion : « différent » est un adjectif, « différend » est le nom qui signifie désaccord.
__[i]/conf(conf_différends)__
    (?:leurs|[mts]es|[nv]os) (différents) @@$
    <<- morphex(word(1), ":[GV]", ":[NAQ]", True)
3365
3366
3367
3368
3369
3370
3371

3372

3373
3374
3375
3376
3377
3378
3379

TEST: Très {{différends}} de nous, ces gens-là !
TEST: Régler votre {{différent}}.
TEST: Notre {{différent}} avec eux perdure.
TEST: Un {{différent}} peut toujours se résoudre.
TEST: J’en ai marre de leurs {{différents}}.
TEST: Il y a des {{différents}} que nul ne saurait résoudre.

TEST: Ils sont pas {{différends}} de nous.

TEST: J’en veux un différent.
TEST: dans ses différents ouvrages
TEST: dans ses différents postes gouvernementaux


# eh bien, hé bien / et bien
__[i]/conf(conf_eh_bien)__







>

>







3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540

TEST: Très {{différends}} de nous, ces gens-là !
TEST: Régler votre {{différent}}.
TEST: Notre {{différent}} avec eux perdure.
TEST: Un {{différent}} peut toujours se résoudre.
TEST: J’en ai marre de leurs {{différents}}.
TEST: Il y a des {{différents}} que nul ne saurait résoudre.
TEST: ce qui l’occupe, c’est son {{différent}} avec eux.
TEST: Ils sont pas {{différends}} de nous.
TEST: Cette fois, il parla avec un ton différent.
TEST: J’en veux un différent.
TEST: dans ses différents ouvrages
TEST: dans ses différents postes gouvernementaux


# eh bien, hé bien / et bien
__[i]/conf(conf_eh_bien)__
3491
3492
3493
3494
3495
3496
3497










3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512





















3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525


3526
3527
3528
3529
3530
3531
3532
    loins? +(?:[sc]ens|san[gs]?s?|s[’ ]en) +fau[xt]
    <<- not re.search("(?i)loin s’en faut", \0) and morph(word(-1), ":N", ">(?:aller|venir|partir) ", True)
    ->> loin s’en faut                                                                              # Confusion probable. Cette locution s’écrit :|https://fr.wiktionary.org/wiki/loin_s%E2%80%99en_faut

TEST: Ils n’étaient guère prêts à ça, {{loins sans faux}}.
TEST: Et les intellectuels ? En France comme ailleurs, tous n’ont pas, loin s’en faut, une pleine lucidité sur cette précarité galopante.












# min / mins
__[u]/conf(conf_symbole_min)__  \d+ (mins) @@$ <<- -1>> min                                         # Les unités de mesure abrégées ne prennent pas la marque du pluriel.

TEST: 120 {{Mins}} de bonheur


# on / ont
__[i]/conf(conf_on_ont_adverbe)__
    (?<!’)(on) ({w_2})  @@0,3
    <<- morphex(\2, ":W", ":3s") and not morph(word(-1), ":V.*:3s", False, False) -1>> ont          # Confusion probable : “avoir” à la 3ᵉ personne du pluriel du présent s’écrit “ont”.

TEST: ces gens {{on}} {{souvent}} tort.
TEST: Je voulais qu’on soit ensemble.























# pale / pâle
__[i]/conf(conf_pale_pâle1)__
    (?:bien|tr(?:ès|op)|si|vraiment|tellement) +(pales?)  @@$
    <<- -1>> =\1.replace("pal", "pâl")
    # Utilisez “pâle” pour évoquer la pâleur… Une pale est, entre autres choses, un élément d’une hélice.|http://fr.wiktionary.org/wiki/pale
__[i]/conf(conf_pale_pâle2)__
    (pales?) +(?:imitat(?:ion|eur|rice)|rayon)s?  @@0
    <<- -1>> =\1.replace("pal", "pâl")
    # Utilisez “pâle” pour évoquer la pâleur… Une pale est, entre autres choses, un élément d’une hélice.|http://fr.wiktionary.org/wiki/pale

TEST: elles sont si {{pales}}.
TEST: cette {{pale}} imitation d’un chef-d’œuvre




# peu / peux / peut / peut-être
__[i]/conf(conf_peut_adv)__
    (?<![dDuUnN][eEnN] )(peu) (?:pas|donc|jamais|rien|parfois|alors|enfin|rarement|éventuellement) @@0
    <<- not before("très +$") -1>> peut                                     # Confusion probable : « peu » signifie « pas beaucoup », pour le verbe pouvoir, écrivez :
__[i]/conf(conf_il_ce_peut_être)!6__







>
>
>
>
>
>
>
>
>
>















>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>













>
>







3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
    loins? +(?:[sc]ens|san[gs]?s?|s[’ ]en) +fau[xt]
    <<- not re.search("(?i)loin s’en faut", \0) and morph(word(-1), ":N", ">(?:aller|venir|partir) ", True)
    ->> loin s’en faut                                                                              # Confusion probable. Cette locution s’écrit :|https://fr.wiktionary.org/wiki/loin_s%E2%80%99en_faut

TEST: Ils n’étaient guère prêts à ça, {{loins sans faux}}.
TEST: Et les intellectuels ? En France comme ailleurs, tous n’ont pas, loin s’en faut, une pleine lucidité sur cette précarité galopante.


# mai / mais
__[i]/conf(mais)__
    (mai) +({w_1}) @@0,$
    <<- morphex(\2, ":O", ":3s") and isStart() -1>> mais            # Confusion probable : “mai” est le 5ᵉ mois de l’année. Pour la conjonction de coordination, écrivez “mais”.|https://fr.wiktionary.org/wiki/mais

TEST: {{mai}} il y a encore tant à faire.
TEST: Je viendrai, {{mai}} il faudra avoir tout prévu.
TEST: Mai pluvieux.


# min / mins
__[u]/conf(conf_symbole_min)__  \d+ (mins) @@$ <<- -1>> min                                         # Les unités de mesure abrégées ne prennent pas la marque du pluriel.

TEST: 120 {{Mins}} de bonheur


# on / ont
__[i]/conf(conf_on_ont_adverbe)__
    (?<!’)(on) ({w_2})  @@0,3
    <<- morphex(\2, ":W", ":3s") and not morph(word(-1), ":V.*:3s", False, False) -1>> ont          # Confusion probable : “avoir” à la 3ᵉ personne du pluriel du présent s’écrit “ont”.

TEST: ces gens {{on}} {{souvent}} tort.
TEST: Je voulais qu’on soit ensemble.


# ou / où
__[i]/conf(conf_où_verbe)__
    ^(Ou) ({w_2}) @@0,3 <<- morphex(\2, ":3[sp]", ":Y") -1>> Où                             # Confusion probable. La conjonction “ou” signale une alternative. Utilisez “où” pour “en quel lieu”.
__[i]/conf(conf_au_moment_par_d_où)__
    (?:au moment |jusqu |par |d’)(ou) @@$ <<- -1>> où                                       # Confusion. La conjonction “ou” signale une alternative. Pour identifier un lieu ou un temps, écrivez “où”.
__[i]/conf(conf_vers_où)__
    vers (ou) @@5 <<- not morph(word(-1), ":D", False, False) -1>> où                       # Confusion probable. La conjonction “ou” signale une alternative. Pour identifier un lieu ou un temps, écrivez “où”.
__[i]/conf(conf_jusqu_où_au_cas_où)__
    (?:au|le|des) cas (ou) @@$ <<- -1>> où                                                  # Confusion. La conjonction “ou” signale une alternative. Pour identifier un lieu ou un temps, écrivez “où”.
__[i]/conf(conf_à_partir_du_temps_où)__
    à partir d(?:u (?:lieu|moment|jour|mois)|e l’(?:instant|année|heure)|e la (?:minute|semaine|seconde)) +(ou) @@$
    <<- -1>> où                                                                             # Confusion. La conjonction “ou” signale une alternative. Pour identifier un lieu ou un temps, écrivez “où”.

TEST: {{Ou}} sont tes affaires ?
TEST: au moment {{ou}} elle allait enfin réussir
TEST: vers {{ou}} se tourner quand tout va mal ?
TEST: pour le cas {{ou}} on serait arrêté dans notre élan.
TEST: à partir du moment {{ou}} il est entré.
TEST: à partir de l’instant {{ou}} elle est venue.


# pale / pâle
__[i]/conf(conf_pale_pâle1)__
    (?:bien|tr(?:ès|op)|si|vraiment|tellement) +(pales?)  @@$
    <<- -1>> =\1.replace("pal", "pâl")
    # Utilisez “pâle” pour évoquer la pâleur… Une pale est, entre autres choses, un élément d’une hélice.|http://fr.wiktionary.org/wiki/pale
__[i]/conf(conf_pale_pâle2)__
    (pales?) +(?:imitat(?:ion|eur|rice)|rayon)s?  @@0
    <<- -1>> =\1.replace("pal", "pâl")
    # Utilisez “pâle” pour évoquer la pâleur… Une pale est, entre autres choses, un élément d’une hélice.|http://fr.wiktionary.org/wiki/pale

TEST: elles sont si {{pales}}.
TEST: cette {{pale}} imitation d’un chef-d’œuvre




# peu / peux / peut / peut-être
__[i]/conf(conf_peut_adv)__
    (?<![dDuUnN][eEnN] )(peu) (?:pas|donc|jamais|rien|parfois|alors|enfin|rarement|éventuellement) @@0
    <<- not before("très +$") -1>> peut                                     # Confusion probable : « peu » signifie « pas beaucoup », pour le verbe pouvoir, écrivez :
__[i]/conf(conf_il_ce_peut_être)!6__
3636
3637
3638
3639
3640
3641
3642









3643
3644
3645
3646
3647
3648
3649
TEST: {{quant}} nous…
TEST: il comprit {{quand}} prenant son parti, il se protégeait aussi.
TEST: {{qu’en}} il vient, c’est l’enfer.
TEST: il est exact qu’en je ne sais combien de temps il parvint à un résultat inattendu.
TEST: être rassuré quant à l’avenir du continent européen
TEST: il comprit trop tard qu’en elle naquit alors le doute qui l’éloigna de lui à jamais.











# qu’elle / quelle
__[i]/conf(conf_quelle_nom_adj)__
    (qu elles?) +(?!seule?s?)({w_2})  @@0,$
    <<- morphex(\2, ":[NAQ]", ":(?:G|[123][sp]|W)") -1>> =\1.replace(" ", "")                       # Confusion probable. Ex : Quelle femme ! Je crois qu’elle réussira.

TEST: {{qu’elle}} emmerdeuse.







>
>
>
>
>
>
>
>
>







3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
TEST: {{quant}} nous…
TEST: il comprit {{quand}} prenant son parti, il se protégeait aussi.
TEST: {{qu’en}} il vient, c’est l’enfer.
TEST: il est exact qu’en je ne sais combien de temps il parvint à un résultat inattendu.
TEST: être rassuré quant à l’avenir du continent européen
TEST: il comprit trop tard qu’en elle naquit alors le doute qui l’éloigna de lui à jamais.


# quand bien même
__[i]/conf(conf_quand_bien_même)__
    combien même <<- not after("^ si ") ->> quand bien même                                         # Locution conjonctive.|https://fr.wiktionary.org/wiki/quand_bien_m%C3%AAme                             

TEST: J’irai, {{combien même}} vous seriez tous contre moi.
TEST: Il partirait en guerre quand bien même devrait-il être tout seul.
TEST: Elle veut savoir combien même si ça ne lui est d’aucune utilité immédiate.


# qu’elle / quelle
__[i]/conf(conf_quelle_nom_adj)__
    (qu elles?) +(?!seule?s?)({w_2})  @@0,$
    <<- morphex(\2, ":[NAQ]", ":(?:G|[123][sp]|W)") -1>> =\1.replace(" ", "")                       # Confusion probable. Ex : Quelle femme ! Je crois qu’elle réussira.

TEST: {{qu’elle}} emmerdeuse.
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
    <<- -1>> sont                   # Confusion : “son” est un déterminant ou un nom masculin. Le verbe “être” à la 3ᵉ personne du pluriel s’écrit “sont”.
__[i]/conf(conf_me_te_se_son)!6__
    [mts]e (son)  @@3
    <<- -1>> sont                   # Confusion : “son” est un déterminant ou un nom masculin. Le verbe “être” à la 3ᵉ personne du pluriel s’écrit “sont”.
__[i]/conf(conf_son_qqch)__
    (sont) ({w_2})  @@0,$
    <<- morphex(\2, ":[NA].*:[me]:s|>[aeéiîou].* :[NA].*:f:s", ":[GW]")
    and morphex(word(-1), ":V|>(?:à|avec|chez|dès|contre|devant|derrière|en|par|pour|sans|sur) ", ":[NA].*:[pi]|>(?:ils|elles|vous|nous|leur|lui|[mts]e) ", True)
    and not before(r"(?i)\bce que? |[mts]’en +$")
    -1>> son                        # Confusion : “sont” est le verbe “être” à la 3ᵉ personne du pluriel. Pour le déterminant, écrivez “son”.
__[i]/conf(conf_qui_sont_les)__
    qui +(son) @@$
    <<- morph(word(1), ":[DR]", False, True) -1>> sont      # Confusion probable : “son” est un déterminant ou un nom masculin. Le verbe “être” à la 3ᵉ personne du pluriel s’écrit “sont”.

TEST: ne leur {{son}} pas odieux.







|







3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
    <<- -1>> sont                   # Confusion : “son” est un déterminant ou un nom masculin. Le verbe “être” à la 3ᵉ personne du pluriel s’écrit “sont”.
__[i]/conf(conf_me_te_se_son)!6__
    [mts]e (son)  @@3
    <<- -1>> sont                   # Confusion : “son” est un déterminant ou un nom masculin. Le verbe “être” à la 3ᵉ personne du pluriel s’écrit “sont”.
__[i]/conf(conf_son_qqch)__
    (sont) ({w_2})  @@0,$
    <<- morphex(\2, ":[NA].*:[me]:s|>[aeéiîou].* :[NA].*:f:s", ":[GW]")
    and morphex(word(-1), ":V|>(?:à|avec|chez|dès|contre|devant|derrière|en|par|pour|sans|sur) ", ":[NA].*:[pi]|>(?:ils|elles|vous|nous|leur|lui|[nmts]e) ", True)
    and not before(r"(?i)\bce que? |[mts]’en +$")
    -1>> son                        # Confusion : “sont” est le verbe “être” à la 3ᵉ personne du pluriel. Pour le déterminant, écrivez “son”.
__[i]/conf(conf_qui_sont_les)__
    qui +(son) @@$
    <<- morph(word(1), ":[DR]", False, True) -1>> sont      # Confusion probable : “son” est un déterminant ou un nom masculin. Le verbe “être” à la 3ᵉ personne du pluriel s’écrit “sont”.

TEST: ne leur {{son}} pas odieux.
3943
3944
3945
3946
3947
3948
3949
3950





3951
3952
3953
3954
3955
3956
3957
TEST: ce sont des terroristes et ça ne nous arrivera pas à nous, qui n’avons rien à nous reprocher
TEST: mes supérieurs et moi-même avons pris la décision de ne pas vendre
TEST: Ni lui ni moi n’avions mangé
TEST: Mon épouse et moi-même avons toujours dit



#### SGPL






## plus que prévu / mois que prévu
__[i]/sgpl(sgpl_que_prévu1)__   (plus|moins|autant) +que (prévu(?:es?|s)) @@0,$ <<- -2>> prévu                          # Invariable. Implicitement, \1 que ce qui était prévu.
__[i]/sgpl(sgpl_que_prévu2)__   (plus|moins|aussi) +({w_2}) +que (prévu(?:es?|s)) @@0,w,$ <<- -3>> prévu                # Invariable. Implicitement, \1 \2 que ce qui était prévu.
__[i]/sgpl(sgpl_que_prévu3)__   (plus|moins|autant) +d(?:e |’)({w_2}) +que (prévu(?:es?|s)) @@0,w,$ <<- -3>> prévu      # Invariable. Implicitement, \1 \2 que ce qui était prévu.
__[i]/sgpl(sgpl_comme_adj)__    comme ((annoncé|convenu|prévu)(?:es?|s)) @@6,6 <<- -1>> \2                              # Invariable. Implicitement, comme ce qui était \2.








<
>
>
>
>
>







4146
4147
4148
4149
4150
4151
4152

4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
TEST: ce sont des terroristes et ça ne nous arrivera pas à nous, qui n’avons rien à nous reprocher
TEST: mes supérieurs et moi-même avons pris la décision de ne pas vendre
TEST: Ni lui ni moi n’avions mangé
TEST: Mon épouse et moi-même avons toujours dit




!!
!!
!!!! Locutions invariables                                                                          
!!
!!

## plus que prévu / mois que prévu
__[i]/sgpl(sgpl_que_prévu1)__   (plus|moins|autant) +que (prévu(?:es?|s)) @@0,$ <<- -2>> prévu                          # Invariable. Implicitement, \1 que ce qui était prévu.
__[i]/sgpl(sgpl_que_prévu2)__   (plus|moins|aussi) +({w_2}) +que (prévu(?:es?|s)) @@0,w,$ <<- -3>> prévu                # Invariable. Implicitement, \1 \2 que ce qui était prévu.
__[i]/sgpl(sgpl_que_prévu3)__   (plus|moins|autant) +d(?:e |’)({w_2}) +que (prévu(?:es?|s)) @@0,w,$ <<- -3>> prévu      # Invariable. Implicitement, \1 \2 que ce qui était prévu.
__[i]/sgpl(sgpl_comme_adj)__    comme ((annoncé|convenu|prévu)(?:es?|s)) @@6,6 <<- -1>> \2                              # Invariable. Implicitement, comme ce qui était \2.

4099
4100
4101
4102
4103
4104
4105
4106





4107
4108
4109
4110
4111
4112
4113
TEST: __neg__ On {{a}} pas compris.
TEST: __neg__ Il {{part}} pas encore.
TEST: __neg__ On {{vous }}a pas compris.
TEST: __neg__ On {{en}} a pas.
TEST: __neg__ Il {{y}} a jamais d’eau.


#### INFINITIF






__[i](p_ne_plus_pas_jamais_beaucoup_trop_rien)__
    ne (?:pas|plus|jamais) +(beaucoup|trop|rien)  @@$ <<- ~1>> *

__[i]/infi(infi_ne)__
    ne (?:pas|rien|jamais(?: rien| plus|)|plus(?: jamais| rien| guère|)|guère|point) (?:non plus |)(?:l(?:e(?:ur|s|)|a|ui) |nous |vous |[mtsl]’(?:en |y |)|[mts]e |en |y |)({w_1})
    @@$







|
>
>
>
>
>







4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
TEST: __neg__ On {{a}} pas compris.
TEST: __neg__ Il {{part}} pas encore.
TEST: __neg__ On {{vous }}a pas compris.
TEST: __neg__ On {{en}} a pas.
TEST: __neg__ Il {{y}} a jamais d’eau.



!!
!!
!!!! Infinitif                                                                                      
!!
!!

__[i](p_ne_plus_pas_jamais_beaucoup_trop_rien)__
    ne (?:pas|plus|jamais) +(beaucoup|trop|rien)  @@$ <<- ~1>> *

__[i]/infi(infi_ne)__
    ne (?:pas|rien|jamais(?: rien| plus|)|plus(?: jamais| rien| guère|)|guère|point) (?:non plus |)(?:l(?:e(?:ur|s|)|a|ui) |nous |vous |[mtsl]’(?:en |y |)|[mts]e |en |y |)({w_1})
    @@$
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254



4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
## Inconditionnel
__[i](p_24h_sur_24)__           24 ?h(?:eures|) ?(?:sur |/ ?)24 <<- ~>> *
__[i](p_7j_sur_7)__             7 ?j(?:ours|) ?(?:sur |/ ?)7 <<- ~>> *
__[i](p_sept_j_sur_sept)__      sept jours sur sept <<- ~>> *
__[i](p_vq_h_sur_vq_)__         vingt-quatre heures sur vingt-quatre <<- ~>> *
__<i](p_loc_de_début_phrase)__  ^ *(?:et(?: puis|)|puis|car|mais|or donc|m’est avis que) <<- ~>> *
__[i](p_à_côté_de)__            à côté (?:de (?:ça|lui|[mt]oi|[nv]ous)|d’(?:elles|eux))(?! et) <<- ~>> *
__[i](p_à_la_qqch)__            à la (?:bo(?:nne franquette|urre)|con|dér(?:ive|obée)|diable|fois|leur|limite du supportable|longue|lumière de tout ce(?:ci|la)|manque|mords-moi-le-nœud|papa|petite semaine|pointe du progrès|queue leu leu|ramasse|re(?:nverse|dresse|scousse)|sauvette|surprise générale|virgule près|volée) <<- ~>> *
__[i](p_à_heure)__              à \d\d? ?h(?: ?\d\d|)(?: (?:du (?:matin|soir)|de l’après-midi|ce (?:matin|soir)|cet après-midi|demain (?:matin|soir|après-midi)|)|) <<- ~>> *
__[i](p_à_loc_qqch1)__          à (?:califourchon|confesse|contre(?:cœur|temps)|demi-mot|foison|grand-peine|loisir|merveille|moitié|nouveau|outrance|peine|perpétuité|présent|raison|rallonge|rebrousse-poil|reculons|regret|renverse|risque|tâtons|tort|tout-va) <<- ~>> *
__[i](p_à_loc_qqch2)__          à (?:au(?:cun prix|trui|tre chose)|bas (?:co[ûu]t|prix)|bâ(?:bord|tons rompus)|beaucoup près|belles dents|bien (?:des égards|pire|y (?:penser|réfléchir|songer))|bon (?:compte|escient|droit)|bout (?:de (?:bras|souffle|forces?)|nerfs|portant|touchant)|bras (?:ouverts|le corps)|brève échéance|but (?:non |)lucratif|cause d(?:e (?:ça|[mt]oi|lui|[nv]ous)|’e(?:lles?|ux))|ce (?:compte-là|moment-là|titre)|cet (?:égard|instant(?: précis|))|cette (?:date|époque(?: de l’année|)|heure de la (?:journée|nuit)|occasion)|chaque (?:fois|instant)|chaudes larmes|cœur (?:joie|ouvert|perdu)|ciel ouvert|contre-cœur|corps perdu|cou(?:p sûr|per le souffle|rt terme|rte (?:échéance|portée))|de (?:nombreuses|multiples) reprises|des kilomètres à la ronde|défaut d’autre chose|double (?:titre|tranchant)|durée limitée|en (?:juger par (?:[mts]on|[nv]otre|leur) expérience|perdre (?:haleine|la tête))|faible (?:allure|revenu)|feu et à sang|flanc de (?:colline|montagne)|fleur de peau|géométrie variable|grand(?:-peine|e échelle)|haut risque|hue et à dia|huis clos|intervalles (?:ir|)réguliers|juste (?:raison|titre)|long terme|longue(?: échéance| portée|ur (?:de (?:temps|journée))|d’année)|loyer modéré|main(?: (?:armée|droite|gauche|levée)|s nues)|maint(?:s égards|es reprises)|marche forcée|merveille|mi-(?:course|distance|temps)|mi(?:di|nuit)(?: pile|)|moindres frais|mots couverts|moyen(?: terme|ne échéance)|n’en (?:pas douter|point douter|plus finir)|outrance|parler franc|part (?:entière|ça|ce(?:la|ci))|partir de là|part(?:ir de rien|s égales)|pas de (?:géant|loup|tortue|velours)|personne en danger|perte de vue|petit(?: feu|e (?:dose|échelle))|peu (?:de (?:distance|choses près|frais)|près)|pieds joints|pile ou face|plat(?: ventre|e couture)|plein(?: (?:régime|temps|nez)|s poumons)|plus (?:forte raison|d’un titre)|point nommé|portée de (?:main|tir)|première vue|prix (?:cassé|modique)s?|proprement parler|qui (?:mieux mieux|que ce soit|de droit)|quelque(?: distance|s (?:exceptions|nuances) près)|ras bords?|rude épreuve|somme nulle|tel point|temps (?:plein|partiel|complet)|tête reposée|tire[ -]d’aile|titre (?:conservatoire|d’exemple|expérimental|indicatif|informatif|grâcieux|personnel|posthume)|tombeau ouvert|tort (?:ou à raison|et à travers)|tour de (?:bras|rôle)|tous (?:crins|points de vue)|toutes (?:fins utiles|jambes)|tribord|tu et à toi|un moment donné|usage interne|visage (?:découvert|humain)|vive allure|voix (?:haute|basse)|vol d’oiseau|vrai dire|vue d’œil|y (?:regarder de plus près|réfléchir)) <<- ~>> *
__[i](p_à_partir_de)__          à partir (?:de (?:demain(?: matin| midi| soir|)|là|maintenant|rien)|d’(?:aujourd’hui|hier(?: matin| midi| soir|)|ici)) <<- ~>> *
__[i](p_à_quelques_uns)__       à quelques-un(?:s d’entre (?:eux|nous|vous)|es d’entre (?:nous|vous|elles)) <<- ~>> *
__[i](p_à_tout_qqch)__          à tout(?: (?:âge|bout de champ|crin|instant|jamais|le (?:moins|monde)|moment|point de vue|prix|un chacun)|e (?:allure|bride|épreuve|force|heure(?: d(?:u jour|e la nuit)|)|vitesse|volée)) <<- ~>> *
__[i](p_à_l_qqch)__             à l’(?:heure (?:actuelle|qu il est)|accoutumée|amiable|avance|aven(?:ir(?: incertain)|ant)|air libre|aveuglette|emporte-pièce|échelle (?:nationale|mondiale|régionale|départementale|cantonale|locale|galactique|universelle)|évidence|exclusion de toute autre chose|improviste|inverse|occasion|ordre du jour|œil nu|en croire|un(?:animité| (?:d’entre eux|des leurs)|e (?:d’entre elles|des leurs))) <<- ~>> *
__[i](p_à_det_plur_qqch)__      à (?:[mts]es|[nv]os|leurs) (?:côtés|dépens|risques et périls|trousses) <<- ~>> *
__[i](p_à_det_sing_fem_qqch)__  à (?:[mts]a|[nv]otre|leur) (?:connaissance|disposition|grande (?:surprise|tristesse)|guise|juste mesure|portée) <<- ~>> *
__[i](p_à_det_sing_mas_qqch)__  à (?:[mts]on|[nv]otre|leur) (?:avis|c(?:œur|orps) défendant|détriment|encontre|égard|grand (?:désarroi|soulagement)|insu|sujet|tour) <<- ~>> *
__[i](p_à_midi_minuit)__        à mi(?:di|nuit)(?: pile|) <<- ~>> *
__[i](p_à_cette_heure)__        à cette heure(?: (?:du jour|de la nuit|tardive|matinale)|) <<- ~>> *
__[i](p_a_loc_latine)__         [aà] (?:priori|post[eé]riori|contrario|cappella|minima) <<- ~>> *
__[i](p_ab_loc_latine)__        ab (?:absurdo|initio) <<- ~>> *
__[i](p_ad_loc_latine)__        ad (?:hoc|vitam æternam|hominem|infinitum|nauseam|valorem|patres) <<- ~>> *
__[i](p_advienne_que_pourra)__  advienne que pourra <<- ~>> *
__[i](p_après_qqch)__           après (?:[mts]oi|lui|eux|mûre réflexion|tout,|un certain temps|cette date(?: fatidique|)) <<- ~>> *
__[i](p_qqch_après_identique)__ (heure|minute|seconde|jour|nuit|semaine|trimestre|semestre|mois|décennie|année|siècle|génération) après \1 @@0 <<- ~>> *
__[i](p_au_dessus_delà_qqch)__  au-de(?:ssus (?:de (?:[mts]oi|lui|[nv]ous)|d’(?:eux|elles?))|là du descriptible) <<- ~>> *
__[i](p_au_qqch)__              au (?:[xXvViI]+[eᵉ] siècle|bas mot|beau fixe|bon moment|bout (?:du (?:compte|rouleau)|d’un moment)|cas par cas|commencement|contraire|coude à coude|coup par coup|déb(?:otté|but)|demeurant|doigt mouillé|fil (?:des ans|du temps)|grand (?:complet|jamais)|hasard|jour (?:et à l’heure dits|le jour)|jugé|leur|lieu de (?:ce(?:la|ci)|ça|quoi)|loin|même titre que n’importe l(?:aquelle|equel) d’entre (?:nous|vous|eux|elles)|milieu de nulle part|moment opportun|pas de (?:charge|course)|plus (?:haut point|près|pressé|vite|tôt|tard)|premier abord|préalable|propre comme au figuré|quotidien|ras des pâquerettes|sens (?:figuré|large|propre)|surplus) <<- ~>> *
__[i](p_au_adj_moment)__        au (?:dernier|même|bon|mauvais) (?:moment|instant) <<- ~>> *
__[i](p_au_cours_des)__         au cours des (?:deux|trois|quatre|cinq|six|sept|huit|neux|dix|onze|douze|treize|quatorze|quinze|seize|dix-(?:sept|huit|neuf)|vingt|trente|quarante|cinquante|soixante|soixante-dix|quatre-vingt|quatre-vingt-dix|cent) (?:derni(?:ère|er)s|prochaine?s) (?:années|mois|siècles) <<- ~>> *
__[i](p_au_fond_de_qqch)__      (?:tout |)au fond (?:de (?:[mts]oi|lui|[nv]ous)|d’(?:elles?|eux))(?:-mêmes?|) <<- ~>> *
__[i](p_aux_qqch)__             aux (?:abois|leurs|mien(?:ne|)s|tien(?:ne|)s|sien(?:ne|)s) <<- ~>> *
__[i](p_autant_que_qqch)__      autant que (?:nécessaire|possible|prévu|faire se peut) <<- ~>> *
__[i](p_autour_de_qqch)__       autour (?:d’(?:eux|elles?)|de (?:lui|[nv]ous|[mt]oi)) <<- ~>> *
__[i](p_autrement_dit)__        autrement dit <<- ~>> *
__[i](p_av_JC)__                av. J.-C. <<- ~>> *
__[i](p_avant_qqch)__           avant (?:longtemps|terme|tout le monde|toute(?: chose|s choses)|d’aller plus loin|J.-C.|Jésus-Christ|d’en arriver là|de faire quoi que ce soit(?: de stupide|)|qu il ne soit trop tard) <<- ~>> *
__[i](p_avec_qqch1)__           avec (?:brio|joie|légèreté|insistance|peine|autre chose|pertes et fracas|un peu de chance|tout le respect que (?:je (?:vous|te|l(?:eur|ui)) dois|nous (?:vous|te|l(?:eur|ui)) devons)|tout un chacun) <<- ~>> *
__[i](p_avec_qqch2)__           avec (?:autrui|[mts]oi|lui|e(?:ux|lles?)|[nv]ous(?: autres)|le plus grand soin|tout le monde|tout ça|on ne sait quo?i)(?! qui) <<- ~>> *
__[i](p_beaucoup_plus_moins)__  beaucoup (?:plus|moins) <<- ~>> *
__[i](p_bel_et_bien)__          bel et bien <<- ~>> *
__[i](p_bien_adv_temps)__       bien (?:assez tôt|des fois|souvent) <<- ~>> *
__[i](p_bon_gré_mal_gré)__      bon gré,? mal gré <<- ~>> *
__[i](p_bras_dessus_dessous)__  bras dessus,? bras dessous <<- ~>> *
__[i](p_çà_et_là)__             çà et là <<- ~>> *
__[i](p_ce_faisant)__           ce faisant <<- ~>> *
__[i](p_ceci_qqch)__            ceci (?:mis à part|va sans dire) <<- ~>> *
__[i](p_cela_qqch)__            cela (?:mis à part|va sans dire) <<- ~>> *
__[i](p_ces_derniers_temps)__   ces derniers temps <<- ~>> *
__[i](p_ceux_d_entre_pronom)__  ce(?:lui|lles?|ux) (d’entre (?:[nv]ous|eux|elles)) @@$ <<- ~1>> *
__[i](p_cette_fois_là)__        cette fois-(?:là|ci) <<- ~>> *
__[i](p_chacun_d_entre_nous)__  chacune? (d’entre (?:[nv]ous|eux|elles)) @@$ <<- ~1>> *
__[i](p_chemin_de_fer)__        chemins? (de fer) @@$ <<- ~1>> *
__[i](p_chez)__                 chez (?:[mt]oi|lui|e(?:ux|lles?)|[nv]ous|autrui|quelqu’une?|on ne sait qui) <<- ~>> *
__[i](p_comme_qqch)__           comme (?:avant|autrefois|d’habitude|toujours|de juste|bon (?:me|te|l(?:ui|eur)|[nv]ous) semble|au bon vieux temps|cul et chemise|frappée?s? par la foudre|n’importe où(?: ailleurs|)|par (?:enchantement|magie|un fait exprès)|promis|si de rien n’était|tout un chacun) <<- ~>> *
__[i](p_comme_tant_d_autres)__  comme tant d’autres (?:avant|après) (?:[mts]oi|lui|[nv]ous|eux|elles?)(?! qui) <<- ~>> *
__[i](p_contrairement_aux_apparences)__     contrairement aux apparences <<- ~>> *
__[i](p_contre_qqch)__          contre (?:mauvaise fortune,? bon cœur|nature|toute (?:attente|vraisemblance)|vents et marées|[mts]oi|lui|elles?|[nv]ous|eux|(?:[mts]on|[nv]otre|leur) gré) <<- ~>> *
__[i](p_côte_à_côte)__          côte à côte <<- ~>> *



__[i](p_coute_que_coute)__      co[ûu]te que co[ûu]te <<- ~>> *
__[i](p_crois_le_ou_non)__      cro(?:yez|ois)-le ou (?:non|pas) <<- ~>> *
__[i](p_cul_par_dessur_tête)__  cul par-dessus tête <<- ~>> *
__[i](p_dans_qqch)__            dans (?:ces? cas(?: précis|-là|-ci| particuliers?|)|l’i(?:déal|mmédiat)|la mesure du possible|les années \d\d+|peu de temps|tout (?:ce(?:la|ci)|ça)|très peu de temps|un(?: cas comme dans l’autre|e (?:certaine|large|moindre) mesure)) <<- ~>> *
__[i](p_début_mois)__           début (?:janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|septembre|octobre|novembre|décembre)(?: \d\d\d\d|) <<- ~>> *
__[i](p_d_qqch)__               d’(?:abord|affilée|ailleurs|année en année|aujourd’hui|antan|autant (?:plus|moins)|autre(?:fois|s fois| part)|arr(?:arrache-?pied|ière en avant)|avant en arrière|à côté|âge mûr|emblée|empoigne|en face|entr(?:e (?:[nv]ous|eux|elles)|ée de jeu)|est en ouest|extrême[ -](?:droite|gauche)|égale? à égale?|habitude|heure en heure|hier(?: (?:matin|soir|après-midi)|)|ici(?: là| peu(?: de temps|)| très peu(?: de temps|)|)|ordinaire|origine (?:inconnue|douteuse)|ordre général|ouest en est|ore?s et déjà|un (?:bout à|côté comme de) l’autre|un autre côté) <<- ~>> *
__[i](p_d_une_qqch)__           d’une (?:autre trempe|(?:façon|manière) ou d’une autre|certaine (?:façon|manière)|tout autre ampleur|(?:minute|seconde) à l’autre) <<- ~>> *
__[i](p_d_où_que)__             d’où qu (?:(?:il|elle|on) vienne|(?:ils|elles) viennent) <<- ~>> *
__[i](p_de_ci_de_là)__          de-ci,? de-là <<- ~>> *
__[i](p_de_heure)__             de \d\d? ?h(?: ?\d\d|)(?: (?:du (?:matin|soir)|de l’après-midi|ce (?:matin|soir)|cet après-midi|demain (?:matin|soir|après-midi))|) <<- ~>> *
__[i](p_de_qqch)__              de (?:\d+(?:,\d+|) ?%|cesse|conserve|facto|fait|guingois|luxe|nouveau|permanence|partout|préférence|profundis|rechange|routine|surcro[îi]t|visu|A à Z|bas(?: (?:en haut|étage)|se (?:condition|extraction|))|bon (?:aloi|cœur|gré|matin|sens|ton)|bonne (?:facture|famille|foi|heure|humeur|grâce|qualité|compagnie)|bric et de broc|but en blanc|ce(?: (?:fait(?: même|)|seul fait|point de vue)|tte sorte)|courte (?:durée|vue)|dernière minute|demain(?: (?:matin|soir|après-midi)|)|droite (?:à|comme de) gauche|fil en aiguille|fond en comble|fort (?:loin|près)|fra[iî]che date|ga[îi]e?té de cœur|gauche (?:à|comme de) droite|grande (?:taille|envergure)|gré ou de force|guerre lasse|haut(?: (?:en bas|rang|vol)|e (?:lutte|stature|volée))|jour comme de nuit|là-bas|la (?:meilleure (?:manière|façon) possible|même (?:façon|manière)|sorte|tête aux pieds|veille)|loin(?: en loin|)|longue (?:date|durée|haleine)|main de ma[îi]tre|mauvais(?: (?:aloi|go[ûu]t|gré)|e (?:foi|grâce|humeur))|mieux en mieux|nature (?:inconnue|indéterminée|insolite)|nombreuses (?:fois|années plus (?:tôt|tard))|nos jours|notoriété publique|nulle part|pire en pire|près(?: ou de loin|)|par(?: le monde(?: entier|)|t et d’autre)|petite taille|pied ferme|premi(?:er (?:ordre|plan)|ère main)|plein (?:droit|fouet)|plus (?:belle|près)|première nécessité|prime abord|proche en proche|sang-froid|seconde (?:zone|importance|main)|si bon(?: matin|ne heure)|source sûre|taille moyenne|telle sorte|temps (?:en temps|à autre)|tr(?:ès|op) (?:loin|près)|vive voix) <<- ~>> *
__[i](p_de_nous_vous_tous)__    de [nv]ous tous <<- ~>> *
__[i](p_de_tout_qqch)__         de tou(?:t (?:poil|temps|à l’heure|premier (?:ordre|plan))|tes (?:parts|pièces|sortes|(?:[mts]es|leurs|[nv]os) forces)|te (?:éternité|évidence|façon|urgence)|s (?:côtés|bords)) <<- ~>> *
__[i](p_de_ceux_celles)__       de ce(?:ux|lles)-(?:ci|là)(?! qui) <<- ~>> *
__[i](p_de_det_mas_qqch)__      de (?:[mts]on|[nv]otre|leur) (?:mieux|plein gré|point de vue|propre (?:cru|chef)|vivant) <<- ~>> *
__[i](p_de_det_fem_qqch)__      de (?:[mts]a|[nv]otre|leur) part <<- ~>> *
__[i](p_de_qqch_en_identique)__ de (moins|plus|mieux|pire|jour|minute|semaine|mois|trimestre|semestre|siècle|millénaire|décennie) en \1 @@3 <<- ~>> *
__<i](p_de_plus)__              ^ *de plus <<- ~>> *
__[i](p_des_qqch)__             des (?:fois|pieds à la tête|uns et des autres|(?:années|mois|siècles|millénaires|décennies|semaines) plus t(?:ôt|ard)) <<- ~>> *
__[i](p_depuis_qqch)__          depuis (?:assez longtemps|belle lurette|bien longtemps|de (?:très |)longues années|des lustres|longtemps|lors|peu de temps|quelque temps|quelques (?:secondes|minutes|heures|jours|semaines|mois|trimestres|semestres|années|décennies|siècles|millénaires)|si longtemps|toujours|tout ce temps|très longtemps) <<- ~>> *
__[i](p_depuis_tps)__           depuis (\d+ (?:ans|années|mois|semaines|jours|heures|minutes|secondes|)|les années \d\d+) @@$ <<- ~>> *
__[i](p_Dieu_en_garde_témoin)__ Dieu (?:[mt]’en (?:garde|soit témoin)|[nv]ous en (?:garde|soit témoin)|l(?:es |’)en garde|l(?:eur|ui) en soit témoin) <<- ~>> *
__[i](p_du_moins)__             du moins <<- ~>> _
__[i](p_du_qqch)__              du (?:[xXvViI]+[eᵉ] siècle|bout des lèvres|début à la fin|fond du cœur|jour au lendemain|haut en bas|même (?:acabit|tonneau)|moins,? pas|(?:nord|sud) au (?:nord|sud)|tout au tout) <<- ~>> *
__[i](p_demain)__               (?:après-|avant |)demain(?: matin| soir| après-midi|) <<- ~>> *
__[i](p_don_Juan)__             (don) Juan @@0 <<- ~1>> *
__[i](p_du_même_ordre_coup)__   du même (?:ordre|coup) <<- ~>> *
__[i](p_en_nombre_années)__     en \d\d+(?: ans| années|) <<- ~>> *
__[i](p_en_cours)__             en cours(?! d[e’]) <<- ~>> *
__[i](p_en_pronom)__            en (?:[mt]oi|eux|elles?) <<- ~>> *
__[i](p_en_qqch1)__             en (?:aparté|apparence|arrière|avance|avant|cachette|ceci|cela|clair|commun|conséquence|continu|contrepartie|définitive|détail|direct|douce|effet|émoi|filigrane|général|goguette|hâte|majorité|outre|pâmoison|parallèle|partie|particulier|permanence|personne|pratique|prime|privé|principe|priorité|public|réalité|retour|revanche|rien|rogne|route|secret|silence|somme|suspens|théorie|trompe-l’œil|vain|vérité|ville|vitesse) <<- ~>> *
__[i](p_en_qqch2)__             en (?:aucun(?: cas|e (?:circonstance|façon|manière))|bon(?: état|ne (?:compagnie|et due forme|posture|santé(?: physique| mentale|)|voie))|bout de course|cas d(?:e (?:besoin|doute)|’urgence)|chacune? d(?:e [nv]ous|’(?:eux|elles))|chair et en os|chute libre|comparution immédiate|connaissance de cause|coupe réglée|cours de route|d’autres (?:circonstances|termes|temps)|de telles circonstances|début d(?:e (?:journée|matinée|soirée)|’après-midi)|définitive|dehors de (?:tout|)(?:ça|cela|ceci)|dents de scie|dernier (?:lieu|recours|ressort)|désespoir de cause|détention provisoire|direction d(?:u (?:nord|sud)(?:-est|-ouest|)|e l’(?:est|ouest))|état (?:de (?:choc(?: circulatoire|)|marche)|d’ébriété(?: avancée|))|file indienne|fin d(?:e (?:compte|journée|matinée|soirée)|’après-midi)|forte (?:baisse|hausse)|garde à vue(?: prolongée|)|grand(?: nombre|e (?:difficulté|majorité|partie|pompe))|haut lieu|l’occurrence|lieu sûr|ligne de (?:compte|mire)|mains propres|mauvais(?: état|e (?:posture|santé))|même temps|milieu d(?:e (?:journée|matinée|soirée)|’après-midi)|nombre (?:plus que |)suffisant|partant de zéro|plein(?: air| cœur| jour|e (?:gueule|figure|forme|nuit))|perte de vitesse|peu de temps|point de mire|position de force|premi(?:er lieu|ère (?:instance|ligne))|pure perte|quantité (?:plus que |)suffisante|quelque sorte|queue de peloton|rase campagne|règle générale|roue libre|sens inverse|si peu de temps|sous-main|tête à tête|temps (?:et en heure|normal|opportun|ordinaire|utile|voulu)|termes choisis|toile de fond|tous (?:les cas|sens)|tout (?:bien tout honneur|cas|genre|lieu|et pour tout|état de cause|premier lieu|sens|temps)|toute(?: (?:bonne foi|circonstance|connaissance de cause|confiance|discrétion|franchise|hâte|impartialité|impunité|innocence|légalité|liberté|logique|sécurité|simplicité)|s circonstances)|un (?:clin d’œil|rien de temps)|une autre occasion|vase clos|voie de développement|y réfléchissant bien) <<- ~>> *
__[i](p_en_mois_dernier)__      en (?:janvier|février|mars|avril|mai|jui(?:n|llet)|ao[ûu]t|septembre|octobre|novembre|décembre) dernier <<- ~>> *
__[i](p_en_dat_mas_qqch)__      en (?:[mts]on|leur|[nv]otre) (?:âme et conscience|for intérieur|nom propre) <<- ~>> *
__[i](p_en_ce_qqch)__           en ce(?: (?:moment|temps-là|qui (?:[mt]e|l(?:es?|a)|[nv]ous) concern(?:e|ait))|t instant) <<- ~>> *
__[i](p_encore_qqch)__          encore (?:une fois|et (?:encore|toujours)) <<- ~>> *
__[i](p_envers_qqch)__          envers (?:autrui|et contre tout|les uns et les autres|tout le monde) <<- ~>> *
__[i](p_entre_qqch)__           entre (?:(?:[mt]oi|lui|elles?|[nv]ous|eux) et (?:[mt]oi|lui|elles?|[nv]ous|eux)|de (?:bonnes|mauvaises) mains|l’une? et l’autre|les uns et les autres|quat(?:re[- ]z-?yeux|’ z-?yeux)) <<- ~>> *
__[i](p_entre_date)__           entre (?:janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|septembre|octobre|novembre|décembre) (?:\d\d{1,3} |)et (?:janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|septembre|octobre|novembre|décembre)(?: \d\d{1,3}|) <<- ~>> *







|

|
|













|











|
|
















|



|
>
>
>










|




















|







4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
## Inconditionnel
__[i](p_24h_sur_24)__           24 ?h(?:eures|) ?(?:sur |/ ?)24 <<- ~>> *
__[i](p_7j_sur_7)__             7 ?j(?:ours|) ?(?:sur |/ ?)7 <<- ~>> *
__[i](p_sept_j_sur_sept)__      sept jours sur sept <<- ~>> *
__[i](p_vq_h_sur_vq_)__         vingt-quatre heures sur vingt-quatre <<- ~>> *
__<i](p_loc_de_début_phrase)__  ^ *(?:et(?: puis|)|puis|car|mais|or donc|m’est avis que) <<- ~>> *
__[i](p_à_côté_de)__            à côté (?:de (?:ça|lui|[mt]oi|[nv]ous)|d’(?:elles|eux))(?! et) <<- ~>> *
__[i](p_à_la_qqch)__            à la (?:bo(?:nne franquette|urre)|con|dér(?:ive|obée)|diable|fois|leur|limite du supportable|longue|lumière de tout ce(?:ci|la)|manque|mords-moi-le-nœud|papa|petite semaine|pointe du progrès|première occasion|queue leu leu|ramasse|re(?:nverse|dresse|scousse)|sauvette|surprise générale|virgule près|volée) <<- ~>> *
__[i](p_à_heure)__              à \d\d? ?h(?: ?\d\d|)(?: (?:du (?:matin|soir)|de l’après-midi|ce (?:matin|soir)|cet après-midi|demain (?:matin|soir|après-midi)|)|) <<- ~>> *
__[i](p_à_loc_qqch1)__          à (?:califourchon|chacun|confesse|contre(?:cœur|temps)|demi-mot|foison|grand-peine|loisir|merveille|moitié|nouveau|outrance|peine|perpétuité|présent|raison|rallonge|rebrousse-poil|reculons|regret|renverse|risque|tâtons|tort|tout-va) <<- ~>> *
__[i](p_à_loc_qqch2)__          à (?:au(?:cun prix|trui|tre chose)|bas (?:co[ûu]t|prix)|bâ(?:bord|tons rompus)|beaucoup près|belles dents|bien (?:des égards|pire|y (?:penser|réfléchir|songer))|bon (?:compte|escient|droit)|bout (?:de (?:bras|souffle|forces?)|nerfs|portant|touchant)|bras (?:ouverts|le corps)|brève échéance|but (?:non |)lucratif|cause d(?:e (?:ça|[mt]oi|lui|[nv]ous)|’e(?:lles?|ux))|ce (?:compte-là|moment-là|titre)|cet (?:égard|instant(?: précis|))|cette (?:date|époque(?: de l’année|)|heure de la (?:journée|nuit)|occasion)|chaque (?:fois|instant)|chaudes larmes|cœur (?:joie|ouvert|perdu)|ciel ouvert|contre-cœur|corps perdu|cou(?:p sûr|per le souffle|rt terme|rte (?:échéance|portée))|couilles rabattues|de (?:nombreuses|multiples) reprises|des kilomètres à la ronde|défaut d’autre chose|dose homéopathique|double (?:titre|tranchant)|durée limitée|en (?:juger par (?:[mts]on|[nv]otre|leur) expérience|perdre (?:haleine|la tête))|faible (?:allure|revenu)|feu et à sang|flanc de (?:colline|montagne)|fleur de peau|franchement parler|géométrie variable|grand(?:-peine|e échelle)|haut risque|hue et à dia|huis clos|intervalles (?:ir|)réguliers|juste (?:raison|titre)|long terme|longue(?: échéance| portée|ur (?:de (?:temps|journée))|d’année)|loyer modéré|main(?: (?:armée|droite|gauche|levée)|s nues)|maint(?:s égards|es reprises)|marche forcée|merveille|mi-(?:course|distance|temps)|mi(?:di|nuit)(?: pile|)|moindres frais|mots couverts|moyen(?: terme|ne échéance)|n’en (?:pas douter|point douter|plus finir)|outrance|parler franc|part (?:entière|ça|ce(?:la|ci))|partir de là|part(?:ir de rien|s égales)|pas de (?:géant|loup|tortue|velours)|personne en danger|perte de vue|petit(?: feu|e (?:dose|échelle))|peu (?:de (?:distance|choses près|frais)|près)|pieds joints|pile ou face|plat(?: ventre|e couture)|plein(?: (?:régime|temps|nez)|s poumons)|plus (?:forte raison|d’un titre)|point nommé|portée de (?:main|tir)|première vue|prix (?:cassé|modique)s?|proprement parler|qui (?:mieux mieux|que ce soit|de droit)|quelque(?: distance|s (?:exceptions|nuances) près)|ras bords?|rude épreuve|s’y méprendre|somme nulle|tel point|temps (?:plein|partiel|complet)|tête reposée|tire[ -]d’aile|titre (?:conservatoire|d’exemple|expérimental|indicatif|informatif|grâcieux|personnel|posthume)|tombeau ouvert|tort (?:ou à raison|et à travers)|tour de (?:bras|rôle)|tous (?:crins|points de vue)|toutes (?:fins utiles|jambes)|tribord|tu et à toi|un moment donné|usage interne|visage (?:découvert|humain)|vive allure|voix (?:haute|basse)|vol d’oiseau|vrai dire|vue d’œil|y (?:regarder de plus près|réfléchir)) <<- ~>> *
__[i](p_à_partir_de)__          à partir (?:de (?:demain(?: matin| midi| soir|)|là|maintenant|rien)|d’(?:aujourd’hui|hier(?: matin| midi| soir|)|ici)) <<- ~>> *
__[i](p_à_quelques_uns)__       à quelques-un(?:s d’entre (?:eux|nous|vous)|es d’entre (?:nous|vous|elles)) <<- ~>> *
__[i](p_à_tout_qqch)__          à tout(?: (?:âge|bout de champ|crin|instant|jamais|le (?:moins|monde)|moment|point de vue|prix|un chacun)|e (?:allure|bride|épreuve|force|heure(?: d(?:u jour|e la nuit)|)|vitesse|volée)) <<- ~>> *
__[i](p_à_l_qqch)__             à l’(?:heure (?:actuelle|qu il est)|accoutumée|amiable|avance|aven(?:ir(?: incertain)|ant)|air libre|aveuglette|emporte-pièce|échelle (?:nationale|mondiale|régionale|départementale|cantonale|locale|galactique|universelle)|évidence|exclusion de toute autre chose|improviste|inverse|occasion|ordre du jour|œil nu|en croire|un(?:animité| (?:d’entre eux|des leurs)|e (?:d’entre elles|des leurs))) <<- ~>> *
__[i](p_à_det_plur_qqch)__      à (?:[mts]es|[nv]os|leurs) (?:côtés|dépens|risques et périls|trousses) <<- ~>> *
__[i](p_à_det_sing_fem_qqch)__  à (?:[mts]a|[nv]otre|leur) (?:connaissance|disposition|grande (?:surprise|tristesse)|guise|juste mesure|portée) <<- ~>> *
__[i](p_à_det_sing_mas_qqch)__  à (?:[mts]on|[nv]otre|leur) (?:avis|c(?:œur|orps) défendant|détriment|encontre|égard|grand (?:désarroi|soulagement)|insu|sujet|tour) <<- ~>> *
__[i](p_à_midi_minuit)__        à mi(?:di|nuit)(?: pile|) <<- ~>> *
__[i](p_à_cette_heure)__        à cette heure(?: (?:du jour|de la nuit|tardive|matinale)|) <<- ~>> *
__[i](p_a_loc_latine)__         [aà] (?:priori|post[eé]riori|contrario|cappella|minima) <<- ~>> *
__[i](p_ab_loc_latine)__        ab (?:absurdo|initio) <<- ~>> *
__[i](p_ad_loc_latine)__        ad (?:hoc|vitam æternam|hominem|infinitum|nauseam|valorem|patres) <<- ~>> *
__[i](p_advienne_que_pourra)__  advienne que pourra <<- ~>> *
__[i](p_après_qqch)__           après (?:[mts]oi|lui|eux|mûre réflexion|tout,|un certain temps|cette date(?: fatidique|)|un bon bout de temps) <<- ~>> *
__[i](p_qqch_après_identique)__ (heure|minute|seconde|jour|nuit|semaine|trimestre|semestre|mois|décennie|année|siècle|génération) après \1 @@0 <<- ~>> *
__[i](p_au_dessus_delà_qqch)__  au-de(?:ssus (?:de (?:[mts]oi|lui|[nv]ous)|d’(?:eux|elles?))|là du descriptible) <<- ~>> *
__[i](p_au_qqch)__              au (?:[xXvViI]+[eᵉ] siècle|bas mot|beau fixe|bon moment|bout (?:du (?:compte|rouleau)|d’un moment)|cas par cas|commencement|contraire|coude à coude|coup par coup|déb(?:otté|but)|demeurant|doigt mouillé|fil (?:des ans|du temps)|grand (?:complet|jamais)|hasard|jour (?:et à l’heure dits|le jour)|jugé|leur|lieu de (?:ce(?:la|ci)|ça|quoi)|loin|même titre que n’importe l(?:aquelle|equel) d’entre (?:nous|vous|eux|elles)|milieu de nulle part|moment opportun|pas de (?:charge|course)|plus (?:haut point|près|pressé|vite|tôt|tard)|premier abord|préalable|propre comme au figuré|quotidien|ras des pâquerettes|sens (?:figuré|large|propre)|surplus) <<- ~>> *
__[i](p_au_adj_moment)__        au (?:dernier|même|bon|mauvais) (?:moment|instant) <<- ~>> *
__[i](p_au_cours_des)__         au cours des (?:deux|trois|quatre|cinq|six|sept|huit|neux|dix|onze|douze|treize|quatorze|quinze|seize|dix-(?:sept|huit|neuf)|vingt|trente|quarante|cinquante|soixante|soixante-dix|quatre-vingt|quatre-vingt-dix|cent) (?:derni(?:ère|er)s|prochaine?s) (?:années|mois|siècles) <<- ~>> *
__[i](p_au_fond_de_qqch)__      (?:tout |)au fond (?:de (?:[mts]oi|lui|[nv]ous)|d’(?:elles?|eux))(?:-mêmes?|) <<- ~>> *
__[i](p_aux_qqch)__             aux (?:abois|leurs|mien(?:ne|)s|tien(?:ne|)s|sien(?:ne|)s) <<- ~>> *
__[i](p_autant_que_qqch)__      autant que (?:nécessaire|possible|prévu|faire se peut) <<- ~>> *
__[i](p_autour_de_qqch)__       autour (?:d’(?:eux|elles?)|de (?:lui|[nv]ous|[mt]oi)) <<- ~>> *
__[i](p_autrement_dit)__        autrement dit <<- ~>> *
__[i](p_av_JC)__                av. J.-C. <<- ~>> *
__[i](p_avant_qqch)__           avant (?:longtemps|terme|tout le monde|toute(?: chose|s choses)|d’aller plus loin|J.-C.|Jésus-Christ|d’en arriver là|de faire quoi que ce soit(?: de stupide|)|qu il ne soit trop tard|un bon bout de temps) <<- ~>> *
__[i](p_avec_qqch1)__           avec (?:brio|joie|légèreté|insistance|peine|autre chose|pertes et fracas|un peu de chance|tout le respect que (?:je (?:vous|te|l(?:eur|ui)) dois|nous (?:vous|te|l(?:eur|ui)) devons)|tout un chacun|un peu de chance) <<- ~>> *
__[i](p_avec_qqch2)__           avec (?:autrui|[mts]oi|lui|e(?:ux|lles?)|[nv]ous(?: autres)|le plus grand soin|tout le monde|tout ça|on ne sait quo?i)(?! qui) <<- ~>> *
__[i](p_beaucoup_plus_moins)__  beaucoup (?:plus|moins) <<- ~>> *
__[i](p_bel_et_bien)__          bel et bien <<- ~>> *
__[i](p_bien_adv_temps)__       bien (?:assez tôt|des fois|souvent) <<- ~>> *
__[i](p_bon_gré_mal_gré)__      bon gré,? mal gré <<- ~>> *
__[i](p_bras_dessus_dessous)__  bras dessus,? bras dessous <<- ~>> *
__[i](p_çà_et_là)__             çà et là <<- ~>> *
__[i](p_ce_faisant)__           ce faisant <<- ~>> *
__[i](p_ceci_qqch)__            ceci (?:mis à part|va sans dire) <<- ~>> *
__[i](p_cela_qqch)__            cela (?:mis à part|va sans dire) <<- ~>> *
__[i](p_ces_derniers_temps)__   ces derniers temps <<- ~>> *
__[i](p_ceux_d_entre_pronom)__  ce(?:lui|lles?|ux) (d’entre (?:[nv]ous|eux|elles)) @@$ <<- ~1>> *
__[i](p_cette_fois_là)__        cette fois-(?:là|ci) <<- ~>> *
__[i](p_chacun_d_entre_nous)__  chacune? (d’entre (?:[nv]ous|eux|elles)) @@$ <<- ~1>> *
__[i](p_chemin_de_fer)__        chemins? (de fer) @@$ <<- ~1>> *
__[i](p_chez)__                 chez (?:[mt]oi|lui|e(?:ux|lles?)|[nv]ous|autrui|quelqu’une?|on ne sait qui) <<- ~>> *
__[i](p_comme_qqch)__           comme (?:avant|autrefois|d’habitude|toujours|de juste|bon (?:me|te|l(?:ui|eur)|[nv]ous) semble|au bon vieux temps|cul et chemise|frappée?s? par la foudre|n’importe où(?: ailleurs|)|par (?:enchantement|magie|un fait exprès)|promis|qui dirait|si de rien n’était|tout un chacun) <<- ~>> *
__[i](p_comme_tant_d_autres)__  comme tant d’autres (?:avant|après) (?:[mts]oi|lui|[nv]ous|eux|elles?)(?! qui) <<- ~>> *
__[i](p_contrairement_aux_apparences)__     contrairement aux apparences <<- ~>> *
__[i](p_contre_qqch)__          contre (?:mauvaise fortune,? bon cœur|nature|toute (?:attente|vraisemblance)|vents et marées|[mts]oi|lui|elles?|[nv]ous|eux|(?:[mts]on|[nv]otre|leur) gré) <<- ~>> *
__[i](loc_côte_à_côte)__
    c[ôo]tt?es? [àaá] c[ôo]tt?es?
    <<- not re.search("(?i)^côte à côte$", \0) ->> côte à côte      # Locution adverbiale invariable. Écrivez “côte à côte”.|https://fr.wiktionary.org/wiki/c%C3%B4te_%C3%A0_c%C3%B4te
    <<- ~>> *
__[i](p_coute_que_coute)__      co[ûu]te que co[ûu]te <<- ~>> *
__[i](p_crois_le_ou_non)__      cro(?:yez|ois)-le ou (?:non|pas) <<- ~>> *
__[i](p_cul_par_dessur_tête)__  cul par-dessus tête <<- ~>> *
__[i](p_dans_qqch)__            dans (?:ces? cas(?: précis|-là|-ci| particuliers?|)|l’i(?:déal|mmédiat)|la mesure du possible|les années \d\d+|peu de temps|tout (?:ce(?:la|ci)|ça)|très peu de temps|un(?: cas comme dans l’autre|e (?:certaine|large|moindre) mesure)) <<- ~>> *
__[i](p_début_mois)__           début (?:janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|septembre|octobre|novembre|décembre)(?: \d\d\d\d|) <<- ~>> *
__[i](p_d_qqch)__               d’(?:abord|affilée|ailleurs|année en année|aujourd’hui|antan|autant (?:plus|moins)|autre(?:fois|s fois| part)|arr(?:arrache-?pied|ière en avant)|avant en arrière|à côté|âge mûr|emblée|empoigne|en face|entr(?:e (?:[nv]ous|eux|elles)|ée de jeu)|est en ouest|extrême[ -](?:droite|gauche)|égale? à égale?|habitude|heure en heure|hier(?: (?:matin|soir|après-midi)|)|ici(?: là| peu(?: de temps|)| très peu(?: de temps|)|)|ordinaire|origine (?:inconnue|douteuse)|ordre général|ouest en est|ore?s et déjà|un (?:bout à|côté comme de) l’autre|un autre côté) <<- ~>> *
__[i](p_d_une_qqch)__           d’une (?:autre trempe|(?:façon|manière) ou d’une autre|certaine (?:façon|manière)|tout autre ampleur|(?:minute|seconde) à l’autre) <<- ~>> *
__[i](p_d_où_que)__             d’où qu (?:(?:il|elle|on) vienne|(?:ils|elles) viennent) <<- ~>> *
__[i](p_de_ci_de_là)__          de-ci,? de-là <<- ~>> *
__[i](p_de_heure)__             de \d\d? ?h(?: ?\d\d|)(?: (?:du (?:matin|soir)|de l’après-midi|ce (?:matin|soir)|cet après-midi|demain (?:matin|soir|après-midi))|) <<- ~>> *
__[i](p_de_qqch)__              de (?:\d+(?:,\d+|) ?%|cesse|conserve|facto|fait|guingois|luxe|nouveau|permanence|partout|préférence|profundis|rechange|routine|surcro[îi]t|visu|A à Z|bas(?: (?:en haut|étage)|se (?:condition|extraction|))|bon (?:aloi|cœur|gré|matin|sens|ton)|bonne (?:facture|famille|foi|heure|humeur|grâce|qualité|compagnie)|bric et de broc|but en blanc|ce(?: (?:fait(?: même|)|seul fait|point de vue)|tte sorte|t acabit)|courte (?:durée|vue)|dernière minute|demain(?: (?:matin|soir|après-midi)|)|droite (?:à|comme de) gauche|fil en aiguille|fond en comble|fort (?:loin|près)|fra[iî]che date|ga[îi]e?té de cœur|gauche (?:à|comme de) droite|grande (?:taille|envergure)|gré ou de force|guerre lasse|haut(?: (?:en bas|rang|vol)|e (?:lutte|stature|volée))|jour comme de nuit|là-bas|la (?:meilleure (?:manière|façon) possible|même (?:façon|manière)|sorte|tête aux pieds|veille)|loin(?: en loin|)|longue (?:date|durée|haleine)|main de ma[îi]tre|mauvais(?: (?:aloi|go[ûu]t|gré)|e (?:foi|grâce|humeur))|mieux en mieux|nature (?:inconnue|indéterminée|insolite)|nombreuses (?:fois|années plus (?:tôt|tard))|nos jours|notoriété publique|nulle part|pire en pire|près(?: ou de loin|)|par(?: le monde(?: entier|)|t et d’autre)|petite taille|pied ferme|premi(?:er (?:ordre|plan)|ère main)|plein (?:droit|fouet)|plus (?:belle|près)|première nécessité|prime abord|proche en proche|sang-froid|seconde (?:zone|importance|main)|si bon(?: matin|ne heure)|source sûre|taille moyenne|telle sorte|temps (?:en temps|à autre)|tr(?:ès|op) (?:loin|près)|vive voix) <<- ~>> *
__[i](p_de_nous_vous_tous)__    de [nv]ous tous <<- ~>> *
__[i](p_de_tout_qqch)__         de tou(?:t (?:poil|temps|à l’heure|premier (?:ordre|plan))|tes (?:parts|pièces|sortes|(?:[mts]es|leurs|[nv]os) forces)|te (?:éternité|évidence|façon|urgence)|s (?:côtés|bords)) <<- ~>> *
__[i](p_de_ceux_celles)__       de ce(?:ux|lles)-(?:ci|là)(?! qui) <<- ~>> *
__[i](p_de_det_mas_qqch)__      de (?:[mts]on|[nv]otre|leur) (?:mieux|plein gré|point de vue|propre (?:cru|chef)|vivant) <<- ~>> *
__[i](p_de_det_fem_qqch)__      de (?:[mts]a|[nv]otre|leur) part <<- ~>> *
__[i](p_de_qqch_en_identique)__ de (moins|plus|mieux|pire|jour|minute|semaine|mois|trimestre|semestre|siècle|millénaire|décennie) en \1 @@3 <<- ~>> *
__<i](p_de_plus)__              ^ *de plus <<- ~>> *
__[i](p_des_qqch)__             des (?:fois|pieds à la tête|uns et des autres|(?:années|mois|siècles|millénaires|décennies|semaines) plus t(?:ôt|ard)) <<- ~>> *
__[i](p_depuis_qqch)__          depuis (?:assez longtemps|belle lurette|bien longtemps|de (?:très |)longues années|des lustres|longtemps|lors|peu de temps|quelque temps|quelques (?:secondes|minutes|heures|jours|semaines|mois|trimestres|semestres|années|décennies|siècles|millénaires)|si longtemps|toujours|tout ce temps|très longtemps) <<- ~>> *
__[i](p_depuis_tps)__           depuis (\d+ (?:ans|années|mois|semaines|jours|heures|minutes|secondes|)|les années \d\d+) @@$ <<- ~>> *
__[i](p_Dieu_en_garde_témoin)__ Dieu (?:[mt]’en (?:garde|soit témoin)|[nv]ous en (?:garde|soit témoin)|l(?:es |’)en garde|l(?:eur|ui) en soit témoin) <<- ~>> *
__[i](p_du_moins)__             du moins <<- ~>> _
__[i](p_du_qqch)__              du (?:[xXvViI]+[eᵉ] siècle|bout des lèvres|début à la fin|fond du cœur|jour au lendemain|haut en bas|même (?:acabit|tonneau)|moins,? pas|(?:nord|sud) au (?:nord|sud)|tout au tout) <<- ~>> *
__[i](p_demain)__               (?:après-|avant |)demain(?: matin| soir| après-midi|) <<- ~>> *
__[i](p_don_Juan)__             (don) Juan @@0 <<- ~1>> *
__[i](p_du_même_ordre_coup)__   du même (?:ordre|coup) <<- ~>> *
__[i](p_en_nombre_années)__     en \d\d+(?: ans| années|) <<- ~>> *
__[i](p_en_cours)__             en cours(?! d[e’]) <<- ~>> *
__[i](p_en_pronom)__            en (?:[mt]oi|eux|elles?) <<- ~>> *
__[i](p_en_qqch1)__             en (?:aparté|apparence|arrière|avance|avant|cachette|ceci|cela|clair|commun|conséquence|continu|contrepartie|définitive|détail|direct|douce|effet|émoi|filigrane|général|goguette|hâte|majorité|outre|pâmoison|parallèle|partie|particulier|permanence|personne|pratique|prime|privé|principe|priorité|public|réalité|retour|revanche|rien|rogne|route|secret|silence|somme|suspens|théorie|trompe-l’œil|vain|vérité|ville|vitesse) <<- ~>> *
__[i](p_en_qqch2)__             en (?:aucun(?: cas|e (?:circonstance|façon|manière))|bon(?: état|ne (?:compagnie|et due forme|posture|santé(?: physique| mentale|)|voie))|bout de course|cas d(?:e (?:besoin|doute)|’urgence)|chacune? d(?:e [nv]ous|’(?:eux|elles))|chair et en os|chute libre|comparution immédiate|connaissance de cause|coupe réglée|cours de route|d’autres (?:circonstances|termes|temps)|de telles circonstances|début d(?:e (?:journée|matinée|soirée)|’après-midi)|définitive|dehors de (?:tout|)(?:ça|cela|ceci)|dents de scie|dernier (?:lieu|recours|ressort)|désespoir de cause|détention provisoire|direction d(?:u (?:nord|sud)(?:-est|-ouest|)|e l’(?:est|ouest))|état (?:de (?:choc(?: circulatoire|)|marche)|d’ébriété(?: avancée|))|excellent état|file indienne|fin d(?:e (?:compte|journée|matinée|soirée)|’après-midi)|forte (?:baisse|hausse)|garde à vue(?: prolongée|)|grand(?: nombre|e (?:difficulté|majorité|partie|pompe))|haut lieu|l’occurrence|lieu sûr|ligne de (?:compte|mire)|mains propres|mauvais(?: état|e (?:posture|santé))|même temps|milieu d(?:e (?:journée|matinée|soirée)|’après-midi)|nombre (?:plus que |)suffisant|partant de zéro|plein(?: air| cœur| jour|e (?:gueule|figure|forme|poire|nuit|tronche))|perte de vitesse|peu de temps|piteux état|point de mire|position de force|premi(?:er lieu|ère (?:instance|ligne))|pure perte|quantité (?:plus que |)suffisante|quelque sorte|queue de peloton|rangs serrés|rase campagne|règle générale|roue libre|sens inverse|si peu de temps|sous-main|tête à tête|temps (?:et en heure|normal|opportun|ordinaire|utile|voulu)|termes choisis|toile de fond|tous (?:les cas|sens)|tout (?:bien tout honneur|cas|genre|lieu|et pour tout|état de cause|premier lieu|sens|temps)|toute(?: (?:bonne foi|circonstance|connaissance de cause|confiance|discrétion|franchise|hâte|impartialité|impunité|innocence|légalité|liberté|logique|sécurité|simplicité)|s circonstances)|un (?:clin d’œil|rien de temps)|une autre occasion|vase clos|voie de développement|y réfléchissant bien) <<- ~>> *
__[i](p_en_mois_dernier)__      en (?:janvier|février|mars|avril|mai|jui(?:n|llet)|ao[ûu]t|septembre|octobre|novembre|décembre) dernier <<- ~>> *
__[i](p_en_dat_mas_qqch)__      en (?:[mts]on|leur|[nv]otre) (?:âme et conscience|for intérieur|nom propre) <<- ~>> *
__[i](p_en_ce_qqch)__           en ce(?: (?:moment|temps-là|qui (?:[mt]e|l(?:es?|a)|[nv]ous) concern(?:e|ait))|t instant) <<- ~>> *
__[i](p_encore_qqch)__          encore (?:une fois|et (?:encore|toujours)) <<- ~>> *
__[i](p_envers_qqch)__          envers (?:autrui|et contre tout|les uns et les autres|tout le monde) <<- ~>> *
__[i](p_entre_qqch)__           entre (?:(?:[mt]oi|lui|elles?|[nv]ous|eux) et (?:[mt]oi|lui|elles?|[nv]ous|eux)|de (?:bonnes|mauvaises) mains|l’une? et l’autre|les uns et les autres|quat(?:re[- ]z-?yeux|’ z-?yeux)) <<- ~>> *
__[i](p_entre_date)__           entre (?:janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|septembre|octobre|novembre|décembre) (?:\d\d{1,3} |)et (?:janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|septembre|octobre|novembre|décembre)(?: \d\d{1,3}|) <<- ~>> *
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
__[i](p_illico_presto)__        illico presto <<- ~>> *
__[i](p_in_loc_latine)__        in (?:abstracto|extenso|extremis|fine|petto|situ|utero|vitro|vivo) <<- ~>> *
__[i](p_ipso_facto)__           ipso facto <<- ~>> *
__[i](p_j_en_passe)__           j’en passe et des meilleure?s <<- ~>> *
__[i](p_jour_pour_jour)__       jour pour jour <<- ~>> *
__[i](p_jusque_là)__            jusque-là <<- ~>> *
__[i](p_jusque_qqch)__          jusqu (?:alors|ici|aujourd’hui|au bout des ongles) <<- ~>> *
__[i](p_jusque_à_qqch)__        jusqu à (?:aujourd’hui|bac|présent|maintenant|récemment|(?:demain|hier)(?: matin| soir| après-midi|)|nouvel ordre|plus (?:ample informé|soif)|preuve du contraire|la fin de (?:[mts]es|[nv]os|leurs) jours|(?:[mts]on|leur|[nv]otre) dernier souffle(?: de vie|)|ce que (?:mort s’ensuive|(?:j’en sache|tu en saches|(?:il|elle|on) en sache|nous en sachions|vous en sachiez|(?:ils|elles) en sachent) plus)|Noël|Pâques) <<- ~>> *
__[i](p_la_qqch)__              la (?:plupart du temps|main dans la main|mort dans l’âme) <<- ~>> *
__[i](p_le_qqch)__              le (?:cas échéant|moins (?:du monde|souvent)|plus (?:tôt|tard|souvent|de (?:temps|monde)) possible|moment venu|plus souvent) <<- ~>> *
__[i](p_là_qqch)__              là(?:-bas|-haut|-de(?:dans|hors|rrière|sso?us|vant)| non plus) <<- ~>> *
__[i](p_l_un_qqch)__            l’une? (?:après|pour|de(?:rrière|)|avec|contre|sur|près de) l’autre <<- ~>> *
__[i](p_le_pour_et_le_contre)__ le pour et le contre <<- ~>> =\0.replace(" ", "_")
__[i](p_les_uns_les_autres)__   les une?s (?:des |(?:après |pour |avec |contre |sur |derrière |devant |)les) autres <<- ~>> *
__[i](p_non_loin)__             non loin (?:d’ici|de là) <<- ~>> *







|







4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
__[i](p_illico_presto)__        illico presto <<- ~>> *
__[i](p_in_loc_latine)__        in (?:abstracto|extenso|extremis|fine|petto|situ|utero|vitro|vivo) <<- ~>> *
__[i](p_ipso_facto)__           ipso facto <<- ~>> *
__[i](p_j_en_passe)__           j’en passe et des meilleure?s <<- ~>> *
__[i](p_jour_pour_jour)__       jour pour jour <<- ~>> *
__[i](p_jusque_là)__            jusque-là <<- ~>> *
__[i](p_jusque_qqch)__          jusqu (?:alors|ici|aujourd’hui|au bout des ongles) <<- ~>> *
__[i](p_jusque_à_qqch)__        jusqu à (?:aujourd’hui|bac|présent|maintenant|récemment|(?:demain|hier)(?: matin| soir| après-midi|)|nouvel ordre|plus (?:ample informé|soif)|preuve du contraire|la (?:fin de(?: (?:[mts]es|[nv]os|leurs) jours|s temps)|tombée de la nuit)|(?:[mts]on|leur|[nv]otre) dernier souffle(?: de vie|)|ce que (?:mort s’ensuive|(?:j’en sache|tu en saches|(?:il|elle|on) en sache|nous en sachions|vous en sachiez|(?:ils|elles) en sachent) plus)|Noël|Pâques) <<- ~>> *
__[i](p_la_qqch)__              la (?:plupart du temps|main dans la main|mort dans l’âme) <<- ~>> *
__[i](p_le_qqch)__              le (?:cas échéant|moins (?:du monde|souvent)|plus (?:tôt|tard|souvent|de (?:temps|monde)) possible|moment venu|plus souvent) <<- ~>> *
__[i](p_là_qqch)__              là(?:-bas|-haut|-de(?:dans|hors|rrière|sso?us|vant)| non plus) <<- ~>> *
__[i](p_l_un_qqch)__            l’une? (?:après|pour|de(?:rrière|)|avec|contre|sur|près de) l’autre <<- ~>> *
__[i](p_le_pour_et_le_contre)__ le pour et le contre <<- ~>> =\0.replace(" ", "_")
__[i](p_les_uns_les_autres)__   les une?s (?:des |(?:après |pour |avec |contre |sur |derrière |devant |)les) autres <<- ~>> *
__[i](p_non_loin)__             non loin (?:d’ici|de là) <<- ~>> *
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
__[i](p_ou_bien)__              ou (bien) @@3 <<- ~1>> *
__[i](p_ou_qqch_d_approchant)__ ou quelque chose d’approchant <<- ~>> *
__[i](p_où_bon_nous_semble)__   où bon (?:me|te|lui|nous|vous|leur) semble <<- ~>> *
__[i](p_oui_et_ou_non)__        oui (?:ou|et) non <<- ~>> *
__[i](p_outre_mesure)__         outre mesure <<- ~>> *
__[i](p_qqch_par_qqch)__        (une?|deux|trois|quatre|cinq|six|sept|huit|neuf|dix|onze|douze|treize|quatorze|quinze|seize|vingt|trente|quarante|cinquante|soixante|cent|mille|éta[pg]e|morceau|pièce) par \1 @@0 <<- ~>> *
__[i](p_par_qqch1)__            par (?:à-coups|ailleurs|avance|chance|conséquent|curiosité|contre|défaut|définition|endroits|essence|ex(?:cellence|emple)|hasard|ici|inadvertance|là|moments|monts et par vaux|nature|principe|terre) <<- ~>> *
__[i](p_par_qqch2)__            par (?:la (?:même occasion|suite)|(?:bien des|certains) (?:aspects|côtés)|acquit de conscience|beau temps|bonté de cœur|ce biais|égard pour (?:moi|toi|lui|elles?|eux|nous|vous)(?! qui)|lui-même|elle(?:-même|)|eux(?:-mêmes|)|elles(?:-mêmes|)|le passé|les temps qui courent|[nv]ous-mêmes?|[mt]oi(?:-même|)|tout le monde|voie (?:de (?:conséquence|mer|terre)|d’exception)) <<- ~>> *
__[i](p_par_ci_par_là)__        par-ci,? par-là <<- ~>> *
__[i](p_par_position)__         par-de(?:vant|rrière|ssus (?:le marché|tout)) <<- ~>> *
__[i](p_par_devers_pronom)__    par-devers (?:moi|toi|lui|elles?|lui|eux|nous|vous) <<- ~>> *
__[i](p_par_nombre_fois)__      par (?:deux|trois|quatre|cinq|six|sept|huit|neuf|dix|onze|douze|treize|quatorze|quinze|seize|vingt|trente|quarante|cinquante|soixante|cent) fois <<- ~>> *
__[i](p_parmi_qqch)__           parmi (?:[nv]ous(?: autres|)|eux|elles) <<- ~>> *
__[i](p_partant_de_là)__        partant de là <<- ~>> *
__[i](p_pas_qqch)__             pas (?:du tout|à pas|le moins du monde) <<- ~>> *
__[i](p_pendant_qqch)__         pendant (?:ce temps-là|(?:bien |si |assez |très |)longtemps|plusieurs (?:heures|minutes|secondes|mois|semaines|jours|années|siècles|millénaires|décennies)|quelque temps) <<- ~>> *
__[i](p_petit_à_petit)__        petit à petit <<- ~>> *
__[i](p_peu_qqch)__             peu (?:à peu|de temps auparavant|ou prou) <<- ~>> *
__[i](p_pile_poil)__            pile poil <<- ~>> *
__[i](p_plein_qqch)__           plein (?:nord|sud|ouest|de fois) <<- ~>> *
__[i](p_plus_avant)__           plus avant(?! de | que?) <<- ~>> *
__[i](p_plus_qqch)__            plus (?:du tout|que (?:nécessaire|prévu|jamais|tout(?: au monde|e autre chose))|jamais|bas que terre|d’une fois) <<- ~>> *
__[i](p_plusieurs_fois)__       plusieurs fois(?: de suite)? <<- ~>> *
__[i](p_pour_qqch)__            pour (?:autrui|le (?:moment|moins|meilleur et pour le pire)|une fois|l’(?:essentiel|instant)|l’heure|de bon|la suite|un oui ou pour un non|ainsi dire|ce faire|quelque (?:part|temps)|tout (?:le monde|un chacun|dire)|faire (?:bonne mesure|simple)|y parvenir|couronner le tout|ce que (?:(?:j’|tu )en sais)|ça va(?:ut|lait)) <<- ~>> *
__[i](p_pour_pronom)__          pour (?:[mt]oi|elles?|eux|ça|cela|ceci|ceux-(?:là|ci)|celles?-(?:là|ci))(?! qui) <<- ~>> *
__[i](p_pour_xxx_fois)__        pour la (?:première|seconde|{w_2}ième|dernière) fois(?: de suite| de ma vie|) <<- ~>> *
__[i](p_pour_det_fem_qqch)__    pour (?:[mts]a|[nv]otre|leur) (?:gouverne|part) <<- ~>> *
__[i](p_pour_det_mas_qqch)__    pour (?:[mts]on|[nv]otre|leur) propre (?:compte|bien) <<- ~>> *
__[i](p_pour_xxx_que_ça_intéresse)__        pour ce(?:lles?|ux|lui) (?:et ce(?:lles?|ux|lui) |)que (?:ça|ce(?:la|ci)) intéresse <<- ~>> *
__[i](p_pour_s_en_rendre_compte)__          pour (?:[mts]’|[vn]ous )en rendre compte <<- ~>> *
__[i](p_quand_qqch)__           quand b(?:ien même|on (?:[mt]e|l(?:ui|eur)|[nv]ous) semble) <<- ~>> *







|















|







4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
__[i](p_ou_bien)__              ou (bien) @@3 <<- ~1>> *
__[i](p_ou_qqch_d_approchant)__ ou quelque chose d’approchant <<- ~>> *
__[i](p_où_bon_nous_semble)__   où bon (?:me|te|lui|nous|vous|leur) semble <<- ~>> *
__[i](p_oui_et_ou_non)__        oui (?:ou|et) non <<- ~>> *
__[i](p_outre_mesure)__         outre mesure <<- ~>> *
__[i](p_qqch_par_qqch)__        (une?|deux|trois|quatre|cinq|six|sept|huit|neuf|dix|onze|douze|treize|quatorze|quinze|seize|vingt|trente|quarante|cinquante|soixante|cent|mille|éta[pg]e|morceau|pièce) par \1 @@0 <<- ~>> *
__[i](p_par_qqch1)__            par (?:à-coups|ailleurs|avance|chance|conséquent|curiosité|contre|défaut|définition|endroits|essence|ex(?:cellence|emple)|hasard|ici|inadvertance|là|moments|monts et par vaux|nature|principe|terre) <<- ~>> *
__[i](p_par_qqch2)__            par (?:la (?:même occasion|suite)|(?:bien des|certains) (?:aspects|côtés)|acquit de conscience|beau temps|bonté de cœur|ce biais|égard pour (?:moi|toi|lui|elles?|eux|nous|vous)(?! qui)|lui-même|elle(?:-même|)|eux(?:-mêmes|)|elles(?:-mêmes|)|le passé|les temps qui courent|[nv]ous-mêmes?|[mt]oi(?:-même|)|temps de pluie|tout le monde|voie (?:de (?:conséquence|mer|terre)|d’exception)) <<- ~>> *
__[i](p_par_ci_par_là)__        par-ci,? par-là <<- ~>> *
__[i](p_par_position)__         par-de(?:vant|rrière|ssus (?:le marché|tout)) <<- ~>> *
__[i](p_par_devers_pronom)__    par-devers (?:moi|toi|lui|elles?|lui|eux|nous|vous) <<- ~>> *
__[i](p_par_nombre_fois)__      par (?:deux|trois|quatre|cinq|six|sept|huit|neuf|dix|onze|douze|treize|quatorze|quinze|seize|vingt|trente|quarante|cinquante|soixante|cent) fois <<- ~>> *
__[i](p_parmi_qqch)__           parmi (?:[nv]ous(?: autres|)|eux|elles) <<- ~>> *
__[i](p_partant_de_là)__        partant de là <<- ~>> *
__[i](p_pas_qqch)__             pas (?:du tout|à pas|le moins du monde) <<- ~>> *
__[i](p_pendant_qqch)__         pendant (?:ce temps-là|(?:bien |si |assez |très |)longtemps|plusieurs (?:heures|minutes|secondes|mois|semaines|jours|années|siècles|millénaires|décennies)|quelque temps) <<- ~>> *
__[i](p_petit_à_petit)__        petit à petit <<- ~>> *
__[i](p_peu_qqch)__             peu (?:à peu|de temps auparavant|ou prou) <<- ~>> *
__[i](p_pile_poil)__            pile poil <<- ~>> *
__[i](p_plein_qqch)__           plein (?:nord|sud|ouest|de fois) <<- ~>> *
__[i](p_plus_avant)__           plus avant(?! de | que?) <<- ~>> *
__[i](p_plus_qqch)__            plus (?:du tout|que (?:nécessaire|prévu|jamais|tout(?: au monde|e autre chose))|jamais|bas que terre|d’une fois) <<- ~>> *
__[i](p_plusieurs_fois)__       plusieurs fois(?: de suite)? <<- ~>> *
__[i](p_pour_qqch)__            pour (?:autrui|le (?:moment|moins|meilleur et pour le pire)|une fois|l’(?:essentiel|instant)|l’heure|de bon|la suite|un oui ou pour un non|ainsi dire|ce faire|quelque (?:part|temps)|tout (?:le monde|un chacun|dire)|faire (?:bonne mesure|simple)|y parvenir|couronner le tout|rien au monde|ce que (?:(?:j’|tu )en sais)|ça va(?:ut|lait)) <<- ~>> *
__[i](p_pour_pronom)__          pour (?:[mt]oi|elles?|eux|ça|cela|ceci|ceux-(?:là|ci)|celles?-(?:là|ci))(?! qui) <<- ~>> *
__[i](p_pour_xxx_fois)__        pour la (?:première|seconde|{w_2}ième|dernière) fois(?: de suite| de ma vie|) <<- ~>> *
__[i](p_pour_det_fem_qqch)__    pour (?:[mts]a|[nv]otre|leur) (?:gouverne|part) <<- ~>> *
__[i](p_pour_det_mas_qqch)__    pour (?:[mts]on|[nv]otre|leur) propre (?:compte|bien) <<- ~>> *
__[i](p_pour_xxx_que_ça_intéresse)__        pour ce(?:lles?|ux|lui) (?:et ce(?:lles?|ux|lui) |)que (?:ça|ce(?:la|ci)) intéresse <<- ~>> *
__[i](p_pour_s_en_rendre_compte)__          pour (?:[mts]’|[vn]ous )en rendre compte <<- ~>> *
__[i](p_quand_qqch)__           quand b(?:ien même|on (?:[mt]e|l(?:ui|eur)|[nv]ous) semble) <<- ~>> *
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400



4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412




4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449

4450
4451
4452



4453
4454




4455
4456
4457
4458
4459
4460
4461

4462








4463


4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476





4477


4478
4479
4480
4481
4482
4483

4484
4485
4486
4487
4488
4489
4490




4491

4492


4493
4494
4495
4496
4497



4498
4499
4500
4501
4502
4503




4504
4505
4506
4507
4508
4509
4510
4511





4512
4513
4514


4515


4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529


4530




4531
4532



4533
4534
4535
4536







4537
4538
4539
4540
4541








4542
4543
4544
4545





4546
4547
4548
4549
4550



4551
4552
4553




4554


4555







4556


























4557
4558
4559
4560
4561
4562
4563
__[i](p_si_qqch)__              si (?:bas|besoin est|haut|longtemps|nécessaire|possible|soudain|(?:cela|ça) ne tenait qu à (?:moi|toi|lui|eux|elles?|nous|vous)) <<- ~>> *
__[i](p_six_pieds_sous_terre)__ six pieds sous terre <<- ~>> *
__[i](p_sine_loc_latine)__      sine (?:die|qua non) <<- ~>> *
__[i](p_soi_qqch)__             soi(?:t dit en passant|-disant) <<- ~>> *
__[i](p_sous_qqch)__            sous (?:aucun prétexte|bonne (?:escorte|garde)|coupe réglée|haute surveillance) <<- ~>> *
__[i](p_stricto_sensu)__        stricto sensu <<- ~>> *
__[i>(p_sur_ce)__               sur ce, <<- ~>> *
__[i](p_sur_qqch)__             sur (?:le (?:(?:long|moyen|court) terme|qui-vive)|la (?:forme comme sur le fond|même longueur d’onde)|(?:leur|[mts]on|[nv]otre) (?:trente[ -]et[ -]un|31)) <<- ~>> *
__[i](p_tant_qqch)__            tant (?:bien que mal|s’en faut) <<- ~>> *
__[i](p_tôt_ou_tard)__          tôt ou tard <<- ~>> *
__[i](p_tour_à_tour)__          tour à tour <<- ~>> *



__[i](p_tous_qqch)__            tous (?:comptes faits|frais payés) <<- ~>> *
__[i](p_tout_qqch)__            tout (?:à (?:fait|coup|l’heure)|le temps|de (?:même|suite|go)|au plus|aussi bien|simplement|bonnement|compte fait|feu,? tout flammes?|bien (?:considéré|réfléchi)|du long) <<- ~>> *
__[i](p_toutes_qqch)__          toutes (?:affaires cessantes|choses égales par ailleurs|griffes dehors|proportions gardées) <<- ~>> *
__[i](p_trait_pour_trait)__     trait pour trait <<- ~>> *
__[i](p_très_bas_haut)__        très (?:bas|haut) <<- ~>> *
__[i](p_un_à_un)__              (une?) à \1 @@0 <<- ~>> *
__[i](p_un_qqch)__              un (?:à un|jour ou l’autre|instant plus (?:tôt|tard)|milli(?:er|on|ard) de fois|moment plus (?:tôt|tard)|peu (?:mieux|moins bien|partout|plus t(?:ôt|ard) que prévu)|tant soit peu) <<- ~>> *
__[i](p_plus_tôt_tard_que)__    plus t(?:ôt|ard) que (?:prévu|nécessaire) <<- ~>> *
__[i](p_une_qqch)__             une (?:à une|autre fois|bonne fois pour toutes|fois(?: pour toutes| de plus| n’est pas coutume)) <<- ~>> *
__[i](p_une_fois)__             une fois <<- ~>> _
__[i](p_urbi_et_orbi)__         urbi et orbi <<- ~>> *
__[i](p_v_divers)__             v(?:aille que vaille|entre à terre|ers nulle part) <<- ~>> *





# je / tu / il / elles / nous / vous / ils / elles 
__[i](p_je_vous_en_prie)__      je (?:t’en|vous en) (?:prie|supplie) <<- ~>> *
__[i](p_nous_vous_en_prions)__  nous (?:t’en|vous en) (?:prions|supplions) <<- ~>> *

# mot-là
__[i](p_qqch_tiret_là)__        ({w1})(-là) @@0,$ <<- morphex(\1, ":[NAQ]", ":G") ~2>> *

# Après
__[i](p_adv_longtemps)__        (?:bien|si|assez) longtemps <<- ~>> *
__[i](p_plus_loc_adv)__         plus (?:près|loin|tôt|tard|ou moins|que (?:nécessaire|jamais)|d’une fois) <<- ~>> *

## Simplification partielle
__[i](p_tout_au_long_de)__      (tout au long) d(?:es?|u) @@0 <<- not morph(word(-1), ":R", False, False) ~1>> au
__[i](p_à_loc_de1)__            à (bonne distance|bord|cause|contre-courant|côté|court|défaut|droite|gauche|hauteur|l’(?:aff[ûu]t|arrière|autre bout|aune|avant|écart|égard|extérieur|encontre|ins(?:u|tar)|intérieur|opposé|orée|approche)|la (?:hauteur|portée|suite)|partir|portée|pro(?:ximité|pos)|quelques (?:mètres|kilomètres|lieues|pas|centaines de mètres|minutes|heures)|rebours) d(?:es?|u) @@2 <<- ~1>> *
__[i](p_à_loc_de2)__            à (base|grand(?: renfort|s coups)|raison) de? @@2 <<- ~1>> *
__[i](p_au_loc_de)__            au (bout|beau milieu|courant|cours|détriment|fin fond|grand dam|fur et à mesure|gré|l(?:ieu|ong|arge)|milieu|nez et à la barbe|plus profond|profit|s(?:ein|ortir|ujet)|vu(?: et au su|)) d(?:es?|u) @@3 <<- ~1>> *
__[i](p_aux_loc_de)__           aux (abords|dépens) d(?:es?|u) @@4 <<- ~1>> *
__[i](p_ceux_et_celles_qui)__   ceux (et celles?) +qui @@5 <<- ~1>> *
__[i](p_compte_tenu_de)__       (compte tenu) d(?:es?|u) @@0 <<- ~1>> avec
__[i](p_de_mes_yeux_vu)__       (de (?:[mts]es|[nv]os|leurs) yeux) vue?s? @@0 <<-  ~1>> *
__[i](p_en_loc_de1)__           en (arrière|attente|amont|aval|cas|cours|dehors|dépit|direction|faveur|guise|l’(?:absence|honneur)|lieu et place|plein milieu|présence|raison|sus|termes|vertu) d(?:es?|u) @@3 <<- ~1>> *
__[i](p_en_loc_de2)__           en (flagrant délit|matière) de? @@3 <<- ~1>> *
__[i](p_en_proie_à)__           (en proie) à @@0 <<- ~1>> *
__[i](p_eu_égard_à)__           (eu égard) (?:à|aux?) @@0 <<- ~1>> *
__[i](p_la_une_de)__            la (une) d(?:es?|u) @@3 <<- ~1>> _
__[i](p_le_long_de)__           le (long) d(?:es?|u) @@3 <<- ~1>> _
__[i](p_par_le_biais_de)__      par (le biais|l’entremise) d(?:es?|u) @@4 <<- ~1>> * 
__[i](p_pour_ou_contre)__       pour (ou contre) @@5 <<- ~1>> *
__[i](p_rien_comparé_à)__       rien +(comparé) +à @@w <<- ~1>> *
__[i](p_suite_à)__              (suite) (?:à|aux?) @@0 <<- not before(r"(?i)\b(?:une|la|cette|[mts]a|[nv]otre|de) +") ~1>> *
__[i](p_vent_debout_contre)__   (vent debout) contre @@0 <<- ~1>> *

# Déterminant + nombre
__[i](p_dét_plur_nombre_nom)__
    (?:[dmts]es|nos|vos|le(?:ur|)s) (\d+(?: ou \d+|)) ({w_2})  @@w,$
    <<- not re.search("(?i)^(?:janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|septembre|octobre|novembre|décembre|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor)s?$", \2) ~1>> *


## Simplifications des substantifs
__[i](p_arc_à_poulies)__                arcs? (à poulies) @@$ <<- ~1>> *



__[i](p_armée_de)__                     armées? (de (?:l’air|terre)) @@$ <<- ~1>> *
__[i](p_armé_jusqu_aux_dents_)__        armée?s? (jusqu aux dents) @@$ <<- ~1>> *




__[i](p_armes)__                        armes? (à feu|de (?:poing|guerre|destruction massive)) @@$ <<- ~1>> *
__[i](p_attestation_sur_l_honneur)__    (?:attestation|déclaration)s? (sur l’honneur) @@$ <<- ~1>> *
__[i](p_attendre_de_pied_ferme)__       attend\w* (de pied ferme) @@$ <<- ~1>> *
__[i](p_ayants_droit)__                 ayants (droit) @@$ <<- ~1>> *
__[i](p_boite_aux_lettres)__            bo[îi]tes? (aux lettres) @@$ <<- ~1>> *
__[u](p_bisphenol_A)__                  bisph[ée]nols? (A) @@$ <<- ~1>> *
__[i](p_blanc_comme)__                  blanc(?:he|)s? (comme neige|comme de la craie) @@$ <<- ~1>> *

__[i](p_bombe)__                        bombes? (à (?:eau|fragmentation|retardement)) @@$ <<- ~1>> *








__[i](p_chair_à)__                      chairs? (à (?:pâté|canons?)) @@$ <<- ~1>> *


__[i](p_chambre_de)__                   chambres? (d’(?:agriculture|hôtes?)|de (?:commerce|compensation|décompression|dégrisement)) @@$ <<- ~1>> *
__[i](p_chemin_de_traverse)__           chemins? (de traverse) @@$ <<- ~1>> *
__[i](p_chili_con_carne)__              chilis? (con carne) @@$ <<- ~1>> *
__[i](p_chef_d_œuvre)__                 chefs?(-d’œuvre) @@$ <<- ~1>> *
__[i](p_clair_comme)__                  claire?s? (comme (?:de l’eau de (?:boudin|roche|source)|du (?:cristal|jus de (?:boudin|chaussettes?|chique)))) @@$ <<- ~1>> *
__[i](p_commis_d_office)__              commise?s? (d’office) @@$ <<- ~1>> *
__[i](p_convention)__                   conventions? (récepteur|générateur) @@$ <<- ~1>> *
__[i](p_coup_de)__
    coups? (de (?:bol|cœur|foudre|fil|grâce|jarnac|théâtre|coude|genou|main|p(?:ied|oing|oker|ouce)|tête)|d’(?:avance|éclat|État|œil|épaule)|du sort) @@$
    <<- ~1>> *
__[i](p_course_contre_la_montre)__      courses? (contre la montre) @@$ <<- ~1>> *
__[i](p_cousu_main)__                   cousue?s? +(main) @@$ <<- ~1>> *
__[i](p_cout_de_revient)__              (?:co[uû]t|prix) (de revient) @@$ <<- ~1>> *





__[i](p_cuillère)__                     cuillères? +(à (?:café|soupe)) @@$ <<- ~1>> *


__[i](p_délai_de)__                     délais? (d’attente|de (?:carence|connexion|prescription|préavis|rétraction|rigueur)) @@$ <<- ~1>> *
__[i](p_demande_d_asile)__              demandes? (d’asile) @@$ <<- ~1>> *
__[i](p_diner_aux_chandelles)__         d[îi]ners? (aux chandelles) @@$ <<- ~1>> *
__[i](p_digne_de)__                     dignes? (de (?:confiance|foi|ce nom)) @@$ <<- ~1>> *
__[i](p_droit)__                        (droit) (?:au but|dans les yeux) @@0 <<- ~1>> *
__[i](p_droit_comme_un_i)__             droite?s? (comme un i) @@$ <<- ~1>> *

__[i](p_espérance_de_vie)__             espérances? (de vie) @@$ <<- ~1>> *
__[i](p_état_de)__                      états? (d’(?:âme|e(?:sprit|xtrême urgence)|urgence)|de (?:conservation|fait|l’art)) @@$ <<- ~1>> *
__[i](p_faire_qqch)__
    (f[aiîeo]\w*) +(tous(?: deux| trois|) +|)(allusion|assaut|confiance|compliqué|chaud|débat|demi-tour|froid|gr(?:ise mine|and cas)|h(?:alte|onte)|ma(?:chine|rche) arrière|p(?:art(?:ie(?: intégrante|)|)|eur|rofil bas)|rage|salle comble|sens|table rase|volte-face|ce que bon (?:me|te|lui|leur|nous|vous) semble) @@0,*,$
    <<- morph(\1, ">faire ", False) ~2>> *
    <<- morph(\1, ">faire ", False) ~3>> *
__[i](p_expérience_utilisateur)__       expériences? +(utilisateurs?) @@$ <<- ~1>> *




__[i](p_fille)__                        filles? (au pair|à (?:papa|maman)) @@$ <<- ~1>> *

__[i](p_fils)__                         fils (à (?:papa|maman)) @@$ <<- ~1>> *


__[s](p_femme_de)__                     [fF]emmes? (de (?:chambre|lettres|loi|ménage)|d’(?:âge mûr|affaires|exception|É(?:tat|glise)|honneur)) @@$ <<- ~1>> *
__[s](p_homme_de)__                     [hH]ommes? (de (?:lettres|loi|main|paille)|d’(?:âge mûr|affaires|armes|exception|É(?:tat|glise)|honneur)) @@$ <<- ~1>> *
__[i](p_hôtel_de_ville)__               hôtels? (de ville) @@$ <<- ~1>> *
__[i](p_garde)__                        gardes? (à vue|du corps) @@$ <<- ~1>> *
__[i](p_gaz_à_effet_de_serre)__         gaz (à effet de serre)  @@$ <<- ~1>> *



__[i](p_infirmier_de_garde)__           (?:infirmières?|médecins?) (de garde) @@$ <<- ~1>> *
__[i](p_impression_que)__               (l(?:a (?:nette|bizarre) +|’étrange +|’)impression) +que? @@0 <<- ~1>> *
__[i](p_pressentiment_que)__            (le (?:pres|)sentiment) +que? @@0 <<- ~1>> *
__[i](p_liste_d_attente)__              listes? (d’attente) @@$ <<- ~1>> *
__[i](p_invité)__                       invitée?s? (d’honneur|surprise) @@$ <<- ~1>> *
__[i](p_journal_de_bord)__              journa(?:l|ux) (de bord) @@$ <<- ~1>> *




__[i](p_main_d_œuvre)__                 mains? (d’œuvre) @@$ <<- ~1>> *
__[i](p_maison_de)__                    maisons? (de (?:passe|retraite)) @@$ <<- ~1>> *
__[i](p_mal_de)__                       ma(?:l|ux) (de (?:tête|ventre|mer)) @@$ <<- ~1>> *
__[i](p_marché_aux_puces)__             marchés? (aux puces) @@$ <<- ~1>> *
__[i](p_maréchal_des_logis)__           maréchale?s? (des logis(?:[ -]chef|)) @@$ <<- ~1>> *
__[i](p_mère_au_foyer)__                mères? (au foyer) @@$ <<- ~1>> *
__[i](p_metteur_en_scène)__             metteu(?:r|se)s? (en scène) @@$ <<- ~1>> *
__[i](p_mineur_de_moins_de_x_ans)__     mineure?s? (de moins de ({w1}) ans) @@$,>1:w <<- \2.isdigit() or morph(\2, ":B", False) ~1>> *





__[i](p_mise)__                         mis(?:es?|) (à (?:jour|niveau|plat|l’écart)|au p(?:oint|as)|en (?:avant|bouche|demeure|garde|œuvre|scène|terre)) @@$ <<- ~1>> *
__[i](p_mode_de)__                      modes? (de (?:paiement|scrutin|vie)) @@$ <<- ~1>> *
__[i](p_mot_de_passe)__                 mots? (de passe) @@$ <<- ~1>> *


__[i](p_moule_à_qqch)__                 moules? (à (?:gaufres?|gâteaux?|brioche|manqué|savarin|charlotte)) @@$ <<- ~1>> *


__[i](p_noix_de)__                      noix (de (?:cajou|p[ée]can|coco|lavage|muscade|veau|macadamia)) @@$ <<- ~1>> *
__[i](p_nu_comme_un_ver)__              nue?s? (comme (?:un ver|des vers)) @@$ <<- ~1>> *
__[i](p_numéro)__
    numéro (un|deux|trois|quatre|cinq|six|sept|huit|neuf|dix(?:-sept|-huit|-neuf|)|onze|douze|treize|quatorze|quinze|seize|vingt|trente|quarante|cinquante|soixante(?:-dix|)|quatre-vingt(?:-dix|)|cent|mille|\d+) @@$
    <<- before(r"\b[lL]a +$") =>> define(\0, [">numéro :N:f:s"])
    <<- ~1>> *
__[i](p_oiseau_de)__                    oiseaux? (de (?:malheur|nuit|proie|mauvais augure)) @@$ <<- ~1>> * 
__[i](p_onde_de_choc)__                 ondes? (de choc) @@$ <<- ~1>> *
__[i](p_orge)__                         orge (perlé|mondé|carré) @@$ <<- ~1>> *
__[i](p_noire_comme)__                  noire?s? (comme (?:la nuit|une nuit sans lune)) @@$ <<- ~1>> *
__[i](p_pièce_de)__                     pièces? (de (?:théâtre|monnaie|\d+ (?:euros?|centimes?|cents?|livres? sterling|shillings?))) @@$ <<- ~1>> *
__[i](p_partie_de_jambe_en_l_air)__     parties? (de jambes en l’air) @@$ <<- ~1>> *
__[i](p_porte_de)__                     portes? (de (?:service|garage)) @@$ <<- ~1>> *
__[i](p_poudre_aux_yeux)__              poudres? (aux yeux) @@$ <<- ~1>> *


__[i](p_prendre)__                      (pr[eiî]\w+) +(à la légère|au dépourvu|de court|en charge|pour argent comptant|par surprise) @@0,$ <<- morph(\1, ">prendre ", False) ~2>> *




__[i](p_quelqu_un_d_autre)__            quelqu un (d’autre) @@$ <<- ~1>> *
__[i](p_remire_à_plat)__                remise?s? (à plat) @@$ <<- ~1>> *



__[i](p_requête)__                      requêtes? (en (?:nullité|non (?:conciliation|inscription|lieu|révocation de sursis))) @@$ <<- ~1>> *
__[i](p_rester_lettre_morte)__          (rest\w+) (lettre morte) @@0,$ <<- morph(\1, ">rester ", False) ~2>> *
__[i](p_roues_avant_arrière)__          roues? (avant|arrière) @@$ <<- ~1>> *
__[i](p_rouge_à_lèvres)__               rouges? (à lèvres) @@$ <<- ~1>> *







__[i](p_sac)__                          sacs? (à (?:dos|main|langer)|de (?:couchage|sport|voyage)) @@$ <<- ~1>> *
__[i](p_salle)__                        salles? (à manger|d’attente|de (?:bains?|conférence)) @@$ <<- ~1>> *
__[i](p_sain_de_corps)__                saine?s? (d(?:e corps et d|)’esprit) @@$ <<- ~1>> *
__[i](p_sclérose_en_plaques)__          scléroses? (en plaques) @@$  <<- ~1>> *
__[i](p_sembler_paraitre_être)__        (sembl\w+|par[au]\w+) +(être|avoir été) +({w_2}) @@0,w,$ <<- morph(\1, ">(?:sembler|para[îi]tre) ") and morphex(\3, ":A", ":G") ~2>> *








__[u](p_système)__                      systèmes? (d’exploitation|D) @@$ <<- ~1>> *
__[i](p_taille)__                       taille (\d+) @@$ <<- ~1>> *
__[i](p_taux_de_qqch)__                 taux (d’(?:abstention|alcool|alphabétisation|endettement|inflation|intérêt|imposition|occupation|ouverture|œstrogène|urée|usure)|de (?:change|cholest[ée]rol|glycémie|fécondité|participation|testostérone|TVA)) @@$ <<- ~1>> *
__[i](p_tête_de_déterré)__              têtes? (de déterrée?s?) @@$ <<- ~1>> *





__[i](p_tenir_compte)__                 (t[eiî]\w+) +(compte) d(?:es?|u) @@0,w <<- morph(\1, ">tenir ", False) ~2>> *
__[i](p_tout_un_chacun)__               (tout un) chacun @@0 <<- ~1>> *
__[i](p_tour_de_passe_passe)__          tours? (de passe-passe) @@$ <<- ~1>> *
__[i](p_trier_sur_le_volet)__           (tri\w+) (sur le volet) @@0,$ <<- morph(\1, ">trier ", False) ~2>> *
__[i](p_tueur_à_gages)__                tueu(?:r|se)s? (à gages) @@$ <<- ~1>> *



__[i](p_venir)__                        (v[eiî]n\w+) ((?:on ne sait|je ne sais) (?:pas |)(?:trop |)d’où) @@0,$ <<- morph(\1, ">venir ", False) ~2>> *
__[i](p_vecteur)__                      vecteurs? (accélérations?|positions?|rotations?|vitesses?) @@$ <<- ~1>> *
__[i](p_vernis_à_ongles)__              vernis (à ongles) @@$ <<- ~1>> *




__[i](p_vol_à)__                        vols? (à l(?:’étalage|a (?:sauvette|tire))) @@$ <<- ~1>> *


__[i](p_voie_de_recours)__              voies? (de recours) @@$ <<- ~1>> *







__[i](p_usine_à_gaz)__                  usines? (à gaz) @@$ <<- ~1>> *



























# simplification des nombres
__<i](p_10_qqch)__
    dix-(?:sept|huit|neuf) <<- ~>> dix
__[i](p_20_30_40_50_qqch)__
    (?:vingt|trente|quarante|cinquante)(-(?:deux|trois|quatre|cinq|six|sept|huit|neuf|et-un)| et un) @@$ <<- ~1>> *
__[i](p_60_qqch)__







|


|
>
>
>








|



>
>
>
>















|




















|
>


|
>
>
>


>
>
>
>
|



|


>
|
>
>
>
>
>
>
>
>
|
>
>













>
>
>
>
>
|
>
>






>





|

>
>
>
>
|
>
|
>
>




|
>
>
>






>
>
>
>








>
>
>
>
>
|


>
>
|
>
>














>
>
|
>
>
>
>

|
>
>
>



|
>
>
>
>
>
>
>
|




>
>
>
>
>
>
>
>


|

>
>
>
>
>




|
>
>
>


|
>
>
>
>
|
>
>
|
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
__[i](p_si_qqch)__              si (?:bas|besoin est|haut|longtemps|nécessaire|possible|soudain|(?:cela|ça) ne tenait qu à (?:moi|toi|lui|eux|elles?|nous|vous)) <<- ~>> *
__[i](p_six_pieds_sous_terre)__ six pieds sous terre <<- ~>> *
__[i](p_sine_loc_latine)__      sine (?:die|qua non) <<- ~>> *
__[i](p_soi_qqch)__             soi(?:t dit en passant|-disant) <<- ~>> *
__[i](p_sous_qqch)__            sous (?:aucun prétexte|bonne (?:escorte|garde)|coupe réglée|haute surveillance) <<- ~>> *
__[i](p_stricto_sensu)__        stricto sensu <<- ~>> *
__[i>(p_sur_ce)__               sur ce, <<- ~>> *
__[i](p_sur_qqch)__             sur (?:ce plan-là|le (?:(?:long|moyen|court) terme|qui-vive)|la (?:forme comme sur le fond|même longueur d’onde)|(?:leur|[mts]on|[nv]otre) (?:trente[ -]et[ -]un|31)) <<- ~>> *
__[i](p_tant_qqch)__            tant (?:bien que mal|s’en faut) <<- ~>> *
__[i](p_tôt_ou_tard)__          tôt ou tard <<- ~>> *
__[i](loc_tour_à_tour)__
    tours? [àa] tours?
    <<- not re.search("(?i)^tour à tour$", \0) ->> tour à tour      # Locution adverbiale invariable. Écrivez “tour à tour”.|https://fr.wiktionary.org/wiki/tour_%C3%A0_tour
    <<- ~>> *
__[i](p_tous_qqch)__            tous (?:comptes faits|frais payés) <<- ~>> *
__[i](p_tout_qqch)__            tout (?:à (?:fait|coup|l’heure)|le temps|de (?:même|suite|go)|au plus|aussi bien|simplement|bonnement|compte fait|feu,? tout flammes?|bien (?:considéré|réfléchi)|du long) <<- ~>> *
__[i](p_toutes_qqch)__          toutes (?:affaires cessantes|choses égales par ailleurs|griffes dehors|proportions gardées) <<- ~>> *
__[i](p_trait_pour_trait)__     trait pour trait <<- ~>> *
__[i](p_très_bas_haut)__        très (?:bas|haut) <<- ~>> *
__[i](p_un_à_un)__              (une?) à \1 @@0 <<- ~>> *
__[i](p_un_qqch)__              un (?:à un|jour ou l’autre|instant plus (?:tôt|tard)|milli(?:er|on|ard) de fois|moment plus (?:tôt|tard)|peu (?:mieux|moins bien|partout|plus t(?:ôt|ard) que prévu)|tant soit peu) <<- ~>> *
__[i](p_plus_tôt_tard_que)__    plus t(?:ôt|ard) que (?:prévu|nécessaire) <<- ~>> *
__[i](p_une_qqch)__             une (?:à une|autre fois|bonne fois pour toutes|dernière fois|fois(?: pour toutes| de plus| n’est pas coutume)) <<- ~>> *
__[i](p_une_fois)__             une fois <<- ~>> _
__[i](p_urbi_et_orbi)__         urbi et orbi <<- ~>> *
__[i](p_v_divers)__             v(?:aille que vaille|entre à terre|ers nulle part) <<- ~>> *

TEST: ils vont et viennent, toujours {{cotes a cotes}}…
TEST: Nous irons {{tours à tours}} chercher du bois.


# je / tu / il / elles / nous / vous / ils / elles 
__[i](p_je_vous_en_prie)__      je (?:t’en|vous en) (?:prie|supplie) <<- ~>> *
__[i](p_nous_vous_en_prions)__  nous (?:t’en|vous en) (?:prions|supplions) <<- ~>> *

# mot-là
__[i](p_qqch_tiret_là)__        ({w1})(-là) @@0,$ <<- morphex(\1, ":[NAQ]", ":G") ~2>> *

# Après
__[i](p_adv_longtemps)__        (?:bien|si|assez) longtemps <<- ~>> *
__[i](p_plus_loc_adv)__         plus (?:près|loin|tôt|tard|ou moins|que (?:nécessaire|jamais)|d’une fois) <<- ~>> *

## Simplification partielle
__[i](p_tout_au_long_de)__      (tout au long) d(?:es?|u) @@0 <<- not morph(word(-1), ":R", False, False) ~1>> au
__[i](p_à_loc_de1)__            à (bonne distance|bord|cause|contre-courant|côté|court|défaut|droite|gauche|hauteur|l’(?:aff[ûu]t|arrière|autre bout|aune|avant|écart|égard|extérieur|encontre|ins(?:u|tar)|intérieur|opposé|orée|approche)|la (?:hauteur|portée|suite)|partir|portée|pro(?:ximité|pos)|quelques (?:mètres|kilomètres|lieues|pas|centaines de mètres|minutes|heures)|rebours) d(?:es?|u) @@2 <<- ~1>> *
__[i](p_à_loc_de2)__            à (base|force|grand(?: renfort|s coups)|raison) de? @@2 <<- ~1>> *
__[i](p_au_loc_de)__            au (bout|beau milieu|courant|cours|détriment|fin fond|grand dam|fur et à mesure|gré|l(?:ieu|ong|arge)|milieu|nez et à la barbe|plus profond|profit|s(?:ein|ortir|ujet)|vu(?: et au su|)) d(?:es?|u) @@3 <<- ~1>> *
__[i](p_aux_loc_de)__           aux (abords|dépens) d(?:es?|u) @@4 <<- ~1>> *
__[i](p_ceux_et_celles_qui)__   ceux (et celles?) +qui @@5 <<- ~1>> *
__[i](p_compte_tenu_de)__       (compte tenu) d(?:es?|u) @@0 <<- ~1>> avec
__[i](p_de_mes_yeux_vu)__       (de (?:[mts]es|[nv]os|leurs) yeux) vue?s? @@0 <<-  ~1>> *
__[i](p_en_loc_de1)__           en (arrière|attente|amont|aval|cas|cours|dehors|dépit|direction|faveur|guise|l’(?:absence|honneur)|lieu et place|plein milieu|présence|raison|sus|termes|vertu) d(?:es?|u) @@3 <<- ~1>> *
__[i](p_en_loc_de2)__           en (flagrant délit|matière) de? @@3 <<- ~1>> *
__[i](p_en_proie_à)__           (en proie) à @@0 <<- ~1>> *
__[i](p_eu_égard_à)__           (eu égard) (?:à|aux?) @@0 <<- ~1>> *
__[i](p_la_une_de)__            la (une) d(?:es?|u) @@3 <<- ~1>> _
__[i](p_le_long_de)__           le (long) d(?:es?|u) @@3 <<- ~1>> _
__[i](p_par_le_biais_de)__      par (le biais|l’entremise) d(?:es?|u) @@4 <<- ~1>> * 
__[i](p_pour_ou_contre)__       pour (ou contre) @@5 <<- ~1>> *
__[i](p_rien_comparé_à)__       rien +(comparé) +à @@w <<- ~1>> *
__[i](p_suite_à)__              (suite) (?:à|aux?) @@0 <<- not before(r"(?i)\b(?:une|la|cette|[mts]a|[nv]otre|de) +") ~1>> *
__[i](p_vent_debout_contre)__   (vent debout) contre @@0 <<- ~1>> *

# Déterminant + nombre
__[i](p_dét_plur_nombre_nom)__
    (?:[dmts]es|nos|vos|le(?:ur|)s) (\d+(?: ou \d+|)) ({w_2})  @@w,$
    <<- morphex(\2, ":[NA].*:[pi]", ":(?:V0|3p)|>(?:janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|septembre|octobre|novembre|décembre|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor)")
    ~1>> *

## Simplifications des substantifs
__[i](loc_arc_à_poulies)__
    arcs? (([àa]) poulies) @@$,w
    <<- \2 == "a" -2>> à                        # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.
    <<- ~1>> *
__[i](p_armée_de)__                     armées? (de (?:l’air|terre)) @@$ <<- ~1>> *
__[i](p_armé_jusqu_aux_dents_)__        armée?s? (jusqu aux dents) @@$ <<- ~1>> *
__[i](loc_armes_à_feu)__
    armes? (([àa]) feu) @@$,w
    <<- \2 == "a" -2>> à                        # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.
    <<- ~1>> *
__[i](p_armes_de_qqch)__                armes? (de (?:poing|guerre|destruction massive)) @@$ <<- ~1>> *
__[i](p_attestation_sur_l_honneur)__    (?:attestation|déclaration)s? (sur l’honneur) @@$ <<- ~1>> *
__[i](p_attendre_de_pied_ferme)__       attend\w* (de pied ferme) @@$ <<- ~1>> *
__[i](p_ayants_droit)__                 ayants (droit) @@$ <<- ~1>> *
__[i](p_boite_aux_lettres)__            bo[îi]tes? (aux lettres|à gants) @@$ <<- ~1>> *
__[u](p_bisphenol_A)__                  bisph[ée]nols? (A) @@$ <<- ~1>> *
__[i](p_blanc_comme)__                  blanc(?:he|)s? (comme neige|comme de la craie) @@$ <<- ~1>> *
__[i](loc_bombe)__
    bombes? (([àa]) (?:eau|fragmentation|retardement)) @@$,w
    <<- \2 == "a" -2>> à                        # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.
    <<- ~1>> *
__[i](loc_canne_à)__
    (cann?es?) (([àa]) (?:pêche|sucre)s?) @@0,$,w
    <<- \1.find("ane") -1>> =\1.replace("ane", "anne")  # Confusion : la cane est la femelle du canard.|https://fr.wiktionary.org/wiki/canne
    <<- \3 == "a" -3>> à                                # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.
    <<- ~2>> *
__[i](loc_chair_à)__
    chairs? (([àa]) (?:pâté|canons?)) @@$,w
    <<- \2 == "a" -2>> à                        # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.
    <<- ~1>> *
__[i](p_chambre_de)__                   chambres? (d’(?:agriculture|hôtes?)|de (?:commerce|compensation|décompression|dégrisement)) @@$ <<- ~1>> *
__[i](p_chemin_de_traverse)__           chemins? (de traverse) @@$ <<- ~1>> *
__[i](p_chili_con_carne)__              chilis? (con carne) @@$ <<- ~1>> *
__[i](p_chef_d_œuvre)__                 chefs?(-d’œuvre) @@$ <<- ~1>> *
__[i](p_clair_comme)__                  claire?s? (comme (?:de l’eau de (?:boudin|roche|source)|du (?:cristal|jus de (?:boudin|chaussettes?|chique)))) @@$ <<- ~1>> *
__[i](p_commis_d_office)__              commise?s? (d’office) @@$ <<- ~1>> *
__[i](p_convention)__                   conventions? (récepteur|générateur) @@$ <<- ~1>> *
__[i](p_coup_de)__
    coups? (de (?:bol|cœur|foudre|fil|grâce|jarnac|théâtre|coude|genou|main|p(?:ied|oing|oker|ouce)|tête)|d’(?:avance|éclat|État|œil|épaule)|du sort) @@$
    <<- ~1>> *
__[i](p_course_contre_la_montre)__      courses? (contre la montre) @@$ <<- ~1>> *
__[i](p_cousu_main)__                   cousue?s? +(main) @@$ <<- ~1>> *
__[i](p_cout_de_revient)__              (?:co[uû]t|prix) (de revient) @@$ <<- ~1>> *
__[i](loc_crayon_à_qqch)__
    crayons? (([àa]) (?:lèvres|sourcils)) @@$,w
    <<- \2 == "a" -2>> à                        # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.
    <<- ~1>> *
__[i](loc_cuillère)__
    cuillères? +(([àa]) (?:café|soupe)) @@$,w
    <<- \2 == "a" -2>> à                        # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.
    <<- ~1>> *
__[i](p_délai_de)__                     délais? (d’attente|de (?:carence|connexion|prescription|préavis|rétraction|rigueur)) @@$ <<- ~1>> *
__[i](p_demande_d_asile)__              demandes? (d’asile) @@$ <<- ~1>> *
__[i](p_diner_aux_chandelles)__         d[îi]ners? (aux chandelles) @@$ <<- ~1>> *
__[i](p_digne_de)__                     dignes? (de (?:confiance|foi|ce nom)) @@$ <<- ~1>> *
__[i](p_droit)__                        (droit) (?:au but|dans les yeux) @@0 <<- ~1>> *
__[i](p_droit_comme_un_i)__             droite?s? (comme un i) @@$ <<- ~1>> *
__[i](p_eau_de)__                       eaux? (de (?:bouleau|bleuet|chaux|coco|javel|jouvence|mer|noix de coco|parfum|pluie|seltz|source|vie)) @@$ <<- ~1>> *
__[i](p_espérance_de_vie)__             espérances? (de vie) @@$ <<- ~1>> *
__[i](p_état_de)__                      états? (d’(?:âme|e(?:sprit|xtrême urgence)|urgence)|de (?:conservation|fait|l’art)) @@$ <<- ~1>> *
__[i](p_faire_qqch)__
    (f[aiîeo]\w*) +(tous(?: deux| trois|) +|)(allusion|assaut|confiance|compliqué|chaud|débat|demi-tour|froid|gr(?:ise mine|and cas)|h(?:alte|onte)|ma(?:chine|rche) arrière|p(?:art(?:ie(?: intégrante|)|)|eur|rofil bas)|rage|salle comble|sens|table rase|volte-face|ce que bon (?:me|te|lui|leur|nous|vous) semble) @@0,*,$
    <<- morph(\1, ">faire ", False) ~2>> *
    <<- __also__ ~3>> *
__[i](p_expérience_utilisateur)__       expériences? +(utilisateurs?) @@$ <<- ~1>> *
__[i](loc_fard_à_paupières)__
    fards? (([àa]) paupières) @@$,w
    <<- \2 == "a" -2>> à                        # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.
    <<- ~1>> *
__[i](p_fille_au_pair)__                filles? (au pair|à soldats?) @@$ <<- ~1>> *
__[i](loc_fils_fille_à)__
    fil(?:les?|s) (([àa]) (?:papa|maman)) @@$,w
    <<- \2 == "a" -2>> à                        # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.
    <<- ~1>> *
__[s](p_femme_de)__                     [fF]emmes? (de (?:chambre|lettres|loi|ménage)|d’(?:âge mûr|affaires|exception|É(?:tat|glise)|honneur)) @@$ <<- ~1>> *
__[s](p_homme_de)__                     [hH]ommes? (de (?:lettres|loi|main|paille)|d’(?:âge mûr|affaires|armes|exception|É(?:tat|glise)|honneur)) @@$ <<- ~1>> *
__[i](p_hôtel_de_ville)__               hôtels? (de ville) @@$ <<- ~1>> *
__[i](p_garde)__                        gardes? (à vue|du corps) @@$ <<- ~1>> *
__[i](loc_gaz_à_effet_de_serre)__
    gaz (([àa]) effet de serre)  @@$,w
    <<- \2 == "a" -2>> à                        # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.
    <<- ~1>> *
__[i](p_infirmier_de_garde)__           (?:infirmières?|médecins?) (de garde) @@$ <<- ~1>> *
__[i](p_impression_que)__               (l(?:a (?:nette|bizarre) +|’étrange +|’)impression) +que? @@0 <<- ~1>> *
__[i](p_pressentiment_que)__            (le (?:pres|)sentiment) +que? @@0 <<- ~1>> *
__[i](p_liste_d_attente)__              listes? (d’attente) @@$ <<- ~1>> *
__[i](p_invité)__                       invitée?s? (d’honneur|surprise) @@$ <<- ~1>> *
__[i](p_journal_de_bord)__              journa(?:l|ux) (de bord) @@$ <<- ~1>> *
__[i](loc_machine_à_qqch)__
    machines? (([àa]) (?:café|coudre|laver|remonter le temps)) @@$,w
    <<- \2 == "a" -2>> à                        # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.
    <<- ~1>> *
__[i](p_main_d_œuvre)__                 mains? (d’œuvre) @@$ <<- ~1>> *
__[i](p_maison_de)__                    maisons? (de (?:passe|retraite)) @@$ <<- ~1>> *
__[i](p_mal_de)__                       ma(?:l|ux) (de (?:tête|ventre|mer)) @@$ <<- ~1>> *
__[i](p_marché_aux_puces)__             marchés? (aux puces) @@$ <<- ~1>> *
__[i](p_maréchal_des_logis)__           maréchale?s? (des logis(?:[ -]chef|)) @@$ <<- ~1>> *
__[i](p_mère_au_foyer)__                mères? (au foyer) @@$ <<- ~1>> *
__[i](p_metteur_en_scène)__             metteu(?:r|se)s? (en scène) @@$ <<- ~1>> *
__[i](p_mineur_de_moins_de_x_ans)__     mineure?s? (de moins de ({w1}) ans) @@$,>1:w <<- \2.isdigit() or morph(\2, ":B", False) ~1>> *
__[i](loc_mettre_à_qqch)__
    (m(?:et|[iî][mst])\w*) +(([àa]) (?:jour|niveau|plat|l’écart)) @@0,$,w
    <<- morph(\1, ">mettre ", False) >>>
    <<- \3 == "a" -3>> à                        # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.
    <<- ~2>> *
__[i](p_mettre_qqch)__                  (m(?:et|[iî][mst])\w*) +(au p(?:oint|as)|en (?:avant|bouche|demeure|garde|œuvre|place|scène|terre)) @@0,$ <<- morph(\1, ">mettre ", False) ~2>> *
__[i](p_mode_de)__                      modes? (de (?:paiement|scrutin|vie)) @@$ <<- ~1>> *
__[i](p_mot_de_passe)__                 mots? (de passe) @@$ <<- ~1>> *
__[i](p_motion_de)__                    motions? (de (?:blâme|censure|défiance)) @@$ <<- ~1>> *
__[i](loc_moule_à_qqch)__
    moules? (([àa]) (?:gaufres?|gâteaux?|brioche|manqué|savarin|charlotte)) @@$,w
    <<- \2 == "a" -2>> à                        # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.
    <<- ~1>> *
__[i](p_noix_de)__                      noix (de (?:cajou|p[ée]can|coco|lavage|muscade|veau|macadamia)) @@$ <<- ~1>> *
__[i](p_nu_comme_un_ver)__              nue?s? (comme (?:un ver|des vers)) @@$ <<- ~1>> *
__[i](p_numéro)__
    numéro (un|deux|trois|quatre|cinq|six|sept|huit|neuf|dix(?:-sept|-huit|-neuf|)|onze|douze|treize|quatorze|quinze|seize|vingt|trente|quarante|cinquante|soixante(?:-dix|)|quatre-vingt(?:-dix|)|cent|mille|\d+) @@$
    <<- before(r"\b[lL]a +$") =>> define(\0, [">numéro :N:f:s"])
    <<- ~1>> *
__[i](p_oiseau_de)__                    oiseaux? (de (?:malheur|nuit|proie|mauvais augure)) @@$ <<- ~1>> * 
__[i](p_onde_de_choc)__                 ondes? (de choc) @@$ <<- ~1>> *
__[i](p_orge)__                         orge (perlé|mondé|carré) @@$ <<- ~1>> *
__[i](p_noire_comme)__                  noire?s? (comme (?:la nuit|une nuit sans lune)) @@$ <<- ~1>> *
__[i](p_pièce_de)__                     pièces? (de (?:théâtre|monnaie|\d+ (?:euros?|centimes?|cents?|livres? sterling|shillings?))) @@$ <<- ~1>> *
__[i](p_partie_de_jambe_en_l_air)__     parties? (de jambes en l’air) @@$ <<- ~1>> *
__[i](p_porte_de)__                     portes? (de (?:service|garage)) @@$ <<- ~1>> *
__[i](p_poudre_aux_yeux)__              poudres? (aux yeux) @@$ <<- ~1>> *
__[i](loc_prendre_à_la_légère)__
    (pr[eiî]\w+) +(([àa]) la légère) @@0,$,w
    <<- morph(\1, ">prendre ", False) >>>
    <<- \3 == "a" -3>> à                        # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.
    <<- ~2>> *
__[i](p_prendre)__                      (pr[eiî]\w+) +(au dépourvu|de court|en charge|ombrage|pour argent comptant|par surprise|soin) @@0,$ <<- morph(\1, ">prendre ", False) ~2>> *
__[i](p_preuve_du_contraire)__          preuves? +(?:suffisantes? +|)(du contraire) @@$ <<- ~1>> *
__[i](p_quelqu_un_d_autre)__            quelqu un (d’autre) @@$ <<- ~1>> *
__[i](loc_remire_à_plat)__
    remise?s? (([àa]) plat) @@$,w
    <<- \2 == "a" -2>> à                        # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.
    <<- ~1>> *
__[i](p_requête)__                      requêtes? (en (?:nullité|non (?:conciliation|inscription|lieu|révocation de sursis))) @@$ <<- ~1>> *
__[i](p_rester_lettre_morte)__          (rest\w+) (lettre morte) @@0,$ <<- morph(\1, ">rester ", False) ~2>> *
__[i](p_roues_avant_arrière)__          roues? (avant|arrière) @@$ <<- ~1>> *
__[i](loc_rouge_à_lèvres)__
    rouges? (([àa]) lèvres) @@$,w
    <<- \2 == "a" -2>> à                        # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.
    <<- ~1>> *
__[i](loc_sac_à_qqch)__
    sacs? (([àa]) (?:dos|main|langer|merde|foutre)) @@$,w
    <<- \2 == "a" -2>> à                        # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.
    <<- ~1>> *
__[i](p_sac_de_qqch)__                  sacs? (de (?:couchage|sport|voyage)) @@$ <<- ~1>> *
__[i](p_salle)__                        salles? (à manger|d’attente|de (?:bains?|conférence)) @@$ <<- ~1>> *
__[i](p_sain_de_corps)__                saine?s? (d(?:e corps et d|)’esprit) @@$ <<- ~1>> *
__[i](p_sclérose_en_plaques)__          scléroses? (en plaques) @@$  <<- ~1>> *
__[i](p_sembler_paraitre_être)__        (sembl\w+|par[au]\w+) +(être|avoir été) +({w_2}) @@0,w,$ <<- morph(\1, ">(?:sembler|para[îi]tre) ") and morphex(\3, ":A", ":G") ~2>> *
__[i](loc_silo)__
    silos? (([àa]) (?:grains?|blé)) @@$,w
    <<- \2 == "a" -2>> à                        # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.
    <<- ~1>> *
__[i](loc_soue_à_cochons)__
    soues? (([àa]) cochons?) @@$,w
    <<- \2 == "a" -2>> à                        # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.
    <<- ~1>> *
__[u](p_système)__                      systèmes? (d’exploitation|D) @@$ <<- ~1>> *
__[i](p_taille)__                       taille (\d+) @@$ <<- ~1>> *
__[i](p_taux_de_qqch)__                 taux (d’(?:abstention|absorption|alcool|alphabétisation|endettement|inflation|intérêt|imposition|occupation|ouverture|œstrogène|urée|usure)|de (?:change|cholest[ée]rol|glycémie|fécondité|participation|testostérone|TVA)) @@$ <<- ~1>> *
__[i](p_tête_de_déterré)__              têtes? (de déterrée?s?) @@$ <<- ~1>> *
__[i](loc_tenir_compte)__
    (t[eiî]\w+) +(([àa]) distance) d(?:es?|u) @@0,$,w
    <<- morph(\1, ">tenir ", False) >>>
    <<- \3 == "a" -3>> à                        # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.
    <<- ~2>> *
__[i](p_tenir_compte)__                 (t[eiî]\w+) +(compte) d(?:es?|u) @@0,w <<- morph(\1, ">tenir ", False) ~2>> *
__[i](p_tout_un_chacun)__               (tout un) chacun @@0 <<- ~1>> *
__[i](p_tour_de_passe_passe)__          tours? (de passe-passe) @@$ <<- ~1>> *
__[i](p_trier_sur_le_volet)__           (tri\w+) (sur le volet) @@0,$ <<- morph(\1, ">trier ", False) ~2>> *
__[i](loc_tueur_à_gages)__
    tueu(?:r|se)s? (([àa]) gages) @@$,w
    <<- \2 == "a" -2>> à                        # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.
    <<- ~1>> *
__[i](p_venir)__                        (v[eiî]n\w+) ((?:on ne sait|je ne sais) (?:pas |)(?:trop |)d’où) @@0,$ <<- morph(\1, ">venir ", False) ~2>> *
__[i](p_vecteur)__                      vecteurs? (accélérations?|positions?|rotations?|vitesses?) @@$ <<- ~1>> *
__[i](loc_vernis_à_ongles)__
    vernis (([àa]) ongles) @@$,w
    <<- \2 == "a" -2>> à                        # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.
    <<- ~1>> *
__[i](loc_vol_à)__
    vols? (([àa]) l(?:’étalage|a (?:sauvette|tire))) @@$,w
    <<- \2 == "a" -2>> à                        # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.
    <<- ~1>> *
__[i](loc_voie_de_recours)__
    (voi[ex]s?) (de (?:recours|perdition)) @@0,$
    <<- \1.endswith("x") -1>> voie|voies        # Confusion probable.|https://fr.wiktionary.org/wiki/voie
    <<- ~2>> *
__[i](loc_usine_à_gaz)__
    usines? (([àa]) gaz) @@$,w
    <<- \2 == "a" -2>> à                        # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.
    <<- ~1>> *

TEST: C’est un arc {{a}} poulies
TEST: Ceci est une arme {{a}} feu.
TEST: Combien de bombes {{a}} fragmentation
TEST: Elle va en faire de la chair {{a}} pâté
TEST: Une cuillère {{a}} café.
TEST: Un crayon {{a}} sourcils
TEST: Elle a mis du fard {{a}} paupières.
TEST: ce fils {{a}} papa est d’un ennui mortel.
TEST: cette fille {{a}} papa nous pourrit la vie.
TEST: Les conséquences des gaz {{a}} effet de serre.
TEST: devant la machine {{a}} café.
TEST: Achète un moule {{a}} gaufres.
TEST: Fais la mise {{a}} jour
TEST: prendre {{a}} la légère ce test serait une erreur.
TEST: Elle mit du rouge {{a}} lèvres.
TEST: on a besoin d’une remise {{a}} plat.
TEST: passe-moi mon sac {{a}} dos.
TEST: dans le silo {{a}} grain.
TEST: sa chambre, c’est une vraie soue {{a}} cochons.
TEST: il faut se tenir {{a}} distance de ces gens-là.
TEST: Un tueur {{a}} gages ne s’y prendrait jamais comme ça.
TEST: Ce n’est que du vernis {{a}} ongles.
TEST: le vol {{a}} l’étalage est un fléau.
TEST: Il nous faut une {{voix}} de recours.
TEST: c’est une putain d’usine {{a}} gaz.


# simplification des nombres
__<i](p_10_qqch)__
    dix-(?:sept|huit|neuf) <<- ~>> dix
__[i](p_20_30_40_50_qqch)__
    (?:vingt|trente|quarante|cinquante)(-(?:deux|trois|quatre|cinq|six|sept|huit|neuf|et-un)| et un) @@$ <<- ~1>> *
__[i](p_60_qqch)__
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
# couleurs invariables
__[i](p_couleurs_invariables)__
    ({w_2}) +((?:beige|blanc|bleu|brun|châtain|cyan|gris|jaune|magenta|marron|orange|pourpre|rose|rouge|vert|violet) (?:clair|fluo|foncé|irisé|pâle|pastel|sombre|vif|tendre)) @@0,$
    <<- morph(\1, ":[NAQ]", False) ~2>> *

# locutions adjectivales, nominales & couleurs
__[i](p_locutions_adj_nom_et_couleurs)__
    ({w_2}) +(bas(?: de gamme|se consommation)|bon (?:enfant|marché|teint|chic,? bon genre)|cl(?:é|ef) en mains?|dernier cri|fleur bleue|grand (?:public|luxe)|grandeur nature|haut(?: de gamme|e résolution)|longue (?:distance|portée|durée)|meilleur marché|numéro (?:un|deux|trois|quatre|cinq|six|sept|huit|neuf|dix(?:-sept|-huit|-neuf)|onze|douze|treize|quatorze|quinze|seize|vingt)|plein cadre|top secret|vieux jeu|open source|Créative Commons|pair à pair|pur jus|terre à terre|bleu (?:ciel|marine|roi|saphir|turquoise)|vert (?:émeraude|olive|pomme)|rouge (?:brique|carmin|écarlate|rubis|sang)|jaune sable|blond platine|gris (?:acier|anthracite|perle|souris)|noir (?:d(?:’encre|e jais)|et blanc))
    @@0,$
    <<- morph(\1, ":(?:N|A|Q|V0e)", False) ~2>> *

# tous / tout / toute / toutes
__[i](p_tout_déterminant_masculin)__        (tout) (?:le|cet?|[mts]on) @@0              <<- ~1>> *
__[i](p_toute_déterminant_féminin)__        (toute) (?:la|cette|[mts]a) @@0             <<- ~1>> *
__[i](p_tous_toutes_déterminant_pluriel)__  (tou(?:te|)s) (?:[ldscsmt]es|[nv]os) @@0    <<- ~1>> *







|







5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
# couleurs invariables
__[i](p_couleurs_invariables)__
    ({w_2}) +((?:beige|blanc|bleu|brun|châtain|cyan|gris|jaune|magenta|marron|orange|pourpre|rose|rouge|vert|violet) (?:clair|fluo|foncé|irisé|pâle|pastel|sombre|vif|tendre)) @@0,$
    <<- morph(\1, ":[NAQ]", False) ~2>> *

# locutions adjectivales, nominales & couleurs
__[i](p_locutions_adj_nom_et_couleurs)__
    ({w_2}) +(bas(?: de gamme|se consommation)|bon (?:enfant|marché|teint|chic,? bon genre)|cl(?:é|ef) en mains?|dernier cri|fleur bleue|grand (?:public|luxe)|grandeur nature|haut(?: de gamme|e (?:résolution|fidélité|tension))|longue (?:distance|portée|durée)|meilleur marché|numéro (?:un|deux|trois|quatre|cinq|six|sept|huit|neuf|dix(?:-sept|-huit|-neuf)|onze|douze|treize|quatorze|quinze|seize|vingt)|plein cadre|top secret|vieux jeu|open source|Créative Commons|pair à pair|pur jus|terre à terre|bleu (?:ciel|marine|roi|saphir|turquoise)|vert (?:émeraude|olive|pomme)|rouge (?:brique|carmin|écarlate|rubis|sang)|jaune sable|blond platine|gris (?:acier|anthracite|perle|souris)|noir (?:d(?:’encre|e jais)|et blanc))
    @@0,$
    <<- morph(\1, ":(?:N|A|Q|V0e)", False) ~2>> *

# tous / tout / toute / toutes
__[i](p_tout_déterminant_masculin)__        (tout) (?:le|cet?|[mts]on) @@0              <<- ~1>> *
__[i](p_toute_déterminant_féminin)__        (toute) (?:la|cette|[mts]a) @@0             <<- ~1>> *
__[i](p_tous_toutes_déterminant_pluriel)__  (tou(?:te|)s) (?:[ldscsmt]es|[nv]os) @@0    <<- ~1>> *
4779
4780
4781
4782
4783
4784
4785

4786
4787
4788
4789
4790
4791
4792
__[i](p_ci_dessus_dessous)__            ci-desso?us                                 <<- ~>> *
__[i](p_debout_derechef)__              de(?:bout|rechef)                           <<- ~>> *
__[i](p_depuis)__                       (depuis), @@0                              <<- ~1>> *
__[i](p_déjà_désormais)__               dé(?:jà|sormais)                            <<- ~>> *
__[i](p_donc_dorénavant)__              do(?:nc|rénavant)                           <<- ~>> *
__[i](p_enfin_ensuite_encore)__         en(?:fin|suite|core)                        <<- ~>> *
__[i](p_guère)__                        guère                                       <<- ~>> *

__[i](p_jadis)__                        jadis                                       <<- ~>> *
__[i](p_jamais1)__                      jamais           <<- not before(r"(?i)\bne +$") ~>> *
__[i](p_loin_longtemps)__               lo(?:in|ngtemps)                            <<- ~>> *
__[i](p_mouais)__                       mouais                                      <<- ~>> *
__[i](p_naguère)__                      n(?:aguère|éanmoins)                        <<- ~>> *
__[i](p_parfois_partout)__              par(?:fois|tout)                            <<- ~>> *
__[i](p_presque_primo)__                pr(?:esque|imo)                             <<- ~>> *







>







5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
__[i](p_ci_dessus_dessous)__            ci-desso?us                                 <<- ~>> *
__[i](p_debout_derechef)__              de(?:bout|rechef)                           <<- ~>> *
__[i](p_depuis)__                       (depuis), @@0                              <<- ~1>> *
__[i](p_déjà_désormais)__               dé(?:jà|sormais)                            <<- ~>> *
__[i](p_donc_dorénavant)__              do(?:nc|rénavant)                           <<- ~>> *
__[i](p_enfin_ensuite_encore)__         en(?:fin|suite|core)                        <<- ~>> *
__[i](p_guère)__                        guère                                       <<- ~>> *
__[i](p_illico)__                       illico                                      <<- ~>> *
__[i](p_jadis)__                        jadis                                       <<- ~>> *
__[i](p_jamais1)__                      jamais           <<- not before(r"(?i)\bne +$") ~>> *
__[i](p_loin_longtemps)__               lo(?:in|ngtemps)                            <<- ~>> *
__[i](p_mouais)__                       mouais                                      <<- ~>> *
__[i](p_naguère)__                      n(?:aguère|éanmoins)                        <<- ~>> *
__[i](p_parfois_partout)__              par(?:fois|tout)                            <<- ~>> *
__[i](p_presque_primo)__                pr(?:esque|imo)                             <<- ~>> *
4817
4818
4819
4820
4821
4822
4823


4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
    (à (?:[mts]es|[nv]os|leurs) yeux) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[me]:[pi]", False) ~1>> *
__[i](p_ben_voyons)__
    ben voyons <<- isStart() ~>> *
__[i](p_chaque_année_semaine_journée_décennie)__
    (chaque (?:année|semaine|journée|décennie)) +({w_1}) @@0,$ <<- not morph(\2, ":(?:A.*:[fe]:[si]|Oo|[123][sp])", False) ~1>> *
__[i](p_chaque_an_jour_mois)__
    (chaque (?:an|jour|mois)) +({w_1}) @@0,$ <<- not morph(\2, ":(?:A.*:[me]:[si]|Oo|[123][sp])", False) ~1>> *


__[i](p_dans_l_ensemble)__
    (dans l’ensemble) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[me]:[si]", False) ~1>> *
__[i](p_de_ce_seul_fait)__
    (de ce (?:seul |)fait) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[me]:[si]", False) ~1>> *
__[i](p_dès_le_départ)__
    (dès le départ) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[me]:[si]") ~1>> *
__[i](p_dès_les_premiers_jours_mois_ans)__
    (dès les premiers (?:jours|mois|ans|siècles|trimestres|semestres)) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[me]:[pi]", False) ~1>> *
__[i](p_dès_les_premières_années_heures_minutes)__
    (dès les premières (?:années|semaines|minutes|secondes|heures|décennies)) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[fe]:[pi]", False) ~1>> *
__[i](p_en_certaines_plusieurs_occasions)__
    (en (?:certaines|quelques|plusieurs|de multiples) occasions) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[fe]:[pi]", False) ~1>> *
__[i](p_entre_autres_choses)__
    (entre autres choses) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[fe]:[pi]", False) ~1>> *
__[i](p_quelques_minutes_heures_années_plus_tard)__
    ((?:quelques|plusieurs|de +nombreuses) (?:secondes|minutes|heures|journées|semaines|années|décennies)) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[fe]:[pi]", False) ~1>> *
__[i](p_quelques_instants_jours_siècles)__
    ((?:quelques|plusieurs|de +nombreux) (?:instants|moments|jours|mois|ans|siècles)) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[me]:[pi]", False) ~1>> *
__[i](p_un_moment_instant)__
    (un (?:instant|moment)) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[me]:[si]", False) ~1>> *


TEST: pourquoi faire compliqué quand on peut faire simple
TEST: Pour ceux et celles qui étaient présents à la cérémonie
TEST: les pires vilénies suite au mauvais vote du peuple
TEST: La numéro 1 mondiale
TEST: cette information n’est rien comparé à cette énorme pression







>
>



















|







5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
    (à (?:[mts]es|[nv]os|leurs) yeux) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[me]:[pi]", False) ~1>> *
__[i](p_ben_voyons)__
    ben voyons <<- isStart() ~>> *
__[i](p_chaque_année_semaine_journée_décennie)__
    (chaque (?:année|semaine|journée|décennie)) +({w_1}) @@0,$ <<- not morph(\2, ":(?:A.*:[fe]:[si]|Oo|[123][sp])", False) ~1>> *
__[i](p_chaque_an_jour_mois)__
    (chaque (?:an|jour|mois)) +({w_1}) @@0,$ <<- not morph(\2, ":(?:A.*:[me]:[si]|Oo|[123][sp])", False) ~1>> *
__[i](p_d_évidence)__
    (d’évidence) +({w_1})  @@0,$ <<- not morph(\2, ":A.*:[fe]:[si]", False) ~1>> *
__[i](p_dans_l_ensemble)__
    (dans l’ensemble) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[me]:[si]", False) ~1>> *
__[i](p_de_ce_seul_fait)__
    (de ce (?:seul |)fait) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[me]:[si]", False) ~1>> *
__[i](p_dès_le_départ)__
    (dès le départ) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[me]:[si]") ~1>> *
__[i](p_dès_les_premiers_jours_mois_ans)__
    (dès les premiers (?:jours|mois|ans|siècles|trimestres|semestres)) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[me]:[pi]", False) ~1>> *
__[i](p_dès_les_premières_années_heures_minutes)__
    (dès les premières (?:années|semaines|minutes|secondes|heures|décennies)) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[fe]:[pi]", False) ~1>> *
__[i](p_en_certaines_plusieurs_occasions)__
    (en (?:certaines|quelques|plusieurs|de multiples) occasions) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[fe]:[pi]", False) ~1>> *
__[i](p_entre_autres_choses)__
    (entre autres choses) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[fe]:[pi]", False) ~1>> *
__[i](p_quelques_minutes_heures_années_plus_tard)__
    ((?:quelques|plusieurs|de +nombreuses) (?:secondes|minutes|heures|journées|semaines|années|décennies)) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[fe]:[pi]", False) ~1>> *
__[i](p_quelques_instants_jours_siècles)__
    ((?:quelques|plusieurs|de +nombreux) (?:instants|moments|jours|mois|ans|siècles)) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[me]:[pi]", False) ~1>> *
__[i](p_un_moment_instant)__
    (un (?:instant|moment|jour)) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[me]:[si]", False) ~1>> *


TEST: pourquoi faire compliqué quand on peut faire simple
TEST: Pour ceux et celles qui étaient présents à la cérémonie
TEST: les pires vilénies suite au mauvais vote du peuple
TEST: La numéro 1 mondiale
TEST: cette information n’est rien comparé à cette énorme pression
4890
4891
4892
4893
4894
4895
4896
4897

4898
4899
4900
4901
4902
4903
4904
TEST: Elle fut dès le départ structurée ainsi.
TEST: Ben voyons, c’est sûr, aucun problème !
TEST: ça peut être dans huit jours.
TEST: La secrétaire d’Etat à l’égalité entre les femmes et les hommes hérite de la lutte contre les discriminations
TEST: les populistes d’Europe centrale et de l’Est ont d’ores et déjà tellement réussi à compromettre les institutions de leur pays
TEST: Deirdre, elle aussi légèrement ostracisée, m’interrogea.
TEST: des échanges pair à pair




!!!
!!!
!!! Désambiguïsation (deprecated)
!!!
!!!







|
>







5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
TEST: Elle fut dès le départ structurée ainsi.
TEST: Ben voyons, c’est sûr, aucun problème !
TEST: ça peut être dans huit jours.
TEST: La secrétaire d’Etat à l’égalité entre les femmes et les hommes hérite de la lutte contre les discriminations
TEST: les populistes d’Europe centrale et de l’Est ont d’ores et déjà tellement réussi à compromettre les institutions de leur pays
TEST: Deirdre, elle aussi légèrement ostracisée, m’interrogea.
TEST: des échanges pair à pair
TEST: Les 27 ont préféré tout au long de la journée vanter un nouvel espoir dans leur avenir commun.
TEST: lorsqu’une campagne de malwares déployée dans un pays cible ne peut d’évidence y rester confinée.


!!!
!!!
!!! Désambiguïsation (deprecated)
!!!
!!!
5251
5252
5253
5254
5255
5256
5257

5258
5259
5260
5261
5262
5263

5264










5265










5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
    <<- (morphex(\2, ":[NAQ].*:s", ":(?:[ipGW]|[123][sp])")
    and not (after("^ +(?:et|ou) ") and morph(word(2), ":[NAQ]", True, False)))
    or \2 in aREGULARPLURAL
    -2>> =suggPlur(@)                                                                               # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.
    <<- __also__ -1>> leur                                                                          # Accord de nombre erroné avec « \2 ».

TEST: {{leurs}} {{action}}



__[i]/gn(gn_det_pluriel_accord)__
    (?:[dcmts]es|[nv]os|quelques|lesdits|aux|moult) +({w_2})  @@$
    <<- (morphex(\1, ":[NAQ].*:s", ":[ipGW]")
    and not (after("^ +(?:et|ou) ") and morph(word(2), ":[NAQ]", True, False)))

    or \1 in aREGULARPLURAL










    -1>> =suggPlur(@)                                                                               # Accord de nombre erroné : « \1 » devrait être au pluriel.










__[i]/gn(gn_plusieurs_accord)__
    plusieurs +({w_2})  @@$
    <<- (morphex(\1, ":[NAQ].*:s", ":[ipGWP]")
    and not (after("^ +(?:et|ou) ") and morph(word(2), ":[NAQ]", True, False)))
    or \1 in aREGULARPLURAL
    -1>> =suggPlur(@)                                                                               # Accord de nombre erroné : « \1 » devrait être au pluriel.

TEST: des {{pain}}                                            ->> pains
TEST: ces {{détournement}} de fonds et ces vols
TEST: Quelques {{homme}}.                                     ->> hommes
TEST: {{leur}} {{données}}
TEST: plusieurs {{femme}} sont venues.
TEST: une personne ou plusieurs ayant décidé de façon déterminée et coordonnée de faire cuire la grenouille


## Cas particuliers

__[i]/gn(gn_det_plur_cas_particuliers)__
    (?:[cdmts]es|[nv]os|leurs) (même|point|son|ton) @@$ <<- -1>> \1s                                # Accord de nombre erroné : mettez au pluriel.








>



|

|
>
|
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>







<
<
<
<
|
<







5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641




5642

5643
5644
5645
5646
5647
5648
5649
    <<- (morphex(\2, ":[NAQ].*:s", ":(?:[ipGW]|[123][sp])")
    and not (after("^ +(?:et|ou) ") and morph(word(2), ":[NAQ]", True, False)))
    or \2 in aREGULARPLURAL
    -2>> =suggPlur(@)                                                                               # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.
    <<- __also__ -1>> leur                                                                          # Accord de nombre erroné avec « \2 ».

TEST: {{leurs}} {{action}}
TEST: {{leur}} {{données}}


__[i]/gn(gn_det_pluriel_accord)__
    (?:[dmts]es|[nv]os|quelques|lesdits|moult) +({w_2})  @@$
    <<- (morphex(\1, ":[NAQ].*:s", ":[ipGW]")
    and not (after("^ +(?:et|ou) ") and morph(word(2), ":[NAQ]", True, False))) or \1 in aREGULARPLURAL
    -1>> =suggPlur(@)                                                                               # Accord de nombre erroné : « \1 » devrait être au pluriel.

TEST: des {{pain}}                                            ->> pains
TEST: Quelques {{homme}}.                                     ->> hommes
TEST: plusieurs {{femme}} sont venues.
TEST: une personne ou plusieurs ayant décidé de façon déterminée et coordonnée de faire cuire la grenouille


__[i]/gn(gn_ces_aux_pluriel_accord)__
    (ces|aux) +({w_2})  @@0,$
    <<- (morphex(\2, ":[NAQ].*:s", ":[ipGW]")
    and not (after("^ +(?:et|ou) ") and morph(word(2), ":[NAQ]", True, False))) or \2 in aREGULARPLURAL
    -2>> =suggPlur(@)                                                                               # Accord de nombre erroné : « \1 » devrait être au pluriel.
    <<- __also__ and morphex(\2, ">[bcdfglklmnpqrstvwxz].*:m", ":f") >>>
    <<- \1.endswith("x") or \1.endswith("X") -1>> au                                                # Accord de nombre erroné : « \2 » est au pluriel.
    <<- __else__ -1>> ce                                                                            # Accord de nombre erroné : « \2 » est au pluriel.

TEST: {{ces}} {{détournement}} de fonds et ces vols
TEST: ces {{étudiant}} sont légion.
TEST: je vais {{aux}} {{cinéma}}
TEST: il l’a donné aux {{étudiant}}


__[i]/gn(gn_plusieurs_accord)__
    plusieurs +({w_2})  @@$
    <<- (morphex(\1, ":[NAQ].*:s", ":[ipGWP]")
    and not (after("^ +(?:et|ou) ") and morph(word(2), ":[NAQ]", True, False)))
    or \1 in aREGULARPLURAL
    -1>> =suggPlur(@)                                                                               # Accord de nombre erroné : « \1 » devrait être au pluriel.





TEST: plusieurs {{foi}} par jour.



## Cas particuliers

__[i]/gn(gn_det_plur_cas_particuliers)__
    (?:[cdmts]es|[nv]os|leurs) (même|point|son|ton) @@$ <<- -1>> \1s                                # Accord de nombre erroné : mettez au pluriel.

5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585







5586
5587
5588
5589
5590
5591
5592
    <<- __also__ and hasFemForm(\1) -1>> =switchGender(@)                                           # Accord de genre erroné avec « \2 ».
    <<- ( (morphex(\1, ":[NAQ].*:p", ":(?:[Gsi]|V0e|Y)") and morph(\2, ":[NAQ].*:s")) or (morphex(\1, ":[NAQ].*:s", ":(?:[Gpi]|V0e|Y)") and morph(\2, ":[NAQ].*:p")) )
    and not apposition(\1, \2) and morph(word(-1), ":[VRX]", True, True)
    -2>> =switchPlural(@)                                                                           # Accord de nombre erroné avec « \1 ».
    <<- __also__ -1>> =switchPlural(@)                                                              # Accord de nombre erroné avec « \2 ».

TEST: Ils ont de {{grandes}} {{oreille}}
TEST: certains hommes {{petite}}
TEST: de {{grands}} {{homme}}
TEST: de {{manière}} {{légal}}
TEST: de {{petite}} {{homme}}
TEST: de {{pousse}} {{actif}}
TEST: De {{bon}} {{conseils}}
TEST: De {{mauvaises}} {{hommes}}
TEST: Ces produits sont de {{belle}} {{qualités}}.
TEST: Après être demeurée assise pendant quelque temps, elle se leva
TEST: ils choisissent de devenir indépendants









## l’

__[i]/gn(gn_2m_l)__
    (?<!et |ou |de )l’({w_2}) +({w_2})  @@2,$
    <<- not re.search("(?i)^air$", \1) and not \2.startswith("seul")
    and ( (morph(\1, ":m") and morph(\2, ":[NAQ].*:f")) or (morph(\1, ":f") and morph(\2, ":[NAQ].*:m")) )







<










>
>
>
>
>
>
>







5932
5933
5934
5935
5936
5937
5938

5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962
    <<- __also__ and hasFemForm(\1) -1>> =switchGender(@)                                           # Accord de genre erroné avec « \2 ».
    <<- ( (morphex(\1, ":[NAQ].*:p", ":(?:[Gsi]|V0e|Y)") and morph(\2, ":[NAQ].*:s")) or (morphex(\1, ":[NAQ].*:s", ":(?:[Gpi]|V0e|Y)") and morph(\2, ":[NAQ].*:p")) )
    and not apposition(\1, \2) and morph(word(-1), ":[VRX]", True, True)
    -2>> =switchPlural(@)                                                                           # Accord de nombre erroné avec « \1 ».
    <<- __also__ -1>> =switchPlural(@)                                                              # Accord de nombre erroné avec « \2 ».

TEST: Ils ont de {{grandes}} {{oreille}}

TEST: de {{grands}} {{homme}}
TEST: de {{manière}} {{légal}}
TEST: de {{petite}} {{homme}}
TEST: de {{pousse}} {{actif}}
TEST: De {{bon}} {{conseils}}
TEST: De {{mauvaises}} {{hommes}}
TEST: Ces produits sont de {{belle}} {{qualités}}.
TEST: Après être demeurée assise pendant quelque temps, elle se leva
TEST: ils choisissent de devenir indépendants

__[i]/gn(gn_de_manière_façon)__
    de +(manière|façon) +({w_3})  @@w,$
    <<- morphex(\2, ":A.*:(m|f:p)", ":[GM]") -2>> =suggFemSing(@)                                   # Accord erroné avec “\1” : l’adjectif devrait être au féminin singulier.

TEST: il fit cela tans de fois et avec brio de manière {{élégant}}.
TEST: elle s’y prit avec cet individu de façon {{charmant}}.


## l’

__[i]/gn(gn_2m_l)__
    (?<!et |ou |de )l’({w_2}) +({w_2})  @@2,$
    <<- not re.search("(?i)^air$", \1) and not \2.startswith("seul")
    and ( (morph(\1, ":m") and morph(\2, ":[NAQ].*:f")) or (morph(\1, ":f") and morph(\2, ":[NAQ].*:m")) )
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
    -2>> =switchGender(@, False)                                                                    # Accord de genre erroné entre « \1 » et « \2 ».
    <<- __also__ and hasFemForm(\1) -1>> =switchGender(@)                                           # Accord de genre erroné avec « \2 ».
    <<- not re.search("(?i)^air$", \1) and not \2.startswith("seul")
    and morph(\1, ":[si]") and morph(\2, ":[NAQ].*:p")
    and not apposition(\1, \2) and not morph(word(-1), ":[NAQ]", False, False)
    -2>> =suggSing(@)                                                                               # Accord de nombre erroné avec « \1 » : « \2 » devrait être au singulier.
    
TEST: L’amande {{amer}}
TEST: l’{{amicale}} {{animal}}
TEST: du chien et de l’{{excellente}} {{collier}} qu’il avait autour du cou.
TEST: du chien et de l’{{étonnante}} {{collier}} qu’il avait autour du cou.


## un / une








|







5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
    -2>> =switchGender(@, False)                                                                    # Accord de genre erroné entre « \1 » et « \2 ».
    <<- __also__ and hasFemForm(\1) -1>> =switchGender(@)                                           # Accord de genre erroné avec « \2 ».
    <<- not re.search("(?i)^air$", \1) and not \2.startswith("seul")
    and morph(\1, ":[si]") and morph(\2, ":[NAQ].*:p")
    and not apposition(\1, \2) and not morph(word(-1), ":[NAQ]", False, False)
    -2>> =suggSing(@)                                                                               # Accord de nombre erroné avec « \1 » : « \2 » devrait être au singulier.
    
TEST: L’{{amande}} {{amer}}
TEST: l’{{amicale}} {{animal}}
TEST: du chien et de l’{{excellente}} {{collier}} qu’il avait autour du cou.
TEST: du chien et de l’{{étonnante}} {{collier}} qu’il avait autour du cou.


## un / une

5803
5804
5805
5806
5807
5808
5809

5810
5811
5812
5813
5814
5815
5816
    <<- not \2.startswith("seul")
    and morphex(\1, ":[NAQ].*:[pi]", ":G") and morph(\2, ":[NAQ].*:s")
    and not apposition(\1, \2) and not (after_chk1(r"^ +et +(\w[\w-]+)", ":A") or after_chk1(r"^ *, +(\w[\w-]+)", ":A.*:[si]"))
    and not ( before(r"(?i)\bune? de ") or (\0.startswith("de") and before(r"(?i)\bune? +$")) )
    -2>> =suggMasPlur(@)                                                                            # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

TEST: certains claviers {{dégueulasse}}

TEST: elle se rappelle de quels rapports {{désastreuses}} il s’agit.
TEST: chez certains la revue Limite provoque des crises d’hystérie.


__[i]/gn(gn_2m_det_fem_plur)__
    (?<!et |ou |de )(?:certaines|quelles|lesdites) +({w_2}) +({w_2})  @@w,$
    <<- \1 != "fois" and not \2.startswith("seul")







>







6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
    <<- not \2.startswith("seul")
    and morphex(\1, ":[NAQ].*:[pi]", ":G") and morph(\2, ":[NAQ].*:s")
    and not apposition(\1, \2) and not (after_chk1(r"^ +et +(\w[\w-]+)", ":A") or after_chk1(r"^ *, +(\w[\w-]+)", ":A.*:[si]"))
    and not ( before(r"(?i)\bune? de ") or (\0.startswith("de") and before(r"(?i)\bune? +$")) )
    -2>> =suggMasPlur(@)                                                                            # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

TEST: certains claviers {{dégueulasse}}
TEST: certains hommes {{petite}}
TEST: elle se rappelle de quels rapports {{désastreuses}} il s’agit.
TEST: chez certains la revue Limite provoque des crises d’hystérie.


__[i]/gn(gn_2m_det_fem_plur)__
    (?<!et |ou |de )(?:certaines|quelles|lesdites) +({w_2}) +({w_2})  @@w,$
    <<- \1 != "fois" and not \2.startswith("seul")
6118
6119
6120
6121
6122
6123
6124
6125

6126



6127





6128
6129
6130
6131
6132
6133
6134
TEST: Ce collectif d’{{artiste}} est très inventif.
TEST: Rends-moi ma collection de {{film}} !
TEST: C’est un malheureux concours de {{circonstance}}.
TEST: à la confluence de {{rivière}}
TEST: ils constituent un groupe de {{passionné}}.
TEST: C’est un putain de troupeau de {{mouton}} !



#### Locutions










# à
__[i]/sgpl(sgpl_à_nu)__
    (m[eiî]\w+) +([aà] nu(?:es?|s))  @@0,$
    <<- morph(\1, ">(?:mettre|mise) ", False) -2>> à nu                     # « nu » est invariable dans cette locution.

TEST: Mettre {{à nus}} les hommes.








>
|
>
>
>

>
>
>
>
>







6489
6490
6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
TEST: Ce collectif d’{{artiste}} est très inventif.
TEST: Rends-moi ma collection de {{film}} !
TEST: C’est un malheureux concours de {{circonstance}}.
TEST: à la confluence de {{rivière}}
TEST: ils constituent un groupe de {{passionné}}.
TEST: C’est un putain de troupeau de {{mouton}} !


#### X fois par jour/an/semaine/etc.

__[i]/sgpl(sgpl_x_fois_par_période)__
    fois par (ans|années|décennies|heures|jours|minutes|mois|secondes|semaines|semestres|trimestres) @@$
    <<- -1>> \1                                                             # Mettez au singulier : x fois par période de temps, donc pour chaque période de temps.

TEST: vingt fois par {{ans}}, à peu près.
TEST: 12 fois par {{jours}}, ça suffit.


#### Locutions

# à
__[i]/sgpl(sgpl_à_nu)__
    (m[eiî]\w+) +([aà] nu(?:es?|s))  @@0,$
    <<- morph(\1, ">(?:mettre|mise) ", False) -2>> à nu                     # « nu » est invariable dans cette locution.

TEST: Mettre {{à nus}} les hommes.
6384
6385
6386
6387
6388
6389
6390






























6391
6392
6393
6394
6395
6396
6397


!!
!!
!!!! Confusions                                                                                     
!!
!!































# abuser / abusé / abusif
__[i]/conf(conf_abusif)__
    c’est +(abus(?:é|er))  @@$
    <<- isEnd() -1>> abusif                                         # Confusion. Concernant les actes, on parle de pratiques abusives. On abuse des choses ou des personnes.

TEST: C’est {{abusé}} !







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







6764
6765
6766
6767
6768
6769
6770
6771
6772
6773
6774
6775
6776
6777
6778
6779
6780
6781
6782
6783
6784
6785
6786
6787
6788
6789
6790
6791
6792
6793
6794
6795
6796
6797
6798
6799
6800
6801
6802
6803
6804
6805
6806
6807


!!
!!
!!!! Confusions                                                                                     
!!
!!

# à / a
__[i]/conf(conf_suite_à)__
    suite (a) ({w1}) @@w,$
    <<- morph(\2, ":D|>[ld] ", False) and isStart() -1>> à          # Confusion : “a” est une forme conjuguée du verbe “avoir”. Pour la préposition, écrivez “à”.

TEST: Suite {{a}} ces folies, nous rentrâmes chez nous.
TEST: il s’avère que, suite {{a}} d’horribles complications, nous renonçâmes.


__[i]/conf(conf_pronom_à_l_air)__
    (?:tout|ça|ce(?:ci|la)) (à) l’air +({w_2})  @@w,$
    <<- morphex(\2, ":[AR]", ">libre ") and morph(word(-1), ":Cs", False, True)
    -1>> a                                                          # Confusion probable : “à” est une préposition. Pour le verbe “avoir”, écrivez “a”.

TEST: lorsque tout {{à}} l’air fini, c’est trompeur.
TEST: Tout {{à}} l’air complètement foutu…
TEST: Ça {{à}} l’air génial.
TEST: Tout à la benne.


__[i]/conf(conf_à)__
    (a) (?:[mt]oi|eux|elles?)  @@0
    <<- not before(r"(?i)\b(?:il |elle |n’) *$") -1>> à             # Confusion : “a” est une forme conjuguée du verbe “avoir”. Pour la préposition, écrivez “à”.

TEST: Je le donne {{a}} toi.
TEST: Elle a eux pour lui donner des conseils.
TEST: Elle a elle réussi… (Formulation douteuse.)
TEST: Il a toi pour l’aider.


# abuser / abusé / abusif
__[i]/conf(conf_abusif)__
    c’est +(abus(?:é|er))  @@$
    <<- isEnd() -1>> abusif                                         # Confusion. Concernant les actes, on parle de pratiques abusives. On abuse des choses ou des personnes.

TEST: C’est {{abusé}} !
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
# accro / accroc
__[i]/conf(conf_être_accro)__
    ({etre}|dev\w+|sembl\w+|par\w+|rend\w+) +(accrocs?)  @@0,$
    <<- morph(\1, ">(?:être|devenir|para[îi]tre|rendre|sembler) ", False)
    -2>> =\2.replace("oc", "o")
    # Confusion : “accroc” signifie “déchirure”, “incident”, etc. tandis que “accro” est un terme familier qui signifie “dépendant”.
__[i]/conf(conf_accro_à)__
    (accrocs?) (?:[àa] (?:la (?:bouffe|cocaïne|cod[ée]ine|course|drogue|coke|meth|méthamphétamine|morphine|nicotine|nourriture|télé(?:vision|)|clope|cigarette|came|poudre|baise|musique)|cette (?:came|émission|merde|poudre|femme|meuf|gonzesse|conne|salope|garce)|ce (?:mec|keum|type|con(?:nard|)|fils de pute)|cet (?:homme|enculé|imbécile|enfoiré)|l’(?:alcool|amour|ecstasy|herbe|héro(?:ïne|)|opium|ordi(?:nateur|))|Facebook|Internet|Twitter|lui|elle)|[ad]u (?:chocolat|cul|jeu|poker|sexe|shopping|smartphone|sport|sucre|tabac|téléphone|travail|LSD|crack)|aux (?:anti-?dépresseurs|bonbons|hommes|mecs|femmes|gonzesses|méd(?:icaments|ocs)|jeux|séries|sucreries))
    @@0
    <<- -1>> =\1.replace("oc", "o")
    # Confusion : “accroc” signifie “déchirure”, “incident”, etc. tandis que “accro” est un terme familier qui signifie “dépendant”.

TEST: ils y sont {{accrocs}} depuis toujours
TEST: au poker, il semble {{accroc}}
TEST: il est {{accroc}} à la cocaïne







|







6828
6829
6830
6831
6832
6833
6834
6835
6836
6837
6838
6839
6840
6841
6842
# accro / accroc
__[i]/conf(conf_être_accro)__
    ({etre}|dev\w+|sembl\w+|par\w+|rend\w+) +(accrocs?)  @@0,$
    <<- morph(\1, ">(?:être|devenir|para[îi]tre|rendre|sembler) ", False)
    -2>> =\2.replace("oc", "o")
    # Confusion : “accroc” signifie “déchirure”, “incident”, etc. tandis que “accro” est un terme familier qui signifie “dépendant”.
__[i]/conf(conf_accro_à)__
    (accrocs?) (?:[àa] (?:la (?:bouffe|cocaïne|cod[ée]ine|course|drogue|coke|meth|méthamphétamine|morphine|nicotine|nourriture|télé(?:vision|)|clope|cigarette|came|poudre|baise|musique)|cette (?:came|émission|merde|poudre|femme|meuf|gonzesse|conne|salope|garce)|ce (?:mec|keum|type|con(?:nard|)|fils de pute)|cet (?:homme|enculé|imbécile|enfoiré)|l’(?:alcool|amour|argent|ecstasy|herbe|héro(?:ïne|)|opium|ordi(?:nateur|))|Facebook|Internet|Twitter|lui|elle)|[ad]u (?:chocolat|cul|jeu|poker|sexe|shopping|smartphone|sport|sucre|tabac|téléphone|travail|LSD|crack)|aux (?:anti-?dépresseurs|bonbons|hommes|mecs|femmes|gonzesses|méd(?:icaments|ocs)|jeux|séries|sucreries))
    @@0
    <<- -1>> =\1.replace("oc", "o")
    # Confusion : “accroc” signifie “déchirure”, “incident”, etc. tandis que “accro” est un terme familier qui signifie “dépendant”.

TEST: ils y sont {{accrocs}} depuis toujours
TEST: au poker, il semble {{accroc}}
TEST: il est {{accroc}} à la cocaïne
6706
6707
6708
6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
6724
6725
6726
6727
6728
6729
6730
6731
6732

6733
6734
6735
6736
6737
6738
6739
    <<- -1>> =\1.replace("o", "ô")                                             # Confusion : « coté » est le participe passé du verbe « coter ».

TEST: Je reste à ses {{cotés}}.


# cote / côte / cotte
__[i]/conf(conf_côte)__
    (cott?es?) (?:d(?:e (?:bœuf|porc|veau|Bretagne)[sx]?|’(?:agneaux?|Albâtre|Azur|Ivoire|Or|Opale|Émeraude))|(?:brisée|cassée|fêlée|fracturée|surnuméraire|rocheuse|adriatique|américaine|californienne|atlantiques?|basque|bretonne|landaise|normande|française|belge|espagnole|italienne|portugaise|africaine|méditerranéenne|pacifique|raide|occidentale|fractale)s?|nord|sud|ouest)  @@0
    <<- -1>> =\1.replace("o", "ô").replace("tt", "t")           # Confusion : écrivez “côtes” pour les os du thorax et les rivages.|https://fr.wiktionary.org/wiki/c%C3%B4te
__[i]/conf(conf_côtes)__
    (?:fracture|radiographie)s? des (cott?es)  @@$
    <<- -1>> côtes                                              # Confusion : écrivez “côtes” pour les os du thorax.|https://fr.wiktionary.org/wiki/c%C3%B4te
__[i]/conf(conf_cote)__
    (c(?:ôt|ott)es?) (?:mobilières?|foncières?|de (?:niveau|popularité|confiance)|d’(?:alerte|altitude|amour))  @@0
    <<- -1>> =\1.replace("ô", "o").replace("tt", "t")           # Confusion : utilisez « cote » pour chiffrer (cotation).|http://fr.wiktionary.org/wiki/cote
__[i]/conf(conf_cotte)__
    (c[ôo]tes?) de mailles?  @@0
    <<- -1>> =\1.replace("ô", "o").replace("t", "tt")           # Confusion : écrivez « cotte » pour la cotte de mailles.|https://fr.wiktionary.org/wiki/cotte_de_mailles
__[i]/conf(conf_avoir_la_cote)__
    ({avoir}) +la (côte)  @@0,$
    <<- morph(\1, ":V0a", False) -2>> cote                      # Confusion probable : utilisez « cote » (cotation).|http://fr.wiktionary.org/wiki/cote

TEST: Rien ne vaut une bonne {{cote}} de bœuf.
TEST: Elles ont passé une radiographie des {{cottes}}.
TEST: Quelle est sa {{côte}} de popularité
TEST: il a réussi à percer sa {{cote}} de mailles.
TEST: Il a la {{côte}} auprès de ses collègues



# cou / coup / coût
__[i]/conf(conf_coup_de)__
    (co[uû]t?s?) d(?:e (?:baguette|bâton|barre|bec|bélier|blues|botte|boule|boutoir|bol|bite|cœur|chaud|coude|dé|dent|déprime|froid|fil|foudre|genou|gueule|grâce|griffe|grisou|hache|hanche|Jarnac|jus|jeune|klaxon|main|ma[îi]tre|massue|neuf|nostalgie|pied|poing|poignard|pouce|pute|rein|rabot|savate|sang|sabot|sifflet|soleil|surin|tête|théâtre|torchon|vent|vieux)|’(?:éclat|épée|état|épaule|œil|estoc)|ur)s? @@0
    <<- -1>> coup
    # Confusion probable. Le coût est le prix d’une chose. Le cou est la partie joignant le tronc à la tête. Pour ce qui frappe, écrivez :







|



















>







7116
7117
7118
7119
7120
7121
7122
7123
7124
7125
7126
7127
7128
7129
7130
7131
7132
7133
7134
7135
7136
7137
7138
7139
7140
7141
7142
7143
7144
7145
7146
7147
7148
7149
7150
    <<- -1>> =\1.replace("o", "ô")                                             # Confusion : « coté » est le participe passé du verbe « coter ».

TEST: Je reste à ses {{cotés}}.


# cote / côte / cotte
__[i]/conf(conf_côte)__
    (cott?es?) (?:d(?:e (?:bœuf|porc|veau|Bretagne)[sx]?|’(?:agneaux?|Albâtre|Armor|Azur|Ivoire|Or|Opale|Émeraude))|(?:brisée|cassée|fêlée|fracturée|surnuméraire|rocheuse|adriatique|américaine|californienne|atlantiques?|basque|bretonne|landaise|normande|française|belge|espagnole|italienne|portugaise|africaine|méditerranéenne|pacifique|raide|occidentale|fractale)s?|nord|sud|ouest)  @@0
    <<- -1>> =\1.replace("o", "ô").replace("tt", "t")           # Confusion : écrivez “côtes” pour les os du thorax et les rivages.|https://fr.wiktionary.org/wiki/c%C3%B4te
__[i]/conf(conf_côtes)__
    (?:fracture|radiographie)s? des (cott?es)  @@$
    <<- -1>> côtes                                              # Confusion : écrivez “côtes” pour les os du thorax.|https://fr.wiktionary.org/wiki/c%C3%B4te
__[i]/conf(conf_cote)__
    (c(?:ôt|ott)es?) (?:mobilières?|foncières?|de (?:niveau|popularité|confiance)|d’(?:alerte|altitude|amour))  @@0
    <<- -1>> =\1.replace("ô", "o").replace("tt", "t")           # Confusion : utilisez « cote » pour chiffrer (cotation).|http://fr.wiktionary.org/wiki/cote
__[i]/conf(conf_cotte)__
    (c[ôo]tes?) de mailles?  @@0
    <<- -1>> =\1.replace("ô", "o").replace("t", "tt")           # Confusion : écrivez « cotte » pour la cotte de mailles.|https://fr.wiktionary.org/wiki/cotte_de_mailles
__[i]/conf(conf_avoir_la_cote)__
    ({avoir}) +la (côte)  @@0,$
    <<- morph(\1, ":V0a", False) -2>> cote                      # Confusion probable : utilisez « cote » (cotation).|http://fr.wiktionary.org/wiki/cote

TEST: Rien ne vaut une bonne {{cote}} de bœuf.
TEST: Elles ont passé une radiographie des {{cottes}}.
TEST: Quelle est sa {{côte}} de popularité
TEST: il a réussi à percer sa {{cote}} de mailles.
TEST: Il a la {{côte}} auprès de ses collègues
TEST: on a atteint la cote d’alerte.


# cou / coup / coût
__[i]/conf(conf_coup_de)__
    (co[uû]t?s?) d(?:e (?:baguette|bâton|barre|bec|bélier|blues|botte|boule|boutoir|bol|bite|cœur|chaud|coude|dé|dent|déprime|froid|fil|foudre|genou|gueule|grâce|griffe|grisou|hache|hanche|Jarnac|jus|jeune|klaxon|main|ma[îi]tre|massue|neuf|nostalgie|pied|poing|poignard|pouce|pute|rein|rabot|savate|sang|sabot|sifflet|soleil|surin|tête|théâtre|torchon|vent|vieux)|’(?:éclat|épée|état|épaule|œil|estoc)|ur)s? @@0
    <<- -1>> coup
    # Confusion probable. Le coût est le prix d’une chose. Le cou est la partie joignant le tronc à la tête. Pour ce qui frappe, écrivez :
6834
6835
6836
6837
6838
6839
6840

6841
6842
6843
6844
6845
6846
6847
6848
6849
6850
6851














6852
6853
6854
6855
6856
6857
6858
TEST: Je résiste à l’envie de manger du chocolat.
TEST: On ne s’intéresse pas à l’école ni à l’âge, mais aux compétences et à l’envie de partager.


# et / est
__[i]/conf(conf_est)__
    (et) +({w_4}) *$ @@0,$

    <<- before_chk1(r"(?i)^ *(?:l[ea]|ce(?:tte|t|)|mon|[nv]otre) +(\w[\w-]+\w) +$", ":[NA].*:[is]", ":G")
    -1>> est                                                                        # Confusion probable : “et” est une conjonction de coordination. Pour le verbe être à la 3ᵉ personne du singulier, écrivez :
    <<- before_chk1(r"(?i)^ *(?:ton) +(\w[\w-]+\w) +$", ":N.*:[is]", ":[GA]")
    -1>> est                                                                        # Confusion probable : “et” est une conjonction de coordination. Pour le verbe être à la 3ᵉ personne du singulier, écrivez :
    <<- before_chk1(r"^ *([A-ZÉÈ][\w-]+\w) +$", ":M", ":G") -1>> est                # Confusion probable : “et” est une conjonction de coordination. Pour le verbe être à la 3ᵉ personne du singulier, écrivez :

TEST: ce chien {{et}} malade.
TEST: ton chat {{et}} cinglé.
TEST: Pauline {{et}} fatiguée.
TEST: ton implacable et amère !
TEST: son cristallin et aigu
















# faite / faîte / fait
__[i]/conf(conf_faites)__
    vous +(?:ne |leur |lui |nous |vous |)(faîtes?) @@$ <<- -1>> faites                              # Confusion. Le faîte (≠ faire) est le point culminant de quelque chose.
__[i]/conf(conf_faites_vous)__
    (faîtes?)[- ]vous  @@0 <<- not morph(word(-1), ":D.*:[me]:[sp]", False) -1>> faites             # Confusion. Le faîte (≠ faire) est le point culminant de quelque chose.







>











>
>
>
>
>
>
>
>
>
>
>
>
>
>







7245
7246
7247
7248
7249
7250
7251
7252
7253
7254
7255
7256
7257
7258
7259
7260
7261
7262
7263
7264
7265
7266
7267
7268
7269
7270
7271
7272
7273
7274
7275
7276
7277
7278
7279
7280
7281
7282
7283
7284
TEST: Je résiste à l’envie de manger du chocolat.
TEST: On ne s’intéresse pas à l’école ni à l’âge, mais aux compétences et à l’envie de partager.


# et / est
__[i]/conf(conf_est)__
    (et) +({w_4}) *$ @@0,$
    <<- morphex(\2, ":[QA]", ":M") and \2.islower() >>>
    <<- before_chk1(r"(?i)^ *(?:l[ea]|ce(?:tte|t|)|mon|[nv]otre) +(\w[\w-]+\w) +$", ":[NA].*:[is]", ":G")
    -1>> est                                                                        # Confusion probable : “et” est une conjonction de coordination. Pour le verbe être à la 3ᵉ personne du singulier, écrivez :
    <<- before_chk1(r"(?i)^ *(?:ton) +(\w[\w-]+\w) +$", ":N.*:[is]", ":[GA]")
    -1>> est                                                                        # Confusion probable : “et” est une conjonction de coordination. Pour le verbe être à la 3ᵉ personne du singulier, écrivez :
    <<- before_chk1(r"^ *([A-ZÉÈ][\w-]+\w) +$", ":M", ":G") -1>> est                # Confusion probable : “et” est une conjonction de coordination. Pour le verbe être à la 3ᵉ personne du singulier, écrivez :

TEST: ce chien {{et}} malade.
TEST: ton chat {{et}} cinglé.
TEST: Pauline {{et}} fatiguée.
TEST: ton implacable et amère !
TEST: son cristallin et aigu
TEST: Les pays ibériques et scandinaves ont signé le traité.
TEST: Les gouvernements espagnol et mexicain ont signé le traité.
TEST: Béatrice Dalle et Claude


__[i]/conf(conf_où_est)__
    où (et) +({w_1}) @@w,$
    <<- morphex(\2, ":D", ":R|>(?:quand|pourquoi)") or (\2 == "l" and after("^’")) 
    -1>> est                                                                        # Confusion probable : “et” est une conjonction de coordination. Pour le verbe être à la 3ᵉ personne du singulier, écrivez :

TEST: où {{et}} cet ennemi ?
TEST: où {{et}} l’homme qui est passé ce matin ?
TEST: Je veux savoir où et quand, où et pouquoi.
TEST: où et avec qui ?


# faite / faîte / fait
__[i]/conf(conf_faites)__
    vous +(?:ne |leur |lui |nous |vous |)(faîtes?) @@$ <<- -1>> faites                              # Confusion. Le faîte (≠ faire) est le point culminant de quelque chose.
__[i]/conf(conf_faites_vous)__
    (faîtes?)[- ]vous  @@0 <<- not morph(word(-1), ":D.*:[me]:[sp]", False) -1>> faites             # Confusion. Le faîte (≠ faire) est le point culminant de quelque chose.
6884
6885
6886
6887
6888
6889
6890
6891
6892
6893
6894
6895
6896
6897
6898
6899
6900
6901
6902
6903
6904
6905
6906
6907
6908
6909
6910
6911
6912
6913

# foi / fois
__[i]/conf(conf_bonne_mauvaise_foi)__
    (mauvaise|bonne) (fois)  @@0,$
    <<- not ( \1 == "bonne" and before(r"(?i)\bune +$") and after("(?i)^ +pour toute") ) 
    -2>> foi                                                                                        # Confusion probable.|http://fr.wiktionary.org/wiki/foi
__[i]/conf(conf_faire_perdre_donner_foi)__
    ((?:f|perd|donn)\w+) (fois) @@0,$
    <<- morph(\1, ">(?:faire|perdre|donner) ", False) -2>> foi                                      # Confusion probable.|http://fr.wiktionary.org/wiki/foi

TEST: C’est une personne de bonne {{fois}}.
TEST: Mais il a perdu {{fois}} en l’avenir.


# fond / fonds
__[i]/conf(conf_de_fonds)__
    (?:collecte|levée)s? de (fon[dt]) @@$ <<- -1>> fonds
    # Confusion : fonds (ce qui constitue une richesse) ≠ fond (partie la plus basse/profonde).
__[i]/conf(conf_à_fonds_perdus)__
    à (fond) perdus? @@2 <<- -1>> fonds
    # Confusion : fonds (ce qui constitue une richesse) ≠ fond (partie la plus basse/profonde).
__[i]/conf(conf_fonds_qqch)__
    (fon[dt]) (?:monétaires?|spéculatifs?|international|de (?:commerce|garantie|roulement|pension|placement|retraite|roulement|solidarité)|d’(?:aide|investissement|indemnisation))  @@0
    <<- -1>> fonds
    # Confusion : fonds (ce qui constitue une richesse) ≠ fond (partie la plus basse/profonde).
__[i]/conf(conf_fonts_baptismaux)__
    (fonds) baptismaux @@0 <<- -1>> fonts
    # Confusion. Écrivez “fonts”, qui vient du latin “fons” et signifie « fontaine, source ».

TEST: faire une levée de {{fond}}.







|
|







|


|


|







7310
7311
7312
7313
7314
7315
7316
7317
7318
7319
7320
7321
7322
7323
7324
7325
7326
7327
7328
7329
7330
7331
7332
7333
7334
7335
7336
7337
7338
7339

# foi / fois
__[i]/conf(conf_bonne_mauvaise_foi)__
    (mauvaise|bonne) (fois)  @@0,$
    <<- not ( \1 == "bonne" and before(r"(?i)\bune +$") and after("(?i)^ +pour toute") ) 
    -2>> foi                                                                                        # Confusion probable.|http://fr.wiktionary.org/wiki/foi
__[i]/conf(conf_faire_perdre_donner_foi)__
    ((?:f[aieî]|perd|donn|[ae])\w*) (fois) @@0,$
    <<- morph(\1, ">(?:faire|perdre|donner|avoir) ", False) -2>> foi                                      # Confusion probable.|http://fr.wiktionary.org/wiki/foi

TEST: C’est une personne de bonne {{fois}}.
TEST: Mais il a perdu {{fois}} en l’avenir.


# fond / fonds
__[i]/conf(conf_de_fonds)__
    (?:collecte|levée|extorsion|détournement)s? de (fon(?:d|ts)) @@$ <<- -1>> fonds
    # Confusion : fonds (ce qui constitue une richesse) ≠ fond (partie la plus basse/profonde).
__[i]/conf(conf_à_fonds_perdus)__
    à (fon(?:d|ts)) perdus? @@2 <<- -1>> fonds
    # Confusion : fonds (ce qui constitue une richesse) ≠ fond (partie la plus basse/profonde).
__[i]/conf(conf_fonds_qqch)__
    (fon(?:d|ts)) (?:monétaires?|spéculatifs?|international|de (?:commerce|garantie|roulement|pension|placement|retraite|roulement|solidarité)|d’(?:aide|investissement|indemnisation))  @@0
    <<- -1>> fonds
    # Confusion : fonds (ce qui constitue une richesse) ≠ fond (partie la plus basse/profonde).
__[i]/conf(conf_fonts_baptismaux)__
    (fonds) baptismaux @@0 <<- -1>> fonts
    # Confusion. Écrivez “fonts”, qui vient du latin “fons” et signifie « fontaine, source ».

TEST: faire une levée de {{fond}}.
6935
6936
6937
6938
6939
6940
6941
6942
6943
6944
6945
6946
6947
6948
6949
6950
6951
6952
6953
6954
6955
6956









6957
6958
6959
6960
6961
6962
6963

TEST: En mon {{fort intérieur}}, je le crois.
TEST: Dans son {{fort intérieur}}, je le crois.


# gène / gêne
__[i]/conf(conf_sans_gêne)__
    sans[- ]gènes? <<- ->> sans-gêne                                      # Confusion. Gène = élément des chromosomes. Gêne = embarras.
__[i]/conf(conf_gènes)__
    (?:[dmtsc]es|[nv]os|leurs) (gênes) @@$ <<- -1>> gènes                 # Confusion probable. Gène = élément des chromosomes. Gêne = embarras.

TEST: Quel {{sans gène}}, celui-là !
TEST: Il croit que ses {{gênes}} décident de sa santé…


# gent [nf] / gent(e)(s) [adj]
__[i]/conf(conf_gent)__
    la (gente) (?:féminine|masculine) @@3 <<- -1>> gent
    # Confusion. « Gente » est un adjectif vieilli. Utiliser « gent » pour désigner un groupe de personnes.

TEST: la {{gente}} masculine est grossière et l’a toujours été.











# gré / grès
__[i]/conf(conf_à_leur_gré)__
    à (?:[mts]on|[nv]otre|leur) (grès) @@$ <<- -1>> gré                                   # Confusion probable. Le grès est une roche détritique.
__[i]/conf(conf_bon_gré_mal_gré)__
    bon grès,? mal grès <<- ->> bon gré, mal gré|bon gré mal gré                          # Confusion. Le grès est une roche détritique.
__[i]/conf(conf_au_gré_de)__







|

|












>
>
>
>
>
>
>
>
>







7361
7362
7363
7364
7365
7366
7367
7368
7369
7370
7371
7372
7373
7374
7375
7376
7377
7378
7379
7380
7381
7382
7383
7384
7385
7386
7387
7388
7389
7390
7391
7392
7393
7394
7395
7396
7397
7398

TEST: En mon {{fort intérieur}}, je le crois.
TEST: Dans son {{fort intérieur}}, je le crois.


# gène / gêne
__[i]/conf(conf_sans_gêne)__
    sans[- ]gènes? <<- ->> sans-gêne                                      # Confusion. Les gènes sont des éléments des chromosomes. Pour le synonyme d’embarras, écrivez “gêne”.
__[i]/conf(conf_gènes)__
    (?:[dmtsc]es|[nv]os|leurs) (gênes) @@$ <<- -1>> gènes                 # Confusion probable. Les gènes sont des éléments des chromosomes. Pour le synonyme d’embarras, écrivez “gêne”.

TEST: Quel {{sans gène}}, celui-là !
TEST: Il croit que ses {{gênes}} décident de sa santé…


# gent [nf] / gent(e)(s) [adj]
__[i]/conf(conf_gent)__
    la (gente) (?:féminine|masculine) @@3 <<- -1>> gent
    # Confusion. « Gente » est un adjectif vieilli. Utiliser « gent » pour désigner un groupe de personnes.

TEST: la {{gente}} masculine est grossière et l’a toujours été.


# goutte / goûte
__[i]/conf(conf_goutte)__
    (go[ûu]tes?) d(?:e +(?:lait|liquide|sang|sueur|sperme|salive|javel|bière|miel|mercure|peinture|pluie|rosée|vin|vinaigre|whisky|rhum|folie)|’(?:alcool|acide|amour|eau|huile|urine)) @@0
    <<- -1>> =\1.replace("û", "u").replace("t", "tt")           # Confusion : “goûter” signifie utiliser le sens du goût. Pour une petite quantité de liquide, écrivez “goutte”.

TEST: Une {{goûte}} de pluie
TEST: tu sais, les {{goutes}} de pluie, ça mouille.


# gré / grès
__[i]/conf(conf_à_leur_gré)__
    à (?:[mts]on|[nv]otre|leur) (grès) @@$ <<- -1>> gré                                   # Confusion probable. Le grès est une roche détritique.
__[i]/conf(conf_bon_gré_mal_gré)__
    bon grès,? mal grès <<- ->> bon gré, mal gré|bon gré mal gré                          # Confusion. Le grès est une roche détritique.
__[i]/conf(conf_au_gré_de)__
7004
7005
7006
7007
7008
7009
7010
7011
7012
7013
7014
7015
7016
7017
7018
7019
7020
7021
7022
7023
7024
7025
7026















7027
7028
7029
7030
7031
7032
7033
TEST: cette {{bête}}-{{la}}
TEST: il ne {{là}} croit pas.


# la / l’a
__[i]/conf(conf_il_elle_on_la_vconj)__
    (?:il|elle|on) (?:nous |vous |)(l’a) +([bcdfghjklmnpqrstvwxz][\w-]+)  @@w,$
    <<- morphex(\2, ":[123][sp]", ":[GQ]") -1>> la                                                  # Confusion probable. Pour un pronom objet féminin, écrivez :
__[i]/conf(conf_ne_la_vconj)__
    ne (?:nous |vous |)(l’a) +([bcdfghjklmnpqrstvwxz][\w-]+) @@w,$
    <<- morphex(\2, ":[123][sp]", ":[GQ]") -1>> la                                                  # Confusion probable. Pour un pronom objet féminin, écrivez :
__[i]/conf(conf_ne_la_lui_leur)__
    ne (l’a) l(?:ui|eur)  @@3
    <<- -1>> la                                                                                     # Confusion probable. Pour un pronom objet féminin, écrivez :
__[i]/conf(conf_me_se_se_la_vconj)__
    [mts]e (l’a) +([bcdfghjklmnpqrstvwxz][\w-]+)  @@3,$
    <<- morphex(\2, ":[123][sp]", ":[GQ]") -1>> la                                                  # Confusion probable. Pour un pronom objet féminin, écrivez :

TEST: on {{l’a}} {{prit}} pour une idiote.
TEST: il ne {{l’a}} {{connaît}} pas.
TEST: elle ne {{l’a}} leur donne pas sans condition.
TEST: elle se {{l’a}} {{réserve}} pour elle-même.

















# laissez-passer / laissez-faire
__[i]/conf(conf_laisser_passer)__
    laisser-passer <<- ->> laissez-passer                                                 # Confusion.
__[i]/conf(conf_laisser_aller)__
    laissez-(aller|faire) @@8 <<- ->> laisser-\1                                          # Confusion.








|


|


|


|






>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







7439
7440
7441
7442
7443
7444
7445
7446
7447
7448
7449
7450
7451
7452
7453
7454
7455
7456
7457
7458
7459
7460
7461
7462
7463
7464
7465
7466
7467
7468
7469
7470
7471
7472
7473
7474
7475
7476
7477
7478
7479
7480
7481
7482
7483
TEST: cette {{bête}}-{{la}}
TEST: il ne {{là}} croit pas.


# la / l’a
__[i]/conf(conf_il_elle_on_la_vconj)__
    (?:il|elle|on) (?:nous |vous |)(l’a) +([bcdfghjklmnpqrstvwxz][\w-]+)  @@w,$
    <<- morphex(\2, ":[123][sp]", ":[GQ]") -1>> la                                                  # Confusion probable. Pour un pronom objet féminin, écrivez “la”.
__[i]/conf(conf_ne_la_vconj)__
    ne (?:nous |vous |)(l’a) +([bcdfghjklmnpqrstvwxz][\w-]+) @@w,$
    <<- morphex(\2, ":[123][sp]", ":[GQ]") -1>> la                                                  # Confusion probable. Pour un pronom objet féminin, écrivez “la”.
__[i]/conf(conf_ne_la_lui_leur)__
    ne (l’a) l(?:ui|eur)  @@3
    <<- -1>> la                                                                                     # Confusion probable. Pour un pronom objet féminin, écrivez “la”.
__[i]/conf(conf_me_se_se_la_vconj)__
    [mts]e (l’a) +([bcdfghjklmnpqrstvwxz][\w-]+)  @@3,$
    <<- morphex(\2, ":[123][sp]", ":[GQ]") -1>> la                                                  # Confusion probable. Pour un pronom objet féminin, écrivez “la”.

TEST: on {{l’a}} {{prit}} pour une idiote.
TEST: il ne {{l’a}} {{connaît}} pas.
TEST: elle ne {{l’a}} leur donne pas sans condition.
TEST: elle se {{l’a}} {{réserve}} pour elle-même.


__[i]/conf(conf_il_elle_on_l_a)__
    (?:il|elle|on) (?:vous |nous |)(la)[ @]+({w_2}) @@*,$
    <<- morphex(\2, ":Q", ":(?:[123][sp]|V[123]......e)|>lui ") -1>> l’a                            # Confusion probable : “\2” est un participe passé. Il faut donc employer l’auxiliaire “avoir”.
__[i]/conf(conf_ne_l_a)__
    ne (?:vous |nous |)(la)[ @]+({w_2}) @@*,$
    <<- morphex(\2, ":Q", ":(?:[123][sp]|V[123]......e)|>lui ") -1>> l’a                            # Confusion probable : “\2” est un participe passé. Il faut donc employer l’auxiliaire “avoir”.
__[i]/conf(conf_me_te_l_a)__
    [mt]e (la)[ @]+({w_2})  @@*,$
    <<- morphex(\2, ":Q", ":(?:[123][sp]|V[123]......e)|>lui ") -1>> l’a                            # Confusion probable : “\2” est un participe passé. Il faut donc employer l’auxiliaire “avoir”.

TEST: il {{la}} {{donnée}}.
TEST: ne {{la}} {{donné}} que contraint et forcé…
TEST: celle-là, il me {{la}} {{commandée}} ?


# laissez-passer / laissez-faire
__[i]/conf(conf_laisser_passer)__
    laisser-passer <<- ->> laissez-passer                                                 # Confusion.
__[i]/conf(conf_laisser_aller)__
    laissez-(aller|faire) @@8 <<- ->> laisser-\1                                          # Confusion.

7126
7127
7128
7129
7130
7131
7132
7133
7134
7135
7136
7137

7138
7139
7140
7141
7142
7143
7144
# notre / nôtre -- votre / vôtre
# Hunspell corrige déjà les formes au pluriel (les nôtres).
__[i]/conf(conf_les_nôtres)__
    (?:les?|la|du|des|aux?) ([nv]otres?)  @@$
    <<- not (\1 == "Notre" and after("Père")) -1>> =\1.replace("otre", "ôtre")                      # Confusion : « notre possession », « la nôtre ».
__[i]/conf(conf_notre_votre_qqch)__
    ([nv]ôtres?) ({w_2})  @@0,$
    <<- not before(r"(?i)\b(les?|la|du|des|aux?) +") and morph(\2, ":[NAQ]", False)
    -1>> =\1.replace("ôtre", "otre").rstrip("s")                                                    # Confusion : « notre possession », « la nôtre ».

TEST: C’est la {{votre}} ?
TEST: {{nôtre}} père est si âgé.



# nulle part
__[i]/conf(conf_nulle_part)__
    nul part <<- not morph(word(-1), ":D", False, False) ->> nulle part                             # Confusion : pour dire « en aucun lieu », écrivez :

TEST: car {{nul part}} ailleurs, on n’en trouve une telle concentration







|




>







7576
7577
7578
7579
7580
7581
7582
7583
7584
7585
7586
7587
7588
7589
7590
7591
7592
7593
7594
7595
# notre / nôtre -- votre / vôtre
# Hunspell corrige déjà les formes au pluriel (les nôtres).
__[i]/conf(conf_les_nôtres)__
    (?:les?|la|du|des|aux?) ([nv]otres?)  @@$
    <<- not (\1 == "Notre" and after("Père")) -1>> =\1.replace("otre", "ôtre")                      # Confusion : « notre possession », « la nôtre ».
__[i]/conf(conf_notre_votre_qqch)__
    ([nv]ôtres?) ({w_2})  @@0,$
    <<- not before(r"(?i)\b(les?|la|du|des|aux?) +") and morphex(\2, ":[NAQ]", ":D")
    -1>> =\1.replace("ôtre", "otre").rstrip("s")                                                    # Confusion : « notre possession », « la nôtre ».

TEST: C’est la {{votre}} ?
TEST: {{nôtre}} père est si âgé.
TEST: nous vous proposons de faire vôtre une autre volonté


# nulle part
__[i]/conf(conf_nulle_part)__
    nul part <<- not morph(word(-1), ":D", False, False) ->> nulle part                             # Confusion : pour dire « en aucun lieu », écrivez :

TEST: car {{nul part}} ailleurs, on n’en trouve une telle concentration
7223
7224
7225
7226
7227
7228
7229
7230
7231
7232
7233
7234
7235
7236
7237
7238
7239
7240
7241
7242
7243
7244
7245
7246
7247
7248
7249
7250
7251
7252
    ({w_2})( ont)  @@w,$
    <<- morph(\1, ":3s", False) and before("^ *$|, $") -2>> -on
    # Confusion probable : “ont” est une forme conjuguée du verbe “avoir”. Pour le pronom personnel, écrivez “on” et mettez un trait d’union puisqu’il s’agit d’une question.

TEST: peut{{ ont}} y arriver ?
TEST: les politiques de l’offre ont échoué.


# ou / où
__[i]/conf(conf_où_verbe)__
    ^(Ou) ({w_2}) @@0,3 <<- morphex(\2, ":3[sp]", ":Y") -1>> Où                             # Confusion probable. Utilisez “où” pour “en quel lieu”.
__[i]/conf(conf_au_moment_par_d_où)__
    (?:au moment |jusqu |par |d’)(ou) @@$ <<- -1>> où                                       # Confusion. On écrit “ceci ou cela” mais “où aller ?”, “par où aller”, “au moment où”…
__[i]/conf(conf_vers_où)__
    vers (ou) @@5 <<- not morph(word(-1), ":D", False, False) -1>> où                       # Confusion probable. On écrit “ceci ou cela” mais “vers où aller ?”
__[i]/conf(conf_jusqu_où_au_cas_où)__
    (?:au|le|des) cas (ou) @@$ <<- -1>> où                                                  # Confusion. On écrit “ceci ou cela” mais “où aller ?”

TEST: {{Ou}} sont tes affaires ?
TEST: au moment {{ou}} elle allait enfin réussir
TEST: vers {{ou}} se tourner quand tout va mal ?
TEST: pour le cas {{ou}} on serait arrêté dans notre élan.


# pain / pin
__[i]/conf(conf_pain_qqch)__
    (pins?) (?:d’épices?|perdus?|sans glutens?) @@0 <<- -1>> =\1.replace("pin", "pain")
    # Confusion. Le pin est un arbre résineux à aiguilles persistantes. Pour parler la pâte de farine et d’eau cuite au four, écrivez :
__[i]/conf(conf_manger_pain)__
    ((?:mang|dévor|aval|englout)\w+) +(?:les?|d(?:u|es)|un|[mts](?:on|es)|leurs?|[nv]o(?:s|tre)) +(pins?)  @@0,$







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







7674
7675
7676
7677
7678
7679
7680
















7681
7682
7683
7684
7685
7686
7687
    ({w_2})( ont)  @@w,$
    <<- morph(\1, ":3s", False) and before("^ *$|, $") -2>> -on
    # Confusion probable : “ont” est une forme conjuguée du verbe “avoir”. Pour le pronom personnel, écrivez “on” et mettez un trait d’union puisqu’il s’agit d’une question.

TEST: peut{{ ont}} y arriver ?
TEST: les politiques de l’offre ont échoué.


















# pain / pin
__[i]/conf(conf_pain_qqch)__
    (pins?) (?:d’épices?|perdus?|sans glutens?) @@0 <<- -1>> =\1.replace("pin", "pain")
    # Confusion. Le pin est un arbre résineux à aiguilles persistantes. Pour parler la pâte de farine et d’eau cuite au four, écrivez :
__[i]/conf(conf_manger_pain)__
    ((?:mang|dévor|aval|englout)\w+) +(?:les?|d(?:u|es)|un|[mts](?:on|es)|leurs?|[nv]o(?:s|tre)) +(pins?)  @@0,$
7299
7300
7301
7302
7303
7304
7305














7306
7307
7308
7309
7310
7311
7312
7313
7314
TEST: Il faut savoir tirer {{partis}} de ces atouts-là.
TEST: Tu fais {{parti}} de l’élite, enfin, façon de parler.
TEST: Nous sommes tous d’une manière ou d’une autre {{juge et parti}}.
TEST: Prendre Damien {{à parti}}.


# pâte / patte














__[i]/conf(conf_coq_en_pâte)__
    (?:coqs?) en (pattes?) @@$ <<- -1>> pâte                                              # Confusion. Patte = jambe. Pâte = matière pâteuse.

TEST: Il est comme un coq en {{pattes}} là.


# peu / peut / peux
__[i]/conf(conf_peu_de_qqch)__
    (peu[xt]) d(?:e |’)({w_2}) @@0,$







>
>
>
>
>
>
>
>
>
>
>
>
>
>

|







7734
7735
7736
7737
7738
7739
7740
7741
7742
7743
7744
7745
7746
7747
7748
7749
7750
7751
7752
7753
7754
7755
7756
7757
7758
7759
7760
7761
7762
7763
TEST: Il faut savoir tirer {{partis}} de ces atouts-là.
TEST: Tu fais {{parti}} de l’élite, enfin, façon de parler.
TEST: Nous sommes tous d’une manière ou d’une autre {{juge et parti}}.
TEST: Prendre Damien {{à parti}}.


# pâte / patte
__[i]/conf(conf_pâtes)__
    (p[aâ]t?tes?) +(alimentaires?|alsaciennes?|chinoises?|feuilletées?|italiennes?|thermiques?|au (?:basilic|beurre|saumon|pesto|poulet|thon)|[àa] (?:crêpes?|gaufres?|pizzas?|tartes?|modeler|tartiner)|d’am[ea]ndes?|de fruits?) @@0,$
    <<- re.search("(?i)^pattes?", \1) -1>> =\1.replace("att", "ât")                                 # Confusion. La patte est le membre d’un animal (ou d’une table…). La matière pâteuse s’écrit “pâte”.
    <<- \2.startswith("d’amende") -2>> d’amande                                                     # Confusion. L’amende est une peine. Pour le fruit de l’amandier, écrivez “amande”.
    <<- \2.startswith("a ") -2>> =\2.replace("a ", "à ")                                            # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.

TEST: Prépare la {{patte}} à tarte.
TEST: Ils mangent souvent des {{pattes}} au thon.
TEST: Des {{pattes}} alimentaires.
TEST: Elles ont acheté de la {{patte}} à tartiner.
TEST: La pâte {{a pizza}} est plus épaisse que la pâte à crêpes.
TEST: Elle adore la pâte {{d’amende}}.


__[i]/conf(conf_coq_en_pâte)__
    (?:coqs?) en (pattes?) @@$ <<- -1>> pâte                                                        # Confusion. La patte est le membre d’un animal (ou d’une table…). La matière pâteuse s’écrit “pâte”.

TEST: Il est comme un coq en {{pattes}} là.


# peu / peut / peux
__[i]/conf(conf_peu_de_qqch)__
    (peu[xt]) d(?:e |’)({w_2}) @@0,$
7383
7384
7385
7386
7387
7388
7389
7390
7391
7392
7393
7394
7395
7396
7397

TEST: {{quelques soient}} les avantages d’un correcteur…
TEST: {{quoiqu’il en soit}}, nous ne nous laisserons pas faire, vous pouvez compter sur nous.


# quelque part
__[i]/conf(conf_quelque_part)__
    quel(?:(?:le|)s? que par[ts]?|ques? pars?) <<- ->> quelque part                       # Confusion probable.|https://fr.wiktionary.org/wiki/quelque_part

TEST: Il faut bien aller {{quelle que part}}.
TEST: Je les ai oubliés {{quelque pars}}.


# quelquefois / quelques fois
# Note : quelquefois ne peut être vérifié ici, puisque le mot est supprimé par le préprocesseur.







|







7832
7833
7834
7835
7836
7837
7838
7839
7840
7841
7842
7843
7844
7845
7846

TEST: {{quelques soient}} les avantages d’un correcteur…
TEST: {{quoiqu’il en soit}}, nous ne nous laisserons pas faire, vous pouvez compter sur nous.


# quelque part
__[i]/conf(conf_quelque_part)__
    quel(?:(?:le|)s? que par[ts]?|ques? par[se]?s?) <<- ->> quelque part                  # Confusion probable.|https://fr.wiktionary.org/wiki/quelque_part

TEST: Il faut bien aller {{quelle que part}}.
TEST: Je les ai oubliés {{quelque pars}}.


# quelquefois / quelques fois
# Note : quelquefois ne peut être vérifié ici, puisque le mot est supprimé par le préprocesseur.
7634
7635
7636
7637
7638
7639
7640
7641
7642
7643
7644
7645
7646
7647
7648
7649

7650
7651
7652
7653
7654
7655
7656
7657
7658
7659
7660
7661
7662
7663
7664
7665
7666

7667
7668
7669
7670
7671




7672
7673
7674

7675
7676
7677
7678
7679
7680
7681

TEST: Elle l’a observé par un miroir sans {{teint}}.
TEST: Elle a acheté un nouveau fond de {{tain}}.


# tort / tord
__[i]/conf(conf_à_tort)__
    à (tords?) @@2 <<- -1>> tort                                    # Confusion : “tord” est une conjugaison du verbe tordre.
__[i]/conf(conf_avoir_tort)__
    ({avoir}) +(tords?) @@0,$
    <<- morph(\1, ">avoir ", False) -2>> tort                       # Confusion : “tord” est une conjugaison du verbe tordre.

TEST: elles seront à {{tord}} accusées.
TEST: ils ont {{tords}}…
TEST: ils ont {{tord}}.
TEST: ils n’ont pas {{tord}}.



# venimeux / vénéneux
__[i]/conf(conf_qqch_venimeux)__
    (?:serpent|araignée|scorpion|vipère|cobra|crapaud|grenouille|dendrobate|poulpe|guêpe|abeille|méduse|morsure|piqûre|dard|dent|croc|crochet)s? +(vénéneu(?:x|ses?))  @@$
    <<- -1>> =\1.replace("énén", "enim")                                    # Confusion : “vénéneux” se dit des plantes, employez “venimeux”.
__[i]/conf(conf_qqch_vénéneux)__
    (?:(?:plante|champignon|lépiote|fruit|herbe|fleur|chair|moule|humus|substance)s?|végéta(?:l|ux)) +(venimeu(?:x|ses?))  @@$
    <<- -1>> =\1.replace("enim", "énén")                                    # Confusion : pas de venin ici.

TEST: ces araignées {{vénéneuses}}.
TEST: ce champignon {{venimeux}}.


# verre / vers / vert / ver
__[i]/conf(conf_ver)__
    (?:[lc]e|du|un) (ver(?:re|t)s?) +(?:qui +|)(?:est +|étai[ts] +|serai?[st]? +|f[uû][ts] +|)dans le fruit  @@3

    <<- -1>> ver            # Confusion. Verre = matière. Vert = couleur. Vers = suite de mots rythmés. Vers = préposition (« en direction de »). Pour l’animal, écrivez :
__[i]/conf(conf_ver_de_terre)__
    (ver(?:re|t)s?) de terre @@0
    <<- -1>> =\1.replace("re", "").replace("t", "")
    # Confusion. Verre = matière. Vert = couleur. Vers = suite de mots rythmés. Vers = préposition (« en direction de »). Pour l’animal, écrivez :





TEST: en finir avec le {{vert}} qui était dans le fruit.
TEST: un immonde {{vert}} de terre



# vieil / vieux
__[i]/conf(conf_vieil_euphonie)__
    (vieux) ([aeioué]\w+|homme)  @@0,$
    <<- morph(\2, ":[NAQ].*:[me]:s") -1>> vieil
    # Euphonie. Utilisez « vieil » pour un nom masculin singulier commençant par une voyelle ou un h.|https://fr.wikipedia.org/wiki/Euphonie







|

|
|





>

















>
|



|
>
>
>
>



>







8083
8084
8085
8086
8087
8088
8089
8090
8091
8092
8093
8094
8095
8096
8097
8098
8099
8100
8101
8102
8103
8104
8105
8106
8107
8108
8109
8110
8111
8112
8113
8114
8115
8116
8117
8118
8119
8120
8121
8122
8123
8124
8125
8126
8127
8128
8129
8130
8131
8132
8133
8134
8135
8136
8137

TEST: Elle l’a observé par un miroir sans {{teint}}.
TEST: Elle a acheté un nouveau fond de {{tain}}.


# tort / tord
__[i]/conf(conf_à_tort)__
    à (tor[de]?s?) @@2 <<- -1>> tort                                # Confusion : “tord” est une conjugaison du verbe tordre.
__[i]/conf(conf_avoir_tort)__
    ({avoir}|donn\w+) +(tor[ed]?s?) @@0,$
    <<- morph(\1, ">(?:avoir|donner) ", False) -2>> tort            # Confusion : “tord” est une conjugaison du verbe tordre.

TEST: elles seront à {{tord}} accusées.
TEST: ils ont {{tords}}…
TEST: ils ont {{tord}}.
TEST: ils n’ont pas {{tord}}.
TEST: je ne peux pas lui donner {{tord}}.


# venimeux / vénéneux
__[i]/conf(conf_qqch_venimeux)__
    (?:serpent|araignée|scorpion|vipère|cobra|crapaud|grenouille|dendrobate|poulpe|guêpe|abeille|méduse|morsure|piqûre|dard|dent|croc|crochet)s? +(vénéneu(?:x|ses?))  @@$
    <<- -1>> =\1.replace("énén", "enim")                                    # Confusion : “vénéneux” se dit des plantes, employez “venimeux”.
__[i]/conf(conf_qqch_vénéneux)__
    (?:(?:plante|champignon|lépiote|fruit|herbe|fleur|chair|moule|humus|substance)s?|végéta(?:l|ux)) +(venimeu(?:x|ses?))  @@$
    <<- -1>> =\1.replace("enim", "énén")                                    # Confusion : pas de venin ici.

TEST: ces araignées {{vénéneuses}}.
TEST: ce champignon {{venimeux}}.


# verre / vers / vert / ver
__[i]/conf(conf_ver)__
    (?:[lc]e|du|un) (ver(?:re|t)s?) +(?:qui +|)(?:est +|étai[ts] +|serai?[st]? +|f[uû][ts] +|)dans le fruit  @@3
    <<- -1>> ver
    # Confusion. Verre = matière. Vert = couleur. Vers = suite de mots rythmés. Vers = préposition (« en direction de »). L’animal s’écrit “ver”.
__[i]/conf(conf_ver_de_terre)__
    (ver(?:re|t)s?) de terre @@0
    <<- -1>> =\1.replace("re", "").replace("t", "")
    # Confusion. Verre = matière. Vert = couleur. Vers = suite de mots rythmés. Vers = préposition (« en direction de »). L’animal s’écrit “ver”.
__[i]/conf(conf_verre)__
    (vert?s?) d(?:e (?:bière|cidre|contact|champagne|chianti|dégustation|jus|lait|limonade|rosé|rhum|sécurité|thé|vin|whisky)s?|’(?:alcool|absinthe|eau|urine)) @@0
    <<- -1>> verre|verres
    # Confusion probable. Verre = matière. Vert = couleur. Vers = suite de mots rythmés. Vers = préposition (« en direction de »).

TEST: en finir avec le {{vert}} qui était dans le fruit.
TEST: un immonde {{vert}} de terre
TEST: Un {{ver}} de bière fraîche.


# vieil / vieux
__[i]/conf(conf_vieil_euphonie)__
    (vieux) ([aeioué]\w+|homme)  @@0,$
    <<- morph(\2, ":[NAQ].*:[me]:s") -1>> vieil
    # Euphonie. Utilisez « vieil » pour un nom masculin singulier commençant par une voyelle ou un h.|https://fr.wikipedia.org/wiki/Euphonie
8032
8033
8034
8035
8036
8037
8038
8039
8040
8041
8042
8043
8044
8045
8046
    -2>> =suggVerbPpas(\2, ":p")                                                    # Confusion probable : “\2” est à verbe à l’infinitif. Pour l’adjectif, écrivez :

TEST: les documents {{scanner}} ne sont pas lisibles.
TEST: tes doutes {{remâcher}} deviennent difficiles à vivre.



!!!! Particpes présents                                                                             

__[i]/conj(conj_participe_présent)__  (?:ne|lui|me|te|se|nous|vous) ({w_2}ants)  @@$
    <<- morph(\1, ":A", False) -1>> =\1[:-1]                                                        # Un participe présent est invariable.|http://fr.wiktionary.org/wiki/participe_pr%C3%A9sent

TEST: nous {{épuisants}} à la tâche pour des clopinettes, nous défaillîmes.









|







8488
8489
8490
8491
8492
8493
8494
8495
8496
8497
8498
8499
8500
8501
8502
    -2>> =suggVerbPpas(\2, ":p")                                                    # Confusion probable : “\2” est à verbe à l’infinitif. Pour l’adjectif, écrivez :

TEST: les documents {{scanner}} ne sont pas lisibles.
TEST: tes doutes {{remâcher}} deviennent difficiles à vivre.



!!!! Participes présents                                                                             

__[i]/conj(conj_participe_présent)__  (?:ne|lui|me|te|se|nous|vous) ({w_2}ants)  @@$
    <<- morph(\1, ":A", False) -1>> =\1[:-1]                                                        # Un participe présent est invariable.|http://fr.wiktionary.org/wiki/participe_pr%C3%A9sent

TEST: nous {{épuisants}} à la tâche pour des clopinettes, nous défaillîmes.


8398
8399
8400
8401
8402
8403
8404
8405
8406
8407
8408

8409
8410
8411
8412
8413
8414
8415
8416
8417
8418
8419

8420
8421
8422
8423
8424
8425
8426
8427
8428
8429
8430
8431
8432
8433
8434
8435
8436
8437
8438
8439
8440
8441
8442
8443
8444
8445
8446
8447
8448
8449
8450
8451
8452
8453
8454
8455
8456
8457
8458
8459
8460
8461
8462
8463
8464
8465
8466
8467
8468
8469
8470
8471
8472
8473
8474
8475
!!
!!!! Participes passés: se +être +verbe                                                             
!!
!!

__[i]/ppas(ppas_je_me_être_verbe)__
    je +(?:ne +|)m(?:e +|’(?:y +|))(?:s[uo]i[st]|étai[st]|fu(?:sses?|s|t)|serai[st]?) +({w_3}) @@$
    <<- morphex(\1, ":Q.*:p", ":(?:G|Q.*:[si])") and isRealEnd() and not before(r"\b[qQ]ue? +$")
    -1>> suggVerbPpas(\1, ":m:s")                                                                   # Si ce participe passé se rapporte bien à “je”, il devrait être au singulier.

TEST: je ne me suis jamais {{perdus}}

TEST: je me suis donné du temps.


__[i]/ppas(ppas_tu_te_être_verbe)__
    tu +(?:ne +|)t(?:e +|’(?:y +|))(?:est?|soi[st]|étai[st]|fu(?:sses?|s|t)|serai[st]?) +({w_3}) @@$
    <<- morphex(\1, ":Q.*:p", ":(?:G|Q.*:[si])") and isRealEnd() and not before(r"\b[qQ]ue? +$")
    -1>> suggVerbPpas(\1, ":m:s")                                                                   # Si ce participe passé se rapporte bien à “tu”, il devrait être au singulier.

TEST: tu t’es finalement {{retrouvés}} en mauvaise posture.
TEST: tu ne t’étais pas laissé le temps d’y réfléchir.



__[i]/ppas(ppas_il_se_être_verbe)__
    il +(?:ne +|)s(?:e +|’(?:y +|))(?:est?|soi[st]|étai[st]|fu(?:sses?|s|t)|serai?[st]?) +({w_3}) @@$
    <<- morphex(\1, ":Q.*:(?:f|m:p)", ":(?:G|Q.*:m:[si])") and isRealEnd() and not before(r"\b[qQ]ue? +$")
    -1>> suggVerbPpas(\1, ":m:s")                                                                   # Si ce participe passé se rapporte bien à “il”, il devrait être au masculin singulier.

TEST: le dédale dans lequel il se serait {{perdue}}
TEST: il s’était perdu dans la forêt.


__[i]/ppas(ppas_elle_se_être_verbe)__
    elle +(?:ne +|)s(?:e +|’(?:y +|))(?:est?|soi[st]|étai[st]|fu(?:sses?|s|t)|serai?[st]?) +({w_3}) @@$
    <<- morphex(\1, ":Q.*:(?:m|f:p)", ":(?:G|Q.*:f:[si])") and isRealEnd() and not morph(word(-1), ":R|>que ", False, False)
    -1>> suggVerbPpas(\1, ":f:s")                                                                   # Si ce participe passé se rapporte bien à “elle”, il devrait être au féminin singulier.

TEST: elle s’y était {{préparé}}.
TEST: elle s’était trouvé un mari.


__[i]/ppas(ppas_nous_nous_être_verbe)__
    nous +(?:ne +|)nous +(?:y +|)(?:sommes|étions|fûmes|fussions|seri?ons) +({w_3}) @@$
    <<- morphex(\1, ":Q.*:s", ":(?:G|Q.*:[pi])") and isRealEnd() and not morph(word(-1), ":R|>que ", False, False)
    -1>> suggVerbPpas(\1, ":p")                                                                     # Si ce participe passé se rapporte bien à “nous”, il devrait être au pluriel.

TEST: Nous nous étions {{cru}} au paradis.


__[i]/ppas(ppas_ils_se_être_verbe)__
    ils +(?:ne +|)s(?:e +|’(?:y +|))(?:so(?:ie|)nt|étaient|fu(?:r|ss)ent|ser(?:aie|o)nt) +({w_3}) @@$
    <<- morphex(\1, ":Q.*:(?:f|m:s)", ":(?:G|Q.*:m:[pi])") and isRealEnd() and not before(r"\b[qQ]ue? +$")
    -1>> suggVerbPpas(\1, ":m:p")                                                                   # Si ce participe passé se rapporte bien à “ils”, il devrait être au masculin pluriel.

TEST: ils s’y étaient {{abandonné}} avec ferveur


__[i]/ppas(ppas_elles_se_être_verbe)__
    elles +(?:ne +|)s(?:e +|’(?:y +|))(?:so(?:ie|)nt|étaient|fu(?:r|ss)ent|ser(?:aie|o)nt) +({w_3}) @@$
    <<- morphex(\1, ":Q.*:(?:m|f:s)", ":(?:G|Q.*:f:[pi])") and isRealEnd() and not morph(word(-1), ":R|>que ", False, False)
    -1>> suggVerbPpas(\1, ":f:p")                                                                   # Si ce participe passé se rapporte bien à “elles”, il devrait être au féminin pluriel.

TEST: elles ne s’y étaient pas {{donnée}}.
TEST: sans fin elles se sont succédé


__[i]/ppas(ppas_se_être)__
    [mts](?:e +|’(?:y +|en +|))({etre}) +({w_2})  @@w,$
    <<- morph(\1, ">être ", False) >>>
    <<- morphex(\2, ":(?:Y|[123][sp])", ":Q") and not re.search(r"(?i)^t’(?:es|étais)", \0)
    -2>> =suggVerbPpas(@)                                                                           # Incohérence. Après « s’être », le verbe doit être un participe passé, pas à l’infinitif.
    <<- __else__ and morph(\1, ":[123]s", False) and morph(\2, ":Q.*:p", False) and not before(r"(?i)\bque?[, ]|\bon (?:ne |)$")
    and not re.search(r"(?i)^t’(?:es|étais)", \0)
    -2>> =suggSing(@)                                                                               # Le participe passé devrait être au singulier.

TEST: s’être {{donner}} le mot.
TEST: je me suis {{donnés}} à fond
TEST: c’est de ce qui s’est {{passe}}.







|
|


>





|
|




>



|
|







|
|







|
|






|
|






|
|









|







8854
8855
8856
8857
8858
8859
8860
8861
8862
8863
8864
8865
8866
8867
8868
8869
8870
8871
8872
8873
8874
8875
8876
8877
8878
8879
8880
8881
8882
8883
8884
8885
8886
8887
8888
8889
8890
8891
8892
8893
8894
8895
8896
8897
8898
8899
8900
8901
8902
8903
8904
8905
8906
8907
8908
8909
8910
8911
8912
8913
8914
8915
8916
8917
8918
8919
8920
8921
8922
8923
8924
8925
8926
8927
8928
8929
8930
8931
8932
8933
!!
!!!! Participes passés: se +être +verbe                                                             
!!
!!

__[i]/ppas(ppas_je_me_être_verbe)__
    je +(?:ne +|)m(?:e +|’(?:y +|))(?:s[uo]i[st]|étai[st]|fu(?:sses?|s|t)|serai[st]?) +({w_3}) @@$
    <<- morphex(\1, ":Q.*:p", ":(?:G|Q.*:[si])") and ( morph(\1, ":V[123]_.__p_e_") or (isRealEnd() and not before(r"\b[qQ]ue? +$")) )
    -1>> =suggVerbPpas(\1, ":m:s")                                                                   # Si ce participe passé se rapporte bien à “je”, il devrait être au singulier.

TEST: je ne me suis jamais {{perdus}}
TEST: c’est de ce château que je me suis {{enfuis}}.
TEST: je me suis donné du temps.


__[i]/ppas(ppas_tu_te_être_verbe)__
    tu +(?:ne +|)t(?:e +|’(?:y +|))(?:est?|soi[st]|étai[st]|fu(?:sses?|s|t)|serai[st]?) +({w_3}) @@$
    <<- morphex(\1, ":Q.*:p", ":(?:G|Q.*:[si])") and ( morph(\1, ":V[123]_.__p_e_") or (isRealEnd() and not before(r"\b[qQ]ue? +$")) )
    -1>> =suggVerbPpas(\1, ":m:s")                                                                   # Si ce participe passé se rapporte bien à “tu”, il devrait être au singulier.

TEST: tu t’es finalement {{retrouvés}} en mauvaise posture.
TEST: tu ne t’étais pas laissé le temps d’y réfléchir.



__[i]/ppas(ppas_il_se_être_verbe)__
    il +(?:ne +|)s(?:e +|’(?:y +|))(?:est?|soi[st]|étai[st]|fu(?:sses?|s|t)|serai?[st]?) +({w_3}) @@$
    <<- morphex(\1, ":Q.*:(?:f|m:p)", ":(?:G|Q.*:m:[si])") and ( morph(\1, ":V[123]_.__p_e_") or (isRealEnd() and not before(r"\b[qQ]ue? +$")) )
    -1>> =suggVerbPpas(\1, ":m:s")                                                                   # Si ce participe passé se rapporte bien à “il”, il devrait être au masculin singulier.

TEST: le dédale dans lequel il se serait {{perdue}}
TEST: il s’était perdu dans la forêt.


__[i]/ppas(ppas_elle_se_être_verbe)__
    elle +(?:ne +|)s(?:e +|’(?:y +|))(?:est?|soi[st]|étai[st]|fu(?:sses?|s|t)|serai?[st]?) +({w_3}) @@$
    <<- morphex(\1, ":Q.*:(?:m|f:p)", ":(?:G|Q.*:f:[si])") and ( morph(\1, ":V[123]_.__p_e_") or (isRealEnd() and not morph(word(-1), ":R|>que ", False, False)) )
    -1>> =suggVerbPpas(\1, ":f:s")                                                                   # Si ce participe passé se rapporte bien à “elle”, il devrait être au féminin singulier.

TEST: elle s’y était {{préparé}}.
TEST: elle s’était trouvé un mari.


__[i]/ppas(ppas_nous_nous_être_verbe)__
    nous +(?:ne +|)nous +(?:y +|)(?:sommes|étions|fûmes|fussions|seri?ons) +({w_3}) @@$
    <<- morphex(\1, ":Q.*:s", ":(?:G|Q.*:[pi])") and ( morph(\1, ":V[123]_.__p_e_") or (isRealEnd() and not morph(word(-1), ":R|>que ", False, False)) )
    -1>> =suggVerbPpas(\1, ":p")                                                                     # Si ce participe passé se rapporte bien à “nous”, il devrait être au pluriel.

TEST: Nous nous étions {{cru}} au paradis.


__[i]/ppas(ppas_ils_se_être_verbe)__
    ils +(?:ne +|)s(?:e +|’(?:y +|))(?:so(?:ie|)nt|étaient|fu(?:r|ss)ent|ser(?:aie|o)nt) +({w_3}) @@$
    <<- morphex(\1, ":Q.*:(?:f|m:s)", ":(?:G|Q.*:m:[pi])") and ( morph(\1, ":V[123]_.__p_e_") or (isRealEnd() and not before(r"\b[qQ]ue? +$")) )
    -1>> =suggVerbPpas(\1, ":m:p")                                                                   # Si ce participe passé se rapporte bien à “ils”, il devrait être au masculin pluriel.

TEST: ils s’y étaient {{abandonné}} avec ferveur


__[i]/ppas(ppas_elles_se_être_verbe)__
    elles +(?:ne +|)s(?:e +|’(?:y +|))(?:so(?:ie|)nt|étaient|fu(?:r|ss)ent|ser(?:aie|o)nt) +({w_3}) @@$
    <<- morphex(\1, ":Q.*:(?:m|f:s)", ":(?:G|Q.*:f:[pi])") and ( morph(\1, ":V[123]_.__p_e_") or (isRealEnd() and not morph(word(-1), ":R|>que ", False, False)) )
    -1>> =suggVerbPpas(\1, ":f:p")                                                                   # Si ce participe passé se rapporte bien à “elles”, il devrait être au féminin pluriel.

TEST: elles ne s’y étaient pas {{donnée}}.
TEST: sans fin elles se sont succédé


__[i]/ppas(ppas_se_être)__
    [mts](?:e +|’(?:y +|en +|))({etre}) +({w_2})  @@w,$
    <<- morph(\1, ">être ", False) >>>
    <<- morphex(\2, ":(?:Y|[123][sp])", ":Q") and not re.search(r"(?i)^t’(?:es|étais)", \0)
    -2>> =suggVerbPpas(@)                                                                           # Incohérence. Après « s’être », le verbe doit être un participe passé.
    <<- __else__ and morph(\1, ":[123]s", False) and morph(\2, ":Q.*:p", False) and not before(r"(?i)\bque?[, ]|\bon (?:ne |)$")
    and not re.search(r"(?i)^t’(?:es|étais)", \0)
    -2>> =suggSing(@)                                                                               # Le participe passé devrait être au singulier.

TEST: s’être {{donner}} le mot.
TEST: je me suis {{donnés}} à fond
TEST: c’est de ce qui s’est {{passe}}.
8662
8663
8664
8665
8666
8667
8668
8669
8670
8671
8672
8673
8674
8675
8676
8677
8678
8679
8680

8681
8682
8683
8684
8685
8686
8687
8688
8689
8690
8691
8692
8693
8694
8695
8696
8697
8698
8699
8700
8701
8702
8703
8704
8705
8706
8707
8708
8709
8710
8711
8712

8713
8714
8715
8716
8717
8718
8719
8720
8721
8722
8723
8724
8725
8726
8727
8728
8729
8730
8731
8732
8733
8734
8735

8736
8737
8738
8739
8740
8741
8742
8743
8744
8745
8746
8747
8748
8749
8750
8751
8752
8753
8754
8755
8756
8757
8758
8759
8760
8761
8762
8763
8764
8765
8766
8767
8768
8769
8770
8771
8772
8773
8774
8775
8776
8777
8778
8779
8780
8781
8782
8783
8784
8785
8786
8787
TEST: celles qui redeviennent {{méchante}}


__[i]/ppas(ppas_avoir_été)__
    (({avoir}) +été) +({w_2})  @@0,0,$
    <<- morph(\2, ":V0a", False) >>>
    <<- morphex(\3, ":[123]s", ":[GNAQWY]") -3>> =suggVerbPpas(@)           # Après « avoir été », il faut un participe passé.
    <<- not (morph(\2, ":(?:Sq|K):3s", False) and before("[çcCÇ]’$|[cC]e n’$|[çÇ]a (?:n’|)$")) >>>
    <<- morph(\3, ":Y", False) -1>> _                                       # Tournure familière. Utilisez « être allé » plutôt que « avoir été ».
    <<- morph(\3, ":V1..t.*:Y", False) -3>> =suggVerbPpas(@)                    # Incohérence. Après « avoir été », il faut un participe passé (à moins que « avoir été » signifie ici « être allé »).
    
TEST: j’ai été {{instruis}} par elle
TEST: avoir été {{prit}} par surprise
TEST: Ils {{ont été}} {{réaliser}} à partir d’éléments naturels.
TEST: J’{{ai été}} camper dans les Alpes.
TEST: Tu {{as été}} prendre du bois.
TEST: J’{{ai été}} {{chercher}} du pain.
TEST: Ç’eût été prendre des vessies pour des lanternes.
TEST: C’eût été foncer tête baissée dans la gueule du loup.



!!
!!
!!!! Participes passés: pouvoir/sembler/paraître/vouloir/devoir/croire/déclarer/penser/dire/affirmer + être/avoir été
!!
!!

__[i](p_risque_d_être)__
    risqu\w+ +(d’)être @@* <<- ~1>> *

__[i]/ppas(ppas_je_verbe_être)__
    j(?:e|’(?:y|en)) +(?:ne +|n’|)((?:p[aeouûr]|s(?:embl|ouhait)|cr[ouû]|d[eouûéiî]|estim|imagin|v[eo]u|a(?:ffirm|im|dor)|risqu)\w+) +(?:être|avoir été) +({w_2}) @@w,$
    <<- morph(\1, ">(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ésirer|étester|ire)|vouloir|affirmer|aimer|adorer|souhaiter|estimer|imaginer|risquer) ", False)
    and morphex(\2, ":[NAQ].*:p", ":[GWYsi]")
    -2>> =suggSing(@)                                                        # Accord avec le sujet « je » : « \2 » devrait être au singulier.

TEST: Je ne peux pas être {{méchants}}.
TEST: j’aurais vraiment été {{tentés}}
TEST: je ne pense pas être {{démasqués}}
TEST: Je veux être {{méconnaissables}}
TEST: je voudrais bien être dans ses souliers


__[i]/ppas(ppas_tu_verbe_être)__
    tu +(?:ne +|n’|)((?:p[aeouûr]|s(?:embl|ouhait)|cr[ouû]|d[eouûéiî]|estim|imagin|v[eo]u|a(?:ffirm|im|dor)|risqu)\w+) +(?:être|avoir été) +({w_2})  @@w,$
    <<- morph(\1, ">(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ésirer|étester|ire)|vouloir|affirmer|aimer|adorer|souhaiter|estimer|imaginer|risquer) ", False)
    and morphex(\2, ":[NAQ].*:p", ":[GWYsi]")
    -2>> =suggSing(@)                                                        # Accord avec le sujet « tu » : « \2 » devrait être au singulier.

TEST: tu ne crois pas être {{meilleurs}}.
TEST: tu ne crois pas avoir été {{découvertes}}



__[i]/ppas(ppas_il_verbe_être)__
    (il|ce|ce qui|celui +qui|ça +qui|lui +qui|celui-(?:ci|là) +qui|quiconque) +(?:ne +|n’|)((?:p[aeouûr]|s(?:embl|ouhait)|cr[ouû]|d[eouûéiî]|estim|imagin|v[eo]u|a(?:ffirm|im|dor)|risqu)\w+) +(?:être|avoir été) +({w_2})  @@0,w,$
    <<- morph(\2, ">(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ésirer|étester|ire)|vouloir|affirmer|aimer|adorer|souhaiter|estimer|imaginer|risquer) ", False)
    and (morphex(\3, ":[NAQ].*:p", ":[GWYsi]") or morphex(\3, ":[AQ].*:f", ":[GWYme]"))
    -3>> =suggMasSing(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au masculin singulier.

TEST: Il peut être {{observée}}.
TEST: celui-là pensait être {{perdue}}
TEST: celui-là peut être {{perdue}}
TEST: il pense avoir été {{volés}}
TEST: lui qui ne pensait jamais être {{reconnus}}.


__[i]/ppas(ppas_ça_verbe_être)__
    (ça|ce(?:la|ci)|celui-(?:ci|là)|lequel) +(?:ne +|n’|)((?:p[aeouûr]|s(?:embl|ouhait)|cr[ouû]|d[eouûéiî]|estim|imagin|v[eo]u|a(?:ffirm|im|dor)|risqu)\w+) +(?:être|avoir été) +({w_2})  @@0,w,$
    <<- morph(\2, ">(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ésirer|étester|ire)|vouloir|affirmer|aimer|adorer|souhaiter|estimer|imaginer|risquer) ", False)
    and (morphex(\3, ":[NAQ].*:p", ":[MWYsi]") or morphex(\3, ":[AQ].*:f", ":[GWYme]"))
    and not morph(word(-1), ":R", False, False)
    -3>> =suggMasSing(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au masculin singulier.

TEST: ça ne semble pas avoir été {{conçus}} pour ça.



__[i]/ppas(ppas_elle_verbe_être)__
    (elle|celle-(?:ci|là)|laquelle) +(?:ne +|n’|)((?:p[aeouûr]|s(?:embl|ouhait)|cr[ouû]|d[eouûéiî]|estim|imagin|v[eo]u|a(?:ffirm|im|dor)|risqu)\w+) +(?:être|avoir été) +({w_2})  @@0,w,$
    <<- morph(\2, ">(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ésirer|étester|ire)|vouloir|affirmer|aimer|adorer|souhaiter|estimer|imaginer|risquer) ", False)
    and (morphex(\3, ":[NAQ].*:p", ":[GWYsi]") or morphex(\3, ":[AQ].*:m", ":[GWYfe]"))
    and not morph(word(-1), ":R", False, False)
    -3>> =suggFemSing(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au féminin singulier.

TEST: elle ne croit pas être {{trompé}}
TEST: ici, elle ne risque pas d’être {{attaquées}}


__[i]/ppas(ppas_elle_qui_verbe_être)__
    (c?elle +qui) +(?:ne +|n’|)((?:p[aeouûr]|s(?:embl|ouhait)|cr[ouû]|d[eouûéiî]|estim|imagin|v[eo]u|a(?:ffirm|im|dor)|risqu)\w+) +(?:être|avoir été) +({w_2}) @@0,w,$
    <<- morph(\2, ">(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ésirer|étester|ire)|vouloir|affirmer|aimer|adorer|souhaiter|estimer|imaginer|risquer) ", False)
    and (morphex(\3, ":[NAQ].*:p", ":[MWYsi]") or morphex(\3, ":[AQ].*:m", ":[GWYfe]"))
    -3>> =suggFemSing(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au féminin singulier.

TEST: celle qui pense être {{découvert}}


__[i]/ppas(ppas_nous_verbe_être)__
    (?<![nN][oO][uU][sS] )nous +(?:ne +|n’|)((?:p[aeouûr]|s(?:embl|ouhait)|cr[ouû]|d[eouûéiî]|estim|imagin|v[eo]u|a(?:ffirm|im|dor)|risqu)\w+) +(?:être|avoir été) +({w_2})  @@w,$
    <<- not re.search("(?i)^légion$", \2) and morph(\1, ">(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ésirer|étester|ire)|vouloir|affirmer|aimer|adorer|souhaiter|estimer|imaginer|risquer) ", False)
    and morph(\1, ":1p", False) and morphex(\2, ":[NAQ].*:s", ":[GWYpi]")
    -2>> =suggPlur(@)                                                        # Accord avec le sujet « nous » : « \2 » devrait être au pluriel.

TEST: nous pensons être {{désiré}}
TEST: nous ne devons pas être {{instruit}}


__[i]/ppas(ppas_ils_verbe_être)__
    (ils|c?eux +qui|ceux-(?:ci|là)|lesquels) +(?:ne +|n’|)((?:p[aeouûr]|s(?:embl|ouhait)|cr[ouû]|d[eouûéiî]|estim|imagin|v[eo]u|a(?:ffirm|im|dor)|risqu)\w+) +(?:être|avoir été) +({w_2})  @@0,w,$
    <<- not re.search("(?i)^légion$", \3) and morph(\2, ">(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ésirer|étester|ire)|vouloir|affirmer|aimer|adorer|souhaiter|estimer|imaginer|risquer) ", False)
    and (morphex(\3, ":[NAQ].*:s", ":[GWYpi]") or morphex(\3, ":[AQ].*:f", ":[GWYme]"))
    and (not re.search("^(?:ceux-(?:ci|là)|lesquels)$", \1) or not morph(word(-1), ":R", False, False))
    -3>> =suggMasPlur(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au masculin pluriel.

TEST: ils croient être {{perdu}}


__[i]/ppas(ppas_elles_verbe_être)__
    (elles|c?elles +qui|celles-(?:ci|là)|lesquelles) +(?:ne +|n’|)((?:p[aeouûr]|s(?:embl|ouhait)|cr[ouû]|d[eouûéiî]|estim|imagin|v[eo]u|a(?:ffirm|im|dor)|risqu)\w+) +(?:être|avoir été) +({w_2})  @@0,w,$
    <<- not re.search("(?i)^légion$", \3) and morph(\2, ">(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ésirer|étester|ire)|vouloir|affirmer|aimer|adorer|souhaiter|estimer|imaginer|risquer) ", False)
    and (morphex(\3, ":[NAQ].*:s", ":[GWYpi]") or morphex(\3, ":[AQ].*:m", ":[GWYfe]"))
    and (not re.search("^(?:elles|celles-(?:ci|là)|lesquelles)$", \1) or not morph(word(-1), ":R", False, False))
    -3>> =suggFemPlur(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au féminin pluriel.

TEST: elles veulent être {{différente}}
TEST: Elle peut être {{observées}}.
TEST: Elles ne peuvent pas être {{observée}}.







|

|









>












|
|











|
|





>



|
|











|
|





>



|
|









|
|







|
|








|
|








|
|







9120
9121
9122
9123
9124
9125
9126
9127
9128
9129
9130
9131
9132
9133
9134
9135
9136
9137
9138
9139
9140
9141
9142
9143
9144
9145
9146
9147
9148
9149
9150
9151
9152
9153
9154
9155
9156
9157
9158
9159
9160
9161
9162
9163
9164
9165
9166
9167
9168
9169
9170
9171
9172
9173
9174
9175
9176
9177
9178
9179
9180
9181
9182
9183
9184
9185
9186
9187
9188
9189
9190
9191
9192
9193
9194
9195
9196
9197
9198
9199
9200
9201
9202
9203
9204
9205
9206
9207
9208
9209
9210
9211
9212
9213
9214
9215
9216
9217
9218
9219
9220
9221
9222
9223
9224
9225
9226
9227
9228
9229
9230
9231
9232
9233
9234
9235
9236
9237
9238
9239
9240
9241
9242
9243
9244
9245
9246
9247
9248
TEST: celles qui redeviennent {{méchante}}


__[i]/ppas(ppas_avoir_été)__
    (({avoir}) +été) +({w_2})  @@0,0,$
    <<- morph(\2, ":V0a", False) >>>
    <<- morphex(\3, ":[123]s", ":[GNAQWY]") -3>> =suggVerbPpas(@)           # Après « avoir été », il faut un participe passé.
    <<- not before("[çcCÇ]’$|[cC]e n’$|[çÇ]a (?:n’|)$") >>>
    <<- morph(\3, ":Y", False) -1>> _                                       # Tournure familière. Utilisez « être allé » plutôt que « avoir été ».
    <<- morph(\3, ":V1..t.*:Y", False) -3>> =suggVerbPpas(@)                # Incohérence. Après « avoir été », il faut un participe passé (à moins que « avoir été » signifie ici « être allé »).
    
TEST: j’ai été {{instruis}} par elle
TEST: avoir été {{prit}} par surprise
TEST: Ils {{ont été}} {{réaliser}} à partir d’éléments naturels.
TEST: J’{{ai été}} camper dans les Alpes.
TEST: Tu {{as été}} prendre du bois.
TEST: J’{{ai été}} {{chercher}} du pain.
TEST: Ç’eût été prendre des vessies pour des lanternes.
TEST: C’eût été foncer tête baissée dans la gueule du loup.
TEST: Leur passe-temps, ça a été faire n’importe quoi.


!!
!!
!!!! Participes passés: pouvoir/sembler/paraître/vouloir/devoir/croire/déclarer/penser/dire/affirmer + être/avoir été
!!
!!

__[i](p_risque_d_être)__
    risqu\w+ +(d’)être @@* <<- ~1>> *

__[i]/ppas(ppas_je_verbe_être)__
    j(?:e|’(?:y|en)) +(?:ne +|n’|)((?:p[aeouûr]|s(?:embl|ouhait)|cr[ouû]|d[eouûéiî]|estim|i(?:magin|r)|v(?:[eo]u|a)|a(?:ffirm|im|dor|ll)|risqu)\w*) +(?:être|avoir été) +({w_2}) @@w,$
    <<- morph(\1, ">(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ésirer|étester|ire)|vouloir|affirmer|aimer|adorer|souhaiter|estimer|imaginer|risquer|aller) ", False)
    and morphex(\2, ":[NAQ].*:p", ":[GWYsi]")
    -2>> =suggSing(@)                                                        # Accord avec le sujet « je » : « \2 » devrait être au singulier.

TEST: Je ne peux pas être {{méchants}}.
TEST: j’aurais vraiment été {{tentés}}
TEST: je ne pense pas être {{démasqués}}
TEST: Je veux être {{méconnaissables}}
TEST: je voudrais bien être dans ses souliers


__[i]/ppas(ppas_tu_verbe_être)__
    tu +(?:ne +|n’|)((?:p[aeouûr]|s(?:embl|ouhait)|cr[ouû]|d[eouûéiî]|estim|i(?:magin|r)|v(?:[eo]u|a)|a(?:ffirm|im|dor|ll)|risqu)\w*) +(?:être|avoir été) +({w_2})  @@w,$
    <<- morph(\1, ">(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ésirer|étester|ire)|vouloir|affirmer|aimer|adorer|souhaiter|estimer|imaginer|risquer|aller) ", False)
    and morphex(\2, ":[NAQ].*:p", ":[GWYsi]")
    -2>> =suggSing(@)                                                        # Accord avec le sujet « tu » : « \2 » devrait être au singulier.

TEST: tu ne crois pas être {{meilleurs}}.
TEST: tu ne crois pas avoir été {{découvertes}}
TEST: tu vas être {{payées}}


__[i]/ppas(ppas_il_verbe_être)__
    (il|ce|ce qui|celui +qui|ça +qui|lui +qui|celui-(?:ci|là) +qui|quiconque) +(?:ne +|n’|)((?:p[aeouûr]|s(?:embl|ouhait)|cr[ouû]|d[eouûéiî]|estim|i(?:magin|r)|v(?:[eo]u|a)|a(?:ffirm|im|dor|ll)|risqu)\w*) +(?:être|avoir été) +({w_2})  @@0,w,$
    <<- morph(\2, ">(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ésirer|étester|ire)|vouloir|affirmer|aimer|adorer|souhaiter|estimer|imaginer|risquer|aller) ", False)
    and (morphex(\3, ":[NAQ].*:p", ":[GWYsi]") or morphex(\3, ":[AQ].*:f", ":[GWYme]"))
    -3>> =suggMasSing(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au masculin singulier.

TEST: Il peut être {{observée}}.
TEST: celui-là pensait être {{perdue}}
TEST: celui-là peut être {{perdue}}
TEST: il pense avoir été {{volés}}
TEST: lui qui ne pensait jamais être {{reconnus}}.


__[i]/ppas(ppas_ça_verbe_être)__
    (ça|ce(?:la|ci)|celui-(?:ci|là)|lequel) +(?:ne +|n’|)((?:p[aeouûr]|s(?:embl|ouhait)|cr[ouû]|d[eouûéiî]|estim|i(?:magin|r)|v(?:[eo]u|a)|a(?:ffirm|im|dor|ll)|risqu)\w*) +(?:être|avoir été) +({w_2})  @@0,w,$
    <<- morph(\2, ">(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ésirer|étester|ire)|vouloir|affirmer|aimer|adorer|souhaiter|estimer|imaginer|risquer|aller) ", False)
    and (morphex(\3, ":[NAQ].*:p", ":[MWYsi]") or morphex(\3, ":[AQ].*:f", ":[GWYme]"))
    and not morph(word(-1), ":R", False, False)
    -3>> =suggMasSing(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au masculin singulier.

TEST: ça ne semble pas avoir été {{conçus}} pour ça.
TEST: lequel allait être {{renvoyée}} de l’établissement.


__[i]/ppas(ppas_elle_verbe_être)__
    (elle|celle-(?:ci|là)|laquelle) +(?:ne +|n’|)((?:p[aeouûr]|s(?:embl|ouhait)|cr[ouû]|d[eouûéiî]|estim|i(?:magin|r)|v(?:[eo]u|a)|a(?:ffirm|im|dor|ll)|risqu)\w*) +(?:être|avoir été) +({w_2})  @@0,w,$
    <<- morph(\2, ">(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ésirer|étester|ire)|vouloir|affirmer|aimer|adorer|souhaiter|estimer|imaginer|risquer|aller) ", False)
    and (morphex(\3, ":[NAQ].*:p", ":[GWYsi]") or morphex(\3, ":[AQ].*:m", ":[GWYfe]"))
    and not morph(word(-1), ":R", False, False)
    -3>> =suggFemSing(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au féminin singulier.

TEST: elle ne croit pas être {{trompé}}
TEST: ici, elle ne risque pas d’être {{attaquées}}


__[i]/ppas(ppas_elle_qui_verbe_être)__
    (c?elle +qui) +(?:ne +|n’|)((?:p[aeouûr]|s(?:embl|ouhait)|cr[ouû]|d[eouûéiî]|estim|i(?:magin|r)|v(?:[eo]u|a)|a(?:ffirm|im|dor|ll)|risqu)\w*) +(?:être|avoir été) +({w_2}) @@0,w,$
    <<- morph(\2, ">(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ésirer|étester|ire)|vouloir|affirmer|aimer|adorer|souhaiter|estimer|imaginer|risquer|aller) ", False)
    and (morphex(\3, ":[NAQ].*:p", ":[MWYsi]") or morphex(\3, ":[AQ].*:m", ":[GWYfe]"))
    -3>> =suggFemSing(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au féminin singulier.

TEST: celle qui pense être {{découvert}}


__[i]/ppas(ppas_nous_verbe_être)__
    (?<![nN][oO][uU][sS] )nous +(?:ne +|n’|)((?:p[aeouûr]|s(?:embl|ouhait)|cr[ouû]|d[eouûéiî]|estim|i(?:magin|r)|v(?:[eo]u|a)|a(?:ffirm|im|dor|ll)|risqu)\w*) +(?:être|avoir été) +({w_2})  @@w,$
    <<- not re.search("(?i)^légion$", \2) and morph(\1, ">(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ésirer|étester|ire)|vouloir|affirmer|aimer|adorer|souhaiter|estimer|imaginer|risquer|aller) ", False)
    and morph(\1, ":1p", False) and morphex(\2, ":[NAQ].*:s", ":[GWYpi]")
    -2>> =suggPlur(@)                                                        # Accord avec le sujet « nous » : « \2 » devrait être au pluriel.

TEST: nous pensons être {{désiré}}
TEST: nous ne devons pas être {{instruit}}


__[i]/ppas(ppas_ils_verbe_être)__
    (ils|c?eux +qui|ceux-(?:ci|là)|lesquels) +(?:ne +|n’|)((?:p[aeouûr]|s(?:embl|ouhait)|cr[ouû]|d[eouûéiî]|estim|i(?:magin|r)|v(?:[eo]u|a)|a(?:ffirm|im|dor|ll)|risqu)\w*) +(?:être|avoir été) +({w_2})  @@0,w,$
    <<- not re.search("(?i)^légion$", \3) and morph(\2, ">(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ésirer|étester|ire)|vouloir|affirmer|aimer|adorer|souhaiter|estimer|imaginer|risquer|aller) ", False)
    and (morphex(\3, ":[NAQ].*:s", ":[GWYpi]") or morphex(\3, ":[AQ].*:f", ":[GWYme]"))
    and (not re.search("^(?:ceux-(?:ci|là)|lesquels)$", \1) or not morph(word(-1), ":R", False, False))
    -3>> =suggMasPlur(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au masculin pluriel.

TEST: ils croient être {{perdu}}


__[i]/ppas(ppas_elles_verbe_être)__
    (elles|c?elles +qui|celles-(?:ci|là)|lesquelles) +(?:ne +|n’|)((?:p[aeouûr]|s(?:embl|ouhait)|cr[ouû]|d[eouûéiî]|estim|i(?:magin|r)|v(?:[eo]u|a)|a(?:ffirm|im|dor|ll)|risqu)\w*) +(?:être|avoir été) +({w_2})  @@0,w,$
    <<- not re.search("(?i)^légion$", \3) and morph(\2, ">(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ésirer|étester|ire)|vouloir|affirmer|aimer|adorer|souhaiter|estimer|imaginer|risquer|aller) ", False)
    and (morphex(\3, ":[NAQ].*:s", ":[GWYpi]") or morphex(\3, ":[AQ].*:m", ":[GWYfe]"))
    and (not re.search("^(?:elles|celles-(?:ci|là)|lesquelles)$", \1) or not morph(word(-1), ":R", False, False))
    -3>> =suggFemPlur(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au féminin pluriel.

TEST: elles veulent être {{différente}}
TEST: Elle peut être {{observées}}.
TEST: Elles ne peuvent pas être {{observée}}.
9133
9134
9135
9136
9137
9138
9139
9140
9141
9142
9143
9144
9145
9146

9147
9148
9149
9150
9151
9152
9153
9154
9155
9156
9157
9158
9159
9160
9161
9162
9163
9164
9165
9166
9167
9168
9169
TEST: J’ai {{lut}} son journal.                                                   ->> lu
TEST: Ils avaient barre sur lui.


__[i]/ppas(ppas_det_nom_avoir)__
    (l(?:’|es? |a |eurs )|ce(?:s|tte|t|rtaine?s|) |des |quelques |[mts](?:es|on|a) |[nv]o(?:s|tre) ) *({w_2}) +(?:ne +|n’|l(?:ui|eur) +|)({avoir}) +({w_2})  @@0,w,w,$
    <<- not re.search("(?i)^(?:barre|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours)$", \4) and morph(word(-1), ">puisque? ", False, True)
    and morph(\3, ":V0a", False) and not \4.isupper() and morphex(\4, ":(?:[123][sp]|Q.*:[fp])", ":(?:G|W|Q.*:m:[si])")
    and not (\3 == "avions" and morph(\4, ":3[sp]", False))
    -4>> =suggMasSing(@)
    # Ce verbe devrait être un participe passé au masculin singulier.|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

TEST: Les femmes lui avait {{conseillées}} de se taire.
TEST: le mur avait {{était}} détruit



__[i]/ppas(ppas_les_avoir)__
    les +({avoir}) +({w_1}(?:[éiut]e?|is|se))  @@w,$
    <<- morph(\1, ":V0a", False) and morphex(\2, ":V[0-3]..t.*:Q.*:s", ":[GWpi]")
    -2>> =suggPlur(@)
    # Accord avec le COD “les” : Le participe passé « \2 » devrait être au pluriel (et accordé en genre).|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

TEST: je les avais {{trompé}} avec mon baratin.


__[i]/ppas(ppas_nous_avoir)__
    ({w_2}) +nous +({avoir}) +({w_1}(?:[éiut]e?|is|se)) @@0,w,$
    <<- isRealEnd() and morph(\2, ":V0a", False) and morphex(\1, ":(?:M|Os|N)", ":R") and morphex(\3, ":V[0-3]..t_.*:Q.*:s", ":[GWpi]") and not before(r"\bque +$")
    -3>> =suggPlur(@)
    # Accord avec le COD “nous” : Le participe passé « \3 » devrait être au pluriel (et accordé en genre).|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

TEST: Ces maisons nous avaient {{subjugué}}.
TEST: C’est mot pour mot un script qu’on nous a filé.


__[i]/ppas(ppas_l_avoir)__
    l’({avoir}) +({w_1}s)  @@2,$







|






>












|
|
|
|







9594
9595
9596
9597
9598
9599
9600
9601
9602
9603
9604
9605
9606
9607
9608
9609
9610
9611
9612
9613
9614
9615
9616
9617
9618
9619
9620
9621
9622
9623
9624
9625
9626
9627
9628
9629
9630
9631
TEST: J’ai {{lut}} son journal.                                                   ->> lu
TEST: Ils avaient barre sur lui.


__[i]/ppas(ppas_det_nom_avoir)__
    (l(?:’|es? |a |eurs )|ce(?:s|tte|t|rtaine?s|) |des |quelques |[mts](?:es|on|a) |[nv]o(?:s|tre) ) *({w_2}) +(?:ne +|n’|l(?:ui|eur) +|)({avoir}) +({w_2})  @@0,w,w,$
    <<- not re.search("(?i)^(?:barre|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours)$", \4) and morph(word(-1), ">puisque? ", False, True)
    and not morph(\2, ":G", False) and morph(\3, ":V0a", False) and not \4.isupper() and morphex(\4, ":(?:[123][sp]|Q.*:[fp])", ":(?:G|W|Q.*:m:[si])")
    and not (\3 == "avions" and morph(\4, ":3[sp]", False))
    -4>> =suggMasSing(@)
    # Ce verbe devrait être un participe passé au masculin singulier.|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

TEST: Les femmes lui avait {{conseillées}} de se taire.
TEST: le mur avait {{était}} détruit
TEST: Certains les ont d’abord jugés trop lents.


__[i]/ppas(ppas_les_avoir)__
    les +({avoir}) +({w_1}(?:[éiut]e?|is|se))  @@w,$
    <<- morph(\1, ":V0a", False) and morphex(\2, ":V[0-3]..t.*:Q.*:s", ":[GWpi]")
    -2>> =suggPlur(@)
    # Accord avec le COD “les” : Le participe passé « \2 » devrait être au pluriel (et accordé en genre).|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

TEST: je les avais {{trompé}} avec mon baratin.


__[i]/ppas(ppas_nous_avoir)__
    nous +({avoir}) +({w_1}(?:[éiut]e?|se)) @@w,$
    <<- isRealEnd() and morph(\1, ":V0a", False) and morphex(\2, ":V[0-3]..t_.*:Q.*:s", ":[GWpi]") and morphex(word(-1), ":(?:M|Os|N)", ":R") and not before(r"\bque? +\w[\w-]+ +$")
    -2>> =suggPlur(@)
    # Accord avec le COD “nous” : Le participe passé « \2 » devrait être au pluriel (et accordé en genre).|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

TEST: Ces maisons nous avaient {{subjugué}}.
TEST: C’est mot pour mot un script qu’on nous a filé.


__[i]/ppas(ppas_l_avoir)__
    l’({avoir}) +({w_1}s)  @@2,$
9243
9244
9245
9246
9247
9248
9249
9250
9251
9252
9253
9254
9255
9256
9257
TEST: c’est vous qui m’avez {{convertit}}.
TEST: parce que t’as envie que je le fasse



!!
!!
!!!! COD précédent que                                                                                  
!!
!!

__[i]/ppas(ppas_det_plur_COD_que_avoir)__
    ([ldmtsc]es) +({w_2}) +que? +(?:j’|tu |ils? |[nv]ous |elles? |on ) *(?:ne +|n’|)({avoir}) +({w_2}[éiust]e?)(?! [mts]’)  @@0,w,w,$
    <<- morph(\3, ":V0a", False)
    and not ((re.search("^(?:décidé|essayé|tenté)$", \4) and after(" +d(?:e |’)")) or (re.search("^réussi$", \4) and after(" +à")))







|







9705
9706
9707
9708
9709
9710
9711
9712
9713
9714
9715
9716
9717
9718
9719
TEST: c’est vous qui m’avez {{convertit}}.
TEST: parce que t’as envie que je le fasse



!!
!!
!!!! COD précédant que                                                                                  
!!
!!

__[i]/ppas(ppas_det_plur_COD_que_avoir)__
    ([ldmtsc]es) +({w_2}) +que? +(?:j’|tu |ils? |[nv]ous |elles? |on ) *(?:ne +|n’|)({avoir}) +({w_2}[éiust]e?)(?! [mts]’)  @@0,w,w,$
    <<- morph(\3, ":V0a", False)
    and not ((re.search("^(?:décidé|essayé|tenté)$", \4) and after(" +d(?:e |’)")) or (re.search("^réussi$", \4) and after(" +à")))
9586
9587
9588
9589
9590
9591
9592
9593
9594
9595
9596

9597
9598
9599
9600
9601
9602
9603
9604
9605
9606
9607
9608
9609
9610
9611
9612
9613
9614
9615
9616
9617
9618
9619
9620
9621
9622

9623
9624
9625
9626
9627
9628
9629
    <<- -1>> aie                                                                    # S’il s’agit d’un impératif, écrivez « aie ».

TEST: {{Ait}} la foi !


# Contrôle
__[i]/imp(imp_verbe_lui_le_la_les_leur)__
    ({w2})-l(?:ui|es?|a|eur)  @@0
    <<- not morph(\1, ":E|>chez", False) and spell(\1)
    -1>> =suggVerbImpe(\1)
    # Erreur : ceci n’est pas une forme impérative.|http://fr.wikipedia.org/wiki/Imp%C3%A9ratif_%28grammaire%29


__[i]/imp(imp_verbe_moi_toi_m_t_en)__
    ({w2})-[tm](?:oi|’en)  @@0
    <<- not morph(\1, ":E|>chez", False) and spell(\1)
    -1>> =suggVerbTense(\1, ":E", ":2s")
    # Erreur : ceci n’est pas une forme impérative.|http://fr.wikipedia.org/wiki/Imp%C3%A9ratif_%28grammaire%29

TEST: {{prend}}-m’en trois, s’il te plaît.
TEST: {{Sert}}-toi d’eux autant que tu le peux, puis casse-toi.
TEST: — {{Abandonnes}}.
TEST: Ne {{donnes}} pas autant.
TEST: N’{{insistes}} pas.
TEST: Ne {{finit}} pas ce devoir.
TEST: {{Finit}} cette tarte.
TEST: Ne {{soit}} pas en retard !
TEST: Ne me {{prend}} pas pour un idiot
TEST: Ne l’{{attend}} pas
TEST: N’y {{vas}} pas
TEST: Ne m’y {{attend}} pas
TEST: Ne {{vient}} que lorsque je te le dirai.
TEST: Ne l’y {{contraint}} pas
TEST: {{Vient}}.
TEST: {{Sert}} le plat.
TEST: {{Attend}} la correction.
TEST: {{Vas}} au diable !
TEST: {{Écartes}} de moi cette coupe.



!!
!!
!!!! Impératif: traits d’union manquants                                                            
!!
!!







|

<
|
>




<
|




















>







10048
10049
10050
10051
10052
10053
10054
10055
10056

10057
10058
10059
10060
10061
10062

10063
10064
10065
10066
10067
10068
10069
10070
10071
10072
10073
10074
10075
10076
10077
10078
10079
10080
10081
10082
10083
10084
10085
10086
10087
10088
10089
10090
10091
    <<- -1>> aie                                                                    # S’il s’agit d’un impératif, écrivez « aie ».

TEST: {{Ait}} la foi !


# Contrôle
__[i]/imp(imp_verbe_lui_le_la_les_leur)__
    ({w2})-(l(?:ui|es?|a|eurs?))  @@0,$
    <<- not morph(\1, ":E|>chez", False) and spell(\1)

    -1>> =suggVerbImpe(\1)                                  # Ceci n’est pas une forme impérative.|http://fr.wikipedia.org/wiki/Imp%C3%A9ratif_%28grammaire%29
    <<- \2 == "leurs" -2>> leur                             # Le pronom personnel objet ne prend pas de “s”, “leurs” est un déterminants (exemple : leurs affaires).

__[i]/imp(imp_verbe_moi_toi_m_t_en)__
    ({w2})-[tm](?:oi|’en)  @@0
    <<- not morph(\1, ":E|>chez", False) and spell(\1)

    -1>> =suggVerbTense(\1, ":E", ":2s")                    # Ceci n’est pas une forme impérative.|http://fr.wikipedia.org/wiki/Imp%C3%A9ratif_%28grammaire%29

TEST: {{prend}}-m’en trois, s’il te plaît.
TEST: {{Sert}}-toi d’eux autant que tu le peux, puis casse-toi.
TEST: — {{Abandonnes}}.
TEST: Ne {{donnes}} pas autant.
TEST: N’{{insistes}} pas.
TEST: Ne {{finit}} pas ce devoir.
TEST: {{Finit}} cette tarte.
TEST: Ne {{soit}} pas en retard !
TEST: Ne me {{prend}} pas pour un idiot
TEST: Ne l’{{attend}} pas
TEST: N’y {{vas}} pas
TEST: Ne m’y {{attend}} pas
TEST: Ne {{vient}} que lorsque je te le dirai.
TEST: Ne l’y {{contraint}} pas
TEST: {{Vient}}.
TEST: {{Sert}} le plat.
TEST: {{Attend}} la correction.
TEST: {{Vas}} au diable !
TEST: {{Écartes}} de moi cette coupe.
TEST: explique-{{leurs}} de quoi il est question.


!!
!!
!!!! Impératif: traits d’union manquants                                                            
!!
!!
9667
9668
9669
9670
9671
9672
9673











9674
9675
9676
9677
9678
9679
9680
TEST: un sujet si extrêmement politique et polémique lui a donné un accès
TEST: Les États d’ores et déjà très affaiblis le seraient encore plus
TEST: « C’est ainsi », résume la cyptologue (erreur orthographique délibérée sur “cyptologue” pour empêcher certains faux positifs)
TEST: Notez le peu de cas qui en est fait en général dans les médias
TEST: deux fois par an, souligne le Dr Assouline














__<i]/imp(imp_apostrophe_m_t_en)__
    ([ -][mt])-en @@0
    <<- not (\0.endswith("t-en") and before(r"(?i)\bva$") and morph(word(1), ">guerre ", False, False)) ->> \1’en
    # « \1e » est ici abrégé, c’est une forme élidée. Il faut mettre une apostrophe et non un trait d’union.

TEST: donne{{-m-en}} encore







>
>
>
>
>
>
>
>
>
>
>







10129
10130
10131
10132
10133
10134
10135
10136
10137
10138
10139
10140
10141
10142
10143
10144
10145
10146
10147
10148
10149
10150
10151
10152
10153
TEST: un sujet si extrêmement politique et polémique lui a donné un accès
TEST: Les États d’ores et déjà très affaiblis le seraient encore plus
TEST: « C’est ainsi », résume la cyptologue (erreur orthographique délibérée sur “cyptologue” pour empêcher certains faux positifs)
TEST: Notez le peu de cas qui en est fait en général dans les médias
TEST: deux fois par an, souligne le Dr Assouline


__[i]/imp(imp_laisser_le_la_les_infi)__
    ((laiss\w+) l(?:es|a)) +({w_2})  @@0,0,$
    <<- morph(\2, ">laisser ", False) and morphex(\3, ":(?:Y|X|Oo)", ":[NAB]")
    -1>> =\1.replace(" ", "-")
    # S’il s’agit d’un impératif, mettez un trait d’union.|http://66.46.185.79/bdl/gabarit_bdl.asp?id=4206

TEST: {{Laisse les}} entrer…
TEST: {{Laissez la}} venir…
TEST: Laisse les chiens tranquilles
TEST: Laissez la peste leur pourrir la vie encore quelque temps.


__<i]/imp(imp_apostrophe_m_t_en)__
    ([ -][mt])-en @@0
    <<- not (\0.endswith("t-en") and before(r"(?i)\bva$") and morph(word(1), ">guerre ", False, False)) ->> \1’en
    # « \1e » est ici abrégé, c’est une forme élidée. Il faut mettre une apostrophe et non un trait d’union.

TEST: donne{{-m-en}} encore
10378
10379
10380
10381
10382
10383
10384

10385
10386
10387
10388
10389
10390
10391
TEST: un cri {{violes}}
TEST: L’hypothétique nouveau président
TEST: une majorité de garçons voient mal comment faire
TEST: un tas de choses pouvaient aller de travers.
TEST: un paquet de gens futés n’y ont vu que du feu.
TEST: La moitié d’entre elles voient leurs loyers diminuer depuis le début de l’année
TEST: Une partie de ces propositions étaient naïves



## 1pl
__[i]/conj(conj_nous_pronom)__
    ^ *nous +({w1})  @@$
    <<- morphex(\1, ":V", ":(?:1p|3[sp])") and not after("^ +(?:je|tu|ils?|elles?|on|[vn]ous)")
    -1>> =suggVerb(@, ":1p")                                 # Conjugaison erronée. Accord avec « nous ». Le verbe devrait être à la 1ʳᵉ personne du pluriel.







>







10851
10852
10853
10854
10855
10856
10857
10858
10859
10860
10861
10862
10863
10864
10865
TEST: un cri {{violes}}
TEST: L’hypothétique nouveau président
TEST: une majorité de garçons voient mal comment faire
TEST: un tas de choses pouvaient aller de travers.
TEST: un paquet de gens futés n’y ont vu que du feu.
TEST: La moitié d’entre elles voient leurs loyers diminuer depuis le début de l’année
TEST: Une partie de ces propositions étaient naïves
TEST: tu n’acceptais jamais de danser avec quelqu’un si tu avais refusé à quelqu’un d’autre au début


## 1pl
__[i]/conj(conj_nous_pronom)__
    ^ *nous +({w1})  @@$
    <<- morphex(\1, ":V", ":(?:1p|3[sp])") and not after("^ +(?:je|tu|ils?|elles?|on|[vn]ous)")
    -1>> =suggVerb(@, ":1p")                                 # Conjugaison erronée. Accord avec « nous ». Le verbe devrait être à la 1ʳᵉ personne du pluriel.
10595
10596
10597
10598
10599
10600
10601


10602
10603
10604
10605
10606
10607
10608
TEST: les marchandes {{paie}}
TEST: les marchandes {{marchande}}
TEST: les chattes {{finis}}
TEST: les chattes {{manges}}
TEST: les chattes {{danse}}
TEST: certains hommes {{marchandes}} sans cesse
TEST: certaines femmes {{danse}} beaucoup




__[i]/conj(conj_des_nom1)__
    ^ *des +({w_2}) +({w_2})  @@w,$
    <<- morph(\1, ":[NAQ].*:[pi]", False) and morphex(\2, ":V", ":(?:[13]p|P|G|Q|A.*:[pi])") and morph(word(1), ":(?:R|D.*:p)|>au ", False, True) >>>
    <<- not morph(\2, ":[NA]", False) -2>> =suggVerb(@, ":3p")                          # Conjugaison erronée. Accord avec « des \1… ». Le verbe devrait être à la 3ᵉ personne du pluriel.
    <<- __else__ and not checkAgreement(\1, \2) -2>> =suggVerb(@, ":3p", suggPlur)      # Conjugaison erronée. Accord avec « des \1… ». Le verbe devrait être à la 3ᵉ personne du pluriel.







>
>







11069
11070
11071
11072
11073
11074
11075
11076
11077
11078
11079
11080
11081
11082
11083
11084
TEST: les marchandes {{paie}}
TEST: les marchandes {{marchande}}
TEST: les chattes {{finis}}
TEST: les chattes {{manges}}
TEST: les chattes {{danse}}
TEST: certains hommes {{marchandes}} sans cesse
TEST: certaines femmes {{danse}} beaucoup
TEST: Sauf que l’un comme l’autre avaient dû y renoncer.
TEST: L’un comme l’autre devaient y renoncer.


__[i]/conj(conj_des_nom1)__
    ^ *des +({w_2}) +({w_2})  @@w,$
    <<- morph(\1, ":[NAQ].*:[pi]", False) and morphex(\2, ":V", ":(?:[13]p|P|G|Q|A.*:[pi])") and morph(word(1), ":(?:R|D.*:p)|>au ", False, True) >>>
    <<- not morph(\2, ":[NA]", False) -2>> =suggVerb(@, ":3p")                          # Conjugaison erronée. Accord avec « des \1… ». Le verbe devrait être à la 3ᵉ personne du pluriel.
    <<- __else__ and not checkAgreement(\1, \2) -2>> =suggVerb(@, ":3p", suggPlur)      # Conjugaison erronée. Accord avec « des \1… ». Le verbe devrait être à la 3ᵉ personne du pluriel.
10616
10617
10618
10619
10620
10621
10622
10623
10624
10625
10626
10627
10628
10629
10630
    -2>> =suggVerb(@, ":3p")                                # Conjugaison erronée. Accord avec « des \1… ». Le verbe devrait être à la 3ᵉ personne du pluriel.

TEST: Des hommes {{arrive}}.
TEST: Des femmes ne {{demande}} rien.
TEST: des femmes qui {{conduise}} la marche du monde.


## Quel(le) que soit / quel(le)s que soient

# singulier
__[i]/conj(conj_quel_quelle_que_3sg1)__
    quel(?:le|)s? que ([sf]\w+) +(?:l[ea]|ce(?:t|tte|)|[mts](?:a|on)|[nv]otre|leur)  @@w
    <<- morphex(\1, ":V0e", ":3s")
    -1>> =suggVerb(@, ":3s")                                                             # Conjugaison erronée. Mettez “être” à la 3ᵉ personne du singulier.








|







11092
11093
11094
11095
11096
11097
11098
11099
11100
11101
11102
11103
11104
11105
11106
    -2>> =suggVerb(@, ":3p")                                # Conjugaison erronée. Accord avec « des \1… ». Le verbe devrait être à la 3ᵉ personne du pluriel.

TEST: Des hommes {{arrive}}.
TEST: Des femmes ne {{demande}} rien.
TEST: des femmes qui {{conduise}} la marche du monde.


!!!! Quel(le) que soit / quel(le)s que soient                                                       

# singulier
__[i]/conj(conj_quel_quelle_que_3sg1)__
    quel(?:le|)s? que ([sf]\w+) +(?:l[ea]|ce(?:t|tte|)|[mts](?:a|on)|[nv]otre|leur)  @@w
    <<- morphex(\1, ":V0e", ":3s")
    -1>> =suggVerb(@, ":3s")                                                             # Conjugaison erronée. Mettez “être” à la 3ᵉ personne du singulier.

10697
10698
10699
10700
10701
10702
10703
10704
10705
10706
10707
10708
10709
10710

10711
10712
10713
10714
10715
10716
10717
10718
10719
10720
10721
10722
10723
10724


10725
10726
10727
10728
10729
10730
10731
10732
10733
10734
10735
10736
10737
10738
10739
10740
10741
10742
10743
10744
!!
!!
!!!! Inversion verbe sujet                                                                          
!!
!!

__[i]/conj(conj_que_où_comment_verbe_sujet_sing)__
    (?:que?|où|comment) +({w1}) (l(?:e(?:ur | )|a |’)|[mts](?:on|a) |ce(?:t|tte|) |[nv]otre |du ) *(?!plupart|majorité)({w1})  @@w,w,$
    <<- morphex(\1, ":(?:[12]s|3p)", ":(?:3s|G|W|3p!)") and not after("^ +(?:et|ou) (?:l(?:es? |a |’|eurs? )|[mts](?:a|on|es) |ce(?:tte|ts|) |[nv]o(?:s|tre) |d(?:u|es) )")
    -1>> =suggVerb(@, ":3s")                                                        # Conjugaison erronée. Accord avec « \2 \3… ». Le verbe devrait être à la 3ᵉ personne du singulier.

TEST: les possibilités qu’{{offrent}} le chien
TEST: les possibilités que {{donnent}} le chien.
TEST: Où {{vas}} l’homme ?

TEST: de la même façon que survivent le swing ou le latin.
TEST: en proportion des efforts que requièrent son entretien et son exploitation
TEST: une crainte aussi que renforcent son éloignement et le protocole compliqué
TEST: à l’époque de Mansur que grandissent la place et le rôle de…
TEST: où vivent la majorité des immigrés et des enfants d’immigrés



__[i]/conj(conj_que_où_comment_verbe_sujet_pluriel)__
    (?:que?|où|comment|combien) +({w1}) ([ldcmts]es|quelques|certaine?s|plusieurs|[nv]os|leurs) ({w1})  @@w,w,$
    <<- morphex(\1, ":[123]s", ":(?:3p|G|W)") -1>> =suggVerb(@, ":3p")              # Conjugaison erronée. Accord avec « \2 \3… ». Le verbe devrait être à la 3ᵉ personne du pluriel.

TEST: D’où {{vienne}} les hommes ?
TEST: Comment {{danse}} les femmes ?




__[i]/conj(conj_que_où_comment_verbe_sujet)__
    (?:que?|où|comment|combien) +({w_1}[es])(?! je| tu) @@$
    <<- morphex(\1, ":[12][sp]", ":(?:G|W|3[sp]|Y|P|Q|N)") -1>> =suggVerb(@, ":3s")     # Conjugaison erronée. Ce verbe devrait être à la 3ᵉ personne.

TEST: Qu’est-ce que tu crois que {{deviens}} réellement, immanquablement et subitement cet homme après une telle dérouillée ?
TEST: ces sciences, ces religions, ces philosophies ne sont que contes destinés à nous donner l’illusion de la connaissance.


#__[i]/conj(conj_que_où_verbe_sujet_3sg)__
#    (?:que|où) +> +({w1})(?! [jJ]e| [tT]u| [nNvV]ous| [eE]t )  @@$
#    <<- morphex(\1, ":[12][sp]", ":(?:G|W|3[sp])") -1>> =suggVerb(@, ":3s")         # Conjugaison erronée. Ce verbe devrait être à la 3ᵉ personne.

TEST: peu importe ce que tu crois du lieu où l’{{abandonnerais}} ce salopard…


__[i]/conj(conj_puisse)__
    (puisses?) ({w_2})  @@0,$
    <<- isStart() >>>







|






>









|




>
>



|







|
|







11173
11174
11175
11176
11177
11178
11179
11180
11181
11182
11183
11184
11185
11186
11187
11188
11189
11190
11191
11192
11193
11194
11195
11196
11197
11198
11199
11200
11201
11202
11203
11204
11205
11206
11207
11208
11209
11210
11211
11212
11213
11214
11215
11216
11217
11218
11219
11220
11221
11222
11223
!!
!!
!!!! Inversion verbe sujet                                                                          
!!
!!

__[i]/conj(conj_que_où_comment_verbe_sujet_sing)__
    (?:que?|où|comment|combien|dont|quand|pourquoi|l[ea]s?quel(?:le|)s?) +({w1}) (l(?:e(?:ur | )|a |’)|[mts](?:on|a) |ce(?:t|tte|) |[nv]otre |du ) *(?!plupart|majorité)({w1})  @@w,w,$
    <<- morphex(\1, ":(?:[12]s|3p)", ":(?:3s|G|W|3p!)") and not after("^ +(?:et|ou) (?:l(?:es? |a |’|eurs? )|[mts](?:a|on|es) |ce(?:tte|ts|) |[nv]o(?:s|tre) |d(?:u|es) )")
    -1>> =suggVerb(@, ":3s")                                                        # Conjugaison erronée. Accord avec « \2 \3… ». Le verbe devrait être à la 3ᵉ personne du singulier.

TEST: les possibilités qu’{{offrent}} le chien
TEST: les possibilités que {{donnent}} le chien.
TEST: Où {{vas}} l’homme ?
TEST: l’histoire dont {{bénéficient}} notre langue.
TEST: de la même façon que survivent le swing ou le latin.
TEST: en proportion des efforts que requièrent son entretien et son exploitation
TEST: une crainte aussi que renforcent son éloignement et le protocole compliqué
TEST: à l’époque de Mansur que grandissent la place et le rôle de…
TEST: où vivent la majorité des immigrés et des enfants d’immigrés



__[i]/conj(conj_que_où_comment_verbe_sujet_pluriel)__
    (?:que?|où|comment|combien|dont|quand|pourquoi|l[ea]s?quel(?:le|)s?) +({w_3}) ([ldcmts]es|quelques|certaine?s|plusieurs|[nv]os|leurs) ({w1})  @@w,w,$
    <<- morphex(\1, ":[123]s", ":(?:3p|G|W)") -1>> =suggVerb(@, ":3p")              # Conjugaison erronée. Accord avec « \2 \3… ». Le verbe devrait être à la 3ᵉ personne du pluriel.

TEST: D’où {{vienne}} les hommes ?
TEST: Comment {{danse}} les femmes ?
TEST: les idioties qu’{{aime}} les hommes, j’en ai marre.
TEST: l’amour dont {{parle}} les femmes


__[i]/conj(conj_que_où_comment_verbe_sujet)__
    (?:que?|où|comment|combien|dont|quand|pourquoi|l[ea]s?quel(?:le|)s?) +({w_1}[es])(?! je| tu) @@$
    <<- morphex(\1, ":[12][sp]", ":(?:G|W|3[sp]|Y|P|Q|N)") -1>> =suggVerb(@, ":3s")     # Conjugaison erronée. Ce verbe devrait être à la 3ᵉ personne.

TEST: Qu’est-ce que tu crois que {{deviens}} réellement, immanquablement et subitement cet homme après une telle dérouillée ?
TEST: ces sciences, ces religions, ces philosophies ne sont que contes destinés à nous donner l’illusion de la connaissance.


#__[i]/conj(conj_que_où_verbe_sujet_3sg)__
#    (?:que?|où|comment|combien|dont|quand|pourquoi|l[ea]s?quel(?:le|)s?) +({w_1})(?! [jJ]e| [tT]u| [nNvV]ous| [eE]t )  @@$
#    <<- morphex(\1, ":[12][sp]", ":(?:G|W|N|3[sp])") -1>> =suggVerb(@, ":3s")         # Conjugaison erronée. Ce verbe devrait être à la 3ᵉ personne.

TEST: peu importe ce que tu crois du lieu où l’{{abandonnerais}} ce salopard…


__[i]/conj(conj_puisse)__
    (puisses?) ({w_2})  @@0,$
    <<- isStart() >>>
10770
10771
10772
10773
10774
10775
10776
10777
10778
10779
10780
10781
10782
10783
10784
10785
10786
10787
10788
10789
10790
10791
10792
10793
10794
10795
10796
10797
10798
10799
10800
10801
10802
10803

10804
10805
10806
10807
10808
10809
10810
    <<- morphex(\1, ":V.*:2s", ":[GNW]") and not before(r"(?i)\b(?:je|tu) +$") and morphex(word(1), ":", ":2s", True)
    ->> \1-tu                                                                                       # Forme interrogative ? Mettez un trait d’union.
__[i]/inte(inte_union_il_on)__
    ({w_2}[td]) (?:il|on)  @@0
    <<- morphex(\1, ":V.*:3s", ":[GNW]") and not before(r"(?i)\b(?:ce|il|elle|on) +$") and morphex(word(1), ":", ":3s|>y ", True)
    ->> =\0.replace(" ", "-")                                                                       # Forme interrogative ? Mettez un trait d’union.
__[i]/inte(inte_union_elle)__
    (?<!c’)({w_2}[td]) elle  @@0
    <<- morphex(\1, ":V.*:3s", ":[GNW]") and not before(r"(?i)\b(?:ce|il|elle|on) +$") and morphex(word(1), ":", ":3s", True)
    ->> \1-elle                                                                                     # Forme interrogative ? Mettez un trait d’union.
__[i]/inte(inte_union_nous)__
    ({w_2}ons) nous  @@0
    <<- morphex(\1, ":V.*:1p", ":[GNW]") and not morph(word(-1), ":Os", False, False) and morphex(word(1), ":", ":(?:Y|1p)", True)
    ->> \1-nous                                                                                     # Forme interrogative ? Mettez un trait d’union.
__[i]/inte(inte_union_vous)__
    ({w_2}ez) vous  @@0
    <<- morphex(\1, ":V.*:2p", ":[GNW]|>vouloir .*:E:2p") and not morph(word(-1), ":Os", False, False) and morphex(word(1), ":", ":(?:Y|2p)", True)
    ->> \1-vous                                                                                     # Forme interrogative ? Mettez un trait d’union.
__[i]/inte(inte_union_ils_elles)__
    ({w_1}nt) (?:ils|elles)  @@0
    <<- morphex(\1, ":V.*:3p", ":[GNW]") and not before(r"(?i)\b(?:ce|ils|elles) +$") and morphex(word(1), ":", ":3p", True)
    ->> =\0.replace(" ", "-")                                                                       # Forme interrogative ? Mettez un trait d’union.

TEST: {{mangé je}} {{ça}} avec dégoût ?
TEST: {{viendrais je}} à la fête ?
TEST: {{Seras tu}} là ?
TEST: {{prend on}} le temps d’y réfléchir ?
TEST: {{vient elle}} souvent ?
TEST: {{viennent elles}} souvent ?
TEST: {{retrouverons nous}} enfin la tranquilité ?
TEST: Mais {{soutiendrez vous}} cette proposition ?
TEST: {{Viendront ils}} demain ?
TEST: je ne comprenais pas pourquoi c’était elle qui était punie et que personne ne parlait de celui qui avait fait ça.
TEST: Veuillez vous instruire avant de contester ces mesures.



__[i]/inte(inte_je)__
    ({w1})-je  @@0
    <<- morphex(\1, ":V", ":1[sśŝ]") -1>> =suggVerb(@, ":1ś")                                       # Forme interrogative : « \1 » n’est pas un verbe à la 1ʳᵉ personne du singulier.
    <<- not morph(\1, ":V", False) -1>> =suggSimil(\1, ":1[sśŝ]")                                   # Forme interrogative : « \1 » n’est pas un verbe à la 1ʳᵉ personne du singulier.








|











|














>







11249
11250
11251
11252
11253
11254
11255
11256
11257
11258
11259
11260
11261
11262
11263
11264
11265
11266
11267
11268
11269
11270
11271
11272
11273
11274
11275
11276
11277
11278
11279
11280
11281
11282
11283
11284
11285
11286
11287
11288
11289
11290
    <<- morphex(\1, ":V.*:2s", ":[GNW]") and not before(r"(?i)\b(?:je|tu) +$") and morphex(word(1), ":", ":2s", True)
    ->> \1-tu                                                                                       # Forme interrogative ? Mettez un trait d’union.
__[i]/inte(inte_union_il_on)__
    ({w_2}[td]) (?:il|on)  @@0
    <<- morphex(\1, ":V.*:3s", ":[GNW]") and not before(r"(?i)\b(?:ce|il|elle|on) +$") and morphex(word(1), ":", ":3s|>y ", True)
    ->> =\0.replace(" ", "-")                                                                       # Forme interrogative ? Mettez un trait d’union.
__[i]/inte(inte_union_elle)__
    (?<![cC]’)({w_2}[td]) elle  @@0
    <<- morphex(\1, ":V.*:3s", ":[GNW]") and not before(r"(?i)\b(?:ce|il|elle|on) +$") and morphex(word(1), ":", ":3s", True)
    ->> \1-elle                                                                                     # Forme interrogative ? Mettez un trait d’union.
__[i]/inte(inte_union_nous)__
    ({w_2}ons) nous  @@0
    <<- morphex(\1, ":V.*:1p", ":[GNW]") and not morph(word(-1), ":Os", False, False) and morphex(word(1), ":", ":(?:Y|1p)", True)
    ->> \1-nous                                                                                     # Forme interrogative ? Mettez un trait d’union.
__[i]/inte(inte_union_vous)__
    ({w_2}ez) vous  @@0
    <<- morphex(\1, ":V.*:2p", ":[GNW]|>vouloir .*:E:2p") and not morph(word(-1), ":Os", False, False) and morphex(word(1), ":", ":(?:Y|2p)", True)
    ->> \1-vous                                                                                     # Forme interrogative ? Mettez un trait d’union.
__[i]/inte(inte_union_ils_elles)__
    (?<![cC]’)({w_1}nt) (?:ils|elles)  @@0
    <<- morphex(\1, ":V.*:3p", ":[GNW]") and not before(r"(?i)\b(?:ce|ils|elles) +$") and morphex(word(1), ":", ":3p", True)
    ->> =\0.replace(" ", "-")                                                                       # Forme interrogative ? Mettez un trait d’union.

TEST: {{mangé je}} {{ça}} avec dégoût ?
TEST: {{viendrais je}} à la fête ?
TEST: {{Seras tu}} là ?
TEST: {{prend on}} le temps d’y réfléchir ?
TEST: {{vient elle}} souvent ?
TEST: {{viennent elles}} souvent ?
TEST: {{retrouverons nous}} enfin la tranquilité ?
TEST: Mais {{soutiendrez vous}} cette proposition ?
TEST: {{Viendront ils}} demain ?
TEST: je ne comprenais pas pourquoi c’était elle qui était punie et que personne ne parlait de celui qui avait fait ça.
TEST: Veuillez vous instruire avant de contester ces mesures.
TEST: C’était elle qui avait pris le contrôle.


__[i]/inte(inte_je)__
    ({w1})-je  @@0
    <<- morphex(\1, ":V", ":1[sśŝ]") -1>> =suggVerb(@, ":1ś")                                       # Forme interrogative : « \1 » n’est pas un verbe à la 1ʳᵉ personne du singulier.
    <<- not morph(\1, ":V", False) -1>> =suggSimil(\1, ":1[sśŝ]")                                   # Forme interrogative : « \1 » n’est pas un verbe à la 1ʳᵉ personne du singulier.

10832
10833
10834
10835
10836
10837
10838












10839
10840
10841
10842
10843
10844
10845
TEST: {{Peux}}-il                                           ->> Peut
TEST: {{Attaques}}-t-on                                     ->> Attaque
TEST: {{Prends}}-elle                                       ->> Prend
TEST: {{Menthe}}-t-elle souvent ?
TEST: {{viennent}}-{{il}} demain ?
TEST: Le moteur choisi convient-il ?














__[i]/inte(inte_nous)__
    ({w1})-nous  @@0
    <<- morphex(\1, ":V", ":(?:1p|E:2[sp])") -1>> =suggVerb(@, ":1p")                               # Forme interrogative ou impérative incorrecte.
    <<- morphex(\1, ":", ":V|>chez ") -1>> =suggSimil(\1, ":1p")                                    # Forme interrogative ou impérative incorrecte.

TEST: {{Prendront}}-nous                                    ->> Prendrons







>
>
>
>
>
>
>
>
>
>
>
>







11312
11313
11314
11315
11316
11317
11318
11319
11320
11321
11322
11323
11324
11325
11326
11327
11328
11329
11330
11331
11332
11333
11334
11335
11336
11337
TEST: {{Peux}}-il                                           ->> Peut
TEST: {{Attaques}}-t-on                                     ->> Attaque
TEST: {{Prends}}-elle                                       ->> Prend
TEST: {{Menthe}}-t-elle souvent ?
TEST: {{viennent}}-{{il}} demain ?
TEST: Le moteur choisi convient-il ?


__[s]/inte(inte_ce)__
    ({w_2})-([cs]e)  @@0,$
    <<- morphex(\1, ":V", ":3s") -1>> =suggVerb(@, ":3s")                  # Forme interrogative : « \1 » n’est pas un verbe à la 3ᵉ personne du singulier.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=4132
    <<- morphex(\1, ":", ":V") -1>> =suggSimil(\1, ":3s")                  # Forme interrogative : « \1 » n’est pas un verbe à la 3ᵉ personne du singulier.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=4132
    <<- \2 == "se" -2>> ce                                                 # Forme interrogative. Confusion.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=4132

TEST: était-{{se}} cela, la vérité ineffable ?
TEST: {{étai}}-ce notre destinée de souffrir ?
TEST: {{étaient}}-{{se}} ces hommes-là qui allaient nous guider dans les montagnes ?
TEST: Était-ce des femmes de ce pays ?


__[i]/inte(inte_nous)__
    ({w1})-nous  @@0
    <<- morphex(\1, ":V", ":(?:1p|E:2[sp])") -1>> =suggVerb(@, ":1p")                               # Forme interrogative ou impérative incorrecte.
    <<- morphex(\1, ":", ":V|>chez ") -1>> =suggSimil(\1, ":1p")                                    # Forme interrogative ou impérative incorrecte.

TEST: {{Prendront}}-nous                                    ->> Prendrons
10864
10865
10866
10867
10868
10869
10870
10871
10872
10873
10874
10875
10876
10877
10878
    -1>> =suggSimil(\1, ":3p")                                                                      # Forme interrogative : « \1 » n’est pas un verbe à la 3ᵉ personne du pluriel.

TEST: {{attaquant}}-ils                                     ->> attaquent
TEST: {{prendrons}}-elles un verre avec moi ?



#### VERBE AUXILIAIRE

__[i]/conf(conf_avoir_sujet_participe_passé)__
    ({avoir})-(?:je|tu|ils?|elles?|on) +({ppas})  @@0,$
    <<- morph(\1, ">avoir ", False) and morph(\2, ":V.......e_.*:Q", False) -1>> _  # Incohérence. La forme verbale “\2” ne peut pas être utilisé avec l’auxiliaire “avoir”, seulement avec l’auxiliaire “être”.
__[i]/conf(conf_sujet_avoir_participe_passé)__
    (?:j’|je |tu |ils? |elles? |on ) *({avoir}) +({ppas})  @@*,$
    <<- morph(\1, ">avoir ", False) and morph(\2, ":V.......e_.*:Q", False) -1>> _  # Incohérence. La forme verbale “\2” ne peut pas être utilisé avec l’auxiliaire “avoir”, seulement avec l’auxiliaire “être”.







|







11356
11357
11358
11359
11360
11361
11362
11363
11364
11365
11366
11367
11368
11369
11370
    -1>> =suggSimil(\1, ":3p")                                                                      # Forme interrogative : « \1 » n’est pas un verbe à la 3ᵉ personne du pluriel.

TEST: {{attaquant}}-ils                                     ->> attaquent
TEST: {{prendrons}}-elles un verre avec moi ?



!!!! Verbe auxiliaire                                                                               

__[i]/conf(conf_avoir_sujet_participe_passé)__
    ({avoir})-(?:je|tu|ils?|elles?|on) +({ppas})  @@0,$
    <<- morph(\1, ">avoir ", False) and morph(\2, ":V.......e_.*:Q", False) -1>> _  # Incohérence. La forme verbale “\2” ne peut pas être utilisé avec l’auxiliaire “avoir”, seulement avec l’auxiliaire “être”.
__[i]/conf(conf_sujet_avoir_participe_passé)__
    (?:j’|je |tu |ils? |elles? |on ) *({avoir}) +({ppas})  @@*,$
    <<- morph(\1, ">avoir ", False) and morph(\2, ":V.......e_.*:Q", False) -1>> _  # Incohérence. La forme verbale “\2” ne peut pas être utilisé avec l’auxiliaire “avoir”, seulement avec l’auxiliaire “être”.
10889
10890
10891
10892
10893
10894
10895
10896
10897
10898
10899
10900
10901
10902
10903

10904
10905
10906
10907
10908
10909
10910
10911
10912
10913
10914
!!!! Modes verbaux                                                                                  
!!
!!

# conditionnel / futur

__[i]/vmode(vmode_j_aimerais_vinfi)__
    j(?:e +|’)(aimerai|préf[éè]rerai|apprécierai|voudrai|souhaiterai) +({w_1})  @@w,$
    <<- morphex(\2, ":[YX]|>(?:y|ne|que?) ", ":R") -1>> \1s                                 # Si vous exprimez un souhait, utilisez le conditionnel et non le futur.

TEST: J’{{aimerai}} savoir ce dont il retourne.
TEST: dans tous les cas j’{{aimerai}} ne rien savoir
TEST: Je {{voudrai}} qu’il soit déjà là.
TEST: J’aimerai ces cours-là autant que les autres.
TEST: J’aimerai la danse et la musique, puisque vous l’exigez.



__[i]/vmode(vmode_j_aurais_aimé_que_avoir_être)__
    j’(aurai) +(?:aimé|souhaité|préféré|voulu) +(que?|ne|{infi})  @@2,$
    <<- morph(\2, ":Y|>(?:ne|que?) ", False)
    -1>> aurais|eusse                               # Pour un souhait passé, utilisez le conditionnel passé et non le futur antérieur. Exemple pour le futur antérieur : « quand j’aurai fini… »

TEST: J’{{aurai}} aimé nous offrir ce magnifique cadeau.
TEST: j’{{aurai}} voulu être un artiste.
TEST: j’{{aurai}} préféré ne pas avoir à l’entendre.
TEST: j’{{aurai}} préféré l’entendre un autre jour.







|
|






>



|







11381
11382
11383
11384
11385
11386
11387
11388
11389
11390
11391
11392
11393
11394
11395
11396
11397
11398
11399
11400
11401
11402
11403
11404
11405
11406
11407
!!!! Modes verbaux                                                                                  
!!
!!

# conditionnel / futur

__[i]/vmode(vmode_j_aimerais_vinfi)__
    j(?:e +|’)(aimerai|préf[éè]rerai|apprécierai|voudrai|souhaiterai|désirerai|adorerai) +({w_1})  @@w,$
    <<- morphex(\2, ":[YX]|>(?:y|ne|que?) ", ":R") and isStart() -1>> \1s                           # Si vous exprimez un souhait, utilisez le conditionnel et non le futur.

TEST: J’{{aimerai}} savoir ce dont il retourne.
TEST: dans tous les cas j’{{aimerai}} ne rien savoir
TEST: Je {{voudrai}} qu’il soit déjà là.
TEST: J’aimerai ces cours-là autant que les autres.
TEST: J’aimerai la danse et la musique, puisque vous l’exigez.
TEST: Je sais que j’aimerai ça, tout comme lui.


__[i]/vmode(vmode_j_aurais_aimé_que_avoir_être)__
    j’(aurai) +(?:aimé|souhaité|préféré|voulu|apprécié|désiré|adoré) +(que?|ne|{infi})  @@2,$
    <<- morph(\2, ":Y|>(?:ne|que?) ", False)
    -1>> aurais|eusse                               # Pour un souhait passé, utilisez le conditionnel passé et non le futur antérieur. Exemple pour le futur antérieur : « quand j’aurai fini… »

TEST: J’{{aurai}} aimé nous offrir ce magnifique cadeau.
TEST: j’{{aurai}} voulu être un artiste.
TEST: j’{{aurai}} préféré ne pas avoir à l’entendre.
TEST: j’{{aurai}} préféré l’entendre un autre jour.
10930
10931
10932
10933
10934
10935
10936
10937
10938
10939
10940
10941
10942
10943
10944
10945
10946
10947
10948
10949
10950
10951
10952
10953
10954
10955
10956
10957

10958
10959
10960
10961
10962
10963
10964

















10965
10966
10967
10968
10969
10970
10971

TEST: Si Pierre {{avancerait}} sa voiture de quelques mètres, ça nous permettrait de passer.
TEST: s’ils ne {{mangeraient}} pas tous les jours, ils seraient moins gros.


# Dès que + indicatif
__[i]/vmode(vmode_dès_que)__
    dès +que? +({w1}) +({w_2})  @@w,$
    <<- morph(\1, ":(?:Os|M)", False) and morphex(\2, ":S", ":[IG]")    -2>> =suggVerbMode(@, ":I", \1)     # Ce verbe ne devrait pas être au subjonctif.
#    <<- morph(\1, ":(?:Os|M)", False) and morph(\2, ":K", False)        -2>> =suggVerbMode(@, ":If", \1)    # Ce verbe ne devrait pas être au conditionnel.

#TEST: dès que je le {{verrais}}
TEST: dès qu’il le {{voie}}
TEST: donnant à entendre qu’il avait l’intention de violer Laura dès qu’il en aurait l’occasion


# verbe que + subjonctif
__[i]/vmode(vmode_qqch_que_subjonctif1)__
    (afin|pour|quoi|(?:perm|fa|v[oe]|ordonn|exig|désir|dout|suff|préf[éè]r)\w+) +que? +({w1}) +({w_2})  @@0,w,$
    <<- morph(\1, ">(?:afin|pour|quoi|permettre|falloir|vouloir|ordonner|exiger|désirer|douter|préférer|suffire) ", False)
    and morph(\2, ":(?:Os|M)", False) and morphex(\3, ":I", ":[GYS]")
    and not (morph(\1, ">douter ", False) and morph(\3, ":(?:If|K)", False))
    -3>> =suggVerbMode(@, ":S", \2)                                                 # Ce verbe devrait être au subjonctif.

TEST: Il suffit qu’il {{court}} plus
TEST: Je veux qu’il {{finit}} son repas.
TEST: quoi qu’il en {{conclut}}
TEST: Je ne veux pas que tu {{es}} des ennuis

TEST: Nul doute qu’elle nourrira à brève échéance la haine de demain à notre égard.
TEST: Je ne doute pas qu’ils réussiront leur mission.
TEST: Je me doutais bien qu’Apple pourrait marcher
TEST: il ne fait aucun doute qu’Amazon le sait.
TEST: quoi que nous autres hommes ayons pu faire



















__[i]/vmode(vmode_qqch_que_subjonctif2)__
    (?:à condition|pour peu|il +peut) +que? +({w1}) +({w_2})  @@w,$
    <<- morph(\1, ":(?:Os|M)", False) and morphex(\2, ":", ":[GYS]") -2>> =suggVerbMode(@, ":S", \1)    # Ce verbe devrait être au subjonctif.

TEST: à condition qu’il {{finit}} son boulot.
TEST: pour peu qu’il {{prend}} son devoir sérieux… 
TEST: il se peut que nous {{avons}} tort.







|










|
|


|





>







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







11423
11424
11425
11426
11427
11428
11429
11430
11431
11432
11433
11434
11435
11436
11437
11438
11439
11440
11441
11442
11443
11444
11445
11446
11447
11448
11449
11450
11451
11452
11453
11454
11455
11456
11457
11458
11459
11460
11461
11462
11463
11464
11465
11466
11467
11468
11469
11470
11471
11472
11473
11474
11475
11476
11477
11478
11479
11480
11481
11482

TEST: Si Pierre {{avancerait}} sa voiture de quelques mètres, ça nous permettrait de passer.
TEST: s’ils ne {{mangeraient}} pas tous les jours, ils seraient moins gros.


# Dès que + indicatif
__[i]/vmode(vmode_dès_que)__
    dès +que? +({w_2}) +({w_2})  @@w,$
    <<- morph(\1, ":(?:Os|M)", False) and morphex(\2, ":S", ":[IG]")    -2>> =suggVerbMode(@, ":I", \1)     # Ce verbe ne devrait pas être au subjonctif.
#    <<- morph(\1, ":(?:Os|M)", False) and morph(\2, ":K", False)        -2>> =suggVerbMode(@, ":If", \1)    # Ce verbe ne devrait pas être au conditionnel.

#TEST: dès que je le {{verrais}}
TEST: dès qu’il le {{voie}}
TEST: donnant à entendre qu’il avait l’intention de violer Laura dès qu’il en aurait l’occasion


# verbe que + subjonctif
__[i]/vmode(vmode_qqch_que_subjonctif1)__
    (afin|avant|pour|quoi|(?:perm|fa|v[oe]|ordonn|exig|désir|dout|suff|préf[éè]r)\w+) +que? +({w_2}) +({w_2})  @@0,w,$
    <<- morph(\1, ">(?:afin|avant|pour|quoi|permettre|falloir|vouloir|ordonner|exiger|désirer|douter|préférer|suffire) ", False)
    and morph(\2, ":(?:Os|M)", False) and morphex(\3, ":I", ":[GYS]")
    and not (morph(\1, ">douter ", False) and morph(\3, ":(?:If|K)", False))
    -3>> =suggVerbMode(@, ":S", \2)                                                 # Après « \1 que », ce verbe devrait être au subjonctif.

TEST: Il suffit qu’il {{court}} plus
TEST: Je veux qu’il {{finit}} son repas.
TEST: quoi qu’il en {{conclut}}
TEST: Je ne veux pas que tu {{es}} des ennuis
TEST: Avant que tu {{pars}}, je voudrais qu’on discute.
TEST: Nul doute qu’elle nourrira à brève échéance la haine de demain à notre égard.
TEST: Je ne doute pas qu’ils réussiront leur mission.
TEST: Je me doutais bien qu’Apple pourrait marcher
TEST: il ne fait aucun doute qu’Amazon le sait.
TEST: quoi que nous autres hommes ayons pu faire


# Bien que + subjonctif
__[i]/vmode(vmode_bien_que_subjonctif)__
    bien  ?que? ({w_2}) +>? *({w_2})  @@w,$
    <<- morph(\1, ":(?:Os|M)", False) and morphex(\2, ":V.*:I", ":([GSK]|If)|>(?:hériter|recevoir|donner|offrir) ") and isStart()
    and not ( morph(\2, ":V0a", False) and morph(word(1), ">(?:hériter|recevoir|donner|offrir) ", False) )
    -2>> =suggVerbMode(@, ":S", \1)                                                                 # Après « bien que », le verbe s’emploie au subjonctif.

TEST: Il ne le savait pas, bien qu’il en {{avait}} entendu parler.
TEST: Bien que je {{prends}} mon mal en patience.
TEST: C’est un joli bien. Bien qu’il a hérité de son oncle, notez bien.
TEST: Bien qu’il avait donné à ses enfants.


# Malgré que + subjonctif
# «Malgré que» peut être utilisé délibérément pour un parler populaire qui ignore le subjonctif.
# --> pas de règle de contrôle sur ce point.

__[i]/vmode(vmode_qqch_que_subjonctif2)__
    (?:à condition|pour peu|il +peut) +que? +({w1}) +({w_2})  @@w,$
    <<- morph(\1, ":(?:Os|M)", False) and morphex(\2, ":", ":[GYS]") -2>> =suggVerbMode(@, ":S", \1)    # Ce verbe devrait être au subjonctif.

TEST: à condition qu’il {{finit}} son boulot.
TEST: pour peu qu’il {{prend}} son devoir sérieux… 
TEST: il se peut que nous {{avons}} tort.
10985
10986
10987
10988
10989
10990
10991
10992
10993
10994
10995
10996
10997
10998
10999
11000










11001
11002
11003
11004
11005
11006
11007
TEST: j’en {{aie}} marre
TEST: j’{{aie}} faim


# Après que + indicatif
__[i]/vmode(vmode_après_que_indicatif)__
    après que? ({w_2}) +({w_2})  @@w,$
    <<- morph(\1, ":(?:Os|M)", False) and (morph(\2, ":V.*:S") or morph(\2, ":V0e.*:S", False))
    -2>> =suggVerbMode(@, ":I", \1)
    # Après « après que », le verbe s’emploie pas au subjonctif mais à l’indicatif, si l’action s’est déroulée de façon certaine.

TEST: Après qu’il {{ait}} allé
TEST: Après que Paul {{ait}} mangé son repas.
TEST: Après qu’il {{soit}} parti, il plut.














!!
!!
!!
!!
!!







|

|






>
>
>
>
>
>
>
>
>
>







11496
11497
11498
11499
11500
11501
11502
11503
11504
11505
11506
11507
11508
11509
11510
11511
11512
11513
11514
11515
11516
11517
11518
11519
11520
11521
11522
11523
11524
11525
11526
11527
11528
TEST: j’en {{aie}} marre
TEST: j’{{aie}} faim


# Après que + indicatif
__[i]/vmode(vmode_après_que_indicatif)__
    après que? ({w_2}) +({w_2})  @@w,$
    <<- morph(\1, ":(?:Os|M)", False) and (morphex(\2, ":V.*:S", ":[GI]") or morph(\2, ":V0e.*:S", False))
    -2>> =suggVerbMode(@, ":I", \1)
    # Après « après que », le verbe ne s’emploie pas au subjonctif mais à l’indicatif, si l’action s’est déroulée de façon certaine.

TEST: Après qu’il {{ait}} allé
TEST: Après que Paul {{ait}} mangé son repas.
TEST: Après qu’il {{soit}} parti, il plut.


# Quand/lorsque + indicatif
__[i]/vmode(vmode_quand_lorsque_indicatif)__
    (?:quand|lorsque?) ({w_2}) +>? *({w_2})  @@w,$
    <<- morph(\1, ":(?:Os|M)", False) and (morphex(\2, ":V.*:S", ":[GI]") or morph(\2, ":V0e.*:S", False))
    -2>> =suggVerbMode(@, ":I", \1)
    # Après « quand » ou « lorsque », le verbe ne s’emploie pas au subjonctif mais à l’indicatif.

TEST: quand elle {{rencontrât}} son créateur
TEST: lorsqu’il y {{eût}} du grabuge, nous montâmes tous sur le pont.



!!
!!
!!
!!
!!
11774
11775
11776
11777
11778
11779
11780
11781
11782
11783
11784
11785
11786
11787
11788
TEST: Ils ne le lui permettront pas.
TEST: Il sort de la salle située à l’extrémité sud.
TEST: Est terminé. Samedi prochain, nous recommencerons.
TEST: L’est est de ce côté.
TEST: C’est raisonner en chef… (ENFIN !!!).
TEST: Lancez-nous dans la bataille.
TEST: C’était il y a bien longtemps.
TEST: Le IIe siècle.
TEST: C’est elle qui me l’a dit.
TEST: Quelqu’un peut me le dire ?
TEST: C’est elle qui …
TEST: Ce sont elles qui …
TEST: Le nord est de ce côté, le sud est de ce côté.
TEST: Les cours particuliers.
TEST: Elle portait plusieurs bagues à ses fins doigts.







|







12295
12296
12297
12298
12299
12300
12301
12302
12303
12304
12305
12306
12307
12308
12309
TEST: Ils ne le lui permettront pas.
TEST: Il sort de la salle située à l’extrémité sud.
TEST: Est terminé. Samedi prochain, nous recommencerons.
TEST: L’est est de ce côté.
TEST: C’est raisonner en chef… (ENFIN !!!).
TEST: Lancez-nous dans la bataille.
TEST: C’était il y a bien longtemps.
TEST: Le II siècle.
TEST: C’est elle qui me l’a dit.
TEST: Quelqu’un peut me le dire ?
TEST: C’est elle qui …
TEST: Ce sont elles qui …
TEST: Le nord est de ce côté, le sud est de ce côté.
TEST: Les cours particuliers.
TEST: Elle portait plusieurs bagues à ses fins doigts.
11809
11810
11811
11812
11813
11814
11815
11816
11817
11818
11819
11820
11821
11822
11823
TEST: Il est à la fois grand et intelligent.
TEST: Une fois retrouvé, on le soumit à la question.
TEST: Au revoir mes amis. Au revoir !
TEST: Toutes choses égales par ailleurs.
TEST: Elles sont toutes blanches.
TEST: Le ou les cas que vous aurez à traiter.
TEST: Pierre nous a procuré un argument de poids.
TEST: Du 1er mars 2010 relative au respect des droits.
TEST: Le 2 mars 2010 relative au respect des droits.
TEST: Ce serait attaquer les droits de l’homme que de ne pas…
TEST: Ce serait ignorer.
TEST: Autour d’elle se sont réunis tous les désirs ignobles.

## version 0.0.12
TEST: Le déclin suite à la guerre…







|







12330
12331
12332
12333
12334
12335
12336
12337
12338
12339
12340
12341
12342
12343
12344
TEST: Il est à la fois grand et intelligent.
TEST: Une fois retrouvé, on le soumit à la question.
TEST: Au revoir mes amis. Au revoir !
TEST: Toutes choses égales par ailleurs.
TEST: Elles sont toutes blanches.
TEST: Le ou les cas que vous aurez à traiter.
TEST: Pierre nous a procuré un argument de poids.
TEST: Du 1ᵉʳ mars 2010 relative au respect des droits.
TEST: Le 2 mars 2010 relative au respect des droits.
TEST: Ce serait attaquer les droits de l’homme que de ne pas…
TEST: Ce serait ignorer.
TEST: Autour d’elle se sont réunis tous les désirs ignobles.

## version 0.0.12
TEST: Le déclin suite à la guerre…
11925
11926
11927
11928
11929
11930
11931
11932
11933
11934
11935
11936
11937
11938
11939


!!! Tests repris de LanguageTool                                                                    
## NOTE : ces textes contiennent parfois des erreurs (corrigées quand repérées par le correcteur)

TEST: Au voisinage du zéro absolu de température.
TEST: La couronne périphérique alterne falaises abruptes et plages.
TEST: Henri VIII rencontre François Ier.
TEST: à ce jour.
TEST: avoir un bel avenir
TEST: faire un dessin
TEST: par exemple
TEST: Une dune.
TEST: Une dune de sable blanc.
TEST: remède universel







|







12446
12447
12448
12449
12450
12451
12452
12453
12454
12455
12456
12457
12458
12459
12460


!!! Tests repris de LanguageTool                                                                    
## NOTE : ces textes contiennent parfois des erreurs (corrigées quand repérées par le correcteur)

TEST: Au voisinage du zéro absolu de température.
TEST: La couronne périphérique alterne falaises abruptes et plages.
TEST: Henri VIII rencontre François Iᵉʳ.
TEST: à ce jour.
TEST: avoir un bel avenir
TEST: faire un dessin
TEST: par exemple
TEST: Une dune.
TEST: Une dune de sable blanc.
TEST: remède universel
12287
12288
12289
12290
12291
12292
12293
12294
12295
12296
12297
12298
12299
12300
12301
12302
12303
12304
12305
TEST: Il connait l’histoire de A à Z.
TEST: Il a appris ça en un jour.
TEST: Il semble que oui.
TEST: Le oui l’a emporté.
TEST: J’ai suivi la A40.
TEST: À la une de la presse.
TEST: Là où ça ne va plus.
TEST: Le IIe siècle.
TEST: Dépose-le au courrier.
TEST: Dépose-la au courrier.
TEST: Je pense qu’il va bientôt arriver.
TEST: Dès le Ier siècle
TEST: Les habitants de Ouagadougou.
TEST: S’il pleut, je reste ici.
TEST: Voilà ce qu’il a dit.
TEST: Vous voilà arrivé.
TEST: Et voilà ce qu’il a dit.
TEST: Elle voila son visage.
TEST: Il a soixante et un ans.







|



|







12808
12809
12810
12811
12812
12813
12814
12815
12816
12817
12818
12819
12820
12821
12822
12823
12824
12825
12826
TEST: Il connait l’histoire de A à Z.
TEST: Il a appris ça en un jour.
TEST: Il semble que oui.
TEST: Le oui l’a emporté.
TEST: J’ai suivi la A40.
TEST: À la une de la presse.
TEST: Là où ça ne va plus.
TEST: Le II siècle.
TEST: Dépose-le au courrier.
TEST: Dépose-la au courrier.
TEST: Je pense qu’il va bientôt arriver.
TEST: Dès le Iᵉʳ siècle
TEST: Les habitants de Ouagadougou.
TEST: S’il pleut, je reste ici.
TEST: Voilà ce qu’il a dit.
TEST: Vous voilà arrivé.
TEST: Et voilà ce qu’il a dit.
TEST: Elle voila son visage.
TEST: Il a soixante et un ans.
13794
13795
13796
13797
13798
13799
13800
13801
13802
13803
13804
13805
13806
13807
13808
13809
13810
13811
13812
TEST: Un trait d’union.
TEST: J’ai la quasi-certitude qu’il ne viendra pas.
TEST: Je suis quasi certain qu’il ne viendra pas.
TEST: Une fin de non-recevoir.
TEST: Non merci.
TEST: Je me demande s’il avait ou non conscience que son arme était chargée.
TEST: etc.
TEST: Un écrivain du XIXe siècle
TEST: La 2e à droite
TEST: Les 2es.
TEST: Les 2des.
TEST: Le 2d.
TEST: Je me sens chez moi dans ton chez-toi.
TEST: Mon ex-femme habite près de chez moi.
TEST: La procédure est semi-automatique.
TEST: Je pense qu’il ment.
TEST: Je m’étais perdu.
TEST: La lettre l est mal écrite.
TEST: La variable x est constante.







|
|
|
|
|







14315
14316
14317
14318
14319
14320
14321
14322
14323
14324
14325
14326
14327
14328
14329
14330
14331
14332
14333
TEST: Un trait d’union.
TEST: J’ai la quasi-certitude qu’il ne viendra pas.
TEST: Je suis quasi certain qu’il ne viendra pas.
TEST: Une fin de non-recevoir.
TEST: Non merci.
TEST: Je me demande s’il avait ou non conscience que son arme était chargée.
TEST: etc.
TEST: Un écrivain du XIX siècle
TEST: La 2 à droite
TEST: Les 2ᵉˢ.
TEST: Les 2ᵈᵉˢ.
TEST: Le 2.
TEST: Je me sens chez moi dans ton chez-toi.
TEST: Mon ex-femme habite près de chez moi.
TEST: La procédure est semi-automatique.
TEST: Je pense qu’il ment.
TEST: Je m’étais perdu.
TEST: La lettre l est mal écrite.
TEST: La variable x est constante.
14107
14108
14109
14110
14111
14112
14113
14114
14115
14116
14117
14118
14119
14120
14121
TEST: Au lieu de conclure par ces simples mots : « Je ne comprends pas parce que la cause m’échappe », nous imaginons aussitôt des mystères effrayants et des puissances surnaturelles.
TEST: 14 juillet. — Fête de la République. Je me suis promené par les rues. Les pétards et les drapeaux m’amusaient comme un enfant.
TEST: C’est pourtant fort bête d’être joyeux, à date fixe, par décret du gouvernement. Le peuple est un troupeau imbécile, tantôt stupidement patient et tantôt férocement révolté.
TEST: On lui dit : « Amuse-toi. » Il s’amuse. On lui dit : « Va te battre avec le voisin. » Il va se battre. On lui dit : « Vote pour l’Empereur. » Il vote pour l’Empereur.
TEST: Puis, on lui dit : « Vote pour la République. » Et il vote pour la République.
TEST: Ceux qui le dirigent sont aussi sots ; mais au lieu d’obéir à des hommes, ils obéissent à des principes, lesquels ne peuvent être que niais, stériles et faux, par cela même qu’ils sont des principes, c’est-à-dire des idées réputées certaines et immuables, en ce monde où l’on n’est sûr de rien, puisque la lumière est une illusion, puisque le bruit est une illusion.
TEST: 16 juillet. — J’ai vu hier des choses qui m’ont beaucoup troublé.
TEST: Je dînais chez ma cousine, Mme Sablé, dont le mari commande le 76e chasseurs à Limoges.
TEST: Je me trouvais chez elle avec deux jeunes femmes, dont l’une a épousé un médecin, le docteur Parent, qui s’occupe beaucoup des maladies nerveuses et des manifestations extraordinaires auxquelles donnent lieu en ce moment les expériences sur l’hypnotisme et la suggestion.
TEST: Il nous raconta longtemps les résultats prodigieux obtenus par des savants anglais et par les médecins de l’école de Nancy.
TEST: Les faits qu’il avança me parurent tellement bizarres, que je me déclarai tout à fait incrédule.
TEST: « Nous sommes, affirmait-il, sur le point de découvrir un des plus importants secrets de la nature, je veux dire, un de ses plus importants secrets sur cette terre ; car elle en a certes d’autrement importants, là-bas, dans les étoiles.
TEST: Depuis que l’homme pense, depuis qu’il sait dire et écrire sa pensée, il se sent frôlé par un mystère impénétrable pour ses sens grossiers et imparfaits, et il tâche de suppléer, par l’effort de son intelligence, à l’impuissance de ses organes.
TEST: Quand cette intelligence demeurait encore à l’état rudimentaire, cette hantise des phénomènes invisibles a pris des formes banalement effrayantes.
TEST: De là sont nées les croyances populaires au surnaturel, les légendes des esprits rôdeurs, des fées, des gnomes, des revenants, je dirai même la légende de Dieu, car nos conceptions de l’ouvrier-créateur, de quelque religion qu’elles nous viennent, sont bien les inventions les plus médiocres, les plus stupides, les plus inacceptables sorties du cerveau apeuré des créatures.







|







14628
14629
14630
14631
14632
14633
14634
14635
14636
14637
14638
14639
14640
14641
14642
TEST: Au lieu de conclure par ces simples mots : « Je ne comprends pas parce que la cause m’échappe », nous imaginons aussitôt des mystères effrayants et des puissances surnaturelles.
TEST: 14 juillet. — Fête de la République. Je me suis promené par les rues. Les pétards et les drapeaux m’amusaient comme un enfant.
TEST: C’est pourtant fort bête d’être joyeux, à date fixe, par décret du gouvernement. Le peuple est un troupeau imbécile, tantôt stupidement patient et tantôt férocement révolté.
TEST: On lui dit : « Amuse-toi. » Il s’amuse. On lui dit : « Va te battre avec le voisin. » Il va se battre. On lui dit : « Vote pour l’Empereur. » Il vote pour l’Empereur.
TEST: Puis, on lui dit : « Vote pour la République. » Et il vote pour la République.
TEST: Ceux qui le dirigent sont aussi sots ; mais au lieu d’obéir à des hommes, ils obéissent à des principes, lesquels ne peuvent être que niais, stériles et faux, par cela même qu’ils sont des principes, c’est-à-dire des idées réputées certaines et immuables, en ce monde où l’on n’est sûr de rien, puisque la lumière est une illusion, puisque le bruit est une illusion.
TEST: 16 juillet. — J’ai vu hier des choses qui m’ont beaucoup troublé.
TEST: Je dînais chez ma cousine, Mme Sablé, dont le mari commande le 76 chasseurs à Limoges.
TEST: Je me trouvais chez elle avec deux jeunes femmes, dont l’une a épousé un médecin, le docteur Parent, qui s’occupe beaucoup des maladies nerveuses et des manifestations extraordinaires auxquelles donnent lieu en ce moment les expériences sur l’hypnotisme et la suggestion.
TEST: Il nous raconta longtemps les résultats prodigieux obtenus par des savants anglais et par les médecins de l’école de Nancy.
TEST: Les faits qu’il avança me parurent tellement bizarres, que je me déclarai tout à fait incrédule.
TEST: « Nous sommes, affirmait-il, sur le point de découvrir un des plus importants secrets de la nature, je veux dire, un de ses plus importants secrets sur cette terre ; car elle en a certes d’autrement importants, là-bas, dans les étoiles.
TEST: Depuis que l’homme pense, depuis qu’il sait dire et écrire sa pensée, il se sent frôlé par un mystère impénétrable pour ses sens grossiers et imparfaits, et il tâche de suppléer, par l’effort de son intelligence, à l’impuissance de ses organes.
TEST: Quand cette intelligence demeurait encore à l’état rudimentaire, cette hantise des phénomènes invisibles a pris des formes banalement effrayantes.
TEST: De là sont nées les croyances populaires au surnaturel, les légendes des esprits rôdeurs, des fées, des gnomes, des revenants, je dirai même la légende de Dieu, car nos conceptions de l’ouvrier-créateur, de quelque religion qu’elles nous viennent, sont bien les inventions les plus médiocres, les plus stupides, les plus inacceptables sorties du cerveau apeuré des créatures.

Modified gc_lang/fr/tb/content/about.xul from [f56729e17b] to [fc21852913].

17
18
19
20
21
22
23
24
25
26
27
28
29
30



31
32
33
34
35
  <description  style="text-align: center;">
    <image src="chrome://grammarchecker/skin/logo120_text.png" />
  </description>
  <label class="descr">&description1;</label>
  <label class="descr">&description2;</label>
  <label class="stdlabel" value="&version; ${version}" />
  <label class="stdlabel" value="&license; GPL 3" />
  <label id="website" value="Site web" onclick="openInTabURL('http://grammalecte.net');" />

  <separator class="groove" orient="horizontal" style="margin: 10px;"/>

  <label class="stdlabel" value="&thanks;" />
  <image src="chrome://grammarchecker/skin/LaMouette_small.png" style="cursor: pointer;"
    onclick="openInTabURL('http://lamouette.org/');" />



  <label id="contrib" value="&contrib;"
    onclick="openInTabURL('http://www.dicollecte.org/grammalecte/soutiens.php');" />

  <script type="application/x-javascript" src="about.js"/>
</dialog>







|





|
>
>
>

|



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
  <description  style="text-align: center;">
    <image src="chrome://grammarchecker/skin/logo120_text.png" />
  </description>
  <label class="descr">&description1;</label>
  <label class="descr">&description2;</label>
  <label class="stdlabel" value="&version; ${version}" />
  <label class="stdlabel" value="&license; GPL 3" />
  <label id="website" value="Site web" onclick="openInTabURL('http://grammalecte.net/?from=grammalecte-tb');" />

  <separator class="groove" orient="horizontal" style="margin: 10px;"/>

  <label class="stdlabel" value="&thanks;" />
  <image src="chrome://grammarchecker/skin/LaMouette_small.png" style="cursor: pointer;"
    onclick="openInTabURL('http://lamouette.org/?from=grammalecte-tb');" />
  <label class="stdlabel" value="&amp;" />
  <image src="chrome://grammarchecker/skin/Algoo_logo.png" style="cursor: pointer;"
    onclick="openInTabURL('https://www.algoo.fr/?from=grammalecte-tb');" />
  <label id="contrib" value="&contrib;"
    onclick="openInTabURL('https://www.dicollecte.org/#thanks');" />

  <script type="application/x-javascript" src="about.js"/>
</dialog>

Modified gc_lang/fr/tb/content/overlay.js from [3429b110d8] to [a6d0f601cc].

45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
    xGCEWorker: null,
    bDictActive: null,
    loadGC: function () {
        if (this.xGCEWorker === null) {
            // Grammar checker
            echo('Loading Grammalecte');
            this.xGCEWorker = new BasePromiseWorker('chrome://promiseworker/content/gce_worker.js');
            let xPromise = this.xGCEWorker.post('loadGrammarChecker', [prefs.getCharPref("sGCOptions")]);
            xPromise.then(
                function (aVal) {
                    echo(aVal);
                    prefs.setCharPref("sGCOptions", aVal);
                },
                function (aReason) { echo('Promise rejected - ', aReason); }
            ).catch(







|







45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
    xGCEWorker: null,
    bDictActive: null,
    loadGC: function () {
        if (this.xGCEWorker === null) {
            // Grammar checker
            echo('Loading Grammalecte');
            this.xGCEWorker = new BasePromiseWorker('chrome://promiseworker/content/gce_worker.js');
            let xPromise = this.xGCEWorker.post('loadGrammarChecker', [prefs.getCharPref("sGCOptions"), "Thunderbird"]);
            xPromise.then(
                function (aVal) {
                    echo(aVal);
                    prefs.setCharPref("sGCOptions", aVal);
                },
                function (aReason) { echo('Promise rejected - ', aReason); }
            ).catch(
908
909
910
911
912
913
914

915
916
917
918
919
920
921
922
        oTextFormatter.resetProgressBar();
    }
}, false);

window.addEventListener("load", function (xEvent) {
    oDictIgniter.init();
    oGrammarChecker.loadGC();

}, false);

window.addEventListener("compose-window-init", function (xEvent) {
    oGrammarChecker.loadUI();
    oGrammarChecker.closePanel();
    oGrammarChecker.clearPreview();
    oTextFormatter.init();
}, true);







>








908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
        oTextFormatter.resetProgressBar();
    }
}, false);

window.addEventListener("load", function (xEvent) {
    oDictIgniter.init();
    oGrammarChecker.loadGC();
    //oGrammarChecker.fullTests();
}, false);

window.addEventListener("compose-window-init", function (xEvent) {
    oGrammarChecker.loadUI();
    oGrammarChecker.closePanel();
    oGrammarChecker.clearPreview();
    oTextFormatter.init();
}, true);

Added gc_lang/fr/tb/skin/Algoo_logo.png version [59954b3904].

cannot compute difference between binary files

Modified gc_lang/fr/tb/skin/LaMouette_small.png from [6778e9b924] to [61c7247845].

cannot compute difference between binary files

Added gc_lang/fr/webext/3rd/font-awesome-4.7.0/css/font-awesome.css version [4a7506d1d8].



































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
/*!
 *  Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
 *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
 */
/* FONT PATH
 * -------------------------- */
@font-face {
  font-family: 'FontAwesome';
  src: url('../fonts/fontawesome-webfont.eot?v=4.7.0');
  src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');
  font-weight: normal;
  font-style: normal;
}
.fa {
  display: inline-block;
  font: normal normal normal 14px/1 FontAwesome;
  font-size: inherit;
  text-rendering: auto;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
/* makes the font 33% larger relative to the icon container */
.fa-lg {
  font-size: 1.33333333em;
  line-height: 0.75em;
  vertical-align: -15%;
}
.fa-2x {
  font-size: 2em;
}
.fa-3x {
  font-size: 3em;
}
.fa-4x {
  font-size: 4em;
}
.fa-5x {
  font-size: 5em;
}
.fa-fw {
  width: 1.28571429em;
  text-align: center;
}
.fa-ul {
  padding-left: 0;
  margin-left: 2.14285714em;
  list-style-type: none;
}
.fa-ul > li {
  position: relative;
}
.fa-li {
  position: absolute;
  left: -2.14285714em;
  width: 2.14285714em;
  top: 0.14285714em;
  text-align: center;
}
.fa-li.fa-lg {
  left: -1.85714286em;
}
.fa-border {
  padding: .2em .25em .15em;
  border: solid 0.08em #eeeeee;
  border-radius: .1em;
}
.fa-pull-left {
  float: left;
}
.fa-pull-right {
  float: right;
}
.fa.fa-pull-left {
  margin-right: .3em;
}
.fa.fa-pull-right {
  margin-left: .3em;
}
/* Deprecated as of 4.4.0 */
.pull-right {
  float: right;
}
.pull-left {
  float: left;
}
.fa.pull-left {
  margin-right: .3em;
}
.fa.pull-right {
  margin-left: .3em;
}
.fa-spin {
  -webkit-animation: fa-spin 2s infinite linear;
  animation: fa-spin 2s infinite linear;
}
.fa-pulse {
  -webkit-animation: fa-spin 1s infinite steps(8);
  animation: fa-spin 1s infinite steps(8);
}
@-webkit-keyframes fa-spin {
  0% {
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(359deg);
    transform: rotate(359deg);
  }
}
@keyframes fa-spin {
  0% {
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(359deg);
    transform: rotate(359deg);
  }
}
.fa-rotate-90 {
  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";
  -webkit-transform: rotate(90deg);
  -ms-transform: rotate(90deg);
  transform: rotate(90deg);
}
.fa-rotate-180 {
  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";
  -webkit-transform: rotate(180deg);
  -ms-transform: rotate(180deg);
  transform: rotate(180deg);
}
.fa-rotate-270 {
  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";
  -webkit-transform: rotate(270deg);
  -ms-transform: rotate(270deg);
  transform: rotate(270deg);
}
.fa-flip-horizontal {
  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";
  -webkit-transform: scale(-1, 1);
  -ms-transform: scale(-1, 1);
  transform: scale(-1, 1);
}
.fa-flip-vertical {
  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
  -webkit-transform: scale(1, -1);
  -ms-transform: scale(1, -1);
  transform: scale(1, -1);
}
:root .fa-rotate-90,
:root .fa-rotate-180,
:root .fa-rotate-270,
:root .fa-flip-horizontal,
:root .fa-flip-vertical {
  filter: none;
}
.fa-stack {
  position: relative;
  display: inline-block;
  width: 2em;
  height: 2em;
  line-height: 2em;
  vertical-align: middle;
}
.fa-stack-1x,
.fa-stack-2x {
  position: absolute;
  left: 0;
  width: 100%;
  text-align: center;
}
.fa-stack-1x {
  line-height: inherit;
}
.fa-stack-2x {
  font-size: 2em;
}
.fa-inverse {
  color: #ffffff;
}
/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
   readers do not read off random characters that represent icons */
.fa-glass:before {
  content: "\f000";
}
.fa-music:before {
  content: "\f001";
}
.fa-search:before {
  content: "\f002";
}
.fa-envelope-o:before {
  content: "\f003";
}
.fa-heart:before {
  content: "\f004";
}
.fa-star:before {
  content: "\f005";
}
.fa-star-o:before {
  content: "\f006";
}
.fa-user:before {
  content: "\f007";
}
.fa-film:before {
  content: "\f008";
}
.fa-th-large:before {
  content: "\f009";
}
.fa-th:before {
  content: "\f00a";
}
.fa-th-list:before {
  content: "\f00b";
}
.fa-check:before {
  content: "\f00c";
}
.fa-remove:before,
.fa-close:before,
.fa-times:before {
  content: "\f00d";
}
.fa-search-plus:before {
  content: "\f00e";
}
.fa-search-minus:before {
  content: "\f010";
}
.fa-power-off:before {
  content: "\f011";
}
.fa-signal:before {
  content: "\f012";
}
.fa-gear:before,
.fa-cog:before {
  content: "\f013";
}
.fa-trash-o:before {
  content: "\f014";
}
.fa-home:before {
  content: "\f015";
}
.fa-file-o:before {
  content: "\f016";
}
.fa-clock-o:before {
  content: "\f017";
}
.fa-road:before {
  content: "\f018";
}
.fa-download:before {
  content: "\f019";
}
.fa-arrow-circle-o-down:before {
  content: "\f01a";
}
.fa-arrow-circle-o-up:before {
  content: "\f01b";
}
.fa-inbox:before {
  content: "\f01c";
}
.fa-play-circle-o:before {
  content: "\f01d";
}
.fa-rotate-right:before,
.fa-repeat:before {
  content: "\f01e";
}
.fa-refresh:before {
  content: "\f021";
}
.fa-list-alt:before {
  content: "\f022";
}
.fa-lock:before {
  content: "\f023";
}
.fa-flag:before {
  content: "\f024";
}
.fa-headphones:before {
  content: "\f025";
}
.fa-volume-off:before {
  content: "\f026";
}
.fa-volume-down:before {
  content: "\f027";
}
.fa-volume-up:before {
  content: "\f028";
}
.fa-qrcode:before {
  content: "\f029";
}
.fa-barcode:before {
  content: "\f02a";
}
.fa-tag:before {
  content: "\f02b";
}
.fa-tags:before {
  content: "\f02c";
}
.fa-book:before {
  content: "\f02d";
}
.fa-bookmark:before {
  content: "\f02e";
}
.fa-print:before {
  content: "\f02f";
}
.fa-camera:before {
  content: "\f030";
}
.fa-font:before {
  content: "\f031";
}
.fa-bold:before {
  content: "\f032";
}
.fa-italic:before {
  content: "\f033";
}
.fa-text-height:before {
  content: "\f034";
}
.fa-text-width:before {
  content: "\f035";
}
.fa-align-left:before {
  content: "\f036";
}
.fa-align-center:before {
  content: "\f037";
}
.fa-align-right:before {
  content: "\f038";
}
.fa-align-justify:before {
  content: "\f039";
}
.fa-list:before {
  content: "\f03a";
}
.fa-dedent:before,
.fa-outdent:before {
  content: "\f03b";
}
.fa-indent:before {
  content: "\f03c";
}
.fa-video-camera:before {
  content: "\f03d";
}
.fa-photo:before,
.fa-image:before,
.fa-picture-o:before {
  content: "\f03e";
}
.fa-pencil:before {
  content: "\f040";
}
.fa-map-marker:before {
  content: "\f041";
}
.fa-adjust:before {
  content: "\f042";
}
.fa-tint:before {
  content: "\f043";
}
.fa-edit:before,
.fa-pencil-square-o:before {
  content: "\f044";
}
.fa-share-square-o:before {
  content: "\f045";
}
.fa-check-square-o:before {
  content: "\f046";
}
.fa-arrows:before {
  content: "\f047";
}
.fa-step-backward:before {
  content: "\f048";
}
.fa-fast-backward:before {
  content: "\f049";
}
.fa-backward:before {
  content: "\f04a";
}
.fa-play:before {
  content: "\f04b";
}
.fa-pause:before {
  content: "\f04c";
}
.fa-stop:before {
  content: "\f04d";
}
.fa-forward:before {
  content: "\f04e";
}
.fa-fast-forward:before {
  content: "\f050";
}
.fa-step-forward:before {
  content: "\f051";
}
.fa-eject:before {
  content: "\f052";
}
.fa-chevron-left:before {
  content: "\f053";
}
.fa-chevron-right:before {
  content: "\f054";
}
.fa-plus-circle:before {
  content: "\f055";
}
.fa-minus-circle:before {
  content: "\f056";
}
.fa-times-circle:before {
  content: "\f057";
}
.fa-check-circle:before {
  content: "\f058";
}
.fa-question-circle:before {
  content: "\f059";
}
.fa-info-circle:before {
  content: "\f05a";
}
.fa-crosshairs:before {
  content: "\f05b";
}
.fa-times-circle-o:before {
  content: "\f05c";
}
.fa-check-circle-o:before {
  content: "\f05d";
}
.fa-ban:before {
  content: "\f05e";
}
.fa-arrow-left:before {
  content: "\f060";
}
.fa-arrow-right:before {
  content: "\f061";
}
.fa-arrow-up:before {
  content: "\f062";
}
.fa-arrow-down:before {
  content: "\f063";
}
.fa-mail-forward:before,
.fa-share:before {
  content: "\f064";
}
.fa-expand:before {
  content: "\f065";
}
.fa-compress:before {
  content: "\f066";
}
.fa-plus:before {
  content: "\f067";
}
.fa-minus:before {
  content: "\f068";
}
.fa-asterisk:before {
  content: "\f069";
}
.fa-exclamation-circle:before {
  content: "\f06a";
}
.fa-gift:before {
  content: "\f06b";
}
.fa-leaf:before {
  content: "\f06c";
}
.fa-fire:before {
  content: "\f06d";
}
.fa-eye:before {
  content: "\f06e";
}
.fa-eye-slash:before {
  content: "\f070";
}
.fa-warning:before,
.fa-exclamation-triangle:before {
  content: "\f071";
}
.fa-plane:before {
  content: "\f072";
}
.fa-calendar:before {
  content: "\f073";
}
.fa-random:before {
  content: "\f074";
}
.fa-comment:before {
  content: "\f075";
}
.fa-magnet:before {
  content: "\f076";
}
.fa-chevron-up:before {
  content: "\f077";
}
.fa-chevron-down:before {
  content: "\f078";
}
.fa-retweet:before {
  content: "\f079";
}
.fa-shopping-cart:before {
  content: "\f07a";
}
.fa-folder:before {
  content: "\f07b";
}
.fa-folder-open:before {
  content: "\f07c";
}
.fa-arrows-v:before {
  content: "\f07d";
}
.fa-arrows-h:before {
  content: "\f07e";
}
.fa-bar-chart-o:before,
.fa-bar-chart:before {
  content: "\f080";
}
.fa-twitter-square:before {
  content: "\f081";
}
.fa-facebook-square:before {
  content: "\f082";
}
.fa-camera-retro:before {
  content: "\f083";
}
.fa-key:before {
  content: "\f084";
}
.fa-gears:before,
.fa-cogs:before {
  content: "\f085";
}
.fa-comments:before {
  content: "\f086";
}
.fa-thumbs-o-up:before {
  content: "\f087";
}
.fa-thumbs-o-down:before {
  content: "\f088";
}
.fa-star-half:before {
  content: "\f089";
}
.fa-heart-o:before {
  content: "\f08a";
}
.fa-sign-out:before {
  content: "\f08b";
}
.fa-linkedin-square:before {
  content: "\f08c";
}
.fa-thumb-tack:before {
  content: "\f08d";
}
.fa-external-link:before {
  content: "\f08e";
}
.fa-sign-in:before {
  content: "\f090";
}
.fa-trophy:before {
  content: "\f091";
}
.fa-github-square:before {
  content: "\f092";
}
.fa-upload:before {
  content: "\f093";
}
.fa-lemon-o:before {
  content: "\f094";
}
.fa-phone:before {
  content: "\f095";
}
.fa-square-o:before {
  content: "\f096";
}
.fa-bookmark-o:before {
  content: "\f097";
}
.fa-phone-square:before {
  content: "\f098";
}
.fa-twitter:before {
  content: "\f099";
}
.fa-facebook-f:before,
.fa-facebook:before {
  content: "\f09a";
}
.fa-github:before {
  content: "\f09b";
}
.fa-unlock:before {
  content: "\f09c";
}
.fa-credit-card:before {
  content: "\f09d";
}
.fa-feed:before,
.fa-rss:before {
  content: "\f09e";
}
.fa-hdd-o:before {
  content: "\f0a0";
}
.fa-bullhorn:before {
  content: "\f0a1";
}
.fa-bell:before {
  content: "\f0f3";
}
.fa-certificate:before {
  content: "\f0a3";
}
.fa-hand-o-right:before {
  content: "\f0a4";
}
.fa-hand-o-left:before {
  content: "\f0a5";
}
.fa-hand-o-up:before {
  content: "\f0a6";
}
.fa-hand-o-down:before {
  content: "\f0a7";
}
.fa-arrow-circle-left:before {
  content: "\f0a8";
}
.fa-arrow-circle-right:before {
  content: "\f0a9";
}
.fa-arrow-circle-up:before {
  content: "\f0aa";
}
.fa-arrow-circle-down:before {
  content: "\f0ab";
}
.fa-globe:before {
  content: "\f0ac";
}
.fa-wrench:before {
  content: "\f0ad";
}
.fa-tasks:before {
  content: "\f0ae";
}
.fa-filter:before {
  content: "\f0b0";
}
.fa-briefcase:before {
  content: "\f0b1";
}
.fa-arrows-alt:before {
  content: "\f0b2";
}
.fa-group:before,
.fa-users:before {
  content: "\f0c0";
}
.fa-chain:before,
.fa-link:before {
  content: "\f0c1";
}
.fa-cloud:before {
  content: "\f0c2";
}
.fa-flask:before {
  content: "\f0c3";
}
.fa-cut:before,
.fa-scissors:before {
  content: "\f0c4";
}
.fa-copy:before,
.fa-files-o:before {
  content: "\f0c5";
}
.fa-paperclip:before {
  content: "\f0c6";
}
.fa-save:before,
.fa-floppy-o:before {
  content: "\f0c7";
}
.fa-square:before {
  content: "\f0c8";
}
.fa-navicon:before,
.fa-reorder:before,
.fa-bars:before {
  content: "\f0c9";
}
.fa-list-ul:before {
  content: "\f0ca";
}
.fa-list-ol:before {
  content: "\f0cb";
}
.fa-strikethrough:before {
  content: "\f0cc";
}
.fa-underline:before {
  content: "\f0cd";
}
.fa-table:before {
  content: "\f0ce";
}
.fa-magic:before {
  content: "\f0d0";
}
.fa-truck:before {
  content: "\f0d1";
}
.fa-pinterest:before {
  content: "\f0d2";
}
.fa-pinterest-square:before {
  content: "\f0d3";
}
.fa-google-plus-square:before {
  content: "\f0d4";
}
.fa-google-plus:before {
  content: "\f0d5";
}
.fa-money:before {
  content: "\f0d6";
}
.fa-caret-down:before {
  content: "\f0d7";
}
.fa-caret-up:before {
  content: "\f0d8";
}
.fa-caret-left:before {
  content: "\f0d9";
}
.fa-caret-right:before {
  content: "\f0da";
}
.fa-columns:before {
  content: "\f0db";
}
.fa-unsorted:before,
.fa-sort:before {
  content: "\f0dc";
}
.fa-sort-down:before,
.fa-sort-desc:before {
  content: "\f0dd";
}
.fa-sort-up:before,
.fa-sort-asc:before {
  content: "\f0de";
}
.fa-envelope:before {
  content: "\f0e0";
}
.fa-linkedin:before {
  content: "\f0e1";
}
.fa-rotate-left:before,
.fa-undo:before {
  content: "\f0e2";
}
.fa-legal:before,
.fa-gavel:before {
  content: "\f0e3";
}
.fa-dashboard:before,
.fa-tachometer:before {
  content: "\f0e4";
}
.fa-comment-o:before {
  content: "\f0e5";
}
.fa-comments-o:before {
  content: "\f0e6";
}
.fa-flash:before,
.fa-bolt:before {
  content: "\f0e7";
}
.fa-sitemap:before {
  content: "\f0e8";
}
.fa-umbrella:before {
  content: "\f0e9";
}
.fa-paste:before,
.fa-clipboard:before {
  content: "\f0ea";
}
.fa-lightbulb-o:before {
  content: "\f0eb";
}
.fa-exchange:before {
  content: "\f0ec";
}
.fa-cloud-download:before {
  content: "\f0ed";
}
.fa-cloud-upload:before {
  content: "\f0ee";
}
.fa-user-md:before {
  content: "\f0f0";
}
.fa-stethoscope:before {
  content: "\f0f1";
}
.fa-suitcase:before {
  content: "\f0f2";
}
.fa-bell-o:before {
  content: "\f0a2";
}
.fa-coffee:before {
  content: "\f0f4";
}
.fa-cutlery:before {
  content: "\f0f5";
}
.fa-file-text-o:before {
  content: "\f0f6";
}
.fa-building-o:before {
  content: "\f0f7";
}
.fa-hospital-o:before {
  content: "\f0f8";
}
.fa-ambulance:before {
  content: "\f0f9";
}
.fa-medkit:before {
  content: "\f0fa";
}
.fa-fighter-jet:before {
  content: "\f0fb";
}
.fa-beer:before {
  content: "\f0fc";
}
.fa-h-square:before {
  content: "\f0fd";
}
.fa-plus-square:before {
  content: "\f0fe";
}
.fa-angle-double-left:before {
  content: "\f100";
}
.fa-angle-double-right:before {
  content: "\f101";
}
.fa-angle-double-up:before {
  content: "\f102";
}
.fa-angle-double-down:before {
  content: "\f103";
}
.fa-angle-left:before {
  content: "\f104";
}
.fa-angle-right:before {
  content: "\f105";
}
.fa-angle-up:before {
  content: "\f106";
}
.fa-angle-down:before {
  content: "\f107";
}
.fa-desktop:before {
  content: "\f108";
}
.fa-laptop:before {
  content: "\f109";
}
.fa-tablet:before {
  content: "\f10a";
}
.fa-mobile-phone:before,
.fa-mobile:before {
  content: "\f10b";
}
.fa-circle-o:before {
  content: "\f10c";
}
.fa-quote-left:before {
  content: "\f10d";
}
.fa-quote-right:before {
  content: "\f10e";
}
.fa-spinner:before {
  content: "\f110";
}
.fa-circle:before {
  content: "\f111";
}
.fa-mail-reply:before,
.fa-reply:before {
  content: "\f112";
}
.fa-github-alt:before {
  content: "\f113";
}
.fa-folder-o:before {
  content: "\f114";
}
.fa-folder-open-o:before {
  content: "\f115";
}
.fa-smile-o:before {
  content: "\f118";
}
.fa-frown-o:before {
  content: "\f119";
}
.fa-meh-o:before {
  content: "\f11a";
}
.fa-gamepad:before {
  content: "\f11b";
}
.fa-keyboard-o:before {
  content: "\f11c";
}
.fa-flag-o:before {
  content: "\f11d";
}
.fa-flag-checkered:before {
  content: "\f11e";
}
.fa-terminal:before {
  content: "\f120";
}
.fa-code:before {
  content: "\f121";
}
.fa-mail-reply-all:before,
.fa-reply-all:before {
  content: "\f122";
}
.fa-star-half-empty:before,
.fa-star-half-full:before,
.fa-star-half-o:before {
  content: "\f123";
}
.fa-location-arrow:before {
  content: "\f124";
}
.fa-crop:before {
  content: "\f125";
}
.fa-code-fork:before {
  content: "\f126";
}
.fa-unlink:before,
.fa-chain-broken:before {
  content: "\f127";
}
.fa-question:before {
  content: "\f128";
}
.fa-info:before {
  content: "\f129";
}
.fa-exclamation:before {
  content: "\f12a";
}
.fa-superscript:before {
  content: "\f12b";
}
.fa-subscript:before {
  content: "\f12c";
}
.fa-eraser:before {
  content: "\f12d";
}
.fa-puzzle-piece:before {
  content: "\f12e";
}
.fa-microphone:before {
  content: "\f130";
}
.fa-microphone-slash:before {
  content: "\f131";
}
.fa-shield:before {
  content: "\f132";
}
.fa-calendar-o:before {
  content: "\f133";
}
.fa-fire-extinguisher:before {
  content: "\f134";
}
.fa-rocket:before {
  content: "\f135";
}
.fa-maxcdn:before {
  content: "\f136";
}
.fa-chevron-circle-left:before {
  content: "\f137";
}
.fa-chevron-circle-right:before {
  content: "\f138";
}
.fa-chevron-circle-up:before {
  content: "\f139";
}
.fa-chevron-circle-down:before {
  content: "\f13a";
}
.fa-html5:before {
  content: "\f13b";
}
.fa-css3:before {
  content: "\f13c";
}
.fa-anchor:before {
  content: "\f13d";
}
.fa-unlock-alt:before {
  content: "\f13e";
}
.fa-bullseye:before {
  content: "\f140";
}
.fa-ellipsis-h:before {
  content: "\f141";
}
.fa-ellipsis-v:before {
  content: "\f142";
}
.fa-rss-square:before {
  content: "\f143";
}
.fa-play-circle:before {
  content: "\f144";
}
.fa-ticket:before {
  content: "\f145";
}
.fa-minus-square:before {
  content: "\f146";
}
.fa-minus-square-o:before {
  content: "\f147";
}
.fa-level-up:before {
  content: "\f148";
}
.fa-level-down:before {
  content: "\f149";
}
.fa-check-square:before {
  content: "\f14a";
}
.fa-pencil-square:before {
  content: "\f14b";
}
.fa-external-link-square:before {
  content: "\f14c";
}
.fa-share-square:before {
  content: "\f14d";
}
.fa-compass:before {
  content: "\f14e";
}
.fa-toggle-down:before,
.fa-caret-square-o-down:before {
  content: "\f150";
}
.fa-toggle-up:before,
.fa-caret-square-o-up:before {
  content: "\f151";
}
.fa-toggle-right:before,
.fa-caret-square-o-right:before {
  content: "\f152";
}
.fa-euro:before,
.fa-eur:before {
  content: "\f153";
}
.fa-gbp:before {
  content: "\f154";
}
.fa-dollar:before,
.fa-usd:before {
  content: "\f155";
}
.fa-rupee:before,
.fa-inr:before {
  content: "\f156";
}
.fa-cny:before,
.fa-rmb:before,
.fa-yen:before,
.fa-jpy:before {
  content: "\f157";
}
.fa-ruble:before,
.fa-rouble:before,
.fa-rub:before {
  content: "\f158";
}
.fa-won:before,
.fa-krw:before {
  content: "\f159";
}
.fa-bitcoin:before,
.fa-btc:before {
  content: "\f15a";
}
.fa-file:before {
  content: "\f15b";
}
.fa-file-text:before {
  content: "\f15c";
}
.fa-sort-alpha-asc:before {
  content: "\f15d";
}
.fa-sort-alpha-desc:before {
  content: "\f15e";
}
.fa-sort-amount-asc:before {
  content: "\f160";
}
.fa-sort-amount-desc:before {
  content: "\f161";
}
.fa-sort-numeric-asc:before {
  content: "\f162";
}
.fa-sort-numeric-desc:before {
  content: "\f163";
}
.fa-thumbs-up:before {
  content: "\f164";
}
.fa-thumbs-down:before {
  content: "\f165";
}
.fa-youtube-square:before {
  content: "\f166";
}
.fa-youtube:before {
  content: "\f167";
}
.fa-xing:before {
  content: "\f168";
}
.fa-xing-square:before {
  content: "\f169";
}
.fa-youtube-play:before {
  content: "\f16a";
}
.fa-dropbox:before {
  content: "\f16b";
}
.fa-stack-overflow:before {
  content: "\f16c";
}
.fa-instagram:before {
  content: "\f16d";
}
.fa-flickr:before {
  content: "\f16e";
}
.fa-adn:before {
  content: "\f170";
}
.fa-bitbucket:before {
  content: "\f171";
}
.fa-bitbucket-square:before {
  content: "\f172";
}
.fa-tumblr:before {
  content: "\f173";
}
.fa-tumblr-square:before {
  content: "\f174";
}
.fa-long-arrow-down:before {
  content: "\f175";
}
.fa-long-arrow-up:before {
  content: "\f176";
}
.fa-long-arrow-left:before {
  content: "\f177";
}
.fa-long-arrow-right:before {
  content: "\f178";
}
.fa-apple:before {
  content: "\f179";
}
.fa-windows:before {
  content: "\f17a";
}
.fa-android:before {
  content: "\f17b";
}
.fa-linux:before {
  content: "\f17c";
}
.fa-dribbble:before {
  content: "\f17d";
}
.fa-skype:before {
  content: "\f17e";
}
.fa-foursquare:before {
  content: "\f180";
}
.fa-trello:before {
  content: "\f181";
}
.fa-female:before {
  content: "\f182";
}
.fa-male:before {
  content: "\f183";
}
.fa-gittip:before,
.fa-gratipay:before {
  content: "\f184";
}
.fa-sun-o:before {
  content: "\f185";
}
.fa-moon-o:before {
  content: "\f186";
}
.fa-archive:before {
  content: "\f187";
}
.fa-bug:before {
  content: "\f188";
}
.fa-vk:before {
  content: "\f189";
}
.fa-weibo:before {
  content: "\f18a";
}
.fa-renren:before {
  content: "\f18b";
}
.fa-pagelines:before {
  content: "\f18c";
}
.fa-stack-exchange:before {
  content: "\f18d";
}
.fa-arrow-circle-o-right:before {
  content: "\f18e";
}
.fa-arrow-circle-o-left:before {
  content: "\f190";
}
.fa-toggle-left:before,
.fa-caret-square-o-left:before {
  content: "\f191";
}
.fa-dot-circle-o:before {
  content: "\f192";
}
.fa-wheelchair:before {
  content: "\f193";
}
.fa-vimeo-square:before {
  content: "\f194";
}
.fa-turkish-lira:before,
.fa-try:before {
  content: "\f195";
}
.fa-plus-square-o:before {
  content: "\f196";
}
.fa-space-shuttle:before {
  content: "\f197";
}
.fa-slack:before {
  content: "\f198";
}
.fa-envelope-square:before {
  content: "\f199";
}
.fa-wordpress:before {
  content: "\f19a";
}
.fa-openid:before {
  content: "\f19b";
}
.fa-institution:before,
.fa-bank:before,
.fa-university:before {
  content: "\f19c";
}
.fa-mortar-board:before,
.fa-graduation-cap:before {
  content: "\f19d";
}
.fa-yahoo:before {
  content: "\f19e";
}
.fa-google:before {
  content: "\f1a0";
}
.fa-reddit:before {
  content: "\f1a1";
}
.fa-reddit-square:before {
  content: "\f1a2";
}
.fa-stumbleupon-circle:before {
  content: "\f1a3";
}
.fa-stumbleupon:before {
  content: "\f1a4";
}
.fa-delicious:before {
  content: "\f1a5";
}
.fa-digg:before {
  content: "\f1a6";
}
.fa-pied-piper-pp:before {
  content: "\f1a7";
}
.fa-pied-piper-alt:before {
  content: "\f1a8";
}
.fa-drupal:before {
  content: "\f1a9";
}
.fa-joomla:before {
  content: "\f1aa";
}
.fa-language:before {
  content: "\f1ab";
}
.fa-fax:before {
  content: "\f1ac";
}
.fa-building:before {
  content: "\f1ad";
}
.fa-child:before {
  content: "\f1ae";
}
.fa-paw:before {
  content: "\f1b0";
}
.fa-spoon:before {
  content: "\f1b1";
}
.fa-cube:before {
  content: "\f1b2";
}
.fa-cubes:before {
  content: "\f1b3";
}
.fa-behance:before {
  content: "\f1b4";
}
.fa-behance-square:before {
  content: "\f1b5";
}
.fa-steam:before {
  content: "\f1b6";
}
.fa-steam-square:before {
  content: "\f1b7";
}
.fa-recycle:before {
  content: "\f1b8";
}
.fa-automobile:before,
.fa-car:before {
  content: "\f1b9";
}
.fa-cab:before,
.fa-taxi:before {
  content: "\f1ba";
}
.fa-tree:before {
  content: "\f1bb";
}
.fa-spotify:before {
  content: "\f1bc";
}
.fa-deviantart:before {
  content: "\f1bd";
}
.fa-soundcloud:before {
  content: "\f1be";
}
.fa-database:before {
  content: "\f1c0";
}
.fa-file-pdf-o:before {
  content: "\f1c1";
}
.fa-file-word-o:before {
  content: "\f1c2";
}
.fa-file-excel-o:before {
  content: "\f1c3";
}
.fa-file-powerpoint-o:before {
  content: "\f1c4";
}
.fa-file-photo-o:before,
.fa-file-picture-o:before,
.fa-file-image-o:before {
  content: "\f1c5";
}
.fa-file-zip-o:before,
.fa-file-archive-o:before {
  content: "\f1c6";
}
.fa-file-sound-o:before,
.fa-file-audio-o:before {
  content: "\f1c7";
}
.fa-file-movie-o:before,
.fa-file-video-o:before {
  content: "\f1c8";
}
.fa-file-code-o:before {
  content: "\f1c9";
}
.fa-vine:before {
  content: "\f1ca";
}
.fa-codepen:before {
  content: "\f1cb";
}
.fa-jsfiddle:before {
  content: "\f1cc";
}
.fa-life-bouy:before,
.fa-life-buoy:before,
.fa-life-saver:before,
.fa-support:before,
.fa-life-ring:before {
  content: "\f1cd";
}
.fa-circle-o-notch:before {
  content: "\f1ce";
}
.fa-ra:before,
.fa-resistance:before,
.fa-rebel:before {
  content: "\f1d0";
}
.fa-ge:before,
.fa-empire:before {
  content: "\f1d1";
}
.fa-git-square:before {
  content: "\f1d2";
}
.fa-git:before {
  content: "\f1d3";
}
.fa-y-combinator-square:before,
.fa-yc-square:before,
.fa-hacker-news:before {
  content: "\f1d4";
}
.fa-tencent-weibo:before {
  content: "\f1d5";
}
.fa-qq:before {
  content: "\f1d6";
}
.fa-wechat:before,
.fa-weixin:before {
  content: "\f1d7";
}
.fa-send:before,
.fa-paper-plane:before {
  content: "\f1d8";
}
.fa-send-o:before,
.fa-paper-plane-o:before {
  content: "\f1d9";
}
.fa-history:before {
  content: "\f1da";
}
.fa-circle-thin:before {
  content: "\f1db";
}
.fa-header:before {
  content: "\f1dc";
}
.fa-paragraph:before {
  content: "\f1dd";
}
.fa-sliders:before {
  content: "\f1de";
}
.fa-share-alt:before {
  content: "\f1e0";
}
.fa-share-alt-square:before {
  content: "\f1e1";
}
.fa-bomb:before {
  content: "\f1e2";
}
.fa-soccer-ball-o:before,
.fa-futbol-o:before {
  content: "\f1e3";
}
.fa-tty:before {
  content: "\f1e4";
}
.fa-binoculars:before {
  content: "\f1e5";
}
.fa-plug:before {
  content: "\f1e6";
}
.fa-slideshare:before {
  content: "\f1e7";
}
.fa-twitch:before {
  content: "\f1e8";
}
.fa-yelp:before {
  content: "\f1e9";
}
.fa-newspaper-o:before {
  content: "\f1ea";
}
.fa-wifi:before {
  content: "\f1eb";
}
.fa-calculator:before {
  content: "\f1ec";
}
.fa-paypal:before {
  content: "\f1ed";
}
.fa-google-wallet:before {
  content: "\f1ee";
}
.fa-cc-visa:before {
  content: "\f1f0";
}
.fa-cc-mastercard:before {
  content: "\f1f1";
}
.fa-cc-discover:before {
  content: "\f1f2";
}
.fa-cc-amex:before {
  content: "\f1f3";
}
.fa-cc-paypal:before {
  content: "\f1f4";
}
.fa-cc-stripe:before {
  content: "\f1f5";
}
.fa-bell-slash:before {
  content: "\f1f6";
}
.fa-bell-slash-o:before {
  content: "\f1f7";
}
.fa-trash:before {
  content: "\f1f8";
}
.fa-copyright:before {
  content: "\f1f9";
}
.fa-at:before {
  content: "\f1fa";
}
.fa-eyedropper:before {
  content: "\f1fb";
}
.fa-paint-brush:before {
  content: "\f1fc";
}
.fa-birthday-cake:before {
  content: "\f1fd";
}
.fa-area-chart:before {
  content: "\f1fe";
}
.fa-pie-chart:before {
  content: "\f200";
}
.fa-line-chart:before {
  content: "\f201";
}
.fa-lastfm:before {
  content: "\f202";
}
.fa-lastfm-square:before {
  content: "\f203";
}
.fa-toggle-off:before {
  content: "\f204";
}
.fa-toggle-on:before {
  content: "\f205";
}
.fa-bicycle:before {
  content: "\f206";
}
.fa-bus:before {
  content: "\f207";
}
.fa-ioxhost:before {
  content: "\f208";
}
.fa-angellist:before {
  content: "\f209";
}
.fa-cc:before {
  content: "\f20a";
}
.fa-shekel:before,
.fa-sheqel:before,
.fa-ils:before {
  content: "\f20b";
}
.fa-meanpath:before {
  content: "\f20c";
}
.fa-buysellads:before {
  content: "\f20d";
}
.fa-connectdevelop:before {
  content: "\f20e";
}
.fa-dashcube:before {
  content: "\f210";
}
.fa-forumbee:before {
  content: "\f211";
}
.fa-leanpub:before {
  content: "\f212";
}
.fa-sellsy:before {
  content: "\f213";
}
.fa-shirtsinbulk:before {
  content: "\f214";
}
.fa-simplybuilt:before {
  content: "\f215";
}
.fa-skyatlas:before {
  content: "\f216";
}
.fa-cart-plus:before {
  content: "\f217";
}
.fa-cart-arrow-down:before {
  content: "\f218";
}
.fa-diamond:before {
  content: "\f219";
}
.fa-ship:before {
  content: "\f21a";
}
.fa-user-secret:before {
  content: "\f21b";
}
.fa-motorcycle:before {
  content: "\f21c";
}
.fa-street-view:before {
  content: "\f21d";
}
.fa-heartbeat:before {
  content: "\f21e";
}
.fa-venus:before {
  content: "\f221";
}
.fa-mars:before {
  content: "\f222";
}
.fa-mercury:before {
  content: "\f223";
}
.fa-intersex:before,
.fa-transgender:before {
  content: "\f224";
}
.fa-transgender-alt:before {
  content: "\f225";
}
.fa-venus-double:before {
  content: "\f226";
}
.fa-mars-double:before {
  content: "\f227";
}
.fa-venus-mars:before {
  content: "\f228";
}
.fa-mars-stroke:before {
  content: "\f229";
}
.fa-mars-stroke-v:before {
  content: "\f22a";
}
.fa-mars-stroke-h:before {
  content: "\f22b";
}
.fa-neuter:before {
  content: "\f22c";
}
.fa-genderless:before {
  content: "\f22d";
}
.fa-facebook-official:before {
  content: "\f230";
}
.fa-pinterest-p:before {
  content: "\f231";
}
.fa-whatsapp:before {
  content: "\f232";
}
.fa-server:before {
  content: "\f233";
}
.fa-user-plus:before {
  content: "\f234";
}
.fa-user-times:before {
  content: "\f235";
}
.fa-hotel:before,
.fa-bed:before {
  content: "\f236";
}
.fa-viacoin:before {
  content: "\f237";
}
.fa-train:before {
  content: "\f238";
}
.fa-subway:before {
  content: "\f239";
}
.fa-medium:before {
  content: "\f23a";
}
.fa-yc:before,
.fa-y-combinator:before {
  content: "\f23b";
}
.fa-optin-monster:before {
  content: "\f23c";
}
.fa-opencart:before {
  content: "\f23d";
}
.fa-expeditedssl:before {
  content: "\f23e";
}
.fa-battery-4:before,
.fa-battery:before,
.fa-battery-full:before {
  content: "\f240";
}
.fa-battery-3:before,
.fa-battery-three-quarters:before {
  content: "\f241";
}
.fa-battery-2:before,
.fa-battery-half:before {
  content: "\f242";
}
.fa-battery-1:before,
.fa-battery-quarter:before {
  content: "\f243";
}
.fa-battery-0:before,
.fa-battery-empty:before {
  content: "\f244";
}
.fa-mouse-pointer:before {
  content: "\f245";
}
.fa-i-cursor:before {
  content: "\f246";
}
.fa-object-group:before {
  content: "\f247";
}
.fa-object-ungroup:before {
  content: "\f248";
}
.fa-sticky-note:before {
  content: "\f249";
}
.fa-sticky-note-o:before {
  content: "\f24a";
}
.fa-cc-jcb:before {
  content: "\f24b";
}
.fa-cc-diners-club:before {
  content: "\f24c";
}
.fa-clone:before {
  content: "\f24d";
}
.fa-balance-scale:before {
  content: "\f24e";
}
.fa-hourglass-o:before {
  content: "\f250";
}
.fa-hourglass-1:before,
.fa-hourglass-start:before {
  content: "\f251";
}
.fa-hourglass-2:before,
.fa-hourglass-half:before {
  content: "\f252";
}
.fa-hourglass-3:before,
.fa-hourglass-end:before {
  content: "\f253";
}
.fa-hourglass:before {
  content: "\f254";
}
.fa-hand-grab-o:before,
.fa-hand-rock-o:before {
  content: "\f255";
}
.fa-hand-stop-o:before,
.fa-hand-paper-o:before {
  content: "\f256";
}
.fa-hand-scissors-o:before {
  content: "\f257";
}
.fa-hand-lizard-o:before {
  content: "\f258";
}
.fa-hand-spock-o:before {
  content: "\f259";
}
.fa-hand-pointer-o:before {
  content: "\f25a";
}
.fa-hand-peace-o:before {
  content: "\f25b";
}
.fa-trademark:before {
  content: "\f25c";
}
.fa-registered:before {
  content: "\f25d";
}
.fa-creative-commons:before {
  content: "\f25e";
}
.fa-gg:before {
  content: "\f260";
}
.fa-gg-circle:before {
  content: "\f261";
}
.fa-tripadvisor:before {
  content: "\f262";
}
.fa-odnoklassniki:before {
  content: "\f263";
}
.fa-odnoklassniki-square:before {
  content: "\f264";
}
.fa-get-pocket:before {
  content: "\f265";
}
.fa-wikipedia-w:before {
  content: "\f266";
}
.fa-safari:before {
  content: "\f267";
}
.fa-chrome:before {
  content: "\f268";
}
.fa-firefox:before {
  content: "\f269";
}
.fa-opera:before {
  content: "\f26a";
}
.fa-internet-explorer:before {
  content: "\f26b";
}
.fa-tv:before,
.fa-television:before {
  content: "\f26c";
}
.fa-contao:before {
  content: "\f26d";
}
.fa-500px:before {
  content: "\f26e";
}
.fa-amazon:before {
  content: "\f270";
}
.fa-calendar-plus-o:before {
  content: "\f271";
}
.fa-calendar-minus-o:before {
  content: "\f272";
}
.fa-calendar-times-o:before {
  content: "\f273";
}
.fa-calendar-check-o:before {
  content: "\f274";
}
.fa-industry:before {
  content: "\f275";
}
.fa-map-pin:before {
  content: "\f276";
}
.fa-map-signs:before {
  content: "\f277";
}
.fa-map-o:before {
  content: "\f278";
}
.fa-map:before {
  content: "\f279";
}
.fa-commenting:before {
  content: "\f27a";
}
.fa-commenting-o:before {
  content: "\f27b";
}
.fa-houzz:before {
  content: "\f27c";
}
.fa-vimeo:before {
  content: "\f27d";
}
.fa-black-tie:before {
  content: "\f27e";
}
.fa-fonticons:before {
  content: "\f280";
}
.fa-reddit-alien:before {
  content: "\f281";
}
.fa-edge:before {
  content: "\f282";
}
.fa-credit-card-alt:before {
  content: "\f283";
}
.fa-codiepie:before {
  content: "\f284";
}
.fa-modx:before {
  content: "\f285";
}
.fa-fort-awesome:before {
  content: "\f286";
}
.fa-usb:before {
  content: "\f287";
}
.fa-product-hunt:before {
  content: "\f288";
}
.fa-mixcloud:before {
  content: "\f289";
}
.fa-scribd:before {
  content: "\f28a";
}
.fa-pause-circle:before {
  content: "\f28b";
}
.fa-pause-circle-o:before {
  content: "\f28c";
}
.fa-stop-circle:before {
  content: "\f28d";
}
.fa-stop-circle-o:before {
  content: "\f28e";
}
.fa-shopping-bag:before {
  content: "\f290";
}
.fa-shopping-basket:before {
  content: "\f291";
}
.fa-hashtag:before {
  content: "\f292";
}
.fa-bluetooth:before {
  content: "\f293";
}
.fa-bluetooth-b:before {
  content: "\f294";
}
.fa-percent:before {
  content: "\f295";
}
.fa-gitlab:before {
  content: "\f296";
}
.fa-wpbeginner:before {
  content: "\f297";
}
.fa-wpforms:before {
  content: "\f298";
}
.fa-envira:before {
  content: "\f299";
}
.fa-universal-access:before {
  content: "\f29a";
}
.fa-wheelchair-alt:before {
  content: "\f29b";
}
.fa-question-circle-o:before {
  content: "\f29c";
}
.fa-blind:before {
  content: "\f29d";
}
.fa-audio-description:before {
  content: "\f29e";
}
.fa-volume-control-phone:before {
  content: "\f2a0";
}
.fa-braille:before {
  content: "\f2a1";
}
.fa-assistive-listening-systems:before {
  content: "\f2a2";
}
.fa-asl-interpreting:before,
.fa-american-sign-language-interpreting:before {
  content: "\f2a3";
}
.fa-deafness:before,
.fa-hard-of-hearing:before,
.fa-deaf:before {
  content: "\f2a4";
}
.fa-glide:before {
  content: "\f2a5";
}
.fa-glide-g:before {
  content: "\f2a6";
}
.fa-signing:before,
.fa-sign-language:before {
  content: "\f2a7";
}
.fa-low-vision:before {
  content: "\f2a8";
}
.fa-viadeo:before {
  content: "\f2a9";
}
.fa-viadeo-square:before {
  content: "\f2aa";
}
.fa-snapchat:before {
  content: "\f2ab";
}
.fa-snapchat-ghost:before {
  content: "\f2ac";
}
.fa-snapchat-square:before {
  content: "\f2ad";
}
.fa-pied-piper:before {
  content: "\f2ae";
}
.fa-first-order:before {
  content: "\f2b0";
}
.fa-yoast:before {
  content: "\f2b1";
}
.fa-themeisle:before {
  content: "\f2b2";
}
.fa-google-plus-circle:before,
.fa-google-plus-official:before {
  content: "\f2b3";
}
.fa-fa:before,
.fa-font-awesome:before {
  content: "\f2b4";
}
.fa-handshake-o:before {
  content: "\f2b5";
}
.fa-envelope-open:before {
  content: "\f2b6";
}
.fa-envelope-open-o:before {
  content: "\f2b7";
}
.fa-linode:before {
  content: "\f2b8";
}
.fa-address-book:before {
  content: "\f2b9";
}
.fa-address-book-o:before {
  content: "\f2ba";
}
.fa-vcard:before,
.fa-address-card:before {
  content: "\f2bb";
}
.fa-vcard-o:before,
.fa-address-card-o:before {
  content: "\f2bc";
}
.fa-user-circle:before {
  content: "\f2bd";
}
.fa-user-circle-o:before {
  content: "\f2be";
}
.fa-user-o:before {
  content: "\f2c0";
}
.fa-id-badge:before {
  content: "\f2c1";
}
.fa-drivers-license:before,
.fa-id-card:before {
  content: "\f2c2";
}
.fa-drivers-license-o:before,
.fa-id-card-o:before {
  content: "\f2c3";
}
.fa-quora:before {
  content: "\f2c4";
}
.fa-free-code-camp:before {
  content: "\f2c5";
}
.fa-telegram:before {
  content: "\f2c6";
}
.fa-thermometer-4:before,
.fa-thermometer:before,
.fa-thermometer-full:before {
  content: "\f2c7";
}
.fa-thermometer-3:before,
.fa-thermometer-three-quarters:before {
  content: "\f2c8";
}
.fa-thermometer-2:before,
.fa-thermometer-half:before {
  content: "\f2c9";
}
.fa-thermometer-1:before,
.fa-thermometer-quarter:before {
  content: "\f2ca";
}
.fa-thermometer-0:before,
.fa-thermometer-empty:before {
  content: "\f2cb";
}
.fa-shower:before {
  content: "\f2cc";
}
.fa-bathtub:before,
.fa-s15:before,
.fa-bath:before {
  content: "\f2cd";
}
.fa-podcast:before {
  content: "\f2ce";
}
.fa-window-maximize:before {
  content: "\f2d0";
}
.fa-window-minimize:before {
  content: "\f2d1";
}
.fa-window-restore:before {
  content: "\f2d2";
}
.fa-times-rectangle:before,
.fa-window-close:before {
  content: "\f2d3";
}
.fa-times-rectangle-o:before,
.fa-window-close-o:before {
  content: "\f2d4";
}
.fa-bandcamp:before {
  content: "\f2d5";
}
.fa-grav:before {
  content: "\f2d6";
}
.fa-etsy:before {
  content: "\f2d7";
}
.fa-imdb:before {
  content: "\f2d8";
}
.fa-ravelry:before {
  content: "\f2d9";
}
.fa-eercast:before {
  content: "\f2da";
}
.fa-microchip:before {
  content: "\f2db";
}
.fa-snowflake-o:before {
  content: "\f2dc";
}
.fa-superpowers:before {
  content: "\f2dd";
}
.fa-wpexplorer:before {
  content: "\f2de";
}
.fa-meetup:before {
  content: "\f2e0";
}
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  border: 0;
}
.sr-only-focusable:active,
.sr-only-focusable:focus {
  position: static;
  width: auto;
  height: auto;
  margin: 0;
  overflow: visible;
  clip: auto;
}

Added gc_lang/fr/webext/3rd/font-awesome-4.7.0/css/font-awesome.min.css version [154d4d3cc7].









>
>
>
>
1
2
3
4
/*!
 *  Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
 *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
 */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}

Added gc_lang/fr/webext/3rd/font-awesome-4.7.0/fonts/FontAwesome.otf version [78d7cdf31e].

cannot compute difference between binary files

Added gc_lang/fr/webext/3rd/font-awesome-4.7.0/fonts/fontawesome-webfont.eot version [92a5301653].

cannot compute difference between binary files

Added gc_lang/fr/webext/3rd/font-awesome-4.7.0/fonts/fontawesome-webfont.svg version [0a2bac3732].































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg>
<metadata>
Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016
 By ,,,
Copyright Dave Gandy 2016. All rights reserved.
</metadata>
<defs>
<font id="FontAwesome" horiz-adv-x="1536" >
  <font-face 
    font-family="FontAwesome"
    font-weight="400"
    font-stretch="normal"
    units-per-em="1792"
    panose-1="0 0 0 0 0 0 0 0 0 0"
    ascent="1536"
    descent="-256"
    bbox="-1.02083 -256.962 2304.6 1537.02"
    underline-thickness="0"
    underline-position="0"
    unicode-range="U+0020-F500"
  />
<missing-glyph horiz-adv-x="896" 
d="M224 112h448v1312h-448v-1312zM112 0v1536h672v-1536h-672z" />
    <glyph glyph-name=".notdef" horiz-adv-x="896" 
d="M224 112h448v1312h-448v-1312zM112 0v1536h672v-1536h-672z" />
    <glyph glyph-name=".null" horiz-adv-x="0" 
 />
    <glyph glyph-name="nonmarkingreturn" horiz-adv-x="597" 
 />
    <glyph glyph-name="space" unicode=" " horiz-adv-x="448" 
 />
    <glyph glyph-name="dieresis" unicode="&#xa8;" horiz-adv-x="1792" 
 />
    <glyph glyph-name="copyright" unicode="&#xa9;" horiz-adv-x="1792" 
 />
    <glyph glyph-name="registered" unicode="&#xae;" horiz-adv-x="1792" 
 />
    <glyph glyph-name="acute" unicode="&#xb4;" horiz-adv-x="1792" 
 />
    <glyph glyph-name="AE" unicode="&#xc6;" horiz-adv-x="1792" 
 />
    <glyph glyph-name="Oslash" unicode="&#xd8;" horiz-adv-x="1792" 
 />
    <glyph glyph-name="trademark" unicode="&#x2122;" horiz-adv-x="1792" 
 />
    <glyph glyph-name="infinity" unicode="&#x221e;" horiz-adv-x="1792" 
 />
    <glyph glyph-name="notequal" unicode="&#x2260;" horiz-adv-x="1792" 
 />
    <glyph glyph-name="glass" unicode="&#xf000;" horiz-adv-x="1792" 
d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" />
    <glyph glyph-name="music" unicode="&#xf001;" 
d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89
t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" />
    <glyph glyph-name="search" unicode="&#xf002;" horiz-adv-x="1664" 
d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5
t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
    <glyph glyph-name="envelope" unicode="&#xf003;" horiz-adv-x="1792" 
d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13
t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z
M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
    <glyph glyph-name="heart" unicode="&#xf004;" horiz-adv-x="1792" 
d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600
q-18 -18 -44 -18z" />
    <glyph glyph-name="star" unicode="&#xf005;" horiz-adv-x="1664" 
d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455
l502 -73q56 -9 56 -46z" />
    <glyph glyph-name="star_empty" unicode="&#xf006;" horiz-adv-x="1664" 
d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500
l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
    <glyph glyph-name="user" unicode="&#xf007;" horiz-adv-x="1280" 
d="M1280 137q0 -109 -62.5 -187t-150.5 -78h-854q-88 0 -150.5 78t-62.5 187q0 85 8.5 160.5t31.5 152t58.5 131t94 89t134.5 34.5q131 -128 313 -128t313 128q76 0 134.5 -34.5t94 -89t58.5 -131t31.5 -152t8.5 -160.5zM1024 1024q0 -159 -112.5 -271.5t-271.5 -112.5
t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
    <glyph glyph-name="film" unicode="&#xf008;" horiz-adv-x="1920" 
d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128
q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45
t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128
q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19
t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
    <glyph glyph-name="th_large" unicode="&#xf009;" horiz-adv-x="1664" 
d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38
h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
    <glyph glyph-name="th" unicode="&#xf00a;" horiz-adv-x="1792" 
d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320
q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28
h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192
q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" />
    <glyph glyph-name="th_list" unicode="&#xf00b;" horiz-adv-x="1792" 
d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960
q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28
h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" />
    <glyph glyph-name="ok" unicode="&#xf00c;" horiz-adv-x="1792" 
d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" />
    <glyph glyph-name="remove" unicode="&#xf00d;" horiz-adv-x="1408" 
d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68
t-28 -68l-294 -294l294 -294q28 -28 28 -68z" />
    <glyph glyph-name="zoom_in" unicode="&#xf00e;" horiz-adv-x="1664" 
d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224
q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5
t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
    <glyph glyph-name="zoom_out" unicode="&#xf010;" horiz-adv-x="1664" 
d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z
M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z
" />
    <glyph glyph-name="off" unicode="&#xf011;" 
d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5
t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" />
    <glyph glyph-name="signal" unicode="&#xf012;" horiz-adv-x="1792" 
d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23
v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" />
    <glyph glyph-name="cog" unicode="&#xf013;" 
d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38
q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13
l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22
q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" />
    <glyph glyph-name="trash" unicode="&#xf014;" horiz-adv-x="1408" 
d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576
q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832
q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
    <glyph glyph-name="home" unicode="&#xf015;" horiz-adv-x="1664" 
d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5
l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" />
    <glyph glyph-name="file_alt" unicode="&#xf016;" 
d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
" />
    <glyph glyph-name="time" unicode="&#xf017;" 
d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640
q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="road" unicode="&#xf018;" horiz-adv-x="1920" 
d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256
q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" />
    <glyph glyph-name="download_alt" unicode="&#xf019;" horiz-adv-x="1664" 
d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136
q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" />
    <glyph glyph-name="download" unicode="&#xf01a;" 
d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273
t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="upload" unicode="&#xf01b;" 
d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198
t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="inbox" unicode="&#xf01c;" 
d="M1023 576h316q-1 3 -2.5 8.5t-2.5 7.5l-212 496h-708l-212 -496q-1 -3 -2.5 -8.5t-2.5 -7.5h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552
q25 -61 25 -123z" />
    <glyph glyph-name="play_circle" unicode="&#xf01d;" 
d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640
q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="repeat" unicode="&#xf01e;" 
d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q15 0 25 -9
l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" />
    <glyph glyph-name="refresh" unicode="&#xf021;" 
d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117
q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5
q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" />
    <glyph glyph-name="list_alt" unicode="&#xf022;" horiz-adv-x="1792" 
d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z
M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5
t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47
t47 -113z" />
    <glyph glyph-name="lock" unicode="&#xf023;" horiz-adv-x="1152" 
d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" />
    <glyph glyph-name="flag" unicode="&#xf024;" horiz-adv-x="1792" 
d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48
t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" />
    <glyph glyph-name="headphones" unicode="&#xf025;" horiz-adv-x="1664" 
d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78
t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5
t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" />
    <glyph glyph-name="volume_off" unicode="&#xf026;" horiz-adv-x="768" 
d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" />
    <glyph glyph-name="volume_down" unicode="&#xf027;" horiz-adv-x="1152" 
d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 36
t12 56.5t-12 56.5t-29 36t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" />
    <glyph glyph-name="volume_up" unicode="&#xf028;" horiz-adv-x="1664" 
d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 36
t12 56.5t-12 56.5t-29 36t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5
t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289
t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" />
    <glyph glyph-name="qrcode" unicode="&#xf029;" horiz-adv-x="1408" 
d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z
M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" />
    <glyph glyph-name="barcode" unicode="&#xf02a;" horiz-adv-x="1792" 
d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z
M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" />
    <glyph glyph-name="tag" unicode="&#xf02b;" 
d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5
l715 -714q37 -39 37 -91z" />
    <glyph glyph-name="tags" unicode="&#xf02c;" horiz-adv-x="1920" 
d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5
l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" />
    <glyph glyph-name="book" unicode="&#xf02d;" horiz-adv-x="1664" 
d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23
q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906
q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5
t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
    <glyph glyph-name="bookmark" unicode="&#xf02e;" horiz-adv-x="1280" 
d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
    <glyph glyph-name="print" unicode="&#xf02f;" horiz-adv-x="1664" 
d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68
v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" />
    <glyph glyph-name="camera" unicode="&#xf030;" horiz-adv-x="1920" 
d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136
q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
    <glyph glyph-name="font" unicode="&#xf031;" horiz-adv-x="1664" 
d="M725 977l-170 -450q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452zM0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57
q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -5 -0.5 -13.5t-0.5 -12.5q-63 0 -190 8t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5
q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14z" />
    <glyph glyph-name="bold" unicode="&#xf032;" horiz-adv-x="1408" 
d="M555 15q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5t4.5 -83.5t12 -66.5zM541 761q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142
q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13q0 -50 4 -151t4 -152q0 -27 -0.5 -80t-0.5 -79q0 -46 1 -69zM0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5
t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68 -0.5t68 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5
t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12z" />
    <glyph glyph-name="italic" unicode="&#xf033;" horiz-adv-x="1024" 
d="M0 -126l17 85q22 7 61.5 16.5t72 19t59.5 23.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5
q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" />
    <glyph glyph-name="text_height" unicode="&#xf034;" horiz-adv-x="1792" 
d="M1744 128q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80zM81 1407l54 -27q12 -5 211 -5q44 0 132 2
t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5
q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27
q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44v383z" />
    <glyph glyph-name="text_width" unicode="&#xf035;" 
d="M81 1407l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1t-103 1
t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27
q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44v383zM1310 125q12 0 42 -19.5t57.5 -41.5
t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49
t26 49q4 3 36 30t59.5 49t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5z" />
    <glyph glyph-name="align_left" unicode="&#xf036;" horiz-adv-x="1792" 
d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45
t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
    <glyph glyph-name="align_center" unicode="&#xf037;" horiz-adv-x="1792" 
d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19
h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" />
    <glyph glyph-name="align_right" unicode="&#xf038;" horiz-adv-x="1792" 
d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45
t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
    <glyph glyph-name="align_justify" unicode="&#xf039;" horiz-adv-x="1792" 
d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45
t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
    <glyph glyph-name="list" unicode="&#xf03a;" horiz-adv-x="1792" 
d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5
t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344
q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5
t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192
q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" />
    <glyph glyph-name="indent_left" unicode="&#xf03b;" horiz-adv-x="1792" 
d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5
t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088
q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
    <glyph glyph-name="indent_right" unicode="&#xf03c;" horiz-adv-x="1792" 
d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5
t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088
q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
    <glyph glyph-name="facetime_video" unicode="&#xf03d;" horiz-adv-x="1792" 
d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5
q39 -17 39 -59z" />
    <glyph glyph-name="picture" unicode="&#xf03e;" horiz-adv-x="1920" 
d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216
q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
    <glyph glyph-name="pencil" unicode="&#xf040;" 
d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38
q53 0 91 -38l235 -234q37 -39 37 -91z" />
    <glyph glyph-name="map_marker" unicode="&#xf041;" horiz-adv-x="1024" 
d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" />
    <glyph glyph-name="adjust" unicode="&#xf042;" 
d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="tint" unicode="&#xf043;" horiz-adv-x="1024" 
d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362
q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" />
    <glyph glyph-name="edit" unicode="&#xf044;" horiz-adv-x="1792" 
d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832
q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92
l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" />
    <glyph glyph-name="share" unicode="&#xf045;" horiz-adv-x="1664" 
d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832
q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5
t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" />
    <glyph glyph-name="check" unicode="&#xf046;" horiz-adv-x="1664" 
d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832
q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110
q24 -24 24 -57t-24 -57z" />
    <glyph glyph-name="move" unicode="&#xf047;" horiz-adv-x="1792" 
d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45
t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
    <glyph glyph-name="step_backward" unicode="&#xf048;" horiz-adv-x="1024" 
d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 10 13 19z" />
    <glyph glyph-name="fast_backward" unicode="&#xf049;" horiz-adv-x="1792" 
d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 10 13 19l710 710
q19 19 32 13t13 -32v-710q4 10 13 19z" />
    <glyph glyph-name="backward" unicode="&#xf04a;" horiz-adv-x="1664" 
d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q4 10 13 19z" />
    <glyph glyph-name="play" unicode="&#xf04b;" horiz-adv-x="1408" 
d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" />
    <glyph glyph-name="pause" unicode="&#xf04c;" 
d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" />
    <glyph glyph-name="stop" unicode="&#xf04d;" 
d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
    <glyph glyph-name="forward" unicode="&#xf04e;" horiz-adv-x="1664" 
d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-4 -10 -13 -19z" />
    <glyph glyph-name="fast_forward" unicode="&#xf050;" horiz-adv-x="1792" 
d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v710q0 26 13 32t32 -13l710 -710q9 -9 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-4 -10 -13 -19l-710 -710
q-19 -19 -32 -13t-13 32v710q-4 -10 -13 -19z" />
    <glyph glyph-name="step_forward" unicode="&#xf051;" horiz-adv-x="1024" 
d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-4 -10 -13 -19z" />
    <glyph glyph-name="eject" unicode="&#xf052;" horiz-adv-x="1538" 
d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" />
    <glyph glyph-name="chevron_left" unicode="&#xf053;" horiz-adv-x="1280" 
d="M1171 1235l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45t19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45z" />
    <glyph glyph-name="chevron_right" unicode="&#xf054;" horiz-adv-x="1280" 
d="M1107 659l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45t19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45z" />
    <glyph glyph-name="plus_sign" unicode="&#xf055;" 
d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5
t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="minus_sign" unicode="&#xf056;" 
d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5
t103 -385.5z" />
    <glyph glyph-name="remove_sign" unicode="&#xf057;" 
d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19
q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="ok_sign" unicode="&#xf058;" 
d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103
t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="question_sign" unicode="&#xf059;" 
d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59
q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="info_sign" unicode="&#xf05a;" 
d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23
t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="screenshot" unicode="&#xf05b;" 
d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109
q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143
q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" />
    <glyph glyph-name="remove_circle" unicode="&#xf05c;" 
d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23
l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5
t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="ok_circle" unicode="&#xf05d;" 
d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198
t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="ban_circle" unicode="&#xf05e;" 
d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61
t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" />
    <glyph glyph-name="arrow_left" unicode="&#xf060;" 
d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5
t32.5 -90.5z" />
    <glyph glyph-name="arrow_right" unicode="&#xf061;" 
d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" />
    <glyph glyph-name="arrow_up" unicode="&#xf062;" horiz-adv-x="1664" 
d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651
q37 -39 37 -91z" />
    <glyph glyph-name="arrow_down" unicode="&#xf063;" horiz-adv-x="1664" 
d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
    <glyph glyph-name="share_alt" unicode="&#xf064;" horiz-adv-x="1792" 
d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22
t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" />
    <glyph glyph-name="resize_full" unicode="&#xf065;" 
d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332
q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" />
    <glyph glyph-name="resize_small" unicode="&#xf066;" 
d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45
t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" />
    <glyph glyph-name="plus" unicode="&#xf067;" horiz-adv-x="1408" 
d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" />
    <glyph glyph-name="minus" unicode="&#xf068;" horiz-adv-x="1408" 
d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" />
    <glyph glyph-name="asterisk" unicode="&#xf069;" horiz-adv-x="1664" 
d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154
q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" />
    <glyph glyph-name="exclamation_sign" unicode="&#xf06a;" 
d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192
q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" />
    <glyph glyph-name="gift" unicode="&#xf06b;" 
d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320
q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5
t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" />
    <glyph glyph-name="leaf" unicode="&#xf06c;" horiz-adv-x="1792" 
d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268
q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-43 0 -63.5 17.5t-45.5 59.5q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5
t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" />
    <glyph glyph-name="fire" unicode="&#xf06d;" horiz-adv-x="1408" 
d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1
q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" />
    <glyph glyph-name="eye_open" unicode="&#xf06e;" horiz-adv-x="1792" 
d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5
t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" />
    <glyph glyph-name="eye_close" unicode="&#xf070;" horiz-adv-x="1792" 
d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9
q-106 -189 -316 -567t-315 -566l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5
q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z
" />
    <glyph glyph-name="warning_sign" unicode="&#xf071;" horiz-adv-x="1792" 
d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185
q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" />
    <glyph glyph-name="plane" unicode="&#xf072;" horiz-adv-x="1408" 
d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9
q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" />
    <glyph glyph-name="calendar" unicode="&#xf073;" horiz-adv-x="1664" 
d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z
M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64
q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47
h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
    <glyph glyph-name="random" unicode="&#xf074;" horiz-adv-x="1792" 
d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1
t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5
v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111
t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
    <glyph glyph-name="comment" unicode="&#xf075;" horiz-adv-x="1792" 
d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281
q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" />
    <glyph glyph-name="magnet" unicode="&#xf076;" 
d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384
q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" />
    <glyph glyph-name="chevron_up" unicode="&#xf077;" horiz-adv-x="1792" 
d="M1683 205l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5t19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5z" />
    <glyph glyph-name="chevron_down" unicode="&#xf078;" horiz-adv-x="1792" 
d="M1683 728l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5t19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5z" />
    <glyph glyph-name="retweet" unicode="&#xf079;" horiz-adv-x="1920" 
d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -10 7 -21
zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z
" />
    <glyph glyph-name="shopping_cart" unicode="&#xf07a;" horiz-adv-x="1664" 
d="M640 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1536 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1664 1088v-512q0 -24 -16.5 -42.5t-40.5 -21.5l-1044 -122q13 -60 13 -70q0 -16 -24 -64h920q26 0 45 -19t19 -45
t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 11 8 31.5t16 36t21.5 40t15.5 29.5l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t19.5 -15.5t13 -24.5t8 -26t5.5 -29.5t4.5 -26h1201q26 0 45 -19t19 -45z" />
    <glyph glyph-name="folder_close" unicode="&#xf07b;" horiz-adv-x="1664" 
d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
    <glyph glyph-name="folder_open" unicode="&#xf07c;" horiz-adv-x="1920" 
d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5
t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" />
    <glyph glyph-name="resize_vertical" unicode="&#xf07d;" horiz-adv-x="768" 
d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" />
    <glyph glyph-name="resize_horizontal" unicode="&#xf07e;" horiz-adv-x="1792" 
d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
    <glyph glyph-name="bar_chart" unicode="&#xf080;" horiz-adv-x="2048" 
d="M640 640v-512h-256v512h256zM1024 1152v-1024h-256v1024h256zM2048 0v-128h-2048v1536h128v-1408h1920zM1408 896v-768h-256v768h256zM1792 1280v-1152h-256v1152h256z" />
    <glyph glyph-name="twitter_sign" unicode="&#xf081;" 
d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4
q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5
t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="facebook_sign" unicode="&#xf082;" 
d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-188v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-532q-119 0 -203.5 84.5t-84.5 203.5v960
q0 119 84.5 203.5t203.5 84.5h960z" />
    <glyph glyph-name="camera_retro" unicode="&#xf083;" horiz-adv-x="1792" 
d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5
t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280
q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" />
    <glyph glyph-name="key" unicode="&#xf084;" horiz-adv-x="1792" 
d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26
l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5
t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" />
    <glyph glyph-name="cogs" unicode="&#xf085;" horiz-adv-x="1920" 
d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5
t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -11 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5
l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7
l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -8 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31
q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20
t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68
q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70
q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" />
    <glyph glyph-name="comments" unicode="&#xf086;" horiz-adv-x="1792" 
d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224
q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7
q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" />
    <glyph glyph-name="thumbs_up_alt" unicode="&#xf087;" 
d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5
t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769
q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128
q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" />
    <glyph glyph-name="thumbs_down_alt" unicode="&#xf088;" 
d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 31 18 69q0 37 -17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5
t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z
M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5
h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -73 49 -163z" />
    <glyph glyph-name="star_half" unicode="&#xf089;" horiz-adv-x="896" 
d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" />
    <glyph glyph-name="heart_empty" unicode="&#xf08a;" horiz-adv-x="1792" 
d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559
q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5
q224 0 351 -124t127 -344z" />
    <glyph glyph-name="signout" unicode="&#xf08b;" horiz-adv-x="1664" 
d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704
q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" />
    <glyph glyph-name="linkedin_sign" unicode="&#xf08c;" 
d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5
q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="pushpin" unicode="&#xf08d;" horiz-adv-x="1152" 
d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38
t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" />
    <glyph glyph-name="external_link" unicode="&#xf08e;" horiz-adv-x="1792" 
d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320
q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" />
    <glyph glyph-name="signin" unicode="&#xf090;" 
d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5
q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="trophy" unicode="&#xf091;" horiz-adv-x="1664" 
d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91
t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96
q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" />
    <glyph glyph-name="github_sign" unicode="&#xf092;" 
d="M519 336q4 6 -3 13q-9 7 -14 2q-4 -6 3 -13q9 -7 14 -2zM491 377q-5 7 -12 4q-6 -4 0 -12q7 -8 12 -5q6 4 0 13zM450 417q2 4 -5 8q-7 2 -8 -2q-3 -5 4 -8q8 -2 9 2zM471 394q2 1 1.5 4.5t-3.5 5.5q-6 7 -10 3t1 -11q6 -6 11 -2zM557 319q2 7 -9 11q-9 3 -13 -4
q-2 -7 9 -11q9 -3 13 4zM599 316q0 8 -12 8q-10 0 -10 -8t11 -8t11 8zM638 323q-2 7 -13 5t-9 -9q2 -8 12 -6t10 10zM1280 640q0 212 -150 362t-362 150t-362 -150t-150 -362q0 -167 98 -300.5t252 -185.5q18 -3 26.5 5t8.5 20q0 52 -1 95q-6 -1 -15.5 -2.5t-35.5 -2t-48 4
t-43.5 20t-29.5 41.5q-23 59 -57 74q-2 1 -4.5 3.5l-8 8t-7 9.5t4 7.5t19.5 3.5q6 0 15 -2t30 -15.5t33 -35.5q16 -28 37.5 -42t43.5 -14t38 3.5t30 9.5q7 47 33 69q-49 6 -86 18.5t-73 39t-55.5 76t-19.5 119.5q0 79 53 137q-24 62 5 136q19 6 54.5 -7.5t60.5 -29.5l26 -16
q58 17 128 17t128 -17q11 7 28.5 18t55.5 26t57 9q29 -74 5 -136q53 -58 53 -137q0 -57 -14 -100.5t-35.5 -70t-53.5 -44.5t-62.5 -26t-68.5 -12q35 -31 35 -95q0 -40 -0.5 -89t-0.5 -51q0 -12 8.5 -20t26.5 -5q154 52 252 185.5t98 300.5zM1536 1120v-960
q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="upload_alt" unicode="&#xf093;" horiz-adv-x="1664" 
d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92
t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" />
    <glyph glyph-name="lemon" unicode="&#xf094;" 
d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5
q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44
q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5
q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -13 2 -25t3.5 -16.5t7.5 -20.5t8 -20q16 -40 25 -118.5t9 -136.5z" />
    <glyph glyph-name="phone" unicode="&#xf095;" horiz-adv-x="1408" 
d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -53 3.5t-57.5 12.5t-47 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-127 79 -264 216t-216 264q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47t-12.5 57.5t-3.5 53q0 92 51 186
q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174q2 -1 19 -11.5t24 -14
t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" />
    <glyph glyph-name="check_empty" unicode="&#xf096;" horiz-adv-x="1408" 
d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832
q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="bookmark_empty" unicode="&#xf097;" horiz-adv-x="1280" 
d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289
q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
    <glyph glyph-name="phone_sign" unicode="&#xf098;" 
d="M1280 343q0 11 -2 16t-18 16.5t-40.5 25t-47.5 26.5t-45.5 25t-28.5 15q-5 3 -19 13t-25 15t-21 5q-15 0 -36.5 -20.5t-39.5 -45t-38.5 -45t-33.5 -20.5q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170 126.5t-127 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5
t-3.5 16.5q0 13 20.5 33.5t45 38.5t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5
t320.5 -216.5q6 -2 30 -11t33 -12.5t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z
" />
    <glyph glyph-name="twitter" unicode="&#xf099;" horiz-adv-x="1664" 
d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41
q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" />
    <glyph glyph-name="facebook" unicode="&#xf09a;" horiz-adv-x="1024" 
d="M959 1524v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12z" />
    <glyph glyph-name="github" unicode="&#xf09b;" 
d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -40 7t-13 30q0 3 0.5 76.5t0.5 134.5q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 119 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24
q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-85 13.5q-45 -113 -8 -204q-79 -87 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-39 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5
t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -88.5t0.5 -54.5q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103zM291 305q3 7 -7 12
q-10 3 -13 -2q-3 -7 7 -12q9 -6 13 2zM322 271q7 5 -2 16q-10 9 -16 3q-7 -5 2 -16q10 -10 16 -3zM352 226q9 7 0 19q-8 13 -17 6q-9 -5 0 -18t17 -7zM394 184q8 8 -4 19q-12 12 -20 3q-9 -8 4 -19q12 -12 20 -3zM451 159q3 11 -13 16q-15 4 -19 -7t13 -15q15 -6 19 6z
M514 154q0 13 -17 11q-16 0 -16 -11q0 -13 17 -11q16 0 16 11zM572 164q-2 11 -18 9q-16 -3 -14 -15t18 -8t14 14z" />
    <glyph glyph-name="unlock" unicode="&#xf09c;" horiz-adv-x="1664" 
d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5
t316.5 -131.5t131.5 -316.5z" />
    <glyph glyph-name="credit_card" unicode="&#xf09d;" horiz-adv-x="1920" 
d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608
q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
    <glyph glyph-name="rss" unicode="&#xf09e;" horiz-adv-x="1408" 
d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5
t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294
q187 -186 294 -425.5t120 -501.5z" />
    <glyph glyph-name="hdd" unicode="&#xf0a0;" 
d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5
h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75
l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" />
    <glyph glyph-name="bullhorn" unicode="&#xf0a1;" horiz-adv-x="1792" 
d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5
t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" />
    <glyph glyph-name="bell" unicode="&#xf0a2;" horiz-adv-x="1792" 
d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM246 128h1300q-266 300 -266 832q0 51 -24 105t-69 103t-121.5 80.5t-169.5 31.5t-169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -532 -266 -832z
M1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5
t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
    <glyph glyph-name="certificate" unicode="&#xf0a3;" 
d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70
l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70
l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" />
    <glyph glyph-name="hand_right" unicode="&#xf0a4;" horiz-adv-x="1792" 
d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106
q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43
q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5
t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" />
    <glyph glyph-name="hand_left" unicode="&#xf0a5;" horiz-adv-x="1792" 
d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-8 9 -12 14q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576q-50 0 -89 -38.5
t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45z
M1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128q0 122 81.5 189t206.5 67
q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" />
    <glyph glyph-name="hand_up" unicode="&#xf0a6;" 
d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576
q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5
t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76
q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" />
    <glyph glyph-name="hand_down" unicode="&#xf0a7;" 
d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33
t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580
q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100
q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" />
    <glyph glyph-name="circle_arrow_left" unicode="&#xf0a8;" 
d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640
q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="circle_arrow_right" unicode="&#xf0a9;" 
d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640
q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="circle_arrow_up" unicode="&#xf0aa;" 
d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640
q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="circle_arrow_down" unicode="&#xf0ab;" 
d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640
q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="globe" unicode="&#xf0ac;" 
d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11
q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 11t-9.5 10q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5
q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5
q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5
t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-4 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3
q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25
q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5
t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5
t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10.5t17 -19.5q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21
q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5
q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3
q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5
t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q8 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5
q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7
q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" />
    <glyph glyph-name="wrench" unicode="&#xf0ad;" horiz-adv-x="1664" 
d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5
t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" />
    <glyph glyph-name="tasks" unicode="&#xf0ae;" horiz-adv-x="1792" 
d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19
t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
    <glyph glyph-name="filter" unicode="&#xf0b0;" horiz-adv-x="1408" 
d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" />
    <glyph glyph-name="briefcase" unicode="&#xf0b1;" horiz-adv-x="1792" 
d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68
t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" />
    <glyph glyph-name="fullscreen" unicode="&#xf0b2;" 
d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144
l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z
" />
    <glyph glyph-name="group" unicode="&#xf0c0;" horiz-adv-x="1920" 
d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5
t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75
t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5
t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" />
    <glyph glyph-name="link" unicode="&#xf0c1;" horiz-adv-x="1664" 
d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26
l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15
t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207
q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" />
    <glyph glyph-name="cloud" unicode="&#xf0c2;" horiz-adv-x="1920" 
d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z
" />
    <glyph glyph-name="beaker" unicode="&#xf0c3;" horiz-adv-x="1664" 
d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" />
    <glyph glyph-name="cut" unicode="&#xf0c4;" horiz-adv-x="1792" 
d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84
q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148
q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108
q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6
q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
    <glyph glyph-name="copy" unicode="&#xf0c5;" horiz-adv-x="1792" 
d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299
h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" />
    <glyph glyph-name="paper_clip" unicode="&#xf0c6;" horiz-adv-x="1408" 
d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181
l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235
z" />
    <glyph glyph-name="save" unicode="&#xf0c7;" 
d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5
h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" />
    <glyph glyph-name="sign_blank" unicode="&#xf0c8;" 
d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="reorder" unicode="&#xf0c9;" 
d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45
t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
    <glyph glyph-name="ul" unicode="&#xf0ca;" horiz-adv-x="1792" 
d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5
t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z
M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
    <glyph glyph-name="ol" unicode="&#xf0cb;" horiz-adv-x="1792" 
d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362
q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5
t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 121.5t0.5 121.5v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216
q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
    <glyph glyph-name="strikethrough" unicode="&#xf0cc;" horiz-adv-x="1792" 
d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 98 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6
l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -56 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23
l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" />
    <glyph glyph-name="underline" unicode="&#xf0cd;" 
d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47
q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41
q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472
q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" />
    <glyph glyph-name="table" unicode="&#xf0ce;" horiz-adv-x="1664" 
d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23
v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192
q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192
q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113
z" />
    <glyph glyph-name="magic" unicode="&#xf0d0;" horiz-adv-x="1664" 
d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276
l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
    <glyph glyph-name="truck" unicode="&#xf0d1;" horiz-adv-x="1792" 
d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5
t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38
t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" />
    <glyph glyph-name="pinterest" unicode="&#xf0d2;" 
d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134
q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33
q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="pinterest_sign" unicode="&#xf0d3;" 
d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5
t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5
t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" />
    <glyph glyph-name="google_plus_sign" unicode="&#xf0d4;" 
d="M917 631q0 26 -6 64h-362v-132h217q-3 -24 -16.5 -50t-37.5 -53t-66.5 -44.5t-96.5 -17.5q-99 0 -169 71t-70 171t70 171t169 71q92 0 153 -59l104 101q-108 100 -257 100q-160 0 -272 -112.5t-112 -271.5t112 -271.5t272 -112.5q165 0 266.5 105t101.5 270zM1262 585
h109v110h-109v110h-110v-110h-110v-110h110v-110h110v110zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="google_plus" unicode="&#xf0d5;" horiz-adv-x="2304" 
d="M1437 623q0 -208 -87 -370.5t-248 -254t-369 -91.5q-149 0 -285 58t-234 156t-156 234t-58 285t58 285t156 234t234 156t285 58q286 0 491 -192l-199 -191q-117 113 -292 113q-123 0 -227.5 -62t-165.5 -168.5t-61 -232.5t61 -232.5t165.5 -168.5t227.5 -62
q83 0 152.5 23t114.5 57.5t78.5 78.5t49 83t21.5 74h-416v252h692q12 -63 12 -122zM2304 745v-210h-209v-209h-210v209h-209v210h209v209h210v-209h209z" />
    <glyph glyph-name="money" unicode="&#xf0d6;" horiz-adv-x="1920" 
d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384
v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" />
    <glyph glyph-name="caret_down" unicode="&#xf0d7;" horiz-adv-x="1024" 
d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
    <glyph glyph-name="caret_up" unicode="&#xf0d8;" horiz-adv-x="1024" 
d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
    <glyph glyph-name="caret_left" unicode="&#xf0d9;" horiz-adv-x="640" 
d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" />
    <glyph glyph-name="caret_right" unicode="&#xf0da;" horiz-adv-x="640" 
d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" />
    <glyph glyph-name="columns" unicode="&#xf0db;" horiz-adv-x="1664" 
d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" />
    <glyph glyph-name="sort" unicode="&#xf0dc;" horiz-adv-x="1024" 
d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
    <glyph glyph-name="sort_down" unicode="&#xf0dd;" horiz-adv-x="1024" 
d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
    <glyph glyph-name="sort_up" unicode="&#xf0de;" horiz-adv-x="1024" 
d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
    <glyph glyph-name="envelope_alt" unicode="&#xf0e0;" horiz-adv-x="1792" 
d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123
q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" />
    <glyph glyph-name="linkedin" unicode="&#xf0e1;" 
d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329
q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" />
    <glyph glyph-name="undo" unicode="&#xf0e2;" 
d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5
t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" />
    <glyph glyph-name="legal" unicode="&#xf0e3;" horiz-adv-x="1792" 
d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5
t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14
q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28
q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" />
    <glyph glyph-name="dashboard" unicode="&#xf0e4;" horiz-adv-x="1792" 
d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5
t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5
t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29
q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
    <glyph glyph-name="comment_alt" unicode="&#xf0e5;" horiz-adv-x="1792" 
d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640
q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5
t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
    <glyph glyph-name="comments_alt" unicode="&#xf0e6;" horiz-adv-x="1792" 
d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257
t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5
t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129
q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" />
    <glyph glyph-name="bolt" unicode="&#xf0e7;" horiz-adv-x="896" 
d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" />
    <glyph glyph-name="sitemap" unicode="&#xf0e8;" horiz-adv-x="1792" 
d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320
q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68
z" />
    <glyph glyph-name="umbrella" unicode="&#xf0e9;" horiz-adv-x="1664" 
d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97
q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69
q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" />
    <glyph glyph-name="paste" unicode="&#xf0ea;" horiz-adv-x="1792" 
d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28
h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" />
    <glyph glyph-name="light_bulb" unicode="&#xf0eb;" horiz-adv-x="1024" 
d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134
q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47
q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5
t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" />
    <glyph glyph-name="exchange" unicode="&#xf0ec;" horiz-adv-x="1792" 
d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9
q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
    <glyph glyph-name="cloud_download" unicode="&#xf0ed;" horiz-adv-x="1920" 
d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088
q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
    <glyph glyph-name="cloud_upload" unicode="&#xf0ee;" horiz-adv-x="1920" 
d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088
q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
    <glyph glyph-name="user_md" unicode="&#xf0f0;" horiz-adv-x="1408" 
d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56
t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68
t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5
t271.5 -112.5t112.5 -271.5z" />
    <glyph glyph-name="stethoscope" unicode="&#xf0f1;" horiz-adv-x="1408" 
d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48
t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252
t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" />
    <glyph glyph-name="suitcase" unicode="&#xf0f2;" horiz-adv-x="1792" 
d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66
t66 -158z" />
    <glyph glyph-name="bell_alt" unicode="&#xf0f3;" horiz-adv-x="1792" 
d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5
t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
    <glyph glyph-name="coffee" unicode="&#xf0f4;" horiz-adv-x="1920" 
d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45
t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" />
    <glyph glyph-name="food" unicode="&#xf0f5;" horiz-adv-x="1408" 
d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45
t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" />
    <glyph glyph-name="file_text_alt" unicode="&#xf0f6;" 
d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
M384 736q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64zM1120 512q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704zM1120 256q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704
q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704z" />
    <glyph glyph-name="building" unicode="&#xf0f7;" horiz-adv-x="1408" 
d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" />
    <glyph glyph-name="hospital" unicode="&#xf0f8;" horiz-adv-x="1408" 
d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5
t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320
v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" />
    <glyph glyph-name="ambulance" unicode="&#xf0f9;" horiz-adv-x="1920" 
d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5
t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152
q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
    <glyph glyph-name="medkit" unicode="&#xf0fa;" horiz-adv-x="1792" 
d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32
q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" />
    <glyph glyph-name="fighter_jet" unicode="&#xf0fb;" horiz-adv-x="1920" 
d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96
q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q128 -28 200 -52t80 -34z" />
    <glyph glyph-name="beer" unicode="&#xf0fc;" horiz-adv-x="1664" 
d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
    <glyph glyph-name="h_sign" unicode="&#xf0fd;" 
d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960
q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="f0fe" unicode="&#xf0fe;" 
d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960
q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="double_angle_left" unicode="&#xf100;" horiz-adv-x="1024" 
d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23
t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" />
    <glyph glyph-name="double_angle_right" unicode="&#xf101;" horiz-adv-x="1024" 
d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23
l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
    <glyph glyph-name="double_angle_up" unicode="&#xf102;" horiz-adv-x="1152" 
d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393
q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
    <glyph glyph-name="double_angle_down" unicode="&#xf103;" horiz-adv-x="1152" 
d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23
t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
    <glyph glyph-name="angle_left" unicode="&#xf104;" horiz-adv-x="640" 
d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
    <glyph glyph-name="angle_right" unicode="&#xf105;" horiz-adv-x="640" 
d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
    <glyph glyph-name="angle_up" unicode="&#xf106;" horiz-adv-x="1152" 
d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
    <glyph glyph-name="angle_down" unicode="&#xf107;" horiz-adv-x="1152" 
d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
    <glyph glyph-name="desktop" unicode="&#xf108;" horiz-adv-x="1920" 
d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19
t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
    <glyph glyph-name="laptop" unicode="&#xf109;" horiz-adv-x="1920" 
d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z
M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" />
    <glyph glyph-name="tablet" unicode="&#xf10a;" horiz-adv-x="1152" 
d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832
q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" />
    <glyph glyph-name="mobile_phone" unicode="&#xf10b;" horiz-adv-x="768" 
d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136
q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
    <glyph glyph-name="circle_blank" unicode="&#xf10c;" 
d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103
t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="quote_left" unicode="&#xf10d;" horiz-adv-x="1664" 
d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z
M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" />
    <glyph glyph-name="quote_right" unicode="&#xf10e;" horiz-adv-x="1664" 
d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216
v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" />
    <glyph glyph-name="spinner" unicode="&#xf110;" horiz-adv-x="1792" 
d="M526 142q0 -53 -37.5 -90.5t-90.5 -37.5q-52 0 -90 38t-38 90q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 -64q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -53 -37.5 -90.5t-90.5 -37.5
t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1522 142q0 -52 -38 -90t-90 -38q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM558 1138q0 -66 -47 -113t-113 -47t-113 47t-47 113t47 113t113 47t113 -47t47 -113z
M1728 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1088 1344q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1618 1138q0 -93 -66 -158.5t-158 -65.5q-93 0 -158.5 65.5t-65.5 158.5
q0 92 65.5 158t158.5 66q92 0 158 -66t66 -158z" />
    <glyph glyph-name="circle" unicode="&#xf111;" 
d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="reply" unicode="&#xf112;" horiz-adv-x="1792" 
d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19
l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" />
    <glyph glyph-name="github_alt" unicode="&#xf113;" horiz-adv-x="1664" 
d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320
q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86
t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218
q0 -87 -27 -168q136 -160 136 -398z" />
    <glyph glyph-name="folder_close_alt" unicode="&#xf114;" horiz-adv-x="1664" 
d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320
q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
    <glyph glyph-name="folder_open_alt" unicode="&#xf115;" horiz-adv-x="1920" 
d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68
v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z
" />
    <glyph glyph-name="expand_alt" unicode="&#xf116;" horiz-adv-x="1792" 
 />
    <glyph glyph-name="collapse_alt" unicode="&#xf117;" horiz-adv-x="1792" 
 />
    <glyph glyph-name="smile" unicode="&#xf118;" 
d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5
t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5
t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="frown" unicode="&#xf119;" 
d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5
t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204
t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="meh" unicode="&#xf11a;" 
d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5
t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640
q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="gamepad" unicode="&#xf11b;" horiz-adv-x="1920" 
d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5
t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150
t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" />
    <glyph glyph-name="keyboard" unicode="&#xf11c;" horiz-adv-x="1920" 
d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16
h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16
h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96
q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896
h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" />
    <glyph glyph-name="flag_alt" unicode="&#xf11d;" horiz-adv-x="1792" 
d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9
h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102
q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
    <glyph glyph-name="flag_checkered" unicode="&#xf11e;" horiz-adv-x="1792" 
d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2
q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266
q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8
q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
    <glyph glyph-name="terminal" unicode="&#xf120;" horiz-adv-x="1664" 
d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9
t9 -23z" />
    <glyph glyph-name="code" unicode="&#xf121;" horiz-adv-x="1920" 
d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5
l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" />
    <glyph glyph-name="reply_all" unicode="&#xf122;" horiz-adv-x="1792" 
d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1
q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" />
    <glyph glyph-name="star_half_empty" unicode="&#xf123;" horiz-adv-x="1664" 
d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5
l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" />
    <glyph glyph-name="location_arrow" unicode="&#xf124;" horiz-adv-x="1408" 
d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" />
    <glyph glyph-name="crop" unicode="&#xf125;" horiz-adv-x="1664" 
d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23
v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" />
    <glyph glyph-name="code_fork" unicode="&#xf126;" horiz-adv-x="1024" 
d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5
q-2 -287 -226 -414q-67 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497
q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" />
    <glyph glyph-name="unlink" unicode="&#xf127;" horiz-adv-x="1664" 
d="M439 265l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320
q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18
l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9
t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
    <glyph glyph-name="question" unicode="&#xf128;" horiz-adv-x="1024" 
d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5
t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" />
    <glyph glyph-name="_279" unicode="&#xf129;" horiz-adv-x="640" 
d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192
q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" />
    <glyph glyph-name="exclamation" unicode="&#xf12a;" horiz-adv-x="640" 
d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" />
    <glyph glyph-name="superscript" unicode="&#xf12b;" 
d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3q-1 -3 -2.5 -6.5t-3.5 -8t-3 -6.5q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109z
M1534 846v-206h-514l-3 27q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5
t-65.5 -51.5t-30.5 -63h232v80h126z" />
    <glyph glyph-name="subscript" unicode="&#xf12c;" 
d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3q-1 -3 -2.5 -6.5t-3.5 -8t-3 -6.5q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109z
M1536 -50v-206h-514l-4 27q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73
h232v80h126z" />
    <glyph glyph-name="_283" unicode="&#xf12d;" horiz-adv-x="1920" 
d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" />
    <glyph glyph-name="puzzle_piece" unicode="&#xf12e;" horiz-adv-x="1664" 
d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5
t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89
q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117
q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" />
    <glyph glyph-name="microphone" unicode="&#xf130;" horiz-adv-x="1152" 
d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5
t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" />
    <glyph glyph-name="microphone_off" unicode="&#xf131;" horiz-adv-x="1408" 
d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128
q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23
t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" />
    <glyph glyph-name="shield" unicode="&#xf132;" horiz-adv-x="1280" 
d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150
t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
    <glyph glyph-name="calendar_empty" unicode="&#xf133;" horiz-adv-x="1664" 
d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280
q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
    <glyph glyph-name="fire_extinguisher" unicode="&#xf134;" horiz-adv-x="1408" 
d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800
q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113
q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" />
    <glyph glyph-name="rocket" unicode="&#xf135;" horiz-adv-x="1664" 
d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1
q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
    <glyph glyph-name="maxcdn" unicode="&#xf136;" horiz-adv-x="1792" 
d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" />
    <glyph glyph-name="chevron_sign_left" unicode="&#xf137;" 
d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="chevron_sign_right" unicode="&#xf138;" 
d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="chevron_sign_up" unicode="&#xf139;" 
d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="chevron_sign_down" unicode="&#xf13a;" 
d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="html5" unicode="&#xf13b;" horiz-adv-x="1408" 
d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" />
    <glyph glyph-name="css3" unicode="&#xf13c;" horiz-adv-x="1792" 
d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" />
    <glyph glyph-name="anchor" unicode="&#xf13d;" horiz-adv-x="1792" 
d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352
q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19
t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" />
    <glyph glyph-name="unlock_alt" unicode="&#xf13e;" horiz-adv-x="1152" 
d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181
v-320h736z" />
    <glyph glyph-name="bullseye" unicode="&#xf140;" 
d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150
t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640
q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="ellipsis_horizontal" unicode="&#xf141;" horiz-adv-x="1408" 
d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192
q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
    <glyph glyph-name="ellipsis_vertical" unicode="&#xf142;" horiz-adv-x="384" 
d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192
q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
    <glyph glyph-name="_303" unicode="&#xf143;" 
d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 233 -176.5 396.5t-396.5 176.5q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128
q13 0 23 10t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960
q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="play_sign" unicode="&#xf144;" 
d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56
q16 -8 32 -8q17 0 32 9z" />
    <glyph glyph-name="ticket" unicode="&#xf145;" horiz-adv-x="1792" 
d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136
t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" />
    <glyph glyph-name="minus_sign_alt" unicode="&#xf146;" 
d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5
t84.5 -203.5z" />
    <glyph glyph-name="check_minus" unicode="&#xf147;" horiz-adv-x="1408" 
d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5
t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="level_up" unicode="&#xf148;" horiz-adv-x="1024" 
d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" />
    <glyph glyph-name="level_down" unicode="&#xf149;" horiz-adv-x="1024" 
d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" />
    <glyph glyph-name="check_sign" unicode="&#xf14a;" 
d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5
t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="edit_sign" unicode="&#xf14b;" 
d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120
v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="_312" unicode="&#xf14c;" 
d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960
q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="share_sign" unicode="&#xf14d;" 
d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q11 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5
t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="compass" unicode="&#xf14e;" 
d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103
t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="collapse" unicode="&#xf150;" 
d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120
v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="collapse_top" unicode="&#xf151;" 
d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960
q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="_317" unicode="&#xf152;" 
d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5
t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="eur" unicode="&#xf153;" horiz-adv-x="1024" 
d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9
t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26
l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" />
    <glyph glyph-name="gbp" unicode="&#xf154;" horiz-adv-x="1024" 
d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7
q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" />
    <glyph glyph-name="usd" unicode="&#xf155;" horiz-adv-x="1024" 
d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43
t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5
t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50
t53 -63.5t31.5 -76.5t13 -94z" />
    <glyph glyph-name="inr" unicode="&#xf156;" horiz-adv-x="898" 
d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102
q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
    <glyph glyph-name="jpy" unicode="&#xf157;" horiz-adv-x="1027" 
d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61
l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" />
    <glyph glyph-name="rub" unicode="&#xf158;" horiz-adv-x="1280" 
d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128
q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" />
    <glyph glyph-name="krw" unicode="&#xf159;" horiz-adv-x="1792" 
d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23
t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28
q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" />
    <glyph glyph-name="btc" unicode="&#xf15a;" horiz-adv-x="1280" 
d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164
l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30
t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" />
    <glyph glyph-name="file" unicode="&#xf15b;" 
d="M1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472zM896 992q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544z" />
    <glyph glyph-name="file_text" unicode="&#xf15c;" 
d="M1468 1060q14 -14 28 -36h-472v472q22 -14 36 -28zM992 896h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28zM1152 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704
q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23z" />
    <glyph glyph-name="sort_by_alphabet" unicode="&#xf15d;" horiz-adv-x="1664" 
d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23
v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162
l230 -662h70z" />
    <glyph glyph-name="_329" unicode="&#xf15e;" horiz-adv-x="1664" 
d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150
v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248
v119h121z" />
    <glyph glyph-name="sort_by_attributes" unicode="&#xf160;" horiz-adv-x="1792" 
d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832
q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256
q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" />
    <glyph glyph-name="sort_by_attributes_alt" unicode="&#xf161;" horiz-adv-x="1792" 
d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192
q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832
q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" />
    <glyph glyph-name="sort_by_order" unicode="&#xf162;" 
d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23
zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5
t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" />
    <glyph glyph-name="sort_by_order_alt" unicode="&#xf163;" 
d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9
t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13
q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" />
    <glyph glyph-name="_334" unicode="&#xf164;" horiz-adv-x="1664" 
d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76
q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5
t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" />
    <glyph glyph-name="_335" unicode="&#xf165;" horiz-adv-x="1664" 
d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135
t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121
t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" />
    <glyph glyph-name="youtube_sign" unicode="&#xf166;" 
d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 17 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15
q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38
q21 -29 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5
q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78q7 -23 23 -69l24 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38
q-51 0 -78 -38q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5
h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="youtube" unicode="&#xf167;" 
d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73
q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51
q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99
q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-38 -51 -106 -51q-67 0 -105 51
q-28 38 -28 118v175q0 80 28 117q38 51 105 51q68 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" />
    <glyph glyph-name="xing" unicode="&#xf168;" horiz-adv-x="1408" 
d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942
q25 45 64 45h241q22 0 31 -15z" />
    <glyph glyph-name="xing_sign" unicode="&#xf169;" 
d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1
l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="youtube_play" unicode="&#xf16a;" horiz-adv-x="1792" 
d="M711 408l484 250l-484 253v-503zM896 1270q168 0 324.5 -4.5t229.5 -9.5l73 -4q1 0 17 -1.5t23 -3t23.5 -4.5t28.5 -8t28 -13t31 -19.5t29 -26.5q6 -6 15.5 -18.5t29 -58.5t26.5 -101q8 -64 12.5 -136.5t5.5 -113.5v-40v-136q1 -145 -18 -290q-7 -55 -25 -99.5t-32 -61.5
l-14 -17q-14 -15 -29 -26.5t-31 -19t-28 -12.5t-28.5 -8t-24 -4.5t-23 -3t-16.5 -1.5q-251 -19 -627 -19q-207 2 -359.5 6.5t-200.5 7.5l-49 4l-36 4q-36 5 -54.5 10t-51 21t-56.5 41q-6 6 -15.5 18.5t-29 58.5t-26.5 101q-8 64 -12.5 136.5t-5.5 113.5v40v136
q-1 145 18 290q7 55 25 99.5t32 61.5l14 17q14 15 29 26.5t31 19.5t28 13t28.5 8t23.5 4.5t23 3t17 1.5q251 18 627 18z" />
    <glyph glyph-name="dropbox" unicode="&#xf16b;" horiz-adv-x="1792" 
d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" />
    <glyph glyph-name="stackexchange" unicode="&#xf16c;" 
d="M1289 -96h-1118v480h-160v-640h1438v640h-160v-480zM347 428l33 157l783 -165l-33 -156zM450 802l67 146l725 -339l-67 -145zM651 1158l102 123l614 -513l-102 -123zM1048 1536l477 -641l-128 -96l-477 641zM330 65v159h800v-159h-800z" />
    <glyph glyph-name="instagram" unicode="&#xf16d;" 
d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1162 640q0 -164 -115 -279t-279 -115t-279 115t-115 279t115 279t279 115t279 -115t115 -279zM1270 1050q0 -38 -27 -65t-65 -27t-65 27t-27 65t27 65t65 27t65 -27t27 -65zM768 1270
q-7 0 -76.5 0.5t-105.5 0t-96.5 -3t-103 -10t-71.5 -18.5q-50 -20 -88 -58t-58 -88q-11 -29 -18.5 -71.5t-10 -103t-3 -96.5t0 -105.5t0.5 -76.5t-0.5 -76.5t0 -105.5t3 -96.5t10 -103t18.5 -71.5q20 -50 58 -88t88 -58q29 -11 71.5 -18.5t103 -10t96.5 -3t105.5 0t76.5 0.5
t76.5 -0.5t105.5 0t96.5 3t103 10t71.5 18.5q50 20 88 58t58 88q11 29 18.5 71.5t10 103t3 96.5t0 105.5t-0.5 76.5t0.5 76.5t0 105.5t-3 96.5t-10 103t-18.5 71.5q-20 50 -58 88t-88 58q-29 11 -71.5 18.5t-103 10t-96.5 3t-105.5 0t-76.5 -0.5zM1536 640q0 -229 -5 -317
q-10 -208 -124 -322t-322 -124q-88 -5 -317 -5t-317 5q-208 10 -322 124t-124 322q-5 88 -5 317t5 317q10 208 124 322t322 124q88 5 317 5t317 -5q208 -10 322 -124t124 -322q5 -88 5 -317z" />
    <glyph glyph-name="flickr" unicode="&#xf16e;" 
d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150
t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" />
    <glyph glyph-name="adn" unicode="&#xf170;" 
d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="f171" unicode="&#xf171;" horiz-adv-x="1408" 
d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22
t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18
t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5
t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" />
    <glyph glyph-name="bitbucket_sign" unicode="&#xf172;" 
d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5
t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z
M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120
v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="tumblr" unicode="&#xf173;" horiz-adv-x="1024" 
d="M944 207l80 -237q-23 -35 -111 -66t-177 -32q-104 -2 -190.5 26t-142.5 74t-95 106t-55.5 120t-16.5 118v544h-168v215q72 26 129 69.5t91 90t58 102t34 99t15 88.5q1 5 4.5 8.5t7.5 3.5h244v-424h333v-252h-334v-518q0 -30 6.5 -56t22.5 -52.5t49.5 -41.5t81.5 -14
q78 2 134 29z" />
    <glyph glyph-name="tumblr_sign" unicode="&#xf174;" 
d="M1136 75l-62 183q-44 -22 -103 -22q-36 -1 -62 10.5t-38.5 31.5t-17.5 40.5t-5 43.5v398h257v194h-256v326h-188q-8 0 -9 -10q-5 -44 -17.5 -87t-39 -95t-77 -95t-118.5 -68v-165h130v-418q0 -57 21.5 -115t65 -111t121 -85.5t176.5 -30.5q69 1 136.5 25t85.5 50z
M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="long_arrow_down" unicode="&#xf175;" horiz-adv-x="768" 
d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" />
    <glyph glyph-name="long_arrow_up" unicode="&#xf176;" horiz-adv-x="768" 
d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" />
    <glyph glyph-name="long_arrow_left" unicode="&#xf177;" horiz-adv-x="1792" 
d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" />
    <glyph glyph-name="long_arrow_right" unicode="&#xf178;" horiz-adv-x="1792" 
d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" />
    <glyph glyph-name="apple" unicode="&#xf179;" horiz-adv-x="1408" 
d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q113 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65
q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" />
    <glyph glyph-name="windows" unicode="&#xf17a;" horiz-adv-x="1664" 
d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" />
    <glyph glyph-name="android" unicode="&#xf17b;" horiz-adv-x="1408" 
d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30
t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5
h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" />
    <glyph glyph-name="linux" unicode="&#xf17c;" 
d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-10 -11 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z
M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7
q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15
q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5
t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19
q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63
q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18q-2 -1 -4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92
q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152
q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-6 0 -8 -2t0 -4
t5 -3q14 -4 18 -31q0 -3 8 2q2 2 2 3zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5
t-30 -18.5t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43
q-19 4 -51 9.5t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49
t-14 -48q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54
q110 143 124 195q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5
t-40.5 -33.5t-61 -14q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5
t15.5 47.5q1 -31 8 -56.5t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" />
    <glyph glyph-name="dribble" unicode="&#xf17d;" 
d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81
t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19
q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -5 6.5 -17t7.5 -17q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6
t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="skype" unicode="&#xf17e;" 
d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5
t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5
q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80
q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" />
    <glyph glyph-name="foursquare" unicode="&#xf180;" horiz-adv-x="1280" 
d="M1000 1102l37 194q5 23 -9 40t-35 17h-712q-23 0 -38.5 -17t-15.5 -37v-1101q0 -7 6 -1l291 352q23 26 38 33.5t48 7.5h239q22 0 37 14.5t18 29.5q24 130 37 191q4 21 -11.5 40t-36.5 19h-294q-29 0 -48 19t-19 48v42q0 29 19 47.5t48 18.5h346q18 0 35 13.5t20 29.5z
M1227 1324q-15 -73 -53.5 -266.5t-69.5 -350t-35 -173.5q-6 -22 -9 -32.5t-14 -32.5t-24.5 -33t-38.5 -21t-58 -10h-271q-13 0 -22 -10q-8 -9 -426 -494q-22 -25 -58.5 -28.5t-48.5 5.5q-55 22 -55 98v1410q0 55 38 102.5t120 47.5h888q95 0 127 -53t10 -159zM1227 1324
l-158 -790q4 17 35 173.5t69.5 350t53.5 266.5z" />
    <glyph glyph-name="trello" unicode="&#xf181;" 
d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408
q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
    <glyph glyph-name="female" unicode="&#xf182;" horiz-adv-x="1280" 
d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43
q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
    <glyph glyph-name="male" unicode="&#xf183;" horiz-adv-x="1024" 
d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z
M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
    <glyph glyph-name="gittip" unicode="&#xf184;" 
d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103
t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="sun" unicode="&#xf185;" horiz-adv-x="1792" 
d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4
l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94
q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" />
    <glyph glyph-name="_366" unicode="&#xf186;" 
d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61
t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" />
    <glyph glyph-name="archive" unicode="&#xf187;" horiz-adv-x="1792" 
d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536
q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" />
    <glyph glyph-name="bug" unicode="&#xf188;" horiz-adv-x="1664" 
d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207
q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19
t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" />
    <glyph glyph-name="vk" unicode="&#xf189;" horiz-adv-x="1920" 
d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-40 -51 -55 -72t-30.5 -49.5t-12 -42t13 -34.5t32.5 -43t57 -53q4 -2 5 -4q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58
t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6
q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q16 19 38 30q53 26 239 24
q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2
q39 5 64 -2.5t31 -16.5z" />
    <glyph glyph-name="weibo" unicode="&#xf18a;" horiz-adv-x="1792" 
d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12
q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422
q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178
q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z
M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" />
    <glyph glyph-name="renren" unicode="&#xf18b;" 
d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495
q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" />
    <glyph glyph-name="_372" unicode="&#xf18c;" horiz-adv-x="1408" 
d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5
t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56
t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -4 1 -50t-1 -72q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5
t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" />
    <glyph glyph-name="stack_exchange" unicode="&#xf18d;" horiz-adv-x="1280" 
d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z
" />
    <glyph glyph-name="_374" unicode="&#xf18e;" 
d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198
t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="arrow_circle_alt_left" unicode="&#xf190;" 
d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198
t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="_376" unicode="&#xf191;" 
d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z
M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="dot_circle_alt" unicode="&#xf192;" 
d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5
t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="_378" unicode="&#xf193;" horiz-adv-x="1664" 
d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128
q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 17 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" />
    <glyph glyph-name="vimeo_square" unicode="&#xf194;" 
d="M1292 898q10 216 -161 222q-231 8 -312 -261q44 19 82 19q85 0 74 -96q-4 -57 -74 -167t-105 -110q-43 0 -82 169q-13 54 -45 255q-30 189 -160 177q-59 -7 -164 -100l-81 -72l-81 -72l52 -67q76 52 87 52q57 0 107 -179q15 -55 45 -164.5t45 -164.5q68 -179 164 -179
q157 0 383 294q220 283 226 444zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="_380" unicode="&#xf195;" horiz-adv-x="1152" 
d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160
q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
    <glyph glyph-name="plus_square_o" unicode="&#xf196;" horiz-adv-x="1408" 
d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832
q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="_382" unicode="&#xf197;" horiz-adv-x="2176" 
d="M620 416q-110 -64 -268 -64h-128v64h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5t38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40
t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113zM1739 668q53 -36 53 -92t-53 -92l81 -30q68 48 68 122t-68 122zM625 400h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96l-93 464h29
q157 0 273 64zM352 816h-29l93 464h96q46 0 90 -19t70 -45l288 -288q4 -4 11 -10.5t30.5 -23t48.5 -29t61.5 -23t72.5 -10.5l456 -80h-1015q-116 64 -273 64z" />
    <glyph glyph-name="_383" unicode="&#xf198;" horiz-adv-x="1664" 
d="M1519 760q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72l-55 163l-153 -53q-29 -9 -50 -9
q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102
t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8zM725 498l310 105l-105 315l-310 -107z" />
    <glyph glyph-name="_384" unicode="&#xf199;" 
d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM1280 352v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99q-98 -69 -164 -69v0v0q-66 0 -164 69
q-47 32 -142 92.5t-142 92.5q-12 8 -33 27t-31 27v-436q0 -40 28 -68t68 -28h832q40 0 68 28t28 68zM1280 925q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13
t21.5 -9.5t22.5 -7.5t20.5 -2.5t20.5 2.5t22.5 7.5t21.5 9.5t23.5 13t21 13t21 14t17 11.5l267 174q35 23 66.5 62.5t31.5 73.5z" />
    <glyph glyph-name="_385" unicode="&#xf19a;" horiz-adv-x="1792" 
d="M127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM1415 679q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15t-1.5 -18.5t9 -16.5
t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5t-37 -95.5q0 -12 2 -24t4 -21.5t8 -23t9 -21t12 -22.5t12.5 -21
t14.5 -24t14 -23q63 -107 63 -212zM909 573l237 -647q1 -6 5 -11q-126 -44 -255 -44q-112 0 -217 32zM1570 1009q95 -174 95 -369q0 -209 -104 -385.5t-279 -278.5l235 678q59 169 59 276q0 42 -6 79zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286
t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 -215q173 0 331.5 68t273 182.5t182.5 273t68 331.5t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5t68 -331.5t182.5 -273
t273 -182.5t331.5 -68z" />
    <glyph glyph-name="_386" unicode="&#xf19b;" horiz-adv-x="1792" 
d="M1086 1536v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360zM1755 954l37 -390l-525 114l147 83q-119 70 -280 99v172q277 -33 481 -157z" />
    <glyph glyph-name="_387" unicode="&#xf19c;" horiz-adv-x="2048" 
d="M960 1536l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128v128zM256 896h256v-768h128v768h256v-768h128v768h256v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664v64q0 26 20.5 45t48.5 19h59v768zM1851 -64
q28 0 48.5 -19t20.5 -45v-128h-1920v128q0 26 20.5 45t48.5 19h1782z" />
    <glyph glyph-name="_388" unicode="&#xf19d;" horiz-adv-x="2304" 
d="M1774 700l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128l18 316l574 -181q22 -7 48 -7t48 7zM2304 1024q0 -23 -22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433
q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31t22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31z" />
    <glyph glyph-name="_389" unicode="&#xf19e;" 
d="M859 579l13 -707q-62 11 -105 11q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287q58 -15 108 -15q44 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14v0
q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610z" />
    <glyph glyph-name="uniF1A0" unicode="&#xf1a0;" 
d="M768 750h725q12 -67 12 -128q0 -217 -91 -387.5t-259.5 -266.5t-386.5 -96q-157 0 -299 60.5t-245 163.5t-163.5 245t-60.5 299t60.5 299t163.5 245t245 163.5t299 60.5q300 0 515 -201l-209 -201q-123 119 -306 119q-129 0 -238.5 -65t-173.5 -176.5t-64 -243.5
t64 -243.5t173.5 -176.5t238.5 -65q87 0 160 24t120 60t82 82t51.5 87t22.5 78h-436v264z" />
    <glyph glyph-name="f1a1" unicode="&#xf1a1;" horiz-adv-x="1792" 
d="M1095 369q16 -16 0 -31q-62 -62 -199 -62t-199 62q-16 15 0 31q6 6 15 6t15 -6q48 -49 169 -49q120 0 169 49q6 6 15 6t15 -6zM788 550q0 -37 -26 -63t-63 -26t-63.5 26t-26.5 63q0 38 26.5 64t63.5 26t63 -26.5t26 -63.5zM1183 550q0 -37 -26.5 -63t-63.5 -26t-63 26
t-26 63t26 63.5t63 26.5t63.5 -26t26.5 -64zM1434 670q0 49 -35 84t-85 35t-86 -36q-130 90 -311 96l63 283l200 -45q0 -37 26 -63t63 -26t63.5 26.5t26.5 63.5t-26.5 63.5t-63.5 26.5q-54 0 -80 -50l-221 49q-19 5 -25 -16l-69 -312q-180 -7 -309 -97q-35 37 -87 37
q-50 0 -85 -35t-35 -84q0 -35 18.5 -64t49.5 -44q-6 -27 -6 -56q0 -142 140 -243t337 -101q198 0 338 101t140 243q0 32 -7 57q30 15 48 43.5t18 63.5zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191
t348 71t348 -71t286 -191t191 -286t71 -348z" />
    <glyph glyph-name="_392" unicode="&#xf1a2;" 
d="M939 407q13 -13 0 -26q-53 -53 -171 -53t-171 53q-13 13 0 26q5 6 13 6t13 -6q42 -42 145 -42t145 42q5 6 13 6t13 -6zM676 563q0 -31 -23 -54t-54 -23t-54 23t-23 54q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1014 563q0 -31 -23 -54t-54 -23t-54 23t-23 54
q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1229 666q0 42 -30 72t-73 30q-42 0 -73 -31q-113 78 -267 82l54 243l171 -39q1 -32 23.5 -54t53.5 -22q32 0 54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5q-48 0 -69 -43l-189 42q-17 5 -21 -13l-60 -268q-154 -6 -265 -83
q-30 32 -74 32q-43 0 -73 -30t-30 -72q0 -30 16 -55t42 -38q-5 -25 -5 -48q0 -122 120 -208.5t289 -86.5q170 0 290 86.5t120 208.5q0 25 -6 49q25 13 40.5 37.5t15.5 54.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960
q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="_393" unicode="&#xf1a3;" 
d="M866 697l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14q19 0 32.5 -14t13.5 -33v-54zM1199 502v122h-150
v-126q0 -20 -13.5 -33.5t-33.5 -13.5q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123q0 -80 58 -137t139 -57t138.5 57t57.5 139zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103
t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="f1a4" unicode="&#xf1a4;" horiz-adv-x="1920" 
d="M1062 824v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58zM1592 602h328
v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275z" />
    <glyph glyph-name="_395" unicode="&#xf1a5;" 
d="M1472 160v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480h704v-704h480q93 0 158.5 65.5t65.5 158.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5
t84.5 -203.5z" />
    <glyph glyph-name="_396" unicode="&#xf1a6;" horiz-adv-x="2048" 
d="M328 1254h204v-983h-532v697h328v286zM328 435v369h-123v-369h123zM614 968v-697h205v697h-205zM614 1254v-204h205v204h-205zM901 968h533v-942h-533v163h328v82h-328v697zM1229 435v369h-123v-369h123zM1516 968h532v-942h-532v163h327v82h-327v697zM1843 435v369h-123
v-369h123z" />
    <glyph glyph-name="_397" unicode="&#xf1a7;" 
d="M1046 516q0 -64 -38 -109t-91 -45q-43 0 -70 15v277q28 17 70 17q53 0 91 -45.5t38 -109.5zM703 944q0 -64 -38 -109.5t-91 -45.5q-43 0 -70 15v277q28 17 70 17q53 0 91 -45t38 -109zM1265 513q0 134 -88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101
v-636l211 41v206q51 -19 117 -19q125 0 213 95t88 229zM922 940q0 134 -88.5 229t-213.5 95q-74 0 -141 -36h-186v-840l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960
q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="_398" unicode="&#xf1a8;" horiz-adv-x="2038" 
d="M1222 607q75 3 143.5 -20.5t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14
q6 -5 28 -23.5t25.5 -22t19 -18t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 41.5t57 59t26.5 51.5q-24 2 -43 -24
q-36 -53 -111.5 -99.5t-136.5 -46.5q-25 0 -75.5 63t-106.5 139.5t-84 96.5q-6 4 -27 30q-482 -112 -513 -112q-16 0 -28 11t-12 27q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33
q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5
t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 -60t-42.5 -21t-40 -6.5t-16.5 -20.5zM1282 842q-5 5 -13.5 15.5t-12 14.5t-10.5 11.5t-10 10.5l-8 8t-8.5 7.5t-8 5t-8.5 4.5q-7 3 -14.5 5t-20.5 2.5t-22 0.5h-32.5h-37.5q-126 0 -217 -43
q16 30 36 46.5t54 29.5t65.5 36t46 36.5t50 55t43.5 50.5q12 -9 28 -31.5t32 -36.5t38 -13l12 1v-76l22 -1q247 95 371 190q28 21 50 39t42.5 37.5t33 31t29.5 34t24 31t24.5 37t23 38t27 47.5t29.5 53l7 9q-2 -53 -43 -139q-79 -165 -205 -264t-306 -142q-14 -3 -42 -7.5
t-50 -9.5t-39 -14q3 -19 24.5 -46t21.5 -34q0 -11 -26 -30zM1061 -79q39 26 131.5 47.5t146.5 21.5q9 0 22.5 -15.5t28 -42.5t26 -50t24 -51t14.5 -33q-121 -45 -244 -45q-61 0 -125 11zM822 568l48 12l109 -177l-73 -48zM1323 51q3 -15 3 -16q0 -7 -17.5 -14.5t-46 -13
t-54 -9.5t-53.5 -7.5t-32 -4.5l-7 43q21 2 60.5 8.5t72 10t60.5 3.5h14zM866 679l-96 -20l-6 17q10 1 32.5 7t34.5 6q19 0 35 -10zM1061 45h31l10 -83l-41 -12v95zM1950 1535v1v-1zM1950 1535l-1 -5l-2 -2l1 3zM1950 1535l1 1z" />
    <glyph glyph-name="_399" unicode="&#xf1a9;" 
d="M1167 -50q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16t7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29zM1128 65q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10
q-29 -12 -78 -56q-26 -24 -12 -44q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34zM1483 346q0 22 -5 44.5t-16.5 45t-34 36.5t-52.5 14
q-33 0 -97 -41.5t-129 -83.5t-101 -42q-27 -1 -63.5 19t-76 49t-83.5 58t-100 49t-111 19q-115 -1 -197 -78.5t-84 -178.5q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t68 -67.5t55.5 -32q35 -3 58.5 14
t55.5 63q28 41 42.5 101t14.5 106zM1536 506q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44
q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5t19.5 -177.5z" />
    <glyph glyph-name="_400" unicode="&#xf1aa;" 
d="M1070 463l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5t-60 145.5q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160z
M729 1145l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5q-70 15 -115 71t-45 129q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5
t149.5 -87.5zM1536 78q0 -85 -60 -145.5t-145 -60.5q-74 0 -131 47t-71 118q-86 -28 -179.5 -6t-161.5 90l-11 12l151 152l12 -12q37 -37 89 -37t89 37t37 89t-37 89l-30 30l-152 152l-160 160l152 152l160 -160l152 -152l29 -30q64 -64 87.5 -150.5t2.5 -171.5
q76 -11 126.5 -68.5t50.5 -134.5zM1534 1202q0 -77 -51 -135t-127 -69q26 -85 3 -176.5t-90 -158.5l-12 -12l-151 152l12 12q37 37 37 89t-37 89t-89 37t-89 -37l-30 -30l-152 -152l-160 -160l-152 152l161 160l152 152l29 30q67 67 159 89.5t178 -3.5q11 75 68.5 126
t135.5 51q85 0 145 -60.5t60 -145.5z" />
    <glyph glyph-name="f1ab" unicode="&#xf1ab;" 
d="M654 458q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110q-4 -2 -19.5 -4t-18.5 0q6 4 82 92q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5
q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q-25 -50 -77 -131l64 -28
q12 -6 74.5 -32t67.5 -28q4 -1 10.5 -25.5t4.5 -30.5zM449 944q3 -15 -4 -28q-12 -23 -50 -38q-30 -12 -60 -12q-26 3 -49 26q-14 15 -18 41l1 3q3 -3 19.5 -5t26.5 0t58 16q36 12 55 14q17 0 21 -17zM1147 815l63 -227l-139 42zM39 15l694 232v1032l-694 -233v-1031z
M1280 332l102 -31l-181 657l-100 31l-216 -536l102 -31l45 110l211 -65zM777 1294l573 -184v380zM1088 -29l158 -13l-54 -160l-40 66q-130 -83 -276 -108q-58 -12 -91 -12h-84q-79 0 -199.5 39t-183.5 85q-8 7 -8 16q0 8 5 13.5t13 5.5q4 0 18 -7.5t30.5 -16.5t20.5 -11
q73 -37 159.5 -61.5t157.5 -24.5q95 0 167 14.5t157 50.5q15 7 30.5 15.5t34 19t28.5 16.5zM1536 1050v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3v1078q3 9 4 10q5 6 20 11q107 36 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5
q20 0 20 -21v-418z" />
    <glyph glyph-name="_402" unicode="&#xf1ac;" horiz-adv-x="1792" 
d="M288 1152q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h128zM1664 989q58 -34 93 -93t35 -128v-768q0 -106 -75 -181t-181 -75h-864q-66 0 -113 47t-47 113v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48
l152 -152q28 -28 48 -76t20 -88v-163zM928 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 512v128q0 14 -9 23
t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128
q14 0 23 9t9 23zM1184 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 256v128q0 14 -9 23t-23 9h-128
q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1536 896v256h-160q-40 0 -68 28t-28 68v160h-640v-512h896z" />
    <glyph glyph-name="_403" unicode="&#xf1ad;" 
d="M1344 1536q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280zM512 1248v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 992v-64q0 -14 9 -23t23 -9h64q14 0 23 9
t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 736v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 480v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 160v64
q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64
q14 0 23 9t9 23zM384 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 -96v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9
t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM896 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 928v64
q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 160v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64
q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9
t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23z" />
    <glyph glyph-name="_404" unicode="&#xf1ae;" horiz-adv-x="1280" 
d="M1188 988l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68t28 68q29 28 68.5 28t67.5 -28l228 -228h368l228 228q28 28 68 28t68 -28q28 -29 28 -68.5t-28 -67.5zM864 1152
q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
    <glyph glyph-name="uniF1B1" unicode="&#xf1b0;" horiz-adv-x="1664" 
d="M780 1064q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5zM438 581q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152q0 80 42 139.5t119 59.5
q76 0 141.5 -55.5t100.5 -134t35 -152.5zM832 608q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146q0 86 56 191.5t139.5 192.5t187.5 146t193 59zM1071 819
q-61 0 -105 39t-63 92.5t-19 113.5q0 74 30 151.5t91.5 135t138.5 57.5q61 0 105 -39t63 -92.5t19 -113.5q0 -73 -30 -151t-92 -135.5t-138 -57.5zM1503 923q77 0 119 -59.5t42 -139.5q0 -74 -35 -152t-100.5 -133.5t-141.5 -55.5q-77 0 -119 59t-42 139q0 74 35 152.5
t100.5 134t141.5 55.5z" />
    <glyph glyph-name="_406" unicode="&#xf1b1;" horiz-adv-x="768" 
d="M704 1008q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5z" />
    <glyph glyph-name="_407" unicode="&#xf1b2;" horiz-adv-x="1792" 
d="M896 -93l640 349v636l-640 -233v-752zM832 772l698 254l-698 254l-698 -254zM1664 1024v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73z
" />
    <glyph glyph-name="_408" unicode="&#xf1b3;" horiz-adv-x="2304" 
d="M640 -96l384 192v314l-384 -164v-342zM576 358l404 173l-404 173l-404 -173zM1664 -96l384 192v314l-384 -164v-342zM1600 358l404 173l-404 173l-404 -173zM1152 651l384 165v266l-384 -164v-267zM1088 1030l441 189l-441 189l-441 -189zM2176 512v-416q0 -36 -19 -67
t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-4 2 -7 4q-2 -2 -7 -4l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70
v-400l434 -186q36 -16 57 -48t21 -70z" />
    <glyph glyph-name="_409" unicode="&#xf1b4;" horiz-adv-x="2048" 
d="M1848 1197h-511v-124h511v124zM1596 771q-90 0 -146 -52.5t-62 -142.5h408q-18 195 -200 195zM1612 186q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658
q0 -111 57.5 -171.5t166.5 -60.5zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5t45.5 113.5q0 144 -190 144h-260v-294zM0 1282h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204
q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611v1260z" />
    <glyph glyph-name="_410" unicode="&#xf1b5;" 
d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM499 1041h-371v-787h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5
t-56.5 60.5t-79 29.5t-97 8.5zM477 723h-176v184h163q119 0 119 -90q0 -94 -106 -94zM486 388h-185v217h189q124 0 124 -113q0 -104 -128 -104zM1136 356q-68 0 -104 38t-36 107h411q1 10 1 30q0 132 -74.5 220.5t-203.5 88.5q-128 0 -210 -86t-82 -216q0 -135 79 -217
t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20zM1126 722q113 0 124 -122h-254q4 56 39 89t91 33zM964 988h319v-77h-319v77z" />
    <glyph glyph-name="_411" unicode="&#xf1b6;" horiz-adv-x="1792" 
d="M1582 954q0 -101 -71.5 -172.5t-172.5 -71.5t-172.5 71.5t-71.5 172.5t71.5 172.5t172.5 71.5t172.5 -71.5t71.5 -172.5zM812 212q0 104 -73 177t-177 73q-27 0 -54 -6l104 -42q77 -31 109.5 -106.5t1.5 -151.5q-31 -77 -107 -109t-152 -1q-21 8 -62 24.5t-61 24.5
q32 -60 91 -96.5t130 -36.5q104 0 177 73t73 177zM1642 953q0 126 -89.5 215.5t-215.5 89.5q-127 0 -216.5 -89.5t-89.5 -215.5q0 -127 89.5 -216t216.5 -89q126 0 215.5 89t89.5 216zM1792 953q0 -189 -133.5 -322t-321.5 -133l-437 -319q-12 -129 -109 -218t-229 -89
q-121 0 -214 76t-118 192l-230 92v429l389 -157q79 48 173 48q13 0 35 -2l284 407q2 187 135.5 319t320.5 132q188 0 321.5 -133.5t133.5 -321.5z" />
    <glyph glyph-name="_412" unicode="&#xf1b7;" 
d="M1242 889q0 80 -57 136.5t-137 56.5t-136.5 -57t-56.5 -136q0 -80 56.5 -136.5t136.5 -56.5t137 56.5t57 136.5zM632 301q0 -83 -58 -140.5t-140 -57.5q-56 0 -103 29t-72 77q52 -20 98 -40q60 -24 120 1.5t85 86.5q24 60 -1.5 120t-86.5 84l-82 33q22 5 42 5
q82 0 140 -57.5t58 -140.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v153l172 -69q20 -92 93.5 -152t168.5 -60q104 0 181 70t87 173l345 252q150 0 255.5 105.5t105.5 254.5q0 150 -105.5 255.5t-255.5 105.5
q-148 0 -253 -104.5t-107 -252.5l-225 -322q-9 1 -28 1q-75 0 -137 -37l-297 119v468q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5zM1289 887q0 -100 -71 -170.5t-171 -70.5t-170.5 70.5t-70.5 170.5t70.5 171t170.5 71q101 0 171.5 -70.5t70.5 -171.5z
" />
    <glyph glyph-name="_413" unicode="&#xf1b8;" horiz-adv-x="1792" 
d="M836 367l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5q-11 27 -14.5 55t4 65t12 55t21.5 64t19 53q78 -12 509 -28zM449 953l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188
l-140 86zM1680 436l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164l-230 367l211 362l7 -173q170 -16 283 -5t170 33zM895 1360q-47 -63 -265 -435l-317 187l-19 12l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5
t36 -39.5t32 -35zM1550 1053l212 -363q18 -37 12.5 -76t-27.5 -74q-13 -20 -33 -37t-38 -28t-48.5 -22t-47 -16t-51.5 -14t-46 -12q-34 72 -265 436l313 195zM1407 1279l142 83l-220 -373l-419 20l151 86q-34 89 -75 166t-75.5 123.5t-64.5 80t-47 46.5l-17 13l405 -1
q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 -190z" />
    <glyph glyph-name="_414" unicode="&#xf1b9;" horiz-adv-x="2048" 
d="M480 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM516 768h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5zM1888 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM2048 544v-384
q0 -14 -9 -23t-23 -9h-96v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-1024v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h768q98 0 179 -63.5t104 -157.5
l105 -419h28q93 0 158.5 -65.5t65.5 -158.5z" />
    <glyph glyph-name="_415" unicode="&#xf1ba;" horiz-adv-x="2048" 
d="M1824 640q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-96v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-1024v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5
t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h128q98 0 179 -63.5t104 -157.5l105 -419h28zM320 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM516 640h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5z
M1728 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47z" />
    <glyph glyph-name="_416" unicode="&#xf1bb;" 
d="M1504 64q0 -26 -19 -45t-45 -19h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45t19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384
q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45z" />
    <glyph glyph-name="_417" unicode="&#xf1bc;" 
d="M1127 326q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5zM1223 541q0 40 -35 61q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64
q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5zM1331 789q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37
q159 0 309.5 -34t253.5 -95q21 -12 40 -12q29 0 50.5 20.5t21.5 51.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="_418" unicode="&#xf1bd;" horiz-adv-x="1024" 
d="M1024 1233l-303 -582l24 -31h279v-415h-507l-44 -30l-142 -273l-30 -30h-301v303l303 583l-24 30h-279v415h507l44 30l142 273l30 30h301v-303z" />
    <glyph glyph-name="_419" unicode="&#xf1be;" horiz-adv-x="2304" 
d="M784 164l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17l-14 -523l14 -241q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23zM1080 193l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6l-10 -579q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11
q11 0 20 9q9 7 9 20zM35 533l20 -128l-20 -126q-2 -9 -9 -9t-9 9l-17 126l17 128q2 9 9 9t9 -9zM121 612l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10l-23 202l23 207q0 9 9 9q8 0 10 -9zM401 159zM213 650l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11l-21 237l21 245
q2 12 12 12q11 0 11 -12zM307 657l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13l-21 244l21 252q0 13 13 13q12 0 14 -13zM401 639l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5l-20 246l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15zM784 164zM495 785
l21 -380l-21 -246q0 -7 -5 -12.5t-12 -5.5q-16 0 -18 18l-18 246l18 380q2 18 18 18q7 0 12 -5.5t5 -12.5zM589 871l19 -468l-19 -244q0 -8 -5.5 -13.5t-13.5 -5.5q-18 0 -20 19l-16 244l16 468q2 19 20 19q8 0 13.5 -5.5t5.5 -13.5zM687 911l18 -506l-18 -242
q-2 -21 -22 -21q-19 0 -21 21l-16 242l16 506q0 9 6.5 15.5t14.5 6.5q9 0 15 -6.5t7 -15.5zM1079 169v0v0v0zM881 915l15 -510l-15 -239q0 -10 -7.5 -17.5t-17.5 -7.5t-17 7t-8 18l-14 239l14 510q0 11 7.5 18t17.5 7t17.5 -7t7.5 -18zM980 896l14 -492l-14 -236
q0 -11 -8 -19t-19 -8t-19 8t-9 19l-12 236l12 492q1 12 9 20t19 8t18.5 -8t8.5 -20zM1192 404l-14 -231v0q0 -13 -9 -22t-22 -9t-22 9t-10 22l-6 114l-6 117l12 636v3q2 15 12 24q9 7 20 7q8 0 15 -5q14 -8 16 -26zM2304 423q0 -117 -83 -199.5t-200 -82.5h-786
q-13 2 -22 11t-9 22v899q0 23 28 33q85 34 181 34q195 0 338 -131.5t160 -323.5q53 22 110 22q117 0 200 -83t83 -201z" />
    <glyph glyph-name="uniF1C0" unicode="&#xf1c0;" 
d="M768 768q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 0q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127
t443 -43zM768 384q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 1536q208 0 385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5
t-103 128v128q0 69 103 128t280 93.5t385 34.5z" />
    <glyph glyph-name="uniF1C1" unicode="&#xf1c1;" 
d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
M894 465q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4q52 85 107 197
q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238zM318 54q52 24 137 158q-51 -40 -87.5 -84t-49.5 -74zM716 974q-15 -42 -2 -132q1 7 7 44q0 3 7 43q1 4 4 8
q-1 1 -1 2q-1 2 -1 3q-1 22 -13 36q0 -1 -1 -2v-2zM592 313q135 54 284 81q-2 1 -13 9.5t-16 13.5q-76 67 -127 176q-27 -86 -83 -197q-30 -56 -45 -83zM1238 329q-24 24 -140 24q76 -28 124 -28q14 0 18 1q0 1 -2 3z" />
    <glyph glyph-name="_422" unicode="&#xf1c2;" 
d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
M233 768v-107h70l164 -661h159l128 485q7 20 10 46q2 16 2 24h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4q0 3 -0.5 6.5t-1.5 8t-1 6.5q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5
t-3.5 -21.5l-4 -21h-4l-2 21q-2 26 -7 46l-99 438h90v107h-300z" />
    <glyph glyph-name="_423" unicode="&#xf1c3;" 
d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
M429 106v-106h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107
h-290v-107h68l189 -272l-194 -283h-68z" />
    <glyph glyph-name="_424" unicode="&#xf1c4;" 
d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
M416 106v-106h327v106h-93v167h137q76 0 118 15q67 23 106.5 87t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92zM769 386h-119v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15z" />
    <glyph glyph-name="_425" unicode="&#xf1c5;" 
d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
M1280 320v-320h-1024v192l192 192l128 -128l384 384zM448 512q-80 0 -136 56t-56 136t56 136t136 56t136 -56t56 -136t-56 -136t-136 -56z" />
    <glyph glyph-name="_426" unicode="&#xf1c6;" 
d="M640 1152v128h-128v-128h128zM768 1024v128h-128v-128h128zM640 896v128h-128v-128h128zM768 768v128h-128v-128h128zM1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400
v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536h1280zM781 593l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5q0 25 8 52q21 63 120 396v128h128v-128h79
q22 0 39 -13t23 -34zM640 128q53 0 90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45t37.5 -45t90.5 -19z" />
    <glyph glyph-name="_427" unicode="&#xf1c7;" 
d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
M620 686q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h131l166 167q16 15 35 7zM1037 -3q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -17 -23.5 -43.5t14.5 -47.5
q100 -123 100 -282t-100 -282q-17 -21 -14.5 -47.5t23.5 -42.5q18 -15 40 -15zM826 145q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 -131t-52 -131q-19 -20 -18 -46.5t20 -44.5q20 -17 44 -17z" />
    <glyph glyph-name="_428" unicode="&#xf1c8;" 
d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
M768 768q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h384zM1260 766q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9l-265 266v90l265 266q9 9 23 9q4 0 12 -2z" />
    <glyph glyph-name="_429" unicode="&#xf1c9;" 
d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
M480 768q8 11 21 12.5t24 -6.5l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5l-226 301q-14 19 0 38zM1282 467q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6.5l-51 38q-11 8 -12.5 21t6.5 24l182 243
l-182 243q-8 11 -6.5 24t12.5 21l51 38q11 8 24 6.5t21 -12.5zM662 6q-13 2 -20.5 13t-5.5 24l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5z" />
    <glyph glyph-name="_430" unicode="&#xf1ca;" 
d="M1497 709v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406
q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14z" />
    <glyph glyph-name="_431" unicode="&#xf1cb;" horiz-adv-x="1792" 
d="M216 367l603 -402v359l-334 223zM154 511l193 129l-193 129v-258zM973 -35l603 402l-269 180l-334 -223v-359zM896 458l272 182l-272 182l-272 -182zM485 733l334 223v359l-603 -402zM1445 640l193 -129v258zM1307 733l269 180l-603 402v-359zM1792 913v-546
q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64z" />
    <glyph glyph-name="_432" unicode="&#xf1cc;" horiz-adv-x="2048" 
d="M1800 764q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94
q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 84.5 -21t73 -55t65 -75t69 -82t77 -75t97 -55
t121.5 -21q121 0 204.5 71.5t83.5 190.5q0 121 -84 192t-207 71q-143 0 -241 -97l93 -108q66 64 142 64q52 0 92 -33t40 -84q0 -57 -37 -91.5t-94 -34.5q-43 0 -82.5 21t-72 55t-65.5 75t-69.5 82t-77.5 75t-96.5 55t-118.5 21q-122 0 -207 -70.5t-85 -189.5z" />
    <glyph glyph-name="_433" unicode="&#xf1cd;" horiz-adv-x="1792" 
d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 1408q-190 0 -361 -90l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90zM218 279l194 194
q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361t90 -361zM896 -128q190 0 361 90l-194 194q-82 -28 -167 -28t-167 28l-194 -194q171 -90 361 -90zM896 256q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5
t271.5 -112.5zM1380 473l194 -194q90 171 90 361t-90 361l-194 -194q28 -82 28 -167t-28 -167z" />
    <glyph glyph-name="_434" unicode="&#xf1ce;" horiz-adv-x="1792" 
d="M1760 640q0 -176 -68.5 -336t-184 -275.5t-275.5 -184t-336 -68.5t-336 68.5t-275.5 184t-184 275.5t-68.5 336q0 213 97 398.5t265 305.5t374 151v-228q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5
t136.5 204t51 248.5q0 230 -145.5 406t-366.5 221v228q206 -31 374 -151t265 -305.5t97 -398.5z" />
    <glyph glyph-name="uniF1D0" unicode="&#xf1d0;" horiz-adv-x="1792" 
d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41
t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115q-44 -14 -85 -50t-60 -65l-19 -29q-31 -56 -48 -133.5t-7 -170
t57 -156.5q33 -45 77.5 -60.5t85 -5.5t76 26.5t57.5 33.5l21 16q60 53 96.5 115t48.5 121.5t10 121.5t-18 118t-37 107.5t-45.5 93t-45 72t-34.5 47.5l-13 17q-14 13 -7 13l10 -3q40 -29 62.5 -46t62 -50t64 -58t58.5 -65t55.5 -77t45.5 -88t38 -103t23.5 -117t10.5 -136
q3 -259 -108 -465t-312 -321t-456 -115q-185 0 -351 74t-283.5 198t-184 293t-60.5 353z" />
    <glyph glyph-name="uniF1D1" unicode="&#xf1d1;" horiz-adv-x="1792" 
d="M874 -102v-66q-208 6 -385 109.5t-283 275.5l58 34q29 -49 73 -99l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13zM276 428l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385t98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212zM1528 251
l58 -34q-106 -172 -283 -275.5t-385 -109.5v66q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99zM1377 805l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241q-52 -10 -98 -10t-98 10l48 241q-90 18 -147 85l-185 -162
q-67 77 -98 169l232 80q-14 42 -14 85t14 85l-233 80q33 93 99 169l185 -162q59 68 147 86l-48 240q44 10 98 10t98 -10l-48 -240q88 -18 147 -86l185 162q66 -76 99 -169zM874 1448v-66q-65 -2 -121 -13l17 -86q-220 -42 -368 -211l-65 56q-38 -42 -73 -98l-57 33
q106 172 282 275.5t385 109.5zM1705 640q0 -205 -98 -385l-57 33q27 52 49 112l-83 28q36 103 36 212q0 112 -35 212l82 28q-19 56 -49 112l57 33q98 -180 98 -385zM1585 1063l-57 -33q-35 56 -73 98l-65 -56q-148 169 -368 211l17 86q-56 11 -121 13v66q209 -6 385 -109.5
t282 -275.5zM1748 640q0 173 -67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331t67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71
t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
    <glyph glyph-name="uniF1D2" unicode="&#xf1d2;" 
d="M582 228q0 -66 -93 -66q-107 0 -107 63q0 64 98 64q102 0 102 -61zM546 694q0 -85 -74 -85q-77 0 -77 84q0 90 77 90q36 0 55 -25.5t19 -63.5zM712 769v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85
q0 -53 41 -77v-3q-113 -37 -113 -139q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13zM771 350h137q-2 27 -2 82v387q0 46 2 69h-137q3 -23 3 -71v-392
q0 -50 -3 -75zM1280 366v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117q36 3 37 3q3 0 11 -0.5t12 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24zM924 1072
q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="_438" unicode="&#xf1d3;" horiz-adv-x="1792" 
d="M595 22q0 100 -165 100q-158 0 -158 -104q0 -101 172 -101q151 0 151 105zM536 777q0 61 -30 102t-89 41q-124 0 -124 -145q0 -135 124 -135q119 0 119 137zM805 1101v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58
q0 -31 22.5 -51.5t58 -32t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47
q98 0 218 47zM1123 220h-222q4 45 4 134v609q0 94 -4 128h222q-4 -33 -4 -124v-613q0 -89 4 -134zM1724 442v-196q-71 -39 -174 -39q-62 0 -107 20t-70 50t-39.5 78t-18.5 92t-4 103v351h2v4q-7 0 -19 1t-18 1q-21 0 -59 -6v190h96v76q0 54 -6 89h227q-6 -41 -6 -165h171
v-190q-15 0 -43.5 2t-42.5 2h-85v-365q0 -131 87 -131q61 0 109 33zM1148 1389q0 -58 -39 -101.5t-96 -43.5q-58 0 -98 43.5t-40 101.5q0 59 39.5 103t98.5 44q58 0 96.5 -44.5t38.5 -102.5z" />
    <glyph glyph-name="_439" unicode="&#xf1d4;" 
d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="uniF1D5" unicode="&#xf1d5;" horiz-adv-x="1280" 
d="M842 964q0 -80 -57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5t29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5
t136.5 -56.5t56.5 -136.5zM1223 953q0 -158 -78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153t-153 102t-186 38t-186 -38t-153 -102t-102 -153
t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5z" />
    <glyph glyph-name="uniF1D6" unicode="&#xf1d6;" horiz-adv-x="1792" 
d="M270 730q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5t3.5 -5t2 -3.5
q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 -4 -16t-7 -18q-64 -97 -302 -97q-53 0 -110.5 9t-98 20
t-104.5 30q-15 5 -23 7q-14 4 -46 4.5t-40 1.5q-41 -45 -127.5 -65t-168.5 -20q-35 0 -69 1.5t-93 9t-101 20.5t-74.5 40t-32.5 64q0 40 10 59.5t41 48.5q11 2 40.5 13t49.5 12q4 0 14 2q2 2 2 4l-2 3q-48 11 -108 105.5t-73 156.5l-5 3q-4 0 -12 -20q-18 -41 -54.5 -74.5
t-77.5 -37.5h-1q-4 0 -6 4.5t-5 5.5q-23 54 -23 100q0 275 252 466z" />
    <glyph glyph-name="uniF1D7" unicode="&#xf1d7;" horiz-adv-x="2048" 
d="M580 1075q0 41 -25 66t-66 25q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5zM1323 568q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51zM1087 1075q0 41 -24.5 66t-65.5 25
q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5zM1722 568q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51zM1456 965q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5
q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5zM2048 404q0 -117 -68.5 -223.5t-185.5 -193.5l55 -181l-199 109
q-150 -37 -218 -37q-169 0 -311 70.5t-223.5 191.5t-81.5 264t81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5z" />
    <glyph glyph-name="_443" unicode="&#xf1d8;" horiz-adv-x="1792" 
d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11z" />
    <glyph glyph-name="_444" unicode="&#xf1d9;" horiz-adv-x="1792" 
d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55q-3 39 32 59l1664 960q35 21 68 -2zM1422 26l221 1323l-1434 -827l336 -137
l863 639l-478 -797z" />
    <glyph glyph-name="_445" unicode="&#xf1da;" 
d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5
t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298zM896 928v-448q0 -14 -9 -23
t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23z" />
    <glyph glyph-name="_446" unicode="&#xf1db;" 
d="M768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103
t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="_447" unicode="&#xf1dc;" horiz-adv-x="1792" 
d="M1682 -128q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5t45 -15
t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5t-3.5 42t-6.5 36.5t-11 31.5t-16 18q-15 10 -45 12t-53 2
t-41 14t-18 45q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160
q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -140q16 -10 46 -13.5t53.5 -4.5t41.5 -15.5t18 -44.5
q0 -26 -12 -48t-36 -22z" />
    <glyph glyph-name="_448" unicode="&#xf1dd;" horiz-adv-x="1280" 
d="M1278 1347v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179
q-64 117 -64 259q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43z" />
    <glyph glyph-name="_449" unicode="&#xf1de;" 
d="M352 128v-128h-352v128h352zM704 256q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM864 640v-128h-864v128h864zM224 1152v-128h-224v128h224zM1536 128v-128h-736v128h736zM576 1280q26 0 45 -19t19 -45v-256
q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1216 768q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1536 640v-128h-224v128h224zM1536 1152v-128h-864v128h864z" />
    <glyph glyph-name="uniF1E0" unicode="&#xf1e0;" 
d="M1216 512q133 0 226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5t93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5
t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86z" />
    <glyph glyph-name="_451" unicode="&#xf1e1;" 
d="M1280 341q0 88 -62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5t62.5 -150.5
t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5t150.5 62.5t62.5 150.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="_452" unicode="&#xf1e2;" horiz-adv-x="1792" 
d="M571 947q-10 25 -34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49t35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49zM1513 1303l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5
t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68zM1521 1359q-10 -10 -22 -10q-13 0 -23 10l-91 90q-9 10 -9 23t9 23q10 9 23 9t23 -9l90 -91
q10 -9 10 -22.5t-10 -22.5zM1751 1129q-11 -9 -23 -9t-23 9l-90 91q-10 9 -10 22.5t10 22.5q9 10 22.5 10t22.5 -10l91 -90q9 -10 9 -23t-9 -23zM1792 1312q0 -14 -9 -23t-23 -9h-96q-14 0 -23 9t-9 23t9 23t23 9h96q14 0 23 -9t9 -23zM1600 1504v-96q0 -14 -9 -23t-23 -9
t-23 9t-9 23v96q0 14 9 23t23 9t23 -9t9 -23zM1751 1449l-91 -90q-10 -10 -22 -10q-13 0 -23 10q-10 9 -10 22.5t10 22.5l90 91q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
    <glyph glyph-name="_453" unicode="&#xf1e3;" horiz-adv-x="1792" 
d="M609 720l287 208l287 -208l-109 -336h-355zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1515 186q149 203 149 454v3l-102 -89l-240 224l63 323
l134 -12q-150 206 -389 282l53 -124l-287 -159l-287 159l53 124q-239 -76 -389 -282l135 12l62 -323l-240 -224l-102 89v-3q0 -251 149 -454l30 132l326 -40l139 -298l-116 -69q117 -39 240 -39t240 39l-116 69l139 298l326 40z" />
    <glyph glyph-name="_454" unicode="&#xf1e4;" horiz-adv-x="1792" 
d="M448 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM256 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM832 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23
v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM66 768q-28 0 -47 19t-19 46v129h514v-129q0 -27 -19 -46t-46 -19h-383zM1216 224v-192q0 -14 -9 -23t-23 -9h-192
q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1600 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23
zM1408 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1016v-13h-514v10q0 104 -382 102q-382 -1 -382 -102v-10h-514v13q0 17 8.5 43t34 64t65.5 75.5t110.5 76t160 67.5t224 47.5t293.5 18.5t293 -18.5t224 -47.5
t160.5 -67.5t110.5 -76t65.5 -75.5t34 -64t8.5 -43zM1792 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 962v-129q0 -27 -19 -46t-46 -19h-384q-27 0 -46 19t-19 46v129h514z" />
    <glyph glyph-name="_455" unicode="&#xf1e5;" horiz-adv-x="1792" 
d="M704 1216v-768q0 -26 -19 -45t-45 -19v-576q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v512l249 873q7 23 31 23h424zM1024 1216v-704h-256v704h256zM1792 320v-512q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v576q-26 0 -45 19t-19 45v768h424q24 0 31 -23z
M736 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23zM1408 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23z" />
    <glyph glyph-name="_456" unicode="&#xf1e6;" horiz-adv-x="1792" 
d="M1755 1083q37 -38 37 -90.5t-37 -90.5l-401 -400l150 -150l-160 -160q-163 -163 -389.5 -186.5t-411.5 100.5l-362 -362h-181v181l362 362q-124 185 -100.5 411.5t186.5 389.5l160 160l150 -150l400 401q38 37 91 37t90 -37t37 -90.5t-37 -90.5l-400 -401l234 -234
l401 400q38 37 91 37t90 -37z" />
    <glyph glyph-name="_457" unicode="&#xf1e7;" horiz-adv-x="1792" 
d="M873 796q0 -83 -63.5 -142.5t-152.5 -59.5t-152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59t152.5 -59t63.5 -143zM1375 796q0 -83 -63 -142.5t-153 -59.5q-89 0 -152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59q90 0 153 -59t63 -143zM1600 616v667q0 87 -32 123.5
t-111 36.5h-1112q-83 0 -112.5 -34t-29.5 -126v-673q43 -23 88.5 -40t81 -28t81 -18.5t71 -11t70 -4t58.5 -0.5t56.5 2t44.5 2q68 1 95 -27q6 -6 10 -9q26 -25 61 -51q7 91 118 87q5 0 36.5 -1.5t43 -2t45.5 -1t53 1t54.5 4.5t61 8.5t62 13.5t67 19.5t67.5 27t72 34.5z
M1763 621q-121 -149 -372 -252q84 -285 -23 -465q-66 -113 -183 -148q-104 -32 -182 15q-86 51 -82 164l-1 326v1q-8 2 -24.5 6t-23.5 5l-1 -338q4 -114 -83 -164q-79 -47 -183 -15q-117 36 -182 150q-105 180 -22 463q-251 103 -372 252q-25 37 -4 63t60 -1q4 -2 11.5 -7
t10.5 -8v694q0 72 47 123t114 51h1257q67 0 114 -51t47 -123v-694l21 15q39 27 60 1t-4 -63z" />
    <glyph glyph-name="_458" unicode="&#xf1e8;" horiz-adv-x="1792" 
d="M896 1102v-434h-145v434h145zM1294 1102v-434h-145v434h145zM1294 342l253 254v795h-1194v-1049h326v-217l217 217h398zM1692 1536v-1013l-434 -434h-326l-217 -217h-217v217h-398v1158l109 289h1483z" />
    <glyph glyph-name="_459" unicode="&#xf1e9;" 
d="M773 217v-127q-1 -292 -6 -305q-12 -32 -51 -40q-54 -9 -181.5 38t-162.5 89q-13 15 -17 36q-1 12 4 26q4 10 34 47t181 216q1 0 60 70q15 19 39.5 24.5t49.5 -3.5q24 -10 37.5 -29t12.5 -42zM624 468q-3 -55 -52 -70l-120 -39q-275 -88 -292 -88q-35 2 -54 36
q-12 25 -17 75q-8 76 1 166.5t30 124.5t56 32q13 0 202 -77q71 -29 115 -47l84 -34q23 -9 35.5 -30.5t11.5 -48.5zM1450 171q-7 -54 -91.5 -161t-135.5 -127q-37 -14 -63 7q-14 10 -184 287l-47 77q-14 21 -11.5 46t19.5 46q35 43 83 26q1 -1 119 -40q203 -66 242 -79.5
t47 -20.5q28 -22 22 -61zM778 803q5 -102 -54 -122q-58 -17 -114 71l-378 598q-8 35 19 62q41 43 207.5 89.5t224.5 31.5q40 -10 49 -45q3 -18 22 -305.5t24 -379.5zM1440 695q3 -39 -26 -59q-15 -10 -329 -86q-67 -15 -91 -23l1 2q-23 -6 -46 4t-37 32q-30 47 0 87
q1 1 75 102q125 171 150 204t34 39q28 19 65 2q48 -23 123 -133.5t81 -167.5v-3z" />
    <glyph glyph-name="_460" unicode="&#xf1ea;" horiz-adv-x="2048" 
d="M1024 1024h-384v-384h384v384zM1152 384v-128h-640v128h640zM1152 1152v-640h-640v640h640zM1792 384v-128h-512v128h512zM1792 640v-128h-512v128h512zM1792 896v-128h-512v128h512zM1792 1152v-128h-512v128h512zM256 192v960h-128v-960q0 -26 19 -45t45 -19t45 19
t19 45zM1920 192v1088h-1536v-1088q0 -33 -11 -64h1483q26 0 45 19t19 45zM2048 1408v-1216q0 -80 -56 -136t-136 -56h-1664q-80 0 -136 56t-56 136v1088h256v128h1792z" />
    <glyph glyph-name="_461" unicode="&#xf1eb;" horiz-adv-x="2048" 
d="M1024 13q-20 0 -93 73.5t-73 93.5q0 32 62.5 54t103.5 22t103.5 -22t62.5 -54q0 -20 -73 -93.5t-93 -73.5zM1294 284q-2 0 -40 25t-101.5 50t-128.5 25t-128.5 -25t-101 -50t-40.5 -25q-18 0 -93.5 75t-75.5 93q0 13 10 23q78 77 196 121t233 44t233 -44t196 -121
q10 -10 10 -23q0 -18 -75.5 -93t-93.5 -75zM1567 556q-11 0 -23 8q-136 105 -252 154.5t-268 49.5q-85 0 -170.5 -22t-149 -53t-113.5 -62t-79 -53t-31 -22q-17 0 -92 75t-75 93q0 12 10 22q132 132 320 205t380 73t380 -73t320 -205q10 -10 10 -22q0 -18 -75 -93t-92 -75z
M1838 827q-11 0 -22 9q-179 157 -371.5 236.5t-420.5 79.5t-420.5 -79.5t-371.5 -236.5q-11 -9 -22 -9q-17 0 -92.5 75t-75.5 93q0 13 10 23q187 186 445 288t527 102t527 -102t445 -288q10 -10 10 -23q0 -18 -75.5 -93t-92.5 -75z" />
    <glyph glyph-name="_462" unicode="&#xf1ec;" horiz-adv-x="1792" 
d="M384 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5
t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5
t37.5 90.5zM384 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 768q0 53 -37.5 90.5t-90.5 37.5
t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1536 0v384q0 52 -38 90t-90 38t-90 -38t-38 -90v-384q0 -52 38 -90t90 -38t90 38t38 90zM1152 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z
M1536 1088v256q0 26 -19 45t-45 19h-1280q-26 0 -45 -19t-19 -45v-256q0 -26 19 -45t45 -19h1280q26 0 45 19t19 45zM1536 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1408v-1536q0 -52 -38 -90t-90 -38
h-1408q-52 0 -90 38t-38 90v1536q0 52 38 90t90 38h1408q52 0 90 -38t38 -90z" />
    <glyph glyph-name="_463" unicode="&#xf1ed;" 
d="M1519 890q18 -84 -4 -204q-87 -444 -565 -444h-44q-25 0 -44 -16.5t-24 -42.5l-4 -19l-55 -346l-2 -15q-5 -26 -24.5 -42.5t-44.5 -16.5h-251q-21 0 -33 15t-9 36q9 56 26.5 168t26.5 168t27 167.5t27 167.5q5 37 43 37h131q133 -2 236 21q175 39 287 144q102 95 155 246
q24 70 35 133q1 6 2.5 7.5t3.5 1t6 -3.5q79 -59 98 -162zM1347 1172q0 -107 -46 -236q-80 -233 -302 -315q-113 -40 -252 -42q0 -1 -90 -1l-90 1q-100 0 -118 -96q-2 -8 -85 -530q-1 -10 -12 -10h-295q-22 0 -36.5 16.5t-11.5 38.5l232 1471q5 29 27.5 48t51.5 19h598
q34 0 97.5 -13t111.5 -32q107 -41 163.5 -123t56.5 -196z" />
    <glyph glyph-name="_464" unicode="&#xf1ee;" horiz-adv-x="1792" 
d="M441 864q33 0 52 -26q266 -364 362 -774h-446q-127 441 -367 749q-12 16 -3 33.5t29 17.5h373zM1000 507q-49 -199 -125 -393q-79 310 -256 594q40 221 44 449q211 -340 337 -650zM1099 1216q235 -324 384.5 -698.5t184.5 -773.5h-451q-41 665 -553 1472h435zM1792 640
q0 -424 -101 -812q-67 560 -359 1083q-25 301 -106 584q-4 16 5.5 28.5t25.5 12.5h359q21 0 38.5 -13t22.5 -33q115 -409 115 -850z" />
    <glyph glyph-name="uniF1F0" unicode="&#xf1f0;" horiz-adv-x="2304" 
d="M1975 546h-138q14 37 66 179l3 9q4 10 10 26t9 26l12 -55zM531 611l-58 295q-11 54 -75 54h-268l-2 -13q311 -79 403 -336zM710 960l-162 -438l-17 89q-26 70 -85 129.5t-131 88.5l135 -510h175l261 641h-176zM849 318h166l104 642h-166zM1617 944q-69 27 -149 27
q-123 0 -201 -59t-79 -153q-1 -102 145 -174q48 -23 67 -41t19 -39q0 -30 -30 -46t-69 -16q-86 0 -156 33l-22 11l-23 -144q74 -34 185 -34q130 -1 208.5 59t80.5 160q0 106 -140 174q-49 25 -71 42t-22 38q0 22 24.5 38.5t70.5 16.5q70 1 124 -24l15 -8zM2042 960h-128
q-65 0 -87 -54l-246 -588h174l35 96h212q5 -22 20 -96h154zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
    <glyph glyph-name="_466" unicode="&#xf1f1;" horiz-adv-x="2304" 
d="M1119 1195q-128 85 -281 85q-103 0 -197.5 -40.5t-162.5 -108.5t-108.5 -162t-40.5 -197q0 -104 40.5 -198t108.5 -162t162 -108.5t198 -40.5q153 0 281 85q-131 107 -178 265.5t0.5 316.5t177.5 265zM1152 1171q-126 -99 -172 -249.5t-0.5 -300.5t172.5 -249
q127 99 172.5 249t-0.5 300.5t-172 249.5zM1185 1195q130 -107 177.5 -265.5t0.5 -317t-178 -264.5q128 -85 281 -85q104 0 198 40.5t162 108.5t108.5 162t40.5 198q0 103 -40.5 197t-108.5 162t-162.5 108.5t-197.5 40.5q-153 0 -281 -85zM1926 473h7v3h-17v-3h7v-17h3v17z
M1955 456h4v20h-5l-6 -13l-6 13h-5v-20h3v15l6 -13h4l5 13v-15zM1947 16v-2h-2h-3v3h3h2v-1zM1947 7h3l-4 5h2l1 1q1 1 1 3t-1 3l-1 1h-3h-6v-13h3v5h1zM685 75q0 19 11 31t30 12q18 0 29 -12.5t11 -30.5q0 -19 -11 -31t-29 -12q-19 0 -30 12t-11 31zM1158 119q30 0 35 -32
h-70q5 32 35 32zM1514 75q0 19 11 31t29 12t29.5 -12.5t11.5 -30.5q0 -19 -11 -31t-30 -12q-18 0 -29 12t-11 31zM1786 75q0 18 11.5 30.5t29.5 12.5t29.5 -12.5t11.5 -30.5q0 -19 -11.5 -31t-29.5 -12t-29.5 12.5t-11.5 30.5zM1944 3q-2 0 -4 1q-1 0 -3 2t-2 3q-1 2 -1 4
q0 3 1 4q0 2 2 4l1 1q2 0 2 1q2 1 4 1q3 0 4 -1l4 -2l2 -4v-1q1 -2 1 -3l-1 -1v-3t-1 -1l-1 -2q-2 -2 -4 -2q-1 -1 -4 -1zM599 7h30v85q0 24 -14.5 38.5t-39.5 15.5q-32 0 -47 -24q-14 24 -45 24q-24 0 -39 -20v16h-30v-135h30v75q0 36 33 36q30 0 30 -36v-75h29v75
q0 36 33 36q30 0 30 -36v-75zM765 7h29v68v67h-29v-16q-17 20 -43 20q-29 0 -48 -20t-19 -51t19 -51t48 -20q28 0 43 20v-17zM943 48q0 34 -47 40l-14 2q-23 4 -23 14q0 15 25 15q23 0 43 -11l12 24q-22 14 -55 14q-26 0 -41 -12t-15 -32q0 -33 47 -39l13 -2q24 -4 24 -14
q0 -17 -31 -17q-25 0 -45 14l-13 -23q25 -17 58 -17q29 0 45.5 12t16.5 32zM1073 14l-8 25q-13 -7 -26 -7q-19 0 -19 22v61h48v27h-48v41h-30v-41h-28v-27h28v-61q0 -50 47 -50q21 0 36 10zM1159 146q-29 0 -48 -20t-19 -51q0 -32 19.5 -51.5t49.5 -19.5q33 0 55 19l-14 22
q-18 -15 -39 -15q-34 0 -41 33h101v12q0 32 -18 51.5t-46 19.5zM1318 146q-23 0 -35 -20v16h-30v-135h30v76q0 35 29 35q10 0 18 -4l9 28q-9 4 -21 4zM1348 75q0 -31 19.5 -51t52.5 -20q29 0 48 16l-14 24q-18 -13 -35 -12q-18 0 -29.5 12t-11.5 31t11.5 31t29.5 12
q19 0 35 -12l14 24q-20 16 -48 16q-33 0 -52.5 -20t-19.5 -51zM1593 7h30v68v67h-30v-16q-15 20 -42 20q-29 0 -48.5 -20t-19.5 -51t19.5 -51t48.5 -20q28 0 42 20v-17zM1726 146q-23 0 -35 -20v16h-29v-135h29v76q0 35 29 35q10 0 18 -4l9 28q-8 4 -21 4zM1866 7h29v68v122
h-29v-71q-15 20 -43 20t-47.5 -20.5t-19.5 -50.5t19.5 -50.5t47.5 -20.5q29 0 43 20v-17zM1944 27l-2 -1h-3q-2 -1 -4 -3q-3 -1 -3 -4q-1 -2 -1 -6q0 -3 1 -5q0 -2 3 -4q2 -2 4 -3t5 -1q4 0 6 1q0 1 2 2l2 1q1 1 3 4q1 2 1 5q0 4 -1 6q-1 1 -3 4q0 1 -2 2l-2 1q-1 0 -3 0.5
t-3 0.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
    <glyph glyph-name="_467" unicode="&#xf1f2;" horiz-adv-x="2304" 
d="M313 759q0 -51 -36 -84q-29 -26 -89 -26h-17v220h17q61 0 89 -27q36 -31 36 -83zM2089 824q0 -52 -64 -52h-19v101h20q63 0 63 -49zM380 759q0 74 -50 120.5t-129 46.5h-95v-333h95q74 0 119 38q60 51 60 128zM410 593h65v333h-65v-333zM730 694q0 40 -20.5 62t-75.5 42
q-29 10 -39.5 19t-10.5 23q0 16 13.5 26.5t34.5 10.5q29 0 53 -27l34 44q-41 37 -98 37q-44 0 -74 -27.5t-30 -67.5q0 -35 18 -55.5t64 -36.5q37 -13 45 -19q19 -12 19 -34q0 -20 -14 -33.5t-36 -13.5q-48 0 -71 44l-42 -40q44 -64 115 -64q51 0 83 30.5t32 79.5zM1008 604
v77q-37 -37 -78 -37q-49 0 -80.5 32.5t-31.5 82.5q0 48 31.5 81.5t77.5 33.5q43 0 81 -38v77q-40 20 -80 20q-74 0 -125.5 -50.5t-51.5 -123.5t51 -123.5t125 -50.5q42 0 81 19zM2240 0v527q-65 -40 -144.5 -84t-237.5 -117t-329.5 -137.5t-417.5 -134.5t-504 -118h1569
q26 0 45 19t19 45zM1389 757q0 75 -53 128t-128 53t-128 -53t-53 -128t53 -128t128 -53t128 53t53 128zM1541 584l144 342h-71l-90 -224l-89 224h-71l142 -342h35zM1714 593h184v56h-119v90h115v56h-115v74h119v57h-184v-333zM2105 593h80l-105 140q76 16 76 94q0 47 -31 73
t-87 26h-97v-333h65v133h9zM2304 1274v-1268q0 -56 -38.5 -95t-93.5 -39h-2040q-55 0 -93.5 39t-38.5 95v1268q0 56 38.5 95t93.5 39h2040q55 0 93.5 -39t38.5 -95z" />
    <glyph glyph-name="f1f3" unicode="&#xf1f3;" horiz-adv-x="2304" 
d="M119 854h89l-45 108zM740 328l74 79l-70 79h-163v-49h142v-55h-142v-54h159zM898 406l99 -110v217zM1186 453q0 33 -40 33h-84v-69h83q41 0 41 36zM1475 457q0 29 -42 29h-82v-61h81q43 0 43 32zM1197 923q0 29 -42 29h-82v-60h81q43 0 43 31zM1656 854h89l-44 108z
M699 1009v-271h-66v212l-94 -212h-57l-94 212v-212h-132l-25 60h-135l-25 -60h-70l116 271h96l110 -257v257h106l85 -184l77 184h108zM1255 453q0 -20 -5.5 -35t-14 -25t-22.5 -16.5t-26 -10t-31.5 -4.5t-31.5 -1t-32.5 0.5t-29.5 0.5v-91h-126l-80 90l-83 -90h-256v271h260
l80 -89l82 89h207q109 0 109 -89zM964 794v-56h-217v271h217v-57h-152v-49h148v-55h-148v-54h152zM2304 235v-229q0 -55 -38.5 -94.5t-93.5 -39.5h-2040q-55 0 -93.5 39.5t-38.5 94.5v678h111l25 61h55l25 -61h218v46l19 -46h113l20 47v-47h541v99l10 1q10 0 10 -14v-86h279
v23q23 -12 55 -18t52.5 -6.5t63 0.5t51.5 1l25 61h56l25 -61h227v58l34 -58h182v378h-180v-44l-25 44h-185v-44l-23 44h-249q-69 0 -109 -22v22h-172v-22q-24 22 -73 22h-628l-43 -97l-43 97h-198v-44l-22 44h-169l-78 -179v391q0 55 38.5 94.5t93.5 39.5h2040
q55 0 93.5 -39.5t38.5 -94.5v-678h-120q-51 0 -81 -22v22h-177q-55 0 -78 -22v22h-316v-22q-31 22 -87 22h-209v-22q-23 22 -91 22h-234l-54 -58l-50 58h-349v-378h343l55 59l52 -59h211v89h21q59 0 90 13v-102h174v99h8q8 0 10 -2t2 -10v-87h529q57 0 88 24v-24h168
q60 0 95 17zM1546 469q0 -23 -12 -43t-34 -29q25 -9 34 -26t9 -46v-54h-65v45q0 33 -12 43.5t-46 10.5h-69v-99h-65v271h154q48 0 77 -15t29 -58zM1269 936q0 -24 -12.5 -44t-33.5 -29q26 -9 34.5 -25.5t8.5 -46.5v-53h-65q0 9 0.5 26.5t0 25t-3 18.5t-8.5 16t-17.5 8.5
t-29.5 3.5h-70v-98h-64v271l153 -1q49 0 78 -14.5t29 -57.5zM1798 327v-56h-216v271h216v-56h-151v-49h148v-55h-148v-54zM1372 1009v-271h-66v271h66zM2065 357q0 -86 -102 -86h-126v58h126q34 0 34 25q0 16 -17 21t-41.5 5t-49.5 3.5t-42 22.5t-17 55q0 39 26 60t66 21
h130v-57h-119q-36 0 -36 -25q0 -16 17.5 -20.5t42 -4t49 -2.5t42 -21.5t17.5 -54.5zM2304 407v-101q-24 -35 -88 -35h-125v58h125q33 0 33 25q0 13 -12.5 19t-31 5.5t-40 2t-40 8t-31 24t-12.5 48.5q0 39 26.5 60t66.5 21h129v-57h-118q-36 0 -36 -25q0 -20 29 -22t68.5 -5
t56.5 -26zM2139 1008v-270h-92l-122 203v-203h-132l-26 60h-134l-25 -60h-75q-129 0 -129 133q0 138 133 138h63v-59q-7 0 -28 1t-28.5 0.5t-23 -2t-21.5 -6.5t-14.5 -13.5t-11.5 -23t-3 -33.5q0 -38 13.5 -58t49.5 -20h29l92 213h97l109 -256v256h99l114 -188v188h66z" />
    <glyph glyph-name="_469" unicode="&#xf1f4;" horiz-adv-x="2304" 
d="M745 630q0 -37 -25.5 -61.5t-62.5 -24.5q-29 0 -46.5 16t-17.5 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM1530 779q0 -42 -22 -57t-66 -15l-32 -1l17 107q2 11 13 11h18q22 0 35 -2t25 -12.5t12 -30.5zM1881 630q0 -36 -25.5 -61t-61.5 -25q-29 0 -47 16
t-18 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM513 801q0 59 -38.5 85.5t-100.5 26.5h-160q-19 0 -21 -19l-65 -408q-1 -6 3 -11t10 -5h76q20 0 22 19l18 110q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM822 489l41 261q1 6 -3 11t-10 5h-76
q-14 0 -17 -33q-27 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q28 0 58 12t48 32q-4 -12 -4 -21q0 -16 13 -16h69q19 0 22 19zM1269 752q0 5 -4 9.5t-9 4.5h-77q-11 0 -18 -10l-106 -156l-44 150q-5 16 -22 16h-75q-5 0 -9 -4.5t-4 -9.5q0 -2 19.5 -59
t42 -123t23.5 -70q-82 -112 -82 -120q0 -13 13 -13h77q11 0 18 10l255 368q2 2 2 7zM1649 801q0 59 -38.5 85.5t-100.5 26.5h-159q-20 0 -22 -19l-65 -408q-1 -6 3 -11t10 -5h82q12 0 16 13l18 116q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM1958 489
l41 261q1 6 -3 11t-10 5h-76q-14 0 -17 -33q-26 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q29 0 59 12t47 32q0 -1 -2 -9t-2 -12q0 -16 13 -16h69q19 0 22 19zM2176 898v1q0 14 -13 14h-74q-11 0 -13 -11l-65 -416l-1 -2q0 -5 4 -9.5t10 -4.5h66
q19 0 21 19zM392 764q-5 -35 -26 -46t-60 -11l-33 -1l17 107q2 11 13 11h19q40 0 58 -11.5t12 -48.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
    <glyph glyph-name="_470" unicode="&#xf1f5;" horiz-adv-x="2304" 
d="M1597 633q0 -69 -21 -106q-19 -35 -52 -35q-23 0 -41 9v224q29 30 57 30q57 0 57 -122zM2035 669h-110q6 98 56 98q51 0 54 -98zM476 534q0 59 -33 91.5t-101 57.5q-36 13 -52 24t-16 25q0 26 38 26q58 0 124 -33l18 112q-67 32 -149 32q-77 0 -123 -38q-48 -39 -48 -109
q0 -58 32.5 -90.5t99.5 -56.5q39 -14 54.5 -25.5t15.5 -27.5q0 -31 -48 -31q-29 0 -70 12.5t-72 30.5l-18 -113q72 -41 168 -41q81 0 129 37q51 41 51 117zM771 749l19 111h-96v135l-129 -21l-18 -114l-46 -8l-17 -103h62v-219q0 -84 44 -120q38 -30 111 -30q32 0 79 11v118
q-32 -7 -44 -7q-42 0 -42 50v197h77zM1087 724v139q-15 3 -28 3q-32 0 -55.5 -16t-33.5 -46l-10 56h-131v-471h150v306q26 31 82 31q16 0 26 -2zM1124 389h150v471h-150v-471zM1746 638q0 122 -45 179q-40 52 -111 52q-64 0 -117 -56l-8 47h-132v-645l150 25v151
q36 -11 68 -11q83 0 134 56q61 65 61 202zM1278 986q0 33 -23 56t-56 23t-56 -23t-23 -56t23 -56.5t56 -23.5t56 23.5t23 56.5zM2176 629q0 113 -48 176q-50 64 -144 64q-96 0 -151.5 -66t-55.5 -180q0 -128 63 -188q55 -55 161 -55q101 0 160 40l-16 103q-57 -31 -128 -31
q-43 0 -63 19q-23 19 -28 66h248q2 14 2 52zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
    <glyph glyph-name="_471" unicode="&#xf1f6;" horiz-adv-x="2048" 
d="M1558 684q61 -356 298 -556q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5zM1024 -176q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5zM2026 1424q8 -10 7.5 -23.5t-10.5 -22.5
l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5
l418 363q10 8 23.5 7t21.5 -11z" />
    <glyph glyph-name="_472" unicode="&#xf1f7;" horiz-adv-x="2048" 
d="M1040 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM503 315l877 760q-42 88 -132.5 146.5t-223.5 58.5q-93 0 -169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -384 -137 -645zM1856 128
q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5l149 129h757q-166 187 -227 459l111 97q61 -356 298 -556zM1942 1520l84 -96q8 -10 7.5 -23.5t-10.5 -22.5l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161
q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5l418 363q10 8 23.5 7t21.5 -11z" />
    <glyph glyph-name="_473" unicode="&#xf1f8;" horiz-adv-x="1408" 
d="M512 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM768 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1024 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704
q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167
q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
    <glyph glyph-name="_474" unicode="&#xf1f9;" 
d="M1150 462v-109q0 -50 -36.5 -89t-94 -60.5t-118 -32.5t-117.5 -11q-205 0 -342.5 139t-137.5 346q0 203 136 339t339 136q34 0 75.5 -4.5t93 -18t92.5 -34t69 -56.5t28 -81v-109q0 -16 -16 -16h-118q-16 0 -16 16v70q0 43 -65.5 67.5t-137.5 24.5q-140 0 -228.5 -91.5
t-88.5 -237.5q0 -151 91.5 -249.5t233.5 -98.5q68 0 138 24t70 66v70q0 7 4.5 11.5t10.5 4.5h119q6 0 11 -4.5t5 -11.5zM768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5
t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="_475" unicode="&#xf1fa;" 
d="M972 761q0 108 -53.5 169t-147.5 61q-63 0 -124 -30.5t-110 -84.5t-79.5 -137t-30.5 -180q0 -112 53.5 -173t150.5 -61q96 0 176 66.5t122.5 166t42.5 203.5zM1536 640q0 -111 -37 -197t-98.5 -135t-131.5 -74.5t-145 -27.5q-6 0 -15.5 -0.5t-16.5 -0.5q-95 0 -142 53
q-28 33 -33 83q-52 -66 -131.5 -110t-173.5 -44q-161 0 -249.5 95.5t-88.5 269.5q0 157 66 290t179 210.5t246 77.5q87 0 155 -35.5t106 -99.5l2 19l11 56q1 6 5.5 12t9.5 6h118q5 0 13 -11q5 -5 3 -16l-120 -614q-5 -24 -5 -48q0 -39 12.5 -52t44.5 -13q28 1 57 5.5t73 24
t77 50t57 89.5t24 137q0 292 -174 466t-466 174q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51q228 0 405 144q11 9 24 8t21 -12l41 -49q8 -12 7 -24q-2 -13 -12 -22q-102 -83 -227.5 -128t-258.5 -45q-156 0 -298 61
t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q344 0 556 -212t212 -556z" />
    <glyph glyph-name="_476" unicode="&#xf1fb;" horiz-adv-x="1792" 
d="M1698 1442q94 -94 94 -226.5t-94 -225.5l-225 -223l104 -104q10 -10 10 -23t-10 -23l-210 -210q-10 -10 -23 -10t-23 10l-105 105l-603 -603q-37 -37 -90 -37h-203l-256 -128l-64 64l128 256v203q0 53 37 90l603 603l-105 105q-10 10 -10 23t10 23l210 210q10 10 23 10
t23 -10l104 -104l223 225q93 94 225.5 94t226.5 -94zM512 64l576 576l-192 192l-576 -576v-192h192z" />
    <glyph glyph-name="f1fc" unicode="&#xf1fc;" horiz-adv-x="1792" 
d="M1615 1536q70 0 122.5 -46.5t52.5 -116.5q0 -63 -45 -151q-332 -629 -465 -752q-97 -91 -218 -91q-126 0 -216.5 92.5t-90.5 219.5q0 128 92 212l638 579q59 54 130 54zM706 502q39 -76 106.5 -130t150.5 -76l1 -71q4 -213 -129.5 -347t-348.5 -134q-123 0 -218 46.5
t-152.5 127.5t-86.5 183t-29 220q7 -5 41 -30t62 -44.5t59 -36.5t46 -17q41 0 55 37q25 66 57.5 112.5t69.5 76t88 47.5t103 25.5t125 10.5z" />
    <glyph glyph-name="_478" unicode="&#xf1fd;" horiz-adv-x="1792" 
d="M1792 128v-384h-1792v384q45 0 85 14t59 27.5t47 37.5q30 27 51.5 38t56.5 11q24 0 44 -7t31 -15t33 -27q29 -25 47 -38t58 -27t86 -14q45 0 85 14.5t58 27t48 37.5q21 19 32.5 27t31 15t43.5 7q35 0 56.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14t85 14t59 27.5
t47 37.5q30 27 51.5 38t56.5 11q34 0 55.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14zM1792 448v-192q-24 0 -44 7t-31 15t-33 27q-29 25 -47 38t-58 27t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-22 -19 -33 -27t-31 -15t-44 -7q-35 0 -56.5 11t-51.5 38q-29 25 -47 38
t-58 27t-86 14q-45 0 -85 -14.5t-58 -27t-48 -37.5q-21 -19 -32.5 -27t-31 -15t-43.5 -7q-35 0 -56.5 11t-51.5 38q-28 24 -47 37.5t-59 27.5t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-30 -27 -51.5 -38t-56.5 -11v192q0 80 56 136t136 56h64v448h256v-448h256v448h256v-448
h256v448h256v-448h64q80 0 136 -56t56 -136zM512 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1024 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5
q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1536 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150z" />
    <glyph glyph-name="_479" unicode="&#xf1fe;" horiz-adv-x="2048" 
d="M2048 0v-128h-2048v1536h128v-1408h1920zM1664 1024l256 -896h-1664v576l448 576l576 -576z" />
    <glyph glyph-name="_480" unicode="&#xf200;" horiz-adv-x="1792" 
d="M768 646l546 -546q-106 -108 -247.5 -168t-298.5 -60q-209 0 -385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103v-762zM955 640h773q0 -157 -60 -298.5t-168 -247.5zM1664 768h-768v768q209 0 385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="_481" unicode="&#xf201;" horiz-adv-x="2048" 
d="M2048 0v-128h-2048v1536h128v-1408h1920zM1920 1248v-435q0 -21 -19.5 -29.5t-35.5 7.5l-121 121l-633 -633q-10 -10 -23 -10t-23 10l-233 233l-416 -416l-192 192l585 585q10 10 23 10t23 -10l233 -233l464 464l-121 121q-16 16 -7.5 35.5t29.5 19.5h435q14 0 23 -9
t9 -23z" />
    <glyph glyph-name="_482" unicode="&#xf202;" horiz-adv-x="1792" 
d="M1292 832q0 -6 10 -41q10 -29 25 -49.5t41 -34t44 -20t55 -16.5q325 -91 325 -332q0 -146 -105.5 -242.5t-254.5 -96.5q-59 0 -111.5 18.5t-91.5 45.5t-77 74.5t-63 87.5t-53.5 103.5t-43.5 103t-39.5 106.5t-35.5 95q-32 81 -61.5 133.5t-73.5 96.5t-104 64t-142 20
q-96 0 -183 -55.5t-138 -144.5t-51 -185q0 -160 106.5 -279.5t263.5 -119.5q177 0 258 95q56 63 83 116l84 -152q-15 -34 -44 -70l1 -1q-131 -152 -388 -152q-147 0 -269.5 79t-190.5 207.5t-68 274.5q0 105 43.5 206t116 176.5t172 121.5t204.5 46q87 0 159 -19t123.5 -50
t95 -80t72.5 -99t58.5 -117t50.5 -124.5t50 -130.5t55 -127q96 -200 233 -200q81 0 138.5 48.5t57.5 128.5q0 42 -19 72t-50.5 46t-72.5 31.5t-84.5 27t-87.5 34t-81 52t-65 82t-39 122.5q-3 16 -3 33q0 110 87.5 192t198.5 78q78 -3 120.5 -14.5t90.5 -53.5h-1
q12 -11 23 -24.5t26 -36t19 -27.5l-129 -99q-26 49 -54 70v1q-23 21 -97 21q-49 0 -84 -33t-35 -83z" />
    <glyph glyph-name="_483" unicode="&#xf203;" 
d="M1432 484q0 173 -234 239q-35 10 -53 16.5t-38 25t-29 46.5q0 2 -2 8.5t-3 12t-1 7.5q0 36 24.5 59.5t60.5 23.5q54 0 71 -15h-1q20 -15 39 -51l93 71q-39 54 -49 64q-33 29 -67.5 39t-85.5 10q-80 0 -142 -57.5t-62 -137.5q0 -7 2 -23q16 -96 64.5 -140t148.5 -73
q29 -8 49 -15.5t45 -21.5t38.5 -34.5t13.5 -46.5v-5q1 -58 -40.5 -93t-100.5 -35q-97 0 -167 144q-23 47 -51.5 121.5t-48 125.5t-54 110.5t-74 95.5t-103.5 60.5t-147 24.5q-101 0 -192 -56t-144 -148t-50 -192v-1q4 -108 50.5 -199t133.5 -147.5t196 -56.5q186 0 279 110
q20 27 31 51l-60 109q-42 -80 -99 -116t-146 -36q-115 0 -191 87t-76 204q0 105 82 189t186 84q112 0 170 -53.5t104 -172.5q8 -21 25.5 -68.5t28.5 -76.5t31.5 -74.5t38.5 -74t45.5 -62.5t55.5 -53.5t66 -33t80 -13.5q107 0 183 69.5t76 174.5zM1536 1120v-960
q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="_484" unicode="&#xf204;" horiz-adv-x="2048" 
d="M1152 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1920 640q0 104 -40.5 198.5
t-109.5 163.5t-163.5 109.5t-198.5 40.5h-386q119 -90 188.5 -224t69.5 -288t-69.5 -288t-188.5 -224h386q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM2048 640q0 -130 -51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5
t-136.5 204t-51 248.5t51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5z" />
    <glyph glyph-name="_485" unicode="&#xf205;" horiz-adv-x="2048" 
d="M0 640q0 130 51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5t-51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5zM1408 128q104 0 198.5 40.5t163.5 109.5
t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5z" />
    <glyph glyph-name="_486" unicode="&#xf206;" horiz-adv-x="2304" 
d="M762 384h-314q-40 0 -57.5 35t6.5 67l188 251q-65 31 -137 31q-132 0 -226 -94t-94 -226t94 -226t226 -94q115 0 203 72.5t111 183.5zM576 512h186q-18 85 -75 148zM1056 512l288 384h-480l-99 -132q105 -103 126 -252h165zM2176 448q0 132 -94 226t-226 94
q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94t226 94t94 226zM2304 448q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 97 39.5 183.5t109.5 149.5l-65 98l-353 -469
q-18 -26 -51 -26h-197q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q114 0 215 -55l137 183h-224q-26 0 -45 19t-19 45t19 45t45 19h384v-128h435l-85 128h-222q-26 0 -45 19t-19 45t19 45t45 19h256q33 0 53 -28l267 -400
q91 44 192 44q185 0 316.5 -131.5t131.5 -316.5z" />
    <glyph glyph-name="_487" unicode="&#xf207;" 
d="M384 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1362 716l-72 384q-5 23 -22.5 37.5t-40.5 14.5
h-918q-23 0 -40.5 -14.5t-22.5 -37.5l-72 -384q-5 -30 14 -53t49 -23h1062q30 0 49 23t14 53zM1136 1328q0 20 -14 34t-34 14h-640q-20 0 -34 -14t-14 -34t14 -34t34 -14h640q20 0 34 14t14 34zM1536 603v-603h-128v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5
t-37.5 90.5v128h-768v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v128h-128v603q0 112 25 223l103 454q9 78 97.5 137t230 89t312.5 30t312.5 -30t230 -89t97.5 -137l105 -454q23 -102 23 -223z" />
    <glyph glyph-name="_488" unicode="&#xf208;" horiz-adv-x="2048" 
d="M1463 704q0 -35 -25 -60.5t-61 -25.5h-702q-36 0 -61 25.5t-25 60.5t25 60.5t61 25.5h702q36 0 61 -25.5t25 -60.5zM1677 704q0 86 -23 170h-982q-36 0 -61 25t-25 60q0 36 25 61t61 25h908q-88 143 -235 227t-320 84q-177 0 -327.5 -87.5t-238 -237.5t-87.5 -327
q0 -86 23 -170h982q36 0 61 -25t25 -60q0 -36 -25 -61t-61 -25h-908q88 -143 235.5 -227t320.5 -84q132 0 253 51.5t208 139t139 208t52 253.5zM2048 959q0 -35 -25 -60t-61 -25h-131q17 -85 17 -170q0 -167 -65.5 -319.5t-175.5 -263t-262.5 -176t-319.5 -65.5
q-246 0 -448.5 133t-301.5 350h-189q-36 0 -61 25t-25 61q0 35 25 60t61 25h132q-17 85 -17 170q0 167 65.5 319.5t175.5 263t262.5 176t320.5 65.5q245 0 447.5 -133t301.5 -350h188q36 0 61 -25t25 -61z" />
    <glyph glyph-name="_489" unicode="&#xf209;" horiz-adv-x="1280" 
d="M953 1158l-114 -328l117 -21q165 451 165 518q0 56 -38 56q-57 0 -130 -225zM654 471l33 -88q37 42 71 67l-33 5.5t-38.5 7t-32.5 8.5zM362 1367q0 -98 159 -521q17 10 49 10q15 0 75 -5l-121 351q-75 220 -123 220q-19 0 -29 -17.5t-10 -37.5zM283 608q0 -36 51.5 -119
t117.5 -153t100 -70q14 0 25.5 13t11.5 27q0 24 -32 102q-13 32 -32 72t-47.5 89t-61.5 81t-62 32q-20 0 -45.5 -27t-25.5 -47zM125 273q0 -41 25 -104q59 -145 183.5 -227t281.5 -82q227 0 382 170q152 169 152 427q0 43 -1 67t-11.5 62t-30.5 56q-56 49 -211.5 75.5
t-270.5 26.5q-37 0 -49 -11q-12 -5 -12 -35q0 -34 21.5 -60t55.5 -40t77.5 -23.5t87.5 -11.5t85 -4t70 0h23q24 0 40 -19q15 -19 19 -55q-28 -28 -96 -54q-61 -22 -93 -46q-64 -46 -108.5 -114t-44.5 -137q0 -31 18.5 -88.5t18.5 -87.5l-3 -12q-4 -12 -4 -14
q-137 10 -146 216q-8 -2 -41 -2q2 -7 2 -21q0 -53 -40.5 -89.5t-94.5 -36.5q-82 0 -166.5 78t-84.5 159q0 34 33 67q52 -64 60 -76q77 -104 133 -104q12 0 26.5 8.5t14.5 20.5q0 34 -87.5 145t-116.5 111q-43 0 -70 -44.5t-27 -90.5zM11 264q0 101 42.5 163t136.5 88
q-28 74 -28 104q0 62 61 123t122 61q29 0 70 -15q-163 462 -163 567q0 80 41 130.5t119 50.5q131 0 325 -581q6 -17 8 -23q6 16 29 79.5t43.5 118.5t54 127.5t64.5 123t70.5 86.5t76.5 36q71 0 112 -49t41 -122q0 -108 -159 -550q61 -15 100.5 -46t58.5 -78t26 -93.5
t7 -110.5q0 -150 -47 -280t-132 -225t-211 -150t-278 -55q-111 0 -223 42q-149 57 -258 191.5t-109 286.5z" />
    <glyph glyph-name="_490" unicode="&#xf20a;" horiz-adv-x="2048" 
d="M785 528h207q-14 -158 -98.5 -248.5t-214.5 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-203q-5 64 -35.5 99t-81.5 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t40 -51.5t66 -18q95 0 109 139zM1497 528h206
q-14 -158 -98 -248.5t-214 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-204q-4 64 -35 99t-81 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t39.5 -51.5t65.5 -18q49 0 76.5 38t33.5 101zM1856 647q0 207 -15.5 307
t-60.5 161q-6 8 -13.5 14t-21.5 15t-16 11q-86 63 -697 63q-625 0 -710 -63q-5 -4 -17.5 -11.5t-21 -14t-14.5 -14.5q-45 -60 -60 -159.5t-15 -308.5q0 -208 15 -307.5t60 -160.5q6 -8 15 -15t20.5 -14t17.5 -12q44 -33 239.5 -49t470.5 -16q610 0 697 65q5 4 17 11t20.5 14
t13.5 16q46 60 61 159t15 309zM2048 1408v-1536h-2048v1536h2048z" />
    <glyph glyph-name="_491" unicode="&#xf20b;" 
d="M992 912v-496q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v496q0 112 -80 192t-192 80h-272v-1152q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v1344q0 14 9 23t23 9h464q135 0 249 -66.5t180.5 -180.5t66.5 -249zM1376 1376v-880q0 -135 -66.5 -249t-180.5 -180.5
t-249 -66.5h-464q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-768h272q112 0 192 80t80 192v880q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
    <glyph glyph-name="_492" unicode="&#xf20c;" 
d="M1311 694v-114q0 -24 -13.5 -38t-37.5 -14h-202q-24 0 -38 14t-14 38v114q0 24 14 38t38 14h202q24 0 37.5 -14t13.5 -38zM821 464v250q0 53 -32.5 85.5t-85.5 32.5h-133q-68 0 -96 -52q-28 52 -96 52h-130q-53 0 -85.5 -32.5t-32.5 -85.5v-250q0 -22 21 -22h55
q22 0 22 22v230q0 24 13.5 38t38.5 14h94q24 0 38 -14t14 -38v-230q0 -22 21 -22h54q22 0 22 22v230q0 24 14 38t38 14h97q24 0 37.5 -14t13.5 -38v-230q0 -22 22 -22h55q21 0 21 22zM1410 560v154q0 53 -33 85.5t-86 32.5h-264q-53 0 -86 -32.5t-33 -85.5v-410
q0 -21 22 -21h55q21 0 21 21v180q31 -42 94 -42h191q53 0 86 32.5t33 85.5zM1536 1176v-1072q0 -96 -68 -164t-164 -68h-1072q-96 0 -164 68t-68 164v1072q0 96 68 164t164 68h1072q96 0 164 -68t68 -164z" />
    <glyph glyph-name="_493" unicode="&#xf20d;" 
d="M915 450h-294l147 551zM1001 128h311l-324 1024h-440l-324 -1024h311l383 314zM1536 1120v-960q0 -118 -85 -203t-203 -85h-960q-118 0 -203 85t-85 203v960q0 118 85 203t203 85h960q118 0 203 -85t85 -203z" />
    <glyph glyph-name="_494" unicode="&#xf20e;" horiz-adv-x="2048" 
d="M2048 641q0 -21 -13 -36.5t-33 -19.5l-205 -356q3 -9 3 -18q0 -20 -12.5 -35.5t-32.5 -19.5l-193 -337q3 -8 3 -16q0 -23 -16.5 -40t-40.5 -17q-25 0 -41 18h-400q-17 -20 -43 -20t-43 20h-399q-17 -20 -43 -20q-23 0 -40 16.5t-17 40.5q0 8 4 20l-193 335
q-20 4 -32.5 19.5t-12.5 35.5q0 9 3 18l-206 356q-20 5 -32.5 20.5t-12.5 35.5q0 21 13.5 36.5t33.5 19.5l199 344q0 1 -0.5 3t-0.5 3q0 36 34 51l209 363q-4 10 -4 18q0 24 17 40.5t40 16.5q26 0 44 -21h396q16 21 43 21t43 -21h398q18 21 44 21q23 0 40 -16.5t17 -40.5
q0 -6 -4 -18l207 -358q23 -1 39 -17.5t16 -38.5q0 -13 -7 -27l187 -324q19 -4 31.5 -19.5t12.5 -35.5zM1063 -158h389l-342 354h-143l-342 -354h360q18 16 39 16t39 -16zM112 654q1 -4 1 -13q0 -10 -2 -15l208 -360l15 -6l188 199v347l-187 194q-13 -8 -29 -10zM986 1438
h-388l190 -200l554 200h-280q-16 -16 -38 -16t-38 16zM1689 226q1 6 5 11l-64 68l-17 -79h76zM1583 226l22 105l-252 266l-296 -307l63 -64h463zM1495 -142l16 28l65 310h-427l333 -343q8 4 13 5zM578 -158h5l342 354h-373v-335l4 -6q14 -5 22 -13zM552 226h402l64 66
l-309 321l-157 -166v-221zM359 226h163v189l-168 -177q4 -8 5 -12zM358 1051q0 -1 0.5 -2t0.5 -2q0 -16 -8 -29l171 -177v269zM552 1121v-311l153 -157l297 314l-223 236zM556 1425l-4 -8v-264l205 74l-191 201q-6 -2 -10 -3zM1447 1438h-16l-621 -224l213 -225zM1023 946
l-297 -315l311 -319l296 307zM688 634l-136 141v-284zM1038 270l-42 -44h85zM1374 618l238 -251l132 624l-3 5l-1 1zM1718 1018q-8 13 -8 29v2l-216 376q-5 1 -13 5l-437 -463l310 -327zM522 1142v223l-163 -282zM522 196h-163l163 -283v283zM1607 196l-48 -227l130 227h-82
zM1729 266l207 361q-2 10 -2 14q0 1 3 16l-171 296l-129 -612l77 -82q5 3 15 7z" />
    <glyph glyph-name="f210" unicode="&#xf210;" 
d="M0 856q0 131 91.5 226.5t222.5 95.5h742l352 358v-1470q0 -132 -91.5 -227t-222.5 -95h-780q-131 0 -222.5 95t-91.5 227v790zM1232 102l-176 180v425q0 46 -32 79t-78 33h-484q-46 0 -78 -33t-32 -79v-492q0 -46 32.5 -79.5t77.5 -33.5h770z" />
    <glyph glyph-name="_496" unicode="&#xf211;" 
d="M934 1386q-317 -121 -556 -362.5t-358 -560.5q-20 89 -20 176q0 208 102.5 384.5t278.5 279t384 102.5q82 0 169 -19zM1203 1267q93 -65 164 -155q-389 -113 -674.5 -400.5t-396.5 -676.5q-93 72 -155 162q112 386 395 671t667 399zM470 -67q115 356 379.5 622t619.5 384
q40 -92 54 -195q-292 -120 -516 -345t-343 -518q-103 14 -194 52zM1536 -125q-193 50 -367 115q-135 -84 -290 -107q109 205 274 370.5t369 275.5q-21 -152 -101 -284q65 -175 115 -370z" />
    <glyph glyph-name="f212" unicode="&#xf212;" horiz-adv-x="2048" 
d="M1893 1144l155 -1272q-131 0 -257 57q-200 91 -393 91q-226 0 -374 -148q-148 148 -374 148q-193 0 -393 -91q-128 -57 -252 -57h-5l155 1272q224 127 482 127q233 0 387 -106q154 106 387 106q258 0 482 -127zM1398 157q129 0 232 -28.5t260 -93.5l-124 1021
q-171 78 -368 78q-224 0 -374 -141q-150 141 -374 141q-197 0 -368 -78l-124 -1021q105 43 165.5 65t148.5 39.5t178 17.5q202 0 374 -108q172 108 374 108zM1438 191l-55 907q-211 -4 -359 -155q-152 155 -374 155q-176 0 -336 -66l-114 -941q124 51 228.5 76t221.5 25
q209 0 374 -102q172 107 374 102z" />
    <glyph glyph-name="_498" unicode="&#xf213;" horiz-adv-x="2048" 
d="M1500 165v733q0 21 -15 36t-35 15h-93q-20 0 -35 -15t-15 -36v-733q0 -20 15 -35t35 -15h93q20 0 35 15t15 35zM1216 165v531q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-531q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM924 165v429q0 20 -15 35t-35 15h-101
q-20 0 -35 -15t-15 -35v-429q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM632 165v362q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-362q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM2048 311q0 -166 -118 -284t-284 -118h-1244q-166 0 -284 118t-118 284
q0 116 63 214.5t168 148.5q-10 34 -10 73q0 113 80.5 193.5t193.5 80.5q102 0 180 -67q45 183 194 300t338 117q149 0 275 -73.5t199.5 -199.5t73.5 -275q0 -66 -14 -122q135 -33 221 -142.5t86 -247.5z" />
    <glyph glyph-name="_499" unicode="&#xf214;" 
d="M0 1536h1536v-1392l-776 -338l-760 338v1392zM1436 209v926h-1336v-926l661 -294zM1436 1235v201h-1336v-201h1336zM181 937v-115h-37v115h37zM181 789v-115h-37v115h37zM181 641v-115h-37v115h37zM181 493v-115h-37v115h37zM181 345v-115h-37v115h37zM207 202l15 34
l105 -47l-15 -33zM343 142l15 34l105 -46l-15 -34zM478 82l15 34l105 -46l-15 -34zM614 23l15 33l104 -46l-15 -34zM797 10l105 46l15 -33l-105 -47zM932 70l105 46l15 -34l-105 -46zM1068 130l105 46l15 -34l-105 -46zM1203 189l105 47l15 -34l-105 -46zM259 1389v-36h-114
v36h114zM421 1389v-36h-115v36h115zM583 1389v-36h-115v36h115zM744 1389v-36h-114v36h114zM906 1389v-36h-114v36h114zM1068 1389v-36h-115v36h115zM1230 1389v-36h-115v36h115zM1391 1389v-36h-114v36h114zM181 1049v-79h-37v115h115v-36h-78zM421 1085v-36h-115v36h115z
M583 1085v-36h-115v36h115zM744 1085v-36h-114v36h114zM906 1085v-36h-114v36h114zM1068 1085v-36h-115v36h115zM1230 1085v-36h-115v36h115zM1355 970v79h-78v36h115v-115h-37zM1355 822v115h37v-115h-37zM1355 674v115h37v-115h-37zM1355 526v115h37v-115h-37zM1355 378
v115h37v-115h-37zM1355 230v115h37v-115h-37zM760 265q-129 0 -221 91.5t-92 221.5q0 129 92 221t221 92q130 0 221.5 -92t91.5 -221q0 -130 -91.5 -221.5t-221.5 -91.5zM595 646q0 -36 19.5 -56.5t49.5 -25t64 -7t64 -2t49.5 -9t19.5 -30.5q0 -49 -112 -49q-97 0 -123 51
h-3l-31 -63q67 -42 162 -42q29 0 56.5 5t55.5 16t45.5 33t17.5 53q0 46 -27.5 69.5t-67.5 27t-79.5 3t-67 5t-27.5 25.5q0 21 20.5 33t40.5 15t41 3q34 0 70.5 -11t51.5 -34h3l30 58q-3 1 -21 8.5t-22.5 9t-19.5 7t-22 7t-20 4.5t-24 4t-23 1q-29 0 -56.5 -5t-54 -16.5
t-43 -34t-16.5 -53.5z" />
    <glyph glyph-name="_500" unicode="&#xf215;" horiz-adv-x="2048" 
d="M863 504q0 112 -79.5 191.5t-191.5 79.5t-191 -79.5t-79 -191.5t79 -191t191 -79t191.5 79t79.5 191zM1726 505q0 112 -79 191t-191 79t-191.5 -79t-79.5 -191q0 -113 79.5 -192t191.5 -79t191 79.5t79 191.5zM2048 1314v-1348q0 -44 -31.5 -75.5t-76.5 -31.5h-1832
q-45 0 -76.5 31.5t-31.5 75.5v1348q0 44 31.5 75.5t76.5 31.5h431q44 0 76 -31.5t32 -75.5v-161h754v161q0 44 32 75.5t76 31.5h431q45 0 76.5 -31.5t31.5 -75.5z" />
    <glyph glyph-name="_501" unicode="&#xf216;" horiz-adv-x="2048" 
d="M1430 953zM1690 749q148 0 253 -98.5t105 -244.5q0 -157 -109 -261.5t-267 -104.5q-85 0 -162 27.5t-138 73.5t-118 106t-109 126t-103.5 132.5t-108.5 126.5t-117 106t-136 73.5t-159 27.5q-154 0 -251.5 -91.5t-97.5 -244.5q0 -157 104 -250t263 -93q100 0 208 37.5
t193 98.5q5 4 21 18.5t30 24t22 9.5q14 0 24.5 -10.5t10.5 -24.5q0 -24 -60 -77q-101 -88 -234.5 -142t-260.5 -54q-133 0 -245.5 58t-180 165t-67.5 241q0 205 141.5 341t347.5 136q120 0 226.5 -43.5t185.5 -113t151.5 -153t139 -167.5t133.5 -153.5t149.5 -113
t172.5 -43.5q102 0 168.5 61.5t66.5 162.5q0 95 -64.5 159t-159.5 64q-30 0 -81.5 -18.5t-68.5 -18.5q-20 0 -35.5 15t-15.5 35q0 18 8.5 57t8.5 59q0 159 -107.5 263t-266.5 104q-58 0 -111.5 -18.5t-84 -40.5t-55.5 -40.5t-33 -18.5q-15 0 -25.5 10.5t-10.5 25.5
q0 19 25 46q59 67 147 103.5t182 36.5q191 0 318 -125.5t127 -315.5q0 -37 -4 -66q57 15 115 15z" />
    <glyph glyph-name="_502" unicode="&#xf217;" horiz-adv-x="1664" 
d="M1216 832q0 26 -19 45t-45 19h-128v128q0 26 -19 45t-45 19t-45 -19t-19 -45v-128h-128q-26 0 -45 -19t-19 -45t19 -45t45 -19h128v-128q0 -26 19 -45t45 -19t45 19t19 45v128h128q26 0 45 19t19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5
t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920
q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
    <glyph glyph-name="_503" unicode="&#xf218;" horiz-adv-x="1664" 
d="M1280 832q0 26 -19 45t-45 19t-45 -19l-147 -146v293q0 26 -19 45t-45 19t-45 -19t-19 -45v-293l-147 146q-19 19 -45 19t-45 -19t-19 -45t19 -45l256 -256q19 -19 45 -19t45 19l256 256q19 19 19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5
t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920
q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
    <glyph glyph-name="_504" unicode="&#xf219;" horiz-adv-x="2048" 
d="M212 768l623 -665l-300 665h-323zM1024 -4l349 772h-698zM538 896l204 384h-262l-288 -384h346zM1213 103l623 665h-323zM683 896h682l-204 384h-274zM1510 896h346l-288 384h-262zM1651 1382l384 -512q14 -18 13 -41.5t-17 -40.5l-960 -1024q-18 -20 -47 -20t-47 20
l-960 1024q-16 17 -17 40.5t13 41.5l384 512q18 26 51 26h1152q33 0 51 -26z" />
    <glyph glyph-name="_505" unicode="&#xf21a;" horiz-adv-x="2048" 
d="M1811 -19q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83
q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83
q19 19 45 19t45 -19l83 -83zM237 19q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -82l83 82q19 19 45 19t45 -19l83 -82l64 64v293l-210 314q-17 26 -7 56.5t40 40.5l177 58v299h128v128h256v128h256v-128h256v-128h128v-299l177 -58q30 -10 40 -40.5t-7 -56.5l-210 -314
v-293l19 18q19 19 45 19t45 -19l83 -82l83 82q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83
q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83zM640 1152v-128l384 128l384 -128v128h-128v128h-512v-128h-128z" />
    <glyph glyph-name="_506" unicode="&#xf21b;" 
d="M576 0l96 448l-96 128l-128 64zM832 0l128 640l-128 -64l-96 -128zM992 1010q-2 4 -4 6q-10 8 -96 8q-70 0 -167 -19q-7 -2 -21 -2t-21 2q-97 19 -167 19q-86 0 -96 -8q-2 -2 -4 -6q2 -18 4 -27q2 -3 7.5 -6.5t7.5 -10.5q2 -4 7.5 -20.5t7 -20.5t7.5 -17t8.5 -17t9 -14
t12 -13.5t14 -9.5t17.5 -8t20.5 -4t24.5 -2q36 0 59 12.5t32.5 30t14.5 34.5t11.5 29.5t17.5 12.5h12q11 0 17.5 -12.5t11.5 -29.5t14.5 -34.5t32.5 -30t59 -12.5q13 0 24.5 2t20.5 4t17.5 8t14 9.5t12 13.5t9 14t8.5 17t7.5 17t7 20.5t7.5 20.5q2 7 7.5 10.5t7.5 6.5
q2 9 4 27zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 61 4.5 118t19 125.5t37.5 123.5t63.5 103.5t93.5 74.5l-90 220h214q-22 64 -22 128q0 12 2 32q-194 40 -194 96q0 57 210 99q17 62 51.5 134t70.5 114q32 37 76 37q30 0 84 -31t84 -31t84 31
t84 31q44 0 76 -37q36 -42 70.5 -114t51.5 -134q210 -42 210 -99q0 -56 -194 -96q7 -81 -20 -160h214l-82 -225q63 -33 107.5 -96.5t65.5 -143.5t29 -151.5t8 -148.5z" />
    <glyph glyph-name="_507" unicode="&#xf21c;" horiz-adv-x="2304" 
d="M2301 500q12 -103 -22 -198.5t-99 -163.5t-158.5 -106t-196.5 -31q-161 11 -279.5 125t-134.5 274q-12 111 27.5 210.5t118.5 170.5l-71 107q-96 -80 -151 -194t-55 -244q0 -27 -18.5 -46.5t-45.5 -19.5h-256h-69q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5
t-131.5 316.5t131.5 316.5t316.5 131.5q76 0 152 -27l24 45q-123 110 -304 110h-64q-26 0 -45 19t-19 45t19 45t45 19h128q78 0 145 -13.5t116.5 -38.5t71.5 -39.5t51 -36.5h512h115l-85 128h-222q-30 0 -49 22.5t-14 52.5q4 23 23 38t43 15h253q33 0 53 -28l70 -105
l114 114q19 19 46 19h101q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-179l115 -172q131 63 275 36q143 -26 244 -134.5t118 -253.5zM448 128q115 0 203 72.5t111 183.5h-314q-35 0 -55 31q-18 32 -1 63l147 277q-47 13 -91 13q-132 0 -226 -94t-94 -226t94 -226
t226 -94zM1856 128q132 0 226 94t94 226t-94 226t-226 94q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94z" />
    <glyph glyph-name="_508" unicode="&#xf21d;" 
d="M1408 0q0 -63 -61.5 -113.5t-164 -81t-225 -46t-253.5 -15.5t-253.5 15.5t-225 46t-164 81t-61.5 113.5q0 49 33 88.5t91 66.5t118 44.5t131 29.5q26 5 48 -10.5t26 -41.5q5 -26 -10.5 -48t-41.5 -26q-58 -10 -106 -23.5t-76.5 -25.5t-48.5 -23.5t-27.5 -19.5t-8.5 -12
q3 -11 27 -26.5t73 -33t114 -32.5t160.5 -25t201.5 -10t201.5 10t160.5 25t114 33t73 33.5t27 27.5q-1 4 -8.5 11t-27.5 19t-48.5 23.5t-76.5 25t-106 23.5q-26 4 -41.5 26t-10.5 48q4 26 26 41.5t48 10.5q71 -12 131 -29.5t118 -44.5t91 -66.5t33 -88.5zM1024 896v-384
q0 -26 -19 -45t-45 -19h-64v-384q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v384h-64q-26 0 -45 19t-19 45v384q0 53 37.5 90.5t90.5 37.5h384q53 0 90.5 -37.5t37.5 -90.5zM928 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5
t158.5 -65.5t65.5 -158.5z" />
    <glyph glyph-name="_509" unicode="&#xf21e;" horiz-adv-x="1792" 
d="M1280 512h305q-5 -6 -10 -10.5t-9 -7.5l-3 -4l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-5 2 -21 20h369q22 0 39.5 13.5t22.5 34.5l70 281l190 -667q6 -20 23 -33t39 -13q21 0 38 13t23 33l146 485l56 -112q18 -35 57 -35zM1792 940q0 -145 -103 -300h-369l-111 221
q-8 17 -25.5 27t-36.5 8q-45 -5 -56 -46l-129 -430l-196 686q-6 20 -23.5 33t-39.5 13t-39 -13.5t-22 -34.5l-116 -464h-423q-103 155 -103 300q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124
t127 -344z" />
    <glyph glyph-name="venus" unicode="&#xf221;" horiz-adv-x="1280" 
d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292
q11 134 80.5 249t182 188t245.5 88q170 19 319 -54t236 -212t87 -306zM128 960q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" />
    <glyph glyph-name="_511" unicode="&#xf222;" 
d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-382 -383q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5
q203 0 359 -126l382 382h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
    <glyph glyph-name="_512" unicode="&#xf223;" horiz-adv-x="1280" 
d="M830 1220q145 -72 233.5 -210.5t88.5 -305.5q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5
t-147.5 384.5q0 167 88.5 305.5t233.5 210.5q-165 96 -228 273q-6 16 3.5 29.5t26.5 13.5h69q21 0 29 -20q44 -106 140 -171t214 -65t214 65t140 171q8 20 37 20h61q17 0 26.5 -13.5t3.5 -29.5q-63 -177 -228 -273zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5
t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
    <glyph glyph-name="_513" unicode="&#xf224;" 
d="M1024 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64
q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-149 16 -270.5 103t-186.5 223.5t-53 291.5q16 204 160 353.5t347 172.5q118 14 228 -19t198 -103l255 254h-134q-14 0 -23 9t-9 23v64zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5
t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
    <glyph glyph-name="_514" unicode="&#xf225;" horiz-adv-x="1792" 
d="M1280 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64
q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5t-147.5 384.5q0 201 126 359l-52 53l-101 -111q-9 -10 -22 -10.5t-23 7.5l-48 44q-10 8 -10.5 21.5t8.5 23.5l105 115l-111 112v-134q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9
t-9 23v288q0 26 19 45t45 19h288q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-133l106 -107l86 94q9 10 22 10.5t23 -7.5l48 -44q10 -8 10.5 -21.5t-8.5 -23.5l-90 -99l57 -56q158 126 359 126t359 -126l255 254h-134q-14 0 -23 9t-9 23v64zM832 256q185 0 316.5 131.5
t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
    <glyph glyph-name="_515" unicode="&#xf226;" horiz-adv-x="1792" 
d="M1790 1007q12 -155 -52.5 -292t-186 -224t-271.5 -103v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-512v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23
t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292q17 206 164.5 356.5t352.5 169.5q206 21 377 -94q171 115 377 94q205 -19 352.5 -169.5t164.5 -356.5zM896 647q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM576 512q115 0 218 57q-154 165 -154 391
q0 224 154 391q-103 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5zM1152 128v260q-137 15 -256 94q-119 -79 -256 -94v-260h512zM1216 512q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5q-115 0 -218 -57q154 -167 154 -391
q0 -226 -154 -391q103 -57 218 -57z" />
    <glyph glyph-name="_516" unicode="&#xf227;" horiz-adv-x="1920" 
d="M1536 1120q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-31 -182 -166 -312t-318 -156q-210 -29 -384.5 80t-241.5 300q-117 6 -221 57.5t-177.5 133t-113.5 192.5t-32 230
q9 135 78 252t182 191.5t248 89.5q118 14 227.5 -19t198.5 -103l255 254h-134q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q59 -74 93 -169q182 -9 328 -124l255 254h-134q-14 0 -23 9
t-9 23v64zM1024 704q0 20 -4 58q-162 -25 -271 -150t-109 -292q0 -20 4 -58q162 25 271 150t109 292zM128 704q0 -168 111 -294t276 -149q-3 29 -3 59q0 210 135 369.5t338 196.5q-53 120 -163.5 193t-245.5 73q-185 0 -316.5 -131.5t-131.5 -316.5zM1088 -128
q185 0 316.5 131.5t131.5 316.5q0 168 -111 294t-276 149q3 -28 3 -59q0 -210 -135 -369.5t-338 -196.5q53 -120 163.5 -193t245.5 -73z" />
    <glyph glyph-name="_517" unicode="&#xf228;" horiz-adv-x="2048" 
d="M1664 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-32 -180 -164.5 -310t-313.5 -157q-223 -34 -409 90q-117 -78 -256 -93v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23
t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-155 17 -279.5 109.5t-187 237.5t-39.5 307q25 187 159.5 322.5t320.5 164.5q224 34 410 -90q146 97 320 97q201 0 359 -126l255 254h-134q-14 0 -23 9
t-9 23v64zM896 391q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM128 704q0 -185 131.5 -316.5t316.5 -131.5q117 0 218 57q-154 167 -154 391t154 391q-101 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5zM1216 256q185 0 316.5 131.5t131.5 316.5
t-131.5 316.5t-316.5 131.5q-117 0 -218 -57q154 -167 154 -391t-154 -391q101 -57 218 -57z" />
    <glyph glyph-name="_518" unicode="&#xf229;" 
d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-213 -214l140 -140q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-140 141l-78 -79q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5
t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5q203 0 359 -126l78 78l-172 172q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l172 -172l213 213h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5
t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
    <glyph glyph-name="_519" unicode="&#xf22a;" horiz-adv-x="1280" 
d="M640 892q217 -24 364.5 -187.5t147.5 -384.5q0 -167 -87 -306t-236 -212t-319 -54q-133 15 -245.5 88t-182 188t-80.5 249q-12 155 52.5 292t186 224t271.5 103v132h-160q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h160v165l-92 -92q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22
t9 23l202 201q19 19 45 19t45 -19l202 -201q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-92 92v-165h160q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-160v-132zM576 -128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5
t131.5 -316.5t316.5 -131.5z" />
    <glyph glyph-name="_520" unicode="&#xf22b;" horiz-adv-x="2048" 
d="M1901 621q19 -19 19 -45t-19 -45l-294 -294q-9 -10 -22.5 -10t-22.5 10l-45 45q-10 9 -10 22.5t10 22.5l185 185h-294v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-132q-24 -217 -187.5 -364.5t-384.5 -147.5q-167 0 -306 87t-212 236t-54 319q15 133 88 245.5
t188 182t249 80.5q155 12 292 -52.5t224 -186t103 -271.5h132v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h294l-185 185q-10 9 -10 22.5t10 22.5l45 45q9 10 22.5 10t22.5 -10zM576 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5
t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
    <glyph glyph-name="_521" unicode="&#xf22c;" horiz-adv-x="1280" 
d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-612q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v612q-217 24 -364.5 187.5t-147.5 384.5q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM576 512q185 0 316.5 131.5
t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
    <glyph glyph-name="_522" unicode="&#xf22d;" horiz-adv-x="1280" 
d="M1024 576q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1152 576q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123
t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5z" />
    <glyph glyph-name="_523" unicode="&#xf22e;" horiz-adv-x="1792" 
 />
    <glyph glyph-name="_524" unicode="&#xf22f;" horiz-adv-x="1792" 
 />
    <glyph glyph-name="_525" unicode="&#xf230;" 
d="M1451 1408q35 0 60 -25t25 -60v-1366q0 -35 -25 -60t-60 -25h-391v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-735q-35 0 -60 25t-25 60v1366q0 35 25 60t60 25h1366z" />
    <glyph glyph-name="_526" unicode="&#xf231;" horiz-adv-x="1280" 
d="M0 939q0 108 37.5 203.5t103.5 166.5t152 123t185 78t202 26q158 0 294 -66.5t221 -193.5t85 -287q0 -96 -19 -188t-60 -177t-100 -149.5t-145 -103t-189 -38.5q-68 0 -135 32t-96 88q-10 -39 -28 -112.5t-23.5 -95t-20.5 -71t-26 -71t-32 -62.5t-46 -77.5t-62 -86.5
l-14 -5l-9 10q-15 157 -15 188q0 92 21.5 206.5t66.5 287.5t52 203q-32 65 -32 169q0 83 52 156t132 73q61 0 95 -40.5t34 -102.5q0 -66 -44 -191t-44 -187q0 -63 45 -104.5t109 -41.5q55 0 102 25t78.5 68t56 95t38 110.5t20 111t6.5 99.5q0 173 -109.5 269.5t-285.5 96.5
q-200 0 -334 -129.5t-134 -328.5q0 -44 12.5 -85t27 -65t27 -45.5t12.5 -30.5q0 -28 -15 -73t-37 -45q-2 0 -17 3q-51 15 -90.5 56t-61 94.5t-32.5 108t-11 106.5z" />
    <glyph glyph-name="_527" unicode="&#xf232;" 
d="M985 562q13 0 97.5 -44t89.5 -53q2 -5 2 -15q0 -33 -17 -76q-16 -39 -71 -65.5t-102 -26.5q-57 0 -190 62q-98 45 -170 118t-148 185q-72 107 -71 194v8q3 91 74 158q24 22 52 22q6 0 18 -1.5t19 -1.5q19 0 26.5 -6.5t15.5 -27.5q8 -20 33 -88t25 -75q0 -21 -34.5 -57.5
t-34.5 -46.5q0 -7 5 -15q34 -73 102 -137q56 -53 151 -101q12 -7 22 -7q15 0 54 48.5t52 48.5zM782 32q127 0 243.5 50t200.5 134t134 200.5t50 243.5t-50 243.5t-134 200.5t-200.5 134t-243.5 50t-243.5 -50t-200.5 -134t-134 -200.5t-50 -243.5q0 -203 120 -368l-79 -233
l242 77q158 -104 345 -104zM782 1414q153 0 292.5 -60t240.5 -161t161 -240.5t60 -292.5t-60 -292.5t-161 -240.5t-240.5 -161t-292.5 -60q-195 0 -365 94l-417 -134l136 405q-108 178 -108 389q0 153 60 292.5t161 240.5t240.5 161t292.5 60z" />
    <glyph glyph-name="_528" unicode="&#xf233;" horiz-adv-x="1792" 
d="M128 128h1024v128h-1024v-128zM128 640h1024v128h-1024v-128zM1696 192q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM128 1152h1024v128h-1024v-128zM1696 704q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1696 1216
q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1792 384v-384h-1792v384h1792zM1792 896v-384h-1792v384h1792zM1792 1408v-384h-1792v384h1792z" />
    <glyph glyph-name="_529" unicode="&#xf234;" horiz-adv-x="2048" 
d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1664 512h352q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-352q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5
t-9.5 22.5v352h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v352q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-352zM928 288q0 -52 38 -90t90 -38h256v-238q-68 -50 -171 -50h-874q-121 0 -194 69t-73 190q0 53 3.5 103.5t14 109t26.5 108.5
t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q79 -61 154.5 -91.5t164.5 -30.5t164.5 30.5t154.5 91.5q20 17 39 17q132 0 217 -96h-223q-52 0 -90 -38t-38 -90v-192z" />
    <glyph glyph-name="_530" unicode="&#xf235;" horiz-adv-x="2048" 
d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1781 320l249 -249q9 -9 9 -23q0 -13 -9 -22l-136 -136q-9 -9 -22 -9q-14 0 -23 9l-249 249l-249 -249q-9 -9 -23 -9q-13 0 -22 9l-136 136
q-9 9 -9 22q0 14 9 23l249 249l-249 249q-9 9 -9 23q0 13 9 22l136 136q9 9 22 9q14 0 23 -9l249 -249l249 249q9 9 23 9q13 0 22 -9l136 -136q9 -9 9 -22q0 -14 -9 -23zM1283 320l-181 -181q-37 -37 -37 -91q0 -53 37 -90l83 -83q-21 -3 -44 -3h-874q-121 0 -194 69
t-73 190q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q154 -122 319 -122t319 122q20 17 39 17q28 0 57 -6q-28 -27 -41 -50t-13 -56q0 -54 37 -91z" />
    <glyph glyph-name="_531" unicode="&#xf236;" horiz-adv-x="2048" 
d="M256 512h1728q26 0 45 -19t19 -45v-448h-256v256h-1536v-256h-256v1216q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-704zM832 832q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM2048 576v64q0 159 -112.5 271.5t-271.5 112.5h-704
q-26 0 -45 -19t-19 -45v-384h1152z" />
    <glyph glyph-name="_532" unicode="&#xf237;" 
d="M1536 1536l-192 -448h192v-192h-274l-55 -128h329v-192h-411l-357 -832l-357 832h-411v192h329l-55 128h-274v192h192l-192 448h256l323 -768h378l323 768h256zM768 320l108 256h-216z" />
    <glyph glyph-name="_533" unicode="&#xf238;" 
d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM768 192q80 0 136 56t56 136t-56 136t-136 56
t-136 -56t-56 -136t56 -136t136 -56zM1344 768v512h-1152v-512h1152z" />
    <glyph glyph-name="_534" unicode="&#xf239;" 
d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM288 224q66 0 113 47t47 113t-47 113t-113 47
t-113 -47t-47 -113t47 -113t113 -47zM704 768v512h-544v-512h544zM1248 224q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM1408 768v512h-576v-512h576z" />
    <glyph glyph-name="_535" unicode="&#xf23a;" horiz-adv-x="1792" 
d="M597 1115v-1173q0 -25 -12.5 -42.5t-36.5 -17.5q-17 0 -33 8l-465 233q-21 10 -35.5 33.5t-14.5 46.5v1140q0 20 10 34t29 14q14 0 44 -15l511 -256q3 -3 3 -5zM661 1014l534 -866l-534 266v600zM1792 996v-1054q0 -25 -14 -40.5t-38 -15.5t-47 13l-441 220zM1789 1116
q0 -3 -256.5 -419.5t-300.5 -487.5l-390 634l324 527q17 28 52 28q14 0 26 -6l541 -270q4 -2 4 -6z" />
    <glyph glyph-name="_536" unicode="&#xf23b;" 
d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1408v-1536h-1536v1536h1536z" />
    <glyph glyph-name="_537" unicode="&#xf23c;" horiz-adv-x="2296" 
d="M478 -139q-8 -16 -27 -34.5t-37 -25.5q-25 -9 -51.5 3.5t-28.5 31.5q-1 22 40 55t68 38q23 4 34 -21.5t2 -46.5zM1819 -139q7 -16 26 -34.5t38 -25.5q25 -9 51.5 3.5t27.5 31.5q2 22 -39.5 55t-68.5 38q-22 4 -33 -21.5t-2 -46.5zM1867 -30q13 -27 56.5 -59.5t77.5 -41.5
q45 -13 82 4.5t37 50.5q0 46 -67.5 100.5t-115.5 59.5q-40 5 -63.5 -37.5t-6.5 -76.5zM428 -30q-13 -27 -56 -59.5t-77 -41.5q-45 -13 -82 4.5t-37 50.5q0 46 67.5 100.5t115.5 59.5q40 5 63 -37.5t6 -76.5zM1158 1094h1q-41 0 -76 -15q27 -8 44 -30.5t17 -49.5
q0 -35 -27 -60t-65 -25q-52 0 -80 43q-5 -23 -5 -42q0 -74 56 -126.5t135 -52.5q80 0 136 52.5t56 126.5t-56 126.5t-136 52.5zM1462 1312q-99 109 -220.5 131.5t-245.5 -44.5q27 60 82.5 96.5t118 39.5t121.5 -17t99.5 -74.5t44.5 -131.5zM2212 73q8 -11 -11 -42
q7 -23 7 -40q1 -56 -44.5 -112.5t-109.5 -91.5t-118 -37q-48 -2 -92 21.5t-66 65.5q-687 -25 -1259 0q-23 -41 -66.5 -65t-92.5 -22q-86 3 -179.5 80.5t-92.5 160.5q2 22 7 40q-19 31 -11 42q6 10 31 1q14 22 41 51q-7 29 2 38q11 10 39 -4q29 20 59 34q0 29 13 37
q23 12 51 -16q35 5 61 -2q18 -4 38 -19v73q-11 0 -18 2q-53 10 -97 44.5t-55 87.5q-9 38 0 81q15 62 93 95q2 17 19 35.5t36 23.5t33 -7.5t19 -30.5h13q46 -5 60 -23q3 -3 5 -7q10 1 30.5 3.5t30.5 3.5q-15 11 -30 17q-23 40 -91 43q0 6 1 10q-62 2 -118.5 18.5t-84.5 47.5
q-32 36 -42.5 92t-2.5 112q16 126 90 179q23 16 52 4.5t32 -40.5q0 -1 1.5 -14t2.5 -21t3 -20t5.5 -19t8.5 -10q27 -14 76 -12q48 46 98 74q-40 4 -162 -14l47 46q61 58 163 111q145 73 282 86q-20 8 -41 15.5t-47 14t-42.5 10.5t-47.5 11t-43 10q595 126 904 -139
q98 -84 158 -222q85 -10 121 9h1q5 3 8.5 10t5.5 19t3 19.5t3 21.5l1 14q3 28 32 40t52 -5q73 -52 91 -178q7 -57 -3.5 -113t-42.5 -91q-28 -32 -83.5 -48.5t-115.5 -18.5v-10q-71 -2 -95 -43q-14 -5 -31 -17q11 -1 32 -3.5t30 -3.5q1 5 5 8q16 18 60 23h13q5 18 19 30t33 8
t36 -23t19 -36q79 -32 93 -95q9 -40 1 -81q-12 -53 -56 -88t-97 -44q-10 -2 -17 -2q0 -49 -1 -73q20 15 38 19q26 7 61 2q28 28 51 16q14 -9 14 -37q33 -16 59 -34q27 13 38 4q10 -10 2 -38q28 -30 41 -51q23 8 31 -1zM1937 1025q0 -29 -9 -54q82 -32 112 -132
q4 37 -9.5 98.5t-41.5 90.5q-20 19 -36 17t-16 -20zM1859 925q35 -42 47.5 -108.5t-0.5 -124.5q67 13 97 45q13 14 18 28q-3 64 -31 114.5t-79 66.5q-15 -15 -52 -21zM1822 921q-30 0 -44 1q42 -115 53 -239q21 0 43 3q16 68 1 135t-53 100zM258 839q30 100 112 132
q-9 25 -9 54q0 18 -16.5 20t-35.5 -17q-28 -29 -41.5 -90.5t-9.5 -98.5zM294 737q29 -31 97 -45q-13 58 -0.5 124.5t47.5 108.5v0q-37 6 -52 21q-51 -16 -78.5 -66t-31.5 -115q9 -17 18 -28zM471 683q14 124 73 235q-19 -4 -55 -18l-45 -19v1q-46 -89 -20 -196q25 -3 47 -3z
M1434 644q8 -38 16.5 -108.5t11.5 -89.5q3 -18 9.5 -21.5t23.5 4.5q40 20 62 85.5t23 125.5q-24 2 -146 4zM1152 1285q-116 0 -199 -82.5t-83 -198.5q0 -117 83 -199.5t199 -82.5t199 82.5t83 199.5q0 116 -83 198.5t-199 82.5zM1380 646q-105 2 -211 0v1q-1 -27 2.5 -86
t13.5 -66q29 -14 93.5 -14.5t95.5 10.5q9 3 11 39t-0.5 69.5t-4.5 46.5zM1112 447q8 4 9.5 48t-0.5 88t-4 63v1q-212 -3 -214 -3q-4 -20 -7 -62t0 -83t14 -46q34 -15 101 -16t101 10zM718 636q-16 -59 4.5 -118.5t77.5 -84.5q15 -8 24 -5t12 21q3 16 8 90t10 103
q-69 -2 -136 -6zM591 510q3 -23 -34 -36q132 -141 271.5 -240t305.5 -154q172 49 310.5 146t293.5 250q-33 13 -30 34q0 2 0.5 3.5t1.5 3t1 2.5v1v-1q-17 2 -50 5.5t-48 4.5q-26 -90 -82 -132q-51 -38 -82 1q-5 6 -9 14q-7 13 -17 62q-2 -5 -5 -9t-7.5 -7t-8 -5.5t-9.5 -4
l-10 -2.5t-12 -2l-12 -1.5t-13.5 -1t-13.5 -0.5q-106 -9 -163 11q-4 -17 -10 -26.5t-21 -15t-23 -7t-36 -3.5q-6 -1 -9 -1q-179 -17 -203 40q-2 -63 -56 -54q-47 8 -91 54q-12 13 -20 26q-17 29 -26 65q-58 -6 -87 -10q1 -2 4 -10zM507 -118q3 14 3 30q-17 71 -51 130
t-73 70q-41 12 -101.5 -14.5t-104.5 -80t-39 -107.5q35 -53 100 -93t119 -42q51 -2 94 28t53 79zM510 53q23 -63 27 -119q195 113 392 174q-98 52 -180.5 120t-179.5 165q-6 -4 -29 -13q0 -1 -1 -4t-1 -5q31 -18 22 -37q-12 -23 -56 -34q-10 -13 -29 -24h-1q-2 -83 1 -150
q19 -34 35 -73zM579 -113q532 -21 1145 0q-254 147 -428 196q-76 -35 -156 -57q-8 -3 -16 0q-65 21 -129 49q-208 -60 -416 -188h-1v-1q1 0 1 1zM1763 -67q4 54 28 120q14 38 33 71l-1 -1q3 77 3 153q-15 8 -30 25q-42 9 -56 33q-9 20 22 38q-2 4 -2 9q-16 4 -28 12
q-204 -190 -383 -284q198 -59 414 -176zM2155 -90q5 54 -39 107.5t-104 80t-102 14.5q-38 -11 -72.5 -70.5t-51.5 -129.5q0 -16 3 -30q10 -49 53 -79t94 -28q54 2 119 42t100 93z" />
    <glyph glyph-name="_538" unicode="&#xf23d;" horiz-adv-x="2304" 
d="M1524 -25q0 -68 -48 -116t-116 -48t-116.5 48t-48.5 116t48.5 116.5t116.5 48.5t116 -48.5t48 -116.5zM775 -25q0 -68 -48.5 -116t-116.5 -48t-116 48t-48 116t48 116.5t116 48.5t116.5 -48.5t48.5 -116.5zM0 1469q57 -60 110.5 -104.5t121 -82t136 -63t166 -45.5
t200 -31.5t250 -18.5t304 -9.5t372.5 -2.5q139 0 244.5 -5t181 -16.5t124 -27.5t71 -39.5t24 -51.5t-19.5 -64t-56.5 -76.5t-89.5 -91t-116 -104.5t-139 -119q-185 -157 -286 -247q29 51 76.5 109t94 105.5t94.5 98.5t83 91.5t54 80.5t13 70t-45.5 55.5t-116.5 41t-204 23.5
t-304 5q-168 -2 -314 6t-256 23t-204.5 41t-159.5 51.5t-122.5 62.5t-91.5 66.5t-68 71.5t-50.5 69.5t-40 68t-36.5 59.5z" />
    <glyph glyph-name="_539" unicode="&#xf23e;" horiz-adv-x="1792" 
d="M896 1472q-169 0 -323 -66t-265.5 -177.5t-177.5 -265.5t-66 -323t66 -323t177.5 -265.5t265.5 -177.5t323 -66t323 66t265.5 177.5t177.5 265.5t66 323t-66 323t-177.5 265.5t-265.5 177.5t-323 66zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348
t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM496 704q16 0 16 -16v-480q0 -16 -16 -16h-32q-16 0 -16 16v480q0 16 16 16h32zM896 640q53 0 90.5 -37.5t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-114q0 -14 -9 -23
t-23 -9h-64q-14 0 -23 9t-9 23v114q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5zM896 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM544 928v-96
q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 93 65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5v-96q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 146 -103 249t-249 103t-249 -103t-103 -249zM1408 192v512q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-512
q0 -26 19 -45t45 -19h896q26 0 45 19t19 45z" />
    <glyph glyph-name="_540" unicode="&#xf240;" horiz-adv-x="2304" 
d="M1920 1024v-768h-1664v768h1664zM2048 448h128v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288zM2304 832v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113
v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160q53 0 90.5 -37.5t37.5 -90.5z" />
    <glyph glyph-name="_541" unicode="&#xf241;" horiz-adv-x="2304" 
d="M256 256v768h1280v-768h-1280zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9
h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
    <glyph glyph-name="_542" unicode="&#xf242;" horiz-adv-x="2304" 
d="M256 256v768h896v-768h-896zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9
h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
    <glyph glyph-name="_543" unicode="&#xf243;" horiz-adv-x="2304" 
d="M256 256v768h512v-768h-512zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9
h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
    <glyph glyph-name="_544" unicode="&#xf244;" horiz-adv-x="2304" 
d="M2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23
v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
    <glyph glyph-name="_545" unicode="&#xf245;" horiz-adv-x="1280" 
d="M1133 493q31 -30 14 -69q-17 -40 -59 -40h-382l201 -476q10 -25 0 -49t-34 -35l-177 -75q-25 -10 -49 0t-35 34l-191 452l-312 -312q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v1504q0 42 40 59q12 5 24 5q27 0 45 -19z" />
    <glyph glyph-name="_546" unicode="&#xf246;" horiz-adv-x="1024" 
d="M832 1408q-320 0 -320 -224v-416h128v-128h-128v-544q0 -224 320 -224h64v-128h-64q-272 0 -384 146q-112 -146 -384 -146h-64v128h64q320 0 320 224v544h-128v128h128v416q0 224 -320 224h-64v128h64q272 0 384 -146q112 146 384 146h64v-128h-64z" />
    <glyph glyph-name="_547" unicode="&#xf247;" horiz-adv-x="2048" 
d="M2048 1152h-128v-1024h128v-384h-384v128h-1280v-128h-384v384h128v1024h-128v384h384v-128h1280v128h384v-384zM1792 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 -128v128h-128v-128h128zM1664 0v128h128v1024h-128v128h-1280v-128h-128v-1024h128v-128
h1280zM1920 -128v128h-128v-128h128zM1280 896h384v-768h-896v256h-384v768h896v-256zM512 512h640v512h-640v-512zM1536 256v512h-256v-384h-384v-128h640z" />
    <glyph glyph-name="_548" unicode="&#xf248;" horiz-adv-x="2304" 
d="M2304 768h-128v-640h128v-384h-384v128h-896v-128h-384v384h128v128h-384v-128h-384v384h128v640h-128v384h384v-128h896v128h384v-384h-128v-128h384v128h384v-384zM2048 1024v-128h128v128h-128zM1408 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 256
v128h-128v-128h128zM1536 384h-128v-128h128v128zM384 384h896v128h128v640h-128v128h-896v-128h-128v-640h128v-128zM896 -128v128h-128v-128h128zM2176 -128v128h-128v-128h128zM2048 128v640h-128v128h-384v-384h128v-384h-384v128h-384v-128h128v-128h896v128h128z" />
    <glyph glyph-name="_549" unicode="&#xf249;" 
d="M1024 288v-416h-928q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68v-928h-416q-40 0 -68 -28t-28 -68zM1152 256h381q-15 -82 -65 -132l-184 -184q-50 -50 -132 -65v381z" />
    <glyph glyph-name="_550" unicode="&#xf24a;" 
d="M1400 256h-248v-248q29 10 41 22l185 185q12 12 22 41zM1120 384h288v896h-1280v-1280h896v288q0 40 28 68t68 28zM1536 1312v-1024q0 -40 -20 -88t-48 -76l-184 -184q-28 -28 -76 -48t-88 -20h-1024q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68
z" />
    <glyph glyph-name="_551" unicode="&#xf24b;" horiz-adv-x="2304" 
d="M1951 538q0 -26 -15.5 -44.5t-38.5 -23.5q-8 -2 -18 -2h-153v140h153q10 0 18 -2q23 -5 38.5 -23.5t15.5 -44.5zM1933 751q0 -25 -15 -42t-38 -21q-3 -1 -15 -1h-139v129h139q3 0 8.5 -0.5t6.5 -0.5q23 -4 38 -21.5t15 -42.5zM728 587v308h-228v-308q0 -58 -38 -94.5
t-105 -36.5q-108 0 -229 59v-112q53 -15 121 -23t109 -9l42 -1q328 0 328 217zM1442 403v113q-99 -52 -200 -59q-108 -8 -169 41t-61 142t61 142t169 41q101 -7 200 -58v112q-48 12 -100 19.5t-80 9.5l-28 2q-127 6 -218.5 -14t-140.5 -60t-71 -88t-22 -106t22 -106t71 -88
t140.5 -60t218.5 -14q101 4 208 31zM2176 518q0 54 -43 88.5t-109 39.5v3q57 8 89 41.5t32 79.5q0 55 -41 88t-107 36q-3 0 -12 0.5t-14 0.5h-455v-510h491q74 0 121.5 36.5t47.5 96.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90
t90 38h2048q52 0 90 -38t38 -90z" />
    <glyph glyph-name="_552" unicode="&#xf24c;" horiz-adv-x="2304" 
d="M858 295v693q-106 -41 -172 -135.5t-66 -211.5t66 -211.5t172 -134.5zM1362 641q0 117 -66 211.5t-172 135.5v-694q106 41 172 135.5t66 211.5zM1577 641q0 -159 -78.5 -294t-213.5 -213.5t-294 -78.5q-119 0 -227.5 46.5t-187 125t-125 187t-46.5 227.5q0 159 78.5 294
t213.5 213.5t294 78.5t294 -78.5t213.5 -213.5t78.5 -294zM1960 634q0 139 -55.5 261.5t-147.5 205.5t-213.5 131t-252.5 48h-301q-176 0 -323.5 -81t-235 -230t-87.5 -335q0 -171 87 -317.5t236 -231.5t323 -85h301q129 0 251.5 50.5t214.5 135t147.5 202.5t55.5 246z
M2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
    <glyph glyph-name="_553" unicode="&#xf24d;" horiz-adv-x="1792" 
d="M1664 -96v1088q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5zM1792 992v-1088q0 -66 -47 -113t-113 -47h-1088q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113
zM1408 1376v-160h-128v160q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h160v-128h-160q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113z" />
    <glyph glyph-name="_554" unicode="&#xf24e;" horiz-adv-x="2304" 
d="M1728 1088l-384 -704h768zM448 1088l-384 -704h768zM1269 1280q-14 -40 -45.5 -71.5t-71.5 -45.5v-1291h608q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1344q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h608v1291q-40 14 -71.5 45.5t-45.5 71.5h-491q-14 0 -23 9t-9 23v64
q0 14 9 23t23 9h491q21 57 70 92.5t111 35.5t111 -35.5t70 -92.5h491q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-491zM1088 1264q33 0 56.5 23.5t23.5 56.5t-23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5zM2176 384q0 -73 -46.5 -131t-117.5 -91
t-144.5 -49.5t-139.5 -16.5t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81zM896 384q0 -73 -46.5 -131t-117.5 -91t-144.5 -49.5t-139.5 -16.5
t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81z" />
    <glyph glyph-name="_555" unicode="&#xf250;" 
d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9
t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-77 -29 -149 -92.5
t-129.5 -152.5t-92.5 -210t-35 -253h1024q0 132 -35 253t-92.5 210t-129.5 152.5t-149 92.5q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" />
    <glyph glyph-name="_556" unicode="&#xf251;" 
d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9
t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -66 9 -128h1006q9 61 9 128zM1280 -128q0 130 -34 249.5t-90.5 208t-126.5 152t-146 94.5h-230q-76 -31 -146 -94.5t-126.5 -152t-90.5 -208t-34 -249.5h1024z" />
    <glyph glyph-name="_557" unicode="&#xf252;" 
d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9
t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -206 85 -384h854q85 178 85 384zM1223 192q-54 141 -145.5 241.5t-194.5 142.5h-230q-103 -42 -194.5 -142.5t-145.5 -241.5h910z" />
    <glyph glyph-name="_558" unicode="&#xf253;" 
d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9
t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-137 -51 -244 -196
h700q-107 145 -244 196q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" />
    <glyph glyph-name="_559" unicode="&#xf254;" 
d="M1504 -64q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472zM130 0q3 55 16 107t30 95t46 87t53.5 76t64.5 69.5t66 60t70.5 55t66.5 47.5t65 43q-43 28 -65 43t-66.5 47.5t-70.5 55t-66 60t-64.5 69.5t-53.5 76t-46 87
t-30 95t-16 107h1276q-3 -55 -16 -107t-30 -95t-46 -87t-53.5 -76t-64.5 -69.5t-66 -60t-70.5 -55t-66.5 -47.5t-65 -43q43 -28 65 -43t66.5 -47.5t70.5 -55t66 -60t64.5 -69.5t53.5 -76t46 -87t30 -95t16 -107h-1276zM1504 1536q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9
h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472z" />
    <glyph glyph-name="_560" unicode="&#xf255;" 
d="M768 1152q-53 0 -90.5 -37.5t-37.5 -90.5v-128h-32v93q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-429l-32 30v172q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-224q0 -47 35 -82l310 -296q39 -39 39 -102q0 -26 19 -45t45 -19h640q26 0 45 19t19 45v25
q0 41 10 77l108 436q10 36 10 77v246q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-32h-32v125q0 40 -25 72.5t-64 40.5q-14 2 -23 2q-46 0 -79 -33t-33 -79v-128h-32v122q0 51 -32.5 89.5t-82.5 43.5q-5 1 -13 1zM768 1280q84 0 149 -50q57 34 123 34q59 0 111 -27
t86 -76q27 7 59 7q100 0 170 -71.5t70 -171.5v-246q0 -51 -13 -108l-109 -436q-6 -24 -6 -71q0 -80 -56 -136t-136 -56h-640q-84 0 -138 58.5t-54 142.5l-308 296q-76 73 -76 175v224q0 99 70.5 169.5t169.5 70.5q11 0 16 -1q6 95 75.5 160t164.5 65q52 0 98 -21
q72 69 174 69z" />
    <glyph glyph-name="_561" unicode="&#xf256;" horiz-adv-x="1792" 
d="M880 1408q-46 0 -79 -33t-33 -79v-656h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528v-256l-154 205q-38 51 -102 51q-53 0 -90.5 -37.5t-37.5 -90.5q0 -43 26 -77l384 -512q38 -51 102 -51h688q34 0 61 22t34 56l76 405q5 32 5 59v498q0 46 -33 79t-79 33t-79 -33
t-33 -79v-272h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528h-32v656q0 46 -33 79t-79 33zM880 1536q68 0 125.5 -35.5t88.5 -96.5q19 4 42 4q99 0 169.5 -70.5t70.5 -169.5v-17q105 6 180.5 -64t75.5 -175v-498q0 -40 -8 -83l-76 -404q-14 -79 -76.5 -131t-143.5 -52
h-688q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 106 75 181t181 75q78 0 128 -34v434q0 99 70.5 169.5t169.5 70.5q23 0 42 -4q31 61 88.5 96.5t125.5 35.5z" />
    <glyph glyph-name="_562" unicode="&#xf257;" horiz-adv-x="1792" 
d="M1073 -128h-177q-163 0 -226 141q-23 49 -23 102v5q-62 30 -98.5 88.5t-36.5 127.5q0 38 5 48h-261q-106 0 -181 75t-75 181t75 181t181 75h113l-44 17q-74 28 -119.5 93.5t-45.5 145.5q0 106 75 181t181 75q46 0 91 -17l628 -239h401q106 0 181 -75t75 -181v-668
q0 -88 -54 -157.5t-140 -90.5l-339 -85q-92 -23 -186 -23zM1024 583l-155 -71l-163 -74q-30 -14 -48 -41.5t-18 -60.5q0 -46 33 -79t79 -33q26 0 46 10l338 154q-49 10 -80.5 50t-31.5 90v55zM1344 272q0 46 -33 79t-79 33q-26 0 -46 -10l-290 -132q-28 -13 -37 -17
t-30.5 -17t-29.5 -23.5t-16 -29t-8 -40.5q0 -50 31.5 -82t81.5 -32q20 0 38 9l352 160q30 14 48 41.5t18 60.5zM1112 1024l-650 248q-24 8 -46 8q-53 0 -90.5 -37.5t-37.5 -90.5q0 -40 22.5 -73t59.5 -47l526 -200v-64h-640q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5
t90.5 -37.5h535l233 106v198q0 63 46 106l111 102h-69zM1073 0q82 0 155 19l339 85q43 11 70 45.5t27 78.5v668q0 53 -37.5 90.5t-90.5 37.5h-308l-136 -126q-36 -33 -36 -82v-296q0 -46 33 -77t79 -31t79 35t33 81v208h32v-208q0 -70 -57 -114q52 -8 86.5 -48.5t34.5 -93.5
q0 -42 -23 -78t-61 -53l-310 -141h91z" />
    <glyph glyph-name="_563" unicode="&#xf258;" horiz-adv-x="2048" 
d="M1151 1536q61 0 116 -28t91 -77l572 -781q118 -159 118 -359v-355q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v177l-286 143h-546q-80 0 -136 56t-56 136v32q0 119 84.5 203.5t203.5 84.5h420l42 128h-686q-100 0 -173.5 67.5t-81.5 166.5q-65 79 -65 182v32
q0 80 56 136t136 56h959zM1920 -64v355q0 157 -93 284l-573 781q-39 52 -103 52h-959q-26 0 -45 -19t-19 -45q0 -32 1.5 -49.5t9.5 -40.5t25 -43q10 31 35.5 50t56.5 19h832v-32h-832q-26 0 -45 -19t-19 -45q0 -44 3 -58q8 -44 44 -73t81 -29h640h91q40 0 68 -28t28 -68
q0 -15 -5 -30l-64 -192q-10 -29 -35 -47.5t-56 -18.5h-443q-66 0 -113 -47t-47 -113v-32q0 -26 19 -45t45 -19h561q16 0 29 -7l317 -158q24 -13 38.5 -36t14.5 -50v-197q0 -26 19 -45t45 -19h384q26 0 45 19t19 45z" />
    <glyph glyph-name="_564" unicode="&#xf259;" horiz-adv-x="2048" 
d="M459 -256q-77 0 -137.5 47.5t-79.5 122.5l-101 401q-13 57 -13 108q0 45 -5 67l-116 477q-7 27 -7 57q0 93 62 161t155 78q17 85 82.5 139t152.5 54q83 0 148 -51.5t85 -132.5l83 -348l103 428q20 81 85 132.5t148 51.5q89 0 155.5 -57.5t80.5 -144.5q92 -10 152 -79
t60 -162q0 -24 -7 -59l-123 -512q10 7 37.5 28.5t38.5 29.5t35 23t41 20.5t41.5 11t49.5 5.5q105 0 180 -74t75 -179q0 -62 -28.5 -118t-78.5 -94l-507 -380q-68 -51 -153 -51h-694zM1104 1408q-38 0 -68.5 -24t-39.5 -62l-164 -682h-127l-145 602q-9 38 -39.5 62t-68.5 24
q-48 0 -80 -33t-32 -80q0 -15 3 -28l132 -547h-26l-99 408q-9 37 -40 62.5t-69 25.5q-47 0 -80 -33t-33 -79q0 -14 3 -26l116 -478q7 -28 9 -86t10 -88l100 -401q8 -32 34 -52.5t59 -20.5h694q42 0 76 26l507 379q56 43 56 110q0 52 -37.5 88.5t-89.5 36.5q-43 0 -77 -26
l-307 -230v227q0 4 32 138t68 282t39 161q4 18 4 29q0 47 -32 81t-79 34q-39 0 -69.5 -24t-39.5 -62l-116 -482h-26l150 624q3 14 3 28q0 48 -31.5 82t-79.5 34z" />
    <glyph glyph-name="_565" unicode="&#xf25a;" horiz-adv-x="1792" 
d="M640 1408q-53 0 -90.5 -37.5t-37.5 -90.5v-512v-384l-151 202q-41 54 -107 54q-52 0 -89 -38t-37 -90q0 -43 26 -77l384 -512q38 -51 102 -51h718q22 0 39.5 13.5t22.5 34.5l92 368q24 96 24 194v217q0 41 -28 71t-68 30t-68 -28t-28 -68h-32v61q0 48 -32 81.5t-80 33.5
q-46 0 -79 -33t-33 -79v-64h-32v90q0 55 -37 94.5t-91 39.5q-53 0 -90.5 -37.5t-37.5 -90.5v-96h-32v570q0 55 -37 94.5t-91 39.5zM640 1536q107 0 181.5 -77.5t74.5 -184.5v-220q22 2 32 2q99 0 173 -69q47 21 99 21q113 0 184 -87q27 7 56 7q94 0 159 -67.5t65 -161.5
v-217q0 -116 -28 -225l-92 -368q-16 -64 -68 -104.5t-118 -40.5h-718q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 105 74.5 180.5t179.5 75.5q71 0 130 -35v547q0 106 75 181t181 75zM768 128v384h-32v-384h32zM1024 128v384h-32v-384h32zM1280 128v384h-32
v-384h32z" />
    <glyph glyph-name="_566" unicode="&#xf25b;" 
d="M1288 889q60 0 107 -23q141 -63 141 -226v-177q0 -94 -23 -186l-85 -339q-21 -86 -90.5 -140t-157.5 -54h-668q-106 0 -181 75t-75 181v401l-239 628q-17 45 -17 91q0 106 75 181t181 75q80 0 145.5 -45.5t93.5 -119.5l17 -44v113q0 106 75 181t181 75t181 -75t75 -181
v-261q27 5 48 5q69 0 127.5 -36.5t88.5 -98.5zM1072 896q-33 0 -60.5 -18t-41.5 -48l-74 -163l-71 -155h55q50 0 90 -31.5t50 -80.5l154 338q10 20 10 46q0 46 -33 79t-79 33zM1293 761q-22 0 -40.5 -8t-29 -16t-23.5 -29.5t-17 -30.5t-17 -37l-132 -290q-10 -20 -10 -46
q0 -46 33 -79t79 -33q33 0 60.5 18t41.5 48l160 352q9 18 9 38q0 50 -32 81.5t-82 31.5zM128 1120q0 -22 8 -46l248 -650v-69l102 111q43 46 106 46h198l106 233v535q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-640h-64l-200 526q-14 37 -47 59.5t-73 22.5
q-53 0 -90.5 -37.5t-37.5 -90.5zM1180 -128q44 0 78.5 27t45.5 70l85 339q19 73 19 155v91l-141 -310q-17 -38 -53 -61t-78 -23q-53 0 -93.5 34.5t-48.5 86.5q-44 -57 -114 -57h-208v32h208q46 0 81 33t35 79t-31 79t-77 33h-296q-49 0 -82 -36l-126 -136v-308
q0 -53 37.5 -90.5t90.5 -37.5h668z" />
    <glyph glyph-name="_567" unicode="&#xf25c;" horiz-adv-x="1973" 
d="M857 992v-117q0 -13 -9.5 -22t-22.5 -9h-298v-812q0 -13 -9 -22.5t-22 -9.5h-135q-13 0 -22.5 9t-9.5 23v812h-297q-13 0 -22.5 9t-9.5 22v117q0 14 9 23t23 9h793q13 0 22.5 -9.5t9.5 -22.5zM1895 995l77 -961q1 -13 -8 -24q-10 -10 -23 -10h-134q-12 0 -21 8.5
t-10 20.5l-46 588l-189 -425q-8 -19 -29 -19h-120q-20 0 -29 19l-188 427l-45 -590q-1 -12 -10 -20.5t-21 -8.5h-135q-13 0 -23 10q-9 10 -9 24l78 961q1 12 10 20.5t21 8.5h142q20 0 29 -19l220 -520q10 -24 20 -51q3 7 9.5 24.5t10.5 26.5l221 520q9 19 29 19h141
q13 0 22 -8.5t10 -20.5z" />
    <glyph glyph-name="_568" unicode="&#xf25d;" horiz-adv-x="1792" 
d="M1042 833q0 88 -60 121q-33 18 -117 18h-123v-281h162q66 0 102 37t36 105zM1094 548l205 -373q8 -17 -1 -31q-8 -16 -27 -16h-152q-20 0 -28 17l-194 365h-155v-350q0 -14 -9 -23t-23 -9h-134q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h294q128 0 190 -24q85 -31 134 -109
t49 -180q0 -92 -42.5 -165.5t-115.5 -109.5q6 -10 9 -16zM896 1376q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM1792 640
q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
    <glyph glyph-name="_569" unicode="&#xf25e;" horiz-adv-x="1792" 
d="M605 303q153 0 257 104q14 18 3 36l-45 82q-6 13 -24 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13.5t-23.5 -14.5t-28.5 -13t-33.5 -9.5t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78
q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-148 0 -246 -96.5t-98 -240.5q0 -146 97 -241.5t247 -95.5zM1235 303q153 0 257 104q14 18 4 36l-45 82q-8 14 -25 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13.5t-23.5 -14.5t-28.5 -13t-33.5 -9.5
t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-147 0 -245.5 -96.5t-98.5 -240.5q0 -146 97 -241.5t247 -95.5zM896 1376
q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191
t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71z" />
    <glyph glyph-name="f260" unicode="&#xf260;" horiz-adv-x="2048" 
d="M736 736l384 -384l-384 -384l-672 672l672 672l168 -168l-96 -96l-72 72l-480 -480l480 -480l193 193l-289 287zM1312 1312l672 -672l-672 -672l-168 168l96 96l72 -72l480 480l-480 480l-193 -193l289 -287l-96 -96l-384 384z" />
    <glyph glyph-name="f261" unicode="&#xf261;" horiz-adv-x="1792" 
d="M717 182l271 271l-279 279l-88 -88l192 -191l-96 -96l-279 279l279 279l40 -40l87 87l-127 128l-454 -454zM1075 190l454 454l-454 454l-271 -271l279 -279l88 88l-192 191l96 96l279 -279l-279 -279l-40 40l-87 -88zM1792 640q0 -182 -71 -348t-191 -286t-286 -191
t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
    <glyph glyph-name="_572" unicode="&#xf262;" horiz-adv-x="2304" 
d="M651 539q0 -39 -27.5 -66.5t-65.5 -27.5q-39 0 -66.5 27.5t-27.5 66.5q0 38 27.5 65.5t66.5 27.5q38 0 65.5 -27.5t27.5 -65.5zM1805 540q0 -39 -27.5 -66.5t-66.5 -27.5t-66.5 27.5t-27.5 66.5t27.5 66t66.5 27t66.5 -27t27.5 -66zM765 539q0 79 -56.5 136t-136.5 57
t-136.5 -56.5t-56.5 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM1918 540q0 80 -56.5 136.5t-136.5 56.5q-79 0 -136 -56.5t-57 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM850 539q0 -116 -81.5 -197.5t-196.5 -81.5q-116 0 -197.5 82t-81.5 197
t82 196.5t197 81.5t196.5 -81.5t81.5 -196.5zM2004 540q0 -115 -81.5 -196.5t-197.5 -81.5q-115 0 -196.5 81.5t-81.5 196.5t81.5 196.5t196.5 81.5q116 0 197.5 -81.5t81.5 -196.5zM1040 537q0 191 -135.5 326.5t-326.5 135.5q-125 0 -231 -62t-168 -168.5t-62 -231.5
t62 -231.5t168 -168.5t231 -62q191 0 326.5 135.5t135.5 326.5zM1708 1110q-254 111 -556 111q-319 0 -573 -110q117 0 223 -45.5t182.5 -122.5t122 -183t45.5 -223q0 115 43.5 219.5t118 180.5t177.5 123t217 50zM2187 537q0 191 -135 326.5t-326 135.5t-326.5 -135.5
t-135.5 -326.5t135.5 -326.5t326.5 -135.5t326 135.5t135 326.5zM1921 1103h383q-44 -51 -75 -114.5t-40 -114.5q110 -151 110 -337q0 -156 -77 -288t-209 -208.5t-287 -76.5q-133 0 -249 56t-196 155q-47 -56 -129 -179q-11 22 -53.5 82.5t-74.5 97.5
q-80 -99 -196.5 -155.5t-249.5 -56.5q-155 0 -287 76.5t-209 208.5t-77 288q0 186 110 337q-9 51 -40 114.5t-75 114.5h365q149 100 355 156.5t432 56.5q224 0 421 -56t348 -157z" />
    <glyph glyph-name="f263" unicode="&#xf263;" horiz-adv-x="1280" 
d="M640 629q-188 0 -321 133t-133 320q0 188 133 321t321 133t321 -133t133 -321q0 -187 -133 -320t-321 -133zM640 1306q-92 0 -157.5 -65.5t-65.5 -158.5q0 -92 65.5 -157.5t157.5 -65.5t157.5 65.5t65.5 157.5q0 93 -65.5 158.5t-157.5 65.5zM1163 574q13 -27 15 -49.5
t-4.5 -40.5t-26.5 -38.5t-42.5 -37t-61.5 -41.5q-115 -73 -315 -94l73 -72l267 -267q30 -31 30 -74t-30 -73l-12 -13q-31 -30 -74 -30t-74 30q-67 68 -267 268l-267 -268q-31 -30 -74 -30t-73 30l-12 13q-31 30 -31 73t31 74l267 267l72 72q-203 21 -317 94
q-39 25 -61.5 41.5t-42.5 37t-26.5 38.5t-4.5 40.5t15 49.5q10 20 28 35t42 22t56 -2t65 -35q5 -4 15 -11t43 -24.5t69 -30.5t92 -24t113 -11q91 0 174 25.5t120 50.5l38 25q33 26 65 35t56 2t42 -22t28 -35z" />
    <glyph glyph-name="_574" unicode="&#xf264;" 
d="M927 956q0 -66 -46.5 -112.5t-112.5 -46.5t-112.5 46.5t-46.5 112.5t46.5 112.5t112.5 46.5t112.5 -46.5t46.5 -112.5zM1141 593q-10 20 -28 32t-47.5 9.5t-60.5 -27.5q-10 -8 -29 -20t-81 -32t-127 -20t-124 18t-86 36l-27 18q-31 25 -60.5 27.5t-47.5 -9.5t-28 -32
q-22 -45 -2 -74.5t87 -73.5q83 -53 226 -67l-51 -52q-142 -142 -191 -190q-22 -22 -22 -52.5t22 -52.5l9 -9q22 -22 52.5 -22t52.5 22l191 191q114 -115 191 -191q22 -22 52.5 -22t52.5 22l9 9q22 22 22 52.5t-22 52.5l-191 190l-52 52q141 14 225 67q67 44 87 73.5t-2 74.5
zM1092 956q0 134 -95 229t-229 95t-229 -95t-95 -229t95 -229t229 -95t229 95t95 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="_575" unicode="&#xf265;" horiz-adv-x="1720" 
d="M1565 1408q65 0 110 -45.5t45 -110.5v-519q0 -176 -68 -336t-182.5 -275t-274 -182.5t-334.5 -67.5q-176 0 -335.5 67.5t-274.5 182.5t-183 275t-68 336v519q0 64 46 110t110 46h1409zM861 344q47 0 82 33l404 388q37 35 37 85q0 49 -34.5 83.5t-83.5 34.5q-47 0 -82 -33
l-323 -310l-323 310q-35 33 -81 33q-49 0 -83.5 -34.5t-34.5 -83.5q0 -51 36 -85l405 -388q33 -33 81 -33z" />
    <glyph glyph-name="_576" unicode="&#xf266;" horiz-adv-x="2304" 
d="M1494 -103l-295 695q-25 -49 -158.5 -305.5t-198.5 -389.5q-1 -1 -27.5 -0.5t-26.5 1.5q-82 193 -255.5 587t-259.5 596q-21 50 -66.5 107.5t-103.5 100.5t-102 43q0 5 -0.5 24t-0.5 27h583v-50q-39 -2 -79.5 -16t-66.5 -43t-10 -64q26 -59 216.5 -499t235.5 -540
q31 61 140 266.5t131 247.5q-19 39 -126 281t-136 295q-38 69 -201 71v50l513 -1v-47q-60 -2 -93.5 -25t-12.5 -69q33 -70 87 -189.5t86 -187.5q110 214 173 363q24 55 -10 79.5t-129 26.5q1 7 1 25v24q64 0 170.5 0.5t180 1t92.5 0.5v-49q-62 -2 -119 -33t-90 -81
l-213 -442q13 -33 127.5 -290t121.5 -274l441 1017q-14 38 -49.5 62.5t-65 31.5t-55.5 8v50l460 -4l1 -2l-1 -44q-139 -4 -201 -145q-526 -1216 -559 -1291h-49z" />
    <glyph glyph-name="_577" unicode="&#xf267;" horiz-adv-x="1792" 
d="M949 643q0 -26 -16.5 -45t-41.5 -19q-26 0 -45 16.5t-19 41.5q0 26 17 45t42 19t44 -16.5t19 -41.5zM964 585l350 581q-9 -8 -67.5 -62.5t-125.5 -116.5t-136.5 -127t-117 -110.5t-50.5 -51.5l-349 -580q7 7 67 62t126 116.5t136 127t117 111t50 50.5zM1611 640
q0 -201 -104 -371q-3 2 -17 11t-26.5 16.5t-16.5 7.5q-13 0 -13 -13q0 -10 59 -44q-74 -112 -184.5 -190.5t-241.5 -110.5l-16 67q-1 10 -15 10q-5 0 -8 -5.5t-2 -9.5l16 -68q-72 -15 -146 -15q-199 0 -372 105q1 2 13 20.5t21.5 33.5t9.5 19q0 13 -13 13q-6 0 -17 -14.5
t-22.5 -34.5t-13.5 -23q-113 75 -192 187.5t-110 244.5l69 15q10 3 10 15q0 5 -5.5 8t-10.5 2l-68 -15q-14 72 -14 139q0 206 109 379q2 -1 18.5 -12t30 -19t17.5 -8q13 0 13 12q0 6 -12.5 15.5t-32.5 21.5l-20 12q77 112 189 189t244 107l15 -67q2 -10 15 -10q5 0 8 5.5
t2 10.5l-15 66q71 13 134 13q204 0 379 -109q-39 -56 -39 -65q0 -13 12 -13q11 0 48 64q111 -75 187.5 -186t107.5 -241l-56 -12q-10 -2 -10 -16q0 -5 5.5 -8t9.5 -2l57 13q14 -72 14 -140zM1696 640q0 163 -63.5 311t-170.5 255t-255 170.5t-311 63.5t-311 -63.5
t-255 -170.5t-170.5 -255t-63.5 -311t63.5 -311t170.5 -255t255 -170.5t311 -63.5t311 63.5t255 170.5t170.5 255t63.5 311zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191
t191 -286t71 -348z" />
    <glyph glyph-name="_578" unicode="&#xf268;" horiz-adv-x="1792" 
d="M893 1536q240 2 451 -120q232 -134 352 -372l-742 39q-160 9 -294 -74.5t-185 -229.5l-276 424q128 159 311 245.5t383 87.5zM146 1131l337 -663q72 -143 211 -217t293 -45l-230 -451q-212 33 -385 157.5t-272.5 316t-99.5 411.5q0 267 146 491zM1732 962
q58 -150 59.5 -310.5t-48.5 -306t-153 -272t-246 -209.5q-230 -133 -498 -119l405 623q88 131 82.5 290.5t-106.5 277.5zM896 942q125 0 213.5 -88.5t88.5 -213.5t-88.5 -213.5t-213.5 -88.5t-213.5 88.5t-88.5 213.5t88.5 213.5t213.5 88.5z" />
    <glyph glyph-name="_579" unicode="&#xf269;" horiz-adv-x="1792" 
d="M903 -256q-283 0 -504.5 150.5t-329.5 398.5q-58 131 -67 301t26 332.5t111 312t179 242.5l-11 -281q11 14 68 15.5t70 -15.5q42 81 160.5 138t234.5 59q-54 -45 -119.5 -148.5t-58.5 -163.5q25 -8 62.5 -13.5t63 -7.5t68 -4t50.5 -3q15 -5 9.5 -45.5t-30.5 -75.5
q-5 -7 -16.5 -18.5t-56.5 -35.5t-101 -34l15 -189l-139 67q-18 -43 -7.5 -81.5t36 -66.5t65.5 -41.5t81 -6.5q51 9 98 34.5t83.5 45t73.5 17.5q61 -4 89.5 -33t19.5 -65q-1 -2 -2.5 -5.5t-8.5 -12.5t-18 -15.5t-31.5 -10.5t-46.5 -1q-60 -95 -144.5 -135.5t-209.5 -29.5
q74 -61 162.5 -82.5t168.5 -6t154.5 52t128 87.5t80.5 104q43 91 39 192.5t-37.5 188.5t-78.5 125q87 -38 137 -79.5t77 -112.5q15 170 -57.5 343t-209.5 284q265 -77 412 -279.5t151 -517.5q2 -127 -40.5 -255t-123.5 -238t-189 -196t-247.5 -135.5t-288.5 -49.5z" />
    <glyph glyph-name="_580" unicode="&#xf26a;" horiz-adv-x="1792" 
d="M1493 1308q-165 110 -359 110q-155 0 -293 -73t-240 -200q-75 -93 -119.5 -218t-48.5 -266v-42q4 -141 48.5 -266t119.5 -218q102 -127 240 -200t293 -73q194 0 359 110q-121 -108 -274.5 -168t-322.5 -60q-29 0 -43 1q-175 8 -333 82t-272 193t-181 281t-67 339
q0 182 71 348t191 286t286 191t348 71h3q168 -1 320.5 -60.5t273.5 -167.5zM1792 640q0 -192 -77 -362.5t-213 -296.5q-104 -63 -222 -63q-137 0 -255 84q154 56 253.5 233t99.5 405q0 227 -99 404t-253 234q119 83 254 83q119 0 226 -65q135 -125 210.5 -295t75.5 -361z
" />
    <glyph glyph-name="_581" unicode="&#xf26b;" horiz-adv-x="1792" 
d="M1792 599q0 -56 -7 -104h-1151q0 -146 109.5 -244.5t257.5 -98.5q99 0 185.5 46.5t136.5 130.5h423q-56 -159 -170.5 -281t-267.5 -188.5t-321 -66.5q-187 0 -356 83q-228 -116 -394 -116q-237 0 -237 263q0 115 45 275q17 60 109 229q199 360 475 606
q-184 -79 -427 -354q63 274 283.5 449.5t501.5 175.5q30 0 45 -1q255 117 433 117q64 0 116 -13t94.5 -40.5t66.5 -76.5t24 -115q0 -116 -75 -286q101 -182 101 -390zM1722 1239q0 83 -53 132t-137 49q-108 0 -254 -70q121 -47 222.5 -131.5t170.5 -195.5q51 135 51 216z
M128 2q0 -86 48.5 -132.5t134.5 -46.5q115 0 266 83q-122 72 -213.5 183t-137.5 245q-98 -205 -98 -332zM632 715h728q-5 142 -113 237t-251 95q-144 0 -251.5 -95t-112.5 -237z" />
    <glyph glyph-name="_582" unicode="&#xf26c;" horiz-adv-x="2048" 
d="M1792 288v960q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1248v-960q0 -66 -47 -113t-113 -47h-736v-128h352q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23
v64q0 14 9 23t23 9h352v128h-736q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
    <glyph glyph-name="_583" unicode="&#xf26d;" horiz-adv-x="1792" 
d="M138 1408h197q-70 -64 -126 -149q-36 -56 -59 -115t-30 -125.5t-8.5 -120t10.5 -132t21 -126t28 -136.5q4 -19 6 -28q51 -238 81 -329q57 -171 152 -275h-272q-48 0 -82 34t-34 82v1304q0 48 34 82t82 34zM1346 1408h308q48 0 82 -34t34 -82v-1304q0 -48 -34 -82t-82 -34
h-178q212 210 196 565l-469 -101q-2 -45 -12 -82t-31 -72t-59.5 -59.5t-93.5 -36.5q-123 -26 -199 40q-32 27 -53 61t-51.5 129t-64.5 258q-35 163 -45.5 263t-5.5 139t23 77q20 41 62.5 73t102.5 45q45 12 83.5 6.5t67 -17t54 -35t43 -48t34.5 -56.5l468 100
q-68 175 -180 287z" />
    <glyph glyph-name="_584" unicode="&#xf26e;" 
d="M1401 -11l-6 -6q-113 -113 -259 -175q-154 -64 -317 -64q-165 0 -317 64q-148 63 -259 175q-113 112 -175 258q-42 103 -54 189q-4 28 48 36q51 8 56 -20q1 -1 1 -4q18 -90 46 -159q50 -124 152 -226q98 -98 226 -152q132 -56 276 -56q143 0 276 56q128 55 225 152l6 6
q10 10 25 6q12 -3 33 -22q36 -37 17 -58zM929 604l-66 -66l63 -63q21 -21 -7 -49q-17 -17 -32 -17q-10 0 -19 10l-62 61l-66 -66q-5 -5 -15 -5q-15 0 -31 16l-2 2q-18 15 -18 29q0 7 8 17l66 65l-66 66q-16 16 14 45q18 18 31 18q6 0 13 -5l65 -66l65 65q18 17 48 -13
q27 -27 11 -44zM1400 547q0 -118 -46 -228q-45 -105 -126 -186q-80 -80 -187 -126t-228 -46t-228 46t-187 126q-82 82 -125 186q-15 33 -15 40h-1q-9 27 43 44q50 16 60 -12q37 -99 97 -167h1v339v2q3 136 102 232q105 103 253 103q147 0 251 -103t104 -249
q0 -147 -104.5 -251t-250.5 -104q-58 0 -112 16q-28 11 -13 61q16 51 44 43l14 -3q14 -3 33 -6t30 -3q104 0 176 71.5t72 174.5q0 101 -72 171q-71 71 -175 71q-107 0 -178 -80q-64 -72 -64 -160v-413q110 -67 242 -67q96 0 185 36.5t156 103.5t103.5 155t36.5 183
q0 198 -141 339q-140 140 -339 140q-200 0 -340 -140q-53 -53 -77 -87l-2 -2q-8 -11 -13 -15.5t-21.5 -9.5t-38.5 3q-21 5 -36.5 16.5t-15.5 26.5v680q0 15 10.5 26.5t27.5 11.5h877q30 0 30 -55t-30 -55h-811v-483h1q40 42 102 84t108 61q109 46 231 46q121 0 228 -46
t187 -126q81 -81 126 -186q46 -112 46 -229zM1369 1128q9 -8 9 -18t-5.5 -18t-16.5 -21q-26 -26 -39 -26q-9 0 -16 7q-106 91 -207 133q-128 56 -276 56q-133 0 -262 -49q-27 -10 -45 37q-9 25 -8 38q3 16 16 20q130 57 299 57q164 0 316 -64q137 -58 235 -152z" />
    <glyph glyph-name="_585" unicode="&#xf270;" horiz-adv-x="1792" 
d="M1551 60q15 6 26 3t11 -17.5t-15 -33.5q-13 -16 -44 -43.5t-95.5 -68t-141 -74t-188 -58t-229.5 -24.5q-119 0 -238 31t-209 76.5t-172.5 104t-132.5 105t-84 87.5q-8 9 -10 16.5t1 12t8 7t11.5 2t11.5 -4.5q192 -117 300 -166q389 -176 799 -90q190 40 391 135z
M1758 175q11 -16 2.5 -69.5t-28.5 -102.5q-34 -83 -85 -124q-17 -14 -26 -9t0 24q21 45 44.5 121.5t6.5 98.5q-5 7 -15.5 11.5t-27 6t-29.5 2.5t-35 0t-31.5 -2t-31 -3t-22.5 -2q-6 -1 -13 -1.5t-11 -1t-8.5 -1t-7 -0.5h-5.5h-4.5t-3 0.5t-2 1.5l-1.5 3q-6 16 47 40t103 30
q46 7 108 1t76 -24zM1364 618q0 -31 13.5 -64t32 -58t37.5 -46t33 -32l13 -11l-227 -224q-40 37 -79 75.5t-58 58.5l-19 20q-11 11 -25 33q-38 -59 -97.5 -102.5t-127.5 -63.5t-140 -23t-137.5 21t-117.5 65.5t-83 113t-31 162.5q0 84 28 154t72 116.5t106.5 83t122.5 57
t130 34.5t119.5 18.5t99.5 6.5v127q0 65 -21 97q-34 53 -121 53q-6 0 -16.5 -1t-40.5 -12t-56 -29.5t-56 -59.5t-48 -96l-294 27q0 60 22 119t67 113t108 95t151.5 65.5t190.5 24.5q100 0 181 -25t129.5 -61.5t81 -83t45 -86t12.5 -73.5v-589zM692 597q0 -86 70 -133
q66 -44 139 -22q84 25 114 123q14 45 14 101v162q-59 -2 -111 -12t-106.5 -33.5t-87 -71t-32.5 -114.5z" />
    <glyph glyph-name="_586" unicode="&#xf271;" horiz-adv-x="1792" 
d="M1536 1280q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128zM1152 1376v-288q0 -14 9 -23t23 -9
h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 1376v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM1536 -128v1024h-1408v-1024h1408zM896 448h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224
v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224z" />
    <glyph glyph-name="_587" unicode="&#xf272;" horiz-adv-x="1792" 
d="M1152 416v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23
t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47
t47 -113v-96h128q52 0 90 -38t38 -90z" />
    <glyph glyph-name="_588" unicode="&#xf273;" horiz-adv-x="1792" 
d="M1111 151l-46 -46q-9 -9 -22 -9t-23 9l-188 189l-188 -189q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22t9 23l189 188l-189 188q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l188 -188l188 188q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23l-188 -188l188 -188q9 -10 9 -23t-9 -22z
M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280
q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
    <glyph glyph-name="_589" unicode="&#xf274;" horiz-adv-x="1792" 
d="M1303 572l-512 -512q-10 -9 -23 -9t-23 9l-288 288q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l220 -220l444 444q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23
t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47
t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
    <glyph glyph-name="_590" unicode="&#xf275;" horiz-adv-x="1792" 
d="M448 1536q26 0 45 -19t19 -45v-891l536 429q17 14 40 14q26 0 45 -19t19 -45v-379l536 429q17 14 40 14q26 0 45 -19t19 -45v-1152q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h384z" />
    <glyph glyph-name="_591" unicode="&#xf276;" horiz-adv-x="1024" 
d="M512 448q66 0 128 15v-655q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v655q62 -15 128 -15zM512 1536q212 0 362 -150t150 -362t-150 -362t-362 -150t-362 150t-150 362t150 362t362 150zM512 1312q14 0 23 9t9 23t-9 23t-23 9q-146 0 -249 -103t-103 -249
q0 -14 9 -23t23 -9t23 9t9 23q0 119 84.5 203.5t203.5 84.5z" />
    <glyph glyph-name="_592" unicode="&#xf277;" horiz-adv-x="1792" 
d="M1745 1239q10 -10 10 -23t-10 -23l-141 -141q-28 -28 -68 -28h-1344q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h576v64q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-64h512q40 0 68 -28zM768 320h256v-512q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v512zM1600 768
q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1344q-40 0 -68 28l-141 141q-10 10 -10 23t10 23l141 141q28 28 68 28h512v192h256v-192h576z" />
    <glyph glyph-name="_593" unicode="&#xf278;" horiz-adv-x="2048" 
d="M2020 1525q28 -20 28 -53v-1408q0 -20 -11 -36t-29 -23l-640 -256q-24 -11 -48 0l-616 246l-616 -246q-10 -5 -24 -5q-19 0 -36 11q-28 20 -28 53v1408q0 20 11 36t29 23l640 256q24 11 48 0l616 -246l616 246q32 13 60 -6zM736 1390v-1270l576 -230v1270zM128 1173
v-1270l544 217v1270zM1920 107v1270l-544 -217v-1270z" />
    <glyph glyph-name="_594" unicode="&#xf279;" horiz-adv-x="1792" 
d="M512 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472q0 20 17 28l480 256q7 4 15 4zM1760 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472
q0 20 17 28l480 256q7 4 15 4zM640 1536q8 0 14 -3l512 -256q18 -10 18 -29v-1472q0 -13 -9.5 -22.5t-22.5 -9.5q-8 0 -14 3l-512 256q-18 10 -18 29v1472q0 13 9.5 22.5t22.5 9.5z" />
    <glyph glyph-name="_595" unicode="&#xf27a;" horiz-adv-x="1792" 
d="M640 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 640q0 53 -37.5 90.5t-90.5 37.5
t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-110 0 -211 18q-173 -173 -435 -229q-52 -10 -86 -13q-12 -1 -22 6t-13 18q-4 15 20 37q5 5 23.5 21.5t25.5 23.5t23.5 25.5t24 31.5t20.5 37
t20 48t14.5 57.5t12.5 72.5q-146 90 -229.5 216.5t-83.5 269.5q0 174 120 321.5t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
    <glyph glyph-name="_596" unicode="&#xf27b;" horiz-adv-x="1792" 
d="M640 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 -53 -37.5 -90.5t-90.5 -37.5
t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5
t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51
t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 130 71 248.5t191 204.5t286 136.5t348 50.5t348 -50.5t286 -136.5t191 -204.5t71 -248.5z" />
    <glyph glyph-name="_597" unicode="&#xf27c;" horiz-adv-x="1024" 
d="M512 345l512 295v-591l-512 -296v592zM0 640v-591l512 296zM512 1527v-591l-512 -296v591zM512 936l512 295v-591z" />
    <glyph glyph-name="_598" unicode="&#xf27d;" horiz-adv-x="1792" 
d="M1709 1018q-10 -236 -332 -651q-333 -431 -562 -431q-142 0 -240 263q-44 160 -132 482q-72 262 -157 262q-18 0 -127 -76l-77 98q24 21 108 96.5t130 115.5q156 138 241 146q95 9 153 -55.5t81 -203.5q44 -287 66 -373q55 -249 120 -249q51 0 154 161q101 161 109 246
q13 139 -109 139q-57 0 -121 -26q120 393 459 382q251 -8 236 -326z" />
    <glyph glyph-name="f27e" unicode="&#xf27e;" 
d="M0 1408h1536v-1536h-1536v1536zM1085 293l-221 631l221 297h-634l221 -297l-221 -631l317 -304z" />
    <glyph glyph-name="uniF280" unicode="&#xf280;" 
d="M0 1408h1536v-1536h-1536v1536zM908 1088l-12 -33l75 -83l-31 -114l25 -25l107 57l107 -57l25 25l-31 114l75 83l-12 33h-95l-53 96h-32l-53 -96h-95zM641 925q32 0 44.5 -16t11.5 -63l174 21q0 55 -17.5 92.5t-50.5 56t-69 25.5t-85 7q-133 0 -199 -57.5t-66 -182.5v-72
h-96v-128h76q20 0 20 -8v-382q0 -14 -5 -20t-18 -7l-73 -7v-88h448v86l-149 14q-6 1 -8.5 1.5t-3.5 2.5t-0.5 4t1 7t0.5 10v387h191l38 128h-231q-6 0 -2 6t4 9v80q0 27 1.5 40.5t7.5 28t19.5 20t36.5 5.5zM1248 96v86l-54 9q-7 1 -9.5 2.5t-2.5 3t1 7.5t1 12v520h-275
l-23 -101l83 -22q23 -7 23 -27v-370q0 -14 -6 -18.5t-20 -6.5l-70 -9v-86h352z" />
    <glyph glyph-name="uniF281" unicode="&#xf281;" horiz-adv-x="1792" 
d="M1792 690q0 -58 -29.5 -105.5t-79.5 -72.5q12 -46 12 -96q0 -155 -106.5 -287t-290.5 -208.5t-400 -76.5t-399.5 76.5t-290 208.5t-106.5 287q0 47 11 94q-51 25 -82 73.5t-31 106.5q0 82 58 140.5t141 58.5q85 0 145 -63q218 152 515 162l116 521q3 13 15 21t26 5
l369 -81q18 37 54 59.5t79 22.5q62 0 106 -43.5t44 -105.5t-44 -106t-106 -44t-105.5 43.5t-43.5 105.5l-334 74l-104 -472q300 -9 519 -160q58 61 143 61q83 0 141 -58.5t58 -140.5zM418 491q0 -62 43.5 -106t105.5 -44t106 44t44 106t-44 105.5t-106 43.5q-61 0 -105 -44
t-44 -105zM1228 136q11 11 11 26t-11 26q-10 10 -25 10t-26 -10q-41 -42 -121 -62t-160 -20t-160 20t-121 62q-11 10 -26 10t-25 -10q-11 -10 -11 -25.5t11 -26.5q43 -43 118.5 -68t122.5 -29.5t91 -4.5t91 4.5t122.5 29.5t118.5 68zM1225 341q62 0 105.5 44t43.5 106
q0 61 -44 105t-105 44q-62 0 -106 -43.5t-44 -105.5t44 -106t106 -44z" />
    <glyph glyph-name="_602" unicode="&#xf282;" horiz-adv-x="1792" 
d="M69 741h1q16 126 58.5 241.5t115 217t167.5 176t223.5 117.5t276.5 43q231 0 414 -105.5t294 -303.5q104 -187 104 -442v-188h-1125q1 -111 53.5 -192.5t136.5 -122.5t189.5 -57t213 -3t208 46.5t173.5 84.5v-377q-92 -55 -229.5 -92t-312.5 -38t-316 53
q-189 73 -311.5 249t-124.5 372q-3 242 111 412t325 268q-48 -60 -78 -125.5t-46 -159.5h635q8 77 -8 140t-47 101.5t-70.5 66.5t-80.5 41t-75 20.5t-56 8.5l-22 1q-135 -5 -259.5 -44.5t-223.5 -104.5t-176 -140.5t-138 -163.5z" />
    <glyph glyph-name="_603" unicode="&#xf283;" horiz-adv-x="2304" 
d="M0 32v608h2304v-608q0 -66 -47 -113t-113 -47h-1984q-66 0 -113 47t-47 113zM640 256v-128h384v128h-384zM256 256v-128h256v128h-256zM2144 1408q66 0 113 -47t47 -113v-224h-2304v224q0 66 47 113t113 47h1984z" />
    <glyph glyph-name="_604" unicode="&#xf284;" horiz-adv-x="1792" 
d="M1584 246l-218 111q-74 -120 -196.5 -189t-263.5 -69q-147 0 -271 72t-196 196t-72 270q0 110 42.5 209.5t115 172t172 115t209.5 42.5q131 0 247.5 -60.5t192.5 -168.5l215 125q-110 169 -286.5 265t-378.5 96q-161 0 -308 -63t-253 -169t-169 -253t-63 -308t63 -308
t169 -253t253 -169t308 -63q213 0 397.5 107t290.5 292zM1030 643l693 -352q-116 -253 -334.5 -400t-492.5 -147q-182 0 -348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71q260 0 470.5 -133.5t335.5 -366.5zM1543 640h-39v-160h-96v352h136q32 0 54.5 -20
t28.5 -48t1 -56t-27.5 -48t-57.5 -20z" />
    <glyph glyph-name="uniF285" unicode="&#xf285;" horiz-adv-x="1792" 
d="M1427 827l-614 386l92 151h855zM405 562l-184 116v858l1183 -743zM1424 697l147 -95v-858l-532 335zM1387 718l-500 -802h-855l356 571z" />
    <glyph glyph-name="uniF286" unicode="&#xf286;" horiz-adv-x="1792" 
d="M640 528v224q0 16 -16 16h-96q-16 0 -16 -16v-224q0 -16 16 -16h96q16 0 16 16zM1152 528v224q0 16 -16 16h-96q-16 0 -16 -16v-224q0 -16 16 -16h96q16 0 16 16zM1664 496v-752h-640v320q0 80 -56 136t-136 56t-136 -56t-56 -136v-320h-640v752q0 16 16 16h96
q16 0 16 -16v-112h128v624q0 16 16 16h96q16 0 16 -16v-112h128v112q0 16 16 16h96q16 0 16 -16v-112h128v112q0 6 2.5 9.5t8.5 5t9.5 2t11.5 0t9 -0.5v391q-32 15 -32 50q0 23 16.5 39t38.5 16t38.5 -16t16.5 -39q0 -35 -32 -50v-17q45 10 83 10q21 0 59.5 -7.5t54.5 -7.5
q17 0 47 7.5t37 7.5q16 0 16 -16v-210q0 -15 -35 -21.5t-62 -6.5q-18 0 -54.5 7.5t-55.5 7.5q-40 0 -90 -12v-133q1 0 9 0.5t11.5 0t9.5 -2t8.5 -5t2.5 -9.5v-112h128v112q0 16 16 16h96q16 0 16 -16v-112h128v112q0 16 16 16h96q16 0 16 -16v-624h128v112q0 16 16 16h96
q16 0 16 -16z" />
    <glyph glyph-name="_607" unicode="&#xf287;" horiz-adv-x="2304" 
d="M2288 731q16 -8 16 -27t-16 -27l-320 -192q-8 -5 -16 -5q-9 0 -16 4q-16 10 -16 28v128h-858q37 -58 83 -165q16 -37 24.5 -55t24 -49t27 -47t27 -34t31.5 -26t33 -8h96v96q0 14 9 23t23 9h320q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v96h-96
q-32 0 -61 10t-51 23.5t-45 40.5t-37 46t-33.5 57t-28.5 57.5t-28 60.5q-23 53 -37 81.5t-36 65t-44.5 53.5t-46.5 17h-360q-22 -84 -91 -138t-157 -54q-106 0 -181 75t-75 181t75 181t181 75q88 0 157 -54t91 -138h104q24 0 46.5 17t44.5 53.5t36 65t37 81.5q19 41 28 60.5
t28.5 57.5t33.5 57t37 46t45 40.5t51 23.5t61 10h107q21 57 70 92.5t111 35.5q80 0 136 -56t56 -136t-56 -136t-136 -56q-62 0 -111 35.5t-70 92.5h-107q-17 0 -33 -8t-31.5 -26t-27 -34t-27 -47t-24 -49t-24.5 -55q-46 -107 -83 -165h1114v128q0 18 16 28t32 -1z" />
    <glyph glyph-name="_608" unicode="&#xf288;" horiz-adv-x="1792" 
d="M1150 774q0 -56 -39.5 -95t-95.5 -39h-253v269h253q56 0 95.5 -39.5t39.5 -95.5zM1329 774q0 130 -91.5 222t-222.5 92h-433v-896h180v269h253q130 0 222 91.5t92 221.5zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348
t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
    <glyph glyph-name="_609" unicode="&#xf289;" horiz-adv-x="2304" 
d="M1645 438q0 59 -34 106.5t-87 68.5q-7 -45 -23 -92q-7 -24 -27.5 -38t-44.5 -14q-12 0 -24 3q-31 10 -45 38.5t-4 58.5q23 71 23 143q0 123 -61 227.5t-166 165.5t-228 61q-134 0 -247 -73t-167 -194q108 -28 188 -106q22 -23 22 -55t-22 -54t-54 -22t-55 22
q-75 75 -180 75q-106 0 -181 -74.5t-75 -180.5t75 -180.5t181 -74.5h1046q79 0 134.5 55.5t55.5 133.5zM1798 438q0 -142 -100.5 -242t-242.5 -100h-1046q-169 0 -289 119.5t-120 288.5q0 153 100 267t249 136q62 184 221 298t354 114q235 0 408.5 -158.5t196.5 -389.5
q116 -25 192.5 -118.5t76.5 -214.5zM2048 438q0 -175 -97 -319q-23 -33 -64 -33q-24 0 -43 13q-26 17 -32 48.5t12 57.5q71 104 71 233t-71 233q-18 26 -12 57t32 49t57.5 11.5t49.5 -32.5q97 -142 97 -318zM2304 438q0 -244 -134 -443q-23 -34 -64 -34q-23 0 -42 13
q-26 18 -32.5 49t11.5 57q108 164 108 358q0 195 -108 357q-18 26 -11.5 57.5t32.5 48.5q26 18 57 12t49 -33q134 -198 134 -442z" />
    <glyph glyph-name="_610" unicode="&#xf28a;" 
d="M1500 -13q0 -89 -63 -152.5t-153 -63.5t-153.5 63.5t-63.5 152.5q0 90 63.5 153.5t153.5 63.5t153 -63.5t63 -153.5zM1267 268q-115 -15 -192.5 -102.5t-77.5 -205.5q0 -74 33 -138q-146 -78 -379 -78q-109 0 -201 21t-153.5 54.5t-110.5 76.5t-76 85t-44.5 83
t-23.5 66.5t-6 39.5q0 19 4.5 42.5t18.5 56t36.5 58t64 43.5t94.5 18t94 -17.5t63 -41t35.5 -53t17.5 -49t4 -33.5q0 -34 -23 -81q28 -27 82 -42t93 -17l40 -1q115 0 190 51t75 133q0 26 -9 48.5t-31.5 44.5t-49.5 41t-74 44t-93.5 47.5t-119.5 56.5q-28 13 -43 20
q-116 55 -187 100t-122.5 102t-72 125.5t-20.5 162.5q0 78 20.5 150t66 137.5t112.5 114t166.5 77t221.5 28.5q120 0 220 -26t164.5 -67t109.5 -94t64 -105.5t19 -103.5q0 -46 -15 -82.5t-36.5 -58t-48.5 -36t-49 -19.5t-39 -5h-8h-32t-39 5t-44 14t-41 28t-37 46t-24 70.5
t-10 97.5q-15 16 -59 25.5t-81 10.5l-37 1q-68 0 -117.5 -31t-70.5 -70t-21 -76q0 -24 5 -43t24 -46t53 -51t97 -53.5t150 -58.5q76 -25 138.5 -53.5t109 -55.5t83 -59t60.5 -59.5t41 -62.5t26.5 -62t14.5 -63.5t6 -62t1 -62.5z" />
    <glyph glyph-name="_611" unicode="&#xf28b;" 
d="M704 352v576q0 14 -9 23t-23 9h-256q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h256q14 0 23 9t9 23zM1152 352v576q0 14 -9 23t-23 9h-256q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h256q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103
t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="_612" unicode="&#xf28c;" 
d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM768 96q148 0 273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273
t73 -273t198 -198t273 -73zM864 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-192zM480 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-192z" />
    <glyph glyph-name="_613" unicode="&#xf28d;" 
d="M1088 352v576q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5
t103 -385.5z" />
    <glyph glyph-name="_614" unicode="&#xf28e;" 
d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM768 96q148 0 273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273
t73 -273t198 -198t273 -73zM480 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h576q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-576z" />
    <glyph glyph-name="_615" unicode="&#xf290;" horiz-adv-x="1792" 
d="M1757 128l35 -313q3 -28 -16 -50q-19 -21 -48 -21h-1664q-29 0 -48 21q-19 22 -16 50l35 313h1722zM1664 967l86 -775h-1708l86 775q3 24 21 40.5t43 16.5h256v-128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5v128h384v-128q0 -53 37.5 -90.5t90.5 -37.5
t90.5 37.5t37.5 90.5v128h256q25 0 43 -16.5t21 -40.5zM1280 1152v-256q0 -26 -19 -45t-45 -19t-45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-256q0 -26 -19 -45t-45 -19t-45 19t-19 45v256q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
    <glyph glyph-name="_616" unicode="&#xf291;" horiz-adv-x="2048" 
d="M1920 768q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5h-15l-115 -662q-8 -46 -44 -76t-82 -30h-1280q-46 0 -82 30t-44 76l-115 662h-15q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5h1792zM485 -32q26 2 43.5 22.5t15.5 46.5l-32 416q-2 26 -22.5 43.5
t-46.5 15.5t-43.5 -22.5t-15.5 -46.5l32 -416q2 -25 20.5 -42t43.5 -17h5zM896 32v416q0 26 -19 45t-45 19t-45 -19t-19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45zM1280 32v416q0 26 -19 45t-45 19t-45 -19t-19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45zM1632 27l32 416
q2 26 -15.5 46.5t-43.5 22.5t-46.5 -15.5t-22.5 -43.5l-32 -416q-2 -26 15.5 -46.5t43.5 -22.5h5q25 0 43.5 17t20.5 42zM476 1244l-93 -412h-132l101 441q19 88 89 143.5t160 55.5h167q0 26 19 45t45 19h384q26 0 45 -19t19 -45h167q90 0 160 -55.5t89 -143.5l101 -441
h-132l-93 412q-11 44 -45.5 72t-79.5 28h-167q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45h-167q-45 0 -79.5 -28t-45.5 -72z" />
    <glyph glyph-name="_617" unicode="&#xf292;" horiz-adv-x="1792" 
d="M991 512l64 256h-254l-64 -256h254zM1759 1016l-56 -224q-7 -24 -31 -24h-327l-64 -256h311q15 0 25 -12q10 -14 6 -28l-56 -224q-5 -24 -31 -24h-327l-81 -328q-7 -24 -31 -24h-224q-16 0 -26 12q-9 12 -6 28l78 312h-254l-81 -328q-7 -24 -31 -24h-225q-15 0 -25 12
q-9 12 -6 28l78 312h-311q-15 0 -25 12q-9 12 -6 28l56 224q7 24 31 24h327l64 256h-311q-15 0 -25 12q-10 14 -6 28l56 224q5 24 31 24h327l81 328q7 24 32 24h224q15 0 25 -12q9 -12 6 -28l-78 -312h254l81 328q7 24 32 24h224q15 0 25 -12q9 -12 6 -28l-78 -312h311
q15 0 25 -12q9 -12 6 -28z" />
    <glyph glyph-name="_618" unicode="&#xf293;" 
d="M841 483l148 -148l-149 -149zM840 1094l149 -149l-148 -148zM710 -130l464 464l-306 306l306 306l-464 464v-611l-255 255l-93 -93l320 -321l-320 -321l93 -93l255 255v-611zM1429 640q0 -209 -32 -365.5t-87.5 -257t-140.5 -162.5t-181.5 -86.5t-219.5 -24.5
t-219.5 24.5t-181.5 86.5t-140.5 162.5t-87.5 257t-32 365.5t32 365.5t87.5 257t140.5 162.5t181.5 86.5t219.5 24.5t219.5 -24.5t181.5 -86.5t140.5 -162.5t87.5 -257t32 -365.5z" />
    <glyph glyph-name="_619" unicode="&#xf294;" horiz-adv-x="1024" 
d="M596 113l173 172l-173 172v-344zM596 823l173 172l-173 172v-344zM628 640l356 -356l-539 -540v711l-297 -296l-108 108l372 373l-372 373l108 108l297 -296v711l539 -540z" />
    <glyph glyph-name="_620" unicode="&#xf295;" 
d="M1280 256q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM512 1024q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5
t112.5 -271.5zM1440 1344q0 -20 -13 -38l-1056 -1408q-19 -26 -51 -26h-160q-26 0 -45 19t-19 45q0 20 13 38l1056 1408q19 26 51 26h160q26 0 45 -19t19 -45zM768 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5
t271.5 -112.5t112.5 -271.5z" />
    <glyph glyph-name="_621" unicode="&#xf296;" horiz-adv-x="1792" 
d="M104 830l792 -1015l-868 630q-18 13 -25 34.5t0 42.5l101 308v0zM566 830h660l-330 -1015v0zM368 1442l198 -612h-462l198 612q8 23 33 23t33 -23zM1688 830l101 -308q7 -21 0 -42.5t-25 -34.5l-868 -630l792 1015v0zM1688 830h-462l198 612q8 23 33 23t33 -23z" />
    <glyph glyph-name="_622" unicode="&#xf297;" horiz-adv-x="1792" 
d="M384 704h160v224h-160v-224zM1221 372v92q-104 -36 -243 -38q-135 -1 -259.5 46.5t-220.5 122.5l1 -96q88 -80 212 -128.5t272 -47.5q129 0 238 49zM640 704h640v224h-640v-224zM1792 736q0 -187 -99 -352q89 -102 89 -229q0 -157 -129.5 -268t-313.5 -111
q-122 0 -225 52.5t-161 140.5q-19 -1 -57 -1t-57 1q-58 -88 -161 -140.5t-225 -52.5q-184 0 -313.5 111t-129.5 268q0 127 89 229q-99 165 -99 352q0 209 120 385.5t326.5 279.5t449.5 103t449.5 -103t326.5 -279.5t120 -385.5z" />
    <glyph glyph-name="_623" unicode="&#xf298;" 
d="M515 625v-128h-252v128h252zM515 880v-127h-252v127h252zM1273 369v-128h-341v128h341zM1273 625v-128h-672v128h672zM1273 880v-127h-672v127h672zM1408 20v1240q0 8 -6 14t-14 6h-32l-378 -256l-210 171l-210 -171l-378 256h-32q-8 0 -14 -6t-6 -14v-1240q0 -8 6 -14
t14 -6h1240q8 0 14 6t6 14zM553 1130l185 150h-406zM983 1130l221 150h-406zM1536 1260v-1240q0 -62 -43 -105t-105 -43h-1240q-62 0 -105 43t-43 105v1240q0 62 43 105t105 43h1240q62 0 105 -43t43 -105z" />
    <glyph glyph-name="_624" unicode="&#xf299;" horiz-adv-x="1792" 
d="M896 720q-104 196 -160 278q-139 202 -347 318q-34 19 -70 36q-89 40 -94 32t34 -38l39 -31q62 -43 112.5 -93.5t94.5 -116.5t70.5 -113t70.5 -131q9 -17 13 -25q44 -84 84 -153t98 -154t115.5 -150t131 -123.5t148.5 -90.5q153 -66 154 -60q1 3 -49 37q-53 36 -81 57
q-77 58 -179 211t-185 310zM549 177q-76 60 -132.5 125t-98 143.5t-71 154.5t-58.5 186t-52 209t-60.5 252t-76.5 289q273 0 497.5 -36t379 -92t271 -144.5t185.5 -172.5t110 -198.5t56 -199.5t12.5 -198.5t-9.5 -173t-20 -143.5t-13 -107l323 -327h-104l-281 285
q-22 -2 -91.5 -14t-121.5 -19t-138 -6t-160.5 17t-167.5 59t-179 111z" />
    <glyph glyph-name="_625" unicode="&#xf29a;" horiz-adv-x="1792" 
d="M1374 879q-6 26 -28.5 39.5t-48.5 7.5q-261 -62 -401 -62t-401 62q-26 6 -48.5 -7.5t-28.5 -39.5t7.5 -48.5t39.5 -28.5q194 -46 303 -58q-2 -158 -15.5 -269t-26.5 -155.5t-41 -115.5l-9 -21q-10 -25 1 -49t36 -34q9 -4 23 -4q44 0 60 41l8 20q54 139 71 259h42
q17 -120 71 -259l8 -20q16 -41 60 -41q14 0 23 4q25 10 36 34t1 49l-9 21q-28 71 -41 115.5t-26.5 155.5t-15.5 269q109 12 303 58q26 6 39.5 28.5t7.5 48.5zM1024 1024q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z
M1600 640q0 -143 -55.5 -273.5t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5zM896 1408q-156 0 -298 -61t-245 -164t-164 -245t-61 -298t61 -298
t164 -245t245 -164t298 -61t298 61t245 164t164 245t61 298t-61 298t-164 245t-245 164t-298 61zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
    <glyph glyph-name="_626" unicode="&#xf29b;" 
d="M1438 723q34 -35 29 -82l-44 -551q-4 -42 -34.5 -70t-71.5 -28q-6 0 -9 1q-44 3 -72.5 36.5t-25.5 77.5l35 429l-143 -8q55 -113 55 -240q0 -216 -148 -372l-137 137q91 101 91 235q0 145 -102.5 248t-247.5 103q-134 0 -236 -92l-137 138q120 114 284 141l264 300
l-149 87l-181 -161q-33 -30 -77 -27.5t-73 35.5t-26.5 77t34.5 73l239 213q26 23 60 26.5t64 -14.5l488 -283q36 -21 48 -68q17 -67 -26 -117l-205 -232l371 20q49 3 83 -32zM1240 1180q-74 0 -126 52t-52 126t52 126t126 52t126.5 -52t52.5 -126t-52.5 -126t-126.5 -52z
M613 -62q106 0 196 61l139 -139q-146 -116 -335 -116q-148 0 -273.5 73t-198.5 198t-73 273q0 188 116 336l139 -139q-60 -88 -60 -197q0 -145 102.5 -247.5t247.5 -102.5z" />
    <glyph glyph-name="_627" unicode="&#xf29c;" 
d="M880 336v-160q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v160q0 14 9 23t23 9h160q14 0 23 -9t9 -23zM1136 832q0 -50 -15 -90t-45.5 -69t-52 -44t-59.5 -36q-32 -18 -46.5 -28t-26 -24t-11.5 -29v-32q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v68q0 35 10.5 64.5
t24 47.5t39 35.5t41 25.5t44.5 21q53 25 75 43t22 49q0 42 -43.5 71.5t-95.5 29.5q-56 0 -95 -27q-29 -20 -80 -83q-9 -12 -25 -12q-11 0 -19 6l-108 82q-10 7 -12 20t5 23q122 192 349 192q129 0 238.5 -89.5t109.5 -214.5zM768 1280q-130 0 -248.5 -51t-204 -136.5
t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5
t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="_628" unicode="&#xf29d;" horiz-adv-x="1408" 
d="M366 1225q-64 0 -110 45.5t-46 110.5q0 64 46 109.5t110 45.5t109.5 -45.5t45.5 -109.5q0 -65 -45.5 -110.5t-109.5 -45.5zM917 583q0 -50 -30 -67.5t-63.5 -6.5t-47.5 34l-367 438q-7 12 -14 15.5t-11 1.5l-3 -3q-7 -8 4 -21l122 -139l1 -354l-161 -457
q-67 -192 -92 -234q-15 -26 -28 -32q-50 -26 -103 -1q-29 13 -41.5 43t-9.5 57q2 17 197 618l5 416l-85 -164l35 -222q4 -24 -1 -42t-14 -27.5t-19 -16t-17 -7.5l-7 -2q-19 -3 -34.5 3t-24 16t-14 22t-7.5 19.5t-2 9.5l-46 299l211 381q23 34 113 34q75 0 107 -40l424 -521
q7 -5 14 -17l3 -3l-1 -1q7 -13 7 -29zM514 433q43 -113 88.5 -225t69.5 -168l24 -55q36 -93 42 -125q11 -70 -36 -97q-35 -22 -66 -16t-51 22t-29 35h-1q-6 16 -8 25l-124 351zM1338 -159q31 -49 31 -57q0 -5 -3 -7q-9 -5 -14.5 0.5t-15.5 26t-16 30.5q-114 172 -423 661
q3 -1 7 1t7 4l3 2q11 9 11 17z" />
    <glyph glyph-name="_629" unicode="&#xf29e;" horiz-adv-x="2304" 
d="M504 542h171l-1 265zM1530 641q0 87 -50.5 140t-146.5 53h-54v-388h52q91 0 145 57t54 138zM956 1018l1 -756q0 -14 -9.5 -24t-23.5 -10h-216q-14 0 -23.5 10t-9.5 24v62h-291l-55 -81q-10 -15 -28 -15h-267q-21 0 -30.5 18t3.5 35l556 757q9 14 27 14h332q14 0 24 -10
t10 -24zM1783 641q0 -193 -125.5 -303t-324.5 -110h-270q-14 0 -24 10t-10 24v756q0 14 10 24t24 10h268q200 0 326 -109t126 -302zM1939 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-44.5 -108t-73.5 -102.5h-51q38 45 66.5 104.5t41.5 112t21 98t9 72.5l1 27q0 8 -0.5 22.5
t-7.5 60t-20 91.5t-41 111.5t-66 124.5h43q41 -47 72 -107t45.5 -111.5t23 -96t10.5 -70.5zM2123 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-45 -108t-74 -102.5h-51q38 45 66.5 104.5t41.5 112t21 98t9 72.5l1 27q0 8 -0.5 22.5t-7.5 60t-19.5 91.5t-40.5 111.5t-66 124.5
h43q41 -47 72 -107t45.5 -111.5t23 -96t10.5 -70.5zM2304 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-44.5 -108t-73.5 -102.5h-51q38 45 66 104.5t41 112t21 98t9 72.5l1 27q0 8 -0.5 22.5t-7.5 60t-19.5 91.5t-40.5 111.5t-66 124.5h43q41 -47 72 -107t45.5 -111.5t23 -96
t9.5 -70.5z" />
    <glyph glyph-name="uniF2A0" unicode="&#xf2a0;" horiz-adv-x="1408" 
d="M617 -153q0 11 -13 58t-31 107t-20 69q-1 4 -5 26.5t-8.5 36t-13.5 21.5q-15 14 -51 14q-23 0 -70 -5.5t-71 -5.5q-34 0 -47 11q-6 5 -11 15.5t-7.5 20t-6.5 24t-5 18.5q-37 128 -37 255t37 255q1 4 5 18.5t6.5 24t7.5 20t11 15.5q13 11 47 11q24 0 71 -5.5t70 -5.5
q36 0 51 14q9 8 13.5 21.5t8.5 36t5 26.5q2 9 20 69t31 107t13 58q0 22 -43.5 52.5t-75.5 42.5q-20 8 -45 8q-34 0 -98 -18q-57 -17 -96.5 -40.5t-71 -66t-46 -70t-45.5 -94.5q-6 -12 -9 -19q-49 -107 -68 -216t-19 -244t19 -244t68 -216q56 -122 83 -161q63 -91 179 -127
l6 -2q64 -18 98 -18q25 0 45 8q32 12 75.5 42.5t43.5 52.5zM776 760q-26 0 -45 19t-19 45.5t19 45.5q37 37 37 90q0 52 -37 91q-19 19 -19 45t19 45t45 19t45 -19q75 -75 75 -181t-75 -181q-21 -19 -45 -19zM957 579q-27 0 -45 19q-19 19 -19 45t19 45q112 114 112 272
t-112 272q-19 19 -19 45t19 45t45 19t45 -19q150 -150 150 -362t-150 -362q-18 -19 -45 -19zM1138 398q-27 0 -45 19q-19 19 -19 45t19 45q90 91 138.5 208t48.5 245t-48.5 245t-138.5 208q-19 19 -19 45t19 45t45 19t45 -19q109 -109 167 -249t58 -294t-58 -294t-167 -249
q-18 -19 -45 -19z" />
    <glyph glyph-name="uniF2A1" unicode="&#xf2a1;" horiz-adv-x="2176" 
d="M192 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM704 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM704 864q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1472 352
q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1472 864q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 864
q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 1376q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 192q0 -80 -56 -136
t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 1216q0 -80 -56 -136t-136 -56
t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM2176 192q0 -80 -56 -136t-136 -56t-136 56
t-56 136t56 136t136 56t136 -56t56 -136zM1664 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM2176 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136
t56 136t136 56t136 -56t56 -136zM2176 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136z" />
    <glyph glyph-name="uniF2A2" unicode="&#xf2a2;" horiz-adv-x="1792" 
d="M128 -192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM320 0q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM365 365l256 -256l-90 -90l-256 256zM704 384q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45z
M1411 704q0 -59 -11.5 -108.5t-37.5 -93.5t-44 -67.5t-53 -64.5q-31 -35 -45.5 -54t-33.5 -50t-26.5 -64t-7.5 -74q0 -159 -112.5 -271.5t-271.5 -112.5q-26 0 -45 19t-19 45t19 45t45 19q106 0 181 75t75 181q0 57 11.5 105.5t37 91t43.5 66.5t52 63q40 46 59.5 72
t37.5 74.5t18 103.5q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM896 576q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45
t45 19t45 -19t19 -45zM1184 704q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 93 -65.5 158.5t-158.5 65.5q-92 0 -158 -65.5t-66 -158.5q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 146 103 249t249 103t249 -103t103 -249zM1578 993q10 -25 -1 -49t-36 -34q-9 -4 -23 -4
q-19 0 -35.5 11t-23.5 30q-68 178 -224 295q-21 16 -25 42t12 47q17 21 43 25t47 -12q183 -137 266 -351zM1788 1074q9 -25 -1.5 -49t-35.5 -34q-11 -4 -23 -4q-44 0 -60 41q-92 238 -297 393q-22 16 -25.5 42t12.5 47q16 22 42 25.5t47 -12.5q235 -175 341 -449z" />
    <glyph glyph-name="uniF2A3" unicode="&#xf2a3;" horiz-adv-x="2304" 
d="M1032 576q-59 2 -84 55q-17 34 -48 53.5t-68 19.5q-53 0 -90.5 -37.5t-37.5 -90.5q0 -56 36 -89l10 -8q34 -31 82 -31q37 0 68 19.5t48 53.5q25 53 84 55zM1600 704q0 56 -36 89l-10 8q-34 31 -82 31q-37 0 -68 -19.5t-48 -53.5q-25 -53 -84 -55q59 -2 84 -55
q17 -34 48 -53.5t68 -19.5q53 0 90.5 37.5t37.5 90.5zM1174 925q-17 -35 -55 -48t-73 4q-62 31 -134 31q-51 0 -99 -17q3 0 9.5 0.5t9.5 0.5q92 0 170.5 -50t118.5 -133q17 -36 3.5 -73.5t-49.5 -54.5q-18 -9 -39 -9q21 0 39 -9q36 -17 49.5 -54.5t-3.5 -73.5
q-40 -83 -118.5 -133t-170.5 -50h-6q-16 2 -44 4l-290 27l-239 -120q-14 -7 -29 -7q-40 0 -57 35l-160 320q-11 23 -4 47.5t29 37.5l209 119l148 267q17 155 91.5 291.5t195.5 236.5q31 25 70.5 21.5t64.5 -34.5t21.5 -70t-34.5 -65q-70 -59 -117 -128q123 84 267 101
q40 5 71.5 -19t35.5 -64q5 -40 -19 -71.5t-64 -35.5q-84 -10 -159 -55q46 10 99 10q115 0 218 -50q36 -18 49 -55.5t-5 -73.5zM2137 1085l160 -320q11 -23 4 -47.5t-29 -37.5l-209 -119l-148 -267q-17 -155 -91.5 -291.5t-195.5 -236.5q-26 -22 -61 -22q-45 0 -74 35
q-25 31 -21.5 70t34.5 65q70 59 117 128q-123 -84 -267 -101q-4 -1 -12 -1q-36 0 -63.5 24t-31.5 60q-5 40 19 71.5t64 35.5q84 10 159 55q-46 -10 -99 -10q-115 0 -218 50q-36 18 -49 55.5t5 73.5q17 35 55 48t73 -4q62 -31 134 -31q51 0 99 17q-3 0 -9.5 -0.5t-9.5 -0.5
q-92 0 -170.5 50t-118.5 133q-17 36 -3.5 73.5t49.5 54.5q18 9 39 9q-21 0 -39 9q-36 17 -49.5 54.5t3.5 73.5q40 83 118.5 133t170.5 50h6h1q14 -2 42 -4l291 -27l239 120q14 7 29 7q40 0 57 -35z" />
    <glyph glyph-name="uniF2A4" unicode="&#xf2a4;" horiz-adv-x="1792" 
d="M1056 704q0 -26 19 -45t45 -19t45 19t19 45q0 146 -103 249t-249 103t-249 -103t-103 -249q0 -26 19 -45t45 -19t45 19t19 45q0 93 66 158.5t158 65.5t158 -65.5t66 -158.5zM835 1280q-117 0 -223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5q0 -26 19 -45t45 -19t45 19
t19 45q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -55 -18 -103.5t-37.5 -74.5t-59.5 -72q-34 -39 -52 -63t-43.5 -66.5t-37 -91t-11.5 -105.5q0 -106 -75 -181t-181 -75q-26 0 -45 -19t-19 -45t19 -45t45 -19q159 0 271.5 112.5t112.5 271.5q0 41 7.5 74
t26.5 64t33.5 50t45.5 54q35 41 53 64.5t44 67.5t37.5 93.5t11.5 108.5q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5zM591 561l226 -226l-579 -579q-12 -12 -29 -12t-29 12l-168 168q-12 12 -12 29t12 29zM1612 1524l168 -168q12 -12 12 -29t-12 -30l-233 -233
l-26 -25l-71 -71q-66 153 -195 258l91 91l207 207q13 12 30 12t29 -12z" />
    <glyph glyph-name="uniF2A5" unicode="&#xf2a5;" 
d="M866 1021q0 -27 -13 -94q-11 -50 -31.5 -150t-30.5 -150q-2 -11 -4.5 -12.5t-13.5 -2.5q-20 -2 -31 -2q-58 0 -84 49.5t-26 113.5q0 88 35 174t103 124q28 14 51 14q28 0 36.5 -16.5t8.5 -47.5zM1352 597q0 14 -39 75.5t-52 66.5q-21 8 -34 8q-91 0 -226 -77l-2 2
q3 22 27.5 135t24.5 178q0 233 -242 233q-24 0 -68 -6q-94 -17 -168.5 -89.5t-111.5 -166.5t-37 -189q0 -146 80.5 -225t227.5 -79q25 0 25 -3t-1 -5q-4 -34 -26 -117q-14 -52 -51.5 -101t-82.5 -49q-42 0 -42 47q0 24 10.5 47.5t25 39.5t29.5 28.5t26 20t11 8.5q0 3 -7 10
q-24 22 -58.5 36.5t-65.5 14.5q-35 0 -63.5 -34t-41 -75t-12.5 -75q0 -88 51.5 -142t138.5 -54q82 0 155 53t117.5 126t65.5 153q6 22 15.5 66.5t14.5 66.5q3 12 14 18q118 60 227 60q48 0 127 -18q1 -1 4 -1q5 0 9.5 4.5t4.5 8.5zM1536 1120v-960q0 -119 -84.5 -203.5
t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="uniF2A6" unicode="&#xf2a6;" horiz-adv-x="1535" 
d="M744 1231q0 24 -2 38.5t-8.5 30t-21 23t-37.5 7.5q-39 0 -78 -23q-105 -58 -159 -190.5t-54 -269.5q0 -44 8.5 -85.5t26.5 -80.5t52.5 -62.5t81.5 -23.5q4 0 18 -0.5t20 0t16 3t15 8.5t7 16q16 77 48 231.5t48 231.5q19 91 19 146zM1498 575q0 -7 -7.5 -13.5t-15.5 -6.5
l-6 1q-22 3 -62 11t-72 12.5t-63 4.5q-167 0 -351 -93q-15 -8 -21 -27q-10 -36 -24.5 -105.5t-22.5 -100.5q-23 -91 -70 -179.5t-112.5 -164.5t-154.5 -123t-185 -47q-135 0 -214.5 83.5t-79.5 219.5q0 53 19.5 117t63 116.5t97.5 52.5q38 0 120 -33.5t83 -61.5
q0 -1 -16.5 -12.5t-39.5 -31t-46 -44.5t-39 -61t-16 -74q0 -33 16.5 -53t48.5 -20q45 0 85 31.5t66.5 78t48 105.5t32.5 107t16 90v9q0 2 -3.5 3.5t-8.5 1.5h-10t-10 -0.5t-6 -0.5q-227 0 -352 122.5t-125 348.5q0 108 34.5 221t96 210t156 167.5t204.5 89.5q52 9 106 9
q374 0 374 -360q0 -98 -38 -273t-43 -211l3 -3q101 57 182.5 88t167.5 31q22 0 53 -13q19 -7 80 -102.5t61 -116.5z" />
    <glyph glyph-name="uniF2A7" unicode="&#xf2a7;" horiz-adv-x="1664" 
d="M831 863q32 0 59 -18l222 -148q61 -40 110 -97l146 -170q40 -46 29 -106l-72 -413q-6 -32 -29.5 -53.5t-55.5 -25.5l-527 -56l-352 -32h-9q-39 0 -67.5 28t-28.5 68q0 37 27 64t65 32l260 32h-448q-41 0 -69.5 30t-26.5 71q2 39 32 65t69 26l442 1l-521 64q-41 5 -66 37
t-19 73q6 35 34.5 57.5t65.5 22.5h10l481 -60l-351 94q-38 10 -62 41.5t-18 68.5q6 36 33 58.5t62 22.5q6 0 20 -2l448 -96l217 -37q1 0 3 -0.5t3 -0.5q23 0 30.5 23t-12.5 36l-186 125q-35 23 -42 63.5t18 73.5q27 38 76 38zM761 661l186 -125l-218 37l-5 2l-36 38
l-238 262q-1 1 -2.5 3.5t-2.5 3.5q-24 31 -18.5 70t37.5 64q31 23 68 17.5t64 -33.5l142 -147q-2 -1 -5 -3.5t-4 -4.5q-32 -45 -23 -99t55 -85zM1648 1115l15 -266q4 -73 -11 -147l-48 -219q-12 -59 -67 -87l-106 -54q2 62 -39 109l-146 170q-53 61 -117 103l-222 148
q-34 23 -76 23q-51 0 -88 -37l-235 312q-25 33 -18 73.5t41 63.5q33 22 71.5 14t62.5 -40l266 -352l-262 455q-21 35 -10.5 75t47.5 59q35 18 72.5 6t57.5 -46l241 -420l-136 337q-15 35 -4.5 74t44.5 56q37 19 76 6t56 -51l193 -415l101 -196q8 -15 23 -17.5t27 7.5t11 26
l-12 224q-2 41 26 71t69 31q39 0 67 -28.5t30 -67.5z" />
    <glyph glyph-name="uniF2A8" unicode="&#xf2a8;" horiz-adv-x="1792" 
d="M335 180q-2 0 -6 2q-86 57 -168.5 145t-139.5 180q-21 30 -21 69q0 9 2 19t4 18t7 18t8.5 16t10.5 17t10 15t12 15.5t11 14.5q184 251 452 365q-110 198 -110 211q0 19 17 29q116 64 128 64q18 0 28 -16l124 -229q92 19 192 19q266 0 497.5 -137.5t378.5 -369.5
q20 -31 20 -69t-20 -69q-91 -142 -218.5 -253.5t-278.5 -175.5q110 -198 110 -211q0 -20 -17 -29q-116 -64 -127 -64q-19 0 -29 16l-124 229l-64 119l-444 820l7 7q-58 -24 -99 -47q3 -5 127 -234t243 -449t119 -223q0 -7 -9 -9q-13 -3 -72 -3q-57 0 -60 7l-456 841
q-39 -28 -82 -68q24 -43 214 -393.5t190 -354.5q0 -10 -11 -10q-14 0 -82.5 22t-72.5 28l-106 197l-224 413q-44 -53 -78 -106q2 -3 18 -25t23 -34l176 -327q0 -10 -10 -10zM1165 282l49 -91q273 111 450 385q-180 277 -459 389q67 -64 103 -148.5t36 -176.5
q0 -106 -47 -200.5t-132 -157.5zM848 896q0 -20 14 -34t34 -14q86 0 147 -61t61 -147q0 -20 14 -34t34 -14t34 14t14 34q0 126 -89 215t-215 89q-20 0 -34 -14t-14 -34zM1214 961l-9 4l7 -7z" />
    <glyph glyph-name="uniF2A9" unicode="&#xf2a9;" horiz-adv-x="1280" 
d="M1050 430q0 -215 -147 -374q-148 -161 -378 -161q-232 0 -378 161q-147 159 -147 374q0 147 68 270.5t189 196.5t268 73q96 0 182 -31q-32 -62 -39 -126q-66 28 -143 28q-167 0 -280.5 -123t-113.5 -291q0 -170 112.5 -288.5t281.5 -118.5t281 118.5t112 288.5
q0 89 -32 166q66 13 123 49q41 -98 41 -212zM846 619q0 -192 -79.5 -345t-238.5 -253l-14 -1q-29 0 -62 5q83 32 146.5 102.5t99.5 154.5t58.5 189t30 192.5t7.5 178.5q0 69 -3 103q55 -160 55 -326zM791 947v-2q-73 214 -206 440q88 -59 142.5 -186.5t63.5 -251.5z
M1035 744q-83 0 -160 75q218 120 290 247q19 37 21 56q-42 -94 -139.5 -166.5t-204.5 -97.5q-35 54 -35 113q0 37 17 79t43 68q46 44 157 74q59 16 106 58.5t74 100.5q74 -105 74 -253q0 -109 -24 -170q-32 -77 -88.5 -130.5t-130.5 -53.5z" />
    <glyph glyph-name="uniF2AA" unicode="&#xf2aa;" 
d="M1050 495q0 78 -28 147q-41 -25 -85 -34q22 -50 22 -114q0 -117 -77 -198.5t-193 -81.5t-193.5 81.5t-77.5 198.5q0 115 78 199.5t193 84.5q53 0 98 -19q4 43 27 87q-60 21 -125 21q-154 0 -257.5 -108.5t-103.5 -263.5t103.5 -261t257.5 -106t257.5 106.5t103.5 260.5z
M872 850q2 -24 2 -71q0 -63 -5 -123t-20.5 -132.5t-40.5 -130t-68.5 -106t-100.5 -70.5q21 -3 42 -3h10q219 139 219 411q0 116 -38 225zM872 850q-4 80 -44 171.5t-98 130.5q92 -156 142 -302zM1207 955q0 102 -51 174q-41 -86 -124 -109q-69 -19 -109 -53.5t-40 -99.5
q0 -40 24 -77q74 17 140.5 67t95.5 115q-4 -52 -74.5 -111.5t-138.5 -97.5q52 -52 110 -52q51 0 90 37t60 90q17 42 17 117zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5
t84.5 -203.5z" />
    <glyph glyph-name="uniF2AB" unicode="&#xf2ab;" 
d="M1279 388q0 22 -22 27q-67 15 -118 59t-80 108q-7 19 -7 25q0 15 19.5 26t43 17t43 20.5t19.5 36.5q0 19 -18.5 31.5t-38.5 12.5q-12 0 -32 -8t-31 -8q-4 0 -12 2q5 95 5 114q0 79 -17 114q-36 78 -103 121.5t-152 43.5q-199 0 -275 -165q-17 -35 -17 -114q0 -19 5 -114
q-4 -2 -14 -2q-12 0 -32 7.5t-30 7.5q-21 0 -38.5 -12t-17.5 -32q0 -21 19.5 -35.5t43 -20.5t43 -17t19.5 -26q0 -6 -7 -25q-64 -138 -198 -167q-22 -5 -22 -27q0 -46 137 -68q2 -5 6 -26t11.5 -30.5t23.5 -9.5q12 0 37.5 4.5t39.5 4.5q35 0 67 -15t54 -32.5t57.5 -32.5
t76.5 -15q43 0 79 15t57.5 32.5t53.5 32.5t67 15q14 0 39.5 -4t38.5 -4q16 0 23 10t11 30t6 25q137 22 137 68zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5
t103 -385.5z" />
    <glyph glyph-name="uniF2AC" unicode="&#xf2ac;" horiz-adv-x="1664" 
d="M848 1408q134 1 240.5 -68.5t163.5 -192.5q27 -58 27 -179q0 -47 -9 -191q14 -7 28 -7q18 0 51 13.5t51 13.5q29 0 56 -18t27 -46q0 -32 -31.5 -54t-69 -31.5t-69 -29t-31.5 -47.5q0 -15 12 -43q37 -82 102.5 -150t144.5 -101q28 -12 80 -23q28 -6 28 -35
q0 -70 -219 -103q-7 -11 -11 -39t-14 -46.5t-33 -18.5q-20 0 -62 6.5t-64 6.5q-37 0 -62 -5q-32 -5 -63 -22.5t-58 -38t-58 -40.5t-76 -33.5t-99 -13.5q-52 0 -96.5 13.5t-75 33.5t-57.5 40.5t-58 38t-62 22.5q-26 5 -63 5q-24 0 -65.5 -7.5t-58.5 -7.5q-25 0 -35 18.5
t-14 47.5t-11 40q-219 33 -219 103q0 29 28 35q52 11 80 23q78 32 144.5 101t102.5 150q12 28 12 43q0 28 -31.5 47.5t-69.5 29.5t-69.5 31.5t-31.5 52.5q0 27 26 45.5t55 18.5q15 0 48 -13t53 -13q18 0 32 7q-9 142 -9 190q0 122 27 180q64 137 172 198t264 63z" />
    <glyph glyph-name="uniF2AD" unicode="&#xf2ad;" 
d="M1280 388q0 22 -22 27q-67 14 -118 58t-80 109q-7 14 -7 25q0 15 19.5 26t42.5 17t42.5 20.5t19.5 36.5q0 19 -18.5 31.5t-38.5 12.5q-11 0 -31 -8t-32 -8q-4 0 -12 2q5 63 5 115q0 78 -17 114q-36 78 -102.5 121.5t-152.5 43.5q-198 0 -275 -165q-18 -38 -18 -115
q0 -38 6 -114q-10 -2 -15 -2q-11 0 -31.5 8t-30.5 8q-20 0 -37.5 -12.5t-17.5 -32.5q0 -21 19.5 -35.5t42.5 -20.5t42.5 -17t19.5 -26q0 -11 -7 -25q-64 -138 -198 -167q-22 -5 -22 -27q0 -47 138 -69q2 -5 6 -26t11 -30.5t23 -9.5q13 0 38.5 5t38.5 5q35 0 67.5 -15
t54.5 -32.5t57.5 -32.5t76.5 -15q43 0 79 15t57.5 32.5t54 32.5t67.5 15q13 0 39 -4.5t39 -4.5q15 0 22.5 9.5t11.5 31t5 24.5q138 22 138 69zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960
q119 0 203.5 -84.5t84.5 -203.5z" />
    <glyph glyph-name="uniF2AE" unicode="&#xf2ae;" horiz-adv-x="2304" 
d="M2304 1536q-69 -46 -125 -92t-89 -81t-59.5 -71.5t-37.5 -57.5t-22 -44.5t-14 -29.5q-10 -18 -35.5 -136.5t-48.5 -164.5q-15 -29 -50 -60.5t-67.5 -50.5t-72.5 -41t-48 -28q-47 -31 -151 -231q-341 14 -630 -158q-92 -53 -303 -179q47 16 86 31t55 22l15 7
q71 27 163 64.5t133.5 53.5t108 34.5t142.5 31.5q186 31 465 -7q1 0 10 -3q11 -6 14 -17t-3 -22l-194 -345q-15 -29 -47 -22q-128 24 -354 24q-146 0 -402 -44.5t-392 -46.5q-82 -1 -149 13t-107 37t-61 40t-33 34l-1 1v2q0 6 6 6q138 0 371 55q192 366 374.5 524t383.5 158
q5 0 14.5 -0.5t38 -5t55 -12t61.5 -24.5t63 -39.5t54 -59t40 -82.5l102 177q2 4 21 42.5t44.5 86.5t61 109.5t84 133.5t100.5 137q66 82 128 141.5t121.5 96.5t92.5 53.5t88 39.5z" />
    <glyph glyph-name="uniF2B0" unicode="&#xf2b0;" 
d="M1322 640q0 -45 -5 -76l-236 14l224 -78q-19 -73 -58 -141l-214 103l177 -158q-44 -61 -107 -108l-157 178l103 -215q-61 -37 -140 -59l-79 228l14 -240q-38 -6 -76 -6t-76 6l14 238l-78 -226q-74 19 -140 59l103 215l-157 -178q-59 43 -108 108l178 158l-214 -104
q-39 69 -58 141l224 79l-237 -14q-5 42 -5 76q0 35 5 77l238 -14l-225 79q19 73 58 140l214 -104l-177 159q46 61 107 108l158 -178l-103 215q67 39 140 58l77 -224l-13 236q36 6 75 6q38 0 76 -6l-14 -237l78 225q74 -19 140 -59l-103 -214l158 178q61 -47 107 -108
l-177 -159l213 104q37 -62 58 -141l-224 -78l237 14q5 -31 5 -77zM1352 640q0 160 -78.5 295.5t-213 214t-292.5 78.5q-119 0 -227 -46.5t-186.5 -125t-124.5 -187.5t-46 -229q0 -119 46 -228t124.5 -187.5t186.5 -125t227 -46.5q158 0 292.5 78.5t213 214t78.5 294.5z
M1425 1023v-766l-657 -383l-657 383v766l657 383zM768 -183l708 412v823l-708 411l-708 -411v-823zM1536 1088v-896l-768 -448l-768 448v896l768 448z" />
    <glyph glyph-name="uniF2B1" unicode="&#xf2b1;" horiz-adv-x="1664" 
d="M339 1318h691l-26 -72h-665q-110 0 -188.5 -79t-78.5 -189v-771q0 -95 60.5 -169.5t153.5 -93.5q23 -5 98 -5v-72h-45q-140 0 -239.5 100t-99.5 240v771q0 140 99.5 240t239.5 100zM1190 1536h247l-482 -1294q-23 -61 -40.5 -103.5t-45 -98t-54 -93.5t-64.5 -78.5
t-79.5 -65t-95.5 -41t-116 -18.5v195q163 26 220 182q20 52 20 105q0 54 -20 106l-285 733h228l187 -585zM1664 978v-1111h-795q37 55 45 73h678v1038q0 85 -49.5 155t-129.5 99l25 67q101 -34 163.5 -123.5t62.5 -197.5z" />
    <glyph glyph-name="uniF2B2" unicode="&#xf2b2;" horiz-adv-x="1792" 
d="M852 1227q0 -29 -17 -52.5t-45 -23.5t-45 23.5t-17 52.5t17 52.5t45 23.5t45 -23.5t17 -52.5zM688 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50 -21.5t-20 -51.5v-114q0 -30 20.5 -52t49.5 -22q30 0 50.5 22t20.5 52zM860 -149v114q0 30 -20 51.5t-50 21.5t-50.5 -21.5
t-20.5 -51.5v-114q0 -30 20.5 -52t50.5 -22q29 0 49.5 22t20.5 52zM1034 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50.5 -21.5t-20.5 -51.5v-114q0 -30 20.5 -52t50.5 -22t50.5 22t20.5 52zM1208 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50.5 -21.5t-20.5 -51.5v-114
q0 -30 20.5 -52t50.5 -22t50.5 22t20.5 52zM1476 535q-84 -160 -232 -259.5t-323 -99.5q-123 0 -229.5 51.5t-178.5 137t-113 197.5t-41 232q0 88 21 174q-104 -175 -104 -390q0 -162 65 -312t185 -251q30 57 91 57q56 0 86 -50q32 50 87 50q56 0 86 -50q32 50 87 50t87 -50
q30 50 86 50q28 0 52.5 -15.5t37.5 -40.5q112 94 177 231.5t73 287.5zM1326 564q0 75 -72 75q-17 0 -47 -6q-95 -19 -149 -19q-226 0 -226 243q0 86 30 204q-83 -127 -83 -275q0 -150 89 -260.5t235 -110.5q111 0 210 70q13 48 13 79zM884 1223q0 50 -32 89.5t-81 39.5
t-81 -39.5t-32 -89.5q0 -51 31.5 -90.5t81.5 -39.5t81.5 39.5t31.5 90.5zM1513 884q0 96 -37.5 179t-113 137t-173.5 54q-77 0 -149 -35t-127 -94q-48 -159 -48 -268q0 -104 45.5 -157t147.5 -53q53 0 142 19q36 6 53 6q51 0 77.5 -28t26.5 -80q0 -26 -4 -46
q75 68 117.5 165.5t42.5 200.5zM1792 667q0 -111 -33.5 -249.5t-93.5 -204.5q-58 -64 -195 -142.5t-228 -104.5l-4 -1v-114q0 -43 -29.5 -75t-72.5 -32q-56 0 -86 50q-32 -50 -87 -50t-87 50q-30 -50 -86 -50q-55 0 -87 50q-30 -50 -86 -50q-47 0 -75 33.5t-28 81.5
q-90 -68 -198 -68q-118 0 -211 80q54 1 106 20q-113 31 -182 127q32 -7 71 -7q89 0 164 46q-192 192 -240 306q-24 56 -24 160q0 57 9 125.5t31.5 146.5t55 141t86.5 105t120 42q59 0 81 -52q19 29 42 54q2 3 12 13t13 16q10 15 23 38t25 42t28 39q87 111 211.5 177
t260.5 66q35 0 62 -4q59 64 146 64q83 0 140 -57q5 -5 5 -12q0 -5 -6 -13.5t-12.5 -16t-16 -17l-10.5 -10.5q17 -6 36 -18t19 -24q0 -6 -16 -25q157 -138 197 -378q25 30 60 30q45 0 100 -49q90 -80 90 -279z" />
    <glyph glyph-name="uniF2B3" unicode="&#xf2b3;" 
d="M917 631q0 33 -6 64h-362v-132h217q-12 -76 -74.5 -120.5t-142.5 -44.5q-99 0 -169 71.5t-70 170.5t70 170.5t169 71.5q93 0 153 -59l104 101q-108 100 -257 100q-160 0 -272 -112.5t-112 -271.5t112 -271.5t272 -112.5q165 0 266.5 105t101.5 270zM1262 585h109v110
h-109v110h-110v-110h-110v-110h110v-110h110v110zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
    <glyph glyph-name="uniF2B4" unicode="&#xf2b4;" 
d="M1536 1024v-839q0 -48 -49 -62q-174 -52 -338 -52q-73 0 -215.5 29.5t-227.5 29.5q-164 0 -370 -48v-338h-160v1368q-63 25 -101 81t-38 124q0 91 64 155t155 64t155 -64t64 -155q0 -68 -38 -124t-101 -81v-68q190 44 343 44q99 0 198 -15q14 -2 111.5 -22.5t149.5 -20.5
q77 0 165 18q11 2 80 21t89 19q26 0 45 -19t19 -45z" />
    <glyph glyph-name="uniF2B5" unicode="&#xf2b5;" horiz-adv-x="2304" 
d="M192 384q40 0 56 32t0 64t-56 32t-56 -32t0 -64t56 -32zM1665 442q-10 13 -38.5 50t-41.5 54t-38 49t-42.5 53t-40.5 47t-45 49l-125 -140q-83 -94 -208.5 -92t-205.5 98q-57 69 -56.5 158t58.5 157l177 206q-22 11 -51 16.5t-47.5 6t-56.5 -0.5t-49 -1q-92 0 -158 -66
l-158 -158h-155v-544q5 0 21 0.5t22 0t19.5 -2t20.5 -4.5t17.5 -8.5t18.5 -13.5l297 -292q115 -111 227 -111q78 0 125 47q57 -20 112.5 8t72.5 85q74 -6 127 44q20 18 36 45.5t14 50.5q10 -10 43 -10q43 0 77 21t49.5 53t12 71.5t-30.5 73.5zM1824 384h96v512h-93l-157 180
q-66 76 -169 76h-167q-89 0 -146 -67l-209 -243q-28 -33 -28 -75t27 -75q43 -51 110 -52t111 49l193 218q25 23 53.5 21.5t47 -27t8.5 -56.5q16 -19 56 -63t60 -68q29 -36 82.5 -105.5t64.5 -84.5q52 -66 60 -140zM2112 384q40 0 56 32t0 64t-56 32t-56 -32t0 -64t56 -32z
M2304 960v-640q0 -26 -19 -45t-45 -19h-434q-27 -65 -82 -106.5t-125 -51.5q-33 -48 -80.5 -81.5t-102.5 -45.5q-42 -53 -104.5 -81.5t-128.5 -24.5q-60 -34 -126 -39.5t-127.5 14t-117 53.5t-103.5 81l-287 282h-358q-26 0 -45 19t-19 45v672q0 26 19 45t45 19h421
q14 14 47 48t47.5 48t44 40t50.5 37.5t51 25.5t62 19.5t68 5.5h117q99 0 181 -56q82 56 181 56h167q35 0 67 -6t56.5 -14.5t51.5 -26.5t44.5 -31t43 -39.5t39 -42t41 -48t41.5 -48.5h355q26 0 45 -19t19 -45z" />
    <glyph glyph-name="uniF2B6" unicode="&#xf2b6;" horiz-adv-x="1792" 
d="M1792 882v-978q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v978q0 15 11 24q8 7 39 34.5t41.5 36t45.5 37.5t70 55.5t96 73t143.5 107t192.5 140.5q5 4 52.5 40t71.5 52.5t64 35t69 18.5t69 -18.5t65 -35.5t71 -52t52 -40q110 -80 192.5 -140.5t143.5 -107
t96 -73t70 -55.5t45.5 -37.5t41.5 -36t39 -34.5q11 -9 11 -24zM1228 297q263 191 345 252q11 8 12.5 20.5t-6.5 23.5l-38 52q-8 11 -21 12.5t-24 -6.5q-231 -169 -343 -250q-5 -3 -52 -39t-71.5 -52.5t-64.5 -35t-69 -18.5t-69 18.5t-64.5 35t-71.5 52.5t-52 39
q-186 134 -343 250q-11 8 -24 6.5t-21 -12.5l-38 -52q-8 -11 -6.5 -23.5t12.5 -20.5q82 -61 345 -252q10 -8 50 -38t65 -47t64 -39.5t77.5 -33.5t75.5 -11t75.5 11t79 34.5t64.5 39.5t65 47.5t48 36.5z" />
    <glyph glyph-name="uniF2B7" unicode="&#xf2b7;" horiz-adv-x="1792" 
d="M1474 623l39 -51q8 -11 6.5 -23.5t-11.5 -20.5q-43 -34 -126.5 -98.5t-146.5 -113t-67 -51.5q-39 -32 -60 -48t-60.5 -41t-76.5 -36.5t-74 -11.5h-1h-1q-37 0 -74 11.5t-76 36.5t-61 41.5t-60 47.5q-5 4 -65 50.5t-143.5 111t-122.5 94.5q-11 8 -12.5 20.5t6.5 23.5
l37 52q8 11 21.5 13t24.5 -7q94 -73 306 -236q5 -4 43.5 -35t60.5 -46.5t56.5 -32.5t58.5 -17h1h1q24 0 58.5 17t56.5 32.5t60.5 46.5t43.5 35q258 198 313 242q11 8 24 6.5t21 -12.5zM1664 -96v928q-90 83 -159 139q-91 74 -389 304q-3 2 -43 35t-61 48t-56 32.5t-59 17.5
h-1h-1q-24 0 -59 -17.5t-56 -32.5t-61 -48t-43 -35q-215 -166 -315.5 -245.5t-129.5 -104t-82 -74.5q-14 -12 -21 -19v-928q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 832v-928q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v928q0 56 41 94
q123 114 350 290.5t233 181.5q36 30 59 47.5t61.5 42t76 36.5t74.5 12h1h1q37 0 74.5 -12t76 -36.5t61.5 -42t59 -47.5q43 -36 156 -122t226 -177t201 -173q41 -38 41 -94z" />
    <glyph glyph-name="uniF2B8" unicode="&#xf2b8;" 
d="M330 1l202 -214l-34 236l-216 213zM556 -225l274 218l-11 245l-300 -215zM245 413l227 -213l-48 327l-245 204zM495 189l317 214l-14 324l-352 -200zM843 178l95 -80l-2 239l-103 79q0 -1 1 -8.5t0 -12t-5 -7.5l-78 -52l85 -70q7 -6 7 -88zM138 930l256 -200l-68 465
l-279 173zM1173 267l15 234l-230 -164l2 -240zM417 722l373 194l-19 441l-423 -163zM1270 357l20 233l-226 142l-2 -105l144 -95q6 -4 4 -9l-7 -119zM1461 496l30 222l-179 -128l-20 -228zM1273 329l-71 49l-8 -117q0 -5 -4 -8l-234 -187q-7 -5 -14 0l-98 83l7 -161
q0 -5 -4 -8l-293 -234q-4 -2 -6 -2q-8 2 -8 3l-228 242q-4 4 -59 277q-2 7 5 11l61 37q-94 86 -95 92l-72 351q-2 7 6 12l94 45q-133 100 -135 108l-96 466q-2 10 7 13l433 135q5 0 8 -1l317 -153q6 -4 6 -9l20 -463q0 -7 -6 -10l-118 -61l126 -85q5 -2 5 -8l5 -123l121 74
q5 4 11 0l84 -56l3 110q0 6 5 9l206 126q6 3 11 0l245 -135q4 -4 5 -7t-6.5 -60t-17.5 -124.5t-10 -70.5q0 -5 -4 -7l-191 -153q-6 -5 -13 0z" />
    <glyph glyph-name="uniF2B9" unicode="&#xf2b9;" horiz-adv-x="1664" 
d="M1201 298q0 57 -5.5 107t-21 100.5t-39.5 86t-64 58t-91 22.5q-6 -4 -33.5 -20.5t-42.5 -24.5t-40.5 -20t-49 -17t-46.5 -5t-46.5 5t-49 17t-40.5 20t-42.5 24.5t-33.5 20.5q-51 0 -91 -22.5t-64 -58t-39.5 -86t-21 -100.5t-5.5 -107q0 -73 42 -121.5t103 -48.5h576
q61 0 103 48.5t42 121.5zM1028 892q0 108 -76.5 184t-183.5 76t-183.5 -76t-76.5 -184q0 -107 76.5 -183t183.5 -76t183.5 76t76.5 183zM1664 352v-192q0 -14 -9 -23t-23 -9h-96v-224q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h1216
q66 0 113 -47t47 -113v-224h96q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-96v-128h96q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-96v-128h96q14 0 23 -9t9 -23z" />
    <glyph glyph-name="uniF2BA" unicode="&#xf2ba;" horiz-adv-x="1664" 
d="M1028 892q0 -107 -76.5 -183t-183.5 -76t-183.5 76t-76.5 183q0 108 76.5 184t183.5 76t183.5 -76t76.5 -184zM980 672q46 0 82.5 -17t60 -47.5t39.5 -67t24 -81t11.5 -82.5t3.5 -79q0 -67 -39.5 -118.5t-105.5 -51.5h-576q-66 0 -105.5 51.5t-39.5 118.5q0 48 4.5 93.5
t18.5 98.5t36.5 91.5t63 64.5t93.5 26h5q7 -4 32 -19.5t35.5 -21t33 -17t37 -16t35 -9t39.5 -4.5t39.5 4.5t35 9t37 16t33 17t35.5 21t32 19.5zM1664 928q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-128h96q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-128h96
q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-224q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h1216q66 0 113 -47t47 -113v-224h96q13 0 22.5 -9.5t9.5 -22.5v-192zM1408 -96v1472q0 13 -9.5 22.5t-22.5 9.5h-1216
q-13 0 -22.5 -9.5t-9.5 -22.5v-1472q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5z" />
    <glyph glyph-name="uniF2BB" unicode="&#xf2bb;" horiz-adv-x="2048" 
d="M1024 405q0 64 -9 117.5t-29.5 103t-60.5 78t-97 28.5q-6 -4 -30 -18t-37.5 -21.5t-35.5 -17.5t-43 -14.5t-42 -4.5t-42 4.5t-43 14.5t-35.5 17.5t-37.5 21.5t-30 18q-57 0 -97 -28.5t-60.5 -78t-29.5 -103t-9 -117.5t37 -106.5t91 -42.5h512q54 0 91 42.5t37 106.5z
M867 925q0 94 -66.5 160.5t-160.5 66.5t-160.5 -66.5t-66.5 -160.5t66.5 -160.5t160.5 -66.5t160.5 66.5t66.5 160.5zM1792 416v64q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM1792 676v56q0 15 -10.5 25.5t-25.5 10.5h-568
q-15 0 -25.5 -10.5t-10.5 -25.5v-56q0 -15 10.5 -25.5t25.5 -10.5h568q15 0 25.5 10.5t10.5 25.5zM1792 928v64q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-352v96q0 14 -9 23t-23 9
h-64q-14 0 -23 -9t-9 -23v-96h-768v96q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-96h-352q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" />
    <glyph glyph-name="uniF2BC" unicode="&#xf2bc;" horiz-adv-x="2048" 
d="M1024 405q0 -64 -37 -106.5t-91 -42.5h-512q-54 0 -91 42.5t-37 106.5t9 117.5t29.5 103t60.5 78t97 28.5q6 -4 30 -18t37.5 -21.5t35.5 -17.5t43 -14.5t42 -4.5t42 4.5t43 14.5t35.5 17.5t37.5 21.5t30 18q57 0 97 -28.5t60.5 -78t29.5 -103t9 -117.5zM867 925
q0 -94 -66.5 -160.5t-160.5 -66.5t-160.5 66.5t-66.5 160.5t66.5 160.5t160.5 66.5t160.5 -66.5t66.5 -160.5zM1792 480v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM1792 732v-56q0 -15 -10.5 -25.5t-25.5 -10.5h-568
q-15 0 -25.5 10.5t-10.5 25.5v56q0 15 10.5 25.5t25.5 10.5h568q15 0 25.5 -10.5t10.5 -25.5zM1792 992v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM1920 32v1216q0 13 -9.5 22.5t-22.5 9.5h-1728q-13 0 -22.5 -9.5
t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h352v96q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-96h768v96q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-96h352q13 0 22.5 9.5t9.5 22.5zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-1728q-66 0 -113 47t-47 113v1216q0 66 47 113
t113 47h1728q66 0 113 -47t47 -113z" />
    <glyph glyph-name="uniF2BD" unicode="&#xf2bd;" horiz-adv-x="1792" 
d="M1523 197q-22 155 -87.5 257.5t-184.5 118.5q-67 -74 -159.5 -115.5t-195.5 -41.5t-195.5 41.5t-159.5 115.5q-119 -16 -184.5 -118.5t-87.5 -257.5q106 -150 271 -237.5t356 -87.5t356 87.5t271 237.5zM1280 896q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5
t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1792 640q0 -182 -71 -347.5t-190.5 -286t-285.5 -191.5t-349 -71q-182 0 -348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
    <glyph glyph-name="uniF2BE" unicode="&#xf2be;" horiz-adv-x="1792" 
d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348q0 -181 -70.5 -347t-190.5 -286t-286 -191.5t-349 -71.5t-349 71t-285.5 191.5t-190.5 286t-71 347.5t71 348t191 286t286 191t348 71zM1515 185q149 205 149 455q0 156 -61 298t-164 245t-245 164t-298 61t-298 -61
t-245 -164t-164 -245t-61 -298q0 -250 149 -455q66 327 306 327q131 -128 313 -128t313 128q240 0 306 -327zM1280 832q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5z" />
    <glyph glyph-name="uniF2C0" unicode="&#xf2c0;" 
d="M1201 752q47 -14 89.5 -38t89 -73t79.5 -115.5t55 -172t22 -236.5q0 -154 -100 -263.5t-241 -109.5h-854q-141 0 -241 109.5t-100 263.5q0 131 22 236.5t55 172t79.5 115.5t89 73t89.5 38q-79 125 -79 272q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5
t198.5 -40.5t163.5 -109.5t109.5 -163.5t40.5 -198.5q0 -147 -79 -272zM768 1408q-159 0 -271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5zM1195 -128q88 0 150.5 71.5t62.5 173.5q0 239 -78.5 377t-225.5 145
q-145 -127 -336 -127t-336 127q-147 -7 -225.5 -145t-78.5 -377q0 -102 62.5 -173.5t150.5 -71.5h854z" />
    <glyph glyph-name="uniF2C1" unicode="&#xf2c1;" horiz-adv-x="1280" 
d="M1024 278q0 -64 -37 -107t-91 -43h-512q-54 0 -91 43t-37 107t9 118t29.5 104t61 78.5t96.5 28.5q80 -75 188 -75t188 75q56 0 96.5 -28.5t61 -78.5t29.5 -104t9 -118zM870 797q0 -94 -67.5 -160.5t-162.5 -66.5t-162.5 66.5t-67.5 160.5t67.5 160.5t162.5 66.5
t162.5 -66.5t67.5 -160.5zM1152 -96v1376h-1024v-1376q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1280 1376v-1472q0 -66 -47 -113t-113 -47h-960q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h352v-96q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v96h352
q66 0 113 -47t47 -113z" />
    <glyph glyph-name="uniF2C2" unicode="&#xf2c2;" horiz-adv-x="2048" 
d="M896 324q0 54 -7.5 100.5t-24.5 90t-51 68.5t-81 25q-64 -64 -156 -64t-156 64q-47 0 -81 -25t-51 -68.5t-24.5 -90t-7.5 -100.5q0 -55 31.5 -93.5t75.5 -38.5h426q44 0 75.5 38.5t31.5 93.5zM768 768q0 80 -56 136t-136 56t-136 -56t-56 -136t56 -136t136 -56t136 56
t56 136zM1792 288v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1408 544v64q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1792 544v64q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23
v-64q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1792 800v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM128 1152h1792v96q0 14 -9 23t-23 9h-1728q-14 0 -23 -9t-9 -23v-96zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-1728
q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" />
    <glyph glyph-name="uniF2C3" unicode="&#xf2c3;" horiz-adv-x="2048" 
d="M896 324q0 -55 -31.5 -93.5t-75.5 -38.5h-426q-44 0 -75.5 38.5t-31.5 93.5q0 54 7.5 100.5t24.5 90t51 68.5t81 25q64 -64 156 -64t156 64q47 0 81 -25t51 -68.5t24.5 -90t7.5 -100.5zM768 768q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136z
M1792 352v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1408 608v-64q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h320q14 0 23 -9t9 -23zM1792 608v-64q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v64
q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 864v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1920 32v1120h-1792v-1120q0 -13 9.5 -22.5t22.5 -9.5h1728q13 0 22.5 9.5t9.5 22.5zM2048 1248v-1216q0 -66 -47 -113t-113 -47
h-1728q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" />
    <glyph glyph-name="uniF2C4" unicode="&#xf2c4;" horiz-adv-x="1792" 
d="M1255 749q0 318 -105 474.5t-330 156.5q-222 0 -326 -157t-104 -474q0 -316 104 -471.5t326 -155.5q74 0 131 17q-22 43 -39 73t-44 65t-53.5 56.5t-63 36t-77.5 14.5q-46 0 -79 -16l-49 97q105 91 276 91q132 0 215.5 -54t150.5 -155q67 149 67 402zM1645 117h117
q3 -27 -2 -67t-26.5 -95t-58 -100.5t-107 -78t-162.5 -32.5q-71 0 -130.5 19t-105.5 56t-79 78t-66 96q-97 -27 -205 -27q-150 0 -292.5 58t-253 158.5t-178 249t-67.5 317.5q0 170 67.5 319.5t178.5 250.5t253.5 159t291.5 58q121 0 238.5 -36t217 -106t176 -164.5
t119.5 -219t43 -261.5q0 -190 -80.5 -347.5t-218.5 -264.5q47 -70 93.5 -106.5t104.5 -36.5q61 0 94 37.5t38 85.5z" />
    <glyph glyph-name="uniF2C5" unicode="&#xf2c5;" horiz-adv-x="2304" 
d="M453 -101q0 -21 -16 -37.5t-37 -16.5q-1 0 -13 3q-63 15 -162 140q-225 284 -225 676q0 341 213 614q39 51 95 103.5t94 52.5q19 0 35 -13.5t16 -32.5q0 -27 -63 -90q-98 -102 -147 -184q-119 -199 -119 -449q0 -281 123 -491q50 -85 136 -173q2 -3 14.5 -16t19.5 -21
t17 -20.5t14.5 -23.5t4.5 -21zM1796 33q0 -29 -17.5 -48.5t-46.5 -19.5h-1081q-26 0 -45 19t-19 45q0 29 17.5 48.5t46.5 19.5h1081q26 0 45 -19t19 -45zM1581 644q0 -134 -67 -233q-25 -38 -69.5 -78.5t-83.5 -60.5q-16 -10 -27 -10q-7 0 -15 6t-8 12q0 9 19 30t42 46
t42 67.5t19 88.5q0 76 -35 130q-29 42 -46 42q-3 0 -3 -5q0 -12 7.5 -35.5t7.5 -36.5q0 -22 -21.5 -35t-44.5 -13q-66 0 -66 76q0 15 1.5 44t1.5 44q0 25 -10 46q-13 25 -42 53.5t-51 28.5q-5 0 -7 -0.5t-3.5 -2.5t-1.5 -6q0 -2 16 -26t16 -54q0 -37 -19 -68t-46 -54
t-53.5 -46t-45.5 -54t-19 -68q0 -98 42 -160q29 -43 79 -63q16 -5 17 -10q1 -2 1 -5q0 -16 -18 -16q-6 0 -33 11q-119 43 -195 139.5t-76 218.5q0 55 24.5 115.5t60 115t70.5 108.5t59.5 113.5t24.5 111.5q0 53 -25 94q-29 48 -56 64q-19 9 -19 21q0 20 41 20q50 0 110 -29
q41 -19 71 -44.5t49.5 -51t33.5 -62.5t22 -69t16 -80q0 -1 3 -17.5t4.5 -25t5.5 -25t9 -27t11 -21.5t14.5 -16.5t18.5 -5.5q23 0 37 14t14 37q0 25 -20 67t-20 52t10 10q27 0 93 -70q72 -76 102.5 -156t30.5 -186zM2304 615q0 -274 -138 -503q-19 -32 -48 -72t-68 -86.5
t-81 -77t-74 -30.5q-16 0 -31 15.5t-15 31.5q0 15 29 50.5t68.5 77t48.5 52.5q183 230 183 531q0 131 -20.5 235t-72.5 211q-58 119 -163 228q-2 3 -13 13.5t-16.5 16.5t-15 17.5t-15 20t-9.5 18.5t-4 19q0 19 16 35.5t35 16.5q70 0 196 -169q98 -131 146 -273t60 -314
q2 -42 2 -64z" />
    <glyph glyph-name="uniF2C6" unicode="&#xf2c6;" horiz-adv-x="1792" 
d="M1189 229l147 693q9 44 -10.5 63t-51.5 7l-864 -333q-29 -11 -39.5 -25t-2.5 -26.5t32 -19.5l221 -69l513 323q21 14 32 6q7 -5 -4 -15l-415 -375v0v0l-16 -228q23 0 45 22l108 104l224 -165q64 -36 81 38zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71
t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
    <glyph glyph-name="uniF2C7" unicode="&#xf2c7;" horiz-adv-x="1024" 
d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v907h128v-907q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5
t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192
v128h192z" />
    <glyph glyph-name="uniF2C8" unicode="&#xf2c8;" horiz-adv-x="1024" 
d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v651h128v-651q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5
t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192
v128h192z" />
    <glyph glyph-name="uniF2C9" unicode="&#xf2c9;" horiz-adv-x="1024" 
d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v395h128v-395q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5
t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192
v128h192z" />
    <glyph glyph-name="uniF2CA" unicode="&#xf2ca;" horiz-adv-x="1024" 
d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v139h128v-139q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5
t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192
v128h192z" />
    <glyph glyph-name="uniF2CB" unicode="&#xf2cb;" horiz-adv-x="1024" 
d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 79 56 135.5t136 56.5t136 -56.5t56 -135.5zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5t93.5 226.5z
M896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192v128h192z" />
    <glyph glyph-name="uniF2CC" unicode="&#xf2cc;" horiz-adv-x="1920" 
d="M1433 1287q10 -10 10 -23t-10 -23l-626 -626q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l44 44q-72 91 -81.5 207t46.5 215q-74 71 -176 71q-106 0 -181 -75t-75 -181v-1280h-256v1280q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5q106 0 201 -41
t166 -115q94 39 197 24.5t185 -79.5l44 44q10 10 23 10t23 -10zM1344 1024q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1600 896q-26 0 -45 19t-19 45t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19zM1856 1024q26 0 45 -19t19 -45t-19 -45t-45 -19
t-45 19t-19 45t19 45t45 19zM1216 896q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1408 832q0 26 19 45t45 19t45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45zM1728 896q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 768
q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1344 640q-26 0 -45 19t-19 45t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19zM1600 768q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1216 512q-26 0 -45 19t-19 45t19 45t45 19t45 -19
t19 -45t-19 -45t-45 -19zM1472 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 512q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1344 512q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1216 384
q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 256q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19z" />
    <glyph glyph-name="uniF2CD" unicode="&#xf2cd;" horiz-adv-x="1792" 
d="M1664 448v-192q0 -169 -128 -286v-194q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v118q-63 -22 -128 -22h-768q-65 0 -128 22v-110q0 -17 -9.5 -28.5t-22.5 -11.5h-64q-13 0 -22.5 11.5t-9.5 28.5v186q-128 117 -128 286v192h1536zM704 864q0 -14 -9 -23t-23 -9t-23 9
t-9 23t9 23t23 9t23 -9t9 -23zM768 928q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM704 992q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 992q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM768 1056q0 -14 -9 -23t-23 -9t-23 9
t-9 23t9 23t23 9t23 -9t9 -23zM704 1120q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1792 608v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v640q0 106 75 181t181 75q108 0 184 -78q46 19 98 12t93 -39l22 22q11 11 22 0l42 -42
q11 -11 0 -22l-314 -314q-11 -11 -22 0l-42 42q-11 11 0 22l22 22q-36 46 -40.5 104t23.5 108q-37 35 -88 35q-53 0 -90.5 -37.5t-37.5 -90.5v-640h1504q14 0 23 -9t9 -23zM896 1056q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 1120q0 -14 -9 -23t-23 -9
t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM768 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM960 1120q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM896 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 1248q0 -14 -9 -23
t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1024 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM960 1248q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1088 1248q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23z" />
    <glyph glyph-name="uniF2CE" unicode="&#xf2ce;" 
d="M994 344q0 -86 -17 -197q-31 -215 -55 -313q-22 -90 -152 -90t-152 90q-24 98 -55 313q-17 110 -17 197q0 168 224 168t224 -168zM1536 768q0 -240 -134 -434t-350 -280q-8 -3 -15 3t-6 15q7 48 10 66q4 32 6 47q1 9 9 12q159 81 255.5 234t96.5 337q0 180 -91 330.5
t-247 234.5t-337 74q-124 -7 -237 -61t-193.5 -140.5t-128 -202t-46.5 -240.5q1 -184 99 -336.5t257 -231.5q7 -3 9 -12q3 -21 6 -45q1 -9 5 -32.5t6 -35.5q1 -9 -6.5 -15t-15.5 -2q-148 58 -261 169.5t-173.5 264t-52.5 319.5q7 143 66 273.5t154.5 227t225 157.5t272.5 70
q164 10 315.5 -46.5t261 -160.5t175 -250.5t65.5 -308.5zM994 800q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5zM1282 768q0 -122 -53.5 -228.5t-146.5 -177.5q-8 -6 -16 -2t-10 14q-6 52 -29 92q-7 10 3 20
q58 54 91 127t33 155q0 111 -58.5 204t-157.5 141.5t-212 36.5q-133 -15 -229 -113t-109 -231q-10 -92 23.5 -176t98.5 -144q10 -10 3 -20q-24 -41 -29 -93q-2 -9 -10 -13t-16 2q-95 74 -148.5 183t-51.5 234q3 131 69 244t177 181.5t241 74.5q144 7 268 -60t196.5 -187.5
t72.5 -263.5z" />
    <glyph glyph-name="uniF2D0" unicode="&#xf2d0;" horiz-adv-x="1792" 
d="M256 128h1280v768h-1280v-768zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
    <glyph glyph-name="uniF2D1" unicode="&#xf2d1;" horiz-adv-x="1792" 
d="M1792 224v-192q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
    <glyph glyph-name="uniF2D2" unicode="&#xf2d2;" horiz-adv-x="2048" 
d="M256 0h768v512h-768v-512zM1280 512h512v768h-768v-256h96q66 0 113 -47t47 -113v-352zM2048 1376v-960q0 -66 -47 -113t-113 -47h-608v-352q0 -66 -47 -113t-113 -47h-960q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h608v352q0 66 47 113t113 47h960q66 0 113 -47
t47 -113z" />
    <glyph glyph-name="uniF2D3" unicode="&#xf2d3;" horiz-adv-x="1792" 
d="M1175 215l146 146q10 10 10 23t-10 23l-233 233l233 233q10 10 10 23t-10 23l-146 146q-10 10 -23 10t-23 -10l-233 -233l-233 233q-10 10 -23 10t-23 -10l-146 -146q-10 -10 -10 -23t10 -23l233 -233l-233 -233q-10 -10 -10 -23t10 -23l146 -146q10 -10 23 -10t23 10
l233 233l233 -233q10 -10 23 -10t23 10zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
    <glyph glyph-name="uniF2D4" unicode="&#xf2d4;" horiz-adv-x="1792" 
d="M1257 425l-146 -146q-10 -10 -23 -10t-23 10l-169 169l-169 -169q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l169 169l-169 169q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l169 -169l169 169q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23
l-169 -169l169 -169q10 -10 10 -23t-10 -23zM256 128h1280v1024h-1280v-1024zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
    <glyph glyph-name="uniF2D5" unicode="&#xf2d5;" horiz-adv-x="1792" 
d="M1070 358l306 564h-654l-306 -564h654zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
    <glyph glyph-name="uniF2D6" unicode="&#xf2d6;" horiz-adv-x="1794" 
d="M1291 1060q-15 17 -35 8.5t-26 -28.5t5 -38q14 -17 40 -14.5t34 20.5t-18 52zM895 814q-8 -8 -19.5 -8t-18.5 8q-8 8 -8 19t8 18q7 8 18.5 8t19.5 -8q7 -7 7 -18t-7 -19zM1060 740l-35 -35q-12 -13 -29.5 -13t-30.5 13l-38 38q-12 13 -12 30t12 30l35 35q12 12 29.5 12
t30.5 -12l38 -39q12 -12 12 -29.5t-12 -29.5zM951 870q-7 -8 -18.5 -8t-19.5 8q-7 8 -7 19t7 19q8 8 19 8t19 -8t8 -19t-8 -19zM1354 968q-34 -64 -107.5 -85.5t-127.5 16.5q-38 28 -61 66.5t-21 87.5t39 92t75.5 53t70.5 -5t70 -51q2 -2 13 -12.5t14.5 -13.5t13 -13.5
t12.5 -15.5t10 -15.5t8.5 -18t4 -18.5t1 -21t-5 -22t-9.5 -24zM1555 486q3 20 -8.5 34.5t-27.5 21.5t-33 17t-23 20q-40 71 -84 98.5t-113 11.5q19 13 40 18.5t33 4.5l12 -1q2 45 -34 90q6 20 6.5 40.5t-2.5 30.5l-3 10q43 24 71 65t34 91q10 84 -43 150.5t-137 76.5
q-60 7 -114 -18.5t-82 -74.5q-30 -51 -33.5 -101t14.5 -87t43.5 -64t56.5 -42q-45 4 -88 36t-57 88q-28 108 32 222q-16 21 -29 32q-50 0 -89 -19q19 24 42 37t36 14l13 1q0 50 -13 78q-10 21 -32.5 28.5t-47 -3.5t-37.5 -40q2 4 4 7q-7 -28 -6.5 -75.5t19 -117t48.5 -122.5
q-25 -14 -47 -36q-35 -16 -85.5 -70.5t-84.5 -101.5l-33 -46q-90 -34 -181 -125.5t-75 -162.5q1 -16 11 -27q-15 -12 -30 -30q-21 -25 -21 -54t21.5 -40t63.5 6q41 19 77 49.5t55 60.5q-2 2 -6.5 5t-20.5 7.5t-33 3.5q23 5 51 12.5t40 10t27.5 6t26 4t23.5 0.5q14 -7 22 34
q7 37 7 90q0 102 -40 150q106 -103 101 -219q-1 -29 -15 -50t-27 -27l-13 -6q-4 -7 -19 -32t-26 -45.5t-26.5 -52t-25 -61t-17 -63t-6.5 -66.5t10 -63q-35 54 -37 80q-22 -24 -34.5 -39t-33.5 -42t-30.5 -46t-16.5 -41t-0.5 -38t25.5 -27q45 -25 144 64t190.5 221.5
t122.5 228.5q86 52 145 115.5t86 119.5q47 -93 154 -178q104 -83 167 -80q39 2 46 43zM1794 640q0 -182 -71 -348t-191 -286t-286.5 -191t-348.5 -71t-348.5 71t-286.5 191t-191 286t-71 348t71 348t191 286t286.5 191t348.5 71t348.5 -71t286.5 -191t191 -286t71 -348z" />
    <glyph glyph-name="uniF2D7" unicode="&#xf2d7;" 
d="M518 1353v-655q103 -1 191.5 1.5t125.5 5.5l37 3q68 2 90.5 24.5t39.5 94.5l33 142h103l-14 -322l7 -319h-103l-29 127q-15 68 -45 93t-84 26q-87 8 -352 8v-556q0 -78 43.5 -115.5t133.5 -37.5h357q35 0 59.5 2t55 7.5t54 18t48.5 32t46 50.5t39 73l93 216h89
q-6 -37 -31.5 -252t-30.5 -276q-146 5 -263.5 8t-162.5 4h-44h-628l-376 -12v102l127 25q67 13 91.5 37t25.5 79l8 643q3 402 -8 645q-2 61 -25.5 84t-91.5 36l-127 24v102l376 -12h702q139 0 374 27q-6 -68 -14 -194.5t-12 -219.5l-5 -92h-93l-32 124q-31 121 -74 179.5
t-113 58.5h-548q-28 0 -35.5 -8.5t-7.5 -30.5z" />
    <glyph glyph-name="uniF2D8" unicode="&#xf2d8;" 
d="M922 739v-182q0 -4 0.5 -15t0 -15l-1.5 -12t-3.5 -11.5t-6.5 -7.5t-11 -5.5t-16 -1.5v309q9 0 16 -1t11 -5t6.5 -5.5t3.5 -9.5t1 -10.5v-13.5v-14zM1238 643v-121q0 -1 0.5 -12.5t0 -15.5t-2.5 -11.5t-7.5 -10.5t-13.5 -3q-9 0 -14 9q-4 10 -4 165v7v8.5v9t1.5 8.5l3.5 7
t5 5.5t8 1.5q6 0 10 -1.5t6.5 -4.5t4 -6t2 -8.5t0.5 -8v-9.5v-9zM180 407h122v472h-122v-472zM614 407h106v472h-159l-28 -221q-20 148 -32 221h-158v-472h107v312l45 -312h76l43 319v-319zM1039 712q0 67 -5 90q-3 16 -11 28.5t-17 20.5t-25 14t-26.5 8.5t-31 4t-29 1.5
h-29.5h-12h-91v-472h56q169 -1 197 24.5t25 180.5q-1 62 -1 100zM1356 515v133q0 29 -2 45t-9.5 33.5t-24.5 25t-46 7.5q-46 0 -77 -34v154h-117v-472h110l7 30q30 -36 77 -36q50 0 66 30.5t16 83.5zM1536 1248v-1216q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113
v1216q0 66 47 113t113 47h1216q66 0 113 -47t47 -113z" />
    <glyph glyph-name="uniF2D9" unicode="&#xf2d9;" horiz-adv-x="2176" 
d="M1143 -197q-6 1 -11 4q-13 8 -36 23t-86 65t-116.5 104.5t-112 140t-89.5 172.5q-17 3 -175 37q66 -213 235 -362t391 -184zM502 409l168 -28q-25 76 -41 167.5t-19 145.5l-4 53q-84 -82 -121 -224q5 -65 17 -114zM612 1018q-43 -64 -77 -148q44 46 74 68zM2049 584
q0 161 -62 307t-167.5 252t-250.5 168.5t-304 62.5q-147 0 -281 -52.5t-240 -148.5q-30 -58 -45 -160q60 51 143 83.5t158.5 43t143 13.5t108.5 -1l40 -3q33 -1 53 -15.5t24.5 -33t6.5 -37t-1 -28.5q-126 11 -227.5 0.5t-183 -43.5t-142.5 -71.5t-131 -98.5
q4 -36 11.5 -92.5t35.5 -178t62 -179.5q123 -6 247.5 14.5t214.5 53.5t162.5 67t109.5 59l37 24q22 16 39.5 20.5t30.5 -5t17 -34.5q14 -97 -39 -121q-208 -97 -467 -134q-135 -20 -317 -16q41 -96 110 -176.5t137 -127t130.5 -79t101.5 -43.5l39 -12q143 -23 263 15
q195 99 314 289t119 418zM2123 621q-14 -135 -40 -212q-70 -208 -181.5 -346.5t-318.5 -253.5q-48 -33 -82 -44q-72 -26 -163 -16q-36 -3 -73 -3q-283 0 -504.5 173t-295.5 442q-1 0 -4 0.5t-5 0.5q-6 -50 2.5 -112.5t26 -115t36 -98t31.5 -71.5l14 -26q8 -12 54 -82
q-71 38 -124.5 106.5t-78.5 140t-39.5 137t-17.5 107.5l-2 42q-5 2 -33.5 12.5t-48.5 18t-53 20.5t-57.5 25t-50 25.5t-42.5 27t-25 25.5q19 -10 50.5 -25.5t113 -45.5t145.5 -38l2 32q11 149 94 290q41 202 176 365q28 115 81 214q15 28 32 45t49 32q158 74 303.5 104
t302 11t306.5 -97q220 -115 333 -336t87 -474z" />
    <glyph glyph-name="uniF2DA" unicode="&#xf2da;" horiz-adv-x="1792" 
d="M1341 752q29 44 -6.5 129.5t-121.5 142.5q-58 39 -125.5 53.5t-118 4.5t-68.5 -37q-12 -23 -4.5 -28t42.5 -10q23 -3 38.5 -5t44.5 -9.5t56 -17.5q36 -13 67.5 -31.5t53 -37t40 -38.5t30.5 -38t22 -34.5t16.5 -28.5t12 -18.5t10.5 -6t11 9.5zM1704 178
q-52 -127 -148.5 -220t-214.5 -141.5t-253 -60.5t-266 13.5t-251 91t-210 161.5t-141.5 235.5t-46.5 303.5q1 41 8.5 84.5t12.5 64t24 80.5t23 73q-51 -208 1 -397t173 -318t291 -206t346 -83t349 74.5t289 244.5q20 27 18 14q0 -4 -4 -14zM1465 627q0 -104 -40.5 -199
t-108.5 -164t-162 -109.5t-198 -40.5t-198 40.5t-162 109.5t-108.5 164t-40.5 199t40.5 199t108.5 164t162 109.5t198 40.5t198 -40.5t162 -109.5t108.5 -164t40.5 -199zM1752 915q-65 147 -180.5 251t-253 153.5t-292 53.5t-301 -36.5t-275.5 -129t-220 -211.5t-131 -297
t-10 -373q-49 161 -51.5 311.5t35.5 272.5t109 227t165.5 180.5t207 126t232 71t242.5 9t236 -54t216 -124.5t178 -197q33 -50 62 -121t31 -112zM1690 573q12 244 -136.5 416t-396.5 240q-8 0 -10 5t24 8q125 -4 230 -50t173 -120t116 -168.5t58.5 -199t-1 -208
t-61.5 -197.5t-122.5 -167t-185 -117.5t-248.5 -46.5q108 30 201.5 80t174 123t129.5 176.5t55 225.5z" />
    <glyph glyph-name="uniF2DB" unicode="&#xf2db;" 
d="M192 256v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 512v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 768v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16
q0 16 16 16h112zM192 1024v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 1280v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM1280 1440v-1472q0 -40 -28 -68t-68 -28h-832q-40 0 -68 28
t-28 68v1472q0 40 28 68t68 28h832q40 0 68 -28t28 -68zM1536 208v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 464v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 720v-32
q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 976v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 1232v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16
h48q16 0 16 -16z" />
    <glyph glyph-name="uniF2DC" unicode="&#xf2dc;" horiz-adv-x="1664" 
d="M1566 419l-167 -33l186 -107q23 -13 29.5 -38.5t-6.5 -48.5q-14 -23 -39 -29.5t-48 6.5l-186 106l55 -160q13 -38 -12 -63.5t-60.5 -20.5t-48.5 42l-102 300l-271 156v-313l208 -238q16 -18 17 -39t-11 -36.5t-28.5 -25t-37 -5.5t-36.5 22l-112 128v-214q0 -26 -19 -45
t-45 -19t-45 19t-19 45v214l-112 -128q-16 -18 -36.5 -22t-37 5.5t-28.5 25t-11 36.5t17 39l208 238v313l-271 -156l-102 -300q-13 -37 -48.5 -42t-60.5 20.5t-12 63.5l55 160l-186 -106q-23 -13 -48 -6.5t-39 29.5q-13 23 -6.5 48.5t29.5 38.5l186 107l-167 33
q-29 6 -42 29t-8.5 46.5t25.5 40t50 10.5l310 -62l271 157l-271 157l-310 -62q-4 -1 -13 -1q-27 0 -44 18t-19 40t11 43t40 26l167 33l-186 107q-23 13 -29.5 38.5t6.5 48.5t39 30t48 -7l186 -106l-55 160q-13 38 12 63.5t60.5 20.5t48.5 -42l102 -300l271 -156v313
l-208 238q-16 18 -17 39t11 36.5t28.5 25t37 5.5t36.5 -22l112 -128v214q0 26 19 45t45 19t45 -19t19 -45v-214l112 128q16 18 36.5 22t37 -5.5t28.5 -25t11 -36.5t-17 -39l-208 -238v-313l271 156l102 300q13 37 48.5 42t60.5 -20.5t12 -63.5l-55 -160l186 106
q23 13 48 6.5t39 -29.5q13 -23 6.5 -48.5t-29.5 -38.5l-186 -107l167 -33q27 -5 40 -26t11 -43t-19 -40t-44 -18q-9 0 -13 1l-310 62l-271 -157l271 -157l310 62q29 6 50 -10.5t25.5 -40t-8.5 -46.5t-42 -29z" />
    <glyph glyph-name="uniF2DD" unicode="&#xf2dd;" horiz-adv-x="1792" 
d="M1473 607q7 118 -33 226.5t-113 189t-177 131t-221 57.5q-116 7 -225.5 -32t-192 -110.5t-135 -175t-59.5 -220.5q-7 -118 33 -226.5t113 -189t177.5 -131t221.5 -57.5q155 -9 293 59t224 195.5t94 283.5zM1792 1536l-349 -348q120 -117 180.5 -272t50.5 -321
q-11 -183 -102 -339t-241 -255.5t-332 -124.5l-999 -132l347 347q-120 116 -180.5 271.5t-50.5 321.5q11 184 102 340t241.5 255.5t332.5 124.5q167 22 500 66t500 66z" />
    <glyph glyph-name="uniF2DE" unicode="&#xf2de;" horiz-adv-x="1792" 
d="M948 508l163 -329h-51l-175 350l-171 -350h-49l179 374l-78 33l21 49l240 -102l-21 -50zM563 1100l304 -130l-130 -304l-304 130zM907 915l240 -103l-103 -239l-239 102zM1188 765l191 -81l-82 -190l-190 81zM1680 640q0 159 -62 304t-167.5 250.5t-250.5 167.5t-304 62
t-304 -62t-250.5 -167.5t-167.5 -250.5t-62 -304t62 -304t167.5 -250.5t250.5 -167.5t304 -62t304 62t250.5 167.5t167.5 250.5t62 304zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71
t286 -191t191 -286t71 -348z" />
    <glyph glyph-name="uniF2E0" unicode="&#xf2e0;" horiz-adv-x="1920" 
d="M1334 302q-4 24 -27.5 34t-49.5 10.5t-48.5 12.5t-25.5 38q-5 47 33 139.5t75 181t32 127.5q-14 101 -117 103q-45 1 -75 -16l-3 -2l-5 -2.5t-4.5 -2t-5 -2t-5 -0.5t-6 1.5t-6 3.5t-6.5 5q-3 2 -9 8.5t-9 9t-8.5 7.5t-9.5 7.5t-9.5 5.5t-11 4.5t-11.5 2.5q-30 5 -48 -3
t-45 -31q-1 -1 -9 -8.5t-12.5 -11t-15 -10t-16.5 -5.5t-17 3q-54 27 -84 40q-41 18 -94 -5t-76 -65q-16 -28 -41 -98.5t-43.5 -132.5t-40 -134t-21.5 -73q-22 -69 18.5 -119t110.5 -46q30 2 50.5 15t38.5 46q7 13 79 199.5t77 194.5q6 11 21.5 18t29.5 0q27 -15 21 -53
q-2 -18 -51 -139.5t-50 -132.5q-6 -38 19.5 -56.5t60.5 -7t55 49.5q4 8 45.5 92t81.5 163.5t46 88.5q20 29 41 28q29 0 25 -38q-2 -16 -65.5 -147.5t-70.5 -159.5q-12 -53 13 -103t74 -74q17 -9 51 -15.5t71.5 -8t62.5 14t20 48.5zM383 86q3 -15 -5 -27.5t-23 -15.5
q-14 -3 -26.5 5t-15.5 23q-3 14 5 27t22 16t27 -5t16 -23zM953 -177q12 -17 8.5 -37.5t-20.5 -32.5t-37.5 -8t-32.5 21q-11 17 -7.5 37.5t20.5 32.5t37.5 8t31.5 -21zM177 635q-18 -27 -49.5 -33t-57.5 13q-26 18 -32 50t12 58q18 27 49.5 33t57.5 -12q26 -19 32 -50.5
t-12 -58.5zM1467 -42q19 -28 13 -61.5t-34 -52.5t-60.5 -13t-51.5 34t-13 61t33 53q28 19 60.5 13t52.5 -34zM1579 562q69 -113 42.5 -244.5t-134.5 -207.5q-90 -63 -199 -60q-20 -80 -84.5 -127t-143.5 -44.5t-140 57.5q-12 -9 -13 -10q-103 -71 -225 -48.5t-193 126.5
q-50 73 -53 164q-83 14 -142.5 70.5t-80.5 128t-2 152t81 138.5q-36 60 -38 128t24.5 125t79.5 98.5t121 50.5q32 85 99 148t146.5 91.5t168 17t159.5 -66.5q72 21 140 17.5t128.5 -36t104.5 -80t67.5 -115t17.5 -140.5q52 -16 87 -57t45.5 -89t-5.5 -99.5t-58 -87.5z
M455 1222q14 -20 9.5 -44.5t-24.5 -38.5q-19 -14 -43.5 -9.5t-37.5 24.5q-14 20 -9.5 44.5t24.5 38.5q19 14 43.5 9.5t37.5 -24.5zM614 1503q4 -16 -5 -30.5t-26 -18.5t-31 5.5t-18 26.5q-3 17 6.5 31t25.5 18q17 4 31 -5.5t17 -26.5zM1800 555q4 -20 -6.5 -37t-30.5 -21
q-19 -4 -36 6.5t-21 30.5t6.5 37t30.5 22q20 4 36.5 -7.5t20.5 -30.5zM1136 1448q16 -27 8.5 -58.5t-35.5 -47.5q-27 -16 -57.5 -8.5t-46.5 34.5q-16 28 -8.5 59t34.5 48t58 9t47 -36zM1882 792q4 -15 -4 -27.5t-23 -16.5q-15 -3 -27.5 5.5t-15.5 22.5q-3 15 5 28t23 16
q14 3 26.5 -5t15.5 -23zM1691 1033q15 -22 10.5 -49t-26.5 -43q-22 -15 -49 -10t-42 27t-10 49t27 43t48.5 11t41.5 -28z" />
    <glyph glyph-name="uniF2E1" unicode="&#xf2e1;" horiz-adv-x="1792" 
 />
    <glyph glyph-name="uniF2E2" unicode="&#xf2e2;" horiz-adv-x="1792" 
 />
    <glyph glyph-name="uniF2E3" unicode="&#xf2e3;" horiz-adv-x="1792" 
 />
    <glyph glyph-name="uniF2E4" unicode="&#xf2e4;" horiz-adv-x="1792" 
 />
    <glyph glyph-name="uniF2E5" unicode="&#xf2e5;" horiz-adv-x="1792" 
 />
    <glyph glyph-name="uniF2E6" unicode="&#xf2e6;" horiz-adv-x="1792" 
 />
    <glyph glyph-name="uniF2E7" unicode="&#xf2e7;" horiz-adv-x="1792" 
 />
    <glyph glyph-name="_698" unicode="&#xf2e8;" horiz-adv-x="1792" 
 />
    <glyph glyph-name="uniF2E9" unicode="&#xf2e9;" horiz-adv-x="1792" 
 />
    <glyph glyph-name="uniF2EA" unicode="&#xf2ea;" horiz-adv-x="1792" 
 />
    <glyph glyph-name="uniF2EB" unicode="&#xf2eb;" horiz-adv-x="1792" 
 />
    <glyph glyph-name="uniF2EC" unicode="&#xf2ec;" horiz-adv-x="1792" 
 />
    <glyph glyph-name="uniF2ED" unicode="&#xf2ed;" horiz-adv-x="1792" 
 />
    <glyph glyph-name="uniF2EE" unicode="&#xf2ee;" horiz-adv-x="1792" 
 />
    <glyph glyph-name="lessequal" unicode="&#xf500;" horiz-adv-x="1792" 
 />
  </font>
</defs></svg>

Added gc_lang/fr/webext/3rd/font-awesome-4.7.0/fonts/fontawesome-webfont.ttf version [a41e9cfa3c].

cannot compute difference between binary files

Added gc_lang/fr/webext/3rd/font-awesome-4.7.0/fonts/fontawesome-webfont.woff version [5fd8f23479].

cannot compute difference between binary files

Added gc_lang/fr/webext/3rd/font-awesome-4.7.0/fonts/fontawesome-webfont.woff2 version [e3b5a34362].

cannot compute difference between binary files

Added gc_lang/fr/webext/README.md version [efab56acd9].













































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Grammalecte

**French Grammar Checker**

écrit en JavaScript ES6/ES7
par Olivier R.

## Fonctionnalités ##

* correcteur grammatical
* conjugueur
* formateur de texte
* lexicographe

## Site web ##

https://grammalecte.net

## Licence ##

GNU GPL 3.0+
http://www.gnu.org/copyleft/gpl.html

Added gc_lang/fr/webext/_locales/en/messages.json version [488f9fc94b].























>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
{
  "extensionName": {
    "message": "Grammalecte [fr]",
    "description": "Name of the extension."
  },

  "extensionDescription": {
    "message": "French grammar checker",
    "description": "Description of the extension."
  }
}

Added gc_lang/fr/webext/_locales/fr/messages.json version [afca95eb97].























>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
{
  "extensionName": {
    "message": "Grammalecte [fr]",
    "description": "Nom de l’extension."
  },

  "extensionDescription": {
    "message": "Correcteur grammatical dédié à la langue française",
    "description": "Description de l’extension."
  }
}

Added gc_lang/fr/webext/background.js version [1909d2976b].























































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
// Background 

"use strict";


function showError (e) {
    console.error(e.fileName + "\n" + e.name + "\nline: " + e.lineNumber + "\n" + e.message);
}


/*
    Worker (separate thread to avoid freezing Firefox)
*/
let xGCEWorker = new Worker("gce_worker.js");

xGCEWorker.onmessage = function (e) {
    // https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent
    try {
        let {sActionDone, result, dInfo} = e.data;
        switch (sActionDone) {
            case "init":
                browser.storage.local.set({"gc_options": result});
                break;
            case "parse":
            case "parseAndSpellcheck":
            case "parseAndSpellcheck1":
            case "getListOfTokens":
                // send result to content script
                if (typeof(dInfo.iReturnPort) === "number") {
                    let xPort = dConnx.get(dInfo.iReturnPort);
                    xPort.postMessage(e.data);
                } else {
                    console.log("[background] don’t know where to send results");
                    console.log(e.data);
                }
                break;
            case "textToTest":
            case "fullTests":
                // send result to panel
                browser.runtime.sendMessage(e.data);
                break;
            case "getOptions":
            case "getDefaultOptions":
            case "resetOptions":
                // send result to panel
                browser.runtime.sendMessage(e.data);
                browser.storage.local.set({"gc_options": result});
                break;
            case "setOptions":
            case "setOption":
                browser.storage.local.set({"gc_options": result});
                break;
            default:
                console.log("[background] Unknown command: " + sActionDone);
                console.log(e.data);
        }
    }
    catch (e) {
        showError(e);
    }
};


function init () {
    let xPromise = browser.storage.local.get("gc_options");
    xPromise.then(
        function (dSavedOptions) {
            let dOptions = (dSavedOptions.hasOwnProperty("gc_options")) ? dSavedOptions.gc_options : null;
            xGCEWorker.postMessage({
                sCommand: "init",
                dParam: {sExtensionPath: browser.extension.getURL("."), dOptions: dOptions, sContext: "Firefox"},
                dInfo: {}
            });
        },
        function (e) {
            showError(e);
            xGCEWorker.postMessage({
                sCommand: "init",
                dParam: {sExtensionPath: browser.extension.getURL("."), dOptions: null, sContext: "Firefox"},
                dInfo: {}
            });
        }
    );
}

init();


/*
    Ports from content-scripts
*/

let dConnx = new Map();


/*
    Messages from the extension (not the Worker)
*/
function handleMessage (oRequest, xSender, sendResponse) {
    //console.log(xSender);
    let {sCommand, dParam, dInfo} = oRequest;
    switch (sCommand) {
        case "getOptions":
        case "getDefaultOptions":
        case "setOptions":
        case "setOption":
        case "resetOptions":
        case "textToTest":
        case "fullTests":
            xGCEWorker.postMessage(oRequest);
            break;
        case "openURL":
            browser.tabs.create({url: dParam.sURL});
            break;
        default:
            console.log("[background] Unknown command: " + sCommand);
            console.log(oRequest);
    }
    //sendResponse({response: "response from background script"});
}

browser.runtime.onMessage.addListener(handleMessage);


function handleConnexion (xPort) {
    let iPortId = xPort.sender.tab.id; // identifier for the port: each port can be found at dConnx[iPortId]
    dConnx.set(iPortId, xPort);
    xPort.onMessage.addListener(function (oRequest) {
        let {sCommand, dParam, dInfo} = oRequest;
        switch (sCommand) {
            case "parse":
            case "parseAndSpellcheck":
            case "parseAndSpellcheck1":
            case "getListOfTokens":
                oRequest.dInfo.iReturnPort = iPortId; // we pass the id of the return port to receive answer
                xGCEWorker.postMessage(oRequest);
                break;
            case "openURL":
                browser.tabs.create({url: dParam.sURL});
                break;
            case "openConjugueurTab":
                openConjugueurTab();
                break;
            case "openConjugueurWindow":
                openConjugueurWindow();
                break;
            default:
                console.log("[background] Unknown command: " + sCommand);
                console.log(oRequest);
        }
    });
    //xPort.postMessage({sActionDone: "newId", result: iPortId});
}

browser.runtime.onConnect.addListener(handleConnexion);


/*
    Context Menu
*/
browser.contextMenus.create({
    id: "getListOfTokens",
    title: "Analyser",
    contexts: ["selection"]
});

browser.contextMenus.create({
    id: "parseAndSpellcheck",
    title: "Corriger",
    contexts: ["selection"]
});

browser.contextMenus.create({
    id: "whatever",
    type: "separator",
    contexts: ["selection"]
});

browser.contextMenus.create({
    id: "conjugueur_window",
    title: "Conjugueur [fenêtre]",
    contexts: ["all"]
});

browser.contextMenus.create({
    id: "conjugueur_tab",
    title: "Conjugueur [onglet]",
    contexts: ["all"]
});


browser.contextMenus.onClicked.addListener(function (xInfo, xTab) {
    // xInfo = https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/contextMenus/OnClickData
    // xTab = https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/Tab
    // confusing: no way to get the node where we click?!
    switch (xInfo.menuItemId) {
        case "parseAndSpellcheck":
            parseAndSpellcheckSelectedText(xTab.id, xInfo.selectionText);
            break;
        case "getListOfTokens": 
            getListOfTokensFromSelectedText(xTab.id, xInfo.selectionText);
            break;
        case "conjugueur_window":
            openConjugueurWindow();
            break;
        case "conjugueur_tab":
            openConjugueurTab();
            break;
        default:
            console.log("[Background] Unknown menu id: " + xInfo.menuItemId);
            console.log(xInfo);
            console.log(xTab);
    }    
});


/*
    Keyboard shortcuts
*/
browser.commands.onCommand.addListener(function (sCommand) {
    switch (sCommand) {
        case "conjugueur_tab":
            openConjugueurTab();
            break;
        case "conjugueur_window":
            openConjugueurWindow();
            break;
    }
});


/*
    Actions
*/
function parseAndSpellcheckSelectedText (iTab, sText) {
    // send message to the tab
    let xTabPort = dConnx.get(iTab);
    xTabPort.postMessage({sActionDone: "openGCPanel", result: null, dInfo: null, bEnd: false, bError: false});
    // send command to the worker
    xGCEWorker.postMessage({
        sCommand: "parseAndSpellcheck",
        dParam: {sText: sText, sCountry: "FR", bDebug: false, bContext: false},
        dInfo: {iReturnPort: iTab}
    });
}

function getListOfTokensFromSelectedText (iTab, sText) {
    // send message to the tab
    let xTabPort = dConnx.get(iTab);
    xTabPort.postMessage({sActionDone: "openLxgPanel", result: null, dInfo: null, bEnd: false, bError: false});
    // send command to the worker
    xGCEWorker.postMessage({
        sCommand: "getListOfTokens",
        dParam: {sText: sText},
        dInfo: {iReturnPort: iTab}
    });
}

function openConjugueurTab () {
    let xConjTab = browser.tabs.create({
        url: browser.extension.getURL("panel/conjugueur.html")
    });
    xConjTab.then(onCreated, onError);
}

function openConjugueurWindow () {
    let xConjWindow = browser.windows.create({
        url: browser.extension.getURL("panel/conjugueur.html"),
        type: "detached_panel",
        width: 710,
        height: 980
    });
    xConjWindow.then(onCreated, onError);
}


function onCreated (xWindowInfo) {
    //console.log(`Created window: ${xWindowInfo.id}`);
}

function onError (error) {
    console.log(`Error: ${error}`);
}

Added gc_lang/fr/webext/content_scripts/init.js version [ccdc2aeb0d].



















































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
// Modify page

/*
    JS sucks (again, and again, and again, and again…)
    Not possible to load content from within the extension:
    https://bugzilla.mozilla.org/show_bug.cgi?id=1267027
    No SharedWorker, no images allowed for now…
*/

"use strict";


function showError (e) {
    console.error(e.fileName + "\n" + e.name + "\nline: " + e.lineNumber + "\n" + e.message);
}

function createNode (sType, oAttr, oDataset=null) {
    try {
        let xNode = document.createElement(sType);
        Object.assign(xNode, oAttr);
        if (oDataset) {
            Object.assign(xNode.dataset, oDataset);
        }
        return xNode;
    }
    catch (e) {
        showError(e);
    }
}

/*
function loadImage (sContainerClass, sImagePath) {
    let xRequest = new XMLHttpRequest();
    xRequest.open('GET', browser.extension.getURL("")+sImagePath, false);
    xRequest.responseType = "arraybuffer";
    xRequest.send();
    let blobTxt = new Blob([xRequest.response], {type: 'image/png'});
    let img = document.createElement('img');
    img.src = (URL || webkitURL).createObjectURL(blobTxt); // webkitURL is obsolete: https://bugs.webkit.org/show_bug.cgi?id=167518
    Array.filter(document.getElementsByClassName(sContainerClass), function (oElem) {
        oElem.appendChild(img);
    });
}
*/

const oGrammalecte = {

    nMenu: 0,
    lMenu: [],

    oTFPanel: null,
    oLxgPanel: null,
    oGCPanel: null,

    createMenus: function () {
        let lNode = document.getElementsByTagName("textarea");
        for (let xNode of lNode) {
            this.lMenu.push(new GrammalecteMenu(this.nMenu, xNode));
            this.nMenu += 1;
        }
    },

    createTFPanel: function () {
        if (this.oTFPanel === null) {
            this.oTFPanel = new GrammalecteTextFormatter("grammalecte_tf_panel", "Formateur de texte", 800, 620, false);
            //this.oTFPanel.logInnerHTML();
            this.oTFPanel.insertIntoPage();
            this.oTFPanel.adjustHeight();
        }
    },

    createLxgPanel: function () {
        if (this.oLxgPanel === null) {
            this.oLxgPanel = new GrammalecteLexicographer("grammalecte_lxg_panel", "Lexicographe", 500, 700);
            this.oLxgPanel.insertIntoPage();
        }
    },

    createGCPanel: function () {
        if (this.oGCPanel === null) {
            this.oGCPanel = new GrammalecteGrammarChecker("grammalecte_gc_panel", "Grammalecte", 500, 700);
            this.oGCPanel.insertIntoPage();
        }
    }
}


/*
    Connexion to the background
*/
let xGrammalectePort = browser.runtime.connect({name: "content-script port"});

xGrammalectePort.onMessage.addListener(function (oMessage) {
    let {sActionDone, result, dInfo, bEnd, bError} = oMessage;
    switch (sActionDone) {
        case "parseAndSpellcheck":
            if (!bEnd) {
                oGrammalecte.oGCPanel.addParagraphResult(result);
            } else {
                oGrammalecte.oGCPanel.stopWaitIcon();
            }
            break;
        case "parseAndSpellcheck1":
            oGrammalecte.oGCPanel.refreshParagraph(dInfo.sParagraphId, result);
            break;
        case "getListOfTokens":
            if (!bEnd) {
                oGrammalecte.oLxgPanel.addListOfTokens(result);
            } else {
                oGrammalecte.oLxgPanel.stopWaitIcon();
            }
            break;
        // Design WTF: context menus are made in background, not in content-script.
        // Commands from context menu received here to initialize panels
        case "openGCPanel":
            oGrammalecte.createGCPanel();
            oGrammalecte.oGCPanel.clear();
            oGrammalecte.oGCPanel.show();
            oGrammalecte.oGCPanel.start();
            oGrammalecte.oGCPanel.startWaitIcon();
            break;
        case "openLxgPanel":
            oGrammalecte.createLxgPanel();
            oGrammalecte.oLxgPanel.clear();
            oGrammalecte.oLxgPanel.show();
            oGrammalecte.oLxgPanel.startWaitIcon();
            break;
        default:
            console.log("[Content script] Unknown command: " + sActionDone);
    }
});


/*
    Start
*/
oGrammalecte.createMenus();

Added gc_lang/fr/webext/content_scripts/menu.css version [d0d5a23134].



























































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/*
    CSS
    Menu for Grammalecte
*/

.grammalecte_menu_main_button {
    position: absolute;
    margin: -10px 0 0 -10px;
    width: 12px;
    height: 12px;
    background-color: hsla(210, 80%, 80%, .5);
    border: 4px solid hsla(210, 80%, 60%, .5);
    border-top: 4px solid hsla(210, 100%, 40%, .7);
    border-bottom: 4px solid hsla(210, 100%, 40%, .7);
    border-radius: 50%;
    text-align: center;
    cursor: pointer;
    z-index: 2147483640; /* maximum is 2147483647: https://stackoverflow.com/questions/491052/minimum-and-maximum-value-of-z-index */
    animation: grammalecte-spin 4s ease infinite;
}
.grammalecte_menu_main_button:hover {
    border: 4px solid hsla(210, 80%, 35%, .5);
    background-color: hsla(210, 80%, 55%, .5);
    box-shadow: 0 0 10px hsla(210, 100%, 30%, .5);
    animation: grammalecte-spin 1s linear infinite;
}

@keyframes grammalecte-spin {
    0% {
        transform: rotate(0deg);
        border-top: 4px solid hsla(210, 100%, 40%, .7);
        border-bottom: 4px solid hsla(210, 100%, 40%, .7);
    }
    50% {
        transform: rotate(180deg);
        border-top: 4px solid hsla(0, 100%, 40%, .7);
        border-bottom: 4px solid hsla(0, 100%, 40%, .7);
    }
    100% {
        transform: rotate(360deg);
        border-top: 4px solid hsla(210, 100%, 40%, .7);
        border-bottom: 4px solid hsla(210, 100%, 40%, .7);
    }
}

.grammalecte_menu {
    display: none;
    position: absolute;
    margin-left: -10px;
    border-radius: 5px;
    border: 3px solid hsl(210, 50%, 30%);
    box-shadow: 0px 0px 2px hsla(210, 10%, 10%, .5);
    background-color: hsl(210, 50%, 30%);
    font-family: "Trebuchet MS", "Fira Sans", "Liberation Sans", sans-serif;
    z-index: 2147483640; /* maximum is 2147483647: https://stackoverflow.com/questions/491052/minimum-and-maximum-value-of-z-index */
}

.grammalecte_menu_item {
    padding: 3px 10px;
    background-color: hsl(210, 50%, 40%);
    font-size: 14px;
    color: hsl(210, 50%, 92%);
    cursor: pointer;
}
.grammalecte_menu_item:hover {
    background-color: hsl(210, 50%, 45%);
    color: hsl(210, 50%, 100%);
}

.grammalecte_menu_item_block {
    padding: 3px 10px;
    background-color: hsl(210, 50%, 40%);
    font-size: 14px;
    color: hsl(210, 50%, 92%);
    border-top: 1px solid hsl(210, 50%, 30%);
    border-radius: 0 0 3px 3px;
}

.grammalecte_menu_button {
    display: inline-block;
    padding: 0 5px;
    margin-left: 10px;
    border-radius: 2px;
    background-color: hsl(210, 50%, 45%);
    font-size: 12px;
    line-height: 1.6;
    text-align: center;
    cursor: pointer;
}
.grammalecte_menu_button:hover {
    background-color: hsl(210, 50%, 50%);
}

.grammalecte_menu_header {
    padding: 2px 10px;
    background-color: hsl(210, 50%, 30%);
    background-image:  url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAC8UlEQVQ4jX3TbUgTcRwH8P89ddu5u9tt082aZmpFEU4tFz0QGTUwCi0heniR9MSUIKRaD0RvIlKigsooo+iNFa0XJYuwIjEK19OcDtPElsG0ktyp591t7u7+vUh7MPX3+vf5/n8/+P0BmKJIPUUVlh2rdVVeesWlzEybqg+bFOsoylnqPmNavGFfknV2Omu2Lvja3vxAURKJib3opHizu8riLK6gjRyuKgmoSoMRFENRUqfXTzvBGK62LC2uoFkOl4RhjQ8+qWt7dPNE3sbdp+2LXbsGe9qb4rIo/BfwFy6nWQ4ThWGNDzbcfu29dMDh2nHU7CypYNLmzTda0/L5cNuzmDQi/A4Y27k6eQxLI79wS/11D0AAMNvs6XT6ojVJjJEgTbMy2BT77xBMp09KcpaWV1uc41jQoi0NdUHfjeOO9WWn7AVF7s7n986SithPJGeupBh2PCSP/xxqxAp3eq6wuUV7Wc6MSZIEhA8vHjbfOe/OcW3zmAuKy+nUzAyD2bow8ODaEROFq8AyZ5WBYdEZXGqGxZ61HJV+9HYCJRbTNA0QBA40HWunaKN5dKg/DBKxeCIe09Th/m4MJwiMSZmLEzMQAABQRuNqgu8NYX3doTcMpvCkLbtQZ2AJkrPOZG1zlnY13T+Hy9EehY90h57eqcorcZ/lctZuMzAsOjLEqwNv66/6vZcPYRBC+C3cGaBxhSet2av1BpYgTTY7k5y2JPT41slIR6Axv8R9nnOs+4Pf+2r992uOxGVJwgAAAEINfgt3BGgsESWtWas1iGDyl+CT/u7WpvxNFRc4x7qtBoZFhSFejb7z1fq9NYfjsiT+cwcQavBruCOgU4SIGo18amuoq3Js3FNlynVtH385+s53ze+t8cRkURx3yMTTRBAEQVAUXbFlf3XystJKA2NExeFBdWASDAAA+MQACCEEmqbJ0b6PMC7JwhDU8YFHV5u9NZ64LErT/oW/63tPV6uJwmKoOND78u7Fg5NhAAD4CVbzY9cwrWQrAAAAAElFTkSuQmCC');
    background-repeat: no-repeat;
    background-position: 10% 50%;
    font-size: 16px;
    font-family: "Trebuchet MS", "Fira Sans", "Liberation Sans", sans-serif;
    color: hsl(210, 50%, 90%);
    text-shadow: 0px 0px 2px hsla(210, 10%, 10%, .9);
    text-align: center;
}
.grammalecte_menu_footer {
    padding: 2px 10px;
    background-color: hsl(210, 50%, 30%);
}

Added gc_lang/fr/webext/content_scripts/menu.js version [89ff587940].





























































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// JavaScript

"use strict";


class GrammalecteMenu {

    constructor (nMenu, xTextArea) {
        this.sMenuId = "grammalecte_menu" + nMenu;
        let xButton = createNode("div", {className: "grammalecte_menu_main_button", textContent: " "});
        xButton.onclick = () => { this.switchMenu(); };
        let xMenu = this._createMenu(xTextArea);
        this._insertAfter(xButton, xTextArea);
        this._insertAfter(xMenu, xTextArea);
    }

    _insertAfter (xNewNode, xReferenceNode) {
        xReferenceNode.parentNode.insertBefore(xNewNode, xReferenceNode.nextSibling);
    }

    _createMenu (xTextArea) {
        try {
            let xMenu = createNode("div", {id: this.sMenuId, className: "grammalecte_menu"});
            // Text formatter
            let xTFButton = createNode("div", {className: "grammalecte_menu_item", textContent: "Formateur de texte"});
            xTFButton.onclick = () => {
            	this.switchMenu();
                oGrammalecte.createTFPanel();
                oGrammalecte.oTFPanel.start(xTextArea);
                oGrammalecte.oTFPanel.show();
            };
            // lexicographe
            let xLxgButton = createNode("div", {className: "grammalecte_menu_item", textContent: "Lexicographe"});
            xLxgButton.onclick = () => {
            	this.switchMenu();
                oGrammalecte.createLxgPanel();
                oGrammalecte.oLxgPanel.clear();
                oGrammalecte.oLxgPanel.show();
                oGrammalecte.oLxgPanel.startWaitIcon();
                xGrammalectePort.postMessage({
                    sCommand: "getListOfTokens",
                    dParam: {sText: xTextArea.value},
                    dInfo: {sTextAreaId: xTextArea.id}
                });
            };
            // Grammar checker
            let xGCButton = createNode("div", {className: "grammalecte_menu_item", textContent: "Correction grammaticale"});
            xGCButton.onclick = () => {
            	this.switchMenu();
                oGrammalecte.createGCPanel();
                oGrammalecte.oGCPanel.start(xTextArea);
                oGrammalecte.oGCPanel.show();
                oGrammalecte.oGCPanel.startWaitIcon();
                xGrammalectePort.postMessage({
                    sCommand: "parseAndSpellcheck",
                    dParam: {sText: xTextArea.value, sCountry: "FR", bDebug: false, bContext: false},
                    dInfo: {sTextAreaId: xTextArea.id}
                });
            };
            // Conjugation tool
            let xConjButton = createNode("div", {className: "grammalecte_menu_item_block", textContent: "Conjugueur"});
            let xConjButtonTab = createNode("div", {className: "grammalecte_menu_button", textContent: "Onglet"});
            xConjButtonTab.onclick = () => {
            	this.switchMenu();
            	xGrammalectePort.postMessage({sCommand: "openConjugueurTab", dParam: null, dInfo: null});
            };
            let xConjButtonWin = createNode("div", {className: "grammalecte_menu_button", textContent: "Fenêtre"});
            xConjButtonWin.onclick = () => {
            	this.switchMenu();
            	xGrammalectePort.postMessage({sCommand: "openConjugueurWindow", dParam: null, dInfo: null});
            };
            xConjButton.appendChild(xConjButtonTab);
            xConjButton.appendChild(xConjButtonWin);
            // Create
            xMenu.appendChild(createNode("div", {className: "grammalecte_menu_header", textContent: "GRAMMALECTE"}));
            xMenu.appendChild(xTFButton);
            xMenu.appendChild(xLxgButton);
            xMenu.appendChild(xGCButton);
            xMenu.appendChild(xConjButton);
            //xMenu.appendChild(createNode("img", {scr: browser.extension.getURL("img/logo-16.png")}));
            // can’t work, due to content-script policy: https://bugzilla.mozilla.org/show_bug.cgi?id=1267027
            xMenu.appendChild(createNode("div", {className: "grammalecte_menu_footer"}));
            return xMenu;
        }
        catch (e) {
            showError(e);
        }
    }

    switchMenu () {
    	let xMenu = document.getElementById(this.sMenuId);
        xMenu.style.display = (xMenu.style.display == "block") ? "none" : "block";
    }
}

Added gc_lang/fr/webext/content_scripts/panel.css version [42670977b4].











































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/*
    CSS
    Content panels for Grammalecte
*/

.grammalecte_panel {
    padding: 0;
    margin: 0;
    position: fixed;
    box-sizing: content-box;
    z-index: 2147483641; /* maximum is 2147483647: https://stackoverflow.com/questions/491052/minimum-and-maximum-value-of-z-index */
    border: 2px solid hsl(210, 10%, 50%);
    border-radius: 10px 10px 10px 10px;
    background-color: hsl(210, 0%, 100%);
    color: hsl(0, 0%, 0%);
    font-family: "Trebuchet MS", "Fira Sans", "Liberation Sans", sans-serif;
    box-shadow: 0 0 2px 1px hsla(210, 50%, 50%, .5);
    line-height: normal;
    text-shadow: none;
    text-decoration: none;
}
.grammalecte_panel img {
    display: inline-block;
    margin: 0;
    padding: 0;
}

.grammalecte_panel_bar {
    position: sticky;
    width: 100%;
    background-color: hsl(210, 0%, 90%);
    border-radius: 10px 10px 0 0;
    border-bottom: 1px solid hsl(210, 10%, 80%);
    color: hsl(210, 10%, 4%);
    font-size: 20px;
}
.grammalecte_panel_title {
    padding: 10px 20px;
}
.grammalecte_panel_label {
    display: inline-block;
    padding: 0 10px;
}

.grammalecte_panel_commands {
    float: right;
}
.grammalecte_copy_button {
    display: inline-block;
    padding: 2px 10px;
    background-color: hsl(150, 80%, 30%);
    border-radius: 0 0 0 3px;
    font-size: 22px;
    font-weight: bold;
    color: hsl(150, 0%, 100%);
    text-align: center;
    cursor: pointer;
}
.grammalecte_copy_button:hover {
    background-color: hsl(150, 100%, 40%);
}
.grammalecte_move_button {
    display: inline-block;
    padding: 2px 5px;
    background-color: hsl(180, 80%, 50%);
    font-size: 22px;
    font-weight: bold;
    color: hsl(180, 0%, 100%);
    text-align: center;
    cursor: pointer;
}
.grammalecte_move_button:hover {
    background-color: hsl(180, 100%, 60%);
}
.grammalecte_close_button {
    display: inline-block;
    padding: 2px 10px;
    border-radius: 0 8px 0 0;
    background-color: hsl(0, 80%, 50%);
    font-size: 22px;
    font-weight: bold;
    color: hsl(210, 0%, 100%);
    text-align: center;
    cursor: pointer;
}
.grammalecte_close_button:hover {
    background-color: hsl(0, 100%, 60%);
}

.grammalecte_panel_content {
    position: absolute;
    min-width: 100%;
    height: calc(100% - 55px); /* panel height - title_bar */
    overflow: auto;
}


/*
    CSS Spinner
    Double bounce
    http://tobiasahlin.com/spinkit/
*/
.grammalecte_spinner {
    visibility: hidden;
    width: 40px;
    height: 40px;
    position: absolute;
    top: 2px;
    right: 180px;
}
.grammalecte_spinner .bounce1,
.grammalecte_spinner .bounce2 {
    width: 100%;
    height: 100%;
    border-radius: 50%;
    background-color: hsl(0, 50%, 75%);
    opacity: 0.6;
    position: absolute;
    top: 0;
    left: 0;
    animation: grammalecte-sk-bounce 2.0s infinite ease-in-out;
}
.grammalecte_spinner .bounce2 {
    animation-delay: -1.0s;
}

@keyframes grammalecte-sk-bounce {
    0%, 100% { 
        transform: scale(0.0);
    } 50% { 
        transform: scale(1.0);
    }
}

Added gc_lang/fr/webext/content_scripts/panel.js version [48d95d0550].

















































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
// JavaScript
// Panel creator

"use strict";


class GrammalectePanel {

    constructor (sId, sTitle, nWidth, nHeight, bFlexible=true) {
        this.sId = sId;
        this.nWidth = nWidth;
        this.nHeight = nHeight;
        this.bFlexible = bFlexible;
        this.xPanelBar = createNode("div", {className: "grammalecte_panel_bar"});
        this.xPanelContent = createNode("div", {className: "grammalecte_panel_content"});
        this.xWaitIcon = this._createWaitIcon();
        this.xPanel = this._createPanel(sTitle);
        this.center();
    }

    _createPanel (sTitle) {
        try {
            let xPanel = createNode("div", {id: this.sId, className: "grammalecte_panel"});
            this.xPanelBar.appendChild(this._createButtons());
            let xTitle = createNode("div", {className: "grammalecte_panel_title"});
            xTitle.appendChild(this._createLogo());
            xTitle.appendChild(createNode("div", {className: "grammalecte_panel_label", textContent: sTitle}));
            this.xPanelBar.appendChild(xTitle);
            xPanel.appendChild(this.xPanelBar);
            xPanel.appendChild(this.xPanelContent);
            return xPanel;
        }
        catch (e) {
            showError(e);
        }
    }

    _createLogo () {
        let xImg = document.createElement("img");
        xImg.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAC8UlEQVQ4jX3TbUgTcRwH8P89ddu5u9tt082aZmpFEU4tFz0QGTUwCi0heniR9MSUIKRaD0RvIlKigsooo+iNFa0XJYuwIjEK19OcDtPElsG0ktyp591t7u7+vUh7MPX3+vf5/n8/+P0BmKJIPUUVlh2rdVVeesWlzEybqg+bFOsoylnqPmNavGFfknV2Omu2Lvja3vxAURKJib3opHizu8riLK6gjRyuKgmoSoMRFENRUqfXTzvBGK62LC2uoFkOl4RhjQ8+qWt7dPNE3sbdp+2LXbsGe9qb4rIo/BfwFy6nWQ4ThWGNDzbcfu29dMDh2nHU7CypYNLmzTda0/L5cNuzmDQi/A4Y27k6eQxLI79wS/11D0AAMNvs6XT6ojVJjJEgTbMy2BT77xBMp09KcpaWV1uc41jQoi0NdUHfjeOO9WWn7AVF7s7n986SithPJGeupBh2PCSP/xxqxAp3eq6wuUV7Wc6MSZIEhA8vHjbfOe/OcW3zmAuKy+nUzAyD2bow8ODaEROFq8AyZ5WBYdEZXGqGxZ61HJV+9HYCJRbTNA0QBA40HWunaKN5dKg/DBKxeCIe09Th/m4MJwiMSZmLEzMQAABQRuNqgu8NYX3doTcMpvCkLbtQZ2AJkrPOZG1zlnY13T+Hy9EehY90h57eqcorcZ/lctZuMzAsOjLEqwNv66/6vZcPYRBC+C3cGaBxhSet2av1BpYgTTY7k5y2JPT41slIR6Axv8R9nnOs+4Pf+2r992uOxGVJwgAAAEINfgt3BGgsESWtWas1iGDyl+CT/u7WpvxNFRc4x7qtBoZFhSFejb7z1fq9NYfjsiT+cwcQavBruCOgU4SIGo18amuoq3Js3FNlynVtH385+s53ze+t8cRkURx3yMTTRBAEQVAUXbFlf3XystJKA2NExeFBdWASDAAA+MQACCEEmqbJ0b6PMC7JwhDU8YFHV5u9NZ64LErT/oW/63tPV6uJwmKoOND78u7Fg5NhAAD4CVbzY9cwrWQrAAAAAElFTkSuQmCC";
        return xImg;
    }

    _createButtons () {
        let xButtonLine = createNode("div", {className: "grammalecte_panel_commands"});
        xButtonLine.appendChild(this.xWaitIcon);
        if (this.sId === "grammalecte_gc_panel") {
            xButtonLine.appendChild(this._createCopyButton());
        }
        xButtonLine.appendChild(this._createMoveButton("stickToTop", "¯", "Coller en haut"));
        xButtonLine.appendChild(this._createMoveButton("stickToLeft", "«", "Coller à gauche"));
        xButtonLine.appendChild(this._createMoveButton("center", "•", "Centrer"));
        xButtonLine.appendChild(this._createMoveButton("stickToRight", "»", "Coller à droite"));
        xButtonLine.appendChild(this._createMoveButton("stickToBottom", "_", "Coller en bas"));
        xButtonLine.appendChild(this._createCloseButton());
        return xButtonLine;
    }

    _createWaitIcon () {
        let xWaitIcon = createNode("div", {className: "grammalecte_spinner"});
        xWaitIcon.appendChild(createNode("div", {className: "bounce1"}));
        xWaitIcon.appendChild(createNode("div", {className: "bounce2"}));
        return xWaitIcon;
    }

    _createCopyButton () {
        let xButton = createNode("div", {id: "grammalecte_clipboard_button", className: "grammalecte_copy_button", textContent: "∑", title: "Copier dans le presse-papiers"});
        xButton.onclick = function () { this.copyTextToClipboard(); }.bind(this);
        return xButton;
    }

    _createMoveButton (sAction, sLabel, sTitle) {
        let xButton = createNode("div", {className: "grammalecte_move_button", textContent: sLabel, title: sTitle});
        xButton.onclick = function () { this[sAction](); }.bind(this);
        return xButton;
    }

    _createCloseButton () {
        let xButton = createNode("div", {className: "grammalecte_close_button", textContent: "×", title: "Fermer la fenêtre"});
        xButton.onclick = function () { this.hide(); }.bind(this);  // better than writing “let that = this;” before the function?
        return xButton;
    }

    insertIntoPage () {
        document.body.appendChild(this.xPanel);
    }

    show () {
        this.xPanel.style.display = "block";
    }

    hide () {
        this.xPanel.style.display = "none";
    }

    center () {
        let nHeight = (this.bFlexible) ? window.innerHeight-100 : this.nHeight;
        this.xPanel.style = `top: 50%; left: 50%; width: ${this.nWidth}px; height: ${nHeight}px; margin-top: -${nHeight/2}px; margin-left: -${this.nWidth/2}px;`;
    }

    stickToLeft () {
        let nHeight = (this.bFlexible) ? window.innerHeight-100 : this.nHeight;
        this.xPanel.style = `top: 50%; left: -2px; width: ${this.nWidth}px; height: ${nHeight}px; margin-top: -${nHeight/2}px;`;
    }

    stickToRight () {
        let nHeight = (this.bFlexible) ? window.innerHeight-100 : this.nHeight;
        this.xPanel.style = `top: 50%; right: -2px; width: ${this.nWidth}px; height: ${nHeight}px; margin-top: -${nHeight/2}px;`;
    }

    stickToTop () {
        let nWidth = (this.bFlexible) ? Math.floor(window.innerWidth/2) : this.nWidth;
        let nHeight = (this.bFlexible) ? Math.floor(window.innerHeight*0.45) : this.nHeight;
        this.xPanel.style = `top: -2px; left: 50%; width: ${nWidth}px; height: ${nHeight}px; margin-left: -${nWidth/2}px;`;
    }

    stickToBottom () {
        let nWidth = (this.bFlexible) ? Math.floor(window.innerWidth/2) : this.nWidth;
        let nHeight = (this.bFlexible) ? Math.floor(window.innerHeight*0.45) : this.nHeight;
        this.xPanel.style = `bottom: -2px; left: 50%; width: ${nWidth}px; height: ${nHeight}px; margin-left: -${nWidth/2}px;`;
    }

    reduce () {
        // todo
    }

    adjustHeight () {
        this.xPanelContent.style.height = this.xPanelContent.firstChild.offsetHeight + "px"; // xPanelContent has only one child
        this.xPanel.style.height = this.xPanelBar.offsetHeight + this.xPanelContent.offsetHeight + 10 + "px";
    }

    logInnerHTML () {
        // for debugging
        console.log(this.xPanel.innerHTML);
    }
    
    startWaitIcon () {
        this.xWaitIcon.style.visibility = "visible";
    }

    stopWaitIcon () {
        this.xWaitIcon.style.visibility = "hidden";
    }

    openURL (sURL) {
        xGrammalectePort.postMessage({
            sCommand: "openURL",
            dParam: {"sURL": sURL},
            dInfo: {}
        });
    }
}

Added gc_lang/fr/webext/content_scripts/panel_gc.css version [9ed7b56be3].































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
/*
    Grammar checker
*/
#grammalecte_gc_panel_content {
    margin: 0;
    padding: 5px;
}

.grammalecte_paragraph_block {
    margin: 0 0 5px 0;
}

.grammalecte_paragraph {
    margin: 0;
    padding: 10px;
    background-color: hsl(0, 0%, 96%);
    border-radius: 2px;
    font-size: 14px;
    font-family : "Courier New", Courier, "Lucida Sans Typewriter", "Lucida Typewriter", monospace;
    color: hsl(0, 0%, 0%);
}


/*
    Action buttons
*/
.grammalecte_paragraph_actions {
    float: right;
    margin: 0 0 5px 10px;
}

.grammalecte_paragraph_button {
    display: inline-block;
    background-color: hsl(0, 0%, 50%);
    text-align: center;
    margin-left: 2px;
    padding: 1px 4px 3px 4px;
    cursor: pointer;
    font-size: 14px;
    color: hsl(0, 0%, 96%);
    border-radius: 2px;
}
.grammalecte_paragraph_button:hover {
    background-color: hsl(0, 0%, 40%);
    color: hsl(0, 0%, 100%);
}

.grammalecte_paragraph_actions .grammalecte_green {
    background-color: hsl(120, 30%, 50%);
    color: hsl(0, 0%, 96%);
}
.grammalecte_paragraph_actions .grammalecte_green:hover {
    background-color: hsl(120, 50%, 40%);
    color: hsl(0, 0%, 100%);
}
.grammalecte_paragraph_actions .grammalecte_red {
    background-color: hsl(0, 30%, 50%);
    color: hsl(0, 0%, 96%);
}
.grammalecte_paragraph_actions .grammalecte_red:hover {
    background-color: hsl(0, 50%, 40%);
    color: hsl(0, 0%, 100%);
}


/* 
    TOOLTIP
*/
#grammalecte_tooltip_arrow {
    position: absolute;
    display: none;
}

#grammalecte_tooltip {
    position: absolute;
    margin: 0;
    display: none;
    width: 300px;
    border-radius: 5px;
    box-shadow: 0 0 6px hsla(0, 0%, 0%, 0.3);
    font-family: Tahoma, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", sans-serif;
    font-size: 12px;
    line-height: 18px;
    cursor: default;
    text-decoration: none;
    border: 3px solid hsl(210, 50%, 30%);
    color: hsl(210, 10%, 20%);
    z-index: 1000;
}

#grammalecte_tooltip_message_block {
    margin: 0;
    padding: 5px 10px 10px 10px;
    background-color: hsl(210, 50%, 30%);
    color: hsl(210, 50%, 96%);
}
#grammalecte_tooltip_rule_id {
    display: none;
    margin: 0 0 5px 0;
    border: 1px solid hsl(210, 50%, 60%);
    background-color: hsl(210, 50%, 40%);
    padding: 2px 5px;
    border-radius: 2px;
    color: hsla(210, 0%, 96%, 1);
    font-size: 11px;
    font-style: normal;
    text-align: center;
}
#grammalecte_tooltip_message {
    font-size: 15px;
    margin: 0 0 5px 0;
}
#grammalecte_tooltip_ignore {
    display: inline-block;
    padding: 1px 5px;
    background-color: hsl(30, 30%, 40%);
    color: hsla(30, 0%, 96%, 1);
    border-radius: 2px;
    cursor: pointer;
    font-size: 12px;
    text-decoration: none;
}
#grammalecte_tooltip_ignore:hover {
    background-color: hsl(30, 30%, 50%);
    color: hsla(0, 0%, 100%, 1);
    text-shadow: 0 0 3px hsl(30, 30%, 60%);
}
#grammalecte_tooltip_url {
    display: inline-block;
    margin-left: 10px;
    padding: 1px 5px;
    background-color: hsl(210, 50%, 50%);
    color: hsla(210, 0%, 96%, 1);
    border-radius: 2px;
    cursor: pointer;
    font-size: 12px;
    text-decoration: none;
}
#grammalecte_tooltip_url:hover {
    background-color: hsl(210, 50%, 60%);
    color: hsla(0, 0%, 100%, 1);
    text-shadow: 0 0 3px hsl(210, 30%, 60%);
}
#grammalecte_tooltip_sugg_title {
    padding: 0 10px;
    background-color: hsl(210, 10%, 90%);
    color: hsl(210, 50%, 30%);
    font-size: 10px;
    font-weight: bold;
}
#grammalecte_tooltip_sugg_block {
    padding: 10px;
    background-color: hsl(210, 10%, 96%);
    border-radius: 0 0 2px 2px;
    line-height: 20px;
}
.grammalecte_tooltip_sugg {
    display: inline-block;
    padding: 1px 6px;
    background-color: hsl(180, 60%, 40%);
    color: hsl(180, 0%, 96%);
    border-radius: 2px;
    cursor: pointer;
    font-size: 14px;
    text-decoration: none;
}
.grammalecte_tooltip_sugg:hover {
    background-color: hsla(180, 70%, 45%, 1);
    color: hsla(0, 0%, 100%, 1);
}


/*
    ERRORS
*/
.grammalecte_error {
    cursor: pointer;
    border-radius: 2px;
    text-decoration: none;
    text-shadow: unset;
    /* default color */
    background-color: hsl(240, 10%, 50%);
    color: hsl(240, 0%, 96%);
}
.grammalecte_error:hover {
    background-color: hsl(240, 10%, 40%);
    color: hsl(240, 0%, 100%);
}

.grammalecte_error_corrected,
.grammalecte_error_ignored {
    display: inline-block;
    border-radius: 2px;
    text-decoration: none;
    background-color: hsla(120, 50%, 70%, 1);
    color: hsla(0, 0%, 4%, 1);
}
.grammalecte_error_ignored {
    background-color: hsla(30, 20%, 80%, 1);
}


/* elems */
.grammalecte_error_WORD {
    /*border-bottom: 2px solid hsl(0, 10%, 30%);*/
    background-color: hsl(0, 50%, 50%);
    color: hsl(0, 0%, 96%);
    /*text-decoration: underline wavy hsl(0, 50%, 50%);*/
}
.grammalecte_error_WORD:hover {
    background-color: hsl(0, 60%, 40%);
    color: hsl(0, 0%, 100%);
}

/* elems */
.grammalecte_error_typo, 
.grammalecte_error_esp, 
.grammalecte_error_nbsp, 
.grammalecte_error_eif, 
.grammalecte_error_maj, 
.grammalecte_error_virg, 
.grammalecte_error_tu, 
.grammalecte_error_num, 
.grammalecte_error_unit, 
.grammalecte_error_nf, 
.grammalecte_error_liga, 
.grammalecte_error_mapos, 
.grammalecte_error_chim {
    background-color: hsl(30, 70%, 50%);
    color: hsl(30, 10%, 96%);
    /*text-decoration: underline wavy hsl(30, 70%, 50%);*/
}

.grammalecte_error_typo:hover, 
.grammalecte_error_esp:hover, 
.grammalecte_error_nbsp:hover, 
.grammalecte_error_eif:hover, 
.grammalecte_error_maj:hover, 
.grammalecte_error_virg:hover, 
.grammalecte_error_tu:hover, 
.grammalecte_error_num:hover, 
.grammalecte_error_unit:hover, 
.grammalecte_error_nf:hover, 
.grammalecte_error_liga:hover, 
.grammalecte_error_mapos:hover, 
.grammalecte_error_chim:hover {
    background-color: hsl(30, 80%, 45%);
    color: hsl(30, 10%, 96%);
}

/* elems */
.grammalecte_error_apos {
    background-color: hsl(40, 90%, 50%);
    color: hsl(40, 10%, 96%);
    /*text-decoration: underline wavy hsl(40, 70%, 45%);*/
}
.grammalecte_error_apos:hover {
    background-color: hsl(40, 100%, 45%);
    color: hsl(40, 10%, 96%);
}

/* elems */
.grammalecte_error_gn,
.grammalecte_error_sgpl {
    background-color: hsl(210, 50%, 50%);
    color: hsl(210, 10%, 96%);
    /*text-decoration: underline wavy hsl(210, 50%, 50%);*/
}
.grammalecte_error_gn:hover,
.grammalecte_error_sgpl:hover {
    background-color: hsl(210, 60%, 40%);
    color: hsl(210, 10%, 96%);
}

/* elems */
.grammalecte_error_conj, 
.grammalecte_error_infi, 
.grammalecte_error_imp, 
.grammalecte_error_inte, 
.grammalecte_error_ppas, 
.grammalecte_error_vmode  {
    background-color: hsl(300, 30%, 40%);
    color: hsl(300, 10%, 96%);
    /*text-decoration: underline wavy hsl(300, 40%, 40%);*/
}

.grammalecte_error_conj:hover, 
.grammalecte_error_infi:hover, 
.grammalecte_error_imp:hover, 
.grammalecte_error_inte:hover, 
.grammalecte_error_ppas:hover, 
.grammalecte_error_vmode:hover {
    background-color: hsl(300, 40%, 30%);
    color: hsl(300, 10%, 96%);
}

/* elems */
.grammalecte_error_conf, 
.grammalecte_error_ocr {
    background-color: hsl(270, 40%, 30%);
    color: hsl(270, 10%, 96%);
    /*text-decoration: underline wavy hsl(270, 40%, 30%);*/
}

.grammalecte_error_conf:hover, 
.grammalecte_error_ocr:hover {
    background-color: hsl(270, 50%, 20%);
    color: hsl(270, 10%, 96%);
}

/* elems */
.grammalecte_error_bs, 
.grammalecte_error_pleo, 
.grammalecte_error_neg, 
.grammalecte_error_redon1, 
.grammalecte_error_redon2, 
.grammalecte_error_mc, 
.grammalecte_error_date, 
.grammalecte_error_notype {
    background-color: hsl(180, 50%, 40%);
    color: hsl(180, 10%, 96%);
    /*text-decoration: underline wavy hsl(180, 50%, 40%);*/
}

.grammalecte_error_bs:hover, 
.grammalecte_error_pleo:hover, 
.grammalecte_error_neg:hover, 
.grammalecte_error_redon1:hover, 
.grammalecte_error_redon2:hover, 
.grammalecte_error_mc:hover, 
.grammalecte_error_date:hover, 
.grammalecte_error_notype:hover {
    background-color: hsl(180, 60%, 30%);
    color: hsl(180, 10%, 96%);
}

Added gc_lang/fr/webext/content_scripts/panel_gc.js version [bee01322e4].





















































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
// JavaScript

"use strict";

function onGrammalecteGCPanelClick (xEvent) {
    try {
        let xElem = xEvent.target;
        if (xElem.id) {
            if (xElem.id.startsWith("grammalecte_sugg")) {
                oGrammalecte.oGCPanel.applySuggestion(xElem.id);
            } else if (xElem.id === "grammalecte_tooltip_ignore") {
                oGrammalecte.oGCPanel.ignoreError(xElem.id);
            } else if (xElem.id.startsWith("grammalecte_check")) {
                oGrammalecte.oGCPanel.recheckParagraph(parseInt(xElem.dataset.para_num));
            } else if (xElem.id.startsWith("grammalecte_hide")) {
                xElem.parentNode.parentNode.style.display = "none";
            } else if (xElem.id.startsWith("grammalecte_err")
                       && xElem.className !== "grammalecte_error_corrected"
                       && xElem.className !== "grammalecte_error_ignored") {
                oGrammalecte.oGCPanel.oTooltip.show(xElem.id);
            } else if (xElem.id === "grammalecte_tooltip_url") {
                oGrammalecte.oGCPanel.openURL(xElem.dataset.url);
            } else {
                oGrammalecte.oGCPanel.oTooltip.hide();
            }
        } else {
            oGrammalecte.oGCPanel.oTooltip.hide();
        }
    }
    catch (e) {
        showError(e);
    }
}


class GrammalecteGrammarChecker extends GrammalectePanel {
    /*
        KEYS for identifiers:
            grammalecte_paragraph{Id} : [paragraph number]
            grammalecte_check{Id}     : [paragraph number]
            grammalecte_hide{Id}      : [paragraph number]
            grammalecte_error{Id}     : [paragraph number]-[error_number]
            grammalecte_sugg{Id}      : [paragraph number]-[error_number]--[suggestion_number]
    */

    constructor (...args) {
        super(...args);
        this.aIgnoredErrors = new Set();
        this.xContentNode = createNode("div", {id: "grammalecte_gc_panel_content"});
        this.xParagraphList = createNode("div", {id: "grammalecte_paragraph_list"});
        this.xContentNode.appendChild(this.xParagraphList);
        this.xPanelContent.addEventListener("click", onGrammalecteGCPanelClick, false);
        this.oTooltip = new GrammalecteTooltip(this.xContentNode);
        this.xPanelContent.appendChild(this.xContentNode);
        this.oTAC = new GrammalecteTextAreaControl();
    }

    start (xTextArea=null) {
        this.oTooltip.hide();
        this.clear();
        if (xTextArea) {
            this.oTAC.setTextArea(xTextArea);
        }
    }

    clear () {
        while (this.xParagraphList.firstChild) {
            this.xParagraphList.removeChild(this.xParagraphList.firstChild);
        }
        this.aIgnoredErrors.clear();
    }

    hide () {
        this.xPanel.style.display = "none";
        this.oTAC.clear();
    }

    addParagraphResult (oResult) {
        try {
            if (oResult && (oResult.sParagraph.trim() !== "" || oResult.aGrammErr.length > 0 || oResult.aSpellErr.length > 0)) {
                let xNodeDiv = createNode("div", {className: "grammalecte_paragraph_block"});
                // actions
                let xActionsBar = createNode("div", {className: "grammalecte_paragraph_actions"});
                xActionsBar.appendChild(createNode("div", {id: "grammalecte_check" + oResult.iParaNum, className: "grammalecte_paragraph_button grammalecte_green", textContent: "Réanalyser"}, {para_num: oResult.iParaNum}));
                xActionsBar.appendChild(createNode("div", {id: "grammalecte_hide" + oResult.iParaNum, className: "grammalecte_paragraph_button grammalecte_red", textContent: "×", style: "font-weight: bold;"}));
                // paragraph
                let xParagraph = createNode("p", {id: "grammalecte_paragraph"+oResult.iParaNum, className: "grammalecte_paragraph", lang: "fr", contentEditable: "true"}, {para_num: oResult.iParaNum});
                xParagraph.setAttribute("spellcheck", "false"); // doesn’t seem possible to use “spellcheck” as a common attribute.
                xParagraph.addEventListener("keyup", function (xEvent) {
                    this.oTAC.setParagraph(parseInt(xEvent.target.dataset.para_num), this.purgeText(xEvent.target.textContent));
                    this.oTAC.write();
                }.bind(this)
                , true);
                this._tagParagraph(xParagraph, oResult.sParagraph, oResult.iParaNum, oResult.aGrammErr, oResult.aSpellErr);
                // creation
                xNodeDiv.appendChild(xActionsBar);
                xNodeDiv.appendChild(xParagraph);
                this.xParagraphList.appendChild(xNodeDiv);
            }
        }
        catch (e) {
            showError(e);
        }
    }

    recheckParagraph (iParaNum) {
        let sParagraphId = "grammalecte_paragraph" + iParaNum;
        let xParagraph = document.getElementById(sParagraphId);
        this.blockParagraph(xParagraph);
        let sText = this.purgeText(xParagraph.textContent);
        xGrammalectePort.postMessage({
            sCommand: "parseAndSpellcheck1",
            dParam: {sText: sText, sCountry: "FR", bDebug: false, bContext: false},
            dInfo: {sParagraphId: sParagraphId}
        });
        this.oTAC.setParagraph(iParaNum, sText);
        this.oTAC.write();
    }

    refreshParagraph (sParagraphId, oResult) {
        try {
            let xParagraph = document.getElementById(sParagraphId);
            xParagraph.className = (oResult.aGrammErr.length || oResult.aSpellErr.length) ? "grammalecte_paragraph softred" : "grammalecte_paragraph";
            xParagraph.textContent = "";
            this._tagParagraph(xParagraph, oResult.sParagraph, sParagraphId.slice(21), oResult.aGrammErr, oResult.aSpellErr);
            this.freeParagraph(xParagraph);
        }
        catch (e) {
            showError(e);
        }
    }

    _tagParagraph (xParagraph, sParagraph, iParaNum, aSpellErr, aGrammErr) {
        try {
            if (aGrammErr.length === 0  &&  aSpellErr.length === 0) {
                xParagraph.textContent = sParagraph;
                return;
            }
            aGrammErr.push(...aSpellErr);
            aGrammErr.sort(function (a, b) {
                if (a["nStart"] < b["nStart"])
                    return -1;
                if (a["nStart"] > b["nStart"])
                    return 1;
                return 0;
            });
            let nErr = 0; // we count errors to give them an identifier
            let nEndLastErr = 0;
            for (let oErr of aGrammErr) {
                let nStart = oErr["nStart"];
                let nEnd = oErr["nEnd"];
                if (nStart >= nEndLastErr) {
                    oErr['sErrorId'] = iParaNum + "-" + nErr.toString(); // error identifier
                    oErr['sIgnoredKey'] = iParaNum + ":" + nStart.toString() + ":" + sParagraph.slice(nStart, nEnd);
                    if (nEndLastErr < nStart) {
                        xParagraph.appendChild(document.createTextNode(sParagraph.slice(nEndLastErr, nStart)));
                    }
                    xParagraph.appendChild(this._createError(sParagraph.slice(nStart, nEnd), oErr));
                    nEndLastErr = nEnd;
                }
                nErr += 1;
            }
            if (nEndLastErr <= sParagraph.length) {
                xParagraph.appendChild(document.createTextNode(sParagraph.slice(nEndLastErr)));
            }
        }
        catch (e) {
            showError(e);
        }
    }

    _createError (sUnderlined, oErr) {
        let xNodeErr = document.createElement("mark");
        xNodeErr.id = "grammalecte_err" + oErr['sErrorId'];
        xNodeErr.textContent = sUnderlined;
        xNodeErr.dataset.error_id = oErr['sErrorId'];
        xNodeErr.dataset.ignored_key = oErr['sIgnoredKey'];
        xNodeErr.dataset.error_type = (oErr['sType'] === "WORD") ? "spelling" : "grammar";
        if (xNodeErr.dataset.error_type === "grammar") {
            xNodeErr.dataset.gc_message = oErr['sMessage'];
            xNodeErr.dataset.gc_url = oErr['URL'];
            if (xNodeErr.dataset.gc_message.includes(" #")) {
                xNodeErr.dataset.line_id = oErr['sLineId'];
                xNodeErr.dataset.rule_id = oErr['sRuleId'];
            }
            xNodeErr.dataset.suggestions = oErr["aSuggestions"].join("|");
        }
        xNodeErr.className = (this.aIgnoredErrors.has(xNodeErr.dataset.ignored_key)) ? "grammalecte_error_ignored" : "grammalecte_error grammalecte_error_" + oErr['sType'];
        return xNodeErr;
    }

    blockParagraph (xParagraph) {
        xParagraph.contentEditable = "false";
        document.getElementById("grammalecte_check"+xParagraph.dataset.para_num).textContent = "Analyse…";
    }

    freeParagraph (xParagraph) {
        xParagraph.contentEditable = "true";
        document.getElementById("grammalecte_check"+xParagraph.dataset.para_num).textContent = "Réanalyser";
    }

    applySuggestion (sNodeSuggId) { // sugg
        try {
            let sErrorId = document.getElementById(sNodeSuggId).dataset.error_id;
            //let sParaNum = sErrorId.slice(0, sErrorId.indexOf("-"));
            let xNodeErr = document.getElementById("grammalecte_err" + sErrorId);
            xNodeErr.textContent = document.getElementById(sNodeSuggId).textContent;
            xNodeErr.className = "grammalecte_error_corrected";
            xNodeErr.removeAttribute("style");
            this.oTooltip.hide();
            this.recheckParagraph(parseInt(sErrorId.slice(0, sErrorId.indexOf("-"))));
        }
        catch (e) {
            showError(e);
        }
    }

    ignoreError (sIgnoreButtonId) {  // ignore
        try {
            let sErrorId = document.getElementById(sIgnoreButtonId).dataset.error_id;
            let xNodeErr = document.getElementById("grammalecte_err" + sErrorId);
            this.aIgnoredErrors.add(xNodeErr.dataset.ignored_key);
            xNodeErr.className = "grammalecte_error_ignored";
            this.oTooltip.hide();
        }
        catch (e) {
            showError(e);
        }
    }

    purgeText (sText) {
        return sText.replace(/&nbsp;/g, " ").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&amp;/g, "&");
    }

    addSummary () {
        // todo
    }

    addMessage (sMessage) {
        let xNode = createNode("div", {className: "grammalecte_gc_panel_message", textContent: sMessage});
        this.xParagraphList.appendChild(xNode);
    }

    _copyToClipboard (sText)  {
        // recipe from https://github.com/mdn/webextensions-examples/blob/master/context-menu-copy-link-with-types/clipboard-helper.js
        function setClipboardData (xEvent) {
            document.removeEventListener("copy", setClipboardData, true);
            xEvent.stopImmediatePropagation();
            xEvent.preventDefault();
            xEvent.clipboardData.setData("text/plain", sText);
        };

        document.addEventListener("copy", setClipboardData, true);
        document.execCommand("copy");
    }

    copyTextToClipboard () {
        this.startWaitIcon();
        try {
            let xClipboardButton = document.getElementById("grammalecte_clipboard_button");
            xClipboardButton.textContent = "->>";
            let sText = "";
            for (let xNode of document.getElementsByClassName("grammalecte_paragraph")) {
                sText += xNode.textContent + "\n";
            }
            this._copyToClipboard(sText);
            xClipboardButton.textContent = "OK";
            window.setTimeout(function() { xClipboardButton.textContent = "∑"; } , 2000);
        }
        catch (e) {
            showError(e);
        }
        this.stopWaitIcon();
    }
}


class GrammalecteTooltip {

    constructor (xContentNode) {
        this.xTooltip = createNode("div", {id: "grammalecte_tooltip"});
        this.xTooltipArrow = createNode("img", {
            id: "grammalecte_tooltip_arrow",
            src: " data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwAAADsABataJCQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xNzNun2MAAAAnSURBVChTY/j//z8cq/kW/wdhZDEMSXRFWCVhGKwAmwQyHngFxf8B5fOGYfeFpYoAAAAASUVORK5CYII=",
            alt: "^",
        });
        this.xTooltipSuggBlock = createNode("div", {id: "grammalecte_tooltip_sugg_block"});
        let xMessageBlock = createNode("div", {id: "grammalecte_tooltip_message_block"});
        xMessageBlock.appendChild(createNode("p", {id: "grammalecte_tooltip_rule_id"}));
        xMessageBlock.appendChild(createNode("p", {id: "grammalecte_tooltip_message", textContent: "Erreur."}));
        let xActions = xMessageBlock.appendChild(createNode("div", {id: "grammalecte_tooltip_actions"}));
        xActions.appendChild(createNode("div", {id: "grammalecte_tooltip_ignore", textContent: "Ignorer"}));
        xActions.appendChild(createNode("div", {id: "grammalecte_tooltip_url", textContent: "Voulez-vous en savoir plus ?…"}, {url: ""}));
        xMessageBlock.appendChild(xActions);
        this.xTooltip.appendChild(xMessageBlock);
        this.xTooltip.appendChild(createNode("div", {id: "grammalecte_tooltip_sugg_title", textContent: "SUGGESTIONS :"}));
        this.xTooltip.appendChild(this.xTooltipSuggBlock);
        xContentNode.appendChild(this.xTooltip);
        xContentNode.appendChild(this.xTooltipArrow);
    }

    show (sNodeErrorId) {  // err
        try {
            let xNodeErr = document.getElementById(sNodeErrorId);
            let nLimit = 500 - 330; // paragraph width - tooltip width
            this.xTooltipArrow.style.top = (xNodeErr.offsetTop + 16) + "px";
            this.xTooltipArrow.style.left = (xNodeErr.offsetLeft + Math.floor((xNodeErr.offsetWidth / 2))-4) + "px"; // 4 is half the width of the arrow.
            this.xTooltip.style.top = (xNodeErr.offsetTop + 20) + "px";
            this.xTooltip.style.left = (xNodeErr.offsetLeft > nLimit) ? nLimit + "px" : xNodeErr.offsetLeft + "px";
            if (xNodeErr.dataset.error_type === "grammar") {
                // grammar error
                if (xNodeErr.dataset.gc_message.includes(" ##")) {
                    let n = xNodeErr.dataset.gc_message.indexOf(" ##");
                    document.getElementById("grammalecte_tooltip_message").textContent = xNodeErr.dataset.gc_message.slice(0, n);
                    document.getElementById("grammalecte_tooltip_rule_id").textContent = "Règle : " + xNodeErr.dataset.gc_message.slice(n+2);
                    document.getElementById("grammalecte_tooltip_rule_id").style.display = "block";
                } else {
                    document.getElementById("grammalecte_tooltip_message").textContent = xNodeErr.dataset.gc_message;
                    document.getElementById("grammalecte_tooltip_rule_id").style.display = "none";
                }
                if (xNodeErr.dataset.gc_url != "") {
                    document.getElementById("grammalecte_tooltip_url").dataset.url = xNodeErr.dataset.gc_url;
                    document.getElementById("grammalecte_tooltip_url").style.display = "inline";
                } else {
                    document.getElementById("grammalecte_tooltip_url").dataset.url = "";
                    document.getElementById("grammalecte_tooltip_url").style.display = "none";
                }
                document.getElementById("grammalecte_tooltip_ignore").dataset.error_id = xNodeErr.dataset.error_id;
                let iSugg = 0;
                let xGCSugg = document.getElementById("grammalecte_tooltip_sugg_block");
                xGCSugg.textContent = "";
                if (xNodeErr.dataset.suggestions.length > 0) {
                    for (let sSugg of xNodeErr.dataset.suggestions.split("|")) {
                        xGCSugg.appendChild(this._createSuggestion(xNodeErr.dataset.error_id, iSugg, sSugg));
                        xGCSugg.appendChild(document.createTextNode(" "));
                        iSugg += 1;
                    }
                } else {
                    xGCSugg.textContent = "Aucune.";
                }
            }
            this.xTooltipArrow.style.display = "block";
            this.xTooltip.style.display = "block";
            if (xNodeErr.dataset.error_type === "spelling") {
                // spelling mistake
                document.getElementById("grammalecte_tooltip_message").textContent = "Mot inconnu du dictionnaire.";
                document.getElementById("grammalecte_tooltip_ignore").dataset.error_id = xNodeErr.dataset.error_id;
                while (this.xTooltipSuggBlock.firstChild) {
                    this.xTooltipSuggBlock.removeChild(this.xTooltipSuggBlock.firstChild);
                }
                //console.log("getSuggFor: " + xNodeErr.textContent.trim() + " // error_id: " + xNodeErr.dataset.error_id);
                //self.port.emit("getSuggestionsForTo", xNodeErr.textContent.trim(), xNodeErr.dataset.error_id);
                this.setSpellSuggestionsFor(xNodeErr.textContent.trim(), "", xNodeErr.dataset.error_id);
            }
        }
        catch (e) {
            showError(e);
        }
    }

    setTooltipColor () {
        // todo
    }

    hide () {
        this.xTooltipArrow.style.display = "none";
        this.xTooltip.style.display = "none";
    }

    _createSuggestion (sErrId, iSugg, sSugg) {
        let xNodeSugg = document.createElement("div");
        xNodeSugg.id = "grammalecte_sugg" + sErrId + "--" + iSugg.toString();
        xNodeSugg.className = "grammalecte_tooltip_sugg";
        xNodeSugg.dataset.error_id = sErrId;
        xNodeSugg.textContent = sSugg;
        return xNodeSugg;
    }

    setSpellSuggestionsFor (sWord, sSuggestions, sErrId) {
        // spell checking suggestions
        try {
            // console.log("setSuggestionsFor: " + sWord + " > " + sSuggestions + " // " + sErrId);
            let xSuggBlock = document.getElementById("grammalecte_tooltip_sugg_block");
            xSuggBlock.textContent = "";
            if (sSuggestions === "") {
                xSuggBlock.appendChild(document.createTextNode("Aucune."));
            } else if (sSuggestions.startsWith("#")) {
                xSuggBlock.appendChild(document.createTextNode(sSuggestions));
            } else {
                let lSugg = sSuggestions.split("|");
                let iSugg = 0;
                for (let sSugg of lSugg) {
                    xSuggBlock.appendChild(this._createSuggestion(sErrId, iSugg, sSugg));
                    xSuggBlock.appendChild(document.createTextNode(" "));
                    iSugg += 1;
                }
            }
        }
        catch (e) {
            showError(e);
        }
    }
}


class GrammalecteTextAreaControl {

    constructor () {
        this._xTextArea = null;
        this._dParagraph = new Map();
    }

    setTextArea (xNode) {
        this.clear();
        this._xTextArea = xNode;
        this._xTextArea.disabled = true;
        this._loadText();
    }

    clear () {
        if (this._xTextArea !== null) {
            this._xTextArea.disabled = false;
            this._xTextArea = null;
        }
        this._dParagraph.clear();
    }

    setParagraph (iParagraph, sText) {
        if (this._xTextArea !== null) {
            this._dParagraph.set(iParagraph, sText);
        }
    }

    _loadText () {
        let sText = this._xTextArea.value;
        let i = 0;
        let iStart = 0;
        let iEnd = 0;
        sText = sText.replace("\r\n", "\n").replace("\r", "\n");
        while ((iEnd = sText.indexOf("\n", iStart)) !== -1) {
            this._dParagraph.set(i, sText.slice(iStart, iEnd));
            i++;
            iStart = iEnd+1;
        }
        this._dParagraph.set(i, sText.slice(iStart));
        console.log("Paragraphs number: " + (i+1));
    }

    write () {
        if (this._xTextArea !== null) {
            let sText = "";
            this._dParagraph.forEach(function (val, key) {
                sText += val + "\n";
            });
            this._xTextArea.value = sText.slice(0,-1);
        }
    }
}

Added gc_lang/fr/webext/content_scripts/panel_lxg.css version [58f7a11f55].































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*
    Lexicographer
*/
#grammalecte_lxg_panel_content {
    padding: 5px;
    font-size: 13px;
}

.grammalecte_lxg_list_of_tokens {
    margin: 5px 0 10px 0;
    padding: 10px;
    background-color: hsla(0, 0%, 96%, 1);
    border-radius: 2px;
}

.grammalecte_lxg_list_num {
    float: right;
    margin: -12px 0 5px 10px;
    padding: 5px 10px;
    font-weight: bold;
    border-radius: 0 0 4px 4px;
    background-color: hsl(0, 50%, 50%);
    color: hsl(0, 10%, 96%);
}

.grammalecte_lxg_separator {
    margin: 20px 0;
    padding: 5px 5px;
    background-color: hsla(0, 0%, 75%, 1);
    color: hsla(0, 0%, 96%, 1);
    border-radius: 5px;
    text-align: center;
    font-size: 20px;
}

.grammalecte_lxg_token_block  {
    margin: 4px 0;
}
.grammalecte_lxg_token {
    display: inline-block;
    background-color: hsl(150, 0%, 50%);
    color: hsl(0, 0%, 96%);
    padding: 2px 5px;
    border-radius: 2px;
    text-decoration: none;
    font-weight: bold;
}
.grammalecte_lxg_token_colon {
    display: inline-block;
    padding: 2px 5px;
    color: hsl(0, 0%, 50%);
}
.grammalecte_lxg_morph_list {
    padding: 2px 0 10px 20px;
}
.grammalecte_lxg_morph_elem {
    color: hsl(0, 0%, 0%);
}
.grammalecte_lxg_token_WORD {
    background-color: hsla(150, 50%, 50%, 1);
}
.grammalecte_lxg_token_ELPFX {
    background-color: hsla(150, 30%, 50%, 1);
}
.grammalecte_lxg_token_UNKNOWN {
    background-color: hsla(0, 50%, 50%, 1);
}
.grammalecte_lxg_token_NUM {
    background-color: hsla(180, 50%, 50%, 1);
}
.grammalecte_lxg_token_COMPLEX {
    background-color: hsla(60, 50%, 50%, 1);
}
.grammalecte_lxg_token_SEPARATOR {
    background-color: hsla(210, 50%, 50%, 1);
}
.grammalecte_lxg_token_LINK {
    background-color: hsla(270, 50%, 50%, 1);
}

Added gc_lang/fr/webext/content_scripts/panel_lxg.js version [dcf9b1545d].











































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// JavaScript

"use strict";

class GrammalecteLexicographer extends GrammalectePanel {

    constructor (...args) {
        super(...args);
        this._nCount = 0;
        this._xContentNode = createNode("div", {id: "grammalecte_lxg_panel_content"});
        this.xPanelContent.appendChild(this._xContentNode);
    }

    clear () {
        this._nCount = 0;
        while (this._xContentNode.firstChild) {
            this._xContentNode.removeChild(this._xContentNode.firstChild);
        }
    }

    addSeparator (sText) {
        if (this._xContentNode.textContent !== "") {
            this._xContentNode.appendChild(createNode("div", {className: "grammalecte_lxg_separator", textContent: sText}));
        }
    }

    addMessage (sClass, sText) {
        this._xContentNode.appendChild(createNode("div", {className: sClass, textContent: sText}));
    }

    addListOfTokens (lTokens) {
        try {
            if (lTokens) {
                this._nCount += 1;
                let xNodeDiv = createNode("div", {className: "grammalecte_lxg_list_of_tokens"});
                xNodeDiv.appendChild(createNode("div", {className: "grammalecte_lxg_list_num", textContent: this._nCount}));
                for (let oToken of lTokens) {
                    xNodeDiv.appendChild(this._createTokenNode(oToken));
                }
                this._xContentNode.appendChild(xNodeDiv);
            }
        }
        catch (e) {
            showError(e);
        }
    }

    _createTokenNode (oToken) {
        let xTokenNode = createNode("div", {className: "grammalecte_lxg_token_block"});
        xTokenNode.appendChild(createNode("div", {className: "grammalecte_lxg_token grammalecte_lxg_token_" + oToken.sType, textContent: oToken.sValue}));
        xTokenNode.appendChild(createNode("div", {className: "grammalecte_lxg_token_colon", textContent: ":"}));
        if (oToken.aLabel.length === 1) {
            xTokenNode.appendChild(document.createTextNode(oToken.aLabel[0]));
        } else {
            let xTokenList = createNode("div", {className: "grammalecte_lxg_morph_list"});
            for (let sLabel of oToken.aLabel) {
                xTokenList.appendChild(createNode("div", {className: "grammalecte_lxg_morph_elem", textContent: "• " + sLabel}));
            }
            xTokenNode.appendChild(xTokenList);
        }
        return xTokenNode;
    }

    setHidden (sClass, bHidden) {
        for (let xNode of document.getElementsByClassName(sClass)) {
            xNode.hidden = bHidden;
        }
    }
}

Added gc_lang/fr/webext/content_scripts/panel_tf.css version [5b990f525b].























































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
    CSS for the Text Formatter
*/


/*
    Options
*/
#grammalecte_tf_options {
    display: flex;
    padding: 10px;
    color: hsl(0, 0%, 0%);
    font-size: 13px;
}
.grammalecte_tf_column {
    flex-grow: 1;
    width: 360px;
    padding: 0 5px;
}
.grammalecte_tf_groupblock {
    padding: 2px 10px 10px 13px;
    margin: 10px 0 15px 0;
    background-color: hsl(210, 10%, 92%);
    border: 0 1px 1px 1px;
    border-color: hsl(210, 20%, 80%);
    border-radius: 3px;
}
.grammalecte_tf_underline:hover {
    background-color: hsl(210, 10%, 86%);
    border-radius: 2px;
}
.grammalecte_tf_blockopt {
    display: flex;
}
.grammalecte_tf_indent {
    padding-left: 20px;
}
.grammalecte_tf_result {
    display: inline-block;
    font-size: 13px;
}
.grammalecte_tf_option_on {
    flex-grow: 1;
    background:  url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwQAADsEBuJFr7QAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xNzNun2MAAAMnSURBVDhPY/j//z9VMVZBSjC6ACMQM4PYz1+8UGmaPrsjvL7rVGB1++Oguo7H/pXNpzpmz+949eaNClQ9SC1ID9wMOAOIQRIgzFQxYWqtZk7NF/ms2v+8mc3/GAra/oOwUE7jP5CYcnbN1+aps2pBapH0YTWQwTyrbIVUVsN/rdy6/9KZNe8qJk5fsOvQkeL9x04UF/RMWSAPFAPJcWW1/HcvqF7x9u1buF4QRjaQIbS0pk6rsOG/ItAVLgXVG2/duSMOlYO74v7DR+JuBTVbDPPr/wvnNvzPaGqvg6oBYzhj686d6vq59e/Uc2r/B1U1r3v69ClMjgUNg7zJ4JBbsdK8qPE/d079uznzF6iDxEAYbiB/TH6bGdB1LFnNb3smTZaDioMMgKmBuZJtwtyFZcUNLYb62VWPpHLr/y/buLkNpg6mmME8p/y4PDBssjsmLIKKsQIxcqCDY9+/sGIab07Lf9XUssP66SUbFLPq/qf1TDkBkgNhuIHGOZWPhDIa/zdMnl4O4n/89AmUNPig8mCX+hdWz1AGWmpS0PhfOLF0oWZsVo0GMBw9K1oeQ9UhDDTMrHwkmtX4v6pvYv7xkyflGMqaP/oXV6/89esXWD6gsHKmcnbtf1AY+5Q3r9+0aRODXFhaiVYe2MBHGAYaZZUdNyhu+q+ZkD2ZNb6iTqOg4b9MZv3/6KrG2S6ZBRNVgC7Tyav7b5Zdufr3nz9sv4EWySTmLwaJA718HMNA4ficNsOihv8qOVVvI5PTxFNae6eL5jX+18yt/QM06C/IMAugYe8/fAB7//bde/LAxP9WCmgp1kgBJRvDvLp38sBATmzpXbt582aGhMauuaBYBLnCOLNiPTBcQRHFAAoGrZTidXiTDQiDEzYwTMSAhkbVtW6Yt3ART3Rd63xguoTFPMPd+/clPIvrNoKSGN6EDcTgnADKejJAV4EiwCi35iXQlQuXrN9UcuTM2fyCvimLZDNr3iJlvZX4sh4svTFV9E+pBYbdF4mc+v9AL//jym3+z1Dc+l8st46kwgFmKErxFVbXcdqvpv1JQE0nycUXVTBWQfLxfwYA8YUHpiMfZa8AAAAASUVORK5CYII=') no-repeat;
    padding: 0 5px 0 25px;
    line-height: 20px;
    opacity: 1;
    cursor: pointer;
}
.grammalecte_tf_option_off {
    flex-grow: 1;
    background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTczbp9jAAADGUlEQVQ4T2P4//8/VTFWQUowggEEQJoRiJlB/BfPn6vMbmrp6AqPOdUeGPa4Iyj8cbN/0Kn5HV0db169UoHqA6kF6UGYg8QBSYAw09SKqtoaTYMvtfLq/5t5xf+1MTD9B+FGIZl/ILEaZe2vs5pba0FqkfRhNZChzNx6RYOU0v96Nb3/tWLyH6aVlC8+vHNX8Yn9B4on5RctrpFQ/FCnZfi/hUvsf7W714q3b9/C9YIwsoEMNaERdQ1aRv9rZFX/13r7bH729KkQVA7uirdv3gjVefpsrjez+d8gLPO/PSOzDqoGjOGMnVu3qtcZWryrU9T+3x0Tv+HFy5cMZ44d99+ydm0oTM38SZNDN61e4w9il+qabGgytftfzy34bsGcOeowNXAD8/kl2hpMrP7X8wm/b6mtFQFpbGZg+NfCwPRn5cJFDlPaOxwaROX+tLAL/ls4fYb/vbt3RWo1Dd7XA4Nn87LlbRgGlptbH28QV/o/rbxy6dt37xgak1PqmwQk/zdYO/yrkZD9WCsm/bHO2PIfMJL+d+fk13/79o0hX151aYOS9v8paZnHMQysNDZ/1Cgq939KTW0ZTGxKfUN+rZTy/zoLuz9Aw/7U6Br/7y0uzQfJ/fz5kyFHWKKsUdvof4uX3yOYHkwDa+vgBq5YsNClAeiiekvbP7UGZn/q9Ez+z504yQUk9wNoYJYIHgPBXgaGx+TCkiUg/qye3sgGAalf9daO/4Cu/FOrqgMy9B9IbNnsOZE/fvwAeXlJnYoOdi+DIqXRyPI/MLw+5GdmCk5raSkFJeZmLpH/faVl+eWhkfl1ihqgxP2/JSOr9O6dO4I12kYfcEYKPNnIa/3vT0rdcOnKFYYlU6bVTCwugStuTkppm1hVXfP6zRuGIgMCyQaE4QlbWvl/Q2Dwxtu3bvFB5eAJG5hc+Bp8AzY2ABN2k4A07oQNxGANkKyn8h8YZqAc8356eeXiQzt2Fp/Yt78YlA1rFTXfA9MfLOutxJf1YK6AFw71Mir/m5AKB2C6/AcSAxUOwJKIYOEAM5RqxRdVMFZB8vF/BgAKMNpeW+niqQAAAABJRU5ErkJggg==') no-repeat;
    padding: 0 5px 0 25px;
    line-height: 20px;
    opacity: .3;
    cursor: pointer;
}
.grammalecte_tf_option_title_on {
    flex-grow: 1;
    background:  url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTczbp9jAAAEOUlEQVQ4T51Vb2xTVRS/wpRpohDdlgEu3TLIBJqNsbWucZIxSFCyBIMxCvgnasba19fXv+x1872+99ruX6eMfUEcX3T9ppG4aNesg8ok2R9caQvRxMwoC47YfWj4MNp1rLve8+irg0RN/PDrue0953fPPfd3ThHGeD025uyG70KhQ+zZc0NvCL7o60LfPLHzRzu9Udo3OPTD9Mwh8HkkRkZ+QSBvjI5fajzCSlPPGURcaeTxLhOPq4wcrjTweA/N4Z00j0soF37FIU2B7/pYQJ4smUyiNm8/i+xdeLfJhbUWYa2C2FISTL6nas1CqtQg4OcJtBZ+rYoQb6E9+GSHyCocCqG8OCX1sBtNvXi/XchAVqV6btHUe8Z7J5HQkv0ywNxvv2vNvrPeMj2fqGZcuN78UWaHScKv0g42lbonc8kZvm93NpUbRdxgca0Um0TcbOWCVycni2CP4LGcza+j8XhRdRsb0jjcuI7hV56lJfzZF/4m2EOJRAIdl/onKkmdahgRt7CeQDAYVAgKCOAG8AAAWMNvMnFpa3sAMn3RKmFk75gIhUIIbT7Rehhq1mAVMGL5xOd+/1ZwzgUrxOshE1+dmq49N3Rhm84q3tnL8LiM4vF05PphVP2B6XwtI2A1OemYg+v68do1CHqCYP1VFRRkMhnk6PHptzAefLDVSO9+W++st0vyyw9fHDmP1JQzUm8V8SbKg2djcZ0SSACEitbk37Krq4j/ZIBClm6sswv3ayxSVv2hbXAvzd2rIBm+1zMYIYQd80BYQHlSs9FYOQQn797d8cvcr5U5IqVuyNnXL5M12sXlGojRuy5WtJxQ15iFJdDnMVfvvEyoMbswMnelYzdvbo/G4puRzTlHJHHr629GtudIkZ6XqKcNHiIrcRnqReQVvBwOI+2Ro2WkXGkQf47QGYGiqk1EsK8d1zbZXQGQAzxUJdU+dzn8fVFLq7H1BbMAslreRjrmgF0MTM7MPAkHHXjz5EuyLyGUrwyPQlLGcIWd71IcaqM1xYyUbrC5snUWARfSwh+7aG5JY+Xvq0jhmx1SYGx8fBMhexwID1L2LkgGOkp+lAeyEXAduXYJzS96uruf+XZsbD/qFNMakytL6ru6z8RlZGnZ+ED4yhUgkyUVnpjY+vJpz5/VpLOgJWXZgLDfkj4mwiZDgBT2ne4zY/7hYeT/8qtm0gErxDm7zybh8lMdwdnI9cIc2YZ0OoUK9FwA5KYjsskLG05SWk9nEVaeotyYjKnxwOhoYUdXn0Zjda+o2tpHFhYW8kKP3bhRpDGyQSDSmLmHW498yI5/DwcxU8VwuJzpTNp8A6fdn16g4j/9vIf4lNy6fVvH9A14VQZu8V+HAyzk8eXxsciZG18Mv6Z6YFONDvcSqeVysUFcUxHJ/Nf4ypOCfXTAAqALQBZw0EMD9tI/D1gFysb//AvA6C/kxqnYzYkxSwAAAABJRU5ErkJggg==') no-repeat;
    padding: 0 5px 0 25px;
    margin: -12px 0 10px 0;
    line-height: 20px;
    font-size: 20px;
    color: hsla(210, 20%, 50%, .8);
    font-weight: bold;
    cursor: pointer;
}
.grammalecte_tf_option_title_off {
    flex-grow: 1;
    background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAEs0lEQVQ4jbWVa1BUZRjH/+97zp5lWS7rtqLAIg0a3sJcmI118IbriFqppSEk0wcSqQ/RMF7AG0iXATIzMy+Ml2kgZ4pJoXGUUQbJykQoYUiREWQVzHV38YKw7J6z55y3L+LQaH2q59Pz5fl9eOb5/x7CGMOo4gAoAGj9qVMLun++kD7U02tlqmwklEKSxPuhMTEttvRV1S/PmX0OgDpqBgBARgE5AEpDXd3sC18d2MkutdoUQxggCGCqCiIzsCANiCSBDDwClzizKSXv3Y32JUt+GQ0dAXIPHjxQjmzeViBV7C8Tp1lAQsIY87gIfCJgNPiIVgs47+rA81CjIhgGhojgugflldTC4m+qykeghDHGAVDKct8rIEe+LfOlWCXV4xFwz+MxrHz9aOaWwhOR5mgnADi6uiJrv9j7xv0Ttdk0YtxYReAk4eGwMPhCbGHJ8eryYJ2OI4wxbM5eOz+o8WKjEjU2QLodGiRMP/Pqx0VvW202NwACYGQvBABz9PREHFyxujJUr08TFTmguXFLE1dalJq1LudH6na78ZxfKpE5Aur1aXhr4un5Wzcuttps3q937c5TZFn/GEQuNTXp9xUV53E87y1vb1ksNV04TX1+DSZPREfuupL6+nogJzwirWiahRXb5rItgKv2+PFIxhjyx02oKjHHsXxzfKUsy+jo6EDJm5mV2wFWkrmm6srVq2hsaIj6aI7dtX2GlRWbJ7HLTZfSyPszkg4aOU0uGxxC8PyU8j8N+sLgazc+0/f2rRe1QcNCQAkeNBkOS1evwBgUuhYTooeVzu7ggUVzdu2pqtqwYeHishBXfwHrv4+kTz+s4PUqsRKBQnD0Yml15ckEiwWNDQ0V5xcuXCokpkyVoMq6O661IZGxUHgi055bwcoE87XU5SsqAOCuKp2cqKoFqj4YNxvOWymBagIAhed8flG8DQCpdnvX8t9+t3tFXyvHGM+02oDMlADz+3k1flKrbcsG+4pVK7sAIMDobcaYj/AcfIMDJjo6JpSQkZa3JCU6JVm6TggFUVWAEhC/iBBz5PXYiXFOADyeUZSB9j++Bx0lJBoA3G63kj8loWpMaNhqGUwmGp7nCOFhCJfFmtOrvyveUeV0OhUA0BA1mhCiY7ICXWh4P/VS1sIUFYGYaJw9dHRZ3sb12J2ds9MoCFmiovi0gpYP3L7bHnD0tdPBIV55cYqP+7U5q3TTpp0AMJ4KywiloN5hPG+f10L9t/pqmCiCGA3wHq7Injl5qilnz+d7vX9c7gzy+3Wspakz40xNmnnHpjTVEN5Jux06On1a58y58/aeP3fOZJDkbJmjIDyHmPj4Gq6ut+dGZ1vbAl+3I5bGxOrlR0MJxBy1/7XS0rq2i81T5x74Mit51qw+a3Ky92FYyJme5uYps4u3vpWekXHzaFzc92qY8SVNiB5iR+tP49LTtz0VPa6jS4Nky9lln5SssSQl9T8reu1tbaZj7+Qe02t1iwLy36P3lBz8KUmS4vIIyqN7/eMzMg+tzP/gh6gY8x0A6HPcjKrdt3+5p7o2h4wJN/2jHEb0dXjztoLAE33pGXO5CcTAE30xp0tHqAaq2fSv+vpfBPufvYC/AKF6gkOvRLAiAAAAAElFTkSuQmCC') no-repeat;
    padding: 0 5px 0 25px;
    margin: -12px 0 10px 0;
    line-height: 20px;
    font-size: 20px;
    color: hsla(210, 20%, 50%, .8);
    font-weight: bold;
    cursor: pointer;
}


/*
    Actions
*/
#grammalecte_tf_actions {
    display: flex;
    justify-content: space-between;
    padding: 15px 15px 10px 15px;
    border-top: 1px solid hsl(210, 10%, 90%);
}

.grammalecte_tf_button {
    display: inline-block;
    padding: 5px 10px;
    width: 100px;
    border-radius: 3px;
    font-size: 16px;
    font-weight: bold;
    text-align: center;
    cursor: pointer;
}

#grammalecte_tf_reset {
    background-color: hsl(210, 50%, 50%);
    color: hsl(210, 0%, 100%);
}
#grammalecte_tf_reset:hover {
    background-color: hsl(210, 50%, 40%);
}
#grammalecte_tf_progressbar {
    width: 400px;
}
#grammalecte_tf_time_res {
    width: 60px;
    padding: 5px 10px;
}
#grammalecte_tf_apply {
    background-color: hsl(120, 50%, 50%);
    color: hsl(150, 0%, 100%);
}
#grammalecte_tf_apply:hover {
    background-color: hsl(120, 50%, 40%);
}

Added gc_lang/fr/webext/content_scripts/panel_tf.js version [73e149c631].













































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
// JavaScript
// Text formatter

"use strict";


class GrammalecteTextFormatter extends GrammalectePanel {

    constructor (...args) {
        super(...args);
        this.xTFNode = this._createTextFormatter();
        this.xPanelContent.appendChild(this.xTFNode);
        this.xTextArea = null;
    }

    _createTextFormatter () {
        let xTFNode = document.createElement("div");
        try {
            // Options
            let xOptions = createNode("div", {id: "grammalecte_tf_options"});
            let xColumn1 = createNode("div", {className: "grammalecte_tf_column"});
            let xSSP = this._createFieldset("group_ssp", true, "Espaces surnuméraires");
            xSSP.appendChild(this._createBlockOption("o_start_of_paragraph", true, "En début de paragraphe"));
            xSSP.appendChild(this._createBlockOption("o_end_of_paragraph", true, "En fin de paragraphe"));
            xSSP.appendChild(this._createBlockOption("o_between_words", true, "Entre les mots"));
            xSSP.appendChild(this._createBlockOption("o_before_punctuation", true, "Avant les points (.), les virgules (,)"));
            xSSP.appendChild(this._createBlockOption("o_within_parenthesis", true, "À l’intérieur des parenthèses"));
            xSSP.appendChild(this._createBlockOption("o_within_square_brackets", true, "À l’intérieur des crochets"));
            xSSP.appendChild(this._createBlockOption("o_within_quotation_marks", true, "À l’intérieur des guillemets “ et ”"));
            let xSpace = this._createFieldset("group_space", true, "Espaces manquants");
            xSpace.appendChild(this._createBlockOption("o_add_space_after_punctuation", true, "Après , ; : ? ! . …"));
            xSpace.appendChild(this._createBlockOption("o_add_space_around_hyphens", true, "Autour des tirets d’incise"));
            let xNBSP = this._createFieldset("group_nbsp", true, "Espaces insécables");
            xNBSP.appendChild(this._createBlockOption("o_nbsp_before_punctuation", true, "Avant : ; ? et !"));
            xNBSP.appendChild(this._createBlockOption("o_nbsp_within_quotation_marks", true, "Avec les guillemets « et »"));
            xNBSP.appendChild(this._createBlockOption("o_nbsp_before_symbol", true, "Avant % ‰ € $ £ ¥ ˚C"));
            xNBSP.appendChild(this._createBlockOption("o_nbsp_within_numbers", true, "À l’intérieur des nombres"));
            xNBSP.appendChild(this._createBlockOption("o_nbsp_before_units", true, "Avant les unités de mesure"));
            let xDelete = this._createFieldset("group_delete", true, "Suppressions");
            xDelete.appendChild(this._createBlockOption("o_erase_non_breaking_hyphens", true, "Tirets conditionnels"));
            let xColumn2 = createNode("div", {className: "grammalecte_tf_column"});
            let xTypo = this._createFieldset("group_typo", true, "Signes typographiques");
            xTypo.appendChild(this._createBlockOption("o_ts_apostrophe", true, "Apostrophe (’)"));
            xTypo.appendChild(this._createBlockOption("o_ts_ellipsis", true, "Points de suspension (…)"));
            xTypo.appendChild(this._createBlockOption("o_ts_dash_middle", true, "Tirets d’incise :"));
            xTypo.appendChild(this._createRadioBoxHyphens("o_ts_m_dash_middle", "o_ts_n_dash_middle", false));
            xTypo.appendChild(this._createBlockOption("o_ts_dash_start", true, "Tirets en début de paragraphe :"));
            xTypo.appendChild(this._createRadioBoxHyphens("o_ts_m_dash_start", "o_ts_n_dash_start", true));
            xTypo.appendChild(this._createBlockOption("o_ts_quotation_marks", true, "Modifier les guillemets droits (\" et ')"));
            xTypo.appendChild(this._createBlockOption("o_ts_units", true, "Points médians des unités (N·m, Ω·m…)"));
            xTypo.appendChild(this._createBlockOption("o_ts_spell", true, "Ligatures (cœur…) et diacritiques (ça, État…)"));
            xTypo.appendChild(this._createRadioBoxLigatures());
            xTypo.appendChild(this._createLigaturesSelection());
            let xMisc = this._createFieldset("group_misc", true, "Divers");
            xMisc.appendChild(this._createOrdinalOptions());
            xMisc.appendChild(this._createBlockOption("o_etc", true, "Et cætera, etc."));
            xMisc.appendChild(this._createBlockOption("o_missing_hyphens", true, "Traits d’union manquants"));
            xMisc.appendChild(this._createBlockOption("o_ma_word", true, "Apostrophes manquantes"));
            xMisc.appendChild(this._createSingleLetterOptions());
            let xStruct = this._createFieldset("group_struct", false, "Restructuration [!]");
            xStruct.appendChild(this._createBlockOption("o_remove_hyphens_at_end_of_paragraphs", false, "Enlever césures en fin de ligne/paragraphe [!]"));
            xStruct.appendChild(this._createBlockOption("o_merge_contiguous_paragraphs", false, "Fusionner les paragraphes contigus [!]"));
            xColumn1.appendChild(xSSP);
            xColumn1.appendChild(xSpace);
            xColumn1.appendChild(xNBSP);
            xColumn1.appendChild(xDelete);
            xColumn2.appendChild(xTypo);
            xColumn2.appendChild(xMisc);
            xColumn2.appendChild(xStruct);
            xOptions.appendChild(xColumn1);
            xOptions.appendChild(xColumn2);
            // Actions
            let xActions = createNode("div", {id: "grammalecte_tf_actions"});
            let xDefaultButton = createNode("div", {id: "grammalecte_tf_reset", textContent: "Par défaut", className: "grammalecte_tf_button"});
            xDefaultButton.addEventListener("click", () => { this.reset(); });
            let xApplyButton = createNode("div", {id: "grammalecte_tf_apply", textContent: "Appliquer", className: "grammalecte_tf_button"});
            xApplyButton.addEventListener("click", () => { this.saveOptions(); this.apply(); });
            xActions.appendChild(xDefaultButton);
            xActions.appendChild(createNode("progress", {id: "grammalecte_tf_progressbar"}));
            xActions.appendChild(createNode("span", {id: "grammalecte_tf_time_res", textContent: "…"}));
            xActions.appendChild(xApplyButton);
            //xActions.appendChild(createNode("div", {id: "grammalecte_infomsg", textContent: "blabla"}));
            // create result
            xTFNode.appendChild(xOptions);
            xTFNode.appendChild(xActions);
        }
        catch (e) {
            showError(e);
        }
        return xTFNode;
    }

    // Common options
    _createFieldset (sId, bDefault, sLabel) {
        let xFieldset = createNode("div", {id: sId, className: "grammalecte_tf_groupblock"});
        let xGroupOption = createNode("div", {id: "o_"+sId, className: "grammalecte_tf_option grammalecte_tf_option_title_off", textContent: sLabel}, {selected: "false", default: bDefault, linked_ids: ""});
        xGroupOption.addEventListener("click", (xEvent) => { this.switchOption(xEvent.target.id); this.switchGroup(xEvent.target.id); });
        xFieldset.appendChild(xGroupOption);
        return xFieldset;
    }

    _createBlockOption (sId, bDefault, sLabel) {
        let xLine = createNode("div", {className: "grammalecte_tf_blockopt grammalecte_tf_underline"});
        xLine.appendChild(this._createOption(sId, bDefault, sLabel));
        xLine.appendChild(createNode("div", {id: "res_"+sId, className: "grammalecte_tf_result", textContent: "·"}));
        return xLine;
    }

    _createOption (sId, bDefault, sLabel, sLinkedOptionsId="") {
        let xOption = createNode("div", {id: sId, className: "grammalecte_tf_option grammalecte_tf_option_off", textContent: sLabel}, {selected: "false", default: bDefault, linked_ids: sLinkedOptionsId});
        xOption.addEventListener("click", (xEvent) => { this.switchOption(xEvent.target.id); });
        return xOption;
    }

    // Hyphens
    _createRadioBoxHyphens (sIdEmDash, sIdEnDash, bDefaultEmDash) {
        let xLine = createNode("div", {className: "grammalecte_tf_blockopt grammalecte_tf_indent"});
        xLine.appendChild(this._createOption(sIdEmDash, bDefaultEmDash, "cadratin (—)", sIdEnDash));
        xLine.appendChild(this._createOption(sIdEnDash, !bDefaultEmDash, "demi-cadratin (—)", sIdEmDash));
        return xLine;
    }

    // Ligatures
    _createRadioBoxLigatures () {
        let xLine = createNode("div", {className: "grammalecte_tf_blockopt grammalecte_tf_underline"});
        xLine.appendChild(this._createOption("o_ts_ligature", true, "Ligatures"));
        xLine.appendChild(this._createOption("o_ts_ligature_do", false, "faire", "o_ts_ligature_undo"));
        xLine.appendChild(this._createOption("o_ts_ligature_undo", true, "défaire", "o_ts_ligature_do"));
        xLine.appendChild(createNode("div", {id: "res_"+"o_ts_ligature", className: "grammalecte_tf_result", textContent: "·"}));
        return xLine;
    }

    _createLigaturesSelection () {
        let xLine = createNode("div", {className: "grammalecte_tf_blockopt grammalecte_tf_indent"});
        xLine.appendChild(this._createOption("o_ts_ligature_ff", true, "ff"));
        xLine.appendChild(this._createOption("o_ts_ligature_fi", true, "fi"));
        xLine.appendChild(this._createOption("o_ts_ligature_ffi", true, "ffi"));
        xLine.appendChild(this._createOption("o_ts_ligature_fl", true, "fl"));
        xLine.appendChild(this._createOption("o_ts_ligature_ffl", true, "ffl"));
        xLine.appendChild(this._createOption("o_ts_ligature_ft", true, "ft"));
        xLine.appendChild(this._createOption("o_ts_ligature_st", false, "st"));
        return xLine;
    }

    // Apostrophes
    _createSingleLetterOptions () {
        let xLine = createNode("div", {className: "grammalecte_tf_blockopt grammalecte_tf_indent"});
        xLine.appendChild(this._createOption("o_ma_1letter_lowercase", false, "lettres isolées (j’ n’ m’ t’ s’ c’ d’ l’)"));
        xLine.appendChild(this._createOption("o_ma_1letter_uppercase", false, "Maj."));
        return xLine;
    }

    // Ordinals
    _createOrdinalOptions () {
        let xLine = createNode("div", {className: "grammalecte_tf_blockopt grammalecte_tf_underline"});
        xLine.appendChild(this._createOption("o_ordinals_no_exponant", true, "Ordinaux (15e, XXIe…)"));
        xLine.appendChild(this._createOption("o_ordinals_exponant", true, "e → ᵉ"));
        xLine.appendChild(createNode("div", {id: "res_"+"o_ordinals_no_exponant", className: "grammalecte_tf_result", textContent: "·"}));
        return xLine;
    }
    
    /*
        Actions
    */
    start (xTextArea) {
        this.xTextArea = xTextArea;
        let xPromise = browser.storage.local.get("tf_options");
        xPromise.then(this.setOptions.bind(this), this.reset.bind(this));
    }

    switchGroup (sOptName) {
        if (document.getElementById(sOptName).dataset.selected == "true") {
            document.getElementById(sOptName.slice(2)).style.opacity = 1;
        } else {
            document.getElementById(sOptName.slice(2)).style.opacity = 0.3;
        }
        this.resetProgressBar();
    }

    switchOption (sOptName) {
        let xOption = document.getElementById(sOptName);
        if (xOption.dataset.linked_ids === "") {
            xOption.dataset.selected = (xOption.dataset.selected == "true") ? "false" : "true";
            xOption.className = (xOption.dataset.selected == "true") ? xOption.className.replace("_off", "_on") : xOption.className.replace("_on", "_off");
        } else {
            this.setOption(sOptName, true);
            for (let sOptName of xOption.dataset.linked_ids.split("|")) {
                this.setOption(sOptName, false);
            }
        }
    }

    setOption (sOptName, bValue) {
        let xOption = document.getElementById(sOptName);
        xOption.dataset.selected = bValue;
        xOption.className = (xOption.dataset.selected == "true") ? xOption.className.replace("_off", "_on") : xOption.className.replace("_on", "_off");
    }

    reset () {
        this.resetProgressBar();
        for (let xOption of document.getElementsByClassName("grammalecte_tf_option")) {
            xOption.dataset.selected = xOption.dataset.default;
            xOption.className = (xOption.dataset.selected == "true") ? xOption.className.replace("_off", "_on") : xOption.className.replace("_on", "_off");
            if (xOption.id.startsWith("o_group_")) {
                this.switchGroup(xOption.id);
            }
        }
    }

    resetProgressBar () {
        document.getElementById('grammalecte_tf_progressbar').value = 0;
        document.getElementById('grammalecte_tf_time_res').textContent = "";
    }

    setOptions (oOptions) {
        if (oOptions.hasOwnProperty("tf_options")) {
            oOptions = oOptions.tf_options;
        }
        for (let xOption of document.getElementsByClassName("grammalecte_tf_option")) {
            //console.log(xOption.id + " > " + oOptions.hasOwnProperty(xOption.id) + ": " + oOptions[xOption.id] + " [" + xOption.dataset.default + "]");
            xOption.dataset.selected = (oOptions.hasOwnProperty(xOption.id)) ? oOptions[xOption.id] : xOption.dataset.default;
            xOption.className = (xOption.dataset.selected == "true") ? xOption.className.replace("_off", "_on") : xOption.className.replace("_on", "_off");
            if (document.getElementById("res_"+xOption.id) !== null) {
                document.getElementById("res_"+xOption.id).textContent = "";
            }
            if (xOption.id.startsWith("o_group_")) {
                this.switchGroup(xOption.id);
            }
        }
    }

    saveOptions () {
        let oOptions = {};
        for (let xOption of document.getElementsByClassName("grammalecte_tf_option")) {
            oOptions[xOption.id] = (xOption.dataset.selected == "true");
            //console.log(xOption.id + ": " + xOption.checked);
        }
        browser.storage.local.set({"tf_options": oOptions});
    }

    isSelected (sOptName) {
        if (document.getElementById(sOptName)) {
            return (document.getElementById(sOptName).dataset.selected === "true");
        }
        return false;
    }

    apply () {
        try {
            const t0 = Date.now();
            //window.setCursor("wait"); // change pointer
            this.resetProgressBar();
            let sText = this.xTextArea.value;
            document.getElementById('grammalecte_tf_progressbar').max = 7;
            let n1 = 0, n2 = 0, n3 = 0, n4 = 0, n5 = 0, n6 = 0, n7 = 0;
            
            // Restructuration
            if (this.isSelected("o_group_struct")) {
                if (this.isSelected("o_remove_hyphens_at_end_of_paragraphs")) {
                    [sText, n1] = this.removeHyphenAtEndOfParagraphs(sText);
                    document.getElementById('res_o_remove_hyphens_at_end_of_paragraphs').textContent = n1;
                }
                if (this.isSelected("o_merge_contiguous_paragraphs")) {
                    [sText, n1] = this.mergeContiguousParagraphs(sText);
                    document.getElementById('res_o_merge_contiguous_paragraphs').textContent = n1;
                }
                this.setOption("o_group_struct", false);
                this.switchGroup("o_group_struct");
            }
            document.getElementById('grammalecte_tf_progressbar').value = 1;

            // espaces surnuméraires
            if (this.isSelected("o_group_ssp")) {
                if (this.isSelected("o_end_of_paragraph")) {
                    [sText, n1] = this.formatText(sText, "end_of_paragraph");
                    document.getElementById('res_o_end_of_paragraph').textContent = n1;
                }
                if (this.isSelected("o_between_words")) {
                    [sText, n1] = this.formatText(sText, "between_words");
                    document.getElementById('res_o_between_words').textContent = n1;
                }
                if (this.isSelected("o_start_of_paragraph")) {
                    [sText, n1] = this.formatText(sText, "start_of_paragraph");
                    document.getElementById('res_o_start_of_paragraph').textContent = n1;
                }
                if (this.isSelected("o_before_punctuation")) {
                    [sText, n1] = this.formatText(sText, "before_punctuation");
                    document.getElementById('res_o_before_punctuation').textContent = n1;
                }
                if (this.isSelected("o_within_parenthesis")) {
                    [sText, n1] = this.formatText(sText, "within_parenthesis");
                    document.getElementById('res_o_within_parenthesis').textContent = n1;
                }
                if (this.isSelected("o_within_square_brackets")) {
                    [sText, n1] = this.formatText(sText, "within_square_brackets");
                    document.getElementById('res_o_within_square_brackets').textContent = n1;
                }
                if (this.isSelected("o_within_quotation_marks")) {
                    [sText, n1] = this.formatText(sText, "within_quotation_marks");
                    document.getElementById('res_o_within_quotation_marks').textContent = n1;
                }
                this.setOption("o_group_ssp", false);
                this.switchGroup("o_group_ssp");
            }
            document.getElementById('grammalecte_tf_progressbar').value = 2;

            // espaces typographiques
            if (this.isSelected("o_group_nbsp")) {
                if (this.isSelected("o_nbsp_before_punctuation")) {
                    [sText, n1] = this.formatText(sText, "nbsp_before_punctuation");
                    [sText, n2] = this.formatText(sText, "nbsp_repair");
                    document.getElementById('res_o_nbsp_before_punctuation').textContent = n1 - n2;
                }
                if (this.isSelected("o_nbsp_within_quotation_marks")) {
                    [sText, n1] = this.formatText(sText, "nbsp_within_quotation_marks");
                    document.getElementById('res_o_nbsp_within_quotation_marks').textContent = n1;
                }
                if (this.isSelected("o_nbsp_before_symbol")) {
                    [sText, n1] = this.formatText(sText, "nbsp_before_symbol");
                    document.getElementById('res_o_nbsp_before_symbol').textContent = n1;
                }
                if (this.isSelected("o_nbsp_within_numbers")) {
                    [sText, n1] = this.formatText(sText, "nbsp_within_numbers");
                    document.getElementById('res_o_nbsp_within_numbers').textContent = n1;
                }
                if (this.isSelected("o_nbsp_before_units")) {
                    [sText, n1] = this.formatText(sText, "nbsp_before_units");
                    document.getElementById('res_o_nbsp_before_units').textContent = n1;
                }
                this.setOption("o_group_nbsp", false);
                this.switchGroup("o_group_nbsp");
            }
            document.getElementById('grammalecte_tf_progressbar').value = 3;

            // espaces manquants
            if (this.isSelected("o_group_typo")) {
                if (this.isSelected("o_ts_units")) {
                    [sText, n1] = this.formatText(sText, "ts_units");
                    document.getElementById('res_o_ts_units').textContent = n1;
                }
            }
            if (this.isSelected("o_group_space")) {
                if (this.isSelected("o_add_space_after_punctuation")) {
                    [sText, n1] = this.formatText(sText, "add_space_after_punctuation");
                    [sText, n2] = this.formatText(sText, "add_space_repair");
                    document.getElementById('res_o_add_space_after_punctuation').textContent = n1 - n2;
                }
                if (this.isSelected("o_add_space_around_hyphens")) {
                    [sText, n1] = this.formatText(sText, "add_space_around_hyphens");
                    document.getElementById('res_o_add_space_around_hyphens').textContent = n1;
                }
                this.setOption("o_group_space", false);
                this.switchGroup("o_group_space");
            }
            document.getElementById('grammalecte_tf_progressbar').value = 4;

            // suppression
            if (this.isSelected("o_group_delete")) {
                if (this.isSelected("o_erase_non_breaking_hyphens")) {
                    [sText, n1] = this.formatText(sText, "erase_non_breaking_hyphens");
                    document.getElementById('res_o_erase_non_breaking_hyphens').textContent = n1;
                }
                this.setOption("o_group_delete", false);
                this.switchGroup("o_group_delete");
            }
            document.getElementById('grammalecte_tf_progressbar').value = 5;

            // signes typographiques
            if (this.isSelected("o_group_typo")) {
                if (this.isSelected("o_ts_apostrophe")) {
                    [sText, n1] = this.formatText(sText, "ts_apostrophe");
                    document.getElementById('res_o_ts_apostrophe').textContent = n1;
                }
                if (this.isSelected("o_ts_ellipsis")) {
                    [sText, n1] = this.formatText(sText, "ts_ellipsis");
                    document.getElementById('res_o_ts_ellipsis').textContent = n1;
                }
                if (this.isSelected("o_ts_dash_start")) {
                    if (this.isSelected("o_ts_m_dash_start")) {
                        [sText, n1] = this.formatText(sText, "ts_m_dash_start");
                    } else {
                        [sText, n1] = this.formatText(sText, "ts_n_dash_start");
                    }
                    document.getElementById('res_o_ts_dash_start').textContent = n1;
                }
                if (this.isSelected("o_ts_dash_middle")) {
                    if (this.isSelected("o_ts_m_dash_middle")) {
                        [sText, n1] = this.formatText(sText, "ts_m_dash_middle");
                    } else {
                        [sText, n1] = this.formatText(sText, "ts_n_dash_middle");
                    }
                    document.getElementById('res_o_ts_dash_middle').textContent = n1;
                }
                if (this.isSelected("o_ts_quotation_marks")) {
                    [sText, n1] = this.formatText(sText, "ts_quotation_marks");
                    document.getElementById('res_o_ts_quotation_marks').textContent = n1;
                }
                if (this.isSelected("o_ts_spell")) {
                    [sText, n1] = this.formatText(sText, "ts_spell");
                    document.getElementById('res_o_ts_spell').textContent = n1;
                }
                if (this.isSelected("o_ts_ligature")) {
                    // ligatures typographiques : fi, fl, ff, ffi, ffl, ft, st
                    if (this.isSelected("o_ts_ligature_do")) {
                        if (this.isSelected("o_ts_ligature_ffi")) {
                            [sText, n1] = this.formatText(sText, "ts_ligature_ffi_do");
                        }
                        if (this.isSelected("o_ts_ligature_ffl")) {
                            [sText, n2] = this.formatText(sText, "ts_ligature_ffl_do");
                        }
                        if (this.isSelected("o_ts_ligature_fi")) {
                            [sText, n3] = this.formatText(sText, "ts_ligature_fi_do");
                        }
                        if (this.isSelected("o_ts_ligature_fl")) {
                            [sText, n4] = this.formatText(sText, "ts_ligature_fl_do");
                        }
                        if (this.isSelected("o_ts_ligature_ff")) {
                            [sText, n5] = this.formatText(sText, "ts_ligature_ff_do");
                        }
                        if (this.isSelected("o_ts_ligature_ft")) {
                            [sText, n6] = this.formatText(sText, "ts_ligature_ft_do");
                        }
                        if (this.isSelected("o_ts_ligature_st")) {
                            [sText, n7] = this.formatText(sText, "ts_ligature_st_do");
                        }
                    }
                    if (this.isSelected("o_ts_ligature_undo")) {
                        if (this.isSelected("o_ts_ligature_ffi")) {
                            [sText, n1] = this.formatText(sText, "ts_ligature_ffi_undo");
                        }
                        if (this.isSelected("o_ts_ligature_ffl")) {
                            [sText, n2] = this.formatText(sText, "ts_ligature_ffl_undo");
                        }
                        if (this.isSelected("o_ts_ligature_fi")) {
                            [sText, n3] = this.formatText(sText, "ts_ligature_fi_undo");
                        }
                        if (this.isSelected("o_ts_ligature_fl")) {
                            [sText, n4] = this.formatText(sText, "ts_ligature_fl_undo");
                        }
                        if (this.isSelected("o_ts_ligature_ff")) {
                            [sText, n5] = this.formatText(sText, "ts_ligature_ff_undo");
                        }
                        if (this.isSelected("o_ts_ligature_ft")) {
                            [sText, n6] = this.formatText(sText, "ts_ligature_ft_undo");
                        }
                        if (this.isSelected("o_ts_ligature_st")) {
                            [sText, n7] = this.formatText(sText, "ts_ligature_st_undo");
                        }
                    }
                    document.getElementById('res_o_ts_ligature').textContent = n1 + n2 + n3 + n4 + n5 + n6 + n7;
                }
                this.setOption("o_group_typo", false);
                this.switchGroup("o_group_typo");
            }
            document.getElementById('grammalecte_tf_progressbar').value = 6;

            // divers
            if (this.isSelected("o_group_misc")) {
                if (this.isSelected("o_ordinals_no_exponant")) {
                    if (this.isSelected("o_ordinals_exponant")) {
                        [sText, n1] = this.formatText(sText, "ordinals_exponant");
                    } else {
                        [sText, n1] = this.formatText(sText, "ordinals_no_exponant");
                    }
                    document.getElementById('res_o_ordinals_no_exponant').textContent = n1;
                }
                if (this.isSelected("o_etc")) {
                    [sText, n1] = this.formatText(sText, "etc");
                    document.getElementById('res_o_etc').textContent = n1;
                }
                if (this.isSelected("o_missing_hyphens")) {
                    [sText, n1] = this.formatText(sText, "missing_hyphens");
                    document.getElementById('res_o_missing_hyphens').textContent = n1;
                }
                if (this.isSelected("o_ma_word")) {
                    [sText, n1] = this.formatText(sText, "ma_word");
                    if (this.isSelected("o_ma_1letter_lowercase")) {
                        [sText, n1] = this.formatText(sText, "ma_1letter_lowercase");
                        if (this.isSelected("o_ma_1letter_uppercase")) {
                            [sText, n1] = this.formatText(sText, "ma_1letter_uppercase");
                        }
                    }
                    document.getElementById('res_o_ma_word').textContent = n1;
                }
                this.setOption("o_group_misc", false);
                this.switchGroup("o_group_misc");
            }
            document.getElementById('grammalecte_tf_progressbar').value = document.getElementById('grammalecte_tf_progressbar').max;
            // end of processing

            //window.setCursor("auto"); // restore pointer

            const t1 = Date.now();
            document.getElementById('grammalecte_tf_time_res').textContent = this.getTimeRes((t1-t0)/1000);
            this.xTextArea.value = sText;
        }
        catch (e) {
            showError(e);
        }
    }

    formatText (sText, sOptName) {
        let nCount = 0;
        try {
            if (!oReplTable.hasOwnProperty(sOptName)) {
                console.log("# Error. TF: there is no option “" + sOptName+ "”.");
                return [sText, nCount];
            }
            for (let [zRgx, sRep] of oReplTable[sOptName]) {
                nCount += (sText.match(zRgx) || []).length;
                sText = sText.replace(zRgx, sRep);
            }
        }
        catch (e) {
            showError(e);
        }
        return [sText, nCount];
    }

    removeHyphenAtEndOfParagraphs (sText) {
        let nCount = (sText.match(/-[  ]*\n/gm) || []).length;
        sText = sText.replace(/-[  ]*\n/gm, "");
        return [sText, nCount];
    }

    mergeContiguousParagraphs (sText) {
        let nCount = 0;
        sText = sText.replace(/^[  ]+$/gm, ""); // clear empty paragraphs
        let s = "";
        for (let sParagraph of this.getParagraph(sText)) {
            if (sParagraph === "") {
                s += "\n";
            } else {
                s += sParagraph + " ";
                nCount += 1;
            }
        }
        s = s.replace(/  +/gm, " ").replace(/ $/gm, "");
        return [s, nCount];
    }

    * getParagraph (sText) {
        // generator: returns paragraphs of text
        let iStart = 0;
        let iEnd = 0;
        while ((iEnd = sText.indexOf("\n", iStart)) !== -1) {
            yield sText.slice(iStart, iEnd);
            iStart = iEnd + 1;
        }
        yield sText.slice(iStart);
    }

    getTimeRes (n) {
        // returns duration in seconds as string
        if (n < 10) {
            return n.toFixed(3).toString() + " s";
        }
        if (n < 100) {
            return n.toFixed(2).toString() + " s";
        }
        if (n < 1000) {
            return n.toFixed(1).toString() + " s";
        }
        return n.toFixed().toString() + " s";
    }
}

Added gc_lang/fr/webext/gce_sharedworker.js version [214049ab98].































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
/*
    WORKER:
    https://developer.mozilla.org/en-US/docs/Web/API/Worker
    https://developer.mozilla.org/en-US/docs/Web/API/DedicatedWorkerGlobalScope


    JavaScript sucks.
    No module available in WebExtension at the moment! :(
    No require, no import/export.

    In Worker, we have importScripts() which imports everything in this scope.

    In order to use the same base of code with XUL-addon for Thunderbird and SDK-addon for Firefox,
    all modules have been “objectified”. And while they are still imported via “require”
    in the previous extensions, they are loaded as background scripts in WebExtension sharing
    the same memory space…

    When JavaScript become a modern language, “deobjectify” the modules…

    ATM, import/export are not available by default:
    — Chrome 60 – behind the Experimental Web Platform flag in chrome:flags.
    — Firefox 54 – behind the dom.moduleScripts.enabled setting in about:config.
    — Edge 15 – behind the Experimental JavaScript Features setting in about:flags.

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import
    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export
*/

"use strict";


console.log("GC Engine SharedWorker [start]");
//console.log(self);

importScripts("grammalecte/helpers.js");
importScripts("grammalecte/str_transform.js");
importScripts("grammalecte/ibdawg.js");
importScripts("grammalecte/text.js");
importScripts("grammalecte/tokenizer.js");
importScripts("grammalecte/fr/conj.js");
importScripts("grammalecte/fr/mfsp.js");
importScripts("grammalecte/fr/phonet.js");
importScripts("grammalecte/fr/cregex.js");
importScripts("grammalecte/fr/gc_options.js");
importScripts("grammalecte/fr/gc_rules.js");
importScripts("grammalecte/fr/gc_engine.js");
importScripts("grammalecte/fr/lexicographe.js");
importScripts("grammalecte/tests.js");
/*
    Warning.
    Initialization can’t be completed at startup of the worker,
    for we need the path of the extension to load data stored in JSON files.
    This path is retrieved in background.js and passed with the event “init”.
*/


/*
    Message Event Object
    https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent
*/

let xPort = null;

function createResponse (sActionDone, result, dInfo, bError=false) {
    return {
        "sActionDone": sActionDone,
        "result": result, // can be of any type
        "dInfo": dInfo,
        "bError": bError
    };
}

function createErrorResult (e, sDescr="no description") {
    return {
        "sType": "error",
        "sDescription": sDescr,
        "sMessage": e.fileName + "\n" + e.name + "\nline: " + e.lineNumber + "\n" + e.message
    };
}

function showData (e) {
    for (let sParam in e) {
        console.log(sParam);
        console.log(e[sParam]);
    }
}

onconnect = function (e) {
    console.log("[Sharedworker] START CONNECTION");
    xPort = e.ports[0];

    xPort.onmessage = function (e) {
        console.log("[Sharedworker] ONMESSAGE");
        let {sCommand, dParam, dInfo} = e.data;
        console.log(e.data);
        switch (sCommand) {
            case "init":
                init(dParam.sExtensionPath, dParam.sOptions, dParam.sContext, dInfo);
                break;
            case "parse":
                parse(dParam.sText, dParam.sCountry, dParam.bDebug, dParam.bContext, dInfo);
                break;
            case "parseAndSpellcheck":
                parseAndSpellcheck(dParam.sText, dParam.sCountry, dParam.bDebug, dParam.bContext, dInfo);
                break;
            case "getOptions":
                getOptions(dInfo);
                break;
            case "getDefaultOptions":
                getDefaultOptions(dInfo);
                break;
            case "setOptions":
                setOptions(dParam.sOptions, dInfo);
                break;
            case "setOption":
                setOption(dParam.sOptName, dParam.bValue, dInfo);
                break;
            case "resetOptions":
                resetOptions(dInfo);
                break;
            case "textToTest":
                textToTest(dParam.sText, dParam.sCountry, dParam.bDebug, dParam.bContext, dInfo);
                break;
            case "fullTests":
                fullTests('{"nbsp":true, "esp":true, "unit":true, "num":true}', dInfo);
                break;
            case "getListOfTokens":
                getListOfTokens(dParam.sText, dInfo);
                break;
            default:
                console.log("Unknown command: " + sCommand);
                showData(e.data);
        }
    }
    //xPort.start();
}

let bInitDone = false;

let oDict = null;
let oTokenizer = null;
let oLxg = null;
let oTest = null;


function init (sExtensionPath, sGCOptions="", sContext="JavaScript", dInfo={}) {
    try {
        if (!bInitDone) {
            console.log("[Sharedworker] Loading… Extension path: " + sExtensionPath);
            conj.init(helpers.loadFile(sExtensionPath + "/grammalecte/fr/conj_data.json"));
            phonet.init(helpers.loadFile(sExtensionPath + "/grammalecte/fr/phonet_data.json"));
            mfsp.init(helpers.loadFile(sExtensionPath + "/grammalecte/fr/mfsp_data.json"));
            console.log("[Sharedworker] Modules have been initialized…");
            gc_engine.load(sContext, sExtensionPath+"grammalecte/_dictionaries");
            oDict = gc_engine.getDictionary();
            oTest = new TestGrammarChecking(gc_engine, sExtensionPath+"/grammalecte/fr/tests_data.json");
            oLxg = new Lexicographe(oDict);
            if (sGCOptions !== "") {
                gc_engine.setOptions(helpers.objectToMap(JSON.parse(sGCOptions)));
            }
            oTokenizer = new Tokenizer("fr");
            //tests();
            bInitDone = true;
        } else {
            console.log("[Sharedworker] Already initialized…")
        }
        // we always retrieve options from the gc_engine, for setOptions filters obsolete options
        xPort.postMessage(createResponse("init", gc_engine.getOptions().gl_toString(), dInfo));
    }
    catch (e) {
        helpers.logerror(e);
        xPort.postMessage(createResponse("init", createErrorResult(e, "init failed"), dInfo, true));
    }
}

function parse (sText, sCountry, bDebug, bContext, dInfo={}) {
    let aGrammErr = gc_engine.parse(sText, sCountry, bDebug, bContext);
    xPort.postMessage({sActionDone: "parse", result: aGrammErr, dInfo: dInfo});
}

function parseAndSpellcheck (sText, sCountry, bDebug, bContext, dInfo={}) {
    let aGrammErr = gc_engine.parse(sText, sCountry, bDebug, bContext);
    let aSpellErr = oTokenizer.getSpellingErrors(sText, oDict);
    xPort.postMessage(createResponse("parseAndSpellcheck", {aGrammErr: aGrammErr, aSpellErr: aSpellErr}, dInfo));
}

function getOptions (dInfo={}) {
    xPort.postMessage(createResponse("getOptions", gc_engine.getOptions().gl_toString(), dInfo));
}

function getDefaultOptions (dInfo={}) {
    xPort.postMessage(createResponse("getDefaultOptions", gc_engine.getDefaultOptions().gl_toString(), dInfo));
}

function setOptions (sGCOptions, dInfo={}) {
    gc_engine.setOptions(helpers.objectToMap(JSON.parse(sGCOptions)));
    xPort.postMessage(createResponse("setOptions", gc_engine.getOptions().gl_toString(), dInfo));
}

function setOption (sOptName, bValue, dInfo={}) {
    gc_engine.setOptions(new Map([ [sOptName, bValue] ]));
    xPort.postMessage(createResponse("setOption", gc_engine.getOptions().gl_toString(), dInfo));
}

function resetOptions (dInfo={}) {
    gc_engine.resetOptions();
    xPort.postMessage(createResponse("resetOptions", gc_engine.getOptions().gl_toString(), dInfo));
}

function tests () {
    console.log(conj.getConj("devenir", ":E", ":2s"));
    console.log(mfsp.getMasForm("emmerdeuse", true));
    console.log(mfsp.getMasForm("pointilleuse", false));
    console.log(phonet.getSimil("est"));
    let aRes = gc_engine.parse("Je suit...");
    for (let oErr of aRes) {
        console.log(text.getReadableError(oErr));
    }
}

function textToTest (sText, sCountry, bDebug, bContext, dInfo={}) {
    if (!gc_engine || !oDict) {
        xPort.postMessage(createResponse("textToTest", "# Grammar checker or dictionary not loaded.", dInfo));
        return;
    }
    let aGrammErr = gc_engine.parse(sText, sCountry, bDebug, bContext);
    let sMsg = "";
    for (let oErr of aGrammErr) {
        sMsg += text.getReadableError(oErr) + "\n";
    }
    xPort.postMessage(createResponse("textToTest", sMsg, dInfo));
}

function fullTests (sGCOptions="", dInfo={}) {
    if (!gc_engine || !oDict) {
        xPort.postMessage(createResponse("fullTests", "# Grammar checker or dictionary not loaded.", dInfo));
        return;
    }
    let dMemoOptions = gc_engine.getOptions();
    if (sGCOptions) {
        gc_engine.setOptions(helpers.objectToMap(JSON.parse(sGCOptions)));
    }
    let sMsg = "";
    for (let sRes of oTest.testParse()) {
        sMsg += sRes + "\n";
        console.log(sRes);
    }
    gc_engine.setOptions(dMemoOptions);
    xPort.postMessage(createResponse("fullTests", sMsg, dInfo));
}


// Lexicographer

function getListOfTokens (sText, dInfo={}) {
    try {
        let aElem = [];
        let aRes = null;
        for (let oToken of oTokenizer.genTokens(sText)) {
            aRes = oLxg.getInfoForToken(oToken);
            if (aRes) {
                aElem.push(aRes);
            }
        }
        xPort.postMessage(createResponse("getListOfTokens", aElem, dInfo));
    }
    catch (e) {
        helpers.logerror(e);
        xPort.postMessage(createResponse("getListOfTokens", createErrorResult(e, "no tokens"), dInfo, true));
    }
}

Added gc_lang/fr/webext/gce_worker.js version [285ccf74ab].

























































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
/*
    WORKER:
    https://developer.mozilla.org/en-US/docs/Web/API/Worker
    https://developer.mozilla.org/en-US/docs/Web/API/DedicatedWorkerGlobalScope


    JavaScript sucks.
    No module available in WebExtension at the moment! :(
    No require, no import/export.

    In Worker, we have importScripts() which imports everything in this scope.

    In order to use the same base of code with XUL-addon for Thunderbird and SDK-addon for Firefox,
    all modules have been “objectified”. And while they are still imported via “require”
    in the previous extensions, they are loaded as background scripts in WebExtension sharing
    the same memory space…

    When JavaScript become a modern language, “deobjectify” the modules…

    ATM, import/export are not available by default:
    — Chrome 60 – behind the Experimental Web Platform flag in chrome:flags.
    — Firefox 54 – behind the dom.moduleScripts.enabled setting in about:config.
    — Edge 15 – behind the Experimental JavaScript Features setting in about:flags.

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import
    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export
*/

"use strict";


//console.log("[Worker] GC Engine Worker [start]");
//console.log(self);

importScripts("grammalecte/helpers.js");
importScripts("grammalecte/str_transform.js");
importScripts("grammalecte/ibdawg.js");
importScripts("grammalecte/text.js");
importScripts("grammalecte/tokenizer.js");
importScripts("grammalecte/fr/conj.js");
importScripts("grammalecte/fr/mfsp.js");
importScripts("grammalecte/fr/phonet.js");
importScripts("grammalecte/fr/cregex.js");
importScripts("grammalecte/fr/gc_options.js");
importScripts("grammalecte/fr/gc_rules.js");
importScripts("grammalecte/fr/gc_engine.js");
importScripts("grammalecte/fr/lexicographe.js");
importScripts("grammalecte/tests.js");
/*
    Warning.
    Initialization can’t be completed at startup of the worker,
    for we need the path of the extension to load data stored in JSON files.
    This path is retrieved in background.js and passed with the event “init”.
*/


function createResponse (sActionDone, result, dInfo, bEnd, bError=false) {
    return {
        "sActionDone": sActionDone,
        "result": result, // can be of any type
        "dInfo": dInfo,
        "bEnd": bEnd,
        "bError": bError
    };
}

function createErrorResult (e, sDescr="no description") {
    return {
        "sType": "error",
        "sDescription": sDescr,
        "sMessage": e.fileName + "\n" + e.name + "\nline: " + e.lineNumber + "\n" + e.message
    };
}

function showData (e) {
    for (let sParam in e) {
        console.log(sParam);
        console.log(e[sParam]);
    }
}


/*
    Message Event Object
    https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent
*/
onmessage = function (e) {
    let {sCommand, dParam, dInfo} = e.data;
    switch (sCommand) {
        case "init":
            init(dParam.sExtensionPath, dParam.sOptions, dParam.sContext, dInfo);
            break;
        case "parse":
            parse(dParam.sText, dParam.sCountry, dParam.bDebug, dParam.bContext, dInfo);
            break;
        case "parseAndSpellcheck":
            parseAndSpellcheck(dParam.sText, dParam.sCountry, dParam.bDebug, dParam.bContext, dInfo);
            break;
        case "parseAndSpellcheck1":
            parseAndSpellcheck1(dParam.sText, dParam.sCountry, dParam.bDebug, dParam.bContext, dInfo);
        case "getOptions":
            getOptions(dInfo);
            break;
        case "getDefaultOptions":
            getDefaultOptions(dInfo);
            break;
        case "setOptions":
            setOptions(dParam.sOptions, dInfo);
            break;
        case "setOption":
            setOption(dParam.sOptName, dParam.bValue, dInfo);
            break;
        case "resetOptions":
            resetOptions(dInfo);
            break;
        case "textToTest":
            textToTest(dParam.sText, dParam.sCountry, dParam.bDebug, dParam.bContext, dInfo);
            break;
        case "fullTests":
            fullTests(dInfo);
            break;
        case "getListOfTokens":
            getListOfTokens(dParam.sText, dInfo);
            break;
        default:
            console.log("[Worker] Unknown command: " + sCommand);
            showData(e.data);
    }
}



let bInitDone = false;

let oDict = null;
let oTokenizer = null;
let oLxg = null;
let oTest = null;


/*
    Technical note:
    This worker don’t work as a PromiseWorker (which returns a promise),  so when we send request
    to this worker, we can’t wait the return of the answer just after the request made.
    The answer is received by the background in another function (onmessage).
    That’s why the full text to analyze is send in one block, but analyse is returned paragraph
    by paragraph.
*/

function init (sExtensionPath, dOptions=null, sContext="JavaScript", dInfo={}) {
    try {
        if (!bInitDone) {
            //console.log("[Worker] Loading… Extension path: " + sExtensionPath);
            conj.init(helpers.loadFile(sExtensionPath + "/grammalecte/fr/conj_data.json"));
            phonet.init(helpers.loadFile(sExtensionPath + "/grammalecte/fr/phonet_data.json"));
            mfsp.init(helpers.loadFile(sExtensionPath + "/grammalecte/fr/mfsp_data.json"));
            //console.log("[Worker] Modules have been initialized…");
            gc_engine.load(sContext, sExtensionPath+"grammalecte/_dictionaries");
            oDict = gc_engine.getDictionary();
            oTest = new TestGrammarChecking(gc_engine, sExtensionPath+"/grammalecte/fr/tests_data.json");
            oLxg = new Lexicographe(oDict);
            if (dOptions !== null) {
                gc_engine.setOptions(dOptions);
            }
            oTokenizer = new Tokenizer("fr");
            //tests();
            bInitDone = true;
        } else {
            console.log("[Worker] Already initialized…")
        }
        // we always retrieve options from the gc_engine, for setOptions filters obsolete options
        postMessage(createResponse("init", gc_engine.getOptions(), dInfo, true));
    }
    catch (e) {
        helpers.logerror(e);
        postMessage(createResponse("init", createErrorResult(e, "init failed"), dInfo, true, true));
    }
}


function parse (sText, sCountry, bDebug, bContext, dInfo={}) {
    for (let sParagraph of text.getParagraph(sText)) {
        let aGrammErr = gc_engine.parse(sParagraph, sCountry, bDebug, bContext);
        postMessage(createResponse("parse", aGrammErr, dInfo, false));
    }
    postMessage(createResponse("parse", null, dInfo, true));
}

function parseAndSpellcheck (sText, sCountry, bDebug, bContext, dInfo={}) {
    let i = 0;
    for (let sParagraph of text.getParagraph(sText)) {
        let aGrammErr = gc_engine.parse(sParagraph, sCountry, bDebug, bContext);
        let aSpellErr = oTokenizer.getSpellingErrors(sParagraph, oDict);
        postMessage(createResponse("parseAndSpellcheck", {sParagraph: sParagraph, iParaNum: i, aGrammErr: aGrammErr, aSpellErr: aSpellErr}, dInfo, false));
        i += 1;
    }
    postMessage(createResponse("parseAndSpellcheck", null, dInfo, true));
}

function parseAndSpellcheck1 (sParagraph, sCountry, bDebug, bContext, dInfo={}) {
    let aGrammErr = gc_engine.parse(sParagraph, sCountry, bDebug, bContext);
    let aSpellErr = oTokenizer.getSpellingErrors(sParagraph, oDict);
    postMessage(createResponse("parseAndSpellcheck1", {sParagraph: sParagraph, aGrammErr: aGrammErr, aSpellErr: aSpellErr}, dInfo, true));
}

function getOptions (dInfo={}) {
    postMessage(createResponse("getOptions", gc_engine.getOptions(), dInfo, true));
}

function getDefaultOptions (dInfo={}) {
    postMessage(createResponse("getDefaultOptions", gc_engine.getDefaultOptions(), dInfo, true));
}

function setOptions (dOptions, dInfo={}) {
    gc_engine.setOptions(dOptions);
    postMessage(createResponse("setOptions", gc_engine.getOptions(), dInfo, true));
}

function setOption (sOptName, bValue, dInfo={}) {
    console.log(sOptName+": "+bValue);
    gc_engine.setOptions(new Map([ [sOptName, bValue] ]));
    postMessage(createResponse("setOption", gc_engine.getOptions(), dInfo, true));
}

function resetOptions (dInfo={}) {
    gc_engine.resetOptions();
    postMessage(createResponse("resetOptions", gc_engine.getOptions(), dInfo, true));
}

function tests () {
    console.log(conj.getConj("devenir", ":E", ":2s"));
    console.log(mfsp.getMasForm("emmerdeuse", true));
    console.log(mfsp.getMasForm("pointilleuse", false));
    console.log(phonet.getSimil("est"));
    let aRes = gc_engine.parse("Je suit...");
    for (let oErr of aRes) {
        console.log(text.getReadableError(oErr));
    }
}

function textToTest (sText, sCountry, bDebug, bContext, dInfo={}) {
    if (!gc_engine || !oDict) {
        postMessage(createResponse("textToTest", "# Grammar checker or dictionary not loaded.", dInfo, true));
        return;
    }
    let aGrammErr = gc_engine.parse(sText, sCountry, bDebug, bContext);
    let sMsg = "";
    for (let oErr of aGrammErr) {
        sMsg += text.getReadableError(oErr) + "\n";
    }
    postMessage(createResponse("textToTest", sMsg, dInfo, true));
}

function fullTests (dInfo={}) {
    if (!gc_engine || !oDict) {
        postMessage(createResponse("fullTests", "# Grammar checker or dictionary not loaded.", dInfo, true));
        return;
    }
    let dMemoOptions = gc_engine.getOptions();
    let dTestOptions = gc_engine.getDefaultOptions();
    dTestOptions.set("nbsp", true);
    dTestOptions.set("esp", true);
    dTestOptions.set("unit", true);
    dTestOptions.set("num", true);
    gc_engine.setOptions(dTestOptions);
    let sMsg = "";
    for (let sRes of oTest.testParse()) {
        sMsg += sRes + "\n";
        console.log(sRes);
    }
    gc_engine.setOptions(dMemoOptions);
    postMessage(createResponse("fullTests", sMsg, dInfo, true));
}



// Lexicographer

function getListOfTokens (sText, dInfo={}) {
    try {
        for (let sParagraph of text.getParagraph(sText)) {
            if (sParagraph.trim() !== "") {
                let aElem = [];
                let aRes = null;
                for (let oToken of oTokenizer.genTokens(sParagraph)) {
                    aRes = oLxg.getInfoForToken(oToken);
                    if (aRes) {
                        aElem.push(aRes);
                    }
                }
                postMessage(createResponse("getListOfTokens", aElem, dInfo, false));
            }
        }
        postMessage(createResponse("getListOfTokens", null, dInfo, true));
    }
    catch (e) {
        helpers.logerror(e);
        postMessage(createResponse("getListOfTokens", createErrorResult(e, "no tokens"), dInfo, true, true));
    }
}

Added gc_lang/fr/webext/img/Algoo_logo.png version [59954b3904].

cannot compute difference between binary files

Added gc_lang/fr/webext/img/LaMouette.png version [6e35d5964a].

cannot compute difference between binary files

Added gc_lang/fr/webext/img/contextmenu.png version [8fca438919].

cannot compute difference between binary files

Added gc_lang/fr/webext/img/lines.png version [e4f15f2e8d].

cannot compute difference between binary files

Added gc_lang/fr/webext/img/logo-16.png version [dcb1bf8ae0].

cannot compute difference between binary files

Added gc_lang/fr/webext/img/logo-32.png version [99fca9dafd].

cannot compute difference between binary files

Added gc_lang/fr/webext/img/logo-48.png version [73a119e8c1].

cannot compute difference between binary files

Added gc_lang/fr/webext/img/logo-64.png version [53bd99349a].

cannot compute difference between binary files

Added gc_lang/fr/webext/img/logo-80.png version [17bf2efae3].

cannot compute difference between binary files

Added gc_lang/fr/webext/img/logo-96.png version [67db0fb78e].

cannot compute difference between binary files

Added gc_lang/fr/webext/img/logo120_text.png version [c438dd0680].

cannot compute difference between binary files

Added gc_lang/fr/webext/img/menu_button1.png version [226d976a40].

cannot compute difference between binary files

Added gc_lang/fr/webext/img/menu_button2.png version [6ae5543ec4].

cannot compute difference between binary files

Added gc_lang/fr/webext/img/selected_off_16.png version [42c40eb243].

cannot compute difference between binary files

Added gc_lang/fr/webext/img/selected_off_20.png version [ce002e975e].

cannot compute difference between binary files

Added gc_lang/fr/webext/img/selected_on_16.png version [ee38689376].

cannot compute difference between binary files

Added gc_lang/fr/webext/img/selected_on_20.png version [cca45b6c2f].

cannot compute difference between binary files

Added gc_lang/fr/webext/manifest.json version [8661684831].





































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
{
  "manifest_version": 2,
  "name": "Grammalecte [fr]",
  "short_name": "Grammalecte [fr]",
  "version": "0.6.0b",

  "applications": {
    "gecko": {
      "id": "French-GC@grammalecte.net",
      "strict_min_version": "55.0"
    }
  },

  "author": "Olivier R.",
  "homepage_url": "https://grammalecte.net",
  "description": "Correcteur grammatical pour le français.",

  "default_locale": "fr",

  "icons": { "16": "img/logo-16.png",
             "32": "img/logo-32.png",
             "48": "img/logo-48.png",
             "64": "img/logo-64.png",
             "80": "img/logo-80.png",
             "96": "img/logo-96.png" },

  "browser_action": {
    "default_icon": "img/logo-32.png",
    "default_popup": "panel/main.html",
    "default_title": "Grammalecte [fr]",
    "browser_style": false
  },

  "background": {
    "scripts": [
      "background.js"
    ]
  },

  "content_scripts": [
    {
      "matches": ["<all_urls>"],
      "exclude_matches": [
        "*://*.wikisource.org/*",
        "*://*.wikipedia.org/*",
        "*://*.wiktionary.org/*"
      ],
      "css": [
        "content_scripts/panel.css",
        "content_scripts/panel_tf.css",
        "content_scripts/panel_gc.css",
        "content_scripts/panel_lxg.css",
        "content_scripts/menu.css"
      ],
      "js": [
        "content_scripts/panel.js",
        "grammalecte/fr/textformatter.js",
        "content_scripts/panel_tf.js",
        "content_scripts/panel_gc.js",
        "content_scripts/panel_lxg.js",
        "content_scripts/menu.js",
        "content_scripts/init.js"
      ],
      "run_at": "document_end"
    },
    {
      "matches": [
        "*://*.wikisource.org/*",
        "*://*.wikipedia.org/*",
        "*://*.wiktionary.org/*"
      ],
      "css": [
        "content_scripts/panel.css",
        "content_scripts/panel_tf.css",
        "content_scripts/panel_gc.css",
        "content_scripts/panel_lxg.css",
        "content_scripts/menu.css"
      ],
      "js": [
        "content_scripts/panel.js",
        "grammalecte/fr/textformatter.js",
        "content_scripts/panel_tf.js",
        "content_scripts/panel_gc.js",
        "content_scripts/panel_lxg.js",
        "content_scripts/menu.js",
        "content_scripts/init.js"
      ],
      "run_at": "document_idle"
    }
  ],

  "commands": {
    "conjugueur_tab": {
      "suggested_key": {
        "default": "Ctrl+Shift+F6"
      },
      "description": "Ouvre le conjugueur dans un onglet"
    },
    "conjugueur_window": {
      "suggested_key": {
        "default": "Ctrl+Shift+F7"
      },
      "description": "Ouvre le conjugueur dans une fenêtre"
    }
  },

  "web_accessible_resources": [
    "grammalecte/_dictionaries/French.json",
    "grammalecte/fr/conj_data.json",
    "grammalecte/fr/mfsp_data.json",
    "grammalecte/fr/phonet_data.json",
    "grammalecte/fr/tests_data.json",
    "img/logo-16.png"
  ],

  "permissions": [
    "activeTab",
    "contextMenus",
    "storage"
  ],

  "chrome_settings_overrides": {
    "search_provider": {
      "name": "Grammalecte",
      "search_url": "https://www.dicollecte.org/dictionary.php?prj=fr&lemma={searchTerms}",
      "keyword": "disc",
      "favicon_url": "https://www.dicollecte.org/favicon.ico"
    }
  }
}

Added gc_lang/fr/webext/panel/conjugueur.css version [f7291c3c1c].





























































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/*
   CSS Document
   White
   Design par Olivier R.
*/

* { margin: 0; padding: 0; }
img { border: none; }


/* Generic classes */

.fleft {
    float: left;
}
.fright {
    float: right;
}
.center {
    text-align: center;
}
.right {
    text-align: right;
}
.left {
    text-align: left;
}
.justify {
    text-align: justify;
}
.hidden {
    display: none;
}

.clearer { 
    clear: both;
    font-size: 0;
    height: 0;
}

body {
    background: #FFFFFF url(../img/lines.png);
    font: normal 16px Tahoma, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", sans-serif;
    color: #505050;
    /*text-rendering: optimizeLegibility;*/
}

.mainflow {
    width: 600px;
    margin: 0 auto 0 auto;
}

.logo {
    position: absolute;
    background-color: #FFFFFF;
    border: 3px solid #F0F0F0;
    border-radius: 96px;
    padding: 4px 4px 0 4px;
}


/* MAIN ====================================================================== */

#main .inbox {
    width: 600px;
    margin: 20px auto 10px auto;
    padding: 10px 30px 30px 30px;
    background: #FFFFFF;
    border: 2px solid #F0F0F0;
    border-radius: 20px;
}

#main h1 {
    margin: 5px 0 2px 0;
    color: hsl(210, 50%, 50%);
    font: bold 30px Tahoma, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", sans-serif;
}
#main h2 {
    margin: 5px 0 2px 0;
    color: hsl(0, 50%, 50%);
    font: bold 16px Tahoma, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", sans-serif;
}
#main h3 {
    margin: 5px 0 2px 0;
    color: hsl(210, 50%, 50%);
    font: bold 14px Tahoma, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", sans-serif;
}

#main .container {
    display: flex;
    flex-direction: row;
    flex-wrap: nowrap;
    justify-content: center;
    align-items: flex-start;
}

#main .colonne {
    width: 280px;
    padding: 0 10px;
}

.colonne p {
    font-size: 12px;
}

/*.box {
    border-left: 2px solid #8BC5EF;
    border-bottom: 2px solid #8BC5EF;
    border-radius: 5px;
    padding: 0 0 2px 10px;
}*/

input#verb {
    display: inline-block;
    width: 230px;
    margin-left: 5px;
    padding: 5px 10px;
    border: 2px solid hsl(0, 0%, 80%);
    border-radius: 3px;
    height: 24px;
    background: transparent;
    font: normal 20px Tahoma, "Ubuntu Condensed";
    color: hsl(0, 0%, 30%);
}
input[placeholder]#verb {
    color: hsl(0, 0%, 70%);
}

#conjugate {
    display: inline-block;
    padding: 7px 10px;
    font-size: 20px;
    background-color: hsl(0, 30%, 30%);
    color: hsl(0, 30%, 60%);
    border-radius: 3px;
    text-transform: uppercase;
    text-align: center;
    text-decoration: none;
    cursor: pointer;
}
#conjugate:hover {
    background-color: hsl(0, 60%, 40%);
    color: hsl(0, 60%, 70%);
    box-shadow: 0 0 2px hsl(0, 60%, 50%);
}

#options {
    margin: 10px 0 0 5px;
    font-size: 16px;
    text-align: center;
}

#smallnote {
    margin: 10px 0 10px 0;
    font-size: 11px;
    color: hsl(0, 0%, 60%);
    text-align: center;
}

Added gc_lang/fr/webext/panel/conjugueur.html version [33a83d717b].































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
<!DOCTYPE HTML>
<html>
    <head>
        <link rel="stylesheet" type="text/css" href="conjugueur.css" />
        <title>Grammalecte · Conjugueur</title>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    </head>
    
    <body>
        <header>
            <div class="mainflow">
                <div class="logo" style="margin: -10px 0 0 0;">
                    <img src="../img/logo-96.png" alt="" />
                </div>
            </div>
        </header>

        <div id="main">
            <div class="inbox">

                <div class="right" style="margin: 10px 30px 0 0">
                    <input type="text" id="verb" name="verb" maxlength="40" value="" placeholder="entrez un verbe" autofocus />
                    <div id="conjugate">Conjuguer</div>
                </div>

                <h1 id="verb_title" class="center">&nbsp;</h1>
                <p id="info" class="center">&nbsp;</p>

                <p id="options">
                    <label for="oneg">Négative</label> <input type="checkbox" id="oneg" name="oneg" value="ON"  /> 
                    · <label for="oint">Interrogative</label> <input type="checkbox" id="oint" name="oint" value="ON"  />
                    · <label for="ofem">Féminin</label> <input type="checkbox" id="ofem" name="ofem" value="ON"  />
                    · <label id="opro_lbl" for="opro">Pronominal</label> <input type="checkbox" id="opro" name="opro" value="ON"  />
                    · <label id="otco_lbl" for="otco">Temps composés</label> <input type="checkbox" id="otco" name="otco" value="ON"  />
                </p>
                <p id="smallnote">❦</p>
                    
                <div class="clearer"></div>

                <!-- section 1 -->
                <div class="container">
                    <div class="colonne">
                        <div id="infinitif" class="box">
                            <h2 id="infinitif_title">Infinitif</h2>
                            <p id="infi">&nbsp;</p>
                        </div>
                        <div id="imperatif" class="box">
                            <h2 id="imperatif_title">Impératif</h2>
                            <h3 id="impe_temps">Présent</h3>
                            <p id="impe1">&nbsp;</p>
                            <p id="impe2">&nbsp;</p>
                            <p id="impe3">&nbsp;</p>
                        </div>
                    </div>
                    
                    <div class="colonne">
                        <div id="partpre" class="box">
                            <h2 id="partpre_title">Participe présent</h2>
                            <p id="ppre">&nbsp;</p>
                        </div>
                        <div id="partpas" class="box">
                            <h2 id="partpas_title">Participes passés</h2>
                            <p id="ppas1">&nbsp;</p>
                            <p id="ppas2">&nbsp;</p>
                            <p id="ppas3">&nbsp;</p>
                            <p id="ppas4">&nbsp;</p>
                        </div>
                    </div>
                </div>

                <div class="clearer"></div>

                <!-- section 2 -->
                <div class="container">
                    <div class="colonne">
                        <div id="indicatif" class="box">
                            <h2 id="indicatif_title">Indicatif</h2>
                            <div id="ipre">
                                <h3 id="ipre_temps">Présent</h3>
                                <p id="ipre1">&nbsp;</p>
                                <p id="ipre2">&nbsp;</p>
                                <p id="ipre3">&nbsp;</p>
                                <p id="ipre4">&nbsp;</p>
                                <p id="ipre5">&nbsp;</p>
                                <p id="ipre6">&nbsp;</p>
                            </div>
                            <div id="iimp">
                                <h3 id="iimp_temps">Imparfait</h3>
                                <p id="iimp1">&nbsp;</p>
                                <p id="iimp2">&nbsp;</p>
                                <p id="iimp3">&nbsp;</p>
                                <p id="iimp4">&nbsp;</p>
                                <p id="iimp5">&nbsp;</p>
                                <p id="iimp6">&nbsp;</p>
                            </div>
                            <div id="ipsi">
                                <h3 id="ipsi_temps">Passé simple</h3>
                                <p id="ipsi1">&nbsp;</p>
                                <p id="ipsi2">&nbsp;</p>
                                <p id="ipsi3">&nbsp;</p>
                                <p id="ipsi4">&nbsp;</p>
                                <p id="ipsi5">&nbsp;</p>
                                <p id="ipsi6">&nbsp;</p>
                            </div>
                            <div id="ifut">
                                <h3 id="ifut_temps">Futur</h3>
                                <p id="ifut1">&nbsp;</p>
                                <p id="ifut2">&nbsp;</p>
                                <p id="ifut3">&nbsp;</p>
                                <p id="ifut4">&nbsp;</p>
                                <p id="ifut5">&nbsp;</p>
                                <p id="ifut6">&nbsp;</p>
                            </div>
                        </div>
                    </div>
                    
                    <div class="colonne">
                        <div id="subjonctif" class="box">
                            <h2 id="subjontif_title">Subjonctif</h2>
                            <div id="spre">
                                <h3 id="spre_temps">Présent</h3>
                                <p id="spre1">&nbsp;</p>
                                <p id="spre2">&nbsp;</p>
                                <p id="spre3">&nbsp;</p>
                                <p id="spre4">&nbsp;</p>
                                <p id="spre5">&nbsp;</p>
                                <p id="spre6">&nbsp;</p>
                            </div>
                            <div id="simp">
                                <h3 id="simp_temps">Imparfait</h3>
                                <p id="simp1">&nbsp;</p>
                                <p id="simp2">&nbsp;</p>
                                <p id="simp3">&nbsp;</p>
                                <p id="simp4">&nbsp;</p>
                                <p id="simp5">&nbsp;</p>
                                <p id="simp6">&nbsp;</p>
                            </div>
                        </div>
                        <div id="conditionnel" class="box">
                            <h2 id="conditionnel_title">Conditionnel</h2>
                            <div id="conda">
                                <h3 id="conda_temps">Présent</h3>
                                <p id="conda1">&nbsp;</p>
                                <p id="conda2">&nbsp;</p>
                                <p id="conda3">&nbsp;</p>
                                <p id="conda4">&nbsp;</p>
                                <p id="conda5">&nbsp;</p>
                                <p id="conda6">&nbsp;</p>
                            </div>
                            <div id="condb">
                                <h3 id="condb_temps">&nbsp;</h3>
                                <p id="condb1">&nbsp;</p>
                                <p id="condb2">&nbsp;</p>
                                <p id="condb3">&nbsp;</p>
                                <p id="condb4">&nbsp;</p>
                                <p id="condb5">&nbsp;</p>
                                <p id="condb6">&nbsp;</p>
                            </div>
                        </div>
                    </div>
                </div>

                <div class="clearer"></div>

            </div>


        </div>

        <script src="../grammalecte/helpers.js"></script>
        <script src="../grammalecte/fr/conj.js"></script>
        <script src="conjugueur.js"></script>
    </body>
    
</html>

Added gc_lang/fr/webext/panel/conjugueur.js version [532fc861da].































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
// JavaScript

let oVerb = null;

// button
document.getElementById('conjugate').addEventListener("click", function (event) {
    createVerbAndConjugate(document.getElementById('verb').value);
});

// text field
document.getElementById('verb').addEventListener("change", function (event) {
    createVerbAndConjugate(document.getElementById('verb').value);
});

// options
document.getElementById('oneg').addEventListener("click", function (event) {
    _displayResults();
});
document.getElementById('opro').addEventListener("click", function (event) {
    _displayResults();
});
document.getElementById('oint').addEventListener("click", function (event) {
    _displayResults();
});
document.getElementById('ofem').addEventListener("click", function (event) {
    _displayResults();
});
document.getElementById('otco').addEventListener("click", function (event) {
    _displayResults();
});

function createVerbAndConjugate (sVerb) {
    try {
        document.getElementById('oneg').checked = false;
        document.getElementById('opro').checked = false;
        document.getElementById('oint').checked = false;
        document.getElementById('otco').checked = false;
        document.getElementById('ofem').checked = false;

        // request analyzing
        sVerb = sVerb.trim().toLowerCase().replace(/’/g, "'").replace(/  +/g, " ");
        if (sVerb) {
            if (sVerb.startsWith("ne pas ")) {
                document.getElementById('oneg').checked = true;
                sVerb = sVerb.slice(7);
            }
            if (sVerb.startsWith("se ")) {
                document.getElementById('opro').checked = true;
                sVerb = sVerb.slice(3);
            } else if (sVerb.startsWith("s'")) {
                document.getElementById('opro').checked = true;
                sVerb = sVerb.slice(2);
            }
            if (sVerb.endsWith("?")) {
                document.getElementById('oint').checked = true;
                sVerb = sVerb.slice(0,-1).trim();
            }

            if (!conj.isVerb(sVerb)) {
                document.getElementById('verb').style = "color: #BB4411;";
            } else {
                document.getElementById('verb_title').textContent = sVerb;
                document.getElementById('verb').style = "color: #999999;";
                document.getElementById('verb').value = "";
                oVerb = new Verb(sVerb);
                let sRawInfo = oVerb._sRawInfo;
                document.getElementById('info').textContent = oVerb.sInfo;
                document.getElementById('opro').textContent = "pronominal";
                if (sRawInfo.endsWith("zz")) {
                    document.getElementById('opro').checked = false;
                    document.getElementById('opro').disabled = true;
                    document.getElementById('opro_lbl').style = "color: #CCC;";
                    document.getElementById('otco').checked = false;
                    document.getElementById('otco').disabled = true;
                    document.getElementById('otco_lbl').style = "color: #CCC;";
                    document.getElementById('smallnote').textContent = "Ce verbe n’a pas encore été vérifié. C’est pourquoi les options “pronominal” et “temps composés” sont désactivées.";
                } else {
                    document.getElementById('smallnote').textContent = "❦";
                    if (sRawInfo[5] == "_") {
                        document.getElementById('opro').checked = false;
                        document.getElementById('opro').disabled = true;
                        document.getElementById('opro_lbl').style = "color: #CCC;";
                    } else if (["q", "u", "v", "e"].includes(sRawInfo[5])) {
                        document.getElementById('opro').checked = false;
                        document.getElementById('opro').disabled = false;
                        document.getElementById('opro_lbl').style = "color: #000;";
                    } else if (sRawInfo[5] == "p" || sRawInfo[5] == "r") {
                        document.getElementById('opro').checked = true;
                        document.getElementById('opro').disabled = true;
                        document.getElementById('opro_lbl').style = "color: #CCC;";
                    } else if (sRawInfo[5] == "x") {
                        document.getElementById('opro').textContent = "cas particuliers";
                        document.getElementById('opro').checked = false;
                        document.getElementById('opro').disabled = true;
                        document.getElementById('opro_lbl').style = "color: #CCC;";
                    } else {
                        document.getElementById('opro').textContent = "# erreur #";
                        document.getElementById('opro').checked = false;
                        document.getElementById('opro').disabled = true;
                        document.getElementById('opro_lbl').style = "color: #CCC;";
                    }
                    document.getElementById('otco').disabled = false;
                    document.getElementById('otco_lbl').style = "color: #000;";
                }
                _displayResults();
            }
        }
    }
    catch (e) {
        console.error(e.fileName + "\n" + e.name + "\nline: " + e.lineNumber + "\n" + e.message);
    }
}

function _displayResults () {
    if (oVerb === null) {
        return;
    }
    try {
        let opro = document.getElementById('opro').checked;
        let oneg = document.getElementById('oneg').checked;
        let otco = document.getElementById('otco').checked;
        let oint = document.getElementById('oint').checked;
        let ofem = document.getElementById('ofem').checked;
        // titles
        _setTitles()
        // participes passés
        document.getElementById('ppas1').textContent = oVerb.participePasse(":Q1") || " "; // something or nbsp
        document.getElementById('ppas2').textContent = oVerb.participePasse(":Q2") || " ";
        document.getElementById('ppas3').textContent = oVerb.participePasse(":Q3") || " ";
        document.getElementById('ppas4').textContent = oVerb.participePasse(":Q4") || " ";
        // infinitif
        document.getElementById('infi').textContent = oVerb.infinitif(opro, oneg, otco, oint, ofem);
        // participe présent
        document.getElementById('ppre').textContent = oVerb.participePresent(opro, oneg, otco, oint, ofem) || " ";
        // conjugaisons
        document.getElementById('ipre1').textContent = oVerb.conjugue(":Ip", ":1s", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('ipre2').textContent = oVerb.conjugue(":Ip", ":2s", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('ipre3').textContent = oVerb.conjugue(":Ip", ":3s", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('ipre4').textContent = oVerb.conjugue(":Ip", ":1p", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('ipre5').textContent = oVerb.conjugue(":Ip", ":2p", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('ipre6').textContent = oVerb.conjugue(":Ip", ":3p", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('iimp1').textContent = oVerb.conjugue(":Iq", ":1s", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('iimp2').textContent = oVerb.conjugue(":Iq", ":2s", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('iimp3').textContent = oVerb.conjugue(":Iq", ":3s", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('iimp4').textContent = oVerb.conjugue(":Iq", ":1p", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('iimp5').textContent = oVerb.conjugue(":Iq", ":2p", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('iimp6').textContent = oVerb.conjugue(":Iq", ":3p", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('ipsi1').textContent = oVerb.conjugue(":Is", ":1s", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('ipsi2').textContent = oVerb.conjugue(":Is", ":2s", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('ipsi3').textContent = oVerb.conjugue(":Is", ":3s", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('ipsi4').textContent = oVerb.conjugue(":Is", ":1p", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('ipsi5').textContent = oVerb.conjugue(":Is", ":2p", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('ipsi6').textContent = oVerb.conjugue(":Is", ":3p", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('ifut1').textContent = oVerb.conjugue(":If", ":1s", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('ifut2').textContent = oVerb.conjugue(":If", ":2s", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('ifut3').textContent = oVerb.conjugue(":If", ":3s", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('ifut4').textContent = oVerb.conjugue(":If", ":1p", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('ifut5').textContent = oVerb.conjugue(":If", ":2p", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('ifut6').textContent = oVerb.conjugue(":If", ":3p", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('conda1').textContent = oVerb.conjugue(":K", ":1s", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('conda2').textContent = oVerb.conjugue(":K", ":2s", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('conda3').textContent = oVerb.conjugue(":K", ":3s", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('conda4').textContent = oVerb.conjugue(":K", ":1p", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('conda5').textContent = oVerb.conjugue(":K", ":2p", opro, oneg, otco, oint, ofem) || " ";
        document.getElementById('conda6').textContent = oVerb.conjugue(":K", ":3p", opro, oneg, otco, oint, ofem) || " ";
        if (!oint) {
            document.getElementById('spre1').textContent = oVerb.conjugue(":Sp", ":1s", opro, oneg, otco, oint, ofem) || " ";
            document.getElementById('spre2').textContent = oVerb.conjugue(":Sp", ":2s", opro, oneg, otco, oint, ofem) || " ";
            document.getElementById('spre3').textContent = oVerb.conjugue(":Sp", ":3s", opro, oneg, otco, oint, ofem) || " ";
            document.getElementById('spre4').textContent = oVerb.conjugue(":Sp", ":1p", opro, oneg, otco, oint, ofem) || " ";
            document.getElementById('spre5').textContent = oVerb.conjugue(":Sp", ":2p", opro, oneg, otco, oint, ofem) || " ";
            document.getElementById('spre6').textContent = oVerb.conjugue(":Sp", ":3p", opro, oneg, otco, oint, ofem) || " ";
            document.getElementById('simp1').textContent = oVerb.conjugue(":Sq", ":1s", opro, oneg, otco, oint, ofem) || " ";
            document.getElementById('simp2').textContent = oVerb.conjugue(":Sq", ":2s", opro, oneg, otco, oint, ofem) || " ";
            document.getElementById('simp3').textContent = oVerb.conjugue(":Sq", ":3s", opro, oneg, otco, oint, ofem) || " ";
            document.getElementById('simp4').textContent = oVerb.conjugue(":Sq", ":1p", opro, oneg, otco, oint, ofem) || " ";
            document.getElementById('simp5').textContent = oVerb.conjugue(":Sq", ":2p", opro, oneg, otco, oint, ofem) || " ";
            document.getElementById('simp6').textContent = oVerb.conjugue(":Sq", ":3p", opro, oneg, otco, oint, ofem) || " ";
            document.getElementById('impe1').textContent = oVerb.imperatif(":2s", opro, oneg, otco, ofem) || " ";
            document.getElementById('impe2').textContent = oVerb.imperatif(":1p", opro, oneg, otco, ofem) || " ";
            document.getElementById('impe3').textContent = oVerb.imperatif(":2p", opro, oneg, otco, ofem) || " ";
        } else {
            document.getElementById('spre_temps').textContent = " ";
            document.getElementById('spre1').textContent = " ";
            document.getElementById('spre2').textContent = " ";
            document.getElementById('spre3').textContent = " ";
            document.getElementById('spre4').textContent = " ";
            document.getElementById('spre5').textContent = " ";
            document.getElementById('spre6').textContent = " ";
            document.getElementById('simp_temps').textContent = " ";
            document.getElementById('simp1').textContent = " ";
            document.getElementById('simp2').textContent = " ";
            document.getElementById('simp3').textContent = " ";
            document.getElementById('simp4').textContent = " ";
            document.getElementById('simp5').textContent = " ";
            document.getElementById('simp6').textContent = " ";
            document.getElementById('impe_temps').textContent = " ";
            document.getElementById('impe1').textContent = " ";
            document.getElementById('impe2').textContent = " ";
            document.getElementById('impe3').textContent = " ";
        }
        if (otco) {
            document.getElementById('condb1').textContent = oVerb.conjugue(":Sq", ":1s", opro, oneg, otco, oint, ofem) || " ";
            document.getElementById('condb2').textContent = oVerb.conjugue(":Sq", ":2s", opro, oneg, otco, oint, ofem) || " ";
            document.getElementById('condb3').textContent = oVerb.conjugue(":Sq", ":3s", opro, oneg, otco, oint, ofem) || " ";
            document.getElementById('condb4').textContent = oVerb.conjugue(":Sq", ":1p", opro, oneg, otco, oint, ofem) || " ";
            document.getElementById('condb5').textContent = oVerb.conjugue(":Sq", ":2p", opro, oneg, otco, oint, ofem) || " ";
            document.getElementById('condb6').textContent = oVerb.conjugue(":Sq", ":3p", opro, oneg, otco, oint, ofem) || " ";
        } else {
            document.getElementById('condb1').textContent = " ";
            document.getElementById('condb2').textContent = " ";
            document.getElementById('condb3').textContent = " ";
            document.getElementById('condb4').textContent = " ";
            document.getElementById('condb5').textContent = " ";
            document.getElementById('condb6').textContent = " ";
        }
        document.getElementById('verb').Text = "";
    }
    catch (e) {
        console.error(e.fileName + "\n" + e.name + "\nline: " + e.lineNumber + "\n" + e.message);
    }
}

function _setTitles () {
    try {
        if (!document.getElementById('otco').checked) {
            document.getElementById('ipre_temps').textContent = "Présent";
            document.getElementById('ifut_temps').textContent = "Futur";
            document.getElementById('iimp_temps').textContent = "Imparfait";
            document.getElementById('ipsi_temps').textContent = "Passé simple";
            document.getElementById('spre_temps').textContent = "Présent";
            document.getElementById('simp_temps').textContent = "Imparfait";
            document.getElementById('conda_temps').textContent = "Présent";
            document.getElementById('condb_temps').textContent = " ";
            document.getElementById('impe_temps').textContent = "Présent";
        } else {
            document.getElementById('ipre_temps').textContent = "Passé composé";
            document.getElementById('ifut_temps').textContent = "Futur antérieur";
            document.getElementById('iimp_temps').textContent = "Plus-que-parfait";
            document.getElementById('ipsi_temps').textContent = "Passé antérieur";
            document.getElementById('spre_temps').textContent = "Passé";
            document.getElementById('simp_temps').textContent = "Plus-que-parfait";
            document.getElementById('conda_temps').textContent = "Passé (1ʳᵉ forme)";
            document.getElementById('condb_temps').textContent = "Passé (2ᵉ forme)";
            document.getElementById('impe_temps').textContent = "Passé";
        }
    }
    catch (e) {
        console.error(e.fileName + "\n" + e.name + "\nline: " + e.lineNumber + "\n" + e.message);
    }
}

createVerbAndConjugate("être");

document.getElementById("verb").focus();

Added gc_lang/fr/webext/panel/main.css version [e691764c17].









































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
/*
    flexbox:
    https://css-tricks.com/snippets/css/a-guide-to-flexbox/
*/


/* reset */

* { margin: 0; padding: 0; }
img { border: none; }


/* Selection */

::-moz-selection {
    background-color: hsl(210, 50%, 60%);
    color: hsl(210, 20%, 100%);
    text-shadow: 0 0 2px hsl(210, 80%, 20%);
    border-radius: 2px;
}
::selection {
    background-color: hsl(210, 50%, 60%);
    color: hsl(210, 20%, 100%);
    text-shadow: 0 0 2px hsl(210, 80%, 20%);
    border-radius: 2px;
}


/* Generic classes */

.fleft { float: left; }
.fright { float: right; }

.center { text-align: center; }
.right { text-align: right; }
.left { text-align: left; }
.justify { text-align: justify; }

.hidden { display: none; }
.clearer { clear: both; font-size: 0; height: 0; }

.red {          background-color: hsl(0, 50%, 50%);   color: hsl(0, 0%, 96%); }
.red:hover {    background-color: hsl(0, 60%, 40%);   color: hsl(0, 0%, 100%); }
.cyan {         background-color: hsl(180, 50%, 50%); color: hsl(0, 0%, 96%); }
.cyan:hover {   background-color: hsl(180, 60%, 40%); color: hsl(0, 0%, 100%); }
.green {        background-color: hsl(120, 50%, 40%); color: hsl(120, 10%, 96%); }
.green:hover {  background-color: hsl(120, 60%, 30%); color: hsl(120, 10%, 96%); }
.blue {         background-color: hsl(210, 50%, 50%); color: hsl(210, 10%, 96%); }
.blue:hover {   background-color: hsl(210, 60%, 40%); color: hsl(210, 10%, 96%); }

.border { border: 1px solid hsl(210, 20%, 80%); }


/* links */

.link {
    color: hsl(210, 70%, 40%);
    text-decoration: none;
    cursor: pointer;
}
.link:hover {
    text-shadow: 0 0 2px hsl(210, 80%, 60%);
}



/* Main classes */

html {
    box-sizing: border-box;
    width: 400px;
    height: 500px;
    font-family: "Trebuchet MS", "Fira Sans", "Liberation Sans", sans-serif;
}
body {
    width: 400px;
    height: 500px;
}
/* 
    Maximal height of a panel in WebExtention seems to be 500px.
    When going over this limit, a scrollbar appears which destructs the
    horizontal balance of elements.
    --> vertical scrolling is done with overflow in #page.
        #page must have the same height than body.
*/

#main {
    display: flex;
    background-color: hsl(210, 0%, 100%);
    min-height: 100%;
}

#menu {
    width: 50px;
    border-right: solid 1px hsl(210, 0%, 70%);
    background-color: hsl(210, 10%, 96%);
    color: hsl(210, 10%, 96%);
}
#logo {
    padding: 10px;
}
#menu li {
    padding: 10px 0;
    border-bottom: 1px solid hsl(210, 10%, 90%);
    text-align: center;
    cursor: pointer;
    color: hsl(210, 10%, 50%);
    list-style-type: none;
    font-size: 20px;
}
#menu li:hover {
    background-color: hsl(210, 10%, 92%);
    color: hsl(210, 80%, 50%);
    text-shadow: 0px 0px 1px hsl(210, 100%, 70%);
}


#page {
    background-color: hsl(210, 0%, 100%);
    min-width: calc(100% - 51px);
    height: 500px;
    overflow: auto;
}
#page h1 {
    margin: 0 0 10px 0;
    color: hsl(210, 50%, 50%);
    font: bold 30px 'Yanone Kaffeesatz', "Liberation Sans Narrow", sans-serif;
}


/*
    Home
*/
#home_page {
    display: block;
    background-color: hsl(210, 20%, 92%);
    min-height: 100%;
}
#home_page #mainlogo {
    padding: 5px 20px 20px 20px;
    background-color: hsl(210, 20%, 96%);
}
#home_page .notice {
    margin-top: 5px;
    font-size: 12px;
    font-variant-caps: small-caps;
    color: hsl(210, 20%, 50%);
}
#home_page #thanks {
    padding: 20px 0 0 0;
    border-top: 1px solid hsl(210, 20%, 88%);
    font-size: 14px;
}

/*
    Help
*/
#help_page {
    display: none;
    padding: 20px;
}
#help_page h2 {
    font: bold 20px 'Yanone Kaffeesatz', "Liberation Sans Narrow", sans-serif;
    color: hsl(210, 50%, 50%);
}
#help_page .shortcut {
    margin-top: 10px;
    font-weight: bold;
    font-size: 13px;
}
#help_page .shortcut_label {
    margin-left: 30px;
}

/*
    Grammar checking options
*/
#gc_options_page {
    display: none;
    padding: 20px;
}
.opt_subsection {
    margin: 5px 0;
    padding: 10px;
    background-color: hsl(210, 20%, 95%);
    border-radius: 3px;
}
.opt_subsection h2 {
    color: hsl(210, 30%, 50%);
    margin-bottom: 3px;
    font-size: 16px;
    font-family: "Trebuchet MS", "Fira Sans", "Liberation Sans", sans-serif;
}
.opt_subsection p {
    padding: 2px 3px;
    display: flex;
    align-items: center;
}
.opt_subsection p:hover {
    background-color: hsl(210, 20%, 90%);
    border-radius: 2px;
}
.opt_subsection label {
    flex: 1;
    font-size: 12px;
}
.opt_subsection input {
    order: 1
}

#gc_options_page .button {
    margin: 20px 30px 0 30px;
    padding: 5px 10px;
    border-radius: 3px;
    font-size: 16px;
    text-align: center;
    cursor: pointer;
}


/*
    Spell checking options
*/
#sc_options_page {
    display: none;
    padding: 20px;
}
#dictionaries_info {
    margin: 10px 0;
    padding: 10px;
    border-radius: 3px;
    background-color: hsl(0, 50%, 40%);
    color: hsl(0, 10%, 96%);
}
.dict_section {
    padding: 10px;
    margin-top: 10px;
    border-radius: 5px;
    background-color: hsl(210, 20%, 96%);
}
.dict_section label {
    font-size: 16px;
    line-height: 20px;
    color: hsl(210, 20%, 50%);
    font-weight: bold;
}
.dict_description {
    padding: 0 0 0 20px;
    color: hsl(0, 0%, 0%);
    font-size: 12px;
}


/*
  Test page
*/
#test_page {
    display: none;
    background-color: hsl(210, 20%, 96%);
    min-height: 100%;
}
#test_cmd {
    padding: 15px;
    background-color: hsl(210, 20%, 92%);
    border-bottom: 1px solid hsl(210, 20%, 90%);
}
#test_cmd textarea {
    width: 95%;
    padding: 5px;
    border: 2px solid hsl(210, 20%, 80%);
    background-color: hsl(210, 20%, 98%);
    border-radius: 3px;
    resize: vertical;
}

#tests_result {
    padding: 15px;
}

#test_page .button {
    display: inline-block;
    padding: 5px;
    width: 100px;
    border-radius: 3px;
    font-size: 12px;
    text-align: center;
    cursor: pointer;
}


/*
    CSS Spinner
    Double bounce
    http://tobiasahlin.com/spinkit/
*/
.spinner {
    width: 40px;
    height: 40px;
    position: absolute;
    top: 2px;
    right: 120px;
}
.double-bounce1, .double-bounce2 {
    width: 100%;
    height: 100%;
    border-radius: 50%;
    background-color: hsl(180, 50%, 75%);
    opacity: 0.6;
    position: absolute;
    top: 0;
    left: 0;
    animation: sk-bounce 2.0s infinite ease-in-out;
}
.double-bounce2 {
    animation-delay: -1.0s;
}

@keyframes sk-bounce {
    0%, 100% { 
        transform: scale(0.0);
    } 50% { 
        transform: scale(1.0);
    }
}

Added gc_lang/fr/webext/panel/main.html version [718e696348].















































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8">
    <link rel="stylesheet" href="main.css"/>
    <link rel="stylesheet" href="../3rd/font-awesome-4.7.0/css/font-awesome.min.css"/>
  </head>

  <body>
    <div id="main">

      <header id="menu">
        <nav>
          <header id="logo">
            <img src="../img/logo-32.png">
          </header>
          <ul>
            <li class="select" data-page="home_page"><i class="select fa fa-star icon" data-page="home_page"></i></li>
            <li class="select" data-page="help_page"><i class="select fa fa-question-circle icon" data-page="help_page"></i></li>
            <li class="select" data-page="gc_options_page"><i class="select fa fa-cogs icon" data-page="gc_options_page"></i></li>
            <li class="select" data-page="sc_options_page"><i class="select fa fa-cube icon" data-page="sc_options_page"></i></li>
            <li class="select" data-page="test_page"><i class="select fa fa-flask icon" data-page="test_page"></i></li>
          </ul>
        </nav>
      </header> <!-- #menu -->

      <div id="page">

        <section id="home_page" class="page">

          <div id="mainlogo">
            <div class="center"><img src="../img/logo120_text.png" alt="Grammalecte"></div>
            <p class="underline center">
              Version ${version}
            </p>
            <p id="link_website" class="link center" data-url="http://grammalecte.net">Site web</p>
            <p class="notice center">
              Grammalecte est un correcteur grammatical open&nbsp;source sous <span id="link_gpl" class="link" data-url="https://www.gnu.org/licenses/gpl.html">licence GPL 3</span>
            </p>
          </div>
          
          <div id="thanks">
            <p class="center" data-l10n-id="thanks1">Grammalecte remercie</p>
            <p class="center"><img id="link_sponsor1" class="link border" src="../img/LaMouette.png" alt="La Mouette" data-url="http://www.lamouette.org/?from=grammalecte-fx" /></p>
            <p class="center"><img id="link_sponsor2" class="link border" src="../img/Algoo_logo.png" alt="Algoo" data-url="https://www.algoo.fr/?from=grammalecte-fx" /></p>
            <p id="link_othersponsors" class="link center" data-url="http://grammalecte.net/?thanks">
              et tous ceux qui l’ont soutenu
            </p>
          </div>
        </section> <!-- #home_page -->

        <section id="help_page" class="page">
          <h1>AIDE</h1>
          <div id="help_section">
            <p>Grammalecte affiche un bouton d’accès au menu en bas à gauche des zones de texte usuelles pour accéder aux fonctionnalités existantes.</p>
            <p class="right"><img src="../img/menu_button1.png" title="bouton du menu" /></p>
            <p class="right"><img src="../img/menu_button2.png" title="menu" /></p>
            <p>Pour les autres zones de texte (HTML éditable), il faut sélectionner le texte et utiliser le menu contextuel.</p>
            <p class="right"><img src="../img/contextmenu.png" title="menu contextuel sur sélection" /></p>
            <h2>Raccourcis clavier</h2>
            <p class="shortcut">CTRL+MAJ+F6</p>
            <p class="shortcut_label">Conjugueur (dans un onglet)</p>
            <p class="shortcut">CTRL+MAJ+F7</p>
            <p class="shortcut_label">Conjugueur (dans une fenêtre)</p>
          </div>
        </section> <!-- #help_page -->

        <section id="gc_options_page" class="page">
          <h1>OPTIONS GRAMMATICALES</h1>
          <div id="grammar_options">
            ${webextOptionsHTML}
          </div>
          <div id="default_options_button" class="button blue center">Options par défaut</div>
        </section> <!-- #gc_options_page -->

        <section id="sc_options_page" class="page" style="opacity: .25">
          <h1>OPTIONS ORTHOGRAPHIQUES</h1>
          <div id="spelling_options">
            <p id="dictionaries_info" data-l10n-id="dictionaries_info">Section inactive. Le nouveau système d’extension de Firefox (WebExtension) ne propose pas encore d’interface de programmation pour le correcteur orthographique.</p>
            <div class="dict_section" id="fr-FR-modern_box">
                <p><input type="checkbox" id="fr-FR-modern" /> <label for="fr-FR-modern">“Moderne”</label></p>
                <p class="dict_description">Ce dictionnaire propose l’orthographe telle qu’elle est écrite aujourd’hui le plus couramment. C’est le dictionnaire recommandé si le français n’est pas votre langue maternelle ou si vous ne désirez qu’une seule graphie correcte par mot.</p>
            </div>
            <div class="dict_section" id="fr-FR-classic_box">
                <p><input type="checkbox" id="fr-FR-classic" /> <label for="fr-FR-classic">“Classique” (recommandé)</label></p>
                <p class="dict_description">Il s’agit du dictionnaire “Moderne”, avec des graphies classiques en sus, certaines encore communément utilisées, d’autres désuètes. C’est le dictionnaire recommandé si le français est votre langue maternelle.</p>
            </div>
            <div class="dict_section" id="fr-FR-reform_box">
                <p><input type="checkbox" id="fr-FR-reform" /> <label for="fr-FR-reform">“Réforme 1990”</label></p>
                <p class="dict_description">Avec ce dictionnaire, seule l’orthographe réformée est reconnue. Attendu que bon nombre de graphies réformées sont considérées comme erronées par beaucoup, ce dictionnaire est déconseillé. Les graphies passées dans l’usage sont déjà incluses dans le dictionnaire “Moderne”.</p>
            </div>
            <div class="dict_section" id="fr-FR-classic-reform_box">
                <p><input type="checkbox" id="fr-FR-classic-reform" /> <label for="fr-FR-classic-reform">“Toutes variantes”</label></p>
                <p class="dict_description">Ce dictionnaire contient les variantes graphiques, classiques, réformées, ainsi que d’autres plus rares encore. Ce dictionnaire est déconseillé à ceux qui ne connaissent pas très bien la langue française.</p>
            </div>
          </div>
        </section> <!-- #sc_options_page -->

        <section id="test_page" class="page">
          <div id="test_cmd">
            <h1>ZONE DE TEST</h1>
            <p>Section de contrôle pour le développement du logiciel…</p>
            <p id="link_testpage" class="link" data-url="https://www.dicollecte.org/test.html">Page de test</p>
            <textarea id="text_to_test" rows="10"></textarea>
            <div id="fulltests_button" class="button blue">Tests complets</div> <div id="text_to_test_button" class="button green fright">Analyser</div>
          </div>
          <pre id="tests_result"></pre>
        </section> <!-- #test_page -->

      </div> <!-- #page -->

    </div> <!-- #main -->

    <script src="main.js"></script>
  </body>

</html>
   

Added gc_lang/fr/webext/panel/main.js version [cfdce4f016].











































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
// Main panel

"use strict";


function showError (e) {
    console.error(e.fileName + "\n" + e.name + "\nline: " + e.lineNumber + "\n" + e.message);
}


/*
    Events
*/
window.addEventListener(
    "click",
    function (xEvent) {
        let xElem = xEvent.target;
        if (xElem.id) {
            if (xElem.id === "text_to_test_button") {
                browser.runtime.sendMessage({
                    sCommand: "textToTest",
                    dParam: {sText: document.getElementById("text_to_test").value, sCountry: "FR", bDebug: false, bContext: false},
                    dInfo: {}
                });
            }
            else if (xElem.id === "fulltests_button") {
                document.getElementById("tests_result").textContent = "Veuillez patienter…";
                browser.runtime.sendMessage({
                    sCommand: "fullTests",
                    dParam: {},
                    dInfo: {}
                });
            }
            else if (xElem.id === "default_options_button") {
                browser.runtime.sendMessage({
                   sCommand: "resetOptions",
                   dParam: {},
                   dInfo: {}
                });
            }
            else if (xElem.id.startsWith("option_")) {
                browser.runtime.sendMessage({
                    sCommand: "setOption",
                    dParam: {sOptName: xElem.dataset.option, bValue: xElem.checked},
                    dInfo: {}
                });
            }
            else if (xElem.id.startsWith("link_")) {
                browser.tabs.create({url: xElem.dataset.url});
            }
        } else if (xElem.className.startsWith("select")) {
            showPage(xElem.dataset.page);
        }/* else if (xElem.tagName === "A") {
            openURL(xElem.getAttribute("href"));
        }*/
    },
    false
);


/* 
    Message sender
    and response handling
*/
function handleResponse (oResponse) {
    console.log(`[Panel] received:`);
    console.log(oResponse);
}

function handleError (error) {
    console.log(`[Panel] Error:`);
    console.log(error);
}

function sendMessageAndWaitResponse (oData) {
    let xPromise = browser.runtime.sendMessage(oData);
    xPromise.then(handleResponse, handleError);  
}


/*
    Messages received
*/
function handleMessage (oMessage, xSender, sendResponse) {
    let {sActionDone, result, dInfo, bEnd, bError} = oMessage;
    switch(sActionDone) {
        case "textToTest":
        case "fullTests":
            showTestResult(result);
            break;
        case "resetOptions":
            setGCOptions(result);
            break;
        default:
            console.log("GRAMMALECTE. Unknown command: " + sActionDone);
    }
    //sendResponse({sCommand: "none", result: "done"});
}

browser.runtime.onMessage.addListener(handleMessage);


/*
    Actions
*/

function showPage (sPageName) {
    try {
        // hide them all
        for (let xNodePage of document.getElementsByClassName("page")) {
            xNodePage.style.display = "none";
        }
        // show the selected one
        document.getElementById(sPageName).style.display = "block";
        if (sPageName == "gc_options_page") {
            setGCOptionsFromStorage();
        }
    }
    catch (e) {
        showError(e);
    }
}


function showTestResult (sText) {
    document.getElementById("tests_result").textContent = sText;
}

function setGCOptionsFromStorage () {
    let xPromise = browser.storage.local.get("gc_options");
    xPromise.then(
        function (dSavedOptions) {
            if (dSavedOptions.hasOwnProperty("gc_options")) {
                setGCOptions(dSavedOptions.gc_options);
            }
        },
        function (e) {
            showError(e);
        }
    );
}

function setGCOptions (dOptions) {
    for (let [sOpt, bVal] of dOptions) {
        if (document.getElementById("option_"+sOpt)) {
            document.getElementById("option_"+sOpt).checked = bVal;
        }
    }
}

Modified gc_lang/fr/xpi/data/about_panel.css from [5a951f6db8] to [01be88bd1f].

36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
    letter-spacing: -0.08em;
}
.goto {
    letter-spacing: -0.08em;
}

#links {
    margin: 20px 0 10px 0;
}

a.link {
    color: hsl(210, 30%, 40%);
    text-decoration: none;
}
a.link:hover {







|







36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
    letter-spacing: -0.08em;
}
.goto {
    letter-spacing: -0.08em;
}

#links {
    padding: 6px 0 3px 0;
}

a.link {
    color: hsl(210, 30%, 40%);
    text-decoration: none;
}
a.link:hover {
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
    color: hsl(180, 80%, 20%);
    text-shadow: 0 0 1px hsl(180, 50%, 10%);
}

footer#promo {
    background-color: hsl(0, 0%, 92%);
    border-top: 1px solid hsl(0, 0%, 86%);
    padding: 20px;
}

footer#thanks {
    background-color: hsl(0, 0%, 86%);
    border-top: 1px solid hsl(0, 0%, 80%);
    padding: 15px 15px;
}
footer#thanks p {
    margin: 3px 0;
    font-size: 14px;
}








|












179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
    color: hsl(180, 80%, 20%);
    text-shadow: 0 0 1px hsl(180, 50%, 10%);
}

footer#promo {
    background-color: hsl(0, 0%, 92%);
    border-top: 1px solid hsl(0, 0%, 86%);
    padding: 10px;
}

footer#thanks {
    background-color: hsl(0, 0%, 86%);
    border-top: 1px solid hsl(0, 0%, 80%);
    padding: 15px 15px;
}
footer#thanks p {
    margin: 3px 0;
    font-size: 14px;
}

Modified gc_lang/fr/xpi/data/about_panel.html from [29f0840170] to [d97e8549df].

53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71





72
73
74
75
76
77
78
                <p class="dict_description" data-l10n-id="dict_classic_reform_descr"></p>
            </div>
        </div>

        <footer id="promo">
            <p class="center">
                <span data-l10n-id="general_info"></span> &nbsp; · &nbsp;
                <a id="website" class="simplelink" href="http://www.dicollecte.org/grammalecte/" onclick="return false;" data-l10n-id="website"></a>
            </p>
        </footer>
        
        <footer id="thanks">
            <p class="center" data-l10n-id="thanks1"></p>
            <p class="center">
                <a id="mainsponsor" href="http://www.lamouette.org/" onclick="return false;">
                    <img src="img/LaMouette.png" style="border: 1px solid #C0C0C0" />
                </a>
            </p>
            <p class="center">





                <a id="othersponsors" class="link" href="http://www.dicollecte.org/grammalecte/soutiens.php" onclick="return false;">
                    <b data-l10n-id="thanks2"></b>
                </a>
            </p>
        </footer>
    </body>
</html>







|






|




>
>
>
>
>
|






53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
                <p class="dict_description" data-l10n-id="dict_classic_reform_descr"></p>
            </div>
        </div>

        <footer id="promo">
            <p class="center">
                <span data-l10n-id="general_info"></span> &nbsp; · &nbsp;
                <a id="website" class="simplelink" href="#" onclick="return false;" data-l10n-id="website"></a>
            </p>
        </footer>
        
        <footer id="thanks">
            <p class="center" data-l10n-id="thanks1"></p>
            <p class="center">
                <a id="mainsponsor" href="#" onclick="return false;">
                    <img src="img/LaMouette.png" style="border: 1px solid #C0C0C0" />
                </a>
            </p>
            <p class="center">
                <a id="mainsponsor2" href="#" onclick="return false;">
                    <img src="img/Algoo_logo.png" style="border: 1px solid #C0C0C0" />
                </a>
            </p>
            <p class="center">
                <a id="othersponsors" class="link" href="https://www.dicollecte.org/#thanks" onclick="return false;">
                    <b data-l10n-id="thanks2"></b>
                </a>
            </p>
        </footer>
    </body>
</html>

Modified gc_lang/fr/xpi/data/about_panel.js from [f7f7c93567] to [167eaa05ef].

49
50
51
52
53
54
55
56
57
58
59
60



61
62
63
64
65
66
67
68
69
70
71
});

document.getElementById('conjugueur').addEventListener("click", function (event) {
	self.port.emit('openConjugueur');
});

document.getElementById('website').addEventListener("click", function (event) {
	self.port.emit('openURL', "http://www.dicollecte.org/grammalecte/");
});

document.getElementById('mainsponsor').addEventListener("click", function (event) {
	self.port.emit('openURL', "http://www.lamouette.org/");



});

document.getElementById('othersponsors').addEventListener("click", function (event) {
	self.port.emit('openURL', "http://www.dicollecte.org/grammalecte/soutiens.php");
});


window.addEventListener(
	"click",
	function (xEvent) {
		let xElem = xEvent.target;







|



|
>
>
>



|







49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
});

document.getElementById('conjugueur').addEventListener("click", function (event) {
	self.port.emit('openConjugueur');
});

document.getElementById('website').addEventListener("click", function (event) {
	self.port.emit('openURL', "http://www.dicollecte.org/?from=grammalecte-fx");
});

document.getElementById('mainsponsor').addEventListener("click", function (event) {
	self.port.emit('openURL', "http://lamouette.org/?from=grammalecte-fx");
});
document.getElementById('mainsponsor2').addEventListener("click", function (event) {
	self.port.emit('openURL', "https://www.algoo.fr/?from=grammalecte-fx");
});

document.getElementById('othersponsors').addEventListener("click", function (event) {
	self.port.emit('openURL', "http://www.dicollecte.org/#thanks");
});


window.addEventListener(
	"click",
	function (xEvent) {
		let xElem = xEvent.target;

Modified gc_lang/fr/xpi/data/conj_panel.js from [0a29bb81bd] to [eb75f474de].

67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
                sVerb = sVerb.slice(2);
            }
            if (sVerb.endsWith("?")) {
                document.getElementById('oint').checked = true;
                sVerb = sVerb.slice(0,-1).trim();
            }

            if (!isVerb(sVerb)) {
                document.getElementById('verb').style = "color: #BB4411;";
            } else {
                self.port.emit("show");
                document.getElementById('verb_title').textContent = sVerb;
                document.getElementById('verb').style = "color: #999999;";
                document.getElementById('verb').value = "";
                oVerb = new Verb(sVerb);







|







67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
                sVerb = sVerb.slice(2);
            }
            if (sVerb.endsWith("?")) {
                document.getElementById('oint').checked = true;
                sVerb = sVerb.slice(0,-1).trim();
            }

            if (!conj.isVerb(sVerb)) {
                document.getElementById('verb').style = "color: #BB4411;";
            } else {
                self.port.emit("show");
                document.getElementById('verb_title').textContent = sVerb;
                document.getElementById('verb').style = "color: #999999;";
                document.getElementById('verb').value = "";
                oVerb = new Verb(sVerb);

Modified gc_lang/fr/xpi/data/dictionaries/fr-FR-classic-reform/fr-FR-classic-reform.aff from [01e05b71db] to [0e3d2f8f2d].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# AFFIXES DU DICTIONNAIRE ORTHOGRAPHIQUE FRANÇAIS “TOUTES VARIANTES” v6.1
# par Olivier R. -- licence MPL 2.0
# Généré le 03-06-2017 à 22:26
# Pour améliorer le dictionnaire, allez sur http://www.dicollecte.org/



SET UTF-8

WORDCHARS -’'1234567890.




|

|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# AFFIXES DU DICTIONNAIRE ORTHOGRAPHIQUE FRANÇAIS “TOUTES VARIANTES” v6.2
# par Olivier R. -- licence MPL 2.0
# Généré le 26-07-2017 à 09:33
# Pour améliorer le dictionnaire, allez sur http://www.dicollecte.org/



SET UTF-8

WORDCHARS -’'1234567890.

Modified gc_lang/fr/xpi/data/dictionaries/fr-FR-classic-reform/fr-FR-classic-reform.dic from [ae19739268] to [9463186eff].

1
2
3
4
5
6
7
8
82379
&
1er/--
1ers/--
1re/--
1res/--
1ʳᵉ/--
1ʳᵉˢ/--
|







1
2
3
4
5
6
7
8
82439
&
1er/--
1ers/--
1re/--
1res/--
1ʳᵉ/--
1ʳᵉˢ/--
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
Aïcha/L'D'Q'
Aïd/L'D'Q'
Aida/L'D'Q'
Aidan/L'D'Q'
Aïd-el-Adha/L'
Aïd-el-Kébir/L'
Aiden/L'D'Q'
Aignan
Aigoual/L'D'
Aigrain/L'D'Q'
Aimé/L'D'Q'
Aimée/L'D'Q'
Ain/L'
Airaines/L'D'Q'
Airbnb/L'D'Q'







|







187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
Aïcha/L'D'Q'
Aïd/L'D'Q'
Aida/L'D'Q'
Aidan/L'D'Q'
Aïd-el-Adha/L'
Aïd-el-Kébir/L'
Aiden/L'D'Q'
Aignan/L'D'Q'
Aigoual/L'D'
Aigrain/L'D'Q'
Aimé/L'D'Q'
Aimée/L'D'Q'
Ain/L'
Airaines/L'D'Q'
Airbnb/L'D'Q'
529
530
531
532
533
534
535

536
537
538
539
540
541
542
Arion/L'D'Q'
Aristarque/L'D'Q'
Aristide/L'D'Q'
Aristophane/L'D'Q'
Aristote/L'D'Q'
Arizona/L'D'
Arjuna/L'D'Q'

Arkansas/L'D'
Arkema/L'D'Q'
Arkham/L'D'Q'
Arkhangelsk/L'D'Q'
Arlene/L'D'Q'
Arlène/L'D'Q'
Arles/L'D'Q'







>







529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
Arion/L'D'Q'
Aristarque/L'D'Q'
Aristide/L'D'Q'
Aristophane/L'D'Q'
Aristote/L'D'Q'
Arizona/L'D'
Arjuna/L'D'Q'
Arkady/L'D'Q'
Arkansas/L'D'
Arkema/L'D'Q'
Arkham/L'D'Q'
Arkhangelsk/L'D'Q'
Arlene/L'D'Q'
Arlène/L'D'Q'
Arles/L'D'Q'
651
652
653
654
655
656
657

658
659
660
661
662
663
664
Aurélien/L'D'Q'
Aurelio/L'D'Q'
Auriane/L'D'Q'
Aurillac/L'D'Q'
Auriol/L'D'Q'
Aurore/L'D'Q'
Auschwitz/L'D'Q'

Austerlitz/L'D'Q'
Austin/L'D'Q'
Australasie/L'D'Q'
Australie/L'D'
Australie-Méridionale/L'D'
Australie-Occidentale/L'D'
Austrasie/L'D'







>







652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
Aurélien/L'D'Q'
Aurelio/L'D'Q'
Auriane/L'D'Q'
Aurillac/L'D'Q'
Auriol/L'D'Q'
Aurore/L'D'Q'
Auschwitz/L'D'Q'
Austen/L'D'Q'
Austerlitz/L'D'Q'
Austin/L'D'Q'
Australasie/L'D'Q'
Australie/L'D'
Australie-Méridionale/L'D'
Australie-Occidentale/L'D'
Austrasie/L'D'
896
897
898
899
900
901
902

903
904
905
906
907
908
909
Benoîte
Benozillo
Benpro
Bentama
Bentham
Bentley
Benveniste

Berchem-Sainte-Agathe
Berck
Bercy
Bérenger
Bérengère
Bérénice
Bérézina







>







898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
Benoîte
Benozillo
Benpro
Bentama
Bentham
Bentley
Benveniste
Bérangère
Berchem-Sainte-Agathe
Berck
Bercy
Bérenger
Bérengère
Bérénice
Bérézina
1330
1331
1332
1333
1334
1335
1336

1337
1338
1339
1340
1341
1342
1343
Caine
Caïphe
Caire
Caitlin
Caitlyn
Calabre
Calais

Calc
Calcutta
Calderón
Caleb
Calédonie
Calestienne
Calgary







>







1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
Caine
Caïphe
Caire
Caitlin
Caitlyn
Calabre
Calais
Calaisis
Calc
Calcutta
Calderón
Caleb
Calédonie
Calestienne
Calgary
1646
1647
1648
1649
1650
1651
1652

1653
1654
1655
1656
1657
1658
1659
Chostakovitch
Chris
Christa
Christel
Christèle
Christelle
Christian

Christiane
Christie
Christina
Christine
Christmas
Christoffel
Christoph







>







1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
Chostakovitch
Chris
Christa
Christel
Christèle
Christelle
Christian
Christiana
Christiane
Christie
Christina
Christine
Christmas
Christoffel
Christoph
1674
1675
1676
1677
1678
1679
1680

1681
1682
1683
1684
1685
1686
1687
Cincinnati
Cindy
Ciney
Ciotat
Circassie
Circé
Cirey-sur-Vezouze

Cisjordanie
Cîteaux
Citroën
City
Claire
Clamart
Clara







>







1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
Cincinnati
Cindy
Ciney
Ciotat
Circassie
Circé
Cirey-sur-Vezouze
Cisco
Cisjordanie
Cîteaux
Citroën
City
Claire
Clamart
Clara
2487
2488
2489
2490
2491
2492
2493

2494
2495
2496
2497
2498
2499
2500
Eure-et-Loir/L'D'
Euripide/L'D'Q'
Eurobaromètre/S*
Eurogroupe/L'
Euronext/L'D'Q'
Europe/L'D'
Europol/D'Q'

Eurozone/L'
Eurydice/L'D'Q'
Eusèbe/L'D'Q'
Euterpe/L'D'Q'
Eva/L'D'Q'
Éva/L'D'Q'
Évaine/L'D'Q'







>







2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
Eure-et-Loir/L'D'
Euripide/L'D'Q'
Eurobaromètre/S*
Eurogroupe/L'
Euronext/L'D'Q'
Europe/L'D'
Europol/D'Q'
Eurotunnel/L'D'Q'
Eurozone/L'
Eurydice/L'D'Q'
Eusèbe/L'D'Q'
Euterpe/L'D'Q'
Eva/L'D'Q'
Éva/L'D'Q'
Évaine/L'D'Q'
2597
2598
2599
2600
2601
2602
2603

2604
2605
2606
2607
2608
2609
2610
Fayard
Fayçal
Fayette
Fécamp
Fed
FedEx
Federer

Federico
Fehling
Feist
Feïza
Feldane
Felicia
Félicie







>







2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
Fayard
Fayçal
Fayette
Fécamp
Fed
FedEx
Federer
Federica
Federico
Fehling
Feist
Feïza
Feldane
Felicia
Félicie
3219
3220
3221
3222
3223
3224
3225

3226
3227
3228
3229
3230
3231
3232
Halluin/L'D'Q'
Ham/L'D'Q'
Hamas
Hambourg
Hamel
Hamid/L'D'Q'
Hamilton

Hamme
HammerFall
Hammourabi
Hamont-Achel/L'D'Q'
Hampshire
Ham-sur-Heure-Nalinnes/L'D'Q'
Hamza/L'D'Q'







>







3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
Halluin/L'D'Q'
Ham/L'D'Q'
Hamas
Hambourg
Hamel
Hamid/L'D'Q'
Hamilton
Hamlet/L'D'Q'
Hamme
HammerFall
Hammourabi
Hamont-Achel/L'D'Q'
Hampshire
Ham-sur-Heure-Nalinnes/L'D'Q'
Hamza/L'D'Q'
3465
3466
3467
3468
3469
3470
3471

3472
3473
3474
3475
3476
3477
3478
Howard
Hubble
Hubei
Hubert/L'D'Q'
Hubscher
Hudson/L'D'Q'
Huelgoat

Hugo/L'D'Q'
Hugo/L'D'Q'
Hugues/L'D'Q'
Huguette
Hulshout/L'D'Q'
Hume
Hun/S.







>







3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
Howard
Hubble
Hubei
Hubert/L'D'Q'
Hubscher
Hudson/L'D'Q'
Huelgoat
Hugh/L'D'Q'
Hugo/L'D'Q'
Hugo/L'D'Q'
Hugues/L'D'Q'
Huguette
Hulshout/L'D'Q'
Hume
Hun/S.
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
IMSI/L'D'Q'
INED/L'D'Q'
INPI/L'D'Q'
INRA/L'D'Q'
INRI/L'D'Q'
INRIA/L'D'Q'
INSA/L'D'Q'
INSERM/L'D'Q'
IP/L'D'Q'
IRA/L'
IRD/L'D'Q'
IRFM/L'D'Q'
IRL
IRM/L'D'Q'
IRSTEA/L'D'Q'







<







3529
3530
3531
3532
3533
3534
3535

3536
3537
3538
3539
3540
3541
3542
IMSI/L'D'Q'
INED/L'D'Q'
INPI/L'D'Q'
INRA/L'D'Q'
INRI/L'D'Q'
INRIA/L'D'Q'
INSA/L'D'Q'

IP/L'D'Q'
IRA/L'
IRD/L'D'Q'
IRFM/L'D'Q'
IRL
IRM/L'D'Q'
IRSTEA/L'D'Q'
3598
3599
3600
3601
3602
3603
3604

3605
3606
3607
3608
3609
3610
3611
Ingrid/L'D'Q'
Inkscape/L'D'Q'
Inn/L'D'
Inna/L'D'Q'
Innsmouth/L'D'Q'
Inovia/L'D'Q'
Insee/L'D'Q'

Insulinde/L'D'
Intel/L'D'Q'
Internet/D'Q'
Interpol/D'Q'
Io/L'D'Q'
Ionesco/L'D'Q'
Ioulia/L'D'Q'







>







3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
Ingrid/L'D'Q'
Inkscape/L'D'Q'
Inn/L'D'
Inna/L'D'Q'
Innsmouth/L'D'Q'
Inovia/L'D'Q'
Insee/L'D'Q'
Inserm/L'D'Q'
Insulinde/L'D'
Intel/L'D'Q'
Internet/D'Q'
Interpol/D'Q'
Io/L'D'Q'
Ionesco/L'D'Q'
Ioulia/L'D'Q'
4300
4301
4302
4303
4304
4305
4306

4307
4308
4309
4310
4311
4312
4313
Léonore
Léontine
Léopold
Léopoldine
Leopoldt
Léopoldville
Leroy

Lesbos
Lesieur
Lesley
Leslie
Lesneven
Lesotho
Lesse







>







4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
Léonore
Léontine
Léopold
Léopoldine
Leopoldt
Léopoldville
Leroy
Lesage
Lesbos
Lesieur
Lesley
Leslie
Lesneven
Lesotho
Lesse
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
Noisy-le-Grand
Noisy-le-Sec
Nokia
Nolan
Nolwenn
Nora
Norbert
Nord
Nord-Kivu
Nord-Pas-de-Calais
Nord-du-Québec
Nordine
Norfolk
Norique
Norma







<







5488
5489
5490
5491
5492
5493
5494

5495
5496
5497
5498
5499
5500
5501
Noisy-le-Grand
Noisy-le-Sec
Nokia
Nolan
Nolwenn
Nora
Norbert

Nord-Kivu
Nord-Pas-de-Calais
Nord-du-Québec
Nordine
Norfolk
Norique
Norma
6213
6214
6215
6216
6217
6218
6219

6220
6221
6222
6223
6224
6225
6226
Reidemeister
Reiko
Reims
Reiten
Relecq-Kerhuon
Rellich
Rembrandt

Rémi
Remich
Remire-Montjoly
Remus
Rémy
Renaix
Renan







>







6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
Reidemeister
Reiko
Reims
Reiten
Relecq-Kerhuon
Rellich
Rembrandt
Remi
Rémi
Remich
Remire-Montjoly
Remus
Rémy
Renaix
Renan
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
Rosita
Rosny-sous-Bois
Ross
Rossini
Rossinière
Rostand
Roswell
Roth
Roth
Rothbard
Rothschild
Rotin
Rotselaar
Rotterdam
Roubaix







<







6394
6395
6396
6397
6398
6399
6400

6401
6402
6403
6404
6405
6406
6407
Rosita
Rosny-sous-Bois
Ross
Rossini
Rossinière
Rostand
Roswell

Roth
Rothbard
Rothschild
Rotin
Rotselaar
Rotterdam
Roubaix
9094
9095
9096
9097
9098
9099
9100
9101
9102
9103
9104
9105

9106
9107
9108
9109
9110
9111
9112
additionnelle/F*
additionnellement/D'Q'
additionner/a4p+
additionneuse/F*
additive/F*
additivement/D'Q'
additivité/S*
addon/S*
adducteur/S*
adduction/S*
adduit/S*
adèle/S*

adelphophagie/S*
adénine/S*
adénite/S*
adénocarcinome/S*
adénogramme/S*
adénoïde/S*
adénoïdectomie/S*







|




>







9104
9105
9106
9107
9108
9109
9110
9111
9112
9113
9114
9115
9116
9117
9118
9119
9120
9121
9122
9123
additionnelle/F*
additionnellement/D'Q'
additionner/a4p+
additionneuse/F*
additive/F*
additivement/D'Q'
additivité/S*
add-on/S*
adducteur/S*
adduction/S*
adduit/S*
adèle/S*
adelphe/S*
adelphophagie/S*
adénine/S*
adénite/S*
adénocarcinome/S*
adénogramme/S*
adénoïde/S*
adénoïdectomie/S*
9791
9792
9793
9794
9795
9796
9797

9798
9799
9800
9801
9802
9803
9804
agroalimentaire/S*
agro-alimentaire/S*
agroalimentaire/S*
agro-alimentaire/S*
agrobiologie/S*
agrobiologique/S*
agrobiologiste/S*

agrocarburant/S*
agro-carburant/S*
agrochimie/S*
agrochimique/S*
agrochimiste/S*
agroclimatique/S*
agro-climatique/S*







>







9802
9803
9804
9805
9806
9807
9808
9809
9810
9811
9812
9813
9814
9815
9816
agroalimentaire/S*
agro-alimentaire/S*
agroalimentaire/S*
agro-alimentaire/S*
agrobiologie/S*
agrobiologique/S*
agrobiologiste/S*
agrobusiness/L'D'Q'
agrocarburant/S*
agro-carburant/S*
agrochimie/S*
agrochimique/S*
agrochimiste/S*
agroclimatique/S*
agro-climatique/S*
9940
9941
9942
9943
9944
9945
9946

9947
9948
9949
9950
9951
9952
9953
aillade/S*
ailler/a2p+
ailleurs/L'D'Q'
ailloli/S*
aimable/S*
aimablement/D'Q'
aimant/S*

aimantation/S*
aimante/F*
aimanter/a4p+
aimantin/S*
aimantine/F*
aimée/F*
aimer/a4p+







>







9952
9953
9954
9955
9956
9957
9958
9959
9960
9961
9962
9963
9964
9965
9966
aillade/S*
ailler/a2p+
ailleurs/L'D'Q'
ailloli/S*
aimable/S*
aimablement/D'Q'
aimant/S*
aimantable/S*
aimantation/S*
aimante/F*
aimanter/a4p+
aimantin/S*
aimantine/F*
aimée/F*
aimer/a4p+
10600
10601
10602
10603
10604
10605
10606
10607
10608
10609
10610
10611
10612
10613
10614
amathie/S*
amatir/f2p+
amatrice/F*
amaurose/S*
amazone/S*
amazonienne/F*
amazonite/S*
ambages/D'Q'
ambassade/S*
ambassadrice/F*
ambiance/S*
ambiancer/a1p.
ambianceuse/F*
ambiante/F*
ambidextre/S*







|







10613
10614
10615
10616
10617
10618
10619
10620
10621
10622
10623
10624
10625
10626
10627
amathie/S*
amatir/f2p+
amatrice/F*
amaurose/S*
amazone/S*
amazonienne/F*
amazonite/S*
ambage/S*
ambassade/S*
ambassadrice/F*
ambiance/S*
ambiancer/a1p.
ambianceuse/F*
ambiante/F*
ambidextre/S*
11471
11472
11473
11474
11475
11476
11477

11478
11479
11480
11481
11482
11483
11484
annuité/S*
annulabilité/S*
annulable/S*
annulaire/S*
annulation/S*
annulative/F*
annulatrice/F*

annuler/a4p+
annuus
anoblir/f4p+
anoblissante/F*
anoblissement/S*
anode/S*
anodine/F*







>







11484
11485
11486
11487
11488
11489
11490
11491
11492
11493
11494
11495
11496
11497
11498
annuité/S*
annulabilité/S*
annulable/S*
annulaire/S*
annulation/S*
annulative/F*
annulatrice/F*
annulement/S*
annuler/a4p+
annuus
anoblir/f4p+
anoblissante/F*
anoblissement/S*
anode/S*
anodine/F*
11818
11819
11820
11821
11822
11823
11824


11825
11826
11827
11828
11829
11830
11831
antienzyme/S*
anti-enzyme/S*
antiépileptique/S*
antiesclavagiste/S*
antiestrogène/S*
antiestrogène/S*
antiétatique/S*


antifading/S*
antifascisme/S*
antifasciste/S*
antiféminisme/S*
antiféministe/S*
antiferment/S*
antiferroélectricité/S*







>
>







11832
11833
11834
11835
11836
11837
11838
11839
11840
11841
11842
11843
11844
11845
11846
11847
antienzyme/S*
anti-enzyme/S*
antiépileptique/S*
antiesclavagiste/S*
antiestrogène/S*
antiestrogène/S*
antiétatique/S*
antiétatisme/S*
antifa/S*
antifading/S*
antifascisme/S*
antifasciste/S*
antiféminisme/S*
antiféministe/S*
antiferment/S*
antiferroélectricité/S*
12690
12691
12692
12693
12694
12695
12696

12697
12698
12699
12700
12701
12702
12703
arcade/S*
arcane/S*
arcanson/S*
arcasse/S*
arcature/S*
arc-boutant/L'D'Q'
arcboutant/S*

arcbouter/a4p+
arc-bouter/a4p+
arccos
arccosh
arccotan
arccotanh
arc-doubleau/L'D'Q'







>







12706
12707
12708
12709
12710
12711
12712
12713
12714
12715
12716
12717
12718
12719
12720
arcade/S*
arcane/S*
arcanson/S*
arcasse/S*
arcature/S*
arc-boutant/L'D'Q'
arcboutant/S*
arc-boutement
arcbouter/a4p+
arc-bouter/a4p+
arccos
arccosh
arccotan
arccotanh
arc-doubleau/L'D'Q'
12789
12790
12791
12792
12793
12794
12795

12796
12797
12798
12799
12800
12801
12802
archontat/S*
archonte/S*
archosaurien/S*
archure/S*
arçon/S*
arçonner/a2p+
arcs-boutants/D'Q'

arcs-doubleaux/D'Q'
arcs-en-ciel/D'Q'
arcsin
arcsinh
arctan
arctanh
arctique/S*







>







12806
12807
12808
12809
12810
12811
12812
12813
12814
12815
12816
12817
12818
12819
12820
archontat/S*
archonte/S*
archosaurien/S*
archure/S*
arçon/S*
arçonner/a2p+
arcs-boutants/D'Q'
arcs-boutements
arcs-doubleaux/D'Q'
arcs-en-ciel/D'Q'
arcsin
arcsinh
arctan
arctanh
arctique/S*
15840
15841
15842
15843
15844
15845
15846

15847
15848
15849
15850
15851
15852
15853
bernard-l'hermite
berne/S.
berner/a0p+
berneuse/F.
bernicle/S.
bernique
bernique/S.

berrichonne/F.
bersaglier/S.
berthon/S.
bertillonnage/S.
béryl/S.
bérylliose/S.
béryllium/S.







>







15858
15859
15860
15861
15862
15863
15864
15865
15866
15867
15868
15869
15870
15871
15872
bernard-l'hermite
berne/S.
berner/a0p+
berneuse/F.
bernicle/S.
bernique
bernique/S.
bernoise/F.
berrichonne/F.
bersaglier/S.
berthon/S.
bertillonnage/S.
béryl/S.
bérylliose/S.
béryllium/S.
18240
18241
18242
18243
18244
18245
18246

18247
18248
18249
18250
18251
18252
18253
bugne/S.
bugrane/S.
buguée/F.
build/S.
building/S.
buire/S.
buis

buisson/S.
buisson-ardent
buissonnante/F.
buissonnet/S.
buissonneuse/W.
buissonnière/F.
buissons-ardents







>







18259
18260
18261
18262
18263
18264
18265
18266
18267
18268
18269
18270
18271
18272
18273
bugne/S.
bugrane/S.
buguée/F.
build/S.
building/S.
buire/S.
buis
buissaie/S.
buisson/S.
buisson-ardent
buissonnante/F.
buissonnet/S.
buissonneuse/W.
buissonnière/F.
buissons-ardents
18614
18615
18616
18617
18618
18619
18620

18621
18622
18623
18624
18625
18626
18627
cadrer/a0p+
cadreuse/F.
cadriciel/S.
caduc/S.
caducée/S.
caducifoliée/F.
caducité/S.

caduque/S.
cæcale/W.
cæcotrophie/S.
cæcum/S.
caennaise/F.
cænogenèse/S.
cæsine







>







18634
18635
18636
18637
18638
18639
18640
18641
18642
18643
18644
18645
18646
18647
18648
cadrer/a0p+
cadreuse/F.
cadriciel/S.
caduc/S.
caducée/S.
caducifoliée/F.
caducité/S.
caduque/F.
caduque/S.
cæcale/W.
cæcotrophie/S.
cæcum/S.
caennaise/F.
cænogenèse/S.
cæsine
19021
19022
19023
19024
19025
19026
19027
19028
19029
19030
19031
19032
19033
19034
19035
19036
camping-car/S.
camping-caravaning/S.
camping-gaz
campinoise/F.
campo/S.
campus
camuse/F.
canada
canada/S.
canadianisme/S.
canadienne/F.
canado-américaine/F.
canaille/S.
canaillement
canaillerie/S.
canaillocratie/S.







|
|







19042
19043
19044
19045
19046
19047
19048
19049
19050
19051
19052
19053
19054
19055
19056
19057
camping-car/S.
camping-caravaning/S.
camping-gaz
campinoise/F.
campo/S.
campus
camuse/F.
canada/S.
canadair/S.
canadianisme/S.
canadienne/F.
canado-américaine/F.
canaille/S.
canaillement
canaillerie/S.
canaillocratie/S.
20043
20044
20045
20046
20047
20048
20049

20050
20051
20052
20053
20054
20055
20056
caucasique/S.
cauchemar/S.
cauchemarder/a0p.
cauchemardesque/S.
cauchemardeuse/W.
caucus
caudale/W.

caudataire/S.
caudataire/S.
caudillo/S.
caudine/S.
caudrette/S.
caulescente/F.
caulicole/S.







>







20064
20065
20066
20067
20068
20069
20070
20071
20072
20073
20074
20075
20076
20077
20078
caucasique/S.
cauchemar/S.
cauchemarder/a0p.
cauchemardesque/S.
cauchemardeuse/W.
caucus
caudale/W.
caudalie/S.
caudataire/S.
caudataire/S.
caudillo/S.
caudine/S.
caudrette/S.
caulescente/F.
caulicole/S.
24961
24962
24963
24964
24965
24966
24967

24968
24969
24970
24971
24972
24973
24974
corruptrice/F.
corsage/S.
corsaire/S.
corse/S.
corselet/S.
corser/a0p+
corset/S.

corseter/b0p+
corseterie/S.
corsetière/F.
corso/S.
cortège/S.
cortès
cortex







>







24983
24984
24985
24986
24987
24988
24989
24990
24991
24992
24993
24994
24995
24996
24997
corruptrice/F.
corsage/S.
corsaire/S.
corse/S.
corselet/S.
corser/a0p+
corset/S.
corsetage/S.
corseter/b0p+
corseterie/S.
corsetière/F.
corso/S.
cortège/S.
cortès
cortex
26567
26568
26569
26570
26571
26572
26573

26574
26575
26576
26577
26578
26579
26580
cytotoxique/S.
czar/S.
czardas
czimbalum/S.
d
d/||--
dB/||--

dacryoadénite/S.
dacryocystite/S.
dactyle/S.
dactylique/S.
dactylo/S.
dactylogramme/S.
dactylographe/S.







>







26590
26591
26592
26593
26594
26595
26596
26597
26598
26599
26600
26601
26602
26603
26604
cytotoxique/S.
czar/S.
czardas
czimbalum/S.
d
d/||--
dB/||--
daba/S.
dacryoadénite/S.
dacryocystite/S.
dactyle/S.
dactylique/S.
dactylo/S.
dactylogramme/S.
dactylographe/S.
28388
28389
28390
28391
28392
28393
28394

28395
28396
28397
28398
28399
28400
28401
dénombrabilité/S.
dénombrable/S.
dénombrement/S.
dénombrer/a0p+
dénominateur/S.
dénomination/S.
dénominative/F.

dénommer/a0p+
dénoncer/a0p+
dénonciation/S.
dénonciatrice/F.
dénotation/S.
dénotationnelle/F.
dénotative/F.







>







28412
28413
28414
28415
28416
28417
28418
28419
28420
28421
28422
28423
28424
28425
28426
dénombrabilité/S.
dénombrable/S.
dénombrement/S.
dénombrer/a0p+
dénominateur/S.
dénomination/S.
dénominative/F.
dénommable/S.
dénommer/a0p+
dénoncer/a0p+
dénonciation/S.
dénonciatrice/F.
dénotation/S.
dénotationnelle/F.
dénotative/F.
29201
29202
29203
29204
29205
29206
29207

29208
29209
29210
29211
29212
29213
29214
désincorporer/a0p+
désincrustation/S.
désincruster/a0p+
désinculper/a0p+
désindenter/a0p+
désindexation/S.
désindexer/a0p+

désindustrialisation/S.
désindustrialiser/a0p+
désinence/S.
désinentielle/F.
désinfectante/F.
désinfecter/a0p+
désinfection/S.







>







29226
29227
29228
29229
29230
29231
29232
29233
29234
29235
29236
29237
29238
29239
29240
désincorporer/a0p+
désincrustation/S.
désincruster/a0p+
désinculper/a0p+
désindenter/a0p+
désindexation/S.
désindexer/a0p+
désindividualiser/a0p+
désindustrialisation/S.
désindustrialiser/a0p+
désinence/S.
désinentielle/F.
désinfectante/F.
désinfecter/a0p+
désinfection/S.
29250
29251
29252
29253
29254
29255
29256

29257
29258
29259
29260
29261
29262
29263
désinviter/a0p+
désinvolte/S.
désinvoltement
désinvolture/S.
désir/S.
désirabilité/S.
désirable/S.

désirer/a0p+
désireuse/W.
désistement/S.
désister/a0p+
desman/S.
desmine/S.
desmodonte/S.







>







29276
29277
29278
29279
29280
29281
29282
29283
29284
29285
29286
29287
29288
29289
29290
désinviter/a0p+
désinvolte/S.
désinvoltement
désinvolture/S.
désir/S.
désirabilité/S.
désirable/S.
désirante/F.
désirer/a0p+
désireuse/W.
désistement/S.
désister/a0p+
desman/S.
desmine/S.
desmodonte/S.
29886
29887
29888
29889
29890
29891
29892

29893
29894
29895
29896
29897
29898
29899
diarrhée/S.
diarrhéique/S.
diarthrose/S.
diascope/S.
diascopie/S.
diascordium/S.
diaspora/S.

diastase/S.
diastasique/S.
diastème/S.
diastéréo-isomère/S.
diastole/S.
diastolique/S.
diastratique/S.







>







29913
29914
29915
29916
29917
29918
29919
29920
29921
29922
29923
29924
29925
29926
29927
diarrhée/S.
diarrhéique/S.
diarthrose/S.
diascope/S.
diascopie/S.
diascordium/S.
diaspora/S.
diasporique/S.
diastase/S.
diastasique/S.
diastème/S.
diastéréo-isomère/S.
diastole/S.
diastolique/S.
diastratique/S.
30621
30622
30623
30624
30625
30626
30627

30628
30629
30630
30631
30632
30633
30634
diversement
diverses
diversifiable/S.
diversification/S.
diversifier/a0p+
diversiforme/S.
diversion/S.

diversité/S.
diverticule/S.
diverticulite/S.
diverticulose/S.
divertimento/S.
divertir/f0p+
divertissante/F.







>







30649
30650
30651
30652
30653
30654
30655
30656
30657
30658
30659
30660
30661
30662
30663
diversement
diverses
diversifiable/S.
diversification/S.
diversifier/a0p+
diversiforme/S.
diversion/S.
diversitaire/S.
diversité/S.
diverticule/S.
diverticulite/S.
diverticulose/S.
divertimento/S.
divertir/f0p+
divertissante/F.
33289
33290
33291
33292
33293
33294
33295

33296
33297
33298
33299
33300
33301
33302
endoénergétique/S*
endogame/S*
endogamie/S*
endogamique/S*
endogée/F*
endogène/S*
endogénéité/S*

endolocalisation/S*
endolorir/f2p+
endolorissement/S*
endolymphe/S*
endomètre/S*
endométriose/S*
endométrite/S*







>







33318
33319
33320
33321
33322
33323
33324
33325
33326
33327
33328
33329
33330
33331
33332
endoénergétique/S*
endogame/S*
endogamie/S*
endogamique/S*
endogée/F*
endogène/S*
endogénéité/S*
endogroupe/S*
endolocalisation/S*
endolorir/f2p+
endolorissement/S*
endolymphe/S*
endomètre/S*
endométriose/S*
endométrite/S*
35133
35134
35135
35136
35137
35138
35139


35140
35141
35142
35143
35144
35145
35146
ethmoïdale/W*
ethmoïde/S*
ethmoïdite/S*
ethnarchie/S*
ethnarque/S*
ethnicisation/S*
ethniciser/a2p+


ethnicité/S*
ethnico-religieuse/W*
ethnie/S*
ethnique/S*
ethniquement/D'Q'
ethnobiologie/S*
ethnobotanique/S*







>
>







35163
35164
35165
35166
35167
35168
35169
35170
35171
35172
35173
35174
35175
35176
35177
35178
ethmoïdale/W*
ethmoïde/S*
ethmoïdite/S*
ethnarchie/S*
ethnarque/S*
ethnicisation/S*
ethniciser/a2p+
ethnicisme/S*
ethniciste/S*
ethnicité/S*
ethnico-religieuse/W*
ethnie/S*
ethnique/S*
ethniquement/D'Q'
ethnobiologie/S*
ethnobotanique/S*
35170
35171
35172
35173
35174
35175
35176

35177
35178
35179
35180
35181
35182
35183
ethnométhodologue/S*
ethnomusicologie/S*
ethnomusicologue/S*
ethnonyme/S*
ethnonymie/S*
ethnopsychiatrie/S*
ethnopsychologie/S*

ethnoreligieuse/W*
éthographie/S*
éthologie/S*
éthologique/S*
éthologiste/S*
éthologue/S*
ethos/L'D'Q'







>







35202
35203
35204
35205
35206
35207
35208
35209
35210
35211
35212
35213
35214
35215
35216
ethnométhodologue/S*
ethnomusicologie/S*
ethnomusicologue/S*
ethnonyme/S*
ethnonymie/S*
ethnopsychiatrie/S*
ethnopsychologie/S*
ethno-raciale/W*
ethnoreligieuse/W*
éthographie/S*
éthologie/S*
éthologique/S*
éthologiste/S*
éthologue/S*
ethos/L'D'Q'
35781
35782
35783
35784
35785
35786
35787

35788
35789
35790
35791
35792
35793
35794
exode/S*
exoderme/S*
exogame/S*
exogamie/S*
exogamique/S*
exogène/S*
exogénéité/S*

exomphale/S*
exon/S*
exondation/S*
exondement/S*
exonder/a3p+
exonération/S*
exonérer/c4p+







>







35814
35815
35816
35817
35818
35819
35820
35821
35822
35823
35824
35825
35826
35827
35828
exode/S*
exoderme/S*
exogame/S*
exogamie/S*
exogamique/S*
exogène/S*
exogénéité/S*
exogroupe/S*
exomphale/S*
exon/S*
exondation/S*
exondement/S*
exonder/a3p+
exonération/S*
exonérer/c4p+
35989
35990
35991
35992
35993
35994
35995


35996
35997
35998
35999
36000
36001
36002
extensionnelle/F*
extensité/S*
extensive/F*
extensivement/L'D'Q'
extensivité/S*
extenso
extensomètre/S*


exténuante/F*
exténuation/S*
exténuée/F*
exténuement/S*
exténuer/a4p+
extérieur/S*
extérieure/F*







>
>







36023
36024
36025
36026
36027
36028
36029
36030
36031
36032
36033
36034
36035
36036
36037
36038
extensionnelle/F*
extensité/S*
extensive/F*
extensivement/L'D'Q'
extensivité/S*
extenso
extensomètre/S*
extensométrie/S*
extensométrique/S*
exténuante/F*
exténuation/S*
exténuée/F*
exténuement/S*
exténuer/a4p+
extérieur/S*
extérieure/F*
37191
37192
37193
37194
37195
37196
37197

37198
37199
37200
37201
37202
37203
37204
filoselle/S.
filou/S.
filoutage/S.
filouter/a0p+
filouterie/S.
filovirus
fils

filtrable/S.
filtrage/S.
filtrante/F.
filtrat/S.
filtration/S.
filtre/S.
filtre-presse







>







37227
37228
37229
37230
37231
37232
37233
37234
37235
37236
37237
37238
37239
37240
37241
filoselle/S.
filou/S.
filoutage/S.
filouter/a0p+
filouterie/S.
filovirus
fils
filsdeputerie/S.
filtrable/S.
filtrage/S.
filtrante/F.
filtrat/S.
filtration/S.
filtre/S.
filtre-presse
38097
38098
38099
38100
38101
38102
38103

38104
38105
38106
38107
38108
38109
38110
foutou/S.
foutrale/F.
foutraque/S.
foutre/S.
foutre/tM
foutredieu
foutrement

foutriquet/S.
foutue/F.
fovéa/S.
fovéale/W.
fox
foxée/F.
fox-hound/S.







>







38134
38135
38136
38137
38138
38139
38140
38141
38142
38143
38144
38145
38146
38147
38148
foutou/S.
foutrale/F.
foutraque/S.
foutre/S.
foutre/tM
foutredieu
foutrement
foutrerie/S.
foutriquet/S.
foutue/F.
fovéa/S.
fovéale/W.
fox
foxée/F.
fox-hound/S.
41660
41661
41662
41663
41664
41665
41666


41667
41668
41669
41670
41671
41672
41673
haptonomie/S*
haptonomique/S*
haquebute/S.
haquenée/S.
haquet/S.
harakiri/S.
hara-kiri/S.


harangue/S.
haranguer/a0p+
harangueuse/F.
haras
harassante/F.
harassement/S.
harasser/a0p+







>
>







41698
41699
41700
41701
41702
41703
41704
41705
41706
41707
41708
41709
41710
41711
41712
41713
haptonomie/S*
haptonomique/S*
haquebute/S.
haquenée/S.
haquet/S.
harakiri/S.
hara-kiri/S.
haram
haram/S.
harangue/S.
haranguer/a0p+
harangueuse/F.
haras
harassante/F.
harassement/S.
harasser/a0p+
42977
42978
42979
42980
42981
42982
42983

42984
42985
42986
42987
42988
42989
42990

42991
42992
42993
42994
42995
42996
42997
hoyau/X.
hpz/||--
http/S=
huard/S.
huart/S.
hub/S.
hublot/S.

huche/S.
hucher/a0p+
huchet/S.
hue
huée/S.
huer/a0p+
huerta/S.

huguenote/F.
huilage/S*
huile/S*
huiler/a2p+
huilerie/S*
huileuse/W*
huilière/F*







>







>







43017
43018
43019
43020
43021
43022
43023
43024
43025
43026
43027
43028
43029
43030
43031
43032
43033
43034
43035
43036
43037
43038
43039
hoyau/X.
hpz/||--
http/S=
huard/S.
huart/S.
hub/S.
hublot/S.
hubris/L'D'Q'
huche/S.
hucher/a0p+
huchet/S.
hue
huée/S.
huer/a0p+
huerta/S.
hugolienne/F*
huguenote/F.
huilage/S*
huile/S*
huiler/a2p+
huilerie/S*
huileuse/W*
huilière/F*
43489
43490
43491
43492
43493
43494
43495


43496
43497
43498
43499
43500
43501
43502
hypertrophier/a4p+
hypertrophique/S*
hyperuricémie/S*
hypervariable/S*
hyperventilation/S*
hyperventiler/a1p.
hypervigilance/S*


hyperviscosité/S*
hyperviseur/S*
hypervitaminose/S*
hyphe/S*
hypholome/S*
hypnagogique/S*
hypnogramme/S*







>
>







43531
43532
43533
43534
43535
43536
43537
43538
43539
43540
43541
43542
43543
43544
43545
43546
hypertrophier/a4p+
hypertrophique/S*
hyperuricémie/S*
hypervariable/S*
hyperventilation/S*
hyperventiler/a1p.
hypervigilance/S*
hyperviolence/S*
hyperviolente/F*
hyperviscosité/S*
hyperviseur/S*
hypervitaminose/S*
hyphe/S*
hypholome/S*
hypnagogique/S*
hypnogramme/S*
43893
43894
43895
43896
43897
43898
43899

43900
43901
43902
43903
43904
43905
43906
illisibilité/S*
illisible/S*
illisiblement/D'Q'
illogique/S*
illogiquement/D'Q'
illogisme/S*
illuminante/F*

illumination/S*
illuminative/F*
illuminatrice/F*
illuminée/F*
illuminer/a4p+
illuminisme/S*
illusion/S*







>







43937
43938
43939
43940
43941
43942
43943
43944
43945
43946
43947
43948
43949
43950
43951
illisibilité/S*
illisible/S*
illisiblement/D'Q'
illogique/S*
illogiquement/D'Q'
illogisme/S*
illuminante/F*
illuminati/L'D'Q'
illumination/S*
illuminative/F*
illuminatrice/F*
illuminée/F*
illuminer/a4p+
illuminisme/S*
illusion/S*
44141
44142
44143
44144
44145
44146
44147

44148
44149
44150
44151
44152
44153
44154
imparisyllabique/S*
imparité/S*
impartageable/S*
impartiale/W*
impartialement/D'Q'
impartialité/S*
impartir/fC

impasse/S*
impassibilité/S*
impassible/S*
impassiblement/D'Q'
impatiemment/D'Q'
impatience/S*
impatiens/L'D'Q'







>







44186
44187
44188
44189
44190
44191
44192
44193
44194
44195
44196
44197
44198
44199
44200
imparisyllabique/S*
imparité/S*
impartageable/S*
impartiale/W*
impartialement/D'Q'
impartialité/S*
impartir/fC
impassable/S*
impasse/S*
impassibilité/S*
impassible/S*
impassiblement/D'Q'
impatiemment/D'Q'
impatience/S*
impatiens/L'D'Q'
47189
47190
47191
47192
47193
47194
47195

47196
47197
47198
47199
47200
47201
47202
jeuniste/S.
jeunotte/F.
jigger/S.
jihad/S.
jihadisme/S.
jihadiste/S.
jingle/S.

jiu-jitsu
jiujitsu/S.
joaillère/F.
joaillerie/S.
joaillière/F.
job/S.
job/S.







>







47235
47236
47237
47238
47239
47240
47241
47242
47243
47244
47245
47246
47247
47248
47249
jeuniste/S.
jeunotte/F.
jigger/S.
jihad/S.
jihadisme/S.
jihadiste/S.
jingle/S.
jinn/S.
jiu-jitsu
jiujitsu/S.
joaillère/F.
joaillerie/S.
joaillière/F.
job/S.
job/S.
47491
47492
47493
47494
47495
47496
47497

47498
47499
47500
47501
47502
47503
47504
kabic/S.
kabig/S.
kabuki/S.
kabyle/S.
kacha/S.
kachoube/S.
kaddish/S.

kafir/S.
kafkaïenne/F.
kaïnite/S.
kaiser/S.
kakapo/S.
kakatoès
kakawi/S.







>







47538
47539
47540
47541
47542
47543
47544
47545
47546
47547
47548
47549
47550
47551
47552
kabic/S.
kabig/S.
kabuki/S.
kabyle/S.
kacha/S.
kachoube/S.
kaddish/S.
kadi/S.
kafir/S.
kafkaïenne/F.
kaïnite/S.
kaiser/S.
kakapo/S.
kakatoès
kakawi/S.
47567
47568
47569
47570
47571
47572
47573

47574
47575
47576
47577
47578
47579
47580
karst/S.
karstification/S.
karstique/S.
karstologie/S.
kart/S.
karting/S.
kascher

kashrout
kat/U.||--
kata/S.
katakana
katakana/S.
katal/Um
katana/S.







>







47615
47616
47617
47618
47619
47620
47621
47622
47623
47624
47625
47626
47627
47628
47629
karst/S.
karstification/S.
karstique/S.
karstologie/S.
kart/S.
karting/S.
kascher
kasher
kashrout
kat/U.||--
kata/S.
katakana
katakana/S.
katal/Um
katana/S.
54170
54171
54172
54173
54174
54175
54176

54177
54178
54179
54180
54181
54182
54183
multidevise/S.
multidiffusion/S.
multidimensionnalité/S.
multidimensionnelle/F.
multidirectionnalité/S.
multidirectionnelle/F.
multidisciplinaire/S.

multiethnique/S.
multi-ethnique/S.
multifactorielle/F.
multifamiliale/W.
multifilaire/S.
multiflore/S.
multifonction/S.







>







54219
54220
54221
54222
54223
54224
54225
54226
54227
54228
54229
54230
54231
54232
54233
multidevise/S.
multidiffusion/S.
multidimensionnalité/S.
multidimensionnelle/F.
multidirectionnalité/S.
multidirectionnelle/F.
multidisciplinaire/S.
multidisciplinarité/S.
multiethnique/S.
multi-ethnique/S.
multifactorielle/F.
multifamiliale/W.
multifilaire/S.
multiflore/S.
multifonction/S.
56653
56654
56655
56656
56657
56658
56659
56660
56661
56662
56663
56664
56665
56666
56667
56668
oligoasthénotératospermie/S*
oligocène/S*
oligochète/S*
oligoclase/S*
oligodendrocyte/S*
oligodendrogliome/S*
oligoélément/S*
oligoélément/S*
oligo-élément/S*
oligo-élément/S*
oligogalacturonate/S*
oligo-galacturonate/S*
oligomère/S*
oligomérique/S*
oligomérisation/S*
oligonucléotide/S*







<
<







56703
56704
56705
56706
56707
56708
56709


56710
56711
56712
56713
56714
56715
56716
oligoasthénotératospermie/S*
oligocène/S*
oligochète/S*
oligoclase/S*
oligodendrocyte/S*
oligodendrogliome/S*
oligoélément/S*


oligo-élément/S*
oligogalacturonate/S*
oligo-galacturonate/S*
oligomère/S*
oligomérique/S*
oligomérisation/S*
oligonucléotide/S*
59760
59761
59762
59763
59764
59765
59766

59767
59768
59769
59770
59771
59772
59773
perceptiblement
perception/S.
perceptionnisme/S.
perceptionniste/S.
perceptive/F.
perceptrice/F.
perceptuelle/F.

percer/a0p+
percerette/S.
perceuse/F.
percevable/S.
percevoir/pK
perche/S.
percher/a0p+







>







59808
59809
59810
59811
59812
59813
59814
59815
59816
59817
59818
59819
59820
59821
59822
perceptiblement
perception/S.
perceptionnisme/S.
perceptionniste/S.
perceptive/F.
perceptrice/F.
perceptuelle/F.
perceptuellement
percer/a0p+
percerette/S.
perceuse/F.
percevable/S.
percevoir/pK
perche/S.
percher/a0p+
61518
61519
61520
61521
61522
61523
61524

61525
61526
61527
61528
61529
61530
61531
pizzaiolo/I.
pizzaïolo/S.
pizzeria/S.
pizzéria/S.
pizzicato/I.
placage/S.
placard/S.

placarder/a0p+
placardisation/S.
placardiser/a0p+
place/S.
placebo/S.
placébo/S.
placement/S.







>







61567
61568
61569
61570
61571
61572
61573
61574
61575
61576
61577
61578
61579
61580
61581
pizzaiolo/I.
pizzaïolo/S.
pizzeria/S.
pizzéria/S.
pizzicato/I.
placage/S.
placard/S.
placardage/S.
placarder/a0p+
placardisation/S.
placardiser/a0p+
place/S.
placebo/S.
placébo/S.
placement/S.
61766
61767
61768
61769
61770
61771
61772
61773
61774

61775
61776
61777
61778
61779
61780
61781
plâtrerie/S.
plâtreuse/W.
plâtrière/F.
plats-bords
plausibilité/S.
plausible/S.
plausiblement
play-back
playback/S.

playboy/S.
play-boy/S.
playlist/S.
play-list/S.
playon/S.
pléban/S.
plèbe/S.







<

>







61816
61817
61818
61819
61820
61821
61822

61823
61824
61825
61826
61827
61828
61829
61830
61831
plâtrerie/S.
plâtreuse/W.
plâtrière/F.
plats-bords
plausibilité/S.
plausible/S.
plausiblement

playback/S.
play-back/S.
playboy/S.
play-boy/S.
playlist/S.
play-list/S.
playon/S.
pléban/S.
plèbe/S.
61914
61915
61916
61917
61918
61919
61920

61921
61922
61923
61924
61925
61926
61927
ployage/S.
ployante/F.
ployer/a0p+
pluche/S.
plucher/a0p.
plucheuse/W.
plugin/S.

pluie/S.
plumage/S.
plumaison/S.
plumard/S.
plumasseau/X.
plumasserie/S.
plumassière/F.







>







61964
61965
61966
61967
61968
61969
61970
61971
61972
61973
61974
61975
61976
61977
61978
ployage/S.
ployante/F.
ployer/a0p+
pluche/S.
plucher/a0p.
plucheuse/W.
plugin/S.
plug-in/S.
pluie/S.
plumage/S.
plumaison/S.
plumard/S.
plumasseau/X.
plumasserie/S.
plumassière/F.
62336
62337
62338
62339
62340
62341
62342

62343
62344
62345
62346
62347
62348
62349
polychète/S.
polychlorobenzène/S.
polychlorure/S.
polychroïque/S.
polychroïsme/S.
polychrome/S.
polychromie/S.

polycistronique/S.
polyclinique/S.
polycondensat/S.
polycondensation/S.
polycopie/S.
polycopier/a0p+
polycourant







>







62387
62388
62389
62390
62391
62392
62393
62394
62395
62396
62397
62398
62399
62400
62401
polychète/S.
polychlorobenzène/S.
polychlorure/S.
polychroïque/S.
polychroïsme/S.
polychrome/S.
polychromie/S.
polychromique/S.
polycistronique/S.
polyclinique/S.
polycondensat/S.
polycondensation/S.
polycopie/S.
polycopier/a0p+
polycourant
62619
62620
62621
62622
62623
62624
62625

62626
62627
62628
62629
62630
62631
62632
popcorn/S.
pope/S.
popeline/S.
popinée/S.
poplitée/F.
popote/S.
popotin/S.

populace/S.
populacière/F.
populage/S.
populaire/S.
populairement
popularisation/S.
populariser/a0p+







>







62671
62672
62673
62674
62675
62676
62677
62678
62679
62680
62681
62682
62683
62684
62685
popcorn/S.
pope/S.
popeline/S.
popinée/S.
poplitée/F.
popote/S.
popotin/S.
popstar/S.
populace/S.
populacière/F.
populage/S.
populaire/S.
populairement
popularisation/S.
populariser/a0p+
63113
63114
63115
63116
63117
63118
63119
63120
63121
63122
63123
63124
63125
63126
63127
63128
poulaille/S.
poulailler/S.
poulaine/F.
poulamon/S.
poularde/S.
poulbot/S.
poule/S.
poulet/S.
poulette/S.
pouliage/S.
pouliche/S.
poulie/S.
pouliner/a0p.
poulinière/S.
poulinière/S.
pouliot/S.







<
|







63166
63167
63168
63169
63170
63171
63172

63173
63174
63175
63176
63177
63178
63179
63180
poulaille/S.
poulailler/S.
poulaine/F.
poulamon/S.
poularde/S.
poulbot/S.
poule/S.

poulette/F.
pouliage/S.
pouliche/S.
poulie/S.
pouliner/a0p.
poulinière/S.
poulinière/S.
pouliot/S.
64564
64565
64566
64567
64568
64569
64570

64571
64572
64573
64574
64575
64576
64577
protoplasme/S.
protoplasmique/S.
protoplaste/S.
protoptère/S.
protosulfure/S.
prototypage/S.
prototype/S.

prototypique/S.
prototypiste/S.
protoure/S.
protoxyde/S.
protozoaire/S.
protozoologie/S.
protractile/S.







>







64616
64617
64618
64619
64620
64621
64622
64623
64624
64625
64626
64627
64628
64629
64630
protoplasme/S.
protoplasmique/S.
protoplaste/S.
protoptère/S.
protosulfure/S.
prototypage/S.
prototype/S.
prototyper/a0p+
prototypique/S.
prototypiste/S.
protoure/S.
protoxyde/S.
protozoaire/S.
protozoologie/S.
protractile/S.
65100
65101
65102
65103
65104
65105
65106

65107
65108
65109
65110
65111
65112
65113
pusillanime/S.
pusillanimement
pusillanimité/S.
pustule/S.
pustuler/a0p+
pustuleuse/W.
putain/S.

putassière/F.
putative/F.
pute/S.
putier/S.
putiet/S.
putois
putréfaction/S.







>







65153
65154
65155
65156
65157
65158
65159
65160
65161
65162
65163
65164
65165
65166
65167
pusillanime/S.
pusillanimement
pusillanimité/S.
pustule/S.
pustuler/a0p+
pustuleuse/W.
putain/S.
putasserie/S.
putassière/F.
putative/F.
pute/S.
putier/S.
putiet/S.
putois
putréfaction/S.
70928
70929
70930
70931
70932
70933
70934

70935
70936
70937
70938
70939
70940
70941
sceau/X.
sceau-de-Salomon
sceaux-de-Salomon
scélérate/F.
scélératement
scélératesse/S.
scellage/S.

scellement/S.
sceller/a0p+
scénarimage/S.
scenario/I.
scénario/S.
scénarisation/S.
scénariser/a0p+







>







70982
70983
70984
70985
70986
70987
70988
70989
70990
70991
70992
70993
70994
70995
70996
sceau/X.
sceau-de-Salomon
sceaux-de-Salomon
scélérate/F.
scélératement
scélératesse/S.
scellage/S.
scellé/S.
scellement/S.
sceller/a0p+
scénarimage/S.
scenario/I.
scénario/S.
scénarisation/S.
scénariser/a0p+
71193
71194
71195
71196
71197
71198
71199

71200
71201
71202
71203
71204
71205
71206
scripturale/W.
scripturalisme/S.
scrofulaire/S.
scrofulariacée/S.
scrofule/S.
scrofuleuse/W.
scrogneugneu/X.

scrolling/S.
scrotale/W.
scrotum/S.
scrub/S.
scrubber/S.
scrupule/S.
scrupuleuse/W.







>







71248
71249
71250
71251
71252
71253
71254
71255
71256
71257
71258
71259
71260
71261
71262
scripturale/W.
scripturalisme/S.
scrofulaire/S.
scrofulariacée/S.
scrofule/S.
scrofuleuse/W.
scrogneugneu/X.
scroller/a0p.
scrolling/S.
scrotale/W.
scrotum/S.
scrub/S.
scrubber/S.
scrupule/S.
scrupuleuse/W.
75602
75603
75604
75605
75606
75607
75608

75609
75610
75611
75612
75613
75614
75615
syrah/S.
syriaque/S.
syriaque/S.
syrienne/F.
syringe/S.
syringomyélie/S.
syrinx

syrphe/S.
sysadmin/S.
systématicienne/F.
systématicité/S.
systématique/S.
systématique/S.
systématiquement







>







75658
75659
75660
75661
75662
75663
75664
75665
75666
75667
75668
75669
75670
75671
75672
syrah/S.
syriaque/S.
syriaque/S.
syrienne/F.
syringe/S.
syringomyélie/S.
syrinx
syro-libanaise/F.
syrphe/S.
sysadmin/S.
systématicienne/F.
systématicité/S.
systématique/S.
systématique/S.
systématiquement
75809
75810
75811
75812
75813
75814
75815

75816
75817
75818
75819
75820
75821
75822
talent/S.
talentueuse/W.
talentueusement
taler/a0p+
taleth/S.
taliatelle/S.
talibane/F.

talion/S.
talisman/S.
talismanique/S.
talith/S.
talitre/S.
talkies-walkies
talkie-walkie







>







75866
75867
75868
75869
75870
75871
75872
75873
75874
75875
75876
75877
75878
75879
75880
talent/S.
talentueuse/W.
talentueusement
taler/a0p+
taleth/S.
taliatelle/S.
talibane/F.
talibée/F.
talion/S.
talisman/S.
talismanique/S.
talith/S.
talitre/S.
talkies-walkies
talkie-walkie
78516
78517
78518
78519
78520
78521
78522

78523
78524
78525
78526
78527
78528
78529
trantran/S.
trapèze/S.
trapéziste/S.
trapézoèdre/S.
trapézoïdale/W.
trapézoïde/S.
trappe/S.

trappeuse/F.
trappillon/S.
trappiste/S.
trappistine/S.
trapue/F.
traque/S.
traquée/F.







>







78574
78575
78576
78577
78578
78579
78580
78581
78582
78583
78584
78585
78586
78587
78588
trantran/S.
trapèze/S.
trapéziste/S.
trapézoèdre/S.
trapézoïdale/W.
trapézoïde/S.
trappe/S.
trapper/a0p+
trappeuse/F.
trappillon/S.
trappiste/S.
trappistine/S.
trapue/F.
traque/S.
traquée/F.
80941
80942
80943
80944
80945
80946
80947

80948
80949
80950
80951
80952
80953
80954
vibrato/S.
vibratoire/S.
vibrer/a0p+
vibreur/S.
vibrion/S.
vibrionner/a0p.
vibrisse/S.

vibromasseur/S.
vicaire/S.
vicariale/W.
vicariance/S.
vicariante/F.
vicariat/S.
vice/S.







>







81000
81001
81002
81003
81004
81005
81006
81007
81008
81009
81010
81011
81012
81013
81014
vibrato/S.
vibratoire/S.
vibrer/a0p+
vibreur/S.
vibrion/S.
vibrionner/a0p.
vibrisse/S.
vibro/S.
vibromasseur/S.
vicaire/S.
vicariale/W.
vicariance/S.
vicariante/F.
vicariat/S.
vice/S.

Modified gc_lang/fr/xpi/data/dictionaries/fr-FR-classic/fr-FR-classic.aff from [72d1113ea1] to [9ff9f77367].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# AFFIXES DU DICTIONNAIRE ORTHOGRAPHIQUE FRANÇAIS “CLASSIQUE” v6.1
# par Olivier R. -- licence MPL 2.0
# Généré le 03-06-2017 à 22:26
# Pour améliorer le dictionnaire, allez sur http://www.dicollecte.org/



SET UTF-8

WORDCHARS -’'1234567890.




|

|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# AFFIXES DU DICTIONNAIRE ORTHOGRAPHIQUE FRANÇAIS “CLASSIQUE” v6.2
# par Olivier R. -- licence MPL 2.0
# Généré le 26-07-2017 à 09:33
# Pour améliorer le dictionnaire, allez sur http://www.dicollecte.org/



SET UTF-8

WORDCHARS -’'1234567890.

Modified gc_lang/fr/xpi/data/dictionaries/fr-FR-classic/fr-FR-classic.dic from [e917007d9d] to [15ed4f1dbd].

1
2
3
4
5
6
7
8
80033
&
1er/--
1ers/--
1re/--
1res/--
1ʳᵉ/--
1ʳᵉˢ/--
|







1
2
3
4
5
6
7
8
80108
&
1er/--
1ers/--
1re/--
1res/--
1ʳᵉ/--
1ʳᵉˢ/--
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
Aïcha/L'D'Q'
Aïd/L'D'Q'
Aida/L'D'Q'
Aidan/L'D'Q'
Aïd-el-Adha/L'
Aïd-el-Kébir/L'
Aiden/L'D'Q'
Aignan
Aigoual/L'D'
Aigrain/L'D'Q'
Aimé/L'D'Q'
Aimée/L'D'Q'
Ain/L'
Airaines/L'D'Q'
Airbnb/L'D'Q'







|







187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
Aïcha/L'D'Q'
Aïd/L'D'Q'
Aida/L'D'Q'
Aidan/L'D'Q'
Aïd-el-Adha/L'
Aïd-el-Kébir/L'
Aiden/L'D'Q'
Aignan/L'D'Q'
Aigoual/L'D'
Aigrain/L'D'Q'
Aimé/L'D'Q'
Aimée/L'D'Q'
Ain/L'
Airaines/L'D'Q'
Airbnb/L'D'Q'
529
530
531
532
533
534
535

536
537
538
539
540
541
542
Arion/L'D'Q'
Aristarque/L'D'Q'
Aristide/L'D'Q'
Aristophane/L'D'Q'
Aristote/L'D'Q'
Arizona/L'D'
Arjuna/L'D'Q'

Arkansas/L'D'
Arkema/L'D'Q'
Arkham/L'D'Q'
Arkhangelsk/L'D'Q'
Arlene/L'D'Q'
Arlène/L'D'Q'
Arles/L'D'Q'







>







529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
Arion/L'D'Q'
Aristarque/L'D'Q'
Aristide/L'D'Q'
Aristophane/L'D'Q'
Aristote/L'D'Q'
Arizona/L'D'
Arjuna/L'D'Q'
Arkady/L'D'Q'
Arkansas/L'D'
Arkema/L'D'Q'
Arkham/L'D'Q'
Arkhangelsk/L'D'Q'
Arlene/L'D'Q'
Arlène/L'D'Q'
Arles/L'D'Q'
651
652
653
654
655
656
657

658
659
660
661
662
663
664
Aurélien/L'D'Q'
Aurelio/L'D'Q'
Auriane/L'D'Q'
Aurillac/L'D'Q'
Auriol/L'D'Q'
Aurore/L'D'Q'
Auschwitz/L'D'Q'

Austerlitz/L'D'Q'
Austin/L'D'Q'
Australasie/L'D'Q'
Australie/L'D'
Australie-Méridionale/L'D'
Australie-Occidentale/L'D'
Austrasie/L'D'







>







652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
Aurélien/L'D'Q'
Aurelio/L'D'Q'
Auriane/L'D'Q'
Aurillac/L'D'Q'
Auriol/L'D'Q'
Aurore/L'D'Q'
Auschwitz/L'D'Q'
Austen/L'D'Q'
Austerlitz/L'D'Q'
Austin/L'D'Q'
Australasie/L'D'Q'
Australie/L'D'
Australie-Méridionale/L'D'
Australie-Occidentale/L'D'
Austrasie/L'D'
896
897
898
899
900
901
902

903
904
905
906
907
908
909
Benoîte
Benozillo
Benpro
Bentama
Bentham
Bentley
Benveniste

Berchem-Sainte-Agathe
Berck
Bercy
Bérenger
Bérengère
Bérénice
Bérézina







>







898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
Benoîte
Benozillo
Benpro
Bentama
Bentham
Bentley
Benveniste
Bérangère
Berchem-Sainte-Agathe
Berck
Bercy
Bérenger
Bérengère
Bérénice
Bérézina
1330
1331
1332
1333
1334
1335
1336

1337
1338
1339
1340
1341
1342
1343
Caine
Caïphe
Caire
Caitlin
Caitlyn
Calabre
Calais

Calc
Calcutta
Calderón
Caleb
Calédonie
Calestienne
Calgary







>







1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
Caine
Caïphe
Caire
Caitlin
Caitlyn
Calabre
Calais
Calaisis
Calc
Calcutta
Calderón
Caleb
Calédonie
Calestienne
Calgary
1646
1647
1648
1649
1650
1651
1652

1653
1654
1655
1656
1657
1658
1659
Chostakovitch
Chris
Christa
Christel
Christèle
Christelle
Christian

Christiane
Christie
Christina
Christine
Christmas
Christoffel
Christoph







>







1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
Chostakovitch
Chris
Christa
Christel
Christèle
Christelle
Christian
Christiana
Christiane
Christie
Christina
Christine
Christmas
Christoffel
Christoph
1674
1675
1676
1677
1678
1679
1680

1681
1682
1683
1684
1685
1686
1687
Cincinnati
Cindy
Ciney
Ciotat
Circassie
Circé
Cirey-sur-Vezouze

Cisjordanie
Cîteaux
Citroën
City
Claire
Clamart
Clara







>







1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
Cincinnati
Cindy
Ciney
Ciotat
Circassie
Circé
Cirey-sur-Vezouze
Cisco
Cisjordanie
Cîteaux
Citroën
City
Claire
Clamart
Clara
2486
2487
2488
2489
2490
2491
2492

2493
2494
2495
2496
2497
2498
2499
Eure-et-Loir/L'D'
Euripide/L'D'Q'
Eurobaromètre/S*
Eurogroupe/L'
Euronext/L'D'Q'
Europe/L'D'
Europol/D'Q'

Eurozone/L'
Eurydice/L'D'Q'
Eusèbe/L'D'Q'
Euterpe/L'D'Q'
Eva/L'D'Q'
Éva/L'D'Q'
Évaine/L'D'Q'







>







2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
Eure-et-Loir/L'D'
Euripide/L'D'Q'
Eurobaromètre/S*
Eurogroupe/L'
Euronext/L'D'Q'
Europe/L'D'
Europol/D'Q'
Eurotunnel/L'D'Q'
Eurozone/L'
Eurydice/L'D'Q'
Eusèbe/L'D'Q'
Euterpe/L'D'Q'
Eva/L'D'Q'
Éva/L'D'Q'
Évaine/L'D'Q'
2596
2597
2598
2599
2600
2601
2602

2603
2604
2605
2606
2607
2608
2609
Fayard
Fayçal
Fayette
Fécamp
Fed
FedEx
Federer

Federico
Fehling
Feist
Feïza
Feldane
Felicia
Félicie







>







2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
Fayard
Fayçal
Fayette
Fécamp
Fed
FedEx
Federer
Federica
Federico
Fehling
Feist
Feïza
Feldane
Felicia
Félicie
3217
3218
3219
3220
3221
3222
3223

3224
3225
3226
3227
3228
3229
3230
Halluin/L'D'Q'
Ham/L'D'Q'
Hamas
Hambourg
Hamel
Hamid/L'D'Q'
Hamilton

Hamme
HammerFall
Hammourabi
Hamont-Achel/L'D'Q'
Hampshire
Ham-sur-Heure-Nalinnes/L'D'Q'
Hamza/L'D'Q'







>







3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
Halluin/L'D'Q'
Ham/L'D'Q'
Hamas
Hambourg
Hamel
Hamid/L'D'Q'
Hamilton
Hamlet/L'D'Q'
Hamme
HammerFall
Hammourabi
Hamont-Achel/L'D'Q'
Hampshire
Ham-sur-Heure-Nalinnes/L'D'Q'
Hamza/L'D'Q'
3462
3463
3464
3465
3466
3467
3468

3469
3470
3471
3472
3473
3474
3475
Howard
Hubble
Hubei
Hubert/L'D'Q'
Hubscher
Hudson/L'D'Q'
Huelgoat

Hugo/L'D'Q'
Hugo/L'D'Q'
Hugues/L'D'Q'
Huguette
Hulshout/L'D'Q'
Hume
Hun/S.







>







3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
Howard
Hubble
Hubei
Hubert/L'D'Q'
Hubscher
Hudson/L'D'Q'
Huelgoat
Hugh/L'D'Q'
Hugo/L'D'Q'
Hugo/L'D'Q'
Hugues/L'D'Q'
Huguette
Hulshout/L'D'Q'
Hume
Hun/S.
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
IMSI/L'D'Q'
INED/L'D'Q'
INPI/L'D'Q'
INRA/L'D'Q'
INRI/L'D'Q'
INRIA/L'D'Q'
INSA/L'D'Q'
INSERM/L'D'Q'
IP/L'D'Q'
IRA/L'
IRD/L'D'Q'
IRFM/L'D'Q'
IRL
IRM/L'D'Q'
IRSTEA/L'D'Q'







<







3526
3527
3528
3529
3530
3531
3532

3533
3534
3535
3536
3537
3538
3539
IMSI/L'D'Q'
INED/L'D'Q'
INPI/L'D'Q'
INRA/L'D'Q'
INRI/L'D'Q'
INRIA/L'D'Q'
INSA/L'D'Q'

IP/L'D'Q'
IRA/L'
IRD/L'D'Q'
IRFM/L'D'Q'
IRL
IRM/L'D'Q'
IRSTEA/L'D'Q'
3595
3596
3597
3598
3599
3600
3601

3602
3603
3604
3605
3606
3607
3608
Ingrid/L'D'Q'
Inkscape/L'D'Q'
Inn/L'D'
Inna/L'D'Q'
Innsmouth/L'D'Q'
Inovia/L'D'Q'
Insee/L'D'Q'

Insulinde/L'D'
Intel/L'D'Q'
Internet/D'Q'
Interpol/D'Q'
Io/L'D'Q'
Ionesco/L'D'Q'
Ioulia/L'D'Q'







>







3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
Ingrid/L'D'Q'
Inkscape/L'D'Q'
Inn/L'D'
Inna/L'D'Q'
Innsmouth/L'D'Q'
Inovia/L'D'Q'
Insee/L'D'Q'
Inserm/L'D'Q'
Insulinde/L'D'
Intel/L'D'Q'
Internet/D'Q'
Interpol/D'Q'
Io/L'D'Q'
Ionesco/L'D'Q'
Ioulia/L'D'Q'
4297
4298
4299
4300
4301
4302
4303

4304
4305
4306
4307
4308
4309
4310
Léonore
Léontine
Léopold
Léopoldine
Leopoldt
Léopoldville
Leroy

Lesbos
Lesieur
Lesley
Leslie
Lesneven
Lesotho
Lesse







>







4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
Léonore
Léontine
Léopold
Léopoldine
Leopoldt
Léopoldville
Leroy
Lesage
Lesbos
Lesieur
Lesley
Leslie
Lesneven
Lesotho
Lesse
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
Noisy-le-Grand
Noisy-le-Sec
Nokia
Nolan
Nolwenn
Nora
Norbert
Nord
Nord-Kivu
Nord-Pas-de-Calais
Nord-du-Québec
Nordine
Norfolk
Norique
Norma







<







5485
5486
5487
5488
5489
5490
5491

5492
5493
5494
5495
5496
5497
5498
Noisy-le-Grand
Noisy-le-Sec
Nokia
Nolan
Nolwenn
Nora
Norbert

Nord-Kivu
Nord-Pas-de-Calais
Nord-du-Québec
Nordine
Norfolk
Norique
Norma
6210
6211
6212
6213
6214
6215
6216

6217
6218
6219
6220
6221
6222
6223
Reidemeister
Reiko
Reims
Reiten
Relecq-Kerhuon
Rellich
Rembrandt

Rémi
Remich
Remire-Montjoly
Remus
Rémy
Renaix
Renan







>







6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
Reidemeister
Reiko
Reims
Reiten
Relecq-Kerhuon
Rellich
Rembrandt
Remi
Rémi
Remich
Remire-Montjoly
Remus
Rémy
Renaix
Renan
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
Rosita
Rosny-sous-Bois
Ross
Rossini
Rossinière
Rostand
Roswell
Roth
Roth
Rothbard
Rothschild
Rotin
Rotselaar
Rotterdam
Roubaix







<







6391
6392
6393
6394
6395
6396
6397

6398
6399
6400
6401
6402
6403
6404
Rosita
Rosny-sous-Bois
Ross
Rossini
Rossinière
Rostand
Roswell

Roth
Rothbard
Rothschild
Rotin
Rotselaar
Rotterdam
Roubaix
9074
9075
9076
9077
9078
9079
9080
9081
9082
9083
9084
9085

9086
9087
9088
9089
9090
9091
9092
additionnelle/F*
additionnellement/D'Q'
additionner/a4p+
additionneuse/F*
additive/F*
additivement/D'Q'
additivité/S*
addon/S*
adducteur/S*
adduction/S*
adduit/S*
adèle/S*

adelphophagie/S*
adénine/S*
adénite/S*
adénocarcinome/S*
adénogramme/S*
adénoïde/S*
adénoïdectomie/S*







|




>







9084
9085
9086
9087
9088
9089
9090
9091
9092
9093
9094
9095
9096
9097
9098
9099
9100
9101
9102
9103
additionnelle/F*
additionnellement/D'Q'
additionner/a4p+
additionneuse/F*
additive/F*
additivement/D'Q'
additivité/S*
add-on/S*
adducteur/S*
adduction/S*
adduit/S*
adèle/S*
adelphe/S*
adelphophagie/S*
adénine/S*
adénite/S*
adénocarcinome/S*
adénogramme/S*
adénoïde/S*
adénoïdectomie/S*
9307
9308
9309
9310
9311
9312
9313

9314
9315
9316
9317
9318
9319
9320
aérobie/S*
aérobie/S*
aérobiologie/S*
aérobiologique/S*
aérobiose/S*
aérobique/S*
aérocâble/S*

aéro-club/S*
aérocolie/S*
aérodigestive/F*
aérodistorsion/S*
aérodrome/S*
aérodynamicienne/F*
aérodynamique/S*







>







9318
9319
9320
9321
9322
9323
9324
9325
9326
9327
9328
9329
9330
9331
9332
aérobie/S*
aérobie/S*
aérobiologie/S*
aérobiologique/S*
aérobiose/S*
aérobique/S*
aérocâble/S*
aéroclub/S*
aéro-club/S*
aérocolie/S*
aérodigestive/F*
aérodistorsion/S*
aérodrome/S*
aérodynamicienne/F*
aérodynamique/S*
9758
9759
9760
9761
9762
9763
9764

9765
9766
9767
9768
9769
9770
9771
agroalimentaire/S*
agro-alimentaire/S*
agroalimentaire/S*
agro-alimentaire/S*
agrobiologie/S*
agrobiologique/S*
agrobiologiste/S*

agrocarburant/S*
agro-carburant/S*
agrochimie/S*
agrochimique/S*
agrochimiste/S*
agroclimatique/S*
agro-climatique/S*







>







9770
9771
9772
9773
9774
9775
9776
9777
9778
9779
9780
9781
9782
9783
9784
agroalimentaire/S*
agro-alimentaire/S*
agroalimentaire/S*
agro-alimentaire/S*
agrobiologie/S*
agrobiologique/S*
agrobiologiste/S*
agrobusiness/L'D'Q'
agrocarburant/S*
agro-carburant/S*
agrochimie/S*
agrochimique/S*
agrochimiste/S*
agroclimatique/S*
agro-climatique/S*
9900
9901
9902
9903
9904
9905
9906

9907
9908
9909
9910
9911
9912
9913
aillade/S*
ailler/a2p+
ailleurs/L'D'Q'
ailloli/S*
aimable/S*
aimablement/D'Q'
aimant/S*

aimantation/S*
aimante/F*
aimanter/a4p+
aimantin/S*
aimantine/F*
aimée/F*
aimer/a4p+







>







9913
9914
9915
9916
9917
9918
9919
9920
9921
9922
9923
9924
9925
9926
9927
aillade/S*
ailler/a2p+
ailleurs/L'D'Q'
ailloli/S*
aimable/S*
aimablement/D'Q'
aimant/S*
aimantable/S*
aimantation/S*
aimante/F*
aimanter/a4p+
aimantin/S*
aimantine/F*
aimée/F*
aimer/a4p+
10544
10545
10546
10547
10548
10549
10550
10551
10552
10553
10554
10555
10556
10557
10558
amathie/S*
amatir/f2p+
amatrice/F*
amaurose/S*
amazone/S*
amazonienne/F*
amazonite/S*
ambages/D'Q'
ambassade/S*
ambassadrice/F*
ambiance/S*
ambiancer/a1p.
ambianceuse/F*
ambiante/F*
ambidextre/S*







|







10558
10559
10560
10561
10562
10563
10564
10565
10566
10567
10568
10569
10570
10571
10572
amathie/S*
amatir/f2p+
amatrice/F*
amaurose/S*
amazone/S*
amazonienne/F*
amazonite/S*
ambage/S*
ambassade/S*
ambassadrice/F*
ambiance/S*
ambiancer/a1p.
ambianceuse/F*
ambiante/F*
ambidextre/S*
11399
11400
11401
11402
11403
11404
11405

11406
11407
11408
11409
11410
11411
11412
annuité/S*
annulabilité/S*
annulable/S*
annulaire/S*
annulation/S*
annulative/F*
annulatrice/F*

annuler/a4p+
annuus
anoblir/f4p+
anoblissante/F*
anoblissement/S*
anode/S*
anodine/F*







>







11413
11414
11415
11416
11417
11418
11419
11420
11421
11422
11423
11424
11425
11426
11427
annuité/S*
annulabilité/S*
annulable/S*
annulaire/S*
annulation/S*
annulative/F*
annulatrice/F*
annulement/S*
annuler/a4p+
annuus
anoblir/f4p+
anoblissante/F*
anoblissement/S*
anode/S*
anodine/F*
11726
11727
11728
11729
11730
11731
11732


11733
11734
11735
11736
11737
11738
11739
antiémeute/L'D'Q'
antienne/S*
antienzyme/S*
anti-enzyme/S*
antiépileptique/S*
antiesclavagiste/S*
antiétatique/S*


antifading/S*
antifascisme/S*
antifasciste/S*
antiféminisme/S*
antiféministe/S*
antiferment/S*
antiferroélectricité/S*







>
>







11741
11742
11743
11744
11745
11746
11747
11748
11749
11750
11751
11752
11753
11754
11755
11756
antiémeute/L'D'Q'
antienne/S*
antienzyme/S*
anti-enzyme/S*
antiépileptique/S*
antiesclavagiste/S*
antiétatique/S*
antiétatisme/S*
antifa/S*
antifading/S*
antifascisme/S*
antifasciste/S*
antiféminisme/S*
antiféministe/S*
antiferment/S*
antiferroélectricité/S*
12550
12551
12552
12553
12554
12555
12556

12557
12558
12559
12560
12561
12562
12563
arc/S*
arcade/S*
arcane/S*
arcanson/S*
arcasse/S*
arcature/S*
arc-boutant/L'D'Q'

arc-bouter/a4p+
arccos
arccosh
arccotan
arccotanh
arc-doubleau/L'D'Q'
arceau/X*







>







12567
12568
12569
12570
12571
12572
12573
12574
12575
12576
12577
12578
12579
12580
12581
arc/S*
arcade/S*
arcane/S*
arcanson/S*
arcasse/S*
arcature/S*
arc-boutant/L'D'Q'
arc-boutement
arc-bouter/a4p+
arccos
arccosh
arccotan
arccotanh
arc-doubleau/L'D'Q'
arceau/X*
12647
12648
12649
12650
12651
12652
12653

12654
12655
12656
12657
12658
12659
12660
archontat/S*
archonte/S*
archosaurien/S*
archure/S*
arçon/S*
arçonner/a2p+
arcs-boutants/D'Q'

arcs-doubleaux/D'Q'
arcs-en-ciel/D'Q'
arcsin
arcsinh
arctan
arctanh
arctique/S*







>







12665
12666
12667
12668
12669
12670
12671
12672
12673
12674
12675
12676
12677
12678
12679
archontat/S*
archonte/S*
archosaurien/S*
archure/S*
arçon/S*
arçonner/a2p+
arcs-boutants/D'Q'
arcs-boutements
arcs-doubleaux/D'Q'
arcs-en-ciel/D'Q'
arcsin
arcsinh
arctan
arctanh
arctique/S*
15085
15086
15087
15088
15089
15090
15091

15092
15093
15094
15095
15096
15097
15098
bascule/S.
basculement/S.
basculer/a0p+
basculeur/S.
bas-culotte/S.
bas-de-casse
base/S.

base-ball/S.
baselle/S.
baser/a0p+
bas-fond/S.
basicité/S.
baside/S.
basidiomycète/S.







>







15104
15105
15106
15107
15108
15109
15110
15111
15112
15113
15114
15115
15116
15117
15118
bascule/S.
basculement/S.
basculer/a0p+
basculeur/S.
bas-culotte/S.
bas-de-casse
base/S.
baseball/S.
base-ball/S.
baselle/S.
baser/a0p+
bas-fond/S.
basicité/S.
baside/S.
basidiomycète/S.
15106
15107
15108
15109
15110
15111
15112

15113
15114
15115
15116
15117
15118
15119
basilique/S.
basin/S.
basiphile/S.
basique/S.
basiquement
bas-jointée/F.
basket/S.

basket-ball/S.
basketteuse/F.
bas-mât/S.
basmati/S.
basocellulaire/S.
basoche/S.
basochienne/F.







>







15126
15127
15128
15129
15130
15131
15132
15133
15134
15135
15136
15137
15138
15139
15140
basilique/S.
basin/S.
basiphile/S.
basique/S.
basiquement
bas-jointée/F.
basket/S.
basketball/S.
basket-ball/S.
basketteuse/F.
bas-mât/S.
basmati/S.
basocellulaire/S.
basoche/S.
basochienne/F.
15609
15610
15611
15612
15613
15614
15615

15616
15617
15618
15619
15620
15621
15622
bernard-l'hermite
berne/S.
berner/a0p+
berneuse/F.
bernicle/S.
bernique
bernique/S.

berrichonne/F.
bersaglier/S.
berthon/S.
bertillonnage/S.
béryl/S.
bérylliose/S.
béryllium/S.







>







15630
15631
15632
15633
15634
15635
15636
15637
15638
15639
15640
15641
15642
15643
15644
bernard-l'hermite
berne/S.
berner/a0p+
berneuse/F.
bernicle/S.
bernique
bernique/S.
bernoise/F.
berrichonne/F.
bersaglier/S.
berthon/S.
bertillonnage/S.
béryl/S.
bérylliose/S.
béryllium/S.
16759
16760
16761
16762
16763
16764
16765

16766
16767
16768
16769
16770
16771
16772
bongo/S.
bonheur/S.
bonheur-du-jour
bonheurs-du-jour
bonhomie/S.
bonhomme
bonhomme/S.

boni/S.
bonichon/S.
bonifiante/F.
bonification/S.
bonifier/a0p+
boniment/S.
bonimenter/a0p.







>







16781
16782
16783
16784
16785
16786
16787
16788
16789
16790
16791
16792
16793
16794
16795
bongo/S.
bonheur/S.
bonheur-du-jour
bonheurs-du-jour
bonhomie/S.
bonhomme
bonhomme/S.
bonhommie/S.
boni/S.
bonichon/S.
bonifiante/F.
bonification/S.
bonifier/a0p+
boniment/S.
bonimenter/a0p.
17890
17891
17892
17893
17894
17895
17896

17897
17898
17899
17900
17901
17902
17903
bugne/S.
bugrane/S.
buguée/F.
build/S.
building/S.
buire/S.
buis

buisson/S.
buisson-ardent
buissonnante/F.
buissonnet/S.
buissonneuse/W.
buissonnière/F.
buissons-ardents







>







17913
17914
17915
17916
17917
17918
17919
17920
17921
17922
17923
17924
17925
17926
17927
bugne/S.
bugrane/S.
buguée/F.
build/S.
building/S.
buire/S.
buis
buissaie/S.
buisson/S.
buisson-ardent
buissonnante/F.
buissonnet/S.
buissonneuse/W.
buissonnière/F.
buissons-ardents
18232
18233
18234
18235
18236
18237
18238

18239
18240
18241
18242
18243
18244
18245
cadrer/a0p+
cadreuse/F.
cadriciel/S.
caduc/S.
caducée/S.
caducifoliée/F.
caducité/S.

caduque/S.
cæcale/W.
cæcotrophie/S.
cæcum/S.
caennaise/F.
cænogenèse/S.
cæsine







>







18256
18257
18258
18259
18260
18261
18262
18263
18264
18265
18266
18267
18268
18269
18270
cadrer/a0p+
cadreuse/F.
cadriciel/S.
caduc/S.
caducée/S.
caducifoliée/F.
caducité/S.
caduque/F.
caduque/S.
cæcale/W.
cæcotrophie/S.
cæcum/S.
caennaise/F.
cænogenèse/S.
cæsine
18632
18633
18634
18635
18636
18637
18638
18639
18640
18641
18642
18643
18644
18645
18646
18647
camping-car/S.
camping-caravaning/S.
camping-gaz
campinoise/F.
campo/S.
campus
camuse/F.
canada
canada/S.
canadianisme/S.
canadienne/F.
canado-américaine/F.
canaille/S.
canaillement
canaillerie/S.
canaillocratie/S.







|
|







18657
18658
18659
18660
18661
18662
18663
18664
18665
18666
18667
18668
18669
18670
18671
18672
camping-car/S.
camping-caravaning/S.
camping-gaz
campinoise/F.
campo/S.
campus
camuse/F.
canada/S.
canadair/S.
canadianisme/S.
canadienne/F.
canado-américaine/F.
canaille/S.
canaillement
canaillerie/S.
canaillocratie/S.
19626
19627
19628
19629
19630
19631
19632

19633
19634
19635
19636
19637
19638
19639
caucasique/S.
cauchemar/S.
cauchemarder/a0p.
cauchemardesque/S.
cauchemardeuse/W.
caucus
caudale/W.

caudataire/S.
caudataire/S.
caudillo/S.
caudine/S.
caudrette/S.
caulescente/F.
caulicole/S.







>







19651
19652
19653
19654
19655
19656
19657
19658
19659
19660
19661
19662
19663
19664
19665
caucasique/S.
cauchemar/S.
cauchemarder/a0p.
cauchemardesque/S.
cauchemardeuse/W.
caucus
caudale/W.
caudalie/S.
caudataire/S.
caudataire/S.
caudillo/S.
caudine/S.
caudrette/S.
caulescente/F.
caulicole/S.
24296
24297
24298
24299
24300
24301
24302

24303
24304
24305
24306
24307
24308
24309
corruptrice/F.
corsage/S.
corsaire/S.
corse/S.
corselet/S.
corser/a0p+
corset/S.

corseter/b0p+
corseterie/S.
corsetière/F.
corso/S.
cortège/S.
cortès
cortex







>







24322
24323
24324
24325
24326
24327
24328
24329
24330
24331
24332
24333
24334
24335
24336
corruptrice/F.
corsage/S.
corsaire/S.
corse/S.
corselet/S.
corser/a0p+
corset/S.
corsetage/S.
corseter/b0p+
corseterie/S.
corsetière/F.
corso/S.
cortège/S.
cortès
cortex
24742
24743
24744
24745
24746
24747
24748

24749
24750
24751
24752
24753
24754
24755
covenant/S.
covendeuse/F.
cover-girl/S.
covoiturage/S.
covoiturer/a0p+
covoitureuse/F.
covolume/S.

cow-boy/S.
cowper/S.
coxale/W.
coxalgie/S.
coxalgique/S.
coxarthrose/S.
coxer/a0p+







>







24769
24770
24771
24772
24773
24774
24775
24776
24777
24778
24779
24780
24781
24782
24783
covenant/S.
covendeuse/F.
cover-girl/S.
covoiturage/S.
covoiturer/a0p+
covoitureuse/F.
covolume/S.
cowboy/S.
cow-boy/S.
cowper/S.
coxale/W.
coxalgie/S.
coxalgique/S.
coxarthrose/S.
coxer/a0p+
25820
25821
25822
25823
25824
25825
25826

25827
25828
25829
25830
25831
25832
25833
cytotoxique/S.
czar/S.
czardas
czimbalum/S.
d
d/||--
dB/||--

dacryoadénite/S.
dacryocystite/S.
dactyle/S.
dactylique/S.
dactylo/S.
dactylogramme/S.
dactylographe/S.







>







25848
25849
25850
25851
25852
25853
25854
25855
25856
25857
25858
25859
25860
25861
25862
cytotoxique/S.
czar/S.
czardas
czimbalum/S.
d
d/||--
dB/||--
daba/S.
dacryoadénite/S.
dacryocystite/S.
dactyle/S.
dactylique/S.
dactylo/S.
dactylogramme/S.
dactylographe/S.
27613
27614
27615
27616
27617
27618
27619

27620
27621
27622
27623
27624
27625
27626
dénombrabilité/S.
dénombrable/S.
dénombrement/S.
dénombrer/a0p+
dénominateur/S.
dénomination/S.
dénominative/F.

dénommer/a0p+
dénoncer/a0p+
dénonciation/S.
dénonciatrice/F.
dénotation/S.
dénotationnelle/F.
dénotative/F.







>







27642
27643
27644
27645
27646
27647
27648
27649
27650
27651
27652
27653
27654
27655
27656
dénombrabilité/S.
dénombrable/S.
dénombrement/S.
dénombrer/a0p+
dénominateur/S.
dénomination/S.
dénominative/F.
dénommable/S.
dénommer/a0p+
dénoncer/a0p+
dénonciation/S.
dénonciatrice/F.
dénotation/S.
dénotationnelle/F.
dénotative/F.
28412
28413
28414
28415
28416
28417
28418

28419
28420
28421
28422
28423
28424
28425
désincorporer/a0p+
désincrustation/S.
désincruster/a0p+
désinculper/a0p+
désindenter/a0p+
désindexation/S.
désindexer/a0p+

désindustrialisation/S.
désindustrialiser/a0p+
désinence/S.
désinentielle/F.
désinfectante/F.
désinfecter/a0p+
désinfection/S.







>







28442
28443
28444
28445
28446
28447
28448
28449
28450
28451
28452
28453
28454
28455
28456
désincorporer/a0p+
désincrustation/S.
désincruster/a0p+
désinculper/a0p+
désindenter/a0p+
désindexation/S.
désindexer/a0p+
désindividualiser/a0p+
désindustrialisation/S.
désindustrialiser/a0p+
désinence/S.
désinentielle/F.
désinfectante/F.
désinfecter/a0p+
désinfection/S.
28461
28462
28463
28464
28465
28466
28467

28468
28469
28470
28471
28472
28473
28474
désinviter/a0p+
désinvolte/S.
désinvoltement
désinvolture/S.
désir/S.
désirabilité/S.
désirable/S.

désirer/a0p+
désireuse/W.
désistement/S.
désister/a0p+
desman/S.
desmine/S.
desmodonte/S.







>







28492
28493
28494
28495
28496
28497
28498
28499
28500
28501
28502
28503
28504
28505
28506
désinviter/a0p+
désinvolte/S.
désinvoltement
désinvolture/S.
désir/S.
désirabilité/S.
désirable/S.
désirante/F.
désirer/a0p+
désireuse/W.
désistement/S.
désister/a0p+
desman/S.
desmine/S.
desmodonte/S.
29091
29092
29093
29094
29095
29096
29097

29098
29099
29100
29101
29102
29103
29104
diarrhée/S.
diarrhéique/S.
diarthrose/S.
diascope/S.
diascopie/S.
diascordium/S.
diaspora/S.

diastase/S.
diastasique/S.
diastème/S.
diastéréo-isomère/S.
diastole/S.
diastolique/S.
diastratique/S.







>







29123
29124
29125
29126
29127
29128
29129
29130
29131
29132
29133
29134
29135
29136
29137
diarrhée/S.
diarrhéique/S.
diarthrose/S.
diascope/S.
diascopie/S.
diascordium/S.
diaspora/S.
diasporique/S.
diastase/S.
diastasique/S.
diastème/S.
diastéréo-isomère/S.
diastole/S.
diastolique/S.
diastratique/S.
29806
29807
29808
29809
29810
29811
29812

29813
29814
29815
29816
29817
29818
29819
diversement
diverses
diversifiable/S.
diversification/S.
diversifier/a0p+
diversiforme/S.
diversion/S.

diversité/S.
diverticule/S.
diverticulite/S.
diverticulose/S.
divertimento/S.
divertir/f0p+
divertissante/F.







>







29839
29840
29841
29842
29843
29844
29845
29846
29847
29848
29849
29850
29851
29852
29853
diversement
diverses
diversifiable/S.
diversification/S.
diversifier/a0p+
diversiforme/S.
diversion/S.
diversitaire/S.
diversité/S.
diverticule/S.
diverticulite/S.
diverticulose/S.
divertimento/S.
divertir/f0p+
divertissante/F.
32415
32416
32417
32418
32419
32420
32421

32422
32423
32424
32425
32426
32427
32428
endoénergétique/S*
endogame/S*
endogamie/S*
endogamique/S*
endogée/F*
endogène/S*
endogénéité/S*

endolocalisation/S*
endolorir/f2p+
endolorissement/S*
endolymphe/S*
endomètre/S*
endométriose/S*
endométrite/S*







>







32449
32450
32451
32452
32453
32454
32455
32456
32457
32458
32459
32460
32461
32462
32463
endoénergétique/S*
endogame/S*
endogamie/S*
endogamique/S*
endogée/F*
endogène/S*
endogénéité/S*
endogroupe/S*
endolocalisation/S*
endolorir/f2p+
endolorissement/S*
endolymphe/S*
endomètre/S*
endométriose/S*
endométrite/S*
34197
34198
34199
34200
34201
34202
34203


34204
34205
34206
34207
34208
34209
34210
ethmoïdale/W*
ethmoïde/S*
ethmoïdite/S*
ethnarchie/S*
ethnarque/S*
ethnicisation/S*
ethniciser/a2p+


ethnicité/S*
ethnico-religieuse/W*
ethnie/S*
ethnique/S*
ethniquement/D'Q'
ethnobiologie/S*
ethnobotanique/S*







>
>







34232
34233
34234
34235
34236
34237
34238
34239
34240
34241
34242
34243
34244
34245
34246
34247
ethmoïdale/W*
ethmoïde/S*
ethmoïdite/S*
ethnarchie/S*
ethnarque/S*
ethnicisation/S*
ethniciser/a2p+
ethnicisme/S*
ethniciste/S*
ethnicité/S*
ethnico-religieuse/W*
ethnie/S*
ethnique/S*
ethniquement/D'Q'
ethnobiologie/S*
ethnobotanique/S*
34232
34233
34234
34235
34236
34237
34238

34239
34240
34241
34242
34243
34244
34245
ethnométhodologue/S*
ethnomusicologie/S*
ethnomusicologue/S*
ethnonyme/S*
ethnonymie/S*
ethnopsychiatrie/S*
ethnopsychologie/S*

ethnoreligieuse/W*
éthographie/S*
éthologie/S*
éthologique/S*
éthologiste/S*
éthologue/S*
ethos/L'D'Q'







>







34269
34270
34271
34272
34273
34274
34275
34276
34277
34278
34279
34280
34281
34282
34283
ethnométhodologue/S*
ethnomusicologie/S*
ethnomusicologue/S*
ethnonyme/S*
ethnonymie/S*
ethnopsychiatrie/S*
ethnopsychologie/S*
ethno-raciale/W*
ethnoreligieuse/W*
éthographie/S*
éthologie/S*
éthologique/S*
éthologiste/S*
éthologue/S*
ethos/L'D'Q'
34827
34828
34829
34830
34831
34832
34833

34834
34835
34836
34837
34838
34839
34840
exode/S*
exoderme/S*
exogame/S*
exogamie/S*
exogamique/S*
exogène/S*
exogénéité/S*

exomphale/S*
exon/S*
exondation/S*
exondement/S*
exonder/a3p+
exonération/S*
exonérer/c4p+







>







34865
34866
34867
34868
34869
34870
34871
34872
34873
34874
34875
34876
34877
34878
34879
exode/S*
exoderme/S*
exogame/S*
exogamie/S*
exogamique/S*
exogène/S*
exogénéité/S*
exogroupe/S*
exomphale/S*
exon/S*
exondation/S*
exondement/S*
exonder/a3p+
exonération/S*
exonérer/c4p+
35033
35034
35035
35036
35037
35038
35039


35040
35041
35042
35043
35044
35045
35046
extensionnelle/F*
extensité/S*
extensive/F*
extensivement/L'D'Q'
extensivité/S*
extenso
extensomètre/S*


exténuante/F*
exténuation/S*
exténuée/F*
exténuement/S*
exténuer/a4p+
extérieur/S*
extérieure/F*







>
>







35072
35073
35074
35075
35076
35077
35078
35079
35080
35081
35082
35083
35084
35085
35086
35087
extensionnelle/F*
extensité/S*
extensive/F*
extensivement/L'D'Q'
extensivité/S*
extenso
extensomètre/S*
extensométrie/S*
extensométrique/S*
exténuante/F*
exténuation/S*
exténuée/F*
exténuement/S*
exténuer/a4p+
extérieur/S*
extérieure/F*
36200
36201
36202
36203
36204
36205
36206

36207
36208
36209
36210
36211
36212
36213
filoselle/S.
filou/S.
filoutage/S.
filouter/a0p+
filouterie/S.
filovirus
fils

filtrable/S.
filtrage/S.
filtrante/F.
filtrat/S.
filtration/S.
filtre/S.
filtre-presse







>







36241
36242
36243
36244
36245
36246
36247
36248
36249
36250
36251
36252
36253
36254
36255
filoselle/S.
filou/S.
filoutage/S.
filouter/a0p+
filouterie/S.
filovirus
fils
filsdeputerie/S.
filtrable/S.
filtrage/S.
filtrante/F.
filtrat/S.
filtration/S.
filtre/S.
filtre-presse
36410
36411
36412
36413
36414
36415
36416

36417
36418
36419
36420
36421
36422
36423
flanquer/a0p+
flapie/F.
flaque/S.
flaquer/a0p.
flash/A.
flashage/S.
flash-back

flash-ball/S.
flasher/a0p+
flasheuse/F.
flashmètre/S.
flashy
flasque/S.
flasquement







>







36452
36453
36454
36455
36456
36457
36458
36459
36460
36461
36462
36463
36464
36465
36466
flanquer/a0p+
flapie/F.
flaque/S.
flaquer/a0p.
flash/A.
flashage/S.
flash-back
flashball/S.
flash-ball/S.
flasher/a0p+
flasheuse/F.
flashmètre/S.
flashy
flasque/S.
flasquement
37080
37081
37082
37083
37084
37085
37086

37087
37088
37089
37090
37091
37092
37093
foutou/S.
foutrale/F.
foutraque/S.
foutre/S.
foutre/tM
foutredieu
foutrement

foutriquet/S.
foutue/F.
fovéa/S.
fovéale/W.
fox
foxée/F.
fox-hound/S.







>







37123
37124
37125
37126
37127
37128
37129
37130
37131
37132
37133
37134
37135
37136
37137
foutou/S.
foutrale/F.
foutraque/S.
foutre/S.
foutre/tM
foutredieu
foutrement
foutrerie/S.
foutriquet/S.
foutue/F.
fovéa/S.
fovéale/W.
fox
foxée/F.
fox-hound/S.
40503
40504
40505
40506
40507
40508
40509

40510
40511
40512
40513
40514
40515
40516
haptique/S*
haptonomie/S*
haptonomique/S*
haquebute/S.
haquenée/S.
haquet/S.
hara-kiri/S.

harangue/S.
haranguer/a0p+
harangueuse/F.
haras
harassante/F.
harassement/S.
harasser/a0p+







>







40547
40548
40549
40550
40551
40552
40553
40554
40555
40556
40557
40558
40559
40560
40561
haptique/S*
haptonomie/S*
haptonomique/S*
haquebute/S.
haquenée/S.
haquet/S.
hara-kiri/S.
haram
harangue/S.
haranguer/a0p+
harangueuse/F.
haras
harassante/F.
harassement/S.
harasser/a0p+
41655
41656
41657
41658
41659
41660
41661

41662
41663
41664
41665
41666
41667
41668
hors-bilan
hors-bord
hors-champ
hors-concours
hors-cote
hors-cote
hors-d'œuvre

horse-ball/S.
horse-guard/S.
horse-power
horse-pox
hors-jeu
hors-la-loi
hors-ligne







>







41700
41701
41702
41703
41704
41705
41706
41707
41708
41709
41710
41711
41712
41713
41714
hors-bilan
hors-bord
hors-champ
hors-concours
hors-cote
hors-cote
hors-d'œuvre
horseball/S.
horse-ball/S.
horse-guard/S.
horse-power
horse-pox
hors-jeu
hors-la-loi
hors-ligne
41771
41772
41773
41774
41775
41776
41777

41778
41779
41780
41781
41782
41783
41784

41785
41786
41787
41788
41789
41790
41791
hoyau/X.
hpz/||--
http/S=
huard/S.
huart/S.
hub/S.
hublot/S.

huche/S.
hucher/a0p+
huchet/S.
hue
huée/S.
huer/a0p+
huerta/S.

huguenote/F.
huilage/S*
huile/S*
huiler/a2p+
huilerie/S*
huileuse/W*
huilière/F*







>







>







41817
41818
41819
41820
41821
41822
41823
41824
41825
41826
41827
41828
41829
41830
41831
41832
41833
41834
41835
41836
41837
41838
41839
hoyau/X.
hpz/||--
http/S=
huard/S.
huart/S.
hub/S.
hublot/S.
hubris/L'D'Q'
huche/S.
hucher/a0p+
huchet/S.
hue
huée/S.
huer/a0p+
huerta/S.
hugolienne/F*
huguenote/F.
huilage/S*
huile/S*
huiler/a2p+
huilerie/S*
huileuse/W*
huilière/F*
42277
42278
42279
42280
42281
42282
42283


42284
42285
42286
42287
42288
42289
42290
hypertrophier/a4p+
hypertrophique/S*
hyperuricémie/S*
hypervariable/S*
hyperventilation/S*
hyperventiler/a1p.
hypervigilance/S*


hyperviscosité/S*
hyperviseur/S*
hypervitaminose/S*
hyphe/S*
hypholome/S*
hypnagogique/S*
hypnogramme/S*







>
>







42325
42326
42327
42328
42329
42330
42331
42332
42333
42334
42335
42336
42337
42338
42339
42340
hypertrophier/a4p+
hypertrophique/S*
hyperuricémie/S*
hypervariable/S*
hyperventilation/S*
hyperventiler/a1p.
hypervigilance/S*
hyperviolence/S*
hyperviolente/F*
hyperviscosité/S*
hyperviseur/S*
hypervitaminose/S*
hyphe/S*
hypholome/S*
hypnagogique/S*
hypnogramme/S*
42666
42667
42668
42669
42670
42671
42672

42673
42674
42675
42676
42677
42678
42679
illisibilité/S*
illisible/S*
illisiblement/D'Q'
illogique/S*
illogiquement/D'Q'
illogisme/S*
illuminante/F*

illumination/S*
illuminative/F*
illuminatrice/F*
illuminée/F*
illuminer/a4p+
illuminisme/S*
illusion/S*







>







42716
42717
42718
42719
42720
42721
42722
42723
42724
42725
42726
42727
42728
42729
42730
illisibilité/S*
illisible/S*
illisiblement/D'Q'
illogique/S*
illogiquement/D'Q'
illogisme/S*
illuminante/F*
illuminati/L'D'Q'
illumination/S*
illuminative/F*
illuminatrice/F*
illuminée/F*
illuminer/a4p+
illuminisme/S*
illusion/S*
42907
42908
42909
42910
42911
42912
42913

42914
42915
42916
42917
42918
42919
42920
imparisyllabique/S*
imparité/S*
impartageable/S*
impartiale/W*
impartialement/D'Q'
impartialité/S*
impartir/fC

impasse/S*
impassibilité/S*
impassible/S*
impassiblement/D'Q'
impatiemment/D'Q'
impatience/S*
impatiens/L'D'Q'







>







42958
42959
42960
42961
42962
42963
42964
42965
42966
42967
42968
42969
42970
42971
42972
imparisyllabique/S*
imparité/S*
impartageable/S*
impartiale/W*
impartialement/D'Q'
impartialité/S*
impartir/fC
impassable/S*
impasse/S*
impassibilité/S*
impassible/S*
impassiblement/D'Q'
impatiemment/D'Q'
impatience/S*
impatiens/L'D'Q'
45910
45911
45912
45913
45914
45915
45916

45917
45918
45919
45920
45921
45922
45923
jeuniste/S.
jeunotte/F.
jigger/S.
jihad/S.
jihadisme/S.
jihadiste/S.
jingle/S.

jiu-jitsu
joaillerie/S.
joaillière/F.
job/S.
job/S.
jobarde/F.
jobarder/a0p+







>







45962
45963
45964
45965
45966
45967
45968
45969
45970
45971
45972
45973
45974
45975
45976
jeuniste/S.
jeunotte/F.
jigger/S.
jihad/S.
jihadisme/S.
jihadiste/S.
jingle/S.
jinn/S.
jiu-jitsu
joaillerie/S.
joaillière/F.
job/S.
job/S.
jobarde/F.
jobarder/a0p+
46208
46209
46210
46211
46212
46213
46214

46215
46216
46217
46218
46219
46220
46221
kabic/S.
kabig/S.
kabuki/S.
kabyle/S.
kacha/S.
kachoube/S.
kaddish/S.

kafir/S.
kafkaïenne/F.
kaïnite/S.
kaiser/S.
kakapo/S.
kakatoès
kakawi/S.







>







46261
46262
46263
46264
46265
46266
46267
46268
46269
46270
46271
46272
46273
46274
46275
kabic/S.
kabig/S.
kabuki/S.
kabyle/S.
kacha/S.
kachoube/S.
kaddish/S.
kadi/S.
kafir/S.
kafkaïenne/F.
kaïnite/S.
kaiser/S.
kakapo/S.
kakatoès
kakawi/S.
46280
46281
46282
46283
46284
46285
46286

46287
46288
46289
46290
46291
46292
46293
karst/S.
karstification/S.
karstique/S.
karstologie/S.
kart/S.
karting/S.
kascher

kashrout
kat/U.||--
kata/S.
katakana
katakana/S.
katal/Um
katana/S.







>







46334
46335
46336
46337
46338
46339
46340
46341
46342
46343
46344
46345
46346
46347
46348
karst/S.
karstification/S.
karstique/S.
karstologie/S.
kart/S.
karting/S.
kascher
kasher
kashrout
kat/U.||--
kata/S.
katakana
katakana/S.
katal/Um
katana/S.
52664
52665
52666
52667
52668
52669
52670

52671
52672
52673
52674
52675
52676
52677
multidevise/S.
multidiffusion/S.
multidimensionnalité/S.
multidimensionnelle/F.
multidirectionnalité/S.
multidirectionnelle/F.
multidisciplinaire/S.

multiethnique/S.
multi-ethnique/S.
multifactorielle/F.
multifamiliale/W.
multifilaire/S.
multiflore/S.
multifonction/S.







>







52719
52720
52721
52722
52723
52724
52725
52726
52727
52728
52729
52730
52731
52732
52733
multidevise/S.
multidiffusion/S.
multidimensionnalité/S.
multidimensionnelle/F.
multidirectionnalité/S.
multidirectionnelle/F.
multidisciplinaire/S.
multidisciplinarité/S.
multiethnique/S.
multi-ethnique/S.
multifactorielle/F.
multifamiliale/W.
multifilaire/S.
multiflore/S.
multifonction/S.
55094
55095
55096
55097
55098
55099
55100
55101
55102
55103
55104
55105
55106
55107
55108
55109
oligoasthénotératospermie/S*
oligocène/S*
oligochète/S*
oligoclase/S*
oligodendrocyte/S*
oligodendrogliome/S*
oligoélément/S*
oligoélément/S*
oligo-élément/S*
oligo-élément/S*
oligogalacturonate/S*
oligo-galacturonate/S*
oligomère/S*
oligomérique/S*
oligomérisation/S*
oligonucléotide/S*







<
<







55150
55151
55152
55153
55154
55155
55156


55157
55158
55159
55160
55161
55162
55163
oligoasthénotératospermie/S*
oligocène/S*
oligochète/S*
oligoclase/S*
oligodendrocyte/S*
oligodendrogliome/S*
oligoélément/S*


oligo-élément/S*
oligogalacturonate/S*
oligo-galacturonate/S*
oligomère/S*
oligomérique/S*
oligomérisation/S*
oligonucléotide/S*
58116
58117
58118
58119
58120
58121
58122

58123
58124
58125
58126
58127
58128
58129
perceptiblement
perception/S.
perceptionnisme/S.
perceptionniste/S.
perceptive/F.
perceptrice/F.
perceptuelle/F.

percer/a0p+
percerette/S.
perceuse/F.
percevable/S.
percevoir/pK
perche/S.
percher/a0p+







>







58170
58171
58172
58173
58174
58175
58176
58177
58178
58179
58180
58181
58182
58183
58184
perceptiblement
perception/S.
perceptionnisme/S.
perceptionniste/S.
perceptive/F.
perceptrice/F.
perceptuelle/F.
perceptuellement
percer/a0p+
percerette/S.
perceuse/F.
percevable/S.
percevoir/pK
perche/S.
percher/a0p+
59816
59817
59818
59819
59820
59821
59822

59823
59824
59825
59826
59827
59828
59829
pizza/S.
pizzaiolo/I.
pizzaïolo/S.
pizzeria/S.
pizzicato/I.
placage/S.
placard/S.

placarder/a0p+
placardisation/S.
placardiser/a0p+
place/S.
placebo/S.
placement/S.
placenta/S.







>







59871
59872
59873
59874
59875
59876
59877
59878
59879
59880
59881
59882
59883
59884
59885
pizza/S.
pizzaiolo/I.
pizzaïolo/S.
pizzeria/S.
pizzicato/I.
placage/S.
placard/S.
placardage/S.
placarder/a0p+
placardisation/S.
placardiser/a0p+
place/S.
placebo/S.
placement/S.
placenta/S.
60063
60064
60065
60066
60067
60068
60069

60070

60071
60072
60073
60074
60075
60076
60077
plâtrerie/S.
plâtreuse/W.
plâtrière/F.
plats-bords
plausibilité/S.
plausible/S.
plausiblement

play-back

play-boy/S.
playlist/S.
play-list/S.
playon/S.
pléban/S.
plèbe/S.
plébéienne/F.







>
|
>







60119
60120
60121
60122
60123
60124
60125
60126
60127
60128
60129
60130
60131
60132
60133
60134
60135
plâtrerie/S.
plâtreuse/W.
plâtrière/F.
plats-bords
plausibilité/S.
plausible/S.
plausiblement
playback/S.
play-back/S.
playboy/S.
play-boy/S.
playlist/S.
play-list/S.
playon/S.
pléban/S.
plèbe/S.
plébéienne/F.
60208
60209
60210
60211
60212
60213
60214

60215
60216
60217
60218
60219
60220
60221
ployage/S.
ployante/F.
ployer/a0p+
pluche/S.
plucher/a0p.
plucheuse/W.
plugin/S.

pluie/S.
plumage/S.
plumaison/S.
plumard/S.
plumasseau/X.
plumasserie/S.
plumassière/F.







>







60266
60267
60268
60269
60270
60271
60272
60273
60274
60275
60276
60277
60278
60279
60280
ployage/S.
ployante/F.
ployer/a0p+
pluche/S.
plucher/a0p.
plucheuse/W.
plugin/S.
plug-in/S.
pluie/S.
plumage/S.
plumaison/S.
plumard/S.
plumasseau/X.
plumasserie/S.
plumassière/F.
60624
60625
60626
60627
60628
60629
60630

60631
60632
60633
60634
60635
60636
60637
polychète/S.
polychlorobenzène/S.
polychlorure/S.
polychroïque/S.
polychroïsme/S.
polychrome/S.
polychromie/S.

polycistronique/S.
polyclinique/S.
polycondensat/S.
polycondensation/S.
polycopie/S.
polycopier/a0p+
polycourant







>







60683
60684
60685
60686
60687
60688
60689
60690
60691
60692
60693
60694
60695
60696
60697
polychète/S.
polychlorobenzène/S.
polychlorure/S.
polychroïque/S.
polychroïsme/S.
polychrome/S.
polychromie/S.
polychromique/S.
polycistronique/S.
polyclinique/S.
polycondensat/S.
polycondensation/S.
polycopie/S.
polycopier/a0p+
polycourant
60901
60902
60903
60904
60905
60906
60907

60908
60909
60910
60911
60912
60913
60914
pop-corn
pope/S.
popeline/S.
popinée/S.
poplitée/F.
popote/S.
popotin/S.

populace/S.
populacière/F.
populage/S.
populaire/S.
populairement
popularisation/S.
populariser/a0p+







>







60961
60962
60963
60964
60965
60966
60967
60968
60969
60970
60971
60972
60973
60974
60975
pop-corn
pope/S.
popeline/S.
popinée/S.
poplitée/F.
popote/S.
popotin/S.
popstar/S.
populace/S.
populacière/F.
populage/S.
populaire/S.
populairement
popularisation/S.
populariser/a0p+
61354
61355
61356
61357
61358
61359
61360
61361
61362
61363
61364
61365
61366
61367
61368
61369
poulaille/S.
poulailler/S.
poulaine/F.
poulamon/S.
poularde/S.
poulbot/S.
poule/S.
poulet/S.
poulette/S.
pouliage/S.
pouliche/S.
poulie/S.
pouliner/a0p.
poulinière/S.
poulinière/S.
pouliot/S.







<
|







61415
61416
61417
61418
61419
61420
61421

61422
61423
61424
61425
61426
61427
61428
61429
poulaille/S.
poulailler/S.
poulaine/F.
poulamon/S.
poularde/S.
poulbot/S.
poule/S.

poulette/F.
pouliage/S.
pouliche/S.
poulie/S.
pouliner/a0p.
poulinière/S.
poulinière/S.
pouliot/S.
62769
62770
62771
62772
62773
62774
62775

62776
62777
62778
62779
62780
62781
62782
protoplasme/S.
protoplasmique/S.
protoplaste/S.
protoptère/S.
protosulfure/S.
prototypage/S.
prototype/S.

prototypique/S.
prototypiste/S.
protoure/S.
protoxyde/S.
protozoaire/S.
protozoologie/S.
protractile/S.







>







62829
62830
62831
62832
62833
62834
62835
62836
62837
62838
62839
62840
62841
62842
62843
protoplasme/S.
protoplasmique/S.
protoplaste/S.
protoptère/S.
protosulfure/S.
prototypage/S.
prototype/S.
prototyper/a0p+
prototypique/S.
prototypiste/S.
protoure/S.
protoxyde/S.
protozoaire/S.
protozoologie/S.
protractile/S.
62852
62853
62854
62855
62856
62857
62858


62859
62860
62861

62862
62863
62864
62865
62866
62867
62868
prudemment
prudence/S.
prudente/F.
prudentielle/F.
pruderie/S.
prud'homale/W.
prud'homie/S.


prud'homme/S.
prudhommerie/S.
prudhommesque/S.

pruine/S.
prune
prune/S.
pruneau/X.
prunelaie/S.
prunelée/S.
prunelle/S.







>
>



>







62913
62914
62915
62916
62917
62918
62919
62920
62921
62922
62923
62924
62925
62926
62927
62928
62929
62930
62931
62932
prudemment
prudence/S.
prudente/F.
prudentielle/F.
pruderie/S.
prud'homale/W.
prud'homie/S.
prudhommale/W.
prudhomme/S.
prud'homme/S.
prudhommerie/S.
prudhommesque/S.
prudhommie/S.
pruine/S.
prune
prune/S.
pruneau/X.
prunelaie/S.
prunelée/S.
prunelle/S.
63292
63293
63294
63295
63296
63297
63298

63299
63300
63301
63302
63303
63304
63305
pusillanime/S.
pusillanimement
pusillanimité/S.
pustule/S.
pustuler/a0p+
pustuleuse/W.
putain/S.

putassière/F.
putative/F.
pute/S.
putier/S.
putiet/S.
putois
putréfaction/S.







>







63356
63357
63358
63359
63360
63361
63362
63363
63364
63365
63366
63367
63368
63369
63370
pusillanime/S.
pusillanimement
pusillanimité/S.
pustule/S.
pustuler/a0p+
pustuleuse/W.
putain/S.
putasserie/S.
putassière/F.
putative/F.
pute/S.
putier/S.
putiet/S.
putois
putréfaction/S.
68940
68941
68942
68943
68944
68945
68946

68947
68948
68949
68950
68951
68952
68953
sceau/X.
sceau-de-Salomon
sceaux-de-Salomon
scélérate/F.
scélératement
scélératesse/S.
scellage/S.

scellement/S.
sceller/a0p+
scénarimage/S.
scenario/I.
scénario/S.
scénarisation/S.
scénariser/a0p+







>







69005
69006
69007
69008
69009
69010
69011
69012
69013
69014
69015
69016
69017
69018
69019
sceau/X.
sceau-de-Salomon
sceaux-de-Salomon
scélérate/F.
scélératement
scélératesse/S.
scellage/S.
scellé/S.
scellement/S.
sceller/a0p+
scénarimage/S.
scenario/I.
scénario/S.
scénarisation/S.
scénariser/a0p+
69198
69199
69200
69201
69202
69203
69204

69205
69206
69207
69208
69209
69210
69211
scripturale/W.
scripturalisme/S.
scrofulaire/S.
scrofulariacée/S.
scrofule/S.
scrofuleuse/W.
scrogneugneu/X.

scrolling/S.
scrotale/W.
scrotum/S.
scrub/S.
scrubber/S.
scrupule/S.
scrupuleuse/W.







>







69264
69265
69266
69267
69268
69269
69270
69271
69272
69273
69274
69275
69276
69277
69278
scripturale/W.
scripturalisme/S.
scrofulaire/S.
scrofulariacée/S.
scrofule/S.
scrofuleuse/W.
scrogneugneu/X.
scroller/a0p.
scrolling/S.
scrotale/W.
scrotum/S.
scrub/S.
scrubber/S.
scrupule/S.
scrupuleuse/W.
71783
71784
71785
71786
71787
71788
71789

71790
71791
71792
71793
71794
71795
71796
stariser/a0p+
starlette/S.
staroste/S.
star-system/S.
starter/S.
starting-block/S.
starting-gate/S.

start-up/S.
stase/S.
stater/a0p+
statère/S.
stathouder/S.
stathoudérat/S.
statice/S.







>







71850
71851
71852
71853
71854
71855
71856
71857
71858
71859
71860
71861
71862
71863
71864
stariser/a0p+
starlette/S.
staroste/S.
star-system/S.
starter/S.
starting-block/S.
starting-gate/S.
startup/S.
start-up/S.
stase/S.
stater/a0p+
statère/S.
stathouder/S.
stathoudérat/S.
statice/S.
73460
73461
73462
73463
73464
73465
73466

73467
73468
73469
73470
73471
73472
73473
syrah/S.
syriaque/S.
syriaque/S.
syrienne/F.
syringe/S.
syringomyélie/S.
syrinx

syrphe/S.
sysadmin/S.
systématicienne/F.
systématicité/S.
systématique/S.
systématique/S.
systématiquement







>







73528
73529
73530
73531
73532
73533
73534
73535
73536
73537
73538
73539
73540
73541
73542
syrah/S.
syriaque/S.
syriaque/S.
syrienne/F.
syringe/S.
syringomyélie/S.
syrinx
syro-libanaise/F.
syrphe/S.
sysadmin/S.
systématicienne/F.
systématicité/S.
systématique/S.
systématique/S.
systématiquement
73611
73612
73613
73614
73615
73616
73617

73618

73619
73620
73621
73622
73623
73624
73625
tagliatelle/S.
tagme/S.
taguer/a0p+
tagueuse/F.
tahitienne/F.
taïaut
taï-chi

taï-chi-chuan

taie/S.
taïga/S.
taiji/S.
taijiquan/S.
taïkonaute/S.
taillable/S.
taillade/S.







>

>







73680
73681
73682
73683
73684
73685
73686
73687
73688
73689
73690
73691
73692
73693
73694
73695
73696
tagliatelle/S.
tagme/S.
taguer/a0p+
tagueuse/F.
tahitienne/F.
taïaut
taï-chi
taïchi/S.
taï-chi-chuan
taïchichuan/S.
taie/S.
taïga/S.
taiji/S.
taijiquan/S.
taïkonaute/S.
taillable/S.
taillade/S.
73656
73657
73658
73659
73660
73661
73662

73663
73664
73665
73666
73667
73668
73669
taleb/S.
talent/S.
talentueuse/W.
talentueusement
taler/a0p+
taleth/S.
talibane/F.

talion/S.
talisman/S.
talismanique/S.
talith/S.
talitre/S.
talkies-walkies
talkie-walkie







>







73727
73728
73729
73730
73731
73732
73733
73734
73735
73736
73737
73738
73739
73740
73741
taleb/S.
talent/S.
talentueuse/W.
talentueusement
taler/a0p+
taleth/S.
talibane/F.
talibée/F.
talion/S.
talisman/S.
talismanique/S.
talith/S.
talitre/S.
talkies-walkies
talkie-walkie
76259
76260
76261
76262
76263
76264
76265

76266
76267
76268
76269
76270
76271
76272
trantran/S.
trapèze/S.
trapéziste/S.
trapézoèdre/S.
trapézoïdale/W.
trapézoïde/S.
trappe/S.

trappeuse/F.
trappillon/S.
trappiste/S.
trappistine/S.
trapue/F.
traque/S.
traquée/F.







>







76331
76332
76333
76334
76335
76336
76337
76338
76339
76340
76341
76342
76343
76344
76345
trantran/S.
trapèze/S.
trapéziste/S.
trapézoèdre/S.
trapézoïdale/W.
trapézoïde/S.
trappe/S.
trapper/a0p+
trappeuse/F.
trappillon/S.
trappiste/S.
trappistine/S.
trapue/F.
traque/S.
traquée/F.
77388
77389
77390
77391
77392
77393
77394

77395
77396
77397
77398
77399
77400
77401
ultimement/D'Q'
ultimité/S*
ultimo
ultra/S*
ultrabasique/S*
ultracentrifugation/S*
ultracentrifugeuse/S*

ultra-chic/S*
ultracolonialisme/S*
ultra-colonialisme/S*
ultracolonialiste/S*
ultra-colonialiste/S*
ultraconfidentielle/F*
ultra-confidentielle/F*







>







77461
77462
77463
77464
77465
77466
77467
77468
77469
77470
77471
77472
77473
77474
77475
ultimement/D'Q'
ultimité/S*
ultimo
ultra/S*
ultrabasique/S*
ultracentrifugation/S*
ultracentrifugeuse/S*
ultrachic/S*
ultra-chic/S*
ultracolonialisme/S*
ultra-colonialisme/S*
ultracolonialiste/S*
ultra-colonialiste/S*
ultraconfidentielle/F*
ultra-confidentielle/F*
78636
78637
78638
78639
78640
78641
78642

78643
78644
78645
78646
78647
78648
78649
vibrato/S.
vibratoire/S.
vibrer/a0p+
vibreur/S.
vibrion/S.
vibrionner/a0p.
vibrisse/S.

vibromasseur/S.
vicaire/S.
vicariale/W.
vicariance/S.
vicariante/F.
vicariat/S.
vice/S.







>







78710
78711
78712
78713
78714
78715
78716
78717
78718
78719
78720
78721
78722
78723
78724
vibrato/S.
vibratoire/S.
vibrer/a0p+
vibreur/S.
vibrion/S.
vibrionner/a0p.
vibrisse/S.
vibro/S.
vibromasseur/S.
vicaire/S.
vicariale/W.
vicariance/S.
vicariante/F.
vicariat/S.
vice/S.

Modified gc_lang/fr/xpi/data/dictionaries/fr-FR-modern/fr-FR-modern.aff from [e59049a83a] to [2943eb6b1b].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# AFFIXES DU DICTIONNAIRE ORTHOGRAPHIQUE FRANÇAIS “MODERNE” v6.1
# par Olivier R. -- licence MPL 2.0
# Généré le 03-06-2017 à 22:26
# Pour améliorer le dictionnaire, allez sur http://www.dicollecte.org/



SET UTF-8

WORDCHARS -’'1234567890.




|

|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# AFFIXES DU DICTIONNAIRE ORTHOGRAPHIQUE FRANÇAIS “MODERNE” v6.2
# par Olivier R. -- licence MPL 2.0
# Généré le 26-07-2017 à 09:33
# Pour améliorer le dictionnaire, allez sur http://www.dicollecte.org/



SET UTF-8

WORDCHARS -’'1234567890.

Modified gc_lang/fr/xpi/data/dictionaries/fr-FR-modern/fr-FR-modern.dic from [cfbaa4802e] to [4be27e23e8].

1
2
3
4
5
6
7
8
78805
&
1er/--
1ers/--
1re/--
1res/--
1ʳᵉ/--
1ʳᵉˢ/--
|







1
2
3
4
5
6
7
8
78858
&
1er/--
1ers/--
1re/--
1res/--
1ʳᵉ/--
1ʳᵉˢ/--
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
Aïcha/L'D'Q'
Aïd/L'D'Q'
Aida/L'D'Q'
Aidan/L'D'Q'
Aïd-el-Adha/L'
Aïd-el-Kébir/L'
Aiden/L'D'Q'
Aignan
Aigoual/L'D'
Aigrain/L'D'Q'
Aimé/L'D'Q'
Aimée/L'D'Q'
Ain/L'
Airaines/L'D'Q'
Airbnb/L'D'Q'







|







187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
Aïcha/L'D'Q'
Aïd/L'D'Q'
Aida/L'D'Q'
Aidan/L'D'Q'
Aïd-el-Adha/L'
Aïd-el-Kébir/L'
Aiden/L'D'Q'
Aignan/L'D'Q'
Aigoual/L'D'
Aigrain/L'D'Q'
Aimé/L'D'Q'
Aimée/L'D'Q'
Ain/L'
Airaines/L'D'Q'
Airbnb/L'D'Q'
529
530
531
532
533
534
535

536
537
538
539
540
541
542
Arion/L'D'Q'
Aristarque/L'D'Q'
Aristide/L'D'Q'
Aristophane/L'D'Q'
Aristote/L'D'Q'
Arizona/L'D'
Arjuna/L'D'Q'

Arkansas/L'D'
Arkema/L'D'Q'
Arkham/L'D'Q'
Arkhangelsk/L'D'Q'
Arlene/L'D'Q'
Arlène/L'D'Q'
Arles/L'D'Q'







>







529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
Arion/L'D'Q'
Aristarque/L'D'Q'
Aristide/L'D'Q'
Aristophane/L'D'Q'
Aristote/L'D'Q'
Arizona/L'D'
Arjuna/L'D'Q'
Arkady/L'D'Q'
Arkansas/L'D'
Arkema/L'D'Q'
Arkham/L'D'Q'
Arkhangelsk/L'D'Q'
Arlene/L'D'Q'
Arlène/L'D'Q'
Arles/L'D'Q'
651
652
653
654
655
656
657

658
659
660
661
662
663
664
Aurélien/L'D'Q'
Aurelio/L'D'Q'
Auriane/L'D'Q'
Aurillac/L'D'Q'
Auriol/L'D'Q'
Aurore/L'D'Q'
Auschwitz/L'D'Q'

Austerlitz/L'D'Q'
Austin/L'D'Q'
Australasie/L'D'Q'
Australie/L'D'
Australie-Méridionale/L'D'
Australie-Occidentale/L'D'
Austrasie/L'D'







>







652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
Aurélien/L'D'Q'
Aurelio/L'D'Q'
Auriane/L'D'Q'
Aurillac/L'D'Q'
Auriol/L'D'Q'
Aurore/L'D'Q'
Auschwitz/L'D'Q'
Austen/L'D'Q'
Austerlitz/L'D'Q'
Austin/L'D'Q'
Australasie/L'D'Q'
Australie/L'D'
Australie-Méridionale/L'D'
Australie-Occidentale/L'D'
Austrasie/L'D'
896
897
898
899
900
901
902

903
904
905
906
907
908
909
Benoîte
Benozillo
Benpro
Bentama
Bentham
Bentley
Benveniste

Berchem-Sainte-Agathe
Berck
Bercy
Bérenger
Bérengère
Bérénice
Bérézina







>







898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
Benoîte
Benozillo
Benpro
Bentama
Bentham
Bentley
Benveniste
Bérangère
Berchem-Sainte-Agathe
Berck
Bercy
Bérenger
Bérengère
Bérénice
Bérézina
1330
1331
1332
1333
1334
1335
1336

1337
1338
1339
1340
1341
1342
1343
Caine
Caïphe
Caire
Caitlin
Caitlyn
Calabre
Calais

Calc
Calcutta
Calderón
Caleb
Calédonie
Calestienne
Calgary







>







1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
Caine
Caïphe
Caire
Caitlin
Caitlyn
Calabre
Calais
Calaisis
Calc
Calcutta
Calderón
Caleb
Calédonie
Calestienne
Calgary
1646
1647
1648
1649
1650
1651
1652

1653
1654
1655
1656
1657
1658
1659
Chostakovitch
Chris
Christa
Christel
Christèle
Christelle
Christian

Christiane
Christie
Christina
Christine
Christmas
Christoffel
Christoph







>







1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
Chostakovitch
Chris
Christa
Christel
Christèle
Christelle
Christian
Christiana
Christiane
Christie
Christina
Christine
Christmas
Christoffel
Christoph
1674
1675
1676
1677
1678
1679
1680

1681
1682
1683
1684
1685
1686
1687
Cincinnati
Cindy
Ciney
Ciotat
Circassie
Circé
Cirey-sur-Vezouze

Cisjordanie
Cîteaux
Citroën
City
Claire
Clamart
Clara







>







1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
Cincinnati
Cindy
Ciney
Ciotat
Circassie
Circé
Cirey-sur-Vezouze
Cisco
Cisjordanie
Cîteaux
Citroën
City
Claire
Clamart
Clara
2486
2487
2488
2489
2490
2491
2492

2493
2494
2495
2496
2497
2498
2499
Eure-et-Loir/L'D'
Euripide/L'D'Q'
Eurobaromètre/S*
Eurogroupe/L'
Euronext/L'D'Q'
Europe/L'D'
Europol/D'Q'

Eurozone/L'
Eurydice/L'D'Q'
Eusèbe/L'D'Q'
Euterpe/L'D'Q'
Eva/L'D'Q'
Éva/L'D'Q'
Évaine/L'D'Q'







>







2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
Eure-et-Loir/L'D'
Euripide/L'D'Q'
Eurobaromètre/S*
Eurogroupe/L'
Euronext/L'D'Q'
Europe/L'D'
Europol/D'Q'
Eurotunnel/L'D'Q'
Eurozone/L'
Eurydice/L'D'Q'
Eusèbe/L'D'Q'
Euterpe/L'D'Q'
Eva/L'D'Q'
Éva/L'D'Q'
Évaine/L'D'Q'
2596
2597
2598
2599
2600
2601
2602

2603
2604
2605
2606
2607
2608
2609
Fayard
Fayçal
Fayette
Fécamp
Fed
FedEx
Federer

Federico
Fehling
Feist
Feïza
Feldane
Felicia
Félicie







>







2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
Fayard
Fayçal
Fayette
Fécamp
Fed
FedEx
Federer
Federica
Federico
Fehling
Feist
Feïza
Feldane
Felicia
Félicie
3217
3218
3219
3220
3221
3222
3223

3224
3225
3226
3227
3228
3229
3230
Halluin/L'D'Q'
Ham/L'D'Q'
Hamas
Hambourg
Hamel
Hamid/L'D'Q'
Hamilton

Hamme
HammerFall
Hammourabi
Hamont-Achel/L'D'Q'
Hampshire
Ham-sur-Heure-Nalinnes/L'D'Q'
Hamza/L'D'Q'







>







3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
Halluin/L'D'Q'
Ham/L'D'Q'
Hamas
Hambourg
Hamel
Hamid/L'D'Q'
Hamilton
Hamlet/L'D'Q'
Hamme
HammerFall
Hammourabi
Hamont-Achel/L'D'Q'
Hampshire
Ham-sur-Heure-Nalinnes/L'D'Q'
Hamza/L'D'Q'
3461
3462
3463
3464
3465
3466
3467

3468
3469
3470
3471
3472
3473
3474
Howard
Hubble
Hubei
Hubert/L'D'Q'
Hubscher
Hudson/L'D'Q'
Huelgoat

Hugo/L'D'Q'
Hugo/L'D'Q'
Hugues/L'D'Q'
Huguette
Hulshout/L'D'Q'
Hume
Hun/S.







>







3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
Howard
Hubble
Hubei
Hubert/L'D'Q'
Hubscher
Hudson/L'D'Q'
Huelgoat
Hugh/L'D'Q'
Hugo/L'D'Q'
Hugo/L'D'Q'
Hugues/L'D'Q'
Huguette
Hulshout/L'D'Q'
Hume
Hun/S.
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
IMSI/L'D'Q'
INED/L'D'Q'
INPI/L'D'Q'
INRA/L'D'Q'
INRI/L'D'Q'
INRIA/L'D'Q'
INSA/L'D'Q'
INSERM/L'D'Q'
IP/L'D'Q'
IRA/L'
IRD/L'D'Q'
IRFM/L'D'Q'
IRL
IRM/L'D'Q'
IRSTEA/L'D'Q'







<







3525
3526
3527
3528
3529
3530
3531

3532
3533
3534
3535
3536
3537
3538
IMSI/L'D'Q'
INED/L'D'Q'
INPI/L'D'Q'
INRA/L'D'Q'
INRI/L'D'Q'
INRIA/L'D'Q'
INSA/L'D'Q'

IP/L'D'Q'
IRA/L'
IRD/L'D'Q'
IRFM/L'D'Q'
IRL
IRM/L'D'Q'
IRSTEA/L'D'Q'
3594
3595
3596
3597
3598
3599
3600

3601
3602
3603
3604
3605
3606
3607
Ingrid/L'D'Q'
Inkscape/L'D'Q'
Inn/L'D'
Inna/L'D'Q'
Innsmouth/L'D'Q'
Inovia/L'D'Q'
Insee/L'D'Q'

Insulinde/L'D'
Intel/L'D'Q'
Internet/D'Q'
Interpol/D'Q'
Io/L'D'Q'
Ionesco/L'D'Q'
Ioulia/L'D'Q'







>







3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
Ingrid/L'D'Q'
Inkscape/L'D'Q'
Inn/L'D'
Inna/L'D'Q'
Innsmouth/L'D'Q'
Inovia/L'D'Q'
Insee/L'D'Q'
Inserm/L'D'Q'
Insulinde/L'D'
Intel/L'D'Q'
Internet/D'Q'
Interpol/D'Q'
Io/L'D'Q'
Ionesco/L'D'Q'
Ioulia/L'D'Q'
4296
4297
4298
4299
4300
4301
4302

4303
4304
4305
4306
4307
4308
4309
Léonore
Léontine
Léopold
Léopoldine
Leopoldt
Léopoldville
Leroy

Lesbos
Lesieur
Lesley
Leslie
Lesneven
Lesotho
Lesse







>







4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
Léonore
Léontine
Léopold
Léopoldine
Leopoldt
Léopoldville
Leroy
Lesage
Lesbos
Lesieur
Lesley
Leslie
Lesneven
Lesotho
Lesse
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
Noisy-le-Grand
Noisy-le-Sec
Nokia
Nolan
Nolwenn
Nora
Norbert
Nord
Nord-Kivu
Nord-Pas-de-Calais
Nord-du-Québec
Nordine
Norfolk
Norique
Norma







<







5484
5485
5486
5487
5488
5489
5490

5491
5492
5493
5494
5495
5496
5497
Noisy-le-Grand
Noisy-le-Sec
Nokia
Nolan
Nolwenn
Nora
Norbert

Nord-Kivu
Nord-Pas-de-Calais
Nord-du-Québec
Nordine
Norfolk
Norique
Norma
6209
6210
6211
6212
6213
6214
6215

6216
6217
6218
6219
6220
6221
6222
Reidemeister
Reiko
Reims
Reiten
Relecq-Kerhuon
Rellich
Rembrandt

Rémi
Remich
Remire-Montjoly
Remus
Rémy
Renaix
Renan







>







6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
Reidemeister
Reiko
Reims
Reiten
Relecq-Kerhuon
Rellich
Rembrandt
Remi
Rémi
Remich
Remire-Montjoly
Remus
Rémy
Renaix
Renan
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
Rosita
Rosny-sous-Bois
Ross
Rossini
Rossinière
Rostand
Roswell
Roth
Roth
Rothbard
Rothschild
Rotin
Rotselaar
Rotterdam
Roubaix







<







6390
6391
6392
6393
6394
6395
6396

6397
6398
6399
6400
6401
6402
6403
Rosita
Rosny-sous-Bois
Ross
Rossini
Rossinière
Rostand
Roswell

Roth
Rothbard
Rothschild
Rotin
Rotselaar
Rotterdam
Roubaix
9055
9056
9057
9058
9059
9060
9061
9062
9063
9064
9065
9066

9067
9068
9069
9070
9071
9072
9073
additionnelle/F*
additionnellement/D'Q'
additionner/a4p+
additionneuse/F*
additive/F*
additivement/D'Q'
additivité/S*
addon/S*
adducteur/S*
adduction/S*
adduit/S*
adèle/S*

adelphophagie/S*
adénine/S*
adénite/S*
adénocarcinome/S*
adénogramme/S*
adénoïde/S*
adénoïdectomie/S*







|




>







9065
9066
9067
9068
9069
9070
9071
9072
9073
9074
9075
9076
9077
9078
9079
9080
9081
9082
9083
9084
additionnelle/F*
additionnellement/D'Q'
additionner/a4p+
additionneuse/F*
additive/F*
additivement/D'Q'
additivité/S*
add-on/S*
adducteur/S*
adduction/S*
adduit/S*
adèle/S*
adelphe/S*
adelphophagie/S*
adénine/S*
adénite/S*
adénocarcinome/S*
adénogramme/S*
adénoïde/S*
adénoïdectomie/S*
9288
9289
9290
9291
9292
9293
9294
9295
9296
9297
9298
9299
9300
9301
9302
aérobie/S*
aérobie/S*
aérobiologie/S*
aérobiologique/S*
aérobiose/S*
aérobique/S*
aérocâble/S*
aéro-club/S*
aérocolie/S*
aérodigestive/F*
aérodistorsion/S*
aérodrome/S*
aérodynamicienne/F*
aérodynamique/S*
aérodynamique/S*







|







9299
9300
9301
9302
9303
9304
9305
9306
9307
9308
9309
9310
9311
9312
9313
aérobie/S*
aérobie/S*
aérobiologie/S*
aérobiologique/S*
aérobiose/S*
aérobique/S*
aérocâble/S*
aéroclub/S*
aérocolie/S*
aérodigestive/F*
aérodistorsion/S*
aérodrome/S*
aérodynamicienne/F*
aérodynamique/S*
aérodynamique/S*
9731
9732
9733
9734
9735
9736
9737

9738
9739
9740
9741
9742
9743
9744
agripper/a4p+
agritourisme/S*
agroalimentaire/S*
agroalimentaire/S*
agrobiologie/S*
agrobiologique/S*
agrobiologiste/S*

agrocarburant/S*
agro-carburant/S*
agrochimie/S*
agrochimique/S*
agrochimiste/S*
agroclimatique/S*
agro-climatique/S*







>







9742
9743
9744
9745
9746
9747
9748
9749
9750
9751
9752
9753
9754
9755
9756
agripper/a4p+
agritourisme/S*
agroalimentaire/S*
agroalimentaire/S*
agrobiologie/S*
agrobiologique/S*
agrobiologiste/S*
agrobusiness/L'D'Q'
agrocarburant/S*
agro-carburant/S*
agrochimie/S*
agrochimique/S*
agrochimiste/S*
agroclimatique/S*
agro-climatique/S*
9872
9873
9874
9875
9876
9877
9878

9879
9880
9881
9882
9883
9884
9885
aillade/S*
ailler/a2p+
ailleurs/L'D'Q'
ailloli/S*
aimable/S*
aimablement/D'Q'
aimant/S*

aimantation/S*
aimante/F*
aimanter/a4p+
aimantin/S*
aimantine/F*
aimée/F*
aimer/a4p+







>







9884
9885
9886
9887
9888
9889
9890
9891
9892
9893
9894
9895
9896
9897
9898
aillade/S*
ailler/a2p+
ailleurs/L'D'Q'
ailloli/S*
aimable/S*
aimablement/D'Q'
aimant/S*
aimantable/S*
aimantation/S*
aimante/F*
aimanter/a4p+
aimantin/S*
aimantine/F*
aimée/F*
aimer/a4p+
10508
10509
10510
10511
10512
10513
10514
10515
10516
10517
10518
10519
10520
10521
10522
amathie/S*
amatir/f2p+
amatrice/F*
amaurose/S*
amazone/S*
amazonienne/F*
amazonite/S*
ambages/D'Q'
ambassade/S*
ambassadrice/F*
ambiance/S*
ambiancer/a1p.
ambianceuse/F*
ambiante/F*
ambidextre/S*







|







10521
10522
10523
10524
10525
10526
10527
10528
10529
10530
10531
10532
10533
10534
10535
amathie/S*
amatir/f2p+
amatrice/F*
amaurose/S*
amazone/S*
amazonienne/F*
amazonite/S*
ambage/S*
ambassade/S*
ambassadrice/F*
ambiance/S*
ambiancer/a1p.
ambianceuse/F*
ambiante/F*
ambidextre/S*
11352
11353
11354
11355
11356
11357
11358

11359
11360
11361
11362
11363
11364
11365
annuité/S*
annulabilité/S*
annulable/S*
annulaire/S*
annulation/S*
annulative/F*
annulatrice/F*

annuler/a4p+
annuus
anoblir/f4p+
anoblissante/F*
anoblissement/S*
anode/S*
anodine/F*







>







11365
11366
11367
11368
11369
11370
11371
11372
11373
11374
11375
11376
11377
11378
11379
annuité/S*
annulabilité/S*
annulable/S*
annulaire/S*
annulation/S*
annulative/F*
annulatrice/F*
annulement/S*
annuler/a4p+
annuus
anoblir/f4p+
anoblissante/F*
anoblissement/S*
anode/S*
anodine/F*
11668
11669
11670
11671
11672
11673
11674


11675
11676
11677
11678
11679
11680
11681
antiémétique/S*
antiémeute/L'D'Q'
antienne/S*
antienzyme/S*
antiépileptique/S*
antiesclavagiste/S*
antiétatique/S*


antifading/S*
antifascisme/S*
antifasciste/S*
antiféminisme/S*
antiféministe/S*
antiferment/S*
antiferroélectricité/S*







>
>







11682
11683
11684
11685
11686
11687
11688
11689
11690
11691
11692
11693
11694
11695
11696
11697
antiémétique/S*
antiémeute/L'D'Q'
antienne/S*
antienzyme/S*
antiépileptique/S*
antiesclavagiste/S*
antiétatique/S*
antiétatisme/S*
antifa/S*
antifading/S*
antifascisme/S*
antifasciste/S*
antiféminisme/S*
antiféministe/S*
antiferment/S*
antiferroélectricité/S*
12472
12473
12474
12475
12476
12477
12478

12479
12480
12481
12482
12483
12484
12485
arc/S*
arcade/S*
arcane/S*
arcanson/S*
arcasse/S*
arcature/S*
arc-boutant/L'D'Q'

arc-bouter/a4p+
arccos
arccosh
arccotan
arccotanh
arc-doubleau/L'D'Q'
arceau/X*







>







12488
12489
12490
12491
12492
12493
12494
12495
12496
12497
12498
12499
12500
12501
12502
arc/S*
arcade/S*
arcane/S*
arcanson/S*
arcasse/S*
arcature/S*
arc-boutant/L'D'Q'
arc-boutement
arc-bouter/a4p+
arccos
arccosh
arccotan
arccotanh
arc-doubleau/L'D'Q'
arceau/X*
12569
12570
12571
12572
12573
12574
12575

12576
12577
12578
12579
12580
12581
12582
archontat/S*
archonte/S*
archosaurien/S*
archure/S*
arçon/S*
arçonner/a2p+
arcs-boutants/D'Q'

arcs-doubleaux/D'Q'
arcs-en-ciel/D'Q'
arcsin
arcsinh
arctan
arctanh
arctique/S*







>







12586
12587
12588
12589
12590
12591
12592
12593
12594
12595
12596
12597
12598
12599
12600
archontat/S*
archonte/S*
archosaurien/S*
archure/S*
arçon/S*
arçonner/a2p+
arcs-boutants/D'Q'
arcs-boutements
arcs-doubleaux/D'Q'
arcs-en-ciel/D'Q'
arcsin
arcsinh
arctan
arctanh
arctique/S*
14953
14954
14955
14956
14957
14958
14959
14960
14961
14962
14963
14964
14965
14966
14967
14968
14969
14970
14971
14972
14973
14974
14975
14976
14977
14978
14979
14980
14981
14982
14983
14984
14985
14986
14987
bascule/S.
basculement/S.
basculer/a0p+
basculeur/S.
bas-culotte/S.
bas-de-casse
base/S.
base-ball/S.
baselle/S.
baser/a0p+
bas-fond/S.
basicité/S.
baside/S.
basidiomycète/S.
basidiomycète/S.
basidiospore/S.
basilaire/S.
basileus
basilic/S.
basilicale/W.
basilique/S.
basin/S.
basiphile/S.
basique/S.
basiquement
bas-jointée/F.
basket/S.
basket-ball/S.
basketteuse/F.
bas-mât/S.
basmati/S.
basocellulaire/S.
basoche/S.
basochienne/F.
bas-officier/S.







|



















|







14971
14972
14973
14974
14975
14976
14977
14978
14979
14980
14981
14982
14983
14984
14985
14986
14987
14988
14989
14990
14991
14992
14993
14994
14995
14996
14997
14998
14999
15000
15001
15002
15003
15004
15005
bascule/S.
basculement/S.
basculer/a0p+
basculeur/S.
bas-culotte/S.
bas-de-casse
base/S.
baseball/S.
baselle/S.
baser/a0p+
bas-fond/S.
basicité/S.
baside/S.
basidiomycète/S.
basidiomycète/S.
basidiospore/S.
basilaire/S.
basileus
basilic/S.
basilicale/W.
basilique/S.
basin/S.
basiphile/S.
basique/S.
basiquement
bas-jointée/F.
basket/S.
basketball/S.
basketteuse/F.
bas-mât/S.
basmati/S.
basocellulaire/S.
basoche/S.
basochienne/F.
bas-officier/S.
15469
15470
15471
15472
15473
15474
15475

15476
15477
15478
15479
15480
15481
15482
bernard-l'hermite
berne/S.
berner/a0p+
berneuse/F.
bernicle/S.
bernique
bernique/S.

berrichonne/F.
bersaglier/S.
berthon/S.
bertillonnage/S.
béryl/S.
bérylliose/S.
béryllium/S.







>







15487
15488
15489
15490
15491
15492
15493
15494
15495
15496
15497
15498
15499
15500
15501
bernard-l'hermite
berne/S.
berner/a0p+
berneuse/F.
bernicle/S.
bernique
bernique/S.
bernoise/F.
berrichonne/F.
bersaglier/S.
berthon/S.
bertillonnage/S.
béryl/S.
bérylliose/S.
béryllium/S.
16592
16593
16594
16595
16596
16597
16598
16599
16600
16601
16602
16603
16604
16605
16606
16607
16608
bondonnière/S.
bondrée/S.
bonellie/S.
bongo/S.
bonheur/S.
bonheur-du-jour
bonheurs-du-jour
bonhomie/S.
bonhomme
bonhomme/S.
boni/S.
bonichon/S.
bonifiante/F.
bonification/S.
bonifier/a0p+
boniment/S.
bonimenter/a0p.







|
|
|







16611
16612
16613
16614
16615
16616
16617
16618
16619
16620
16621
16622
16623
16624
16625
16626
16627
bondonnière/S.
bondrée/S.
bonellie/S.
bongo/S.
bonheur/S.
bonheur-du-jour
bonheurs-du-jour
bonhomme
bonhomme/S.
bonhommie/S.
boni/S.
bonichon/S.
bonifiante/F.
bonification/S.
bonifier/a0p+
boniment/S.
bonimenter/a0p.
17715
17716
17717
17718
17719
17720
17721

17722
17723
17724
17725
17726
17727
17728
bugne/S.
bugrane/S.
buguée/F.
build/S.
building/S.
buire/S.
buis

buisson/S.
buisson-ardent
buissonnante/F.
buissonnet/S.
buissonneuse/W.
buissonnière/F.
buissons-ardents







>







17734
17735
17736
17737
17738
17739
17740
17741
17742
17743
17744
17745
17746
17747
17748
bugne/S.
bugrane/S.
buguée/F.
build/S.
building/S.
buire/S.
buis
buissaie/S.
buisson/S.
buisson-ardent
buissonnante/F.
buissonnet/S.
buissonneuse/W.
buissonnière/F.
buissons-ardents
18055
18056
18057
18058
18059
18060
18061

18062
18063
18064
18065
18066
18067
18068
cadrer/a0p+
cadreuse/F.
cadriciel/S.
caduc/S.
caducée/S.
caducifoliée/F.
caducité/S.

caduque/S.
cæcale/W.
cæcotrophie/S.
cæcum/S.
caennaise/F.
cænogenèse/S.
cæsine







>







18075
18076
18077
18078
18079
18080
18081
18082
18083
18084
18085
18086
18087
18088
18089
cadrer/a0p+
cadreuse/F.
cadriciel/S.
caduc/S.
caducée/S.
caducifoliée/F.
caducité/S.
caduque/F.
caduque/S.
cæcale/W.
cæcotrophie/S.
cæcum/S.
caennaise/F.
cænogenèse/S.
cæsine
18452
18453
18454
18455
18456
18457
18458

18459
18460
18461
18462
18463
18464
18465
camping-caravaning/S.
camping-gaz
campinoise/F.
campo/S.
campus
camuse/F.
canada/S.

canadianisme/S.
canadienne/F.
canado-américaine/F.
canaille/S.
canaillement
canaillerie/S.
canaillocratie/S.







>







18473
18474
18475
18476
18477
18478
18479
18480
18481
18482
18483
18484
18485
18486
18487
camping-caravaning/S.
camping-gaz
campinoise/F.
campo/S.
campus
camuse/F.
canada/S.
canadair/S.
canadianisme/S.
canadienne/F.
canado-américaine/F.
canaille/S.
canaillement
canaillerie/S.
canaillocratie/S.
19428
19429
19430
19431
19432
19433
19434

19435
19436
19437
19438
19439
19440
19441
caucasique/S.
cauchemar/S.
cauchemarder/a0p.
cauchemardesque/S.
cauchemardeuse/W.
caucus
caudale/W.

caudataire/S.
caudataire/S.
caudillo/S.
caudine/S.
caudrette/S.
caulescente/F.
caulicole/S.







>







19450
19451
19452
19453
19454
19455
19456
19457
19458
19459
19460
19461
19462
19463
19464
caucasique/S.
cauchemar/S.
cauchemarder/a0p.
cauchemardesque/S.
cauchemardeuse/W.
caucus
caudale/W.
caudalie/S.
caudataire/S.
caudataire/S.
caudillo/S.
caudine/S.
caudrette/S.
caulescente/F.
caulicole/S.
24029
24030
24031
24032
24033
24034
24035

24036
24037
24038
24039
24040
24041
24042
corruptrice/F.
corsage/S.
corsaire/S.
corse/S.
corselet/S.
corser/a0p+
corset/S.

corseter/b0p+
corseterie/S.
corsetière/F.
corso/S.
cortège/S.
cortès
cortex







>







24052
24053
24054
24055
24056
24057
24058
24059
24060
24061
24062
24063
24064
24065
24066
corruptrice/F.
corsage/S.
corsaire/S.
corse/S.
corselet/S.
corser/a0p+
corset/S.
corsetage/S.
corseter/b0p+
corseterie/S.
corsetière/F.
corso/S.
cortège/S.
cortès
cortex
24472
24473
24474
24475
24476
24477
24478
24479
24480
24481
24482
24483
24484
24485
24486
covenant/S.
covendeuse/F.
cover-girl/S.
covoiturage/S.
covoiturer/a0p+
covoitureuse/F.
covolume/S.
cow-boy/S.
cowper/S.
coxale/W.
coxalgie/S.
coxalgique/S.
coxarthrose/S.
coxer/a0p+
coxofémorale/W.







|







24496
24497
24498
24499
24500
24501
24502
24503
24504
24505
24506
24507
24508
24509
24510
covenant/S.
covendeuse/F.
cover-girl/S.
covoiturage/S.
covoiturer/a0p+
covoitureuse/F.
covolume/S.
cowboy/S.
cowper/S.
coxale/W.
coxalgie/S.
coxalgique/S.
coxarthrose/S.
coxer/a0p+
coxofémorale/W.
25530
25531
25532
25533
25534
25535
25536

25537
25538
25539
25540
25541
25542
25543
cytotoxicité/S.
cytotoxique/S.
czardas
czimbalum/S.
d
d/||--
dB/||--

dacryoadénite/S.
dacryocystite/S.
dactyle/S.
dactylique/S.
dactylo/S.
dactylogramme/S.
dactylographe/S.







>







25554
25555
25556
25557
25558
25559
25560
25561
25562
25563
25564
25565
25566
25567
25568
cytotoxicité/S.
cytotoxique/S.
czardas
czimbalum/S.
d
d/||--
dB/||--
daba/S.
dacryoadénite/S.
dacryocystite/S.
dactyle/S.
dactylique/S.
dactylo/S.
dactylogramme/S.
dactylographe/S.
27316
27317
27318
27319
27320
27321
27322

27323
27324
27325
27326
27327
27328
27329
dénombrabilité/S.
dénombrable/S.
dénombrement/S.
dénombrer/a0p+
dénominateur/S.
dénomination/S.
dénominative/F.

dénommer/a0p+
dénoncer/a0p+
dénonciation/S.
dénonciatrice/F.
dénotation/S.
dénotationnelle/F.
dénotative/F.







>







27341
27342
27343
27344
27345
27346
27347
27348
27349
27350
27351
27352
27353
27354
27355
dénombrabilité/S.
dénombrable/S.
dénombrement/S.
dénombrer/a0p+
dénominateur/S.
dénomination/S.
dénominative/F.
dénommable/S.
dénommer/a0p+
dénoncer/a0p+
dénonciation/S.
dénonciatrice/F.
dénotation/S.
dénotationnelle/F.
dénotative/F.
28114
28115
28116
28117
28118
28119
28120

28121
28122
28123
28124
28125
28126
28127
désincorporer/a0p+
désincrustation/S.
désincruster/a0p+
désinculper/a0p+
désindenter/a0p+
désindexation/S.
désindexer/a0p+

désindustrialisation/S.
désindustrialiser/a0p+
désinence/S.
désinentielle/F.
désinfectante/F.
désinfecter/a0p+
désinfection/S.







>







28140
28141
28142
28143
28144
28145
28146
28147
28148
28149
28150
28151
28152
28153
28154
désincorporer/a0p+
désincrustation/S.
désincruster/a0p+
désinculper/a0p+
désindenter/a0p+
désindexation/S.
désindexer/a0p+
désindividualiser/a0p+
désindustrialisation/S.
désindustrialiser/a0p+
désinence/S.
désinentielle/F.
désinfectante/F.
désinfecter/a0p+
désinfection/S.
28163
28164
28165
28166
28167
28168
28169

28170
28171
28172
28173
28174
28175
28176
désinviter/a0p+
désinvolte/S.
désinvoltement
désinvolture/S.
désir/S.
désirabilité/S.
désirable/S.

désirer/a0p+
désireuse/W.
désistement/S.
désister/a0p+
desman/S.
desmine/S.
desmodonte/S.







>







28190
28191
28192
28193
28194
28195
28196
28197
28198
28199
28200
28201
28202
28203
28204
désinviter/a0p+
désinvolte/S.
désinvoltement
désinvolture/S.
désir/S.
désirabilité/S.
désirable/S.
désirante/F.
désirer/a0p+
désireuse/W.
désistement/S.
désister/a0p+
desman/S.
desmine/S.
desmodonte/S.
28793
28794
28795
28796
28797
28798
28799

28800
28801
28802
28803
28804
28805
28806
diarrhée/S.
diarrhéique/S.
diarthrose/S.
diascope/S.
diascopie/S.
diascordium/S.
diaspora/S.

diastase/S.
diastasique/S.
diastème/S.
diastéréo-isomère/S.
diastole/S.
diastolique/S.
diastratique/S.







>







28821
28822
28823
28824
28825
28826
28827
28828
28829
28830
28831
28832
28833
28834
28835
diarrhée/S.
diarrhéique/S.
diarthrose/S.
diascope/S.
diascopie/S.
diascordium/S.
diaspora/S.
diasporique/S.
diastase/S.
diastasique/S.
diastème/S.
diastéréo-isomère/S.
diastole/S.
diastolique/S.
diastratique/S.
29507
29508
29509
29510
29511
29512
29513

29514
29515
29516
29517
29518
29519
29520
diversement
diverses
diversifiable/S.
diversification/S.
diversifier/a0p+
diversiforme/S.
diversion/S.

diversité/S.
diverticule/S.
diverticulite/S.
diverticulose/S.
divertimento/S.
divertir/f0p+
divertissante/F.







>







29536
29537
29538
29539
29540
29541
29542
29543
29544
29545
29546
29547
29548
29549
29550
diversement
diverses
diversifiable/S.
diversification/S.
diversifier/a0p+
diversiforme/S.
diversion/S.
diversitaire/S.
diversité/S.
diverticule/S.
diverticulite/S.
diverticulose/S.
divertimento/S.
divertir/f0p+
divertissante/F.
30618
30619
30620
30621
30622
30623
30624
30625
30626
30627
30628
30629
30630
30631
30632
écocertifiée/F*
écocide/S*
écocitoyenne/F*
écocitoyenneté/S*
écoconception/S*
écoconduite/S*
écoconstruction/S*
éco-construction/S*
écoemballage/S*
éco-environnementale/F*
écœurante/F*
écœurement/S*
écœurer/a2p+
écogeste/S*
écohabitat/S*







<







30648
30649
30650
30651
30652
30653
30654

30655
30656
30657
30658
30659
30660
30661
écocertifiée/F*
écocide/S*
écocitoyenne/F*
écocitoyenneté/S*
écoconception/S*
écoconduite/S*
écoconstruction/S*

écoemballage/S*
éco-environnementale/F*
écœurante/F*
écœurement/S*
écœurer/a2p+
écogeste/S*
écohabitat/S*
32080
32081
32082
32083
32084
32085
32086

32087
32088
32089
32090
32091
32092
32093
endoénergétique/S*
endogame/S*
endogamie/S*
endogamique/S*
endogée/F*
endogène/S*
endogénéité/S*

endolocalisation/S*
endolorir/f2p+
endolorissement/S*
endolymphe/S*
endomètre/S*
endométriose/S*
endométrite/S*







>







32109
32110
32111
32112
32113
32114
32115
32116
32117
32118
32119
32120
32121
32122
32123
endoénergétique/S*
endogame/S*
endogamie/S*
endogamique/S*
endogée/F*
endogène/S*
endogénéité/S*
endogroupe/S*
endolocalisation/S*
endolorir/f2p+
endolorissement/S*
endolymphe/S*
endomètre/S*
endométriose/S*
endométrite/S*
33849
33850
33851
33852
33853
33854
33855


33856
33857
33858
33859
33860
33861
33862
ethmoïdale/W*
ethmoïde/S*
ethmoïdite/S*
ethnarchie/S*
ethnarque/S*
ethnicisation/S*
ethniciser/a2p+


ethnicité/S*
ethnico-religieuse/W*
ethnie/S*
ethnique/S*
ethniquement/D'Q'
ethnobiologie/S*
ethnobotanique/S*







>
>







33879
33880
33881
33882
33883
33884
33885
33886
33887
33888
33889
33890
33891
33892
33893
33894
ethmoïdale/W*
ethmoïde/S*
ethmoïdite/S*
ethnarchie/S*
ethnarque/S*
ethnicisation/S*
ethniciser/a2p+
ethnicisme/S*
ethniciste/S*
ethnicité/S*
ethnico-religieuse/W*
ethnie/S*
ethnique/S*
ethniquement/D'Q'
ethnobiologie/S*
ethnobotanique/S*
33884
33885
33886
33887
33888
33889
33890

33891
33892
33893
33894
33895
33896
33897
ethnométhodologue/S*
ethnomusicologie/S*
ethnomusicologue/S*
ethnonyme/S*
ethnonymie/S*
ethnopsychiatrie/S*
ethnopsychologie/S*

ethnoreligieuse/W*
éthographie/S*
éthologie/S*
éthologique/S*
éthologiste/S*
éthologue/S*
ethos/L'D'Q'







>







33916
33917
33918
33919
33920
33921
33922
33923
33924
33925
33926
33927
33928
33929
33930
ethnométhodologue/S*
ethnomusicologie/S*
ethnomusicologue/S*
ethnonyme/S*
ethnonymie/S*
ethnopsychiatrie/S*
ethnopsychologie/S*
ethno-raciale/W*
ethnoreligieuse/W*
éthographie/S*
éthologie/S*
éthologique/S*
éthologiste/S*
éthologue/S*
ethos/L'D'Q'
34478
34479
34480
34481
34482
34483
34484

34485
34486
34487
34488
34489
34490
34491
exode/S*
exoderme/S*
exogame/S*
exogamie/S*
exogamique/S*
exogène/S*
exogénéité/S*

exomphale/S*
exon/S*
exondation/S*
exondement/S*
exonder/a3p+
exonération/S*
exonérer/c4p+







>







34511
34512
34513
34514
34515
34516
34517
34518
34519
34520
34521
34522
34523
34524
34525
exode/S*
exoderme/S*
exogame/S*
exogamie/S*
exogamique/S*
exogène/S*
exogénéité/S*
exogroupe/S*
exomphale/S*
exon/S*
exondation/S*
exondement/S*
exonder/a3p+
exonération/S*
exonérer/c4p+
34684
34685
34686
34687
34688
34689
34690


34691
34692
34693
34694
34695
34696
34697
extensionnelle/F*
extensité/S*
extensive/F*
extensivement/L'D'Q'
extensivité/S*
extenso
extensomètre/S*


exténuante/F*
exténuation/S*
exténuée/F*
exténuement/S*
exténuer/a4p+
extérieur/S*
extérieure/F*







>
>







34718
34719
34720
34721
34722
34723
34724
34725
34726
34727
34728
34729
34730
34731
34732
34733
extensionnelle/F*
extensité/S*
extensive/F*
extensivement/L'D'Q'
extensivité/S*
extenso
extensomètre/S*
extensométrie/S*
extensométrique/S*
exténuante/F*
exténuation/S*
exténuée/F*
exténuement/S*
exténuer/a4p+
extérieur/S*
extérieure/F*
35807
35808
35809
35810
35811
35812
35813

35814
35815
35816
35817
35818
35819
35820
filoselle/S.
filou/S.
filoutage/S.
filouter/a0p+
filouterie/S.
filovirus
fils

filtrable/S.
filtrage/S.
filtrante/F.
filtrat/S.
filtration/S.
filtre/S.
filtre-presse







>







35843
35844
35845
35846
35847
35848
35849
35850
35851
35852
35853
35854
35855
35856
35857
filoselle/S.
filou/S.
filoutage/S.
filouter/a0p+
filouterie/S.
filovirus
fils
filsdeputerie/S.
filtrable/S.
filtrage/S.
filtrante/F.
filtrat/S.
filtration/S.
filtre/S.
filtre-presse
36017
36018
36019
36020
36021
36022
36023
36024
36025
36026
36027
36028
36029
36030
36031
flanquer/a0p+
flapie/F.
flaque/S.
flaquer/a0p.
flash/A.
flashage/S.
flash-back
flash-ball/S.
flasher/a0p+
flasheuse/F.
flashmètre/S.
flashy
flasque/S.
flasquement
flatter/a0p+







|







36054
36055
36056
36057
36058
36059
36060
36061
36062
36063
36064
36065
36066
36067
36068
flanquer/a0p+
flapie/F.
flaque/S.
flaquer/a0p.
flash/A.
flashage/S.
flash-back
flashball/S.
flasher/a0p+
flasheuse/F.
flashmètre/S.
flashy
flasque/S.
flasquement
flatter/a0p+
36680
36681
36682
36683
36684
36685
36686

36687
36688
36689
36690
36691
36692
36693
foutou/S.
foutrale/F.
foutraque/S.
foutre/S.
foutre/tM
foutredieu
foutrement

foutriquet/S.
foutue/F.
fovéa/S.
fovéale/W.
fox
foxée/F.
fox-hound/S.







>







36717
36718
36719
36720
36721
36722
36723
36724
36725
36726
36727
36728
36729
36730
36731
foutou/S.
foutrale/F.
foutraque/S.
foutre/S.
foutre/tM
foutredieu
foutrement
foutrerie/S.
foutriquet/S.
foutue/F.
fovéa/S.
fovéale/W.
fox
foxée/F.
fox-hound/S.
40056
40057
40058
40059
40060
40061
40062

40063
40064
40065
40066
40067
40068
40069
haptique/S*
haptonomie/S*
haptonomique/S*
haquebute/S.
haquenée/S.
haquet/S.
hara-kiri/S.

harangue/S.
haranguer/a0p+
harangueuse/F.
haras
harassante/F.
harassement/S.
harasser/a0p+







>







40094
40095
40096
40097
40098
40099
40100
40101
40102
40103
40104
40105
40106
40107
40108
haptique/S*
haptonomie/S*
haptonomique/S*
haquebute/S.
haquenée/S.
haquet/S.
hara-kiri/S.
haram
harangue/S.
haranguer/a0p+
harangueuse/F.
haras
harassante/F.
harassement/S.
harasser/a0p+
41188
41189
41190
41191
41192
41193
41194
41195
41196
41197
41198
41199
41200
41201
41202
hors-bilan
hors-bord
hors-champ
hors-concours
hors-cote
hors-cote
hors-d'œuvre
horse-ball/S.
horse-guard/S.
horse-power
horse-pox
hors-jeu
hors-la-loi
hors-ligne
hors-média







|







41227
41228
41229
41230
41231
41232
41233
41234
41235
41236
41237
41238
41239
41240
41241
hors-bilan
hors-bord
hors-champ
hors-concours
hors-cote
hors-cote
hors-d'œuvre
horseball/S.
horse-guard/S.
horse-power
horse-pox
hors-jeu
hors-la-loi
hors-ligne
hors-média
41301
41302
41303
41304
41305
41306
41307

41308
41309
41310
41311
41312
41313
41314

41315
41316
41317
41318
41319
41320
41321
hoyau/X.
hpz/||--
http/S=
huard/S.
huart/S.
hub/S.
hublot/S.

huche/S.
hucher/a0p+
huchet/S.
hue
huée/S.
huer/a0p+
huerta/S.

huguenote/F.
huilage/S*
huile/S*
huiler/a2p+
huilerie/S*
huileuse/W*
huilière/F*







>







>







41340
41341
41342
41343
41344
41345
41346
41347
41348
41349
41350
41351
41352
41353
41354
41355
41356
41357
41358
41359
41360
41361
41362
hoyau/X.
hpz/||--
http/S=
huard/S.
huart/S.
hub/S.
hublot/S.
hubris/L'D'Q'
huche/S.
hucher/a0p+
huchet/S.
hue
huée/S.
huer/a0p+
huerta/S.
hugolienne/F*
huguenote/F.
huilage/S*
huile/S*
huiler/a2p+
huilerie/S*
huileuse/W*
huilière/F*
41799
41800
41801
41802
41803
41804
41805


41806
41807
41808
41809
41810
41811
41812
hypertrophier/a4p+
hypertrophique/S*
hyperuricémie/S*
hypervariable/S*
hyperventilation/S*
hyperventiler/a1p.
hypervigilance/S*


hyperviscosité/S*
hyperviseur/S*
hypervitaminose/S*
hyphe/S*
hypholome/S*
hypnagogique/S*
hypnogramme/S*







>
>







41840
41841
41842
41843
41844
41845
41846
41847
41848
41849
41850
41851
41852
41853
41854
41855
hypertrophier/a4p+
hypertrophique/S*
hyperuricémie/S*
hypervariable/S*
hyperventilation/S*
hyperventiler/a1p.
hypervigilance/S*
hyperviolence/S*
hyperviolente/F*
hyperviscosité/S*
hyperviseur/S*
hypervitaminose/S*
hyphe/S*
hypholome/S*
hypnagogique/S*
hypnogramme/S*
42184
42185
42186
42187
42188
42189
42190

42191
42192
42193
42194
42195
42196
42197
illisibilité/S*
illisible/S*
illisiblement/D'Q'
illogique/S*
illogiquement/D'Q'
illogisme/S*
illuminante/F*

illumination/S*
illuminative/F*
illuminatrice/F*
illuminée/F*
illuminer/a4p+
illuminisme/S*
illusion/S*







>







42227
42228
42229
42230
42231
42232
42233
42234
42235
42236
42237
42238
42239
42240
42241
illisibilité/S*
illisible/S*
illisiblement/D'Q'
illogique/S*
illogiquement/D'Q'
illogisme/S*
illuminante/F*
illuminati/L'D'Q'
illumination/S*
illuminative/F*
illuminatrice/F*
illuminée/F*
illuminer/a4p+
illuminisme/S*
illusion/S*
42370
42371
42372
42373
42374
42375
42376
42377
42378
42379
42380
42381
42382
42383
42384
immunodéficiente/F*
immunodéficitaire/S*
immunodépresseur/S*
immunodépression/S*
immunodépressive/F*
immunodéprimée/F*
immunofluorescence/S*
immuno-fluorescence/S*
immunogène/S*
immunogénétique/S*
immunogénicité/S*
immunogénique/S*
immunoglobuline/S*
immunohistochimie/S*
immunologie/S*







<







42414
42415
42416
42417
42418
42419
42420

42421
42422
42423
42424
42425
42426
42427
immunodéficiente/F*
immunodéficitaire/S*
immunodépresseur/S*
immunodépression/S*
immunodépressive/F*
immunodéprimée/F*
immunofluorescence/S*

immunogène/S*
immunogénétique/S*
immunogénicité/S*
immunogénique/S*
immunoglobuline/S*
immunohistochimie/S*
immunologie/S*
42425
42426
42427
42428
42429
42430
42431

42432
42433
42434
42435
42436
42437
42438
imparisyllabique/S*
imparité/S*
impartageable/S*
impartiale/W*
impartialement/D'Q'
impartialité/S*
impartir/fC

impasse/S*
impassibilité/S*
impassible/S*
impassiblement/D'Q'
impatiemment/D'Q'
impatience/S*
impatiens/L'D'Q'







>







42468
42469
42470
42471
42472
42473
42474
42475
42476
42477
42478
42479
42480
42481
42482
imparisyllabique/S*
imparité/S*
impartageable/S*
impartiale/W*
impartialement/D'Q'
impartialité/S*
impartir/fC
impassable/S*
impasse/S*
impassibilité/S*
impassible/S*
impassiblement/D'Q'
impatiemment/D'Q'
impatience/S*
impatiens/L'D'Q'
52022
52023
52024
52025
52026
52027
52028

52029
52030
52031
52032
52033
52034
52035
multidevise/S.
multidiffusion/S.
multidimensionnalité/S.
multidimensionnelle/F.
multidirectionnalité/S.
multidirectionnelle/F.
multidisciplinaire/S.

multiethnique/S.
multifactorielle/F.
multifamiliale/W.
multifilaire/S.
multiflore/S.
multifonction/S.
multifonctionnalité/S.







>







52066
52067
52068
52069
52070
52071
52072
52073
52074
52075
52076
52077
52078
52079
52080
multidevise/S.
multidiffusion/S.
multidimensionnalité/S.
multidimensionnelle/F.
multidirectionnalité/S.
multidirectionnelle/F.
multidisciplinaire/S.
multidisciplinarité/S.
multiethnique/S.
multifactorielle/F.
multifamiliale/W.
multifilaire/S.
multiflore/S.
multifonction/S.
multifonctionnalité/S.
54369
54370
54371
54372
54373
54374
54375
54376
54377
54378
54379
54380
54381
54382
54383
54384
oligoasthénotératospermie/S*
oligocène/S*
oligochète/S*
oligoclase/S*
oligodendrocyte/S*
oligodendrogliome/S*
oligoélément/S*
oligoélément/S*
oligo-élément/S*
oligogalacturonate/S*
oligo-galacturonate/S*
oligomère/S*
oligomérique/S*
oligomérisation/S*
oligonucléotide/S*
oligo-nucléotide/S*







<
<







54414
54415
54416
54417
54418
54419
54420


54421
54422
54423
54424
54425
54426
54427
oligoasthénotératospermie/S*
oligocène/S*
oligochète/S*
oligoclase/S*
oligodendrocyte/S*
oligodendrogliome/S*
oligoélément/S*


oligogalacturonate/S*
oligo-galacturonate/S*
oligomère/S*
oligomérique/S*
oligomérisation/S*
oligonucléotide/S*
oligo-nucléotide/S*
57331
57332
57333
57334
57335
57336
57337

57338
57339
57340
57341
57342
57343
57344
perceptiblement
perception/S.
perceptionnisme/S.
perceptionniste/S.
perceptive/F.
perceptrice/F.
perceptuelle/F.

percer/a0p+
percerette/S.
perceuse/F.
percevable/S.
percevoir/pK
perche/S.
percher/a0p+







>







57374
57375
57376
57377
57378
57379
57380
57381
57382
57383
57384
57385
57386
57387
57388
perceptiblement
perception/S.
perceptionnisme/S.
perceptionniste/S.
perceptive/F.
perceptrice/F.
perceptuelle/F.
perceptuellement
percer/a0p+
percerette/S.
perceuse/F.
percevable/S.
percevoir/pK
perche/S.
percher/a0p+
58993
58994
58995
58996
58997
58998
58999

59000
59001
59002
59003
59004
59005
59006
pixellisation/S.
pizza/S.
pizzaïolo/S.
pizzeria/S.
pizzicato/I.
placage/S.
placard/S.

placarder/a0p+
placardisation/S.
placardiser/a0p+
place/S.
placebo/S.
placement/S.
placenta/S.







>







59037
59038
59039
59040
59041
59042
59043
59044
59045
59046
59047
59048
59049
59050
59051
pixellisation/S.
pizza/S.
pizzaïolo/S.
pizzeria/S.
pizzicato/I.
placage/S.
placard/S.
placardage/S.
placarder/a0p+
placardisation/S.
placardiser/a0p+
place/S.
placebo/S.
placement/S.
placenta/S.
59236
59237
59238
59239
59240
59241
59242
59243
59244
59245
59246
59247
59248
59249
59250
59251
plâtrerie/S.
plâtreuse/W.
plâtrière/F.
plats-bords
plausibilité/S.
plausible/S.
plausiblement
play-back
play-boy/S.
playlist/S.
playon/S.
pléban/S.
plèbe/S.
plébéienne/F.
plébiscitaire/S.
plébiscite/S.







|
|







59281
59282
59283
59284
59285
59286
59287
59288
59289
59290
59291
59292
59293
59294
59295
59296
plâtrerie/S.
plâtreuse/W.
plâtrière/F.
plats-bords
plausibilité/S.
plausible/S.
plausiblement
playback/S.
playboy/S.
playlist/S.
playon/S.
pléban/S.
plèbe/S.
plébéienne/F.
plébiscitaire/S.
plébiscite/S.
59379
59380
59381
59382
59383
59384
59385

59386
59387
59388
59389
59390
59391
59392
ployage/S.
ployante/F.
ployer/a0p+
pluche/S.
plucher/a0p.
plucheuse/W.
plugin/S.

pluie/S.
plumage/S.
plumaison/S.
plumard/S.
plumasseau/X.
plumasserie/S.
plumassière/F.







>







59424
59425
59426
59427
59428
59429
59430
59431
59432
59433
59434
59435
59436
59437
59438
ployage/S.
ployante/F.
ployer/a0p+
pluche/S.
plucher/a0p.
plucheuse/W.
plugin/S.
plug-in/S.
pluie/S.
plumage/S.
plumaison/S.
plumard/S.
plumasseau/X.
plumasserie/S.
plumassière/F.
59415
59416
59417
59418
59419
59420
59421
59422
59423
59424
59425
59426
59427
59428
59429
59430
59431
59432
59433
59434
59435
59436
59437
59438
59439
59440
59441
59442
59443
59444
59445
59446
59447
59448
pluriannuelle/F.
pluricellulaire/S.
pluriculturelle/F.
pluridimensionnalité/S.
pluridimensionnelle/F.
pluridisciplinaire/S.
pluridisciplinaire/S.
pluri-disciplinaire/S.
pluridisciplinarité/S.
plurielle/F.
pluriethnique/S.
plurilatérale/W.
plurilingue/S.
plurilinguisme/S.
plurimillénaire/S.
plurimodale/W.
plurinationale/W.
plurinominale/W.
pluripartisme/S.
pluripartite/S.
pluripotence/S.
pluripotente/F.
pluriséculaire/S.
plurisousharmonique/S.
plurispécifique/S.
plurithématique/S.
pluri-thématique/S.
plurithérapie/S.
plurivalente/F.
plurivocité/S.
plurivoque/S.
plus
plus
plusieurs







<


















<







59461
59462
59463
59464
59465
59466
59467

59468
59469
59470
59471
59472
59473
59474
59475
59476
59477
59478
59479
59480
59481
59482
59483
59484
59485

59486
59487
59488
59489
59490
59491
59492
pluriannuelle/F.
pluricellulaire/S.
pluriculturelle/F.
pluridimensionnalité/S.
pluridimensionnelle/F.
pluridisciplinaire/S.
pluridisciplinaire/S.

pluridisciplinarité/S.
plurielle/F.
pluriethnique/S.
plurilatérale/W.
plurilingue/S.
plurilinguisme/S.
plurimillénaire/S.
plurimodale/W.
plurinationale/W.
plurinominale/W.
pluripartisme/S.
pluripartite/S.
pluripotence/S.
pluripotente/F.
pluriséculaire/S.
plurisousharmonique/S.
plurispécifique/S.
plurithématique/S.

plurithérapie/S.
plurivalente/F.
plurivocité/S.
plurivoque/S.
plus
plus
plusieurs
59794
59795
59796
59797
59798
59799
59800

59801
59802
59803
59804
59805
59806
59807
polychète/S.
polychlorobenzène/S.
polychlorure/S.
polychroïque/S.
polychroïsme/S.
polychrome/S.
polychromie/S.

polycistronique/S.
polyclinique/S.
polycondensat/S.
polycondensation/S.
polycopie/S.
polycopier/a0p+
polycourant







>







59838
59839
59840
59841
59842
59843
59844
59845
59846
59847
59848
59849
59850
59851
59852
polychète/S.
polychlorobenzène/S.
polychlorure/S.
polychroïque/S.
polychroïsme/S.
polychrome/S.
polychromie/S.
polychromique/S.
polycistronique/S.
polyclinique/S.
polycondensat/S.
polycondensation/S.
polycopie/S.
polycopier/a0p+
polycourant
60068
60069
60070
60071
60072
60073
60074

60075
60076
60077
60078
60079
60080
60081
pop-corn
pope/S.
popeline/S.
popinée/S.
poplitée/F.
popote/S.
popotin/S.

populace/S.
populacière/F.
populage/S.
populaire/S.
populairement
popularisation/S.
populariser/a0p+







>







60113
60114
60115
60116
60117
60118
60119
60120
60121
60122
60123
60124
60125
60126
60127
pop-corn
pope/S.
popeline/S.
popinée/S.
poplitée/F.
popote/S.
popotin/S.
popstar/S.
populace/S.
populacière/F.
populage/S.
populaire/S.
populairement
popularisation/S.
populariser/a0p+
60466
60467
60468
60469
60470
60471
60472
60473
60474
60475
60476
60477
60478
60479
60480
60481
poulaille/S.
poulailler/S.
poulaine/F.
poulamon/S.
poularde/S.
poulbot/S.
poule/S.
poulet/S.
poulette/S.
pouliage/S.
pouliche/S.
poulie/S.
pouliner/a0p.
poulinière/S.
poulinière/S.
pouliot/S.







<
|







60512
60513
60514
60515
60516
60517
60518

60519
60520
60521
60522
60523
60524
60525
60526
poulaille/S.
poulailler/S.
poulaine/F.
poulamon/S.
poularde/S.
poulbot/S.
poule/S.

poulette/F.
pouliage/S.
pouliche/S.
poulie/S.
pouliner/a0p.
poulinière/S.
poulinière/S.
pouliot/S.
61863
61864
61865
61866
61867
61868
61869

61870
61871
61872
61873
61874
61875
61876
protoplasme/S.
protoplasmique/S.
protoplaste/S.
protoptère/S.
protosulfure/S.
prototypage/S.
prototype/S.

prototypique/S.
prototypiste/S.
protoure/S.
protoxyde/S.
protozoaire/S.
protozoologie/S.
protractile/S.







>







61908
61909
61910
61911
61912
61913
61914
61915
61916
61917
61918
61919
61920
61921
61922
protoplasme/S.
protoplasmique/S.
protoplaste/S.
protoptère/S.
protosulfure/S.
prototypage/S.
prototype/S.
prototyper/a0p+
prototypique/S.
prototypiste/S.
protoure/S.
protoxyde/S.
protozoaire/S.
protozoologie/S.
protractile/S.
61944
61945
61946
61947
61948
61949
61950
61951
61952
61953
61954
61955

61956
61957
61958
61959
61960
61961
61962
pruche/S.
prude/S.
prudemment
prudence/S.
prudente/F.
prudentielle/F.
pruderie/S.
prud'homale/W.
prud'homie/S.
prud'homme/S.
prudhommerie/S.
prudhommesque/S.

pruine/S.
prune
prune/S.
pruneau/X.
prunelaie/S.
prunelée/S.
prunelle/S.







|
<
|


>







61990
61991
61992
61993
61994
61995
61996
61997

61998
61999
62000
62001
62002
62003
62004
62005
62006
62007
62008
pruche/S.
prude/S.
prudemment
prudence/S.
prudente/F.
prudentielle/F.
pruderie/S.
prudhommale/W.

prudhomme/S.
prudhommerie/S.
prudhommesque/S.
prudhommie/S.
pruine/S.
prune
prune/S.
pruneau/X.
prunelaie/S.
prunelée/S.
prunelle/S.
62370
62371
62372
62373
62374
62375
62376

62377
62378
62379
62380
62381
62382
62383
pusillanime/S.
pusillanimement
pusillanimité/S.
pustule/S.
pustuler/a0p+
pustuleuse/W.
putain/S.

putassière/F.
putative/F.
pute/S.
putier/S.
putiet/S.
putois
putréfaction/S.







>







62416
62417
62418
62419
62420
62421
62422
62423
62424
62425
62426
62427
62428
62429
62430
pusillanime/S.
pusillanimement
pusillanimité/S.
pustule/S.
pustuler/a0p+
pustuleuse/W.
putain/S.
putasserie/S.
putassière/F.
putative/F.
pute/S.
putier/S.
putiet/S.
putois
putréfaction/S.
67945
67946
67947
67948
67949
67950
67951

67952
67953
67954
67955
67956
67957
67958
sceau/X.
sceau-de-Salomon
sceaux-de-Salomon
scélérate/F.
scélératement
scélératesse/S.
scellage/S.

scellement/S.
sceller/a0p+
scénarimage/S.
scénario/S.
scénarisation/S.
scénariser/a0p+
scénariste/S.







>







67992
67993
67994
67995
67996
67997
67998
67999
68000
68001
68002
68003
68004
68005
68006
sceau/X.
sceau-de-Salomon
sceaux-de-Salomon
scélérate/F.
scélératement
scélératesse/S.
scellage/S.
scellé/S.
scellement/S.
sceller/a0p+
scénarimage/S.
scénario/S.
scénarisation/S.
scénariser/a0p+
scénariste/S.
68192
68193
68194
68195
68196
68197
68198

68199
68200
68201
68202
68203
68204
68205
scripturale/W.
scripturalisme/S.
scrofulaire/S.
scrofulariacée/S.
scrofule/S.
scrofuleuse/W.
scrogneugneu/X.

scrolling/S.
scrotale/W.
scrotum/S.
scrub/S.
scrubber/S.
scrupule/S.
scrupuleuse/W.







>







68240
68241
68242
68243
68244
68245
68246
68247
68248
68249
68250
68251
68252
68253
68254
scripturale/W.
scripturalisme/S.
scrofulaire/S.
scrofulariacée/S.
scrofule/S.
scrofuleuse/W.
scrogneugneu/X.
scroller/a0p.
scrolling/S.
scrotale/W.
scrotum/S.
scrub/S.
scrubber/S.
scrupule/S.
scrupuleuse/W.
70723
70724
70725
70726
70727
70728
70729
70730
70731
70732
70733
70734
70735
70736
70737
stariser/a0p+
starlette/S.
staroste/S.
star-system/S.
starter/S.
starting-block/S.
starting-gate/S.
start-up/S.
stase/S.
stater/a0p+
statère/S.
stathouder/S.
stathoudérat/S.
statice/S.
statif/S.







|







70772
70773
70774
70775
70776
70777
70778
70779
70780
70781
70782
70783
70784
70785
70786
stariser/a0p+
starlette/S.
staroste/S.
star-system/S.
starter/S.
starting-block/S.
starting-gate/S.
startup/S.
stase/S.
stater/a0p+
statère/S.
stathouder/S.
stathoudérat/S.
statice/S.
statif/S.
72382
72383
72384
72385
72386
72387
72388

72389
72390
72391
72392
72393
72394
72395
syrah/S.
syriaque/S.
syriaque/S.
syrienne/F.
syringe/S.
syringomyélie/S.
syrinx

syrphe/S.
sysadmin/S.
systématicienne/F.
systématicité/S.
systématique/S.
systématique/S.
systématiquement







>







72431
72432
72433
72434
72435
72436
72437
72438
72439
72440
72441
72442
72443
72444
72445
syrah/S.
syriaque/S.
syriaque/S.
syrienne/F.
syringe/S.
syringomyélie/S.
syrinx
syro-libanaise/F.
syrphe/S.
sysadmin/S.
systématicienne/F.
systématicité/S.
systématique/S.
systématique/S.
systématiquement
72531
72532
72533
72534
72535
72536
72537
72538
72539
72540
72541
72542
72543
72544
72545
72546
tagine/S.
tagliatelle/S.
tagme/S.
taguer/a0p+
tagueuse/F.
tahitienne/F.
taïaut
taï-chi
taï-chi-chuan
taie/S.
taïga/S.
taiji/S.
taijiquan/S.
taïkonaute/S.
taillable/S.
taillade/S.







|
|







72581
72582
72583
72584
72585
72586
72587
72588
72589
72590
72591
72592
72593
72594
72595
72596
tagine/S.
tagliatelle/S.
tagme/S.
taguer/a0p+
tagueuse/F.
tahitienne/F.
taïaut
taïchi/S.
taïchichuan/S.
taie/S.
taïga/S.
taiji/S.
taijiquan/S.
taïkonaute/S.
taillable/S.
taillade/S.
72576
72577
72578
72579
72580
72581
72582

72583
72584
72585
72586
72587
72588
72589
taleb/S.
talent/S.
talentueuse/W.
talentueusement
taler/a0p+
taleth/S.
talibane/F.

talion/S.
talisman/S.
talismanique/S.
talith/S.
talitre/S.
talkies-walkies
talkie-walkie







>







72626
72627
72628
72629
72630
72631
72632
72633
72634
72635
72636
72637
72638
72639
72640
taleb/S.
talent/S.
talentueuse/W.
talentueusement
taler/a0p+
taleth/S.
talibane/F.
talibée/F.
talion/S.
talisman/S.
talismanique/S.
talith/S.
talitre/S.
talkies-walkies
talkie-walkie
75113
75114
75115
75116
75117
75118
75119

75120
75121
75122
75123
75124
75125
75126
trantran/S.
trapèze/S.
trapéziste/S.
trapézoèdre/S.
trapézoïdale/W.
trapézoïde/S.
trappe/S.

trappeuse/F.
trappillon/S.
trappiste/S.
trappistine/S.
trapue/F.
traque/S.
traquée/F.







>







75164
75165
75166
75167
75168
75169
75170
75171
75172
75173
75174
75175
75176
75177
75178
trantran/S.
trapèze/S.
trapéziste/S.
trapézoèdre/S.
trapézoïdale/W.
trapézoïde/S.
trappe/S.
trapper/a0p+
trappeuse/F.
trappillon/S.
trappiste/S.
trappistine/S.
trapue/F.
traque/S.
traquée/F.
76217
76218
76219
76220
76221
76222
76223
76224
76225
76226
76227
76228
76229
76230
76231
ultimement/D'Q'
ultimité/S*
ultimo
ultra/S*
ultrabasique/S*
ultracentrifugation/S*
ultracentrifugeuse/S*
ultra-chic/S*
ultracolonialisme/S*
ultracolonialiste/S*
ultraconfidentielle/F*
ultraconservatrice/F*
ultracourte/F*
ultradienne/F*
ultradroite/S*







|







76269
76270
76271
76272
76273
76274
76275
76276
76277
76278
76279
76280
76281
76282
76283
ultimement/D'Q'
ultimité/S*
ultimo
ultra/S*
ultrabasique/S*
ultracentrifugation/S*
ultracentrifugeuse/S*
ultrachic/S*
ultracolonialisme/S*
ultracolonialiste/S*
ultraconfidentielle/F*
ultraconservatrice/F*
ultracourte/F*
ultradienne/F*
ultradroite/S*
77429
77430
77431
77432
77433
77434
77435

77436
77437
77438
77439
77440
77441
77442
vibrato/S.
vibratoire/S.
vibrer/a0p+
vibreur/S.
vibrion/S.
vibrionner/a0p.
vibrisse/S.

vibromasseur/S.
vicaire/S.
vicariale/W.
vicariance/S.
vicariante/F.
vicariat/S.
vice/S.







>







77481
77482
77483
77484
77485
77486
77487
77488
77489
77490
77491
77492
77493
77494
77495
vibrato/S.
vibratoire/S.
vibrer/a0p+
vibreur/S.
vibrion/S.
vibrionner/a0p.
vibrisse/S.
vibro/S.
vibromasseur/S.
vicaire/S.
vicariale/W.
vicariance/S.
vicariante/F.
vicariat/S.
vice/S.

Modified gc_lang/fr/xpi/data/dictionaries/fr-FR-reform/fr-FR-reform.aff from [f5624fc7bf] to [c48aa6e466].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# AFFIXES DU DICTIONNAIRE ORTHOGRAPHIQUE FRANÇAIS “RÉFORME 1990” v6.1
# par Olivier R. -- licence MPL 2.0
# Généré le 03-06-2017 à 22:26
# Pour améliorer le dictionnaire, allez sur http://www.dicollecte.org/



SET UTF-8

WORDCHARS -’'1234567890.




|

|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# AFFIXES DU DICTIONNAIRE ORTHOGRAPHIQUE FRANÇAIS “RÉFORME 1990” v6.2
# par Olivier R. -- licence MPL 2.0
# Généré le 26-07-2017 à 09:33
# Pour améliorer le dictionnaire, allez sur http://www.dicollecte.org/



SET UTF-8

WORDCHARS -’'1234567890.

Modified gc_lang/fr/xpi/data/dictionaries/fr-FR-reform/fr-FR-reform.dic from [5191f244cd] to [1c3d8999ad].

1
2
3
4
5
6
7
8
78701
&
1er/--
1ers/--
1re/--
1res/--
1ʳᵉ/--
1ʳᵉˢ/--
|







1
2
3
4
5
6
7
8
78754
&
1er/--
1ers/--
1re/--
1res/--
1ʳᵉ/--
1ʳᵉˢ/--
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
Aïcha/L'D'Q'
Aïd/L'D'Q'
Aida/L'D'Q'
Aidan/L'D'Q'
Aïd-el-Adha/L'
Aïd-el-Kébir/L'
Aiden/L'D'Q'
Aignan
Aigoual/L'D'
Aigrain/L'D'Q'
Aimé/L'D'Q'
Aimée/L'D'Q'
Ain/L'
Airaines/L'D'Q'
Airbnb/L'D'Q'







|







187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
Aïcha/L'D'Q'
Aïd/L'D'Q'
Aida/L'D'Q'
Aidan/L'D'Q'
Aïd-el-Adha/L'
Aïd-el-Kébir/L'
Aiden/L'D'Q'
Aignan/L'D'Q'
Aigoual/L'D'
Aigrain/L'D'Q'
Aimé/L'D'Q'
Aimée/L'D'Q'
Ain/L'
Airaines/L'D'Q'
Airbnb/L'D'Q'
529
530
531
532
533
534
535

536
537
538
539
540
541
542
Arion/L'D'Q'
Aristarque/L'D'Q'
Aristide/L'D'Q'
Aristophane/L'D'Q'
Aristote/L'D'Q'
Arizona/L'D'
Arjuna/L'D'Q'

Arkansas/L'D'
Arkema/L'D'Q'
Arkham/L'D'Q'
Arkhangelsk/L'D'Q'
Arlene/L'D'Q'
Arlène/L'D'Q'
Arles/L'D'Q'







>







529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
Arion/L'D'Q'
Aristarque/L'D'Q'
Aristide/L'D'Q'
Aristophane/L'D'Q'
Aristote/L'D'Q'
Arizona/L'D'
Arjuna/L'D'Q'
Arkady/L'D'Q'
Arkansas/L'D'
Arkema/L'D'Q'
Arkham/L'D'Q'
Arkhangelsk/L'D'Q'
Arlene/L'D'Q'
Arlène/L'D'Q'
Arles/L'D'Q'
651
652
653
654
655
656
657

658
659
660
661
662
663
664
Aurélien/L'D'Q'
Aurelio/L'D'Q'
Auriane/L'D'Q'
Aurillac/L'D'Q'
Auriol/L'D'Q'
Aurore/L'D'Q'
Auschwitz/L'D'Q'

Austerlitz/L'D'Q'
Austin/L'D'Q'
Australasie/L'D'Q'
Australie/L'D'
Australie-Méridionale/L'D'
Australie-Occidentale/L'D'
Austrasie/L'D'







>







652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
Aurélien/L'D'Q'
Aurelio/L'D'Q'
Auriane/L'D'Q'
Aurillac/L'D'Q'
Auriol/L'D'Q'
Aurore/L'D'Q'
Auschwitz/L'D'Q'
Austen/L'D'Q'
Austerlitz/L'D'Q'
Austin/L'D'Q'
Australasie/L'D'Q'
Australie/L'D'
Australie-Méridionale/L'D'
Australie-Occidentale/L'D'
Austrasie/L'D'
896
897
898
899
900
901
902

903
904
905
906
907
908
909
Benoîte
Benozillo
Benpro
Bentama
Bentham
Bentley
Benveniste

Berchem-Sainte-Agathe
Berck
Bercy
Bérenger
Bérengère
Bérénice
Bérézina







>







898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
Benoîte
Benozillo
Benpro
Bentama
Bentham
Bentley
Benveniste
Bérangère
Berchem-Sainte-Agathe
Berck
Bercy
Bérenger
Bérengère
Bérénice
Bérézina
1330
1331
1332
1333
1334
1335
1336

1337
1338
1339
1340
1341
1342
1343
Caine
Caïphe
Caire
Caitlin
Caitlyn
Calabre
Calais

Calc
Calcutta
Calderón
Caleb
Calédonie
Calestienne
Calgary







>







1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
Caine
Caïphe
Caire
Caitlin
Caitlyn
Calabre
Calais
Calaisis
Calc
Calcutta
Calderón
Caleb
Calédonie
Calestienne
Calgary
1646
1647
1648
1649
1650
1651
1652

1653
1654
1655
1656
1657
1658
1659
Chostakovitch
Chris
Christa
Christel
Christèle
Christelle
Christian

Christiane
Christie
Christina
Christine
Christmas
Christoffel
Christoph







>







1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
Chostakovitch
Chris
Christa
Christel
Christèle
Christelle
Christian
Christiana
Christiane
Christie
Christina
Christine
Christmas
Christoffel
Christoph
1674
1675
1676
1677
1678
1679
1680

1681
1682
1683
1684
1685
1686
1687
Cincinnati
Cindy
Ciney
Ciotat
Circassie
Circé
Cirey-sur-Vezouze

Cisjordanie
Cîteaux
Citroën
City
Claire
Clamart
Clara







>







1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
Cincinnati
Cindy
Ciney
Ciotat
Circassie
Circé
Cirey-sur-Vezouze
Cisco
Cisjordanie
Cîteaux
Citroën
City
Claire
Clamart
Clara
2486
2487
2488
2489
2490
2491
2492

2493
2494
2495
2496
2497
2498
2499
Eure-et-Loir/L'D'
Euripide/L'D'Q'
Eurobaromètre/S*
Eurogroupe/L'
Euronext/L'D'Q'
Europe/L'D'
Europol/D'Q'

Eurozone/L'
Eurydice/L'D'Q'
Eusèbe/L'D'Q'
Euterpe/L'D'Q'
Eva/L'D'Q'
Éva/L'D'Q'
Évaine/L'D'Q'







>







2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
Eure-et-Loir/L'D'
Euripide/L'D'Q'
Eurobaromètre/S*
Eurogroupe/L'
Euronext/L'D'Q'
Europe/L'D'
Europol/D'Q'
Eurotunnel/L'D'Q'
Eurozone/L'
Eurydice/L'D'Q'
Eusèbe/L'D'Q'
Euterpe/L'D'Q'
Eva/L'D'Q'
Éva/L'D'Q'
Évaine/L'D'Q'
2596
2597
2598
2599
2600
2601
2602

2603
2604
2605
2606
2607
2608
2609
Fayard
Fayçal
Fayette
Fécamp
Fed
FedEx
Federer

Federico
Fehling
Feist
Feïza
Feldane
Felicia
Félicie







>







2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
Fayard
Fayçal
Fayette
Fécamp
Fed
FedEx
Federer
Federica
Federico
Fehling
Feist
Feïza
Feldane
Felicia
Félicie
3217
3218
3219
3220
3221
3222
3223

3224
3225
3226
3227
3228
3229
3230
Halluin/L'D'Q'
Ham/L'D'Q'
Hamas
Hambourg
Hamel
Hamid/L'D'Q'
Hamilton

Hamme
HammerFall
Hammourabi
Hamont-Achel/L'D'Q'
Hampshire
Ham-sur-Heure-Nalinnes/L'D'Q'
Hamza/L'D'Q'







>







3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
Halluin/L'D'Q'
Ham/L'D'Q'
Hamas
Hambourg
Hamel
Hamid/L'D'Q'
Hamilton
Hamlet/L'D'Q'
Hamme
HammerFall
Hammourabi
Hamont-Achel/L'D'Q'
Hampshire
Ham-sur-Heure-Nalinnes/L'D'Q'
Hamza/L'D'Q'
3461
3462
3463
3464
3465
3466
3467

3468
3469
3470
3471
3472
3473
3474
Howard
Hubble
Hubei
Hubert/L'D'Q'
Hubscher
Hudson/L'D'Q'
Huelgoat

Hugo/L'D'Q'
Hugo/L'D'Q'
Hugues/L'D'Q'
Huguette
Hulshout/L'D'Q'
Hume
Hun/S.







>







3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
Howard
Hubble
Hubei
Hubert/L'D'Q'
Hubscher
Hudson/L'D'Q'
Huelgoat
Hugh/L'D'Q'
Hugo/L'D'Q'
Hugo/L'D'Q'
Hugues/L'D'Q'
Huguette
Hulshout/L'D'Q'
Hume
Hun/S.
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
IMSI/L'D'Q'
INED/L'D'Q'
INPI/L'D'Q'
INRA/L'D'Q'
INRI/L'D'Q'
INRIA/L'D'Q'
INSA/L'D'Q'
INSERM/L'D'Q'
IP/L'D'Q'
IRA/L'
IRD/L'D'Q'
IRFM/L'D'Q'
IRL
IRM/L'D'Q'
IRSTEA/L'D'Q'







<







3525
3526
3527
3528
3529
3530
3531

3532
3533
3534
3535
3536
3537
3538
IMSI/L'D'Q'
INED/L'D'Q'
INPI/L'D'Q'
INRA/L'D'Q'
INRI/L'D'Q'
INRIA/L'D'Q'
INSA/L'D'Q'

IP/L'D'Q'
IRA/L'
IRD/L'D'Q'
IRFM/L'D'Q'
IRL
IRM/L'D'Q'
IRSTEA/L'D'Q'
3594
3595
3596
3597
3598
3599
3600

3601
3602
3603
3604
3605
3606
3607
Ingrid/L'D'Q'
Inkscape/L'D'Q'
Inn/L'D'
Inna/L'D'Q'
Innsmouth/L'D'Q'
Inovia/L'D'Q'
Insee/L'D'Q'

Insulinde/L'D'
Intel/L'D'Q'
Internet/D'Q'
Interpol/D'Q'
Io/L'D'Q'
Ionesco/L'D'Q'
Ioulia/L'D'Q'







>







3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
Ingrid/L'D'Q'
Inkscape/L'D'Q'
Inn/L'D'
Inna/L'D'Q'
Innsmouth/L'D'Q'
Inovia/L'D'Q'
Insee/L'D'Q'
Inserm/L'D'Q'
Insulinde/L'D'
Intel/L'D'Q'
Internet/D'Q'
Interpol/D'Q'
Io/L'D'Q'
Ionesco/L'D'Q'
Ioulia/L'D'Q'
4294
4295
4296
4297
4298
4299
4300

4301
4302
4303
4304
4305
4306
4307
Léonore
Léontine
Léopold
Léopoldine
Leopoldt
Léopoldville
Leroy

Lesbos
Lesieur
Lesley
Leslie
Lesneven
Lesotho
Lesse







>







4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
Léonore
Léontine
Léopold
Léopoldine
Leopoldt
Léopoldville
Leroy
Lesage
Lesbos
Lesieur
Lesley
Leslie
Lesneven
Lesotho
Lesse
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
Noisy-le-Grand
Noisy-le-Sec
Nokia
Nolan
Nolwenn
Nora
Norbert
Nord
Nord-Kivu
Nord-Pas-de-Calais
Nord-du-Québec
Nordine
Norfolk
Norique
Norma







<







5482
5483
5484
5485
5486
5487
5488

5489
5490
5491
5492
5493
5494
5495
Noisy-le-Grand
Noisy-le-Sec
Nokia
Nolan
Nolwenn
Nora
Norbert

Nord-Kivu
Nord-Pas-de-Calais
Nord-du-Québec
Nordine
Norfolk
Norique
Norma
6206
6207
6208
6209
6210
6211
6212

6213
6214
6215
6216
6217
6218
6219
Reidemeister
Reiko
Reims
Reiten
Relecq-Kerhuon
Rellich
Rembrandt

Rémi
Remich
Remire-Montjoly
Remus
Rémy
Renaix
Renan







>







6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
Reidemeister
Reiko
Reims
Reiten
Relecq-Kerhuon
Rellich
Rembrandt
Remi
Rémi
Remich
Remire-Montjoly
Remus
Rémy
Renaix
Renan
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
Rosita
Rosny-sous-Bois
Ross
Rossini
Rossinière
Rostand
Roswell
Roth
Roth
Rothbard
Rothschild
Rotin
Rotselaar
Rotterdam
Roubaix







<







6387
6388
6389
6390
6391
6392
6393

6394
6395
6396
6397
6398
6399
6400
Rosita
Rosny-sous-Bois
Ross
Rossini
Rossinière
Rostand
Roswell

Roth
Rothbard
Rothschild
Rotin
Rotselaar
Rotterdam
Roubaix
9051
9052
9053
9054
9055
9056
9057
9058
9059
9060
9061
9062

9063
9064
9065
9066
9067
9068
9069
additionnelle/F*
additionnellement/D'Q'
additionner/a4p+
additionneuse/F*
additive/F*
additivement/D'Q'
additivité/S*
addon/S*
adducteur/S*
adduction/S*
adduit/S*
adèle/S*

adelphophagie/S*
adénine/S*
adénite/S*
adénocarcinome/S*
adénogramme/S*
adénoïde/S*
adénoïdectomie/S*







|




>







9061
9062
9063
9064
9065
9066
9067
9068
9069
9070
9071
9072
9073
9074
9075
9076
9077
9078
9079
9080
additionnelle/F*
additionnellement/D'Q'
additionner/a4p+
additionneuse/F*
additive/F*
additivement/D'Q'
additivité/S*
add-on/S*
adducteur/S*
adduction/S*
adduit/S*
adèle/S*
adelphe/S*
adelphophagie/S*
adénine/S*
adénite/S*
adénocarcinome/S*
adénogramme/S*
adénoïde/S*
adénoïdectomie/S*
9723
9724
9725
9726
9727
9728
9729

9730
9731
9732
9733
9734
9735
9736
agripper/a4p+
agritourisme/S*
agroalimentaire/S*
agroalimentaire/S*
agrobiologie/S*
agrobiologique/S*
agrobiologiste/S*

agrocarburant/S*
agro-carburant/S*
agrochimie/S*
agrochimique/S*
agrochimiste/S*
agroclimatique/S*
agro-climatique/S*







>







9734
9735
9736
9737
9738
9739
9740
9741
9742
9743
9744
9745
9746
9747
9748
agripper/a4p+
agritourisme/S*
agroalimentaire/S*
agroalimentaire/S*
agrobiologie/S*
agrobiologique/S*
agrobiologiste/S*
agrobusiness/L'D'Q'
agrocarburant/S*
agro-carburant/S*
agrochimie/S*
agrochimique/S*
agrochimiste/S*
agroclimatique/S*
agro-climatique/S*
9864
9865
9866
9867
9868
9869
9870

9871
9872
9873
9874
9875
9876
9877
aillade/S*
ailler/a2p+
ailleurs/L'D'Q'
ailloli/S*
aimable/S*
aimablement/D'Q'
aimant/S*

aimantation/S*
aimante/F*
aimanter/a4p+
aimantin/S*
aimantine/F*
aimée/F*
aimer/a4p+







>







9876
9877
9878
9879
9880
9881
9882
9883
9884
9885
9886
9887
9888
9889
9890
aillade/S*
ailler/a2p+
ailleurs/L'D'Q'
ailloli/S*
aimable/S*
aimablement/D'Q'
aimant/S*
aimantable/S*
aimantation/S*
aimante/F*
aimanter/a4p+
aimantin/S*
aimantine/F*
aimée/F*
aimer/a4p+
10500
10501
10502
10503
10504
10505
10506
10507
10508
10509
10510
10511
10512
10513
10514
amathie/S*
amatir/f2p+
amatrice/F*
amaurose/S*
amazone/S*
amazonienne/F*
amazonite/S*
ambages/D'Q'
ambassade/S*
ambassadrice/F*
ambiance/S*
ambiancer/a1p.
ambianceuse/F*
ambiante/F*
ambidextre/S*







|







10513
10514
10515
10516
10517
10518
10519
10520
10521
10522
10523
10524
10525
10526
10527
amathie/S*
amatir/f2p+
amatrice/F*
amaurose/S*
amazone/S*
amazonienne/F*
amazonite/S*
ambage/S*
ambassade/S*
ambassadrice/F*
ambiance/S*
ambiancer/a1p.
ambianceuse/F*
ambiante/F*
ambidextre/S*
11343
11344
11345
11346
11347
11348
11349

11350
11351
11352
11353
11354
11355
11356
annuité/S*
annulabilité/S*
annulable/S*
annulaire/S*
annulation/S*
annulative/F*
annulatrice/F*

annuler/a4p+
annuus
anoblir/f4p+
anoblissante/F*
anoblissement/S*
anode/S*
anodine/F*







>







11356
11357
11358
11359
11360
11361
11362
11363
11364
11365
11366
11367
11368
11369
11370
annuité/S*
annulabilité/S*
annulable/S*
annulaire/S*
annulation/S*
annulative/F*
annulatrice/F*
annulement/S*
annuler/a4p+
annuus
anoblir/f4p+
anoblissante/F*
anoblissement/S*
anode/S*
anodine/F*
11660
11661
11662
11663
11664
11665
11666


11667
11668
11669
11670
11671
11672
11673
antienne/S*
antienzyme/S*
antiépileptique/S*
antiesclavagiste/S*
antiestrogène/S*
antiestrogène/S*
antiétatique/S*


antifading/S*
antifascisme/S*
antifasciste/S*
antiféminisme/S*
antiféministe/S*
antiferment/S*
antiferroélectricité/S*







>
>







11674
11675
11676
11677
11678
11679
11680
11681
11682
11683
11684
11685
11686
11687
11688
11689
antienne/S*
antienzyme/S*
antiépileptique/S*
antiesclavagiste/S*
antiestrogène/S*
antiestrogène/S*
antiétatique/S*
antiétatisme/S*
antifa/S*
antifading/S*
antifascisme/S*
antifasciste/S*
antiféminisme/S*
antiféministe/S*
antiferment/S*
antiferroélectricité/S*
12464
12465
12466
12467
12468
12469
12470

12471
12472
12473
12474
12475
12476
12477
arc/S*
arcade/S*
arcane/S*
arcanson/S*
arcasse/S*
arcature/S*
arcboutant/S*

arcbouter/a4p+
arccos
arccosh
arccotan
arccotanh
arcdoubleau/X*
arceau/X*







>







12480
12481
12482
12483
12484
12485
12486
12487
12488
12489
12490
12491
12492
12493
12494
arc/S*
arcade/S*
arcane/S*
arcanson/S*
arcasse/S*
arcature/S*
arcboutant/S*
arc-boutement
arcbouter/a4p+
arccos
arccosh
arccotan
arccotanh
arcdoubleau/X*
arceau/X*
12560
12561
12562
12563
12564
12565
12566

12567
12568
12569
12570
12571
12572
12573
archivolte/S*
archontat/S*
archonte/S*
archosaurien/S*
archure/S*
arçon/S*
arçonner/a2p+

arcs-en-ciel/D'Q'
arcsin
arcsinh
arctan
arctanh
arctique/S*
arcure/S*







>







12577
12578
12579
12580
12581
12582
12583
12584
12585
12586
12587
12588
12589
12590
12591
archivolte/S*
archontat/S*
archonte/S*
archosaurien/S*
archure/S*
arçon/S*
arçonner/a2p+
arcs-boutements
arcs-en-ciel/D'Q'
arcsin
arcsinh
arctan
arctanh
arctique/S*
arcure/S*
15450
15451
15452
15453
15454
15455
15456

15457
15458
15459
15460
15461
15462
15463
bernard-l'ermite
berne/S.
berner/a0p+
berneuse/F.
bernicle/S.
bernique
bernique/S.

berrichonne/F.
bersaglier/S.
berthon/S.
bertillonnage/S.
béryl/S.
bérylliose/S.
béryllium/S.







>







15468
15469
15470
15471
15472
15473
15474
15475
15476
15477
15478
15479
15480
15481
15482
bernard-l'ermite
berne/S.
berner/a0p+
berneuse/F.
bernicle/S.
bernique
bernique/S.
bernoise/F.
berrichonne/F.
bersaglier/S.
berthon/S.
bertillonnage/S.
béryl/S.
bérylliose/S.
béryllium/S.
17699
17700
17701
17702
17703
17704
17705

17706
17707
17708
17709
17710
17711
17712
bugne/S.
bugrane/S.
buguée/F.
build/S.
building/S.
buire/S.
buis

buisson/S.
buisson-ardent
buissonnante/F.
buissonnet/S.
buissonneuse/W.
buissonnière/F.
buissons-ardents







>







17718
17719
17720
17721
17722
17723
17724
17725
17726
17727
17728
17729
17730
17731
17732
bugne/S.
bugrane/S.
buguée/F.
build/S.
building/S.
buire/S.
buis
buissaie/S.
buisson/S.
buisson-ardent
buissonnante/F.
buissonnet/S.
buissonneuse/W.
buissonnière/F.
buissons-ardents
18040
18041
18042
18043
18044
18045
18046

18047
18048
18049
18050
18051
18052
18053
cadrer/a0p+
cadreuse/F.
cadriciel/S.
caduc/S.
caducée/S.
caducifoliée/F.
caducité/S.

caduque/S.
cæcale/W.
cæcotrophie/S.
cæcum/S.
caennaise/F.
cænogenèse/S.
cæsine







>







18060
18061
18062
18063
18064
18065
18066
18067
18068
18069
18070
18071
18072
18073
18074
cadrer/a0p+
cadreuse/F.
cadriciel/S.
caduc/S.
caducée/S.
caducifoliée/F.
caducité/S.
caduque/F.
caduque/S.
cæcale/W.
cæcotrophie/S.
cæcum/S.
caennaise/F.
cænogenèse/S.
cæsine
18439
18440
18441
18442
18443
18444
18445

18446
18447
18448
18449
18450
18451
18452
camping-caravaning/S.
camping-gaz
campinoise/F.
campo/S.
campus
camuse/F.
canada/S.

canadianisme/S.
canadienne/F.
canado-américaine/F.
canaille/S.
canaillement
canaillerie/S.
canaillocratie/S.







>







18460
18461
18462
18463
18464
18465
18466
18467
18468
18469
18470
18471
18472
18473
18474
camping-caravaning/S.
camping-gaz
campinoise/F.
campo/S.
campus
camuse/F.
canada/S.
canadair/S.
canadianisme/S.
canadienne/F.
canado-américaine/F.
canaille/S.
canaillement
canaillerie/S.
canaillocratie/S.
19418
19419
19420
19421
19422
19423
19424

19425
19426
19427
19428
19429
19430
19431
caucasique/S.
cauchemar/S.
cauchemarder/a0p.
cauchemardesque/S.
cauchemardeuse/W.
caucus
caudale/W.

caudataire/S.
caudataire/S.
caudillo/S.
caudine/S.
caudrette/S.
caulescente/F.
caulicole/S.







>







19440
19441
19442
19443
19444
19445
19446
19447
19448
19449
19450
19451
19452
19453
19454
caucasique/S.
cauchemar/S.
cauchemarder/a0p.
cauchemardesque/S.
cauchemardeuse/W.
caucus
caudale/W.
caudalie/S.
caudataire/S.
caudataire/S.
caudillo/S.
caudine/S.
caudrette/S.
caulescente/F.
caulicole/S.
24015
24016
24017
24018
24019
24020
24021

24022
24023
24024
24025
24026
24027
24028
corruptrice/F.
corsage/S.
corsaire/S.
corse/S.
corselet/S.
corser/a0p+
corset/S.

corseter/b0p+
corseterie/S.
corsetière/F.
corso/S.
cortège/S.
cortès
cortex







>







24038
24039
24040
24041
24042
24043
24044
24045
24046
24047
24048
24049
24050
24051
24052
corruptrice/F.
corsage/S.
corsaire/S.
corse/S.
corselet/S.
corser/a0p+
corset/S.
corsetage/S.
corseter/b0p+
corseterie/S.
corsetière/F.
corso/S.
cortège/S.
cortès
cortex
25520
25521
25522
25523
25524
25525
25526

25527
25528
25529
25530
25531
25532
25533
cytotoxicité/S.
cytotoxique/S.
czardas
czimbalum/S.
d
d/||--
dB/||--

dacryoadénite/S.
dacryocystite/S.
dactyle/S.
dactylique/S.
dactylo/S.
dactylogramme/S.
dactylographe/S.







>







25544
25545
25546
25547
25548
25549
25550
25551
25552
25553
25554
25555
25556
25557
25558
cytotoxicité/S.
cytotoxique/S.
czardas
czimbalum/S.
d
d/||--
dB/||--
daba/S.
dacryoadénite/S.
dacryocystite/S.
dactyle/S.
dactylique/S.
dactylo/S.
dactylogramme/S.
dactylographe/S.
27305
27306
27307
27308
27309
27310
27311

27312
27313
27314
27315
27316
27317
27318
dénombrabilité/S.
dénombrable/S.
dénombrement/S.
dénombrer/a0p+
dénominateur/S.
dénomination/S.
dénominative/F.

dénommer/a0p+
dénoncer/a0p+
dénonciation/S.
dénonciatrice/F.
dénotation/S.
dénotationnelle/F.
dénotative/F.







>







27330
27331
27332
27333
27334
27335
27336
27337
27338
27339
27340
27341
27342
27343
27344
dénombrabilité/S.
dénombrable/S.
dénombrement/S.
dénombrer/a0p+
dénominateur/S.
dénomination/S.
dénominative/F.
dénommable/S.
dénommer/a0p+
dénoncer/a0p+
dénonciation/S.
dénonciatrice/F.
dénotation/S.
dénotationnelle/F.
dénotative/F.
28103
28104
28105
28106
28107
28108
28109

28110
28111
28112
28113
28114
28115
28116
désincorporer/a0p+
désincrustation/S.
désincruster/a0p+
désinculper/a0p+
désindenter/a0p+
désindexation/S.
désindexer/a0p+

désindustrialisation/S.
désindustrialiser/a0p+
désinence/S.
désinentielle/F.
désinfectante/F.
désinfecter/a0p+
désinfection/S.







>







28129
28130
28131
28132
28133
28134
28135
28136
28137
28138
28139
28140
28141
28142
28143
désincorporer/a0p+
désincrustation/S.
désincruster/a0p+
désinculper/a0p+
désindenter/a0p+
désindexation/S.
désindexer/a0p+
désindividualiser/a0p+
désindustrialisation/S.
désindustrialiser/a0p+
désinence/S.
désinentielle/F.
désinfectante/F.
désinfecter/a0p+
désinfection/S.
28152
28153
28154
28155
28156
28157
28158

28159
28160
28161
28162
28163
28164
28165
désinviter/a0p+
désinvolte/S.
désinvoltement
désinvolture/S.
désir/S.
désirabilité/S.
désirable/S.

désirer/a0p+
désireuse/W.
désistement/S.
désister/a0p+
desman/S.
desmine/S.
desmodonte/S.







>







28179
28180
28181
28182
28183
28184
28185
28186
28187
28188
28189
28190
28191
28192
28193
désinviter/a0p+
désinvolte/S.
désinvoltement
désinvolture/S.
désir/S.
désirabilité/S.
désirable/S.
désirante/F.
désirer/a0p+
désireuse/W.
désistement/S.
désister/a0p+
desman/S.
desmine/S.
desmodonte/S.
28781
28782
28783
28784
28785
28786
28787

28788
28789
28790
28791
28792
28793
28794
diarrhée/S.
diarrhéique/S.
diarthrose/S.
diascope/S.
diascopie/S.
diascordium/S.
diaspora/S.

diastase/S.
diastasique/S.
diastème/S.
diastéréo-isomère/S.
diastole/S.
diastolique/S.
diastratique/S.







>







28809
28810
28811
28812
28813
28814
28815
28816
28817
28818
28819
28820
28821
28822
28823
diarrhée/S.
diarrhéique/S.
diarthrose/S.
diascope/S.
diascopie/S.
diascordium/S.
diaspora/S.
diasporique/S.
diastase/S.
diastasique/S.
diastème/S.
diastéréo-isomère/S.
diastole/S.
diastolique/S.
diastratique/S.
29497
29498
29499
29500
29501
29502
29503

29504
29505
29506
29507
29508
29509
29510
diversement
diverses
diversifiable/S.
diversification/S.
diversifier/a0p+
diversiforme/S.
diversion/S.

diversité/S.
diverticule/S.
diverticulite/S.
diverticulose/S.
divertimento/S.
divertir/f0p+
divertissante/F.







>







29526
29527
29528
29529
29530
29531
29532
29533
29534
29535
29536
29537
29538
29539
29540
diversement
diverses
diversifiable/S.
diversification/S.
diversifier/a0p+
diversiforme/S.
diversion/S.
diversitaire/S.
diversité/S.
diverticule/S.
diverticulite/S.
diverticulose/S.
divertimento/S.
divertir/f0p+
divertissante/F.
30612
30613
30614
30615
30616
30617
30618
30619
30620
30621
30622
30623
30624
30625
30626
écocertifiée/F*
écocide/S*
écocitoyenne/F*
écocitoyenneté/S*
écoconception/S*
écoconduite/S*
écoconstruction/S*
éco-construction/S*
écoemballage/S*
éco-environnementale/F*
écœurante/F*
écœurement/S*
écœurer/a2p+
écogeste/S*
écohabitat/S*







<







30642
30643
30644
30645
30646
30647
30648

30649
30650
30651
30652
30653
30654
30655
écocertifiée/F*
écocide/S*
écocitoyenne/F*
écocitoyenneté/S*
écoconception/S*
écoconduite/S*
écoconstruction/S*

écoemballage/S*
éco-environnementale/F*
écœurante/F*
écœurement/S*
écœurer/a2p+
écogeste/S*
écohabitat/S*
32074
32075
32076
32077
32078
32079
32080

32081
32082
32083
32084
32085
32086
32087
endoénergétique/S*
endogame/S*
endogamie/S*
endogamique/S*
endogée/F*
endogène/S*
endogénéité/S*

endolocalisation/S*
endolorir/f2p+
endolorissement/S*
endolymphe/S*
endomètre/S*
endométriose/S*
endométrite/S*







>







32103
32104
32105
32106
32107
32108
32109
32110
32111
32112
32113
32114
32115
32116
32117
endoénergétique/S*
endogame/S*
endogamie/S*
endogamique/S*
endogée/F*
endogène/S*
endogénéité/S*
endogroupe/S*
endolocalisation/S*
endolorir/f2p+
endolorissement/S*
endolymphe/S*
endomètre/S*
endométriose/S*
endométrite/S*
33850
33851
33852
33853
33854
33855
33856


33857
33858
33859
33860
33861
33862
33863
ethmoïdale/W*
ethmoïde/S*
ethmoïdite/S*
ethnarchie/S*
ethnarque/S*
ethnicisation/S*
ethniciser/a2p+


ethnicité/S*
ethnico-religieuse/W*
ethnie/S*
ethnique/S*
ethniquement/D'Q'
ethnobiologie/S*
ethnobotanique/S*







>
>







33880
33881
33882
33883
33884
33885
33886
33887
33888
33889
33890
33891
33892
33893
33894
33895
ethmoïdale/W*
ethmoïde/S*
ethmoïdite/S*
ethnarchie/S*
ethnarque/S*
ethnicisation/S*
ethniciser/a2p+
ethnicisme/S*
ethniciste/S*
ethnicité/S*
ethnico-religieuse/W*
ethnie/S*
ethnique/S*
ethniquement/D'Q'
ethnobiologie/S*
ethnobotanique/S*
33885
33886
33887
33888
33889
33890
33891

33892
33893
33894
33895
33896
33897
33898
ethnométhodologue/S*
ethnomusicologie/S*
ethnomusicologue/S*
ethnonyme/S*
ethnonymie/S*
ethnopsychiatrie/S*
ethnopsychologie/S*

ethnoreligieuse/W*
éthographie/S*
éthologie/S*
éthologique/S*
éthologiste/S*
éthologue/S*
éthos/L'D'Q'







>







33917
33918
33919
33920
33921
33922
33923
33924
33925
33926
33927
33928
33929
33930
33931
ethnométhodologue/S*
ethnomusicologie/S*
ethnomusicologue/S*
ethnonyme/S*
ethnonymie/S*
ethnopsychiatrie/S*
ethnopsychologie/S*
ethno-raciale/W*
ethnoreligieuse/W*
éthographie/S*
éthologie/S*
éthologique/S*
éthologiste/S*
éthologue/S*
éthos/L'D'Q'
34481
34482
34483
34484
34485
34486
34487

34488
34489
34490
34491
34492
34493
34494
exode/S*
exoderme/S*
exogame/S*
exogamie/S*
exogamique/S*
exogène/S*
exogénéité/S*

exomphale/S*
exon/S*
exondation/S*
exondement/S*
exonder/a3p+
exonération/S*
exonérer/c4p+







>







34514
34515
34516
34517
34518
34519
34520
34521
34522
34523
34524
34525
34526
34527
34528
exode/S*
exoderme/S*
exogame/S*
exogamie/S*
exogamique/S*
exogène/S*
exogénéité/S*
exogroupe/S*
exomphale/S*
exon/S*
exondation/S*
exondement/S*
exonder/a3p+
exonération/S*
exonérer/c4p+
34687
34688
34689
34690
34691
34692
34693


34694
34695
34696
34697
34698
34699
34700
extensionnelle/F*
extensité/S*
extensive/F*
extensivement/L'D'Q'
extensivité/S*
extenso
extensomètre/S*


exténuante/F*
exténuation/S*
exténuée/F*
exténuement/S*
exténuer/a4p+
extérieur/S*
extérieure/F*







>
>







34721
34722
34723
34724
34725
34726
34727
34728
34729
34730
34731
34732
34733
34734
34735
34736
extensionnelle/F*
extensité/S*
extensive/F*
extensivement/L'D'Q'
extensivité/S*
extenso
extensomètre/S*
extensométrie/S*
extensométrique/S*
exténuante/F*
exténuation/S*
exténuée/F*
exténuement/S*
exténuer/a4p+
extérieur/S*
extérieure/F*
35813
35814
35815
35816
35817
35818
35819

35820
35821
35822
35823
35824
35825
35826
filoselle/S.
filou/S.
filoutage/S.
filouter/a0p+
filouterie/S.
filovirus
fils

filtrable/S.
filtrage/S.
filtrante/F.
filtrat/S.
filtration/S.
filtre/S.
filtre-presse







>







35849
35850
35851
35852
35853
35854
35855
35856
35857
35858
35859
35860
35861
35862
35863
filoselle/S.
filou/S.
filoutage/S.
filouter/a0p+
filouterie/S.
filovirus
fils
filsdeputerie/S.
filtrable/S.
filtrage/S.
filtrante/F.
filtrat/S.
filtration/S.
filtre/S.
filtre-presse
36691
36692
36693
36694
36695
36696
36697

36698
36699
36700
36701
36702
36703
36704
foutou/S.
foutrale/F.
foutraque/S.
foutre/S.
foutre/tM
foutredieu
foutrement

foutriquet/S.
foutue/F.
fovéa/S.
fovéale/W.
fox
foxée/F.
fox-hound/S.







>







36728
36729
36730
36731
36732
36733
36734
36735
36736
36737
36738
36739
36740
36741
36742
foutou/S.
foutrale/F.
foutraque/S.
foutre/S.
foutre/tM
foutredieu
foutrement
foutrerie/S.
foutriquet/S.
foutue/F.
fovéa/S.
fovéale/W.
fox
foxée/F.
fox-hound/S.
40055
40056
40057
40058
40059
40060
40061

40062
40063
40064
40065
40066
40067
40068
haptique/S*
haptonomie/S*
haptonomique/S*
haquebute/S.
haquenée/S.
haquet/S.
harakiri/S.

harangue/S.
haranguer/a0p+
harangueuse/F.
haras
harassante/F.
harassement/S.
harasser/a0p+







>







40093
40094
40095
40096
40097
40098
40099
40100
40101
40102
40103
40104
40105
40106
40107
haptique/S*
haptonomie/S*
haptonomique/S*
haquebute/S.
haquenée/S.
haquet/S.
harakiri/S.
haram/S.
harangue/S.
haranguer/a0p+
harangueuse/F.
haras
harassante/F.
harassement/S.
harasser/a0p+
41280
41281
41282
41283
41284
41285
41286

41287
41288
41289
41290
41291
41292
41293

41294
41295
41296
41297
41298
41299
41300
hoyau/X.
hpz/||--
http/S=
huard/S.
huart/S.
hub/S.
hublot/S.

huche/S.
hucher/a0p+
huchet/S.
hue
huée/S.
huer/a0p+
huerta/S.

huguenote/F.
huilage/S*
huile/S*
huiler/a2p+
huilerie/S*
huileuse/W*
huilière/F*







>







>







41319
41320
41321
41322
41323
41324
41325
41326
41327
41328
41329
41330
41331
41332
41333
41334
41335
41336
41337
41338
41339
41340
41341
hoyau/X.
hpz/||--
http/S=
huard/S.
huart/S.
hub/S.
hublot/S.
hubris/L'D'Q'
huche/S.
hucher/a0p+
huchet/S.
hue
huée/S.
huer/a0p+
huerta/S.
hugolienne/F*
huguenote/F.
huilage/S*
huile/S*
huiler/a2p+
huilerie/S*
huileuse/W*
huilière/F*
41775
41776
41777
41778
41779
41780
41781


41782
41783
41784
41785
41786
41787
41788
hypertrophier/a4p+
hypertrophique/S*
hyperuricémie/S*
hypervariable/S*
hyperventilation/S*
hyperventiler/a1p.
hypervigilance/S*


hyperviscosité/S*
hyperviseur/S*
hypervitaminose/S*
hyphe/S*
hypholome/S*
hypnagogique/S*
hypnogramme/S*







>
>







41816
41817
41818
41819
41820
41821
41822
41823
41824
41825
41826
41827
41828
41829
41830
41831
hypertrophier/a4p+
hypertrophique/S*
hyperuricémie/S*
hypervariable/S*
hyperventilation/S*
hyperventiler/a1p.
hypervigilance/S*
hyperviolence/S*
hyperviolente/F*
hyperviscosité/S*
hyperviseur/S*
hypervitaminose/S*
hyphe/S*
hypholome/S*
hypnagogique/S*
hypnogramme/S*
42162
42163
42164
42165
42166
42167
42168

42169
42170
42171
42172
42173
42174
42175
illisibilité/S*
illisible/S*
illisiblement/D'Q'
illogique/S*
illogiquement/D'Q'
illogisme/S*
illuminante/F*

illumination/S*
illuminative/F*
illuminatrice/F*
illuminée/F*
illuminer/a4p+
illuminisme/S*
illusion/S*







>







42205
42206
42207
42208
42209
42210
42211
42212
42213
42214
42215
42216
42217
42218
42219
illisibilité/S*
illisible/S*
illisiblement/D'Q'
illogique/S*
illogiquement/D'Q'
illogisme/S*
illuminante/F*
illuminati/L'D'Q'
illumination/S*
illuminative/F*
illuminatrice/F*
illuminée/F*
illuminer/a4p+
illuminisme/S*
illusion/S*
42347
42348
42349
42350
42351
42352
42353
42354
42355
42356
42357
42358
42359
42360
42361
immunodéficiente/F*
immunodéficitaire/S*
immunodépresseur/S*
immunodépression/S*
immunodépressive/F*
immunodéprimée/F*
immunofluorescence/S*
immuno-fluorescence/S*
immunogène/S*
immunogénétique/S*
immunogénicité/S*
immunogénique/S*
immunoglobuline/S*
immunohistochimie/S*
immunologie/S*







<







42391
42392
42393
42394
42395
42396
42397

42398
42399
42400
42401
42402
42403
42404
immunodéficiente/F*
immunodéficitaire/S*
immunodépresseur/S*
immunodépression/S*
immunodépressive/F*
immunodéprimée/F*
immunofluorescence/S*

immunogène/S*
immunogénétique/S*
immunogénicité/S*
immunogénique/S*
immunoglobuline/S*
immunohistochimie/S*
immunologie/S*
42402
42403
42404
42405
42406
42407
42408

42409
42410
42411
42412
42413
42414
42415
imparisyllabique/S*
imparité/S*
impartageable/S*
impartiale/W*
impartialement/D'Q'
impartialité/S*
impartir/fC

impasse/S*
impassibilité/S*
impassible/S*
impassiblement/D'Q'
impatiemment/D'Q'
impatience/S*
impatiens/L'D'Q'







>







42445
42446
42447
42448
42449
42450
42451
42452
42453
42454
42455
42456
42457
42458
42459
imparisyllabique/S*
imparité/S*
impartageable/S*
impartiale/W*
impartialement/D'Q'
impartialité/S*
impartir/fC
impassable/S*
impasse/S*
impassibilité/S*
impassible/S*
impassiblement/D'Q'
impatiemment/D'Q'
impatience/S*
impatiens/L'D'Q'
51969
51970
51971
51972
51973
51974
51975

51976
51977
51978
51979
51980
51981
51982
multidevise/S.
multidiffusion/S.
multidimensionnalité/S.
multidimensionnelle/F.
multidirectionnalité/S.
multidirectionnelle/F.
multidisciplinaire/S.

multiethnique/S.
multifactorielle/F.
multifamiliale/W.
multifilaire/S.
multiflore/S.
multifonction/S.
multifonctionnalité/S.







>







52013
52014
52015
52016
52017
52018
52019
52020
52021
52022
52023
52024
52025
52026
52027
multidevise/S.
multidiffusion/S.
multidimensionnalité/S.
multidimensionnelle/F.
multidirectionnalité/S.
multidirectionnelle/F.
multidisciplinaire/S.
multidisciplinarité/S.
multiethnique/S.
multifactorielle/F.
multifamiliale/W.
multifilaire/S.
multiflore/S.
multifonction/S.
multifonctionnalité/S.
54310
54311
54312
54313
54314
54315
54316
54317
54318
54319
54320
54321
54322
54323
54324
54325
oligoasthénotératospermie/S*
oligocène/S*
oligochète/S*
oligoclase/S*
oligodendrocyte/S*
oligodendrogliome/S*
oligoélément/S*
oligoélément/S*
oligo-élément/S*
oligogalacturonate/S*
oligo-galacturonate/S*
oligomère/S*
oligomérique/S*
oligomérisation/S*
oligonucléotide/S*
oligo-nucléotide/S*







<
<







54355
54356
54357
54358
54359
54360
54361


54362
54363
54364
54365
54366
54367
54368
oligoasthénotératospermie/S*
oligocène/S*
oligochète/S*
oligoclase/S*
oligodendrocyte/S*
oligodendrogliome/S*
oligoélément/S*


oligogalacturonate/S*
oligo-galacturonate/S*
oligomère/S*
oligomérique/S*
oligomérisation/S*
oligonucléotide/S*
oligo-nucléotide/S*
57268
57269
57270
57271
57272
57273
57274

57275
57276
57277
57278
57279
57280
57281
perceptiblement
perception/S.
perceptionnisme/S.
perceptionniste/S.
perceptive/F.
perceptrice/F.
perceptuelle/F.

percer/a0p+
percerette/S.
perceuse/F.
percevable/S.
percevoir/pK
perche/S.
percher/a0p+







>







57311
57312
57313
57314
57315
57316
57317
57318
57319
57320
57321
57322
57323
57324
57325
perceptiblement
perception/S.
perceptionnisme/S.
perceptionniste/S.
perceptive/F.
perceptrice/F.
perceptuelle/F.
perceptuellement
percer/a0p+
percerette/S.
perceuse/F.
percevable/S.
percevoir/pK
perche/S.
percher/a0p+
58920
58921
58922
58923
58924
58925
58926

58927
58928
58929
58930
58931
58932
58933
pixellisation/S.
pizza/S.
pizzaïolo/S.
pizzéria/S.
pizzicato/I.
placage/S.
placard/S.

placarder/a0p+
placardisation/S.
placardiser/a0p+
place/S.
placébo/S.
placement/S.
placenta/S.







>







58964
58965
58966
58967
58968
58969
58970
58971
58972
58973
58974
58975
58976
58977
58978
pixellisation/S.
pizza/S.
pizzaïolo/S.
pizzéria/S.
pizzicato/I.
placage/S.
placard/S.
placardage/S.
placarder/a0p+
placardisation/S.
placardiser/a0p+
place/S.
placébo/S.
placement/S.
placenta/S.
59306
59307
59308
59309
59310
59311
59312

59313
59314
59315
59316
59317
59318
59319
ployage/S.
ployante/F.
ployer/a0p+
pluche/S.
plucher/a0p.
plucheuse/W.
plugin/S.

pluie/S.
plumage/S.
plumaison/S.
plumard/S.
plumasseau/X.
plumasserie/S.
plumassière/F.







>







59351
59352
59353
59354
59355
59356
59357
59358
59359
59360
59361
59362
59363
59364
59365
ployage/S.
ployante/F.
ployer/a0p+
pluche/S.
plucher/a0p.
plucheuse/W.
plugin/S.
plug-in/S.
pluie/S.
plumage/S.
plumaison/S.
plumard/S.
plumasseau/X.
plumasserie/S.
plumassière/F.
59342
59343
59344
59345
59346
59347
59348
59349
59350
59351
59352
59353
59354
59355
59356
59357
59358
59359
59360
59361
59362
59363
59364
59365
59366
59367
59368
59369
59370
59371
59372
59373
59374
59375
pluriannuelle/F.
pluricellulaire/S.
pluriculturelle/F.
pluridimensionnalité/S.
pluridimensionnelle/F.
pluridisciplinaire/S.
pluridisciplinaire/S.
pluri-disciplinaire/S.
pluridisciplinarité/S.
plurielle/F.
pluriethnique/S.
plurilatérale/W.
plurilingue/S.
plurilinguisme/S.
plurimillénaire/S.
plurimodale/W.
plurinationale/W.
plurinominale/W.
pluripartisme/S.
pluripartite/S.
pluripotence/S.
pluripotente/F.
pluriséculaire/S.
plurisousharmonique/S.
plurispécifique/S.
plurithématique/S.
pluri-thématique/S.
plurithérapie/S.
plurivalente/F.
plurivocité/S.
plurivoque/S.
plus
plus
plusieurs







<


















<







59388
59389
59390
59391
59392
59393
59394

59395
59396
59397
59398
59399
59400
59401
59402
59403
59404
59405
59406
59407
59408
59409
59410
59411
59412

59413
59414
59415
59416
59417
59418
59419
pluriannuelle/F.
pluricellulaire/S.
pluriculturelle/F.
pluridimensionnalité/S.
pluridimensionnelle/F.
pluridisciplinaire/S.
pluridisciplinaire/S.

pluridisciplinarité/S.
plurielle/F.
pluriethnique/S.
plurilatérale/W.
plurilingue/S.
plurilinguisme/S.
plurimillénaire/S.
plurimodale/W.
plurinationale/W.
plurinominale/W.
pluripartisme/S.
pluripartite/S.
pluripotence/S.
pluripotente/F.
pluriséculaire/S.
plurisousharmonique/S.
plurispécifique/S.
plurithématique/S.

plurithérapie/S.
plurivalente/F.
plurivocité/S.
plurivoque/S.
plus
plus
plusieurs
59719
59720
59721
59722
59723
59724
59725

59726
59727
59728
59729
59730
59731
59732
polychète/S.
polychlorobenzène/S.
polychlorure/S.
polychroïque/S.
polychroïsme/S.
polychrome/S.
polychromie/S.

polycistronique/S.
polyclinique/S.
polycondensat/S.
polycondensation/S.
polycopie/S.
polycopier/a0p+
polycourant







>







59763
59764
59765
59766
59767
59768
59769
59770
59771
59772
59773
59774
59775
59776
59777
polychète/S.
polychlorobenzène/S.
polychlorure/S.
polychroïque/S.
polychroïsme/S.
polychrome/S.
polychromie/S.
polychromique/S.
polycistronique/S.
polyclinique/S.
polycondensat/S.
polycondensation/S.
polycopie/S.
polycopier/a0p+
polycourant
59995
59996
59997
59998
59999
60000
60001

60002
60003
60004
60005
60006
60007
60008
popcorn/S.
pope/S.
popeline/S.
popinée/S.
poplitée/F.
popote/S.
popotin/S.

populace/S.
populacière/F.
populage/S.
populaire/S.
populairement
popularisation/S.
populariser/a0p+







>







60040
60041
60042
60043
60044
60045
60046
60047
60048
60049
60050
60051
60052
60053
60054
popcorn/S.
pope/S.
popeline/S.
popinée/S.
poplitée/F.
popote/S.
popotin/S.
popstar/S.
populace/S.
populacière/F.
populage/S.
populaire/S.
populairement
popularisation/S.
populariser/a0p+
60390
60391
60392
60393
60394
60395
60396
60397
60398
60399
60400
60401
60402
60403
60404
60405
poulaille/S.
poulailler/S.
poulaine/F.
poulamon/S.
poularde/S.
poulbot/S.
poule/S.
poulet/S.
poulette/S.
pouliage/S.
pouliche/S.
poulie/S.
pouliner/a0p.
poulinière/S.
poulinière/S.
pouliot/S.







<
|







60436
60437
60438
60439
60440
60441
60442

60443
60444
60445
60446
60447
60448
60449
60450
poulaille/S.
poulailler/S.
poulaine/F.
poulamon/S.
poularde/S.
poulbot/S.
poule/S.

poulette/F.
pouliage/S.
pouliche/S.
poulie/S.
pouliner/a0p.
poulinière/S.
poulinière/S.
pouliot/S.
61785
61786
61787
61788
61789
61790
61791

61792
61793
61794
61795
61796
61797
61798
protoplasme/S.
protoplasmique/S.
protoplaste/S.
protoptère/S.
protosulfure/S.
prototypage/S.
prototype/S.

prototypique/S.
prototypiste/S.
protoure/S.
protoxyde/S.
protozoaire/S.
protozoologie/S.
protractile/S.







>







61830
61831
61832
61833
61834
61835
61836
61837
61838
61839
61840
61841
61842
61843
61844
protoplasme/S.
protoplasmique/S.
protoplaste/S.
protoptère/S.
protosulfure/S.
prototypage/S.
prototype/S.
prototyper/a0p+
prototypique/S.
prototypiste/S.
protoure/S.
protoxyde/S.
protozoaire/S.
protozoologie/S.
protractile/S.
62290
62291
62292
62293
62294
62295
62296

62297
62298
62299
62300
62301
62302
62303
pusillanime/S.
pusillanimement
pusillanimité/S.
pustule/S.
pustuler/a0p+
pustuleuse/W.
putain/S.

putassière/F.
putative/F.
pute/S.
putier/S.
putiet/S.
putois
putréfaction/S.







>







62336
62337
62338
62339
62340
62341
62342
62343
62344
62345
62346
62347
62348
62349
62350
pusillanime/S.
pusillanimement
pusillanimité/S.
pustule/S.
pustuler/a0p+
pustuleuse/W.
putain/S.
putasserie/S.
putassière/F.
putative/F.
pute/S.
putier/S.
putiet/S.
putois
putréfaction/S.
67852
67853
67854
67855
67856
67857
67858

67859
67860
67861
67862
67863
67864
67865
sceau/X.
sceau-de-Salomon
sceaux-de-Salomon
scélérate/F.
scélératement
scélératesse/S.
scellage/S.

scellement/S.
sceller/a0p+
scénarimage/S.
scénario/S.
scénarisation/S.
scénariser/a0p+
scénariste/S.







>







67899
67900
67901
67902
67903
67904
67905
67906
67907
67908
67909
67910
67911
67912
67913
sceau/X.
sceau-de-Salomon
sceaux-de-Salomon
scélérate/F.
scélératement
scélératesse/S.
scellage/S.
scellé/S.
scellement/S.
sceller/a0p+
scénarimage/S.
scénario/S.
scénarisation/S.
scénariser/a0p+
scénariste/S.
68096
68097
68098
68099
68100
68101
68102

68103
68104
68105
68106
68107
68108
68109
scripturale/W.
scripturalisme/S.
scrofulaire/S.
scrofulariacée/S.
scrofule/S.
scrofuleuse/W.
scrogneugneu/X.

scrolling/S.
scrotale/W.
scrotum/S.
scrub/S.
scrubber/S.
scrupule/S.
scrupuleuse/W.







>







68144
68145
68146
68147
68148
68149
68150
68151
68152
68153
68154
68155
68156
68157
68158
scripturale/W.
scripturalisme/S.
scrofulaire/S.
scrofulariacée/S.
scrofule/S.
scrofuleuse/W.
scrogneugneu/X.
scroller/a0p.
scrolling/S.
scrotale/W.
scrotum/S.
scrub/S.
scrubber/S.
scrupule/S.
scrupuleuse/W.
72283
72284
72285
72286
72287
72288
72289

72290
72291
72292
72293
72294
72295
72296
syrah/S.
syriaque/S.
syriaque/S.
syrienne/F.
syringe/S.
syringomyélie/S.
syrinx

syrphe/S.
sysadmin/S.
systématicienne/F.
systématicité/S.
systématique/S.
systématique/S.
systématiquement







>







72332
72333
72334
72335
72336
72337
72338
72339
72340
72341
72342
72343
72344
72345
72346
syrah/S.
syriaque/S.
syriaque/S.
syrienne/F.
syringe/S.
syringomyélie/S.
syrinx
syro-libanaise/F.
syrphe/S.
sysadmin/S.
systématicienne/F.
systématicité/S.
systématique/S.
systématique/S.
systématiquement
72477
72478
72479
72480
72481
72482
72483

72484
72485
72486
72487
72488
72489
72490
talent/S.
talentueuse/W.
talentueusement
taler/a0p+
taleth/S.
taliatelle/S.
talibane/F.

talion/S.
talisman/S.
talismanique/S.
talith/S.
talitre/S.
talkiewalkie/S.
talkshow/S.







>







72527
72528
72529
72530
72531
72532
72533
72534
72535
72536
72537
72538
72539
72540
72541
talent/S.
talentueuse/W.
talentueusement
taler/a0p+
taleth/S.
taliatelle/S.
talibane/F.
talibée/F.
talion/S.
talisman/S.
talismanique/S.
talith/S.
talitre/S.
talkiewalkie/S.
talkshow/S.
75013
75014
75015
75016
75017
75018
75019

75020
75021
75022
75023
75024
75025
75026
trantran/S.
trapèze/S.
trapéziste/S.
trapézoèdre/S.
trapézoïdale/W.
trapézoïde/S.
trappe/S.

trappeuse/F.
trappillon/S.
trappiste/S.
trappistine/S.
trapue/F.
traque/S.
traquée/F.







>







75064
75065
75066
75067
75068
75069
75070
75071
75072
75073
75074
75075
75076
75077
75078
trantran/S.
trapèze/S.
trapéziste/S.
trapézoèdre/S.
trapézoïdale/W.
trapézoïde/S.
trappe/S.
trapper/a0p+
trappeuse/F.
trappillon/S.
trappiste/S.
trappistine/S.
trapue/F.
traque/S.
traquée/F.
77331
77332
77333
77334
77335
77336
77337

77338
77339
77340
77341
77342
77343
77344
vibrato/S.
vibratoire/S.
vibrer/a0p+
vibreur/S.
vibrion/S.
vibrionner/a0p.
vibrisse/S.

vibromasseur/S.
vicaire/S.
vicariale/W.
vicariance/S.
vicariante/F.
vicariat/S.
vice/S.







>







77383
77384
77385
77386
77387
77388
77389
77390
77391
77392
77393
77394
77395
77396
77397
vibrato/S.
vibratoire/S.
vibrer/a0p+
vibreur/S.
vibrion/S.
vibrionner/a0p.
vibrisse/S.
vibro/S.
vibromasseur/S.
vicaire/S.
vicariale/W.
vicariance/S.
vicariante/F.
vicariat/S.
vice/S.

Modified gc_lang/fr/xpi/data/gc_panel.css from [882bab8a6d] to [75ceec5406].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20



















21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41





42
43
44
45
46
47
48
49
50
51
52
53
54

55
56
57
58




59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/* panel.css */

@import url("common.css");

header {
    background-color: hsl(0, 0%, 96%);
    padding: 10px 20px;
    border-bottom: 1px solid hsl(0, 0%, 90%);
    color: hsl(0, 0%, 0%);
    z-index: 99;
}



body {
	background-color: hsl(0, 0%, 98%);
	font-family: Tahoma, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", sans-serif;
	overflow-x: hidden;
    color: hsl(0, 0%, 0%);
}




















#messagebox {
    position: absolute;
    display: none;
    left: 50%;
    width: 250px;
    margin-left: -125px;
    top: 50px;
    background-color: hsla(0, 50%, 20%, .8);
    border: 2px solid hsla(0, 50%, 10%, .8);
    border-radius: 5px;
    text-align: center;
    color: hsla(0, 0%, 100%, .9);
    font-size: 16px;
    font-weight: bold;
    z-index: 99;
}
#message {
    padding: 10px 20px;
}






#errorlist {
    padding: 60px 20px 30px 20px;
}

#errorlist p.message {
    margin-top: 20px;
    padding: 10px 10px;
    background-color: hsla(240, 10%, 50%, 1);
    font-size: 18px;
    color: hsla(240, 0%, 96%, 1);
    border-radius: 3px;
    text-align: center;
}

#errorlist p.green {
    background-color: hsla(120, 10%, 50%, 1);
    color: hsla(120, 0%, 96%, 1);
}





.paragraph {
    background-color: hsla(0, 0%, 90%, 1);
    padding: 10px;
    border-radius: 2px;
    font-size: 14px;
    font-family : "Courier New", Courier, "Lucida Sans Typewriter", "Lucida Typewriter", monospace;
    color: hsl(0, 0%, 0%);
}
.softred {
    background-color: hsla(0, 20%, 90%, 1);
}
.softgreen {
    background-color: hsla(120, 20%, 90%, 1);
}

.paragraph a {
    background-color: hsla(210, 50%, 50%, 1);
    padding: 1px 5px;
    border-radius: 2px;
    color: hsla(210, 0%, 96%, 1);
    cursor: pointer;
    text-decoration: none;
}
.paragraph a:hover {
    background-color: hsla(210, 60%, 40%, 1);
    color: hsla(0, 0%, 100%, 1);
    text-shadow: 0 0 3px hsl(210, 30%, 60%);
}

.paragraph a.sugg {
    padding: 1px 6px;
    background-color: hsla(150, 50%, 40%, 1);
    color: hsla(150, 0%, 96%, 1);
    border-radius: 2px;
    cursor: pointer;
    text-decoration: none;
}
.paragraph a.sugg:hover {
    background-color: hsla(150, 70%, 30%, 1);
    color: hsla(0, 0%, 100%, 1);
    text-shadow: 0 0 3px hsl(150, 30%, 60%);
}

.paragraph a.ignore {
    padding: 0 2px;
    background-color: hsla(30, 20%, 60%, 1);
    color: hsla(30, 0%, 96%, 1);
    border-radius: 2px;
    cursor: pointer;
    text-decoration: none;
}
.paragraph a.ignore:hover {
    background-color: hsla(30, 20%, 50%, 1);
    color: hsla(0, 0%, 100%, 1);
    text-shadow: 0 0 3px hsl(30, 30%, 60%);
}

.paragraph u.corrected,
.paragraph u.ignored {
    background-color: hsla(120, 50%, 70%, 1);
    color: hsla(0, 0%, 4%, 1);
    border-radius: 2px;









<


<
<

|
|
|


>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>















<





>
>
>
>
>













>




>
>
>
>













|
















|
<
<
<
<
<

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







1
2
3
4
5
6
7
8
9

10
11


12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114





115



















116
117
118
119
120
121
122
/* panel.css */

@import url("common.css");

header {
    background-color: hsl(0, 0%, 96%);
    padding: 10px 20px;
    border-bottom: 1px solid hsl(0, 0%, 90%);
    color: hsl(0, 0%, 0%);

}



body {
    background-color: hsl(0, 0%, 98%);
    font-family: Tahoma, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", sans-serif;
    overflow-x: hidden;
    color: hsl(0, 0%, 0%);
}

#special_message {
    display: none;
    margin: 0 20px 0 20px;
    padding: 60px 20px 10px 20px;
    border-radius: 3px;
    background-color: hsl(0, 50%, 50%);
    font: bold 18px "Trebuchet MS", sans-serif;
    color: hsl(0, 10%, 190%);
}
#special_message a {
    color: hsl(0, 50%, 80%);
    text-shadow: 0 0 3px hsl(0, 50%, 20%);
    text-decoration: none;
}
#special_message a:hover {
    color: hsl(0, 70%, 90%);
    text-shadow: 0 0 3px hsl(0, 80%, 10%);
}

#messagebox {
    position: absolute;
    display: none;
    left: 50%;
    width: 250px;
    margin-left: -125px;
    top: 50px;
    background-color: hsla(0, 50%, 20%, .8);
    border: 2px solid hsla(0, 50%, 10%, .8);
    border-radius: 5px;
    text-align: center;
    color: hsla(0, 0%, 100%, .9);
    font-size: 16px;
    font-weight: bold;

}
#message {
    padding: 10px 20px;
}


/*
    Error list
*/

#errorlist {
    padding: 60px 20px 30px 20px;
}

#errorlist p.message {
    margin-top: 20px;
    padding: 10px 10px;
    background-color: hsla(240, 10%, 50%, 1);
    font-size: 18px;
    color: hsla(240, 0%, 96%, 1);
    border-radius: 3px;
    text-align: center;
}

#errorlist p.green {
    background-color: hsla(120, 10%, 50%, 1);
    color: hsla(120, 0%, 96%, 1);
}

.paragraph_block {
    margin: 0 0 10px 0;
}

.paragraph {
    background-color: hsla(0, 0%, 90%, 1);
    padding: 10px;
    border-radius: 2px;
    font-size: 14px;
    font-family : "Courier New", Courier, "Lucida Sans Typewriter", "Lucida Typewriter", monospace;
    color: hsl(0, 0%, 0%);
}
.softred {
    background-color: hsla(0, 20%, 90%, 1);
}
.softgreen {
    background-color: hsla(120, 15%, 90%, 1);
}

.paragraph a {
    background-color: hsla(210, 50%, 50%, 1);
    padding: 1px 5px;
    border-radius: 2px;
    color: hsla(210, 0%, 96%, 1);
    cursor: pointer;
    text-decoration: none;
}
.paragraph a:hover {
    background-color: hsla(210, 60%, 40%, 1);
    color: hsla(0, 0%, 100%, 1);
    text-shadow: 0 0 3px hsl(210, 30%, 60%);
}

.paragraph u {





    text-decoration: none;



















}

.paragraph u.corrected,
.paragraph u.ignored {
    background-color: hsla(120, 50%, 70%, 1);
    color: hsla(0, 0%, 4%, 1);
    border-radius: 2px;
131
132
133
134
135
136
137
138




139
140




141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159

160
161
162

163
164
165
166
167
168
169



170

171
172

173
174
175
176
177
178
179

180




181















182























183

184






185





186



































187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
    border-radius: 2px;
    text-decoration: none; /* to remove for wavy underlines */
}
.paragraph u.error:hover {
    cursor: pointer;
}

.paragraph u.error .tooltip, .paragraph u.error .tooltip_on {




    position: absolute;
    background-color: hsla(210, 10%, 90%, 1);




    font-family: Tahoma, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", sans-serif;
    top: 90%;
    left: 0;
    width: 250px;
    font-size: 12px;
    line-height: 18px;
    color: hsla(0, 10%, 20%, 1);
    cursor: default;
    /*visibility: hidden;*/
    display: none;
    padding: 10px;
    box-shadow: 0 0 6px hsla(0, 0%, 0%, 0.3);
    z-index: 10;
    border: 2px solid hsl(0, 0%, 0%);
    border-radius: 3px;
    text-decoration: none;
}
.paragraph u.error .tooltip_on {
    display: block;

}

.tooltip_on s {

    color: hsla(0, 0%, 66%, 1);
    font-weight: bold;
    font-size: 8px;
    line-height: 16px;
    text-transform: uppercase;
    text-decoration: none;
}





.debug {
    float: right;

    background-color: hsla(0, 5%, 35%, 1);
    padding: 2px 5px;
    margin-left: 5px;
    border-radius: 2px;
    color: hsla(0, 0%, 96%, 1);
    font-size: 11px;
    font-style: normal;

}




















.data {























    font-style: normal;

}
















































.actions {
    margin-top: -10px;
    margin-bottom: 10px;
}

.actions .button {
    background-color: hsl(0, 0%, 50%);
    text-align: center;
    float: right;
    margin-left: 2px;
    padding: 1px 4px 3px 4px;
    /*width: 18px;
    height: 18px;*/
    cursor: pointer;
    font-size: 14px;
    font-weight: bold;
    color: hsl(0, 0%, 96%);
    border-radius: 2px;
}
.actions .button:hover {
    background-color: hsl(0, 0%, 40%);
    color: hsl(0, 0%, 100%);
}







|
>
>
>
>

<
>
>
>
>

<
<
<


<

<
<
<
<
<
<
<


|
|
>

<
|
>
|
<
<
<
<
<

>
>
>
|
>
|
|
>
|

<

|


>

>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>

>
>
>
>
>
>
|
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

|
<












<







132
133
134
135
136
137
138
139
140
141
142
143
144

145
146
147
148
149



150
151

152







153
154
155
156
157
158

159
160
161





162
163
164
165
166
167
168
169
170
171
172

173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275

276
277
278
279
280
281
282
283
284
285
286
287

288
289
290
291
292
293
294
    border-radius: 2px;
    text-decoration: none; /* to remove for wavy underlines */
}
.paragraph u.error:hover {
    cursor: pointer;
}


/* 
    TOOLTIPS
*/
.tooltip {
    position: absolute;

    display: none;
    width: 300px;
    border-radius: 5px;
    box-shadow: 0 0 6px hsla(0, 0%, 0%, 0.3);
    font-family: Tahoma, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", sans-serif;



    font-size: 12px;
    line-height: 18px;

    cursor: default;







    text-decoration: none;
}
#gc_tooltip {
    border: 3px solid hsl(210, 50%, 30%);
    color: hsla(210, 10%, 20%, 1);
}

#sc_tooltip {
    border: 3px solid hsl(0, 50%, 30%);
    color: hsla(0, 10%, 20%, 1);





}
#gc_tooltip_arrow, #sc_tooltip_arrow {
    position: absolute;
    display: none;
}
#gc_tooltip #gc_rule_id {
    display: none;
    margin: 0 0 5px 0;
    border: 1px solid hsl(210, 50%, 60%);
    background-color: hsl(210, 50%, 40%);
    padding: 2px 5px;

    border-radius: 2px;
    color: hsla(210, 0%, 96%, 1);
    font-size: 11px;
    font-style: normal;
    text-align: center;
}
#gc_message_block {
    padding: 5px 10px 10px 10px;
    background-color: hsl(210, 50%, 30%);
    color: hsl(210, 50%, 96%);
}
#sc_message_block {
    padding: 5px 10px 10px 10px;
    background-color: hsl(0, 50%, 30%);
    color: hsl(0, 50%, 96%);
}
#gc_message, #sc_message {
    font-size: 15px;
    margin-bottom: 5px;
}
a#gc_ignore, a#sc_ignore {
    padding: 0 2px;
    background-color: hsla(30, 30%, 40%, 1);
    color: hsla(30, 0%, 96%, 1);
    border-radius: 2px;
    cursor: pointer;
    text-decoration: none;
}
a#gc_ignore:hover, a#sc_ignore:hover {
    background-color: hsla(30, 30%, 50%, 1);
    color: hsla(0, 0%, 100%, 1);
    text-shadow: 0 0 3px hsl(30, 30%, 60%);
}
a#gc_url {
    padding: 0 2px;
    background-color: hsla(210, 50%, 50%, 1);
    color: hsla(210, 0%, 96%, 1);
    border-radius: 2px;
    cursor: pointer;
    text-decoration: none;
}
a#gc_url:hover {
    background-color: hsla(210, 50%, 60%, 1);
    color: hsla(0, 0%, 100%, 1);
    text-shadow: 0 0 3px hsl(210, 30%, 60%);
}
#gc_sugg_title {
    padding: 0 10px;
    background-color: hsl(210, 10%, 90%);
    color: hsl(210, 50%, 30%);
    font-size: 10px;
    font-weight: bold;
}
#sc_sugg_title {
    padding: 0 10px;
    background-color: hsl(0, 10%, 90%);
    color: hsl(0, 50%, 30%);
    font-size: 9px;
    font-weight: bold;
}
#gc_sugg_block {
    padding: 10px;
    background-color: hsl(210, 10%, 96%);
    border-radius: 0 0 2px 2px;
    line-height: 20px;
}
#sc_sugg_block {
    padding: 10px;
    background-color: hsl(0, 10%, 96%);
    border-radius: 0 0 2px 2px;
    line-height: 20px;
}
#gc_sugg_block a.sugg {
    padding: 1px 6px;
    background-color: hsla(180, 60%, 40%, 1);
    color: hsla(180, 0%, 96%, 1);
    border-radius: 2px;
    cursor: pointer;
    text-decoration: none;
}
#gc_sugg_block a.sugg:hover {
    background-color: hsla(180, 70%, 45%, 1);
    color: hsla(0, 0%, 100%, 1);
}
#sc_sugg_block a.sugg {
    padding: 1px 6px;
    background-color: hsla(30, 90%, 45%, 1);
    color: hsla(30, 0%, 96%, 1);
    border-radius: 2px;
    cursor: pointer;
    text-decoration: none;
}
#sc_sugg_block a.sugg:hover {
    background-color: hsla(30, 100%, 50%, 1);
    color: hsla(0, 0%, 100%, 1);
}

/*
    Action buttons
*/

.actions {
    margin: 0 0 5px 10px;

}

.actions .button {
    background-color: hsl(0, 0%, 50%);
    text-align: center;
    float: right;
    margin-left: 2px;
    padding: 1px 4px 3px 4px;
    /*width: 18px;
    height: 18px;*/
    cursor: pointer;
    font-size: 14px;

    color: hsl(0, 0%, 96%);
    border-radius: 2px;
}
.actions .button:hover {
    background-color: hsl(0, 0%, 40%);
    color: hsl(0, 0%, 100%);
}
228
229
230
231
232
233
234



235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
    background-color: hsl(30, 50%, 50%);
    color: hsl(30, 0%, 96%);
}
.actions .orange:hover {
    background-color: hsl(30, 70%, 40%);
    color: hsl(30, 0%, 100%);
}





/*
    ERRORS
*/

.error {
    /* default color */
    background-color: hsl(240, 10%, 50%);
    color: hsl(240, 0%, 96%);
}
.error:hover {
    background-color: hsl(240, 10%, 40%);
    color: hsl(240, 0%, 100%);
}

/* elems */
.spell {
    background-color: hsl(0, 50%, 50%);
    color: hsl(0, 0%, 96%);
    /*text-decoration: underline wavy hsl(0, 50%, 50%);*/
}
.spell:hover {
    background-color: hsl(0, 60%, 40%);
    color: hsl(0, 0%, 100%);
}

/* elems */
.typo, .esp, .nbsp, .eif, .maj, .virg, .tu, .num, .unit, .nf, .liga, .mapos, .chim {
    background-color: hsl(30, 70%, 50%);







>
>
>

















|




|







313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
    background-color: hsl(30, 50%, 50%);
    color: hsl(30, 0%, 96%);
}
.actions .orange:hover {
    background-color: hsl(30, 70%, 40%);
    color: hsl(30, 0%, 100%);
}
.actions .bold {
    font-weight: bold;
}


/*
    ERRORS
*/

.error {
    /* default color */
    background-color: hsl(240, 10%, 50%);
    color: hsl(240, 0%, 96%);
}
.error:hover {
    background-color: hsl(240, 10%, 40%);
    color: hsl(240, 0%, 100%);
}

/* elems */
.WORD {
    background-color: hsl(0, 50%, 50%);
    color: hsl(0, 0%, 96%);
    /*text-decoration: underline wavy hsl(0, 50%, 50%);*/
}
.WORD:hover {
    background-color: hsl(0, 60%, 40%);
    color: hsl(0, 0%, 100%);
}

/* elems */
.typo, .esp, .nbsp, .eif, .maj, .virg, .tu, .num, .unit, .nf, .liga, .mapos, .chim {
    background-color: hsl(30, 70%, 50%);

Modified gc_lang/fr/xpi/data/gc_panel.html from [6930e5be20] to [3af19d97ff].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21


22
23
24
25
26
27
28
29
30
31
32

33
34
35
36
37
38
39
40
41
42
43




44
45
46
47
48
























49
50
51
52
53
<!DOCTYPE HTML>
<html>
    <head>
        <link rel="stylesheet" type="text/css" href="gc_panel.css" />
        <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    </head>
    <script type="text/javascript">
        // for some reason, onclick onmouseover onmouseout can’t launch function in attached script, so here it is.
        function showData (sIdErr) {
            document.getElementById("data"+sIdErr).hidden = false;
        }
        function hideData (sIdErr) {
            document.getElementById("data"+sIdErr).hidden = true;
        }
    </script>
    <body class="panel">
        <div style="position: fixed; width: 100%">
            <div id="rightcorner">
                <a class="rightcornerbutton red" id="close" href="#"><b>×</b></a>
                <a class="rightcornerbutton cyan" id="expand_reduce" href="#"><b>−</b></a>
                <a class="rightcornerbutton1 green" id="copy_to_clipboard" href="#" style="display: none;" onclick="return false;"><b id="clipboard_msg">∑</b></a>


            </div>
            <header>
                <div id="waiticon" class="spinner">
                    <div class="double-bounce1"></div>
                    <div class="double-bounce2"></div>
                </div>
                <!--<div id="waiticon" class="fright" style="margin-right: 50px">
                    <img src="./img/spinner32.png" />
                </div>-->

                <h2>Grammalecte</h2>

            </header>
            <div id="messagebox"><a id="closemsg" class="rightcornerbutton1 red" href="#" onclick="return false;"><b>×</b></a><p id="message"></p></div>
        </div>

        <div id="movewindow">
            <div id="resize_h_bigger" class="arrow" style="border-radius: 2px 0 0 0">↓</div>
            <div id="resize_h_smaller" class="arrow">↑</div>
            <div id="resize_w_bigger" class="arrow">←</div>
            <div id="resize_w_smaller" class="arrow" style="border-radius: 0 0 0 2px">→</div>
        </div>
        





        <div id="errorlist">
            <!-- result comes here -->
        </div>

























    </body>
</html>


        






<
<
<
<
<
<
<
<
<



|
|
|
>
>











>











>
>
>
>





>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>





1
2
3
4
5
6









7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<!DOCTYPE HTML>
<html>
    <head>
        <link rel="stylesheet" type="text/css" href="gc_panel.css" />
        <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    </head>









    <body class="panel">
        <div style="position: fixed; width: 100%">
            <div id="rightcorner">
                <a class="rightcornerbutton red" id="close" href="#" title="Fermer"><b>×</b></a>
                <a class="rightcornerbutton cyan" id="expand_reduce" href="#" title="Réduire/Agrandir"><b>−</b></a>
                <a class="rightcornerbutton1 green" id="copy_to_clipboard" href="#" style="display: none;" onclick="return false;" title="Copier dans le presse-papiers">
                    <b id="clipboard_msg">∑</b>
                </a>
            </div>
            <header>
                <div id="waiticon" class="spinner">
                    <div class="double-bounce1"></div>
                    <div class="double-bounce2"></div>
                </div>
                <!--<div id="waiticon" class="fright" style="margin-right: 50px">
                    <img src="./img/spinner32.png" />
                </div>-->

                <h2>Grammalecte</h2>
                
            </header>
            <div id="messagebox"><a id="closemsg" class="rightcornerbutton1 red" href="#" onclick="return false;"><b>×</b></a><p id="message"></p></div>
        </div>

        <div id="movewindow">
            <div id="resize_h_bigger" class="arrow" style="border-radius: 2px 0 0 0">↓</div>
            <div id="resize_h_smaller" class="arrow">↑</div>
            <div id="resize_w_bigger" class="arrow">←</div>
            <div id="resize_w_smaller" class="arrow" style="border-radius: 0 0 0 2px">→</div>
        </div>
        
        <div id="special_message">
            <p class="center">Grammalecte a besoin de vous<br>pour poursuivre sa route.</p>
            <p class="center" style="margin: 10px 0"><a href="https://fr.ulule.com/grammalecte-2/" onclick="return false;">Campagne de financement participatif…</a></p>
        </div>

        <div id="errorlist">
            <!-- result comes here -->
        </div>

        <img id="gc_tooltip_arrow" src="img/gc_tooltip_arrow.png" alt="^">
        <img id="sc_tooltip_arrow" src="img/sc_tooltip_arrow.png" alt="^">

        <div id="gc_tooltip" class="tooltip">
            <!-- grammar error -->
            <div id="gc_message_block">
                <p id="gc_rule_id"></p>
                <p id="gc_message">Erreur grammaticale.</p>
                <a id="gc_ignore" href="#">Ignorer</a> &nbsp; 
                <a id="gc_url" href="" onclick="return false;">Voulez-vous en savoir plus ?…</a>
            </div>
            <div id="gc_sugg_title">SUGGESTIONS :</div>
            <div id="gc_sugg_block"></div>
        </div>

        <div id="sc_tooltip" class="tooltip">
            <!-- spelling error -->
            <div id="sc_message_block">
                <p id="sc_message">Mot inconnu du dictionnaire.</p>
                <a id="sc_ignore" href="#">Ignorer</a>
            </div>
            <div id="sc_sugg_title">SUGGESTIONS :</div>
            <div id="sc_sugg_block"></div>
        </div>
    </body>
</html>


        

Modified gc_lang/fr/xpi/data/gc_panel.js from [c4fda97645] to [01fa41331e].

1
2
3
4
5
6








7
8
9



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

39
40


41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56


57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89

90
91
92
93
94
95
96
97
98
99
100
101
102

103
104
105


106
107
108
109
110
111
112
113




114
115
116
117
118
119
120
121




122
123
124
125
126
127






128

129

130




131




132

133



134

135


136


137








138
139

140
141











142

143













144
145
146


147






148
149



150
151
152
153
154

155
156
157
158
159

160
161
162
163
164
165


















166
167
168
169

170
171


172


173
174
175
176




177


178










179
180
181
182
183
184
185
186
187

188











189












190



191

192
193
194



195


196

197
198
199
200




201




202
203

204
205
206
207
208



209
210
211
212

213


214

215

216
217
218
219

220





221
222
223
224





225


226














227











228
229
230
231
232
233

234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263











// JavaScript

let nPanelWidth = 0;  // must be set at launch
let bExpanded = true;

/*








	Events
*/




document.getElementById('close').addEventListener("click", function (event) {
	bExpanded = true; // size is reset in ui.js
	self.port.emit('closePanel');
});

document.getElementById('expand_reduce').addEventListener("click", function (event) {
	if (bExpanded) {
		self.port.emit("resize", "reduce", 10); // the number has no meaning here
		bExpanded = false;
	} else {
		self.port.emit("resize", "expand", 10); // the number has no meaning here
		bExpanded = true;
	}
});

document.getElementById('copy_to_clipboard').addEventListener("click", function (event) {
	copyToClipboard();
});

document.getElementById('closemsg').addEventListener("click", function (event) {
	closeMessageBox();
});

self.port.on("setPanelWidth", function (n) {
	nPanelWidth = n;
});

self.port.on("addElem", function (sHtml) {
	let xElem = document.createElement("div");

	xElem.innerHTML = sHtml;
	document.getElementById("errorlist").appendChild(xElem);


});

self.port.on("refreshParagraph", function (sIdParagr, sHtml) {
	document.getElementById("paragr"+sIdParagr).innerHTML = sHtml;
	let sClassName = (sHtml.includes('<u id="err')) ? "paragraph softred" : "paragraph softgreen";
	document.getElementById("paragr"+sIdParagr).className = sClassName;
});

self.port.on("showMessage", function (sText) {
	document.getElementById("message").textContent = sText;
	document.getElementById("messagebox").style.display = "block";
	window.setTimeout(closeMessageBox, 20000);
});

self.port.on("clearErrors", function (sHtml) {
	document.getElementById("errorlist").textContent = "";


});

self.port.on("start", function() {
	startWaitIcon();
});

self.port.on("end", function() {
	stopWaitIcon();
	document.getElementById("copy_to_clipboard").style.display = "block";
});

self.port.on("suggestionsFor", function (sWord, sSuggestions, sTooltipId) {
	// spell checking suggestions
	//console.log(sWord + ": " + sSuggestions);
	if (sSuggestions === "") {
		document.getElementById(sTooltipId).innerHTML += "Aucune.";
	} else if (sSuggestions.startsWith("#")) {
		document.getElementById(sTooltipId).innerHTML += sSuggestions;
	} else {
		let lSugg = sSuggestions.split("|");
		let iSugg = 0;
		let sElemId = sTooltipId.slice(7);
		for (let sSugg of lSugg) {
			document.getElementById(sTooltipId).innerHTML += '<a id="sugg' + sElemId + "-" + iSugg + '" class="sugg" href="#" onclick="return false;">' + sSugg + '</a> ';
			iSugg += 1;
		}
	}
});


window.addEventListener(
	"click",
	function (xEvent) {

		let xElem = xEvent.target;
		if (xElem.id) {
			if (xElem.id.startsWith("sugg")) {
				applySuggestion(xElem.id);
			} else if (xElem.id.startsWith("ignore")) {
				ignoreError(xElem.id);
			} else if (xElem.id.startsWith("check")) {
				sendBackAndCheck(xElem.id);
			} else if (xElem.id.startsWith("edit")) {
				switchEdition(xElem.id);
			} else if (xElem.id.startsWith("end")) {
				document.getElementById(xElem.id).parentNode.parentNode.style.display = "none";
			} else if (xElem.tagName === "U" && xElem.id.startsWith("err")) {

				showTooltip(xElem.id);
			} else if (xElem.id.startsWith("resize")) {
				self.port.emit("resize", xElem.id, 10);


			} else {
				hideAllTooltips();
			}
		} else if (xElem.tagName === "A") {
			self.port.emit("openURL", xElem.getAttribute("href"));
		} else {
			hideAllTooltips();
		}




	},
	false
);


/*
	Actions
*/





function closeMessageBox () {
	document.getElementById("messagebox").style.display = "none";
	document.getElementById("message").textContent = "";
}







function applySuggestion (sElemId) { // sugg

	try {

		let sIdParagr = sElemId.slice(4, sElemId.indexOf("_"));




		startWaitIcon("paragr"+sIdParagr);




		let sIdErr = "err" + sElemId.slice(4, sElemId.indexOf("-"));

		document.getElementById(sIdErr).textContent = document.getElementById(sElemId).textContent;



		document.getElementById(sIdErr).className = "corrected";

		document.getElementById(sIdErr).removeAttribute("style");


		self.port.emit("correction", sIdParagr, getPurgedTextOfElem("paragr"+sIdParagr));


		stopWaitIcon("paragr"+sIdParagr);








	} catch (e) {
		console.log(e.message + e.lineNumber);

	}
}













function ignoreError (sElemId) {  // ignore













	let sIdErr = "err" + sElemId.slice(6);
	let xTooltipElem = document.getElementById("tooltip"+sElemId.slice(6));
	document.getElementById(sIdErr).removeChild(xTooltipElem);


	document.getElementById(sIdErr).className = "ignored";






	document.getElementById(sIdErr).removeAttribute("style");
}




function showTooltip (sElemId) {  // err
	hideAllTooltips();
	let sTooltipId = "tooltip" + sElemId.slice(3);
	let xTooltipElem = document.getElementById(sTooltipId);

	let nLimit = nPanelWidth - 300; // paragraph width - tooltip width
	if (document.getElementById(sElemId).offsetLeft > nLimit) {
		xTooltipElem.style.left = "-" + (document.getElementById(sElemId).offsetLeft - nLimit) + "px";
	}
	xTooltipElem.setAttribute("contenteditable", false);

	xTooltipElem.className = 'tooltip_on';
	if (document.getElementById(sElemId).className === "error spell"  &&  xTooltipElem.textContent.endsWith(":")) {
		// spelling mistake
		self.port.emit("getSuggestionsForTo", document.getElementById(sElemId).innerHTML.replace(/<span .*$/, "").trim(), sTooltipId);
	}
}



















function switchEdition (sElemId) {  // edit
	let sId = "paragr" + sElemId.slice(4);
	if (document.getElementById(sId).hasAttribute("contenteditable") === false

		|| document.getElementById(sId).getAttribute("contenteditable") === "false") {
		document.getElementById(sId).setAttribute("contenteditable", true);


		document.getElementById(sElemId).className = "button orange";


		document.getElementById(sId).focus();
	} else {
		document.getElementById(sId).setAttribute("contenteditable", false);
		document.getElementById(sElemId).className = "button";




	}


}











function sendBackAndCheck (sElemId) {  // check
	startWaitIcon();
	let sIdParagr = sElemId.slice(5);
	self.port.emit("modifyAndCheck", sIdParagr, getPurgedTextOfElem("paragr"+sIdParagr));
	stopWaitIcon();
}

function getPurgedTextOfElem (sId) {

	// Note : getPurgedTextOfElem2 should work better if not buggy.











	// if user writes in error, Fx adds tags <u></u>, we also remove style attribute












	let xParagraphElem = document.getElementById(sId);



	for (xNode of xParagraphElem.getElementsByTagName("u")) {

		if (xNode.id.startsWith('err')) {
			xNode.innerHTML = xNode.innerHTML.replace(/<\/?u>/g, "");
			xNode.removeAttribute("style");



		}


	}

	// we remove style attribute on tooltip
	for (xNode of xParagraphElem.getElementsByTagName("span")) {
		if (xNode.id.startsWith('tooltip')) {
			xNode.removeAttribute("style");




		}




	}
	// now, we remove tooltips, then errors, and we change some html entities

	let sText = xParagraphElem.innerHTML;
	sText = sText.replace(/<br\/? *> *$/ig, "");
	sText = sText.replace(/<span id="tooltip.+?<\/span>/g, "");
	sText = sText.replace(/<u id="err\w+" class="[\w ]+" href="#" onclick="return false;">(.+?)<\/u><!-- err_end -->/g, "$1");
	sText = sText.replace(/&nbsp;/g, " ").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&amp;/g, "&");



	return sText;
}

function getPurgedTextOfElem2 (sId) {

	// It is better to remove tooltips via DOM and retrieve textContent,


	// but for some reason getElementsByClassName “hazardously” forgets elements.

	// Unused. Needs investigation.

	let xParagraphElem = document.getElementById(sId).cloneNode(true);
	for (let xNode of xParagraphElem.getElementsByClassName("tooltip")) {
		xNode.parentNode.removeChild(xNode);
	}

	return xParagraphElem.textContent;





}

function hideAllTooltips () {
	for (let xElem of document.getElementsByClassName("tooltip_on")) {





		xElem.className = "tooltip";


		xElem.removeAttribute("style");














	}











}

function copyToClipboard () {
	startWaitIcon();
	try {
		document.getElementById("clipboard_msg").textContent = "copie en cours…";

		let sText = "";
		for (let xNode of document.getElementById("errorlist").getElementsByClassName("paragraph")) {
			sText += getPurgedTextOfElem(xNode.id);
			sText += "\n";
		}
		self.port.emit('copyToClipboard', sText);
		document.getElementById("clipboard_msg").textContent = "-> presse-papiers";
		window.setTimeout(function() { document.getElementById("clipboard_msg").textContent = "∑"; } , 3000);
	}
	catch (e) {
		console.log(e.lineNumber + ": " +e.message);
	}
	stopWaitIcon();
}

function startWaitIcon (sIdParagr=null) {
	if (sIdParagr) {
		document.getElementById(sIdParagr).disabled = true;
		document.getElementById(sIdParagr).style.opacity = .3;
	}
	document.getElementById("waiticon").hidden = false;
}

function stopWaitIcon (sIdParagr=null) {
	if (sIdParagr) {
		document.getElementById(sIdParagr).disabled = false;
		document.getElementById(sIdParagr).style.opacity = 1;
	}
	document.getElementById("waiticon").hidden = true;
}

















>
>
>
>
>
>
>
>
|


>
>
>

|
|



|
|
|
|
|
|
|



|



|



|


|
|
>
|
<
>
>


|
|
<
<



|
|
|



|
>
>



|



|
|


|
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<




|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
>
>
|
|
|
|
|
|
|
|
>
>
>
>
|
|




|

>
>
>
>


|
|


>
>
>
>
>
>
|
>
|
>
|
>
>
>
>
|
>
>
>
>
|
>
|
>
>
>
|
>
|
>
>
|
>
>
|
>
>
>
>
>
>
>
>
|
<
>
|

>
>
>
>
>
>
>
>
>
>
>
|
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|
<
>
>
|
>
>
>
>
>
>
|
|
>
>
>
|
<
<
<
|
>
|
|
<
|
<
>
|
|
<
<
|

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
<
|
|
>
|
<
>
>
|
>
>
|
<
|
|
>
>
>
>
|
>
>
|
>
>
>
>
>
>
>
>
>
>
|
<
<
|
|
<
|
|
|
>
|
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
|
>
|
<
|
>
>
>
|
>
>
|
>
|
|
|
<
>
>
>
>
|
>
>
>
>
|
|
>
|
<
|
|
|
>
>
>
|


|
>
|
>
>
|
>
|
>
|
<
<
|
>
|
>
>
>
>
>



|
>
>
>
>
>
|
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>



|
|
|
>
|
|
<
|
|
|
|
|
|
|
|
|
|



|
|
|
|
|



|
|
|
|
|

>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

52
53
54
55
56
57


58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81







82







83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182

183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214

215
216
217
218
219
220
221
222
223
224
225
226
227
228
229



230
231
232
233

234

235
236
237


238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258

259
260
261
262

263
264
265
266
267
268

269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289


290
291

292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327

328
329
330
331
332
333
334
335
336
337
338
339

340
341
342
343
344
345
346
347
348
349
350
351
352

353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371


372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427

428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
// JavaScript

let nPanelWidth = 0;  // must be set at launch
let bExpanded = true;

/*
    Ignored errors
    idendified by <sIgnoredKey>
    sIgnoredKey: <iParagraph:nStart:nEnd:sUnderlined> 
*/
let aIgnoredErrors = new Set();


/*
    Events
*/

showSpecialMessage();


document.getElementById('close').addEventListener("click", function (event) {
    bExpanded = true; // size is reset in ui.js
    self.port.emit('closePanel');
});

document.getElementById('expand_reduce').addEventListener("click", function (event) {
    if (bExpanded) {
        self.port.emit("resize", "reduce", 10); // the number has no meaning here
        bExpanded = false;
    } else {
        self.port.emit("resize", "expand", 10); // the number has no meaning here
        bExpanded = true;
    }
});

document.getElementById('copy_to_clipboard').addEventListener("click", function (event) {
    copyToClipboard();
});

document.getElementById('closemsg').addEventListener("click", function (event) {
    closeMessageBox();
});

self.port.on("setPanelWidth", function (n) {
    nPanelWidth = n;
});

self.port.on("addMessage", function (sClass, sText) {
    addMessage(sClass, sText);
});


self.port.on("addParagraph", function (sText, iParagraph, sJSON) {
    addParagraph(sText, iParagraph, sJSON);
});

self.port.on("refreshParagraph", function (sText, sIdParagr, sJSON) {
    refreshParagraph(sText, sIdParagr, sJSON);


});

self.port.on("showMessage", function (sText) {
    document.getElementById("message").textContent = sText;
    document.getElementById("messagebox").style.display = "block";
    window.setTimeout(closeMessageBox, 20000);
});

self.port.on("clearErrors", function (sHtml) {
    document.getElementById("errorlist").textContent = "";
    aIgnoredErrors.clear();
    hideAllTooltips();
});

self.port.on("start", function() {
    startWaitIcon();
});

self.port.on("end", function() {
    stopWaitIcon();
    document.getElementById("copy_to_clipboard").style.display = "block";
});

self.port.on("suggestionsFor", function (sWord, sSuggestions, sErrId) {







    setSpellSuggestionsFor(sWord, sSuggestions, sErrId);







});


window.addEventListener(
    "click",
    function (xEvent) {
        try {
            let xElem = xEvent.target;
            if (xElem.id) {
                if (xElem.id.startsWith("sugg")) {
                    applySuggestion(xElem.id);
                } else if (xElem.id.endsWith("_ignore")) {
                    ignoreError(xElem.id);
                } else if (xElem.id.startsWith("check")) {
                    sendBackAndCheck(xElem.id);
                /*} else if (xElem.id.startsWith("edit")) {
                    switchEdition(xElem.id);*/
                } else if (xElem.id.startsWith("end")) {
                    document.getElementById(xElem.id).parentNode.parentNode.style.display = "none";
                } else if (xElem.tagName === "U" && xElem.id.startsWith("err")
                           && xElem.className !== "corrected" && xElem.className !== "ignored") {
                    showTooltip(xElem.id);
                } else if (xElem.id.startsWith("resize")) {
                    self.port.emit("resize", xElem.id, 10);
                } else if (xElem.id === "gc_url") {
                    self.port.emit("openURL", xElem.getAttribute("href"));
                } else {
                    hideAllTooltips();
                }
            } else if (xElem.tagName === "A") {
                self.port.emit("openURL", xElem.getAttribute("href"));
            } else {
                hideAllTooltips();
            }
        }
        catch (e) {
            showError(e);
        }
    },
    false
);


/*
    Actions
*/

function showError (e) {
    console.error("\n" + e.fileName + "\n" + e.name + "\nline: " + e.lineNumber + "\n" + e.message);
}

function closeMessageBox () {
    document.getElementById("messagebox").style.display = "none";
    document.getElementById("message").textContent = "";
}

function addMessage (sClass, sText) {
    let xNode = document.createElement("p");
    xNode.className = sClass;
    xNode.textContent = sText;
    document.getElementById("errorlist").appendChild(xNode);
}

function addParagraph (sText, iParagraph, sJSON) {
    try {
        let xNodeDiv = document.createElement("div");
        xNodeDiv.className = "paragraph_block";
        // actions
        let xDivActions = document.createElement("div");
        xDivActions.className = "actions";
        let xDivClose = document.createElement("div");
        xDivClose.id = "end" + iParagraph.toString();
        xDivClose.className = "button red bold";
        xDivClose.textContent = "×";
        xDivActions.appendChild(xDivClose);
        /*let xDivEdit = document.createElement("div");
        xDivEdit.id = "edit" + iParagraph.toString();
        xDivEdit.className = "button";
        xDivEdit.textContent = "Éditer";
        xDivActions.appendChild(xDivEdit);*/
        let xDivCheck = document.createElement("div");
        xDivCheck.id = "check" + iParagraph.toString();
        xDivCheck.className = "button green";
        xDivCheck.textContent = "Réanalyser";
        xDivCheck.setAttribute("title", "Réanalyser le texte");
        xDivActions.appendChild(xDivCheck);
        xNodeDiv.appendChild(xDivActions);
        // paragraph
        let xParagraph = document.createElement("p");
        xParagraph.id = "paragr" + iParagraph.toString();
        xParagraph.lang = "fr";
        xParagraph.setAttribute("spellcheck", false);
        xParagraph.setAttribute("contenteditable", true);
        let oErrors = JSON.parse(sJSON);
        xParagraph.className = (oErrors.aGrammErr.length || oErrors.aSpellErr.length) ? "paragraph softred" : "paragraph";
        _tagParagraph(sText, xParagraph, iParagraph, oErrors.aGrammErr, oErrors.aSpellErr);
        xNodeDiv.appendChild(xParagraph);
        document.getElementById("errorlist").appendChild(xNodeDiv);
    }
    catch (e) {

        showError(e);
    }
}

function refreshParagraph (sText, sIdParagr, sJSON) {
    try {
        let xParagraph = document.getElementById("paragr"+sIdParagr);
        let oErrors = JSON.parse(sJSON);
        xParagraph.className = (oErrors.aGrammErr.length || oErrors.aSpellErr.length) ? "paragraph softred" : "paragraph softgreen";
        xParagraph.textContent = "";
        _tagParagraph(sText, xParagraph, sIdParagr, oErrors.aGrammErr, oErrors.aSpellErr);
    }
    catch (e) {
        showError(e);
    }
}

function _tagParagraph (sParagraph, xParagraph, iParagraph, aSpellErr, aGrammErr) {
    try {
        if (aGrammErr.length === 0  &&  aSpellErr.length === 0) {
            xParagraph.textContent = sParagraph;
            return;
        }
        aGrammErr.push(...aSpellErr);
        aGrammErr.sort(function (a, b) {
            if (a["nStart"] < b["nStart"])
                return -1;
            if (a["nStart"] > b["nStart"])
                return 1;
            return 0;
        });


        let nErr = 0; // we count errors to give them an identifier
        let nEndLastErr = 0;
        for (let oErr of aGrammErr) {
            let nStart = oErr["nStart"];
            let nEnd = oErr["nEnd"];
            if (nStart >= nEndLastErr) {
                oErr['sErrorId'] = iParagraph.toString() + "_" + nErr.toString(); // error identifier
                oErr['sIgnoredKey'] = iParagraph.toString() + ":" + nStart.toString() + ":" + nEnd.toString() + ":" + sParagraph.slice(nStart, nEnd);
                if (nEndLastErr < nStart) {
                    xParagraph.appendChild(document.createTextNode(sParagraph.slice(nEndLastErr, nStart)));
                }
                xParagraph.appendChild(_createError(sParagraph.slice(nStart, nEnd), oErr));
                xParagraph.insertAdjacentHTML("beforeend", "<!-- err_end -->");
                nEndLastErr = nEnd;
            }



            nErr += 1;
        }
        if (nEndLastErr <= sParagraph.length) {
            xParagraph.appendChild(document.createTextNode(sParagraph.slice(nEndLastErr)));

        }

    }
    catch (e) {
        showError(e);


    }
}

function _createError (sUnderlined, oErr) {
    let xNodeErr = document.createElement("u");
    xNodeErr.id = "err" + oErr['sErrorId'];
    xNodeErr.textContent = sUnderlined;
    xNodeErr.dataset.error_id = oErr['sErrorId'];
    xNodeErr.dataset.ignored_key = oErr['sIgnoredKey'];
    xNodeErr.dataset.error_type = (oErr['sType'] === "WORD") ? "spelling" : "grammar";
    /*xNodeErr.setAttribute("href", "#");
    xNodeErr.setAttribute("onclick", "return false;");*/
    if (xNodeErr.dataset.error_type === "grammar") {
        xNodeErr.dataset.gc_message = oErr['sMessage'];
        xNodeErr.dataset.gc_url = oErr['URL'];
        if (xNodeErr.dataset.gc_message.includes(" #")) {
            xNodeErr.dataset.line_id = oErr['sLineId'];
            xNodeErr.dataset.rule_id = oErr['sRuleId'];
        }
        xNodeErr.dataset.suggestions = oErr["aSuggestions"].join("|");
    }

    xNodeErr.className = (aIgnoredErrors.has(xNodeErr.dataset.ignored_key)) ? "ignored" : "error " + oErr['sType'];
    return xNodeErr;
}


function applySuggestion (sSuggId) { // sugg
    try {
        let sErrorId = document.getElementById(sSuggId).dataset.error_id;
        let sIdParagr = sErrorId.slice(0, sErrorId.indexOf("_"));
        startWaitIcon("paragr"+sIdParagr);
        let xNodeErr = document.getElementById("err" + sErrorId);

        xNodeErr.textContent = document.getElementById(sSuggId).textContent;
        xNodeErr.className = "corrected";
        xNodeErr.removeAttribute("style");
        self.port.emit("correction", sIdParagr, getPurgedTextOfParagraph("paragr"+sIdParagr));
        hideAllTooltips();
        stopWaitIcon("paragr"+sIdParagr);
    }
    catch (e) {
        showError(e);
    }
}

function ignoreError (sIgnoreButtonId) {  // ignore
    try {
        //console.log("ignore button: " + sIgnoreButtonId + " // error id: " + document.getElementById(sIgnoreButtonId).dataset.error_id);
        let xNodeErr = document.getElementById("err"+document.getElementById(sIgnoreButtonId).dataset.error_id);
        aIgnoredErrors.add(xNodeErr.dataset.ignored_key);
        xNodeErr.className = "ignored";
        xNodeErr.removeAttribute("style");
        hideAllTooltips();
    }


    catch (e) {
        showError(e);

    }
}

function showTooltip (sNodeErrorId) {  // err
    try {
        hideAllTooltips();
        let xNodeErr = document.getElementById(sNodeErrorId);
        let sTooltipId = (xNodeErr.dataset.error_type === "grammar") ? "gc_tooltip" : "sc_tooltip";
        let xNodeTooltip = document.getElementById(sTooltipId);
        let xNodeTooltipArrow = document.getElementById(sTooltipId+"_arrow"); 
        let nLimit = nPanelWidth - 330; // paragraph width - tooltip width
        xNodeTooltipArrow.style.top = (xNodeErr.offsetTop + 16) + "px"
        xNodeTooltipArrow.style.left = (xNodeErr.offsetLeft + Math.floor((xNodeErr.offsetWidth / 2))-4) + "px" // 4 is half the width of the arrow.
        xNodeTooltip.style.top = (xNodeErr.offsetTop + 20) + "px";
        xNodeTooltip.style.left = (xNodeErr.offsetLeft > nLimit) ? nLimit + "px" : xNodeErr.offsetLeft + "px";
        if (xNodeErr.dataset.error_type === "grammar") {
            // grammar error
            if (xNodeErr.dataset.gc_message.includes(" ##")) {
                let n = xNodeErr.dataset.gc_message.indexOf(" ##");
                document.getElementById("gc_message").textContent = xNodeErr.dataset.gc_message.slice(0, n);
                document.getElementById("gc_rule_id").textContent = "Règle : " + xNodeErr.dataset.gc_message.slice(n+2);
                document.getElementById("gc_rule_id").style.display = "block";
            } else {
                document.getElementById("gc_message").textContent = xNodeErr.dataset.gc_message;
            }
            if (xNodeErr.dataset.gc_url != "") {
                document.getElementById("gc_url").style.display = "inline";
                document.getElementById("gc_url").setAttribute("href", xNodeErr.dataset.gc_url);
            } else {
                document.getElementById("gc_url").style.display = "none";
            }
            document.getElementById("gc_ignore").dataset.error_id = xNodeErr.dataset.error_id;
            let iSugg = 0;
            let xGCSugg = document.getElementById("gc_sugg_block");
            xGCSugg.textContent = "";
            if (xNodeErr.dataset.suggestions.length > 0) {

                for (let sSugg of xNodeErr.dataset.suggestions.split("|")) {
                    xGCSugg.appendChild(_createSuggestion(xNodeErr.dataset.error_id, iSugg, sSugg));
                    xGCSugg.appendChild(document.createTextNode(" "));
                    iSugg += 1;
                }
            } else {
                xGCSugg.textContent = "Aucune.";
            }
        }
        xNodeTooltipArrow.style.display = "block";
        xNodeTooltip.style.display = "block";
        if (xNodeErr.dataset.error_type === "spelling") {

            // spelling mistake
            document.getElementById("sc_ignore").dataset.error_id = xNodeErr.dataset.error_id;
            //console.log("getSuggFor: " + xNodeErr.textContent.trim() + " // error_id: " + xNodeErr.dataset.error_id);
            self.port.emit("getSuggestionsForTo", xNodeErr.textContent.trim(), xNodeErr.dataset.error_id);
        }
    }
    catch (e) {
        showError(e);
    }
}

function _createSuggestion (sErrId, iSugg, sSugg) {
    let xNodeSugg = document.createElement("a");

    xNodeSugg.id = "sugg" + sErrId + "-" + iSugg.toString();
    xNodeSugg.className = "sugg";
    /*xNodeSugg.setAttribute("href", "#");
    xNodeSugg.setAttribute("onclick", "return false;");*/
    xNodeSugg.dataset.error_id = sErrId;
    xNodeSugg.textContent = sSugg;
    return xNodeSugg;
}

/*function switchEdition (sEditButtonId) {  // edit
    let xParagraph = document.getElementById("paragr" + sEditButtonId.slice(4));
    if (xParagraph.hasAttribute("contenteditable") === false
        || xParagraph.getAttribute("contenteditable") === "false") {
        xParagraph.setAttribute("contenteditable", true);
        document.getElementById(sEditButtonId).className = "button orange";
        xParagraph.focus();
    } else {
        xParagraph.setAttribute("contenteditable", false);
        document.getElementById(sEditButtonId).className = "button";


    }
}*/

function sendBackAndCheck (sCheckButtonId) {  // check
    startWaitIcon();
    let sIdParagr = sCheckButtonId.slice(5);
    self.port.emit("modifyAndCheck", sIdParagr, getPurgedTextOfParagraph("paragr"+sIdParagr));
    stopWaitIcon();
}

function hideAllTooltips () {
    document.getElementById("gc_tooltip").style.display = "none";
    document.getElementById("gc_rule_id").style.display = "none";
    document.getElementById("sc_tooltip").style.display = "none";
    document.getElementById("gc_tooltip_arrow").style.display = "none";
    document.getElementById("sc_tooltip_arrow").style.display = "none";
}

function setSpellSuggestionsFor (sWord, sSuggestions, sErrId) {
    // spell checking suggestions
    try {
        // console.log("setSuggestionsFor: " + sWord + " > " + sSuggestions + " // " + sErrId);
        let xSuggBlock = document.getElementById("sc_sugg_block");
        xSuggBlock.textContent = "";
        if (sSuggestions === "") {
            xSuggBlock.appendChild(document.createTextNode("Aucune."));
        } else if (sSuggestions.startsWith("#")) {
            xSuggBlock.appendChild(document.createTextNode(sSuggestions));
        } else {
            let lSugg = sSuggestions.split("|");
            let iSugg = 0;
            for (let sSugg of lSugg) {
                xSuggBlock.appendChild(_createSuggestion(sErrId, iSugg, sSugg));
                xSuggBlock.appendChild(document.createTextNode(" "));
                iSugg += 1;
            }
        }
    }
    catch (e) {
        showError(e);
    }
}

function getPurgedTextOfParagraph (sNodeParagrId) {
    let sText = document.getElementById(sNodeParagrId).textContent;
    sText = sText.replace(/&nbsp;/g, " ").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&amp;/g, "&");
    return sText;
}

function copyToClipboard () {
    startWaitIcon();
    try {
        let xClipboardButton = document.getElementById("clipboard_msg");
        xClipboardButton.textContent = "copie en cours…";
        let sText = "";
        for (let xNode of document.getElementById("errorlist").getElementsByClassName("paragraph")) {

            sText += xNode.textContent + "\n";
        }
        self.port.emit('copyToClipboard', sText);
        xClipboardButton.textContent = "-> presse-papiers";
        window.setTimeout(function() { xClipboardButton.textContent = "∑"; } , 3000);
    }
    catch (e) {
        console.log(e.lineNumber + ": " +e.message);
    }
    stopWaitIcon();
}

function startWaitIcon (sIdParagr=null) {
    if (sIdParagr) {
        document.getElementById(sIdParagr).disabled = true;
        document.getElementById(sIdParagr).style.opacity = .3;
    }
    document.getElementById("waiticon").hidden = false;
}

function stopWaitIcon (sIdParagr=null) {
    if (sIdParagr) {
        document.getElementById(sIdParagr).disabled = false;
        document.getElementById(sIdParagr).style.opacity = 1;
    }
    document.getElementById("waiticon").hidden = true;
}

function showSpecialMessage () {
    if (Date.now() < Date.UTC(2017, 6, 12)) {
        try {
            document.getElementById('special_message').style.display = "block";
            document.getElementById('errorlist').style.padding = "20px 20px 30px 20px";
        } catch (e) {
            showError(e);
        }
    }
}

Added gc_lang/fr/xpi/data/img/Algoo_logo.png version [59954b3904].

cannot compute difference between binary files

Added gc_lang/fr/xpi/data/img/gc_tooltip_arrow.png version [07b309ad1f].

cannot compute difference between binary files

Added gc_lang/fr/xpi/data/img/sc_tooltip_arrow.png version [ff68f117f3].

cannot compute difference between binary files

Modified gc_lang/fr/xpi/data/lxg_panel.css from [beaf75f9d5] to [3d666aa76c].

38
39
40
41
42
43
44



45
46
47
48
49
50
51
52
53
54



55



56
57



58



59
60
61
62
63
64
65
66
67
68
69
    padding: 5px 50px;
    background-color: hsla(0, 0%, 75%, 1);
    color: hsla(0, 0%, 96%, 1);
    border-radius: 5px;
    text-align: center;
    font-size: 20px;
}



#wordlist ul {
    margin: 0 0 5px 40px;
}
#wordlist b {
    background-color: hsla(150, 50%, 50%, 1);
    color: hsla(0, 0%, 96%, 1);
    padding: 2px 5px;
    border-radius: 2px;
    text-decoration: none;
}



#wordlist b.unknown {



    background-color: hsla(0, 50%, 50%, 1);
}



#wordlist b.nb {



    background-color: hsla(210, 50%, 50%, 1);
}
#wordlist b.mbok {
    background-color: hsla(60, 50%, 50%, 1);
}
#wordlist s {
    color: hsla(0, 0%, 60%, 1);
    text-decoration: none;
}
#wordlist .textline {
    text-decoration: bold;







>
>
>




|





>
>
>
|
>
>
>


>
>
>
|
>
>
>


|
|







38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
    padding: 5px 50px;
    background-color: hsla(0, 0%, 75%, 1);
    color: hsla(0, 0%, 96%, 1);
    border-radius: 5px;
    text-align: center;
    font-size: 20px;
}
#wordlist .token {
    margin: 8px;
}
#wordlist ul {
    margin: 0 0 5px 40px;
}
#wordlist b {
    background-color: hsla(150, 10%, 50%, 1);
    color: hsla(0, 0%, 96%, 1);
    padding: 2px 5px;
    border-radius: 2px;
    text-decoration: none;
}
#wordlist b.WORD {
    background-color: hsla(150, 50%, 50%, 1);
}
#wordlist b.ELPFX {
    background-color: hsla(150, 30%, 50%, 1);
}
#wordlist b.UNKNOWN {
    background-color: hsla(0, 50%, 50%, 1);
}
#wordlist b.NUM {
    background-color: hsla(180, 50%, 50%, 1);
}
#wordlist b.COMPLEX {
    background-color: hsla(60, 50%, 50%, 1);
}
#wordlist b.SEPARATOR {
    background-color: hsla(210, 50%, 50%, 1);
}
#wordlist b.LINK {
    background-color: hsla(270, 50%, 50%, 1);
}
#wordlist s {
    color: hsla(0, 0%, 60%, 1);
    text-decoration: none;
}
#wordlist .textline {
    text-decoration: bold;

Modified gc_lang/fr/xpi/data/lxg_panel.js from [8999221c88] to [4bd6c52064].

23
24
25
26
27
28
29
30
31
32
33
34

35


36
37
38
39
40
41

42
43
44
45
46
47
48
// Conjugueur
document.getElementById('conjugueur').addEventListener("click", function (event) {
    self.port.emit('openConjugueur');
});
*/

self.port.on("addSeparator", function (sText) {
    if (document.getElementById("wordlist").innerHTML !== "") {
        let xElem = document.createElement("p");
        xElem.className = "separator";
        xElem.innerHTML = sText;
        document.getElementById("wordlist").appendChild(xElem);

    }


});

self.port.on("addElem", function (sHtml) {
    let xElem = document.createElement("div");
    xElem.innerHTML = sHtml;
    document.getElementById("wordlist").appendChild(xElem);

});

self.port.on("clear", function (sHtml) {
    document.getElementById("wordlist").textContent = "";
});

self.port.on("startWaitIcon", function() {







<
<
|
<
<
>
|
>
>


|
<
<
<
>







23
24
25
26
27
28
29


30


31
32
33
34
35
36
37



38
39
40
41
42
43
44
45
// Conjugueur
document.getElementById('conjugueur').addEventListener("click", function (event) {
    self.port.emit('openConjugueur');
});
*/

self.port.on("addSeparator", function (sText) {


    addSeparator(sText);


});

self.port.on("addParagraphElems", function (sJSON) {
    addParagraphElems(sJSON);
});

self.port.on("addMessage", function (sClass, sText) {



    addMessage(sClass, sText);
});

self.port.on("clear", function (sHtml) {
    document.getElementById("wordlist").textContent = "";
});

self.port.on("startWaitIcon", function() {
63
64
65
66
67
68
69





























































70
71
72
73
74
75
76
                self.port.emit("resize", xElem.id, 10);
            }
        }
    },
    false
);































































// display selection

function displayClasses () {
    setHidden("ok", document.getElementById("ok").checked);
    setHidden("mbok", document.getElementById("mbok").checked);
    setHidden("nb", document.getElementById("nb").checked);







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
                self.port.emit("resize", xElem.id, 10);
            }
        }
    },
    false
);


/*
    Actions
*/

function addSeparator (sText) {
    if (document.getElementById("wordlist").textContent !== "") {
        let xElem = document.createElement("p");
        xElem.className = "separator";
        xElem.textContent = sText;
        document.getElementById("wordlist").appendChild(xElem);
    }
}

function addMessage (sClass, sText) {
    let xNode = document.createElement("p");
    xNode.className = sClass;
    xNode.textContent = sText;
    document.getElementById("wordlist").appendChild(xNode);
}

function addParagraphElems (sJSON) {
    try {
        let xNodeDiv = document.createElement("div");
        xNodeDiv.className = "paragraph";
        let lElem = JSON.parse(sJSON);
        for (let oToken of lElem) {
            xNodeDiv.appendChild(createTokenNode(oToken));
        }
        document.getElementById("wordlist").appendChild(xNodeDiv);
    }
    catch (e) {
        console.error("\n" + e.fileName + "\n" + e.name + "\nline: " + e.lineNumber + "\n" + e.message);
        console.error(sJSON);
    }
}

function createTokenNode (oToken) {
    let xTokenNode = document.createElement("div");
    xTokenNode.className = "token " + oToken.sType;
    let xTokenValue = document.createElement("b");
    xTokenValue.className = oToken.sType;
    xTokenValue.textContent = oToken.sValue;
    xTokenNode.appendChild(xTokenValue);
    let xSep = document.createElement("s");
    xSep.textContent = " : ";
    xTokenNode.appendChild(xSep);
    if (oToken.aLabel.length === 1) {
        xTokenNode.appendChild(document.createTextNode(oToken.aLabel[0]));
    } else {
        let xTokenList = document.createElement("ul");
        for (let sLabel of oToken.aLabel) {
            let xTokenLine = document.createElement("li");
            xTokenLine.textContent = sLabel;
            xTokenList.appendChild(xTokenLine);
        }
        xTokenNode.appendChild(xTokenList);
    }
    return xTokenNode;
}


// display selection

function displayClasses () {
    setHidden("ok", document.getElementById("ok").checked);
    setHidden("mbok", document.getElementById("mbok").checked);
    setHidden("nb", document.getElementById("nb").checked);

Modified gc_lang/fr/xpi/data/test_panel.js from [7ad6cf391b] to [c07ad2c400].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// JavaScript

/*
	Events
*/

self.port.on("addElem", function (sHtml) {
	let xElem = document.createElement("p");
	xElem.innerHTML = sHtml;
	document.getElementById("results").appendChild(xElem);
});

self.port.on("clear", function () {
	document.getElementById("results").textContent = "";
});







|
|
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// JavaScript

/*
	Events
*/

self.port.on("addElem", function (sText) {
	let xElem = document.createElement("pre");
	xElem.textContent = sText;
	document.getElementById("results").appendChild(xElem);
});

self.port.on("clear", function () {
	document.getElementById("results").textContent = "";
});

Modified gc_lang/fr/xpi/gce_worker.js from [779e66492e] to [32ac3727dc].

50
51
52
53
54
55
56
57
58

59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74


75
76


77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155









156
157




let lxg = null; // module: lexicographer
let helpers = null;

let oTokenizer = null;
let oDict = null;
let oLxg = null;

function loadGrammarChecker (sGCOptions="") {
    if (gce === null) {

        gce = require("resource://grammalecte/fr/gc_engine.js");
        helpers = require("resource://grammalecte/helpers.js");
        text = require("resource://grammalecte/text.js");
        tkz = require("resource://grammalecte/tokenizer.js");
        lxg = require("resource://grammalecte/fr/lexicographe.js");
        oTokenizer = new tkz.Tokenizer("fr");
        helpers.setLogOutput(worker.log);
        gce.load();
        oDict = gce.getDictionary();
        oLxg = new lxg.Lexicographe(oDict);
        if (sGCOptions !== "") {
            gce.setOptions(helpers.objectToMap(JSON.parse(sGCOptions)));
        }
        // we always retrieve options from the gce, for setOptions filters obsolete options
        return gce.getOptions()._toString();
    }


}



function parse (sText, sLang, bDebug, bContext) {
    let aGrammErr = gce.parse(sText, sLang, bDebug, bContext);
    return JSON.stringify(aGrammErr);
}

function parseAndSpellcheck (sText, sLang, bDebug, bContext) {
    let aGrammErr = gce.parse(sText, sLang, bDebug, bContext);
    let aSpellErr = [];
    for (let oToken of oTokenizer.genTokens(sText)) {
        if (oToken.sType === 'WORD' && !oDict.isValidToken(oToken.sValue)) {
            aSpellErr.push(oToken);
        }
    }
    return JSON.stringify({ aGrammErr: aGrammErr, aSpellErr: aSpellErr });
}

function parseAndTag (sText, iParagraph, sLang, bDebug) {
    sText = text.addHtmlEntities(sText);
    let aSpellErr = [];
    for (let oToken of oTokenizer.genTokens(sText)) {
        if (oToken.sType === 'WORD' && !oDict.isValidToken(oToken.sValue)) {
            aSpellErr.push(oToken);
        }
    }
    let aGrammErr = gce.parse(sText, sLang, bDebug);
    let sHtml = text.tagParagraph(sText, iParagraph, aGrammErr, aSpellErr);
    return sHtml;
}

function parseAndGenerateParagraph (sText, iParagraph, sLang, bDebug) {
    return text.createHTMLBlock(parseAndTag(sText, iParagraph, sLang, bDebug), iParagraph);
}

function getOptions () {
    return gce.getOptions()._toString();
}

function getDefaultOptions () {
    return gce.getDefaultOptions()._toString();
}

function setOptions (sGCOptions) {
    gce.setOptions(helpers.objectToMap(JSON.parse(sGCOptions)));
    return gce.getOptions()._toString();
}

function setOption (sOptName, bValue) {
    gce.setOptions(new Map([ [sOptName, bValue] ]));
    return gce.getOptions()._toString();
}

function resetOptions () {
    gce.resetOptions();
    return gce.getOptions()._toString();
}

function fullTests (sGCOptions="") {
    if (!gce || !oDict) {
        return "# Error: grammar checker or dictionary not loaded."
    }
    let dMemoOptions = gce.getOptions();
    if (sGCOptions) {
        gce.setOptions(helpers.objectToMap(JSON.parse(sGCOptions)));
    }
    let tests = require("resource://grammalecte/tests.js");
    let oTest = new tests.TestGrammarChecking(gce);
    let sAllRes = "";
    for (let sRes of oTest.testParse()) {
        dump(sRes+"\n");
        sAllRes += sRes+"<br/>";
    }
    gce.setOptions(dMemoOptions);
    return sAllRes;
}


// Lexicographer

function analyzeWords (sText) {









    return oLxg.analyzeText(sText);
}











|

>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
>
>
|
|



|
|
|
<
<
<
<
<



<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<

|



|




|




|




|















|








|
>
>
>
>
>
>
>
>
>
|
|
>
>
>
>
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89





90
91
92

















93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
let lxg = null; // module: lexicographer
let helpers = null;

let oTokenizer = null;
let oDict = null;
let oLxg = null;

function loadGrammarChecker (sGCOptions="", sContext="JavaScript") {
    if (gce === null) {
        try {
            gce = require("resource://grammalecte/fr/gc_engine.js");
            helpers = require("resource://grammalecte/helpers.js");
            text = require("resource://grammalecte/text.js");
            tkz = require("resource://grammalecte/tokenizer.js");
            lxg = require("resource://grammalecte/fr/lexicographe.js");
            oTokenizer = new tkz.Tokenizer("fr");
            helpers.setLogOutput(worker.log);
            gce.load(sContext);
            oDict = gce.getDictionary();
            oLxg = new lxg.Lexicographe(oDict);
            if (sGCOptions !== "") {
                gce.setOptions(helpers.objectToMap(JSON.parse(sGCOptions)));
            }
            // we always retrieve options from the gce, for setOptions filters obsolete options
            return gce.getOptions().gl_toString();
        }
        catch (e) {
            worker.log("# Error: " + e.fileName + "\n" + e.name + "\nline: " + e.lineNumber + "\n" + e.message);
        }
    }
}

function parse (sText, sCountry, bDebug, bContext) {
    let aGrammErr = gce.parse(sText, sCountry, bDebug, bContext);
    return JSON.stringify(aGrammErr);
}

function parseAndSpellcheck (sText, sCountry, bDebug, bContext) {
    let aGrammErr = gce.parse(sText, sCountry, bDebug, bContext);
    let aSpellErr = oTokenizer.getSpellingErrors(sText, oDict);





    return JSON.stringify({ aGrammErr: aGrammErr, aSpellErr: aSpellErr });
}


















function getOptions () {
    return gce.getOptions().gl_toString();
}

function getDefaultOptions () {
    return gce.getDefaultOptions().gl_toString();
}

function setOptions (sGCOptions) {
    gce.setOptions(helpers.objectToMap(JSON.parse(sGCOptions)));
    return gce.getOptions().gl_toString();
}

function setOption (sOptName, bValue) {
    gce.setOptions(new Map([ [sOptName, bValue] ]));
    return gce.getOptions().gl_toString();
}

function resetOptions () {
    gce.resetOptions();
    return gce.getOptions().gl_toString();
}

function fullTests (sGCOptions="") {
    if (!gce || !oDict) {
        return "# Error: grammar checker or dictionary not loaded."
    }
    let dMemoOptions = gce.getOptions();
    if (sGCOptions) {
        gce.setOptions(helpers.objectToMap(JSON.parse(sGCOptions)));
    }
    let tests = require("resource://grammalecte/tests.js");
    let oTest = new tests.TestGrammarChecking(gce);
    let sAllRes = "";
    for (let sRes of oTest.testParse()) {
        dump(sRes+"\n");
        sAllRes += sRes+"\n";
    }
    gce.setOptions(dMemoOptions);
    return sAllRes;
}


// Lexicographer

function getListOfElements (sText) {
    try {
        let aElem = [];
        let aRes = null;
        for (let oToken of oTokenizer.genTokens(sText)) {
            aRes = oLxg.getInfoForToken(oToken);
            if (aRes) {
                aElem.push(aRes);
            }
        }
        return JSON.stringify(aElem);
    }
    catch (e) {
        helpers.logerror(e);
    }
}

Modified gc_lang/fr/xpi/package.json from [c511c94ce1] to [5d59e1b94f].

1
2
3
4
5
6
7
8
9
10
11
12
{
  "name": "grammalecte-fr",
  "title": "Grammalecte [fr]",
  "id": "French-GC@grammalecte.net",
  "version": "0.5.16",
  "description": "Correcteur grammatical pour le français",
  "homepage": "http://www.dicollecte.org/grammalecte",
  "main": "ui.js",
  "icon": "data/img/icon-48.png",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },




|







1
2
3
4
5
6
7
8
9
10
11
12
{
  "name": "grammalecte-fr",
  "title": "Grammalecte [fr]",
  "id": "French-GC@grammalecte.net",
  "version": "0.5.19",
  "description": "Correcteur grammatical pour le français",
  "homepage": "http://www.dicollecte.org/grammalecte",
  "main": "ui.js",
  "icon": "data/img/icon-48.png",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },

Modified gc_lang/fr/xpi/ui.js from [e0ebb525c4] to [b479190f2b].

77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
let oTF = null;


function loadGrammarChecker (bSetPanelOptions=false) {
    if (xGCEWorker === null) {
        // Grammar checker
        xGCEWorker = new BasePromiseWorker('chrome://promiseworker/content/gce_worker.js');
        let xPromise = xGCEWorker.post('loadGrammarChecker', [sp.prefs["sGCOptions"]]);
        xPromise.then(
            function (aVal) {
                sp.prefs["sGCOptions"] = aVal;
                if (bSetPanelOptions) {
                    xAboutPanel.port.emit("sendGrammarOptionsToPanel", aVal);
                }
            },







|







77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
let oTF = null;


function loadGrammarChecker (bSetPanelOptions=false) {
    if (xGCEWorker === null) {
        // Grammar checker
        xGCEWorker = new BasePromiseWorker('chrome://promiseworker/content/gce_worker.js');
        let xPromise = xGCEWorker.post('loadGrammarChecker', [sp.prefs["sGCOptions"], "Firefox"]);
        xPromise.then(
            function (aVal) {
                sp.prefs["sGCOptions"] = aVal;
                if (bSetPanelOptions) {
                    xAboutPanel.port.emit("sendGrammarOptionsToPanel", aVal);
                }
            },
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
                xAboutPanel.port.emit("showHelp");
            },
            position: {
                right: 0,
                bottom: 0
            },
            width: 340,
            height: 670
        });

        xAboutPanel.port.emit("calcDefaultPanelHeight");

        xAboutPanel.port.on("setHeight", function (n) {
            xAboutPanel.resize(320, n);
        });







|







164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
                xAboutPanel.port.emit("showHelp");
            },
            position: {
                right: 0,
                bottom: 0
            },
            width: 340,
            height: 730
        });

        xAboutPanel.port.emit("calcDefaultPanelHeight");

        xAboutPanel.port.on("setHeight", function (n) {
            xAboutPanel.resize(320, n);
        });
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
    if (sText.includes("<!-- err_end -->") || sText.includes('<span id="tooltip') || sText.includes('<u id="err')) {
        return false;
    }
    return true;
}

function checkAndSendToPanel (sIdParagraph, sText) {
    let xPromise = xGCEWorker.post('parseAndTag', [sText, parseInt(sIdParagraph), "FR", false]);
    xPromise.then(
        function (aVal) {
            xGCPanel.port.emit("refreshParagraph", sIdParagraph, aVal);
        },
        function (aReason) {
            console.error('Promise rejected - ', aReason);
        }
    ).catch(
        function (aCaught) {
            console.error('Promise Error - ', aCaught);







|


|







345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
    if (sText.includes("<!-- err_end -->") || sText.includes('<span id="tooltip') || sText.includes('<u id="err')) {
        return false;
    }
    return true;
}

function checkAndSendToPanel (sIdParagraph, sText) {
    let xPromise = xGCEWorker.post('parseAndSpellcheck', [sText, "FR", false, false]);
    xPromise.then(
        function (aVal) {
            xGCPanel.port.emit("refreshParagraph", sText, sIdParagraph, aVal);
        },
        function (aReason) {
            console.error('Promise rejected - ', aReason);
        }
    ).catch(
        function (aCaught) {
            console.error('Promise Error - ', aCaught);
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
    combo: "accel-shift-f11",
    onPress: function () {
        createGCPanel();
        if (!xGCPanel.isShowing) {
            xGCPanel.show({position: xMainButton});
        }
        xActiveWorker = null;
        sendTextToPanel("Je connait ma <i>destinées</i>. Un jour s'attachera à mon nom le souvenir de quelque chose de formidable, "
                      + "- le souvenir dune crise comme il n'y en eut jamaiss sur terre, le souvenir de la plus profonde collision des consciences, "
                      + "le souvenirs d’un jugement prononcé contre tout tout ce qui jusqu’à présent à été cru, exigé, sanctifié. "
                      + "Je ne suis pas un homme, je suis de la dynamite. Et, avec cela, il n’y a en moi rien d’un fondateur de religion. "
                      + "Les religions sont les affaires de la populace. "
                      + "J’aie besoin de me laver les mains, après avoir été en contact avec des hommes religieux...\n"
                      + "Vous, je parie que vous n’appriéciez guère le concept de vidéoprotection. Y a t’il pourtant rien de plus sécurisant ?");
    }
});

async function sendTextToPanel (sText) {
    xGCPanel.port.emit("clearErrors");
    xGCPanel.port.emit("start");
    loadGrammarChecker();
    let iParagraph = 0; // index of paragraphs, used for identification
    let nParagraph = 0; // non empty paragraphs
    let sRes = "";
    try {
        sText = sText.normalize("NFC"); // remove combining diacritics
        for (let sParagraph of text.getParagraph(sText)) {
            if (sParagraph.trim() !== "") {
                sRes = await xGCEWorker.post('parseAndGenerateParagraph', [sParagraph, iParagraph, "FR", false])
                xGCPanel.port.emit("addElem", sRes);
                nParagraph += 1;
            }
            iParagraph += 1;
        }
        xGCPanel.port.emit("addElem", '<p class="message">' + _("numberOfParagraphs") + " " + nParagraph + '</p>');
    }
    catch (e) {
        xGCPanel.port.emit("addElem", '<p class="bug">' + e.message + '</p>');
    }
    xGCPanel.port.emit("end");
}


/*
    Text Formatter







|
|
|
|

















|
|




|


|







393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
    combo: "accel-shift-f11",
    onPress: function () {
        createGCPanel();
        if (!xGCPanel.isShowing) {
            xGCPanel.show({position: xMainButton});
        }
        xActiveWorker = null;
        sendTextToPanel('"Je" connait ma <i>destinées</i>. Un jour sattachera à mon nom le souvenir de quelque chose de formidable, '
                      + "- le souvenir d'une crise comme il n'y en eut jamaiss sur terre, le souvenir de la plus profonde collision des consciences, "
                      + "le souvenirs d’un jugement prononcé contre tout tout se qui jusqu’à présent à été cru, exigé, sanctifié. "
                      + "Je ne sui pas un homme, je suis de la dynamite. Et, avec cela, il n’y a en moi rien d’un fondateur de religion. "
                      + "Les religions sont les affaires de la populace. "
                      + "J’aie besoin de me laver les mains, après avoir été en contact avec des hommes religieux...\n"
                      + "Vous, je parie que vous n’appriéciez guère le concept de vidéoprotection. Y a t’il pourtant rien de plus sécurisant ?");
    }
});

async function sendTextToPanel (sText) {
    xGCPanel.port.emit("clearErrors");
    xGCPanel.port.emit("start");
    loadGrammarChecker();
    let iParagraph = 0; // index of paragraphs, used for identification
    let nParagraph = 0; // non empty paragraphs
    let sRes = "";
    try {
        sText = sText.normalize("NFC"); // remove combining diacritics
        for (let sParagraph of text.getParagraph(sText)) {
            if (sParagraph.trim() !== "") {
                sRes = await xGCEWorker.post('parseAndSpellcheck', [sParagraph, "FR", false, false]);
                xGCPanel.port.emit("addParagraph", sParagraph, iParagraph, sRes);
                nParagraph += 1;
            }
            iParagraph += 1;
        }
        xGCPanel.port.emit("addMessage", 'message', _("numberOfParagraphs") + " " + nParagraph);
    }
    catch (e) {
        xGCPanel.port.emit("addMessage", 'bug', e.message);
    }
    xGCPanel.port.emit("end");
}


/*
    Text Formatter
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
    xLxgPanel.port.emit("addSeparator", _("separator"));
    loadGrammarChecker();
    let nParagraph = 0; // non empty paragraphs
    let sRes = "";
    try {
        for (let sParagraph of text.getParagraph(sText)) {
            if (sParagraph.trim() !== "") {
                sRes = await xGCEWorker.post('analyzeWords', [sParagraph])
                xLxgPanel.port.emit("addElem", sRes);
                nParagraph += 1;
            }
        }
        xLxgPanel.port.emit("addElem", '<p class="message">' + _("numberOfParagraphs") + " " + nParagraph + '</p>');
    }
    catch (e) {
        xLxgPanel.port.emit("addElem", '<p class="bug">'+e.message+"</p>");
    }
    xLxgPanel.port.emit("stopWaitIcon");
}


/*
    Conjugueur







|
|



|


|







567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
    xLxgPanel.port.emit("addSeparator", _("separator"));
    loadGrammarChecker();
    let nParagraph = 0; // non empty paragraphs
    let sRes = "";
    try {
        for (let sParagraph of text.getParagraph(sText)) {
            if (sParagraph.trim() !== "") {
                sRes = await xGCEWorker.post('getListOfElements', [sParagraph]);
                xLxgPanel.port.emit("addParagraphElems", sRes);
                nParagraph += 1;
            }
        }
        xLxgPanel.port.emit("addMessage", 'message', _("numberOfParagraphs") + " " + nParagraph);
    }
    catch (e) {
        xLxgPanel.port.emit("addMessage", 'bug', e.message);
    }
    xLxgPanel.port.emit("stopWaitIcon");
}


/*
    Conjugueur

Modified helpers.py from [dc81791c7e] to [4468e2a847].

1
2
3

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# Useful tools

import os

import zipfile

from distutils import dir_util, file_util
from string import Template


class cd:
    "Context manager for changing the current working directory"
    def __init__ (self, newPath):
        self.newPath = os.path.expanduser(newPath)

    def __enter__ (self):
        self.savedPath = os.getcwd()
        os.chdir(self.newPath)

    def __exit__ (self, etype, value, traceback):
        os.chdir(self.savedPath)


def unzip (spfZip, spDest, bCreatePath=False):
    "unzip file <spfZip> at <spfDest>"
    if spDest:
        if bCreatePath and not os.path.exists(spDest):
            dir_util.mkpath(spDest)
        print("> unzip in: "+ spDest)
        spInstall = os.path.abspath(spDest)
        if os.path.isdir(spInstall):
            eraseFolder(spInstall)
            with zipfile.ZipFile(spfZip) as hZip:
                hZip.extractall(spDest)
        else:
            print("# folder not found")
    else:
        print("path destination is empty")


def eraseFolder (sp):
    "erase content of a folder"
    # recursive!!!
    for sf in os.listdir(sp):
        spf = sp + "/" + sf

        if os.path.isdir(spf):
            eraseFolder(spf)
        else:
            try:
                os.remove(spf)
            except:
                print("%s not removed" % spf)


def createCleanFolder (sp):
    "make an empty folder or erase its content if not empty"
    if not os.path.exists(sp):
        dir_util.mkpath(sp)
    else:
        eraseFolder(sp)


def fileFile (spf, dVars):
    "return file <spf> as a text filed with variables from <dVars>"
    return Template(open(spf, "r", encoding="utf-8").read()).safe_substitute(dVars)



>


<




















|














<

|
>
|
|
|
<
|
|
|





|







1
2
3
4
5
6

7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

42
43
44
45
46
47

48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# Useful tools

import os
import shutil
import zipfile


from string import Template


class cd:
    "Context manager for changing the current working directory"
    def __init__ (self, newPath):
        self.newPath = os.path.expanduser(newPath)

    def __enter__ (self):
        self.savedPath = os.getcwd()
        os.chdir(self.newPath)

    def __exit__ (self, etype, value, traceback):
        os.chdir(self.savedPath)


def unzip (spfZip, spDest, bCreatePath=False):
    "unzip file <spfZip> at <spfDest>"
    if spDest:
        if bCreatePath and not os.path.exists(spDest):
            os.makedirs(spDest, exist_ok=True)
        print("> unzip in: "+ spDest)
        spInstall = os.path.abspath(spDest)
        if os.path.isdir(spInstall):
            eraseFolder(spInstall)
            with zipfile.ZipFile(spfZip) as hZip:
                hZip.extractall(spDest)
        else:
            print("# folder not found")
    else:
        print("path destination is empty")


def eraseFolder (sp):
    "erase content of a folder"

    for sf in os.listdir(sp):
        spf = os.path.join(sp, sf)
        try:
            if os.path.isfile(spf):
                os.unlink(spf)
            elif os.path.isdir(spf):

                shutil.rmtree(spf)
        except Exception as e:
            print(e)


def createCleanFolder (sp):
    "make an empty folder or erase its content if not empty"
    if not os.path.exists(sp):
        os.makedirs(sp, exist_ok=True)
    else:
        eraseFolder(sp)


def fileFile (spf, dVars):
    "return file <spf> as a text filed with variables from <dVars>"
    return Template(open(spf, "r", encoding="utf-8").read()).safe_substitute(dVars)

Added lex_build.py version [a7e2785f63].











































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!python3

# Lexicon builder

import argparse
from distutils import dir_util

import grammalecte.dawg as fsa
from grammalecte.ibdawg import IBDAWG


def build (spfSrc, sLangName, sDicName, bJSON=False, cStemmingMethod="S", nCompressMethod=1):
    "transform a text lexicon as a binary indexable dictionary"
    oDAWG = fsa.DAWG(spfSrc, sLangName, cStemmingMethod)
    dir_util.mkpath("grammalecte/_dictionaries")
    oDAWG.writeInfo("grammalecte/_dictionaries/" + sDicName + ".info.txt")
    oDAWG.createBinary("grammalecte/_dictionaries/" + sDicName + ".bdic", int(nCompressMethod))
    if bJSON:
        dir_util.mkpath("grammalecte-js/_dictionaries")
        oDic = IBDAWG(sDicName + ".bdic")
        oDic.writeAsJSObject("grammalecte-js/_dictionaries/" + sDicName + ".json")


def main ():
    xParser = argparse.ArgumentParser()
    xParser.add_argument("src_lexicon", type=str, help="path and file name of the source lexicon")
    xParser.add_argument("lang_name", type=str, help="language name")
    xParser.add_argument("dic_name", type=str, help="dictionary file name (without extension)")
    xParser.add_argument("-js", "--json", help="Build dictionary in JSON", action="store_true")
    xParser.add_argument("-s", "--stemming", help="stemming method: S=suffixes, A=affixes, N=no stemming", type=str, choices=["S", "A", "N"], default="S")
    xParser.add_argument("-c", "--compress", help="compression method: 1, 2 (beta), 3, (beta)", type=int, choices=[1, 2, 3], default=1)
    xArgs = xParser.parse_args()
    build(xArgs.src_lexicon, xArgs.lang_name, xArgs.dic_name, xArgs.json)
    

if __name__ == '__main__':
    main()

Modified lexicons/French.lex from [7dc71055f4] to [588a2842c8].

more than 10,000 changes

Modified make.py from [418a36d3bb] to [463ccc04c8].

9
10
11
12
13
14
15

16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import traceback
import configparser
import datetime
import argparse
import importlib
import unittest
import json


from distutils import dir_util, file_util

import dialog_bundled
import compile_rules
import helpers


sWarningMessage = "The content of this folder is generated by code and replaced at each build.\n"


def getConfig (sLang):
    xConfig = configparser.SafeConfigParser()
    xConfig.optionxform = str
    try:
        xConfig.read("gc_lang/" + sLang + "/config.ini", encoding="utf-8")
    except:
        print("Config file in project [" + sLang + "] not found")
        exit()
    return xConfig


def createOptionsLabelProperties (dOptLbl):
    sContent = ""
    for sOpt, tLabel in dOptLbl.items():







>

















|







9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import traceback
import configparser
import datetime
import argparse
import importlib
import unittest
import json
import platform

from distutils import dir_util, file_util

import dialog_bundled
import compile_rules
import helpers


sWarningMessage = "The content of this folder is generated by code and replaced at each build.\n"


def getConfig (sLang):
    xConfig = configparser.SafeConfigParser()
    xConfig.optionxform = str
    try:
        xConfig.read("gc_lang/" + sLang + "/config.ini", encoding="utf-8")
    except:
        print("# Error. Can’t read config file [" + sLang + "]")
        exit()
    return xConfig


def createOptionsLabelProperties (dOptLbl):
    sContent = ""
    for sOpt, tLabel in dOptLbl.items():
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
def createOXT (spLang, dVars, dOxt, spLangPack, bInstall):
    "create extension for Writer"
    print("Building extension for Writer")
    spfZip = "_build/" + dVars['name'] + "-"+ dVars['lang'] +"-v" + dVars['version'] + '.oxt'
    hZip = zipfile.ZipFile(spfZip, mode='w', compression=zipfile.ZIP_DEFLATED)

    # Package and parser
    copyGrammalectePyPackageInZipFile(hZip, spLangPack, dVars['py_binary_dic'], "pythonpath/")
    hZip.write("cli.py", "pythonpath/cli.py")

    # Extension files
    hZip.writestr("META-INF/manifest.xml", helpers.fileFile("gc_core/py/oxt/manifest.xml", dVars))
    hZip.writestr("description.xml", helpers.fileFile("gc_core/py/oxt/description.xml", dVars))
    hZip.writestr("Linguistic.xcu", helpers.fileFile("gc_core/py/oxt/Linguistic.xcu", dVars))
    hZip.writestr("Grammalecte.py", helpers.fileFile("gc_core/py/oxt/Grammalecte.py", dVars))







|







73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
def createOXT (spLang, dVars, dOxt, spLangPack, bInstall):
    "create extension for Writer"
    print("Building extension for Writer")
    spfZip = "_build/" + dVars['name'] + "-"+ dVars['lang'] +"-v" + dVars['version'] + '.oxt'
    hZip = zipfile.ZipFile(spfZip, mode='w', compression=zipfile.ZIP_DEFLATED)

    # Package and parser
    copyGrammalectePyPackageInZipFile(hZip, spLangPack, dVars['dic_name']+".bdic", "pythonpath/")
    hZip.write("cli.py", "pythonpath/cli.py")

    # Extension files
    hZip.writestr("META-INF/manifest.xml", helpers.fileFile("gc_core/py/oxt/manifest.xml", dVars))
    hZip.writestr("description.xml", helpers.fileFile("gc_core/py/oxt/description.xml", dVars))
    hZip.writestr("Linguistic.xcu", helpers.fileFile("gc_core/py/oxt/Linguistic.xcu", dVars))
    hZip.writestr("Grammalecte.py", helpers.fileFile("gc_core/py/oxt/Grammalecte.py", dVars))
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
    with open("server_options."+sLang+".ini", "w", encoding="utf-8", newline="\n") as hDst:
        hDst.write("# Server options. Lang: " + sLang + "\n\n[gc_options]\n")
        for sSection, lOpt in dOptData["lStructOpt"]:
            hDst.write("\n########## " + dOptData["dOptLabel"][sLang].get(sSection, sSection + "[no label found]")[0] + " ##########\n")
            for lLineOpt in lOpt:
                for sOpt in lLineOpt:
                    hDst.write("# " + dOptData["dOptLabel"][sLang].get(sOpt, "[no label found]")[0] + "\n")
                    hDst.write(sOpt + " = " + ("1" if dOptData["dOptPython"].get(sOpt, None) else "0") + "\n")
        hDst.write("html = 1\n")


def createServerZip (sLang, dVars, spLangPack):
    "create server zip"
    spfZip = "_build/" + dVars['name'] + "-"+ dVars['lang'] +"-v" + dVars['version'] + '.zip'
    hZip = zipfile.ZipFile(spfZip, mode='w', compression=zipfile.ZIP_DEFLATED)
    copyGrammalectePyPackageInZipFile(hZip, spLangPack, dVars['py_binary_dic'])
    for spf in ["cli.py", "server.py", "bottle.py", "server_options._global.ini", "server_options."+sLang+".ini", \
                "README.txt", "LICENSE.txt", "LICENSE.fr.txt"]:
        hZip.write(spf)
    hZip.writestr("setup.py", helpers.fileFile("gc_lang/fr/setup.py", dVars))


def copyGrammalectePyPackageInZipFile (hZip, spLangPack, sDicName, sAddPath=""):







|







|







143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
    with open("server_options."+sLang+".ini", "w", encoding="utf-8", newline="\n") as hDst:
        hDst.write("# Server options. Lang: " + sLang + "\n\n[gc_options]\n")
        for sSection, lOpt in dOptData["lStructOpt"]:
            hDst.write("\n########## " + dOptData["dOptLabel"][sLang].get(sSection, sSection + "[no label found]")[0] + " ##########\n")
            for lLineOpt in lOpt:
                for sOpt in lLineOpt:
                    hDst.write("# " + dOptData["dOptLabel"][sLang].get(sOpt, "[no label found]")[0] + "\n")
                    hDst.write(sOpt + " = " + ("1" if dOptData["dOptServer"].get(sOpt, None) else "0") + "\n")
        hDst.write("html = 1\n")


def createServerZip (sLang, dVars, spLangPack):
    "create server zip"
    spfZip = "_build/" + dVars['name'] + "-"+ dVars['lang'] +"-v" + dVars['version'] + '.zip'
    hZip = zipfile.ZipFile(spfZip, mode='w', compression=zipfile.ZIP_DEFLATED)
    copyGrammalectePyPackageInZipFile(hZip, spLangPack, dVars['dic_name']+".bdic")
    for spf in ["cli.py", "server.py", "bottle.py", "server_options._global.ini", "server_options."+sLang+".ini", \
                "README.txt", "LICENSE.txt", "LICENSE.fr.txt"]:
        hZip.write(spf)
    hZip.writestr("setup.py", helpers.fileFile("gc_lang/fr/setup.py", dVars))


def copyGrammalectePyPackageInZipFile (hZip, spLangPack, sDicName, sAddPath=""):
236
237
238
239
240
241
242


243
244
245
246
247
248
249
                sCodePlugins += "\n\n" + open(spLang+'/modules-js/'+sf, "r", encoding="utf-8").read()
                print(sf, end=", ")
        print()
        dVars["pluginsJS"] = sCodePlugins

        # options data struct
        dVars["dOptJavaScript"] = json.dumps(list(dVars["dOptJavaScript"].items()))


        
        # create folder
        spLangPack = "grammalecte-js/"+sLang
        helpers.createCleanFolder(spLangPack)

        # create files
        for sf in os.listdir("gc_core/js"):







>
>







237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
                sCodePlugins += "\n\n" + open(spLang+'/modules-js/'+sf, "r", encoding="utf-8").read()
                print(sf, end=", ")
        print()
        dVars["pluginsJS"] = sCodePlugins

        # options data struct
        dVars["dOptJavaScript"] = json.dumps(list(dVars["dOptJavaScript"].items()))
        dVars["dOptFirefox"] = json.dumps(list(dVars["dOptFirefox"].items()))
        dVars["dOptThunderbird"] = json.dumps(list(dVars["dOptThunderbird"].items()))
        
        # create folder
        spLangPack = "grammalecte-js/"+sLang
        helpers.createCleanFolder(spLangPack)

        # create files
        for sf in os.listdir("gc_core/js"):
273
274
275
276
277
278
279
280


281
282
283
284
285
286

287
288
289
290




291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
    return dVars['version']


def main ():
    print("Python: " + sys.version)
    xParser = argparse.ArgumentParser()
    xParser.add_argument("lang", type=str, nargs='+', help="lang project to generate (name of folder in /lang)")
    xParser.add_argument("-b", "--build_data", help="launch build_data.py", action="store_true")


    xParser.add_argument("-d", "--dict", help="generate FSA dictionary", action="store_true")
    xParser.add_argument("-t", "--tests", help="run unit tests", action="store_true")
    xParser.add_argument("-p", "--perf", help="run performance tests", action="store_true")
    xParser.add_argument("-pm", "--perf_memo", help="run performance tests and store results in perf_memo.txt", action="store_true")
    xParser.add_argument("-js", "--javascript", help="JavaScript build for Firefox", action="store_true")
    xParser.add_argument("-fx", "--firefox", help="Launch Firefox Nightly for XPI testing", action="store_true")

    xParser.add_argument("-tb", "--thunderbird", help="Launch Thunderbird", action="store_true")
    xParser.add_argument("-i", "--install", help="install the extension in Writer (path of unopkg must be set in config.ini)", action="store_true")
    xArgs = xParser.parse_args()





    dir_util.mkpath("_build")
    dir_util.mkpath("grammalecte")
    dir_util.mkpath("grammalecte-js")

    for sLang in xArgs.lang:
        if os.path.exists("gc_lang/"+sLang) and os.path.isdir("gc_lang/"+sLang):
            xConfig = getConfig(sLang)
            dVars = xConfig._sections['args']

            # copy gc_core common file in Python now to be able to compile dictionary if required
            for sf in os.listdir("gc_core/py"):
                if not os.path.isdir("gc_core/py/"+sf):
                    helpers.copyAndFileTemplate("gc_core/py/"+sf, "grammalecte/"+sf, dVars)
            open("grammalecte/WARNING.txt", "w", encoding="utf-8", newline="\n").write(sWarningMessage)

            # build data
            build_data_module = None
            if xArgs.build_data:
                # lang data
                try:
                    build_data_module = importlib.import_module("gc_lang."+sLang+".build_data")
                except ImportError:
                    print("# Error. Couldn’t import file build_data.py in folder gc_lang/"+sLang)
            if build_data_module:
                build_data_module.before('gc_lang/'+sLang, dVars, xArgs.javascript)
            if xArgs.dict or not os.path.exists("grammalecte/_dictionaries"):
                import grammalecte.dawg as fsa
                from grammalecte.ibdawg import IBDAWG
                # fsa builder
                oDAWG = fsa.DAWG(dVars['lexicon_src'], dVars['lang_name'], dVars['stemming_method'])
                dir_util.mkpath("grammalecte/_dictionaries")
                oDAWG.writeInfo("grammalecte/_dictionaries/" + dVars['py_binary_dic'] + ".info.txt")
                oDAWG.createBinary("grammalecte/_dictionaries/" + dVars['py_binary_dic'], int(dVars['fsa_method']))
                if xArgs.javascript:
                    dir_util.mkpath("grammalecte-js/_dictionaries")
                    oDic = IBDAWG(dVars['py_binary_dic'])
                    #oDic.writeAsJSObject("gc_lang/"+sLang+"/modules-js/dictionary.js")
                    oDic.writeAsJSObject("grammalecte-js/_dictionaries/"+dVars['js_binary_dic'])
            if build_data_module:
                build_data_module.after('gc_lang/'+sLang, dVars, xArgs.javascript)

            # make
            sVersion = create(sLang, xConfig, xArgs.install, xArgs.javascript, )

            # tests
            if xArgs.tests or xArgs.perf or xArgs.perf_memo:







|
>
>





|
>




>
>
>
>

















|





|


<
<
|
|
<
<
<
<
<
<
<
<
|







276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326


327
328








329
330
331
332
333
334
335
336
    return dVars['version']


def main ():
    print("Python: " + sys.version)
    xParser = argparse.ArgumentParser()
    xParser.add_argument("lang", type=str, nargs='+', help="lang project to generate (name of folder in /lang)")
    xParser.add_argument("-b", "--build_data", help="launch build_data.py (part 1 and 2)", action="store_true")
    xParser.add_argument("-bb", "--build_data_before", help="launch build_data.py (only part 1: before dictionary building)", action="store_true")
    xParser.add_argument("-ba", "--build_data_after", help="launch build_data.py (only part 2: before dictionary building)", action="store_true")
    xParser.add_argument("-d", "--dict", help="generate FSA dictionary", action="store_true")
    xParser.add_argument("-t", "--tests", help="run unit tests", action="store_true")
    xParser.add_argument("-p", "--perf", help="run performance tests", action="store_true")
    xParser.add_argument("-pm", "--perf_memo", help="run performance tests and store results in perf_memo.txt", action="store_true")
    xParser.add_argument("-js", "--javascript", help="JavaScript build for Firefox", action="store_true")
    xParser.add_argument("-fx", "--firefox", help="Launch Firefox Developper for Adden-SDK testing", action="store_true")
    xParser.add_argument("-we", "--web_ext", help="Launch Firefox Nightly for WebExtension testing", action="store_true")
    xParser.add_argument("-tb", "--thunderbird", help="Launch Thunderbird", action="store_true")
    xParser.add_argument("-i", "--install", help="install the extension in Writer (path of unopkg must be set in config.ini)", action="store_true")
    xArgs = xParser.parse_args()

    if xArgs.build_data:
        xArgs.build_data_before = True
        xArgs.build_data_after = True

    dir_util.mkpath("_build")
    dir_util.mkpath("grammalecte")
    dir_util.mkpath("grammalecte-js")

    for sLang in xArgs.lang:
        if os.path.exists("gc_lang/"+sLang) and os.path.isdir("gc_lang/"+sLang):
            xConfig = getConfig(sLang)
            dVars = xConfig._sections['args']

            # copy gc_core common file in Python now to be able to compile dictionary if required
            for sf in os.listdir("gc_core/py"):
                if not os.path.isdir("gc_core/py/"+sf):
                    helpers.copyAndFileTemplate("gc_core/py/"+sf, "grammalecte/"+sf, dVars)
            open("grammalecte/WARNING.txt", "w", encoding="utf-8", newline="\n").write(sWarningMessage)

            # build data
            build_data_module = None
            if xArgs.build_data_before or xArgs.build_data_after:
                # lang data
                try:
                    build_data_module = importlib.import_module("gc_lang."+sLang+".build_data")
                except ImportError:
                    print("# Error. Couldn’t import file build_data.py in folder gc_lang/"+sLang)
            if build_data_module and xArgs.build_data_before:
                build_data_module.before('gc_lang/'+sLang, dVars, xArgs.javascript)
            if xArgs.dict or not os.path.exists("grammalecte/_dictionaries"):


                import lex_build
                lex_build.build(dVars['lexicon_src'], dVars['lang_name'], dVars['dic_name'], xArgs.javascript, dVars['stemming_method'], int(dVars['fsa_method']))








            if build_data_module and xArgs.build_data_after:
                build_data_module.after('gc_lang/'+sLang, dVars, xArgs.javascript)

            # make
            sVersion = create(sLang, xConfig, xArgs.install, xArgs.javascript, )

            # tests
            if xArgs.tests or xArgs.perf or xArgs.perf_memo:
347
348
349
350
351
352
353


354




355
356
357
358
359
360
361
362
363
364
                    if xArgs.perf or xArgs.perf_memo:
                        hDst = open("./gc_lang/"+sLang+"/perf_memo.txt", "a", encoding="utf-8", newline="\n")  if xArgs.perf_memo  else None
                        tests.perf(sVersion, hDst)

            # Firefox
            if xArgs.firefox:
                with helpers.cd("_build/xpi/"+sLang):


                    os.system("jpm run -b nightly")





            # Thunderbird
            if xArgs.thunderbird:
                os.system("thunderbird -jsconsole -P debug")
        else:
            print("Folder not found: gc_lang/"+sLang)


if __name__ == '__main__':
    main()







>
>
|
>
>
>
>










347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
                    if xArgs.perf or xArgs.perf_memo:
                        hDst = open("./gc_lang/"+sLang+"/perf_memo.txt", "a", encoding="utf-8", newline="\n")  if xArgs.perf_memo  else None
                        tests.perf(sVersion, hDst)

            # Firefox
            if xArgs.firefox:
                with helpers.cd("_build/xpi/"+sLang):
                    spfFirefox = dVars['win_fx_dev_path']  if platform.system() == "Windows"  else dVars['linux_fx_dev_path']
                    os.system('jpm run -b "' + spfFirefox + '"')

            if xArgs.web_ext:
                with helpers.cd("_build/webext/"+sLang):
                    spfFirefox = dVars['win_fx_nightly_path']  if platform.system() == "Windows"  else dVars['linux_fx_nightly_path']
                    os.system(r'web-ext run --firefox="' + spfFirefox + '" --browser-console')            

            # Thunderbird
            if xArgs.thunderbird:
                os.system("thunderbird -jsconsole -P debug")
        else:
            print("Folder not found: gc_lang/"+sLang)


if __name__ == '__main__':
    main()

Modified reader.py from [510a35b7df] to [0c60e1da75].

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

20
21
22
23
24
25
26
27
28
29

30
31
32
33
34
35
36
#!python3


import os
import sys
import re

import grammalecte.ibdawg as ibdawg

oDict = ibdawg.IBDAWG("French.bdic")


def readFile (spf):
    if os.path.isfile(spf):
        with open(spf, "r", encoding="utf-8") as hSrc:
            for sLine in hSrc:
                yield sLine
    else:
        print("# Error: file not found.")



def createFile (spfSrc, spfDst):
    with open(spfDst, "w", encoding="utf-8") as hDst:
        for sLine in readFile(spfSrc):
            sLine = sLine.strip()
            if sLine:
                for sWord in sLine.split():
                    if not oDict.isValid(sWord): 
                        hDst.write(sWord+"\n")



def createLexStatFile (spf, dStat):
    dWord = {}
    for i, sLine in enumerate(readFile(spf)):
        if not sLine.startswith("#"):
            sWord = sLine.strip()
            if sWord not in dWord:

>


















>

|
|







>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!python3
# Just a file for one-shot scripts

import os
import sys
import re

import grammalecte.ibdawg as ibdawg

oDict = ibdawg.IBDAWG("French.bdic")


def readFile (spf):
    if os.path.isfile(spf):
        with open(spf, "r", encoding="utf-8") as hSrc:
            for sLine in hSrc:
                yield sLine
    else:
        print("# Error: file not found.")

# --------------------------------------------------------------------------------------------------

def listUnknownWords (spf):
    with open(spf+".res.txt", "w", encoding="utf-8") as hDst:
        for sLine in readFile(spfSrc):
            sLine = sLine.strip()
            if sLine:
                for sWord in sLine.split():
                    if not oDict.isValid(sWord): 
                        hDst.write(sWord+"\n")

# --------------------------------------------------------------------------------------------------

def createLexStatFile (spf, dStat):
    dWord = {}
    for i, sLine in enumerate(readFile(spf)):
        if not sLine.startswith("#"):
            sWord = sLine.strip()
            if sWord not in dWord:
48
49
50
51
52
53
54
55
56
57
58
59
60
61

62



















63
64

    for sLine in readFile(spf):
        if not sLine.startswith("#"):
            sWord, sCount = sLine.split()
            dStat[sWord] = dStat.get(sWord, 0) + int(sCount)
    return dStat


def main ():
    dStat = {}
    readStatFile("stats1.txt", dStat)
    readStatFile("stats2.txt", dStat)
    readStatFile("stats3.txt", dStat)
    createLexStatFile("propositions.txt", dStat)
    





















if __name__ == '__main__' :
    main()








|





|
>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

<
>
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86

87
    for sLine in readFile(spf):
        if not sLine.startswith("#"):
            sWord, sCount = sLine.split()
            dStat[sWord] = dStat.get(sWord, 0) + int(sCount)
    return dStat


def readStatFilesAndCreateLexicon ():
    dStat = {}
    readStatFile("stats1.txt", dStat)
    readStatFile("stats2.txt", dStat)
    readStatFile("stats3.txt", dStat)
    createLexStatFile("propositions.txt", dStat)

# --------------------------------------------------------------------------------------------------

def isMoreThanOneSetInList (lSet):
    aFirst = lSet.pop(0)
    for aSet in lSet:
        if aSet != aFirst:
            return True
    return False

def filterLinesWithWordsWithDifferentStems (spf):
    with open(spf+".res.txt", "w", encoding="utf-8") as hDst:
        for sLine in readFile(spf):
            lStemSet = [ set(oDict.stem(sWord))  for sWord in sLine.strip().split()]
            if isMoreThanOneSetInList(lStemSet):
                hDst.write(sLine)

def filterHomophonicWords ():
    filterLinesWithWordsWithDifferentStems("homophones.txt")

# --------------------------------------------------------------------------------------------------

if __name__ == '__main__' :

    filterHomophonicWords()

Modified server.py from [f2aebf4d47] to [f6702400a5].

139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
    if bEmptyIfNoErrors and not aGrammErrs and not aSpellErrs:
        return ""
    return "  " + json.dumps({ "iParagraph": iParagraph, "lGrammarErrors": aGrammErrs, "lSpellingErrors": aSpellErrs }, ensure_ascii=False)
    

if __name__ == '__main__':

    gce.load()
    echo("Grammalecte v{}".format(gce.version))
    dServerOptions = getServerOptions()
    dGCOptions = getConfigOptions("fr")
    if dGCOptions:
        gce.setOptions(dGCOptions)
    dServerGCOptions = gce.getOptions()
    echo("Grammar options:\n" + " | ".join([ k + ": " + str(v)  for k, v in sorted(dServerGCOptions.items()) ]))







|







139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
    if bEmptyIfNoErrors and not aGrammErrs and not aSpellErrs:
        return ""
    return "  " + json.dumps({ "iParagraph": iParagraph, "lGrammarErrors": aGrammErrs, "lSpellingErrors": aSpellErrs }, ensure_ascii=False)
    

if __name__ == '__main__':

    gce.load("Server")
    echo("Grammalecte v{}".format(gce.version))
    dServerOptions = getServerOptions()
    dGCOptions = getConfigOptions("fr")
    if dGCOptions:
        gce.setOptions(dGCOptions)
    dServerGCOptions = gce.getOptions()
    echo("Grammar options:\n" + " | ".join([ k + ": " + str(v)  for k, v in sorted(dServerGCOptions.items()) ]))

Modified server_options.fr.ini from [9838e78202] to [d739170097].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Server options. Lang: fr

[gc_options]

########## Typographie ##########
# Signes typographiques
typo = 1
# Apostrophe typographique
apos = 1
# Espaces surnuméraires
esp = 1
# Tabulations surnuméraires
tab = 0
# Espaces insécables
nbsp = 1
# Espaces insécables avant unités de mesure
unit = 1
# Traits d’union
tu = 1
# Majuscules












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Server options. Lang: fr

[gc_options]

########## Typographie ##########
# Signes typographiques
typo = 1
# Apostrophe typographique
apos = 1
# Espaces surnuméraires
esp = 1
# Tabulations surnuméraires
tab = 1
# Espaces insécables
nbsp = 1
# Espaces insécables avant unités de mesure
unit = 1
# Traits d’union
tu = 1
# Majuscules

Modified tests/fr/formateur_de_texte.odt from [0fbb935ea9] to [d7d8a124ac].

cannot compute difference between binary files