{"version":3,"file":"index.e00b622a.js","sources":["../../vite/modulepreload-polyfill","../../src/constants.tsx","../../src/utils.tsx","../../src/GameDataProvider.tsx","../../src/icons.tsx","../../src/GameCompleteBanner.tsx","../../src/share.tsx","../../src/GameShare.tsx","../../src/GameTile.tsx","../../src/Header.tsx","../../src/Keyboard.tsx","../../src/ResizeObserverPoly.tsx","../../src/Statistics.tsx","../../src/Tutorial.tsx","../../src/Parameters.tsx","../../src/Game.tsx","../../src/NotFound.tsx","../../src/App.tsx","../../src/index.tsx"],"sourcesContent":["const p = function polyfill() {\n const relList = document.createElement('link').relList;\n if (relList && relList.supports && relList.supports('modulepreload')) {\n return;\n }\n for (const link of document.querySelectorAll('link[rel=\"modulepreload\"]')) {\n processPreload(link);\n }\n new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.type !== 'childList') {\n continue;\n }\n for (const node of mutation.addedNodes) {\n if (node.tagName === 'LINK' && node.rel === 'modulepreload')\n processPreload(node);\n }\n }\n }).observe(document, { childList: true, subtree: true });\n function getFetchOpts(script) {\n const fetchOpts = {};\n if (script.integrity)\n fetchOpts.integrity = script.integrity;\n if (script.referrerpolicy)\n fetchOpts.referrerPolicy = script.referrerpolicy;\n if (script.crossorigin === 'use-credentials')\n fetchOpts.credentials = 'include';\n else if (script.crossorigin === 'anonymous')\n fetchOpts.credentials = 'omit';\n else\n fetchOpts.credentials = 'same-origin';\n return fetchOpts;\n }\n function processPreload(link) {\n if (link.ep)\n // ep marker = processed\n return;\n link.ep = true;\n // prepopulate the load record\n const fetchOpts = getFetchOpts(link);\n fetch(link.href, fetchOpts);\n }\n};__VITE_IS_MODERN__&&p();","import { RelativeTimeFormatUnit } from \"./types\";\n\nexport const NUM_GAMES_X = 2;\nexport const NUM_GAMES_Y = 2;\nexport const NUM_GAMES = NUM_GAMES_X * NUM_GAMES_Y;\nexport const GAME_ROWS = 9;\nexport const GAME_COLS = 5;\n\nexport const TimeUnits: { [unit in RelativeTimeFormatUnit]: number } = {\n year: 24 * 60 * 60 * 1000 * 365,\n month: (24 * 60 * 60 * 1000 * 365) / 12,\n day: 24 * 60 * 60 * 1000,\n hour: 60 * 60 * 1000,\n minute: 60 * 1000,\n second: 1000,\n};\n\nexport const START_DATE = new Date(\"02/14/2022\");\nexport const GAME_PERIOD_MS = TimeUnits.day;\n\nexport const ALPHABET = \"abcdefghijklmnopqrstuvwxyz?\";\n\nexport const KEYBOARD_KEYS_AZERTY = [\n [\"A\", \"Z\", \"E\", \"R\", \"T\", \"Y\", \"U\", \"I\", \"O\", \"P\"],\n [\"Q\", \"S\", \"D\", \"F\", \"G\", \"H\", \"J\", \"K\", \"L\", \"M\"],\n [\"bs2\", \"W\", \"X\", \"C\", \"V\", \"B\", \"N\", \"?\", \"enter2\"]\n];\n\nexport const KEYBOARD_KEYS_QWERTY = [\n [\"Q\",\"W\",\"E\",\"R\",\"T\",\"Y\",\"U\",\"I\",\"O\",\"P\"],\n [\"A\",\"S\",\"D\",\"F\",\"G\",\"H\",\"J\",\"K\",\"L\", \"?\"],\n [\"bs2\",\"Z\",\"X\",\"C\",\"V\",\"B\",\"N\",\"M\",\"enter2\"]\n];\n\nexport const IS_IOS =\n [\n \"ipad simulator\",\n \"iphone simulator\",\n \"ipod simulator\",\n \"ipad\",\n \"iphone\",\n \"ipod\",\n ].indexOf(navigator.platform.toLowerCase()) >= 0 ||\n (navigator.userAgent.toLowerCase().includes(\"mac\") &&\n \"ontouchend\" in document);\nexport const IS_IN_WEB_APP_IOS =\n // @ts-ignore\n \"standalone\" in window.navigator && window.navigator[\"standalone\"] === true;\nexport const IS_IN_WEB_VIEW_IOS =\n /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(navigator.userAgent);\nexport const IS_IN_WEB_VIEW_ANDROID = \"Android\" in window;\nexport const IS_IN_WEB_APP_CHROME = window.matchMedia(\n \"(display-mode: standalone)\"\n).matches;\n\nexport const CAN_SHARE_TEXT =\n // @ts-ignore\n navigator.share &&\n navigator.canShare &&\n navigator.canShare({ text: \"test share text\" });\nexport const CAN_SHARE_IMAGE =\n // @ts-ignore\n navigator.share &&\n navigator.canShare &&\n navigator.canShare({\n text: \"test share text\",\n files: [new File([new Blob()], \"test.png\", { type: \"image/png\" })],\n });\nexport const CAN_COPY_CLIPBOARD =\n !!navigator.clipboard && !IS_IN_WEB_VIEW_ANDROID;\n\nexport const BLACKLIST = [\"aeros\",\"adacs\",\"adavs\",\"afats\",\"agnie\",\"airco\",\"akans\",\"alloc\",\"ammis\",\"amuit\",\"anona\",\"archs\",\"artys\",\"asado\",\"asdic\",\"asics\",\"avahi\",\"awacs\",\"babel\",\"baous\",\"basie\",\"betie\",\"betis\",\"bomme\",\"bouzy\",\"brand\",\"brent\",\"brios\",\"bulbs\",\"burgs\",\"bushs\",\"buzet\",\"byeri\",\"cajan\",\"calfs\",\"canus\",\"carys\",\"cates\",\"cavea\",\"cobol\",\"crows\",\"daces\",\"dahls\",\"daris\",\"decca\",\"dendi\",\"dhals\",\"doina\",\"dolby\",\"dolma\",\"domus\",\"dosha\",\"eprom\",\"exits\",\"fanny\",\"facho\",\"fibro\",\"field\",\"filos\",\"firth\",\"fixin\",\"frape\",\"gamou\",\"ghees\",\"gitee\",\"gnawa\",\"golgi\",\"goyas\",\"groma\",\"hands\",\"hifis\",\"hopie\",\"igbos\",\"inchs\",\"inies\",\"inuks\",\"invit\",\"ismes\",\"jasee\",\"jatis\",\"jello\",\"jives\",\"jomon\",\"judos\",\"judru\",\"jumps\",\"junks\",\"khobz\",\"klaft\",\"kokas\",\"lambs\",\"laobe\",\"lavra\",\"lirac\",\"lisps\",\"lloyd\",\"lobie\",\"lonzo\",\"lonzu\",\"lugee\",\"lyoba\",\"makos\",\"malms\",\"mamas\",\"mansa\",\"matif\",\"mayos\",\"meiji\",\"memee\",\"metas\",\"mings\",\"mohos\",\"mojos\",\"monep\",\"moocs\",\"mulud\",\"naevi\",\"nagis\",\"nahua\",\"nicam\",\"nobel\",\"novis\",\"nubas\",\"nuers\",\"orval\",\"otomi\",\"ounce\",\"paean\",\"paros\",\"perfo\",\"pette\",\"pezes\",\"phaco\",\"phots\",\"picas\",\"plouk\",\"plugs\",\"poins\",\"popaa\",\"popup\",\"posca\",\"pound\",\"poyas\",\"puees\",\"punus\",\"qings\",\"quilt\",\"reals\",\"redon\",\"rokhs\",\"rolls\",\"rully\",\"saami\",\"sacys\",\"sammy\",\"saras\",\"scuds\",\"secam\",\"secus\",\"seltz\",\"sensa\",\"seums\",\"sezig\",\"shans\",\"shire\",\"shoyu\",\"sials\",\"simas\",\"slums\",\"smics\",\"smoks\",\"snifs\",\"sombe\",\"songs\",\"souna\",\"spats\",\"spita\",\"spite\",\"swins\",\"taals\",\"tahrs\",\"taiji\",\"tangs\",\"tanns\",\"tassa\",\"taxus\",\"tefal\",\"tekee\",\"tekes\",\"tenno\",\"tezig\",\"tilts\",\"topee\",\"tumba\",\"ummas\",\"valga\",\"vinyl\",\"viole\",\"viola\",\"viols\",\"wasps\",\"wimax\",\"wurms\"];\nexport const BLACKLIST_SET = new Set(BLACKLIST);\n/* Liste de mots choisis dans le jeu - Copyright Desmaths.fr */\nexport const ANSWERS = \"abats abbes abces abdos abees abers abeti abies abime ables abois aboli abord abots about aboye abras abrie abris abuse abute abyme acces accot accro accru accus acere achar achat acide acier acmes acnes acons acras acres actee acter actes actif actus aculs adage adent adieu admis adnee adnes adobe adore adret adule aeree aerer aeres aeros afare afars affin affut afros after agace agame agape agate agees agent agglo agies agile agios agite agoni agora agree agreg agres aguis ahane ahans ahuri aiche aidee aider aides aieul aieux aigle aigre aigri aigus ailee ailes aille aimee aimer aimes ainee aines ainsi aioli airee airer aires aisee aises ajonc ajour ajout ajuts akene album aleas alene alese alevi aleze alfas algal algie algue alias alibi alien alite alize allee aller alles allie alloc aloes alors alose alpes alpha alpin alter altos alule alune aluni alvin alyte amant amati amble ambon ambre amene amere amers amies amigo amont amour amphi ample ampli amuie amuir amuis amure amuse anale anars anaux anche ancre anees aneth anges angle angor anier anime anise annal annee anniv anode anons ansee anses antan antre aorte aoute aouts apero aphte apide apiol aplat apnee apode appas appat appel appli appui aprem apres aptes apure apyre arabe arase arbre arche archi arcon ardue ardus arena arene arete argon argot argue argus arias aride arise armee armer armes arobe arome arque arret asile asine asins aspes aspic aspis assec assez assis assos astre atele athee athle atlas atoll atome atone atour atout atres aubes aubin aucun audio audit augee auges auget aulne auner aunes aussi autan autel autos autre avale avals avant avare avens avent avenu avere avers aveux avide avien avili avine avion avise avive avoir avoue avoye avril awale axant axees axels axene axial axone ayant azobe azote azure azurs azyme babas babel babil babys bache bacle bacon badee bader badge badin baffe bafre bagel baggy bagne bagou bague bahut baies baine bains baise balai bales balle balte bamba banal banco bancs bande bangs banjo banne banni baque barbe barbu barde barge baril barjo baron barre barri basal basee baser bases basin basse basta batee bater bates batie batir batis baton batte battu bauge baume bavee baver baves bayer bazar beant beate beats beauf beaux bebes beche becot becte bedes bedon begue beige belee beler belge belle bemol benef benet benie benin benir benis benji benne berce beret berge berne beryl betas betee betes beton bette beurk bevue biais biaxe bible biche bicol bides bidet bidon biens biere biffe bigle bigre bijou biker bilan bilee biler biles bilie bille bimbo binee biner bines bingo biome biote bipee biper bipes bique bisee biser bises bison bisou bizut black blame blanc blase bleds bleme blemi blese blets bleue bleui bleus blini blocs blogs blond blues bluff blute bobos bocal bocks bodys boeuf bogue boide boire boise boite bolee bolet bombe bonde bondi bonds bongo bonif bonis bonne bonte bonus booms boost boots borde bords borne borts boson bosse bossu botes botox botte boucs boude bouee boues bouge boule boums bourg bouse bouts bovin boxee boxer boxes boxon boyau brade brais brait brame brase brave bravo braye break brefs brele breve bribe brick bride brief brime brins brios brise brocs brode broum brout broye bruit brule brume brune bruni bruns brute bruts buche buees bugge buggy bulbe bulle bulot buque burin buses buste butee buter butes butin butte buvee buzze bytes cabas cable cabot cabre cabri cacao cacas cacha cache caddy cadet cador cadre caduc cafes cafte cagee cages caget cahot caids cajan cajet cajou cakes calee caler cales calin calme calmi calot camee cameo camer cames campe camps camus canal candi canee caner canes canif canin canne canoe canon canot canut caoua capee caper capes capot capte caque carat carbo cargo carie carpe carre carte casee caser cases cashs casse caste catas catch cates catie catir catis cause cavee caver caves ceans cedee ceder cedes cedex cedre ceint celee celer celes celle celte celui cenes cense cents cepes cerfs cerne cesar cesse cette chair chais chale champ chant chaos chape chapo chars chats chaud chaux cheap check chefs chene chenu chere cheri chers cheve chics chien chili chine chino chiot chipe chipo chips choco chocs choir choix chome chope chose choux choye chtis chues chute chuts cible cidre ciels cieux cille cimes cines ciree cirer cires citee citer cites civet civil clair clame clamp clans clape clapi claps clash clean clebs clefs clerc clics clims clins clips clive clodo clone clope clore close cloud cloue clous clown clubs coach cobra cocas coche cocon cocos cocue cocus codec codee coder codes codex coeur cogne cohue coing coins coite colas colin colis colle coloc colon colos colza comas combe combi combo comme compo comte concu cones conge conne connu conso conte cools copie copte coque corde corne cornu corpo corps corse cosse cossu cosys cotee coter cotes cotie cotir cotis coton cotte couac coude couic coule coupe coups cours court couru cousu coute couts couve couvi couvs crabe crack cracs crade crado craie crame crane crans craps crash crawl credo creee creer crees creme crepe crepi crepu crete crets creux creve crics criee crier cries crime crins crise croco crocs croix cross cruel crues cubee cuber cubes cubis cucul cucus cuire cuirs cuite cuits culot culte cumin cumul curee curer cures curie curry cuvee cuver cuves cyans cycle cyclo cygne cymes dadas dague dahus daims daine dalle damee damer dames damne dance dandy danse darde dards daron datee dater dates datte daube deale deals debat debit debut decan decas deces deche dechu decor decos decru decue decus dedie dedit defie defis degat degel degre delai delie delit delta demie demis demon demos denie denim denis dense dente dents dentu denue depit deplu depot derby desir detox dette deuil devie devin devis devon devot diapo dicos dicte diese diete dieux digit digne digue dilue dinar dinde diner dingo diode dires dirlo disco dispo dites divan divas dives divin dixit djeun docks docte docus dodos dodue dodus dogme doigt dojos dolby dolce dolee doler doles domes doner dongs donne donut dopee doper dopes doree dorer dores dormi dosee doser doses dosse dotee doter dotes douce douci douee douer doues doute douve douze doyen drain drame drape draps drift dring drink drive droit drole drone drues drums duale duaux ducal duche dudit duels duits dunes dunks dupee duper dupes durci duree durer dures durit duses duvet ebahi ebats ebene eboue ecale ecart echec echee echer eches echos echue echus ecime eclat eclos ecole ecolo ecope ecote ecran ecrie ecrin ecrit ecrou ecrue ecrus ecule ecume ecure edens edile edite edito edits effet egale egard egare egaux egaye egide egout elans elave elegi eleve elfes elide eliee elier elies elime elire elite elles eloge elude elues email emane emaux embue embus emiee emier emies emirs emise emois emoji empli emues emule encan encas encre endos enfer enfin enfle enfui engin enjeu enlie ennui enoue entee enter entes entre envie envoi envol epair epais epars epate epave epees epele epice epiee epier epies epieu epile epine epoux epris epuce epure equin erbue ergot erige erode errer esche essai esses essor etage etain etale etals etame etang etant etape etats etaye etete ether etier etige etire etocs etole etres etron etude etuis etuve euros evade evase eveil event evide evier evite exact exams exces exclu exeat exema exige exigu exile exils exits exode expat expie expos extra fable faces fache facho facon fadee fader fades fagot faims faine faire faite faits fakes fakir fallu falot famee fames fanal fanee faner fanes fange fanny fanon faons farad farce farci farde fards farte faste fatal fatum faune faute fauve faxee faxer faxes fayot fecal feces fedes feint felee feler feles felin felon femme femur fendu fenil fente ferie ferle ferme ferre ferry ferue ferus fesse fessu fetee feter fetes fetus feues feule feves fiant fibre fibro fiche fichu ficus fiees fiefs field fiels fiere fiers figee figer figes figue filee filer files filet filin fille filme filmo films filon filou final fines finie finir finis fiole fioul firme fiscs fissa fixee fixer fixes fjord flags flair flanc flane flans flapi flash fleau flein flets fleur flics flint flirt flood flops flore flots floue flous flows fluer fluet fluor fluos flute flyer focal focus foies foils foins foire folie folio folle fonce fonde fonds fondu fonge fonte force forci foree forer foret forge forme forte forts forum fosse fouee fouet fouie fouir fouis foule fours foutu foyer frais franc frape frase fraye frein frele fremi frene frere frete frets frics frigo frime fripe frire frise frite frits frocs froid frole front froue fruit fuels fugue fuies fuite fulls fumee fumer fumes fumet funes funin funky furax furet furia furie fusee fuser fuses fusil futal futee futes futon futur gabie gache gadin gaffe gagas gagee gager gages gagne gaies gaine gains gaite galas galbe gales galet galon galop gamba gamer gamin gamma gamme gangs ganse gante gants garce garde garee garer gares garni garou gaspi gatee gater gates gaudi gaule gavee gaver gaves gazee gazer gazes gazon geais geant geeke geeks geint gelee geler geles gelif gemie gemir gemis gemme genal genee gener genes genie genou genre gente gents geode geole gerbe gerce geree gerer geres germe gesir geste gibet gibus gicle gifle gigas gigot gilet girls girly giron gitan gitee giter gites givre glace glams gland glane glapi glati glebe globe glose gloss gloup gluee gluer glues gluis glume gnole gnome gnons gnouf gnous goals gobee gober gobes gobie godet gogol gogos gojis golem golfe gomme gonde gonds gongs gores goret gorge gosse gouda gouge goule goulu gourd goure goute gouts goutu graal grace grade graff grafs grain grand graus graux grave gravi grebe grecs greee green greer grees grege grele grene grenu grese greve grief grill grils grime grips grise grive grogs groin grole groom gruau grues gruge gruon grute guars guede gueee gueer guees guepe guere gueri guete guets gueux gugus guide guili guipe guise gurus gusse gyres gyrin habit hable hache hacke hadal haies haiku haine halal halde halee haler hales halle halls halos halte hamac hampe hante happe haras harde hardi harki harle harpe harts hases hatee hater hates hatif haute hauts havee haver haves havie havir havis havre hayon hebdo helas helee heler heles helio helix hello henne henni herbe herbu heron heros herse hertz hetre heure heurs heurt hiant hibou hiees hifis hihan hippo hippy hisse hiver hobby hoche homes homme homos honni honte horde hosto hotel hotes hotte hotus houee houer houes houle house huant huche huees huile humee humer humes humus huppe hures hurle husky hutin hutte hydre hyene hymen hymne hyper hypes hypne icone ictus ideal ideel idees idiot idole igloo iglou ignee ignes ilets ilien ilots image imams imbue imbus imite immun impec imper impie impot impro impur indes index indic indue indus infos infox infra infus innee innes inoui intox intro invit iodee ioder iodes iodle ioule irien irise islam isole issue issus items itere ivres jable jabot jacos jacot jacte jades jadis jajas jalon jambe jante japon jappe jarre jarte jasee jaser jases jaspe jatte jauge jaune jauni javas javel jazze jazzy jeans jeeps jerke jerks jesus jetee jeter jetes jeton jeudi jeune jodel jodle jogge joice joies joint jojos joker jolie jolis jonce jouee jouer joues jouet jouir joule jours joute joyau jubes juche judas jugal jugee juger juges juifs juins juive jules julie jumpe jumps junky junte jupes jupon juree jurer jures juron jurys juste juter jutes kakis kappa karma karts kawai kawas kayac kayak kebab kekes kepis keufs keums kicks kiefs kifee kifer kifes kiffe kikis kilos kilts kines kitch kites kiwis knack koala kodak kolas krach kraft kurde kyste labbe label labie labos lacee lacer laces lacet lache lacis lacte ladre ladys lagon laics laide laids laies laine laits laius lamee lamer lames lampe lance lande lange lapee laper lapes lapin lapis lapse laque larde lards large largo larme larve laser lasse lasso latex latin latte laure lause lauze lavee laver laves layee layer layes leche lecon ledit legal legat leger leges legos legue lemme lente lents lepre lerot lesee leser leses leste lests letal leurs levee lever leves levis levre liage liane liant libre liche licou liees liege liens lieue lieur lieus lieux lifte lifts light ligne ligot ligue likee liker likes lilas limbe limbo limee limer limes limon liner linge links linon linos lions lippe lippu lisse liste litee liter lites litho litre liure lives livre lobby lobee lober lobes local loche locos lodge lofer lofes lofts logee loger loges login logis logos logue loirs lompe longe longs looke looks lopin loque lords lorry loser loses lotes lotie lotir lotis lotos lotte lotus louee louer loues loufs louis loupe loups lourd loure louve lovee lover loves loyal loyer lubie lucre lueur lugee luger luges luire lumen lunch lundi lunee lunes lupin lupus luron lutee luter lutes luths lutin lutte luxee luxer luxes lycee lycra lyrer lyres lysee lyser lyses mache macho macle macon macro madre mafia mages magie magma magne magot mails mains maint maire major males malin malle malte malts malus maman mamas mambo mamie mamma mammo mammy mamys mande manga mange mango manie manif manip manne manta mante mappe marcs mardi maree mares marge marie marin maris marle marli marne marre masse match matee mater mates maths matie matin matir matis maton matos matou matte mauve maxis mayos mazee mazer mazes meche media medit medoc mefie megas megie megir megis megot melba melee meler meles melon memee memes memos menee mener menes menti menue menus merci meres merle merlu merou messe metal meteo metis metre metro meufs meule meute mezzo miaou miche micro midis miels miens mieux migre miler miles mille mimee mimer mimes mimis mince minci minee miner mines minet minis minou minus miree mirer mires miros misee miser mises misos mitee miter mites mitre mixee mixer mixes mixte moche modal modem modes modif moine moins moire moise moisi moite moiti mokas moles molle molli mollo momes momie monde monos monte monts moocs mooks moque moral mordu morne morse morte morts morue morve motel motif motos motte motus moues moule moult moulu mouts moyee moyen moyer moyes moyeu muant muche mucus muees muets mufle mugie mugir mugis mulch mules mulet mulon mulot munie munir munis mural muree murer mures muret murge murie murin murir muris muron muscs muscu musee muser muses musli musse musts mutee muter mutes mutin myope mythe mytho nabla nable nabot nacho nacre nagee nager nages naifs naine nains naive nanan nanar nanas nanti napee nappe narre nasal nasse natal natif natte naval naves navet navre nazes neant necro neige nenni neons neper nepes nerds nerfs nette neufs neuve neves neveu niais niant niche niece niees niets nille nimbe ninja niole nippe nitre nitro nival nobel noble nocer noces nocif nodal noels noeud noire noirs noise nomme nonce nonne nordi norme notee noter notes notre nouee nouer noues nouet novae novee nover noves noyau noyee noyer noyes nuage nuant nucal nuees nuire nuits nulle nuque nurse nylon oasis obeie obeir obeis obele obere obese obier objet obole obtus obvie occis ocean ocree ocrer ocres octal octet ocule odeon odeur oeils oeufs offre ogive ognon ogres ointe oints oisif oison okapi olive omble ombre omega omise onces oncle ondee ondes ongle opale opens opera opere opine opium opter optes orage orale oraux orbes ordis ordre orees orges orgie orgue ormes ornee orner ornes orpin orque ortie orvet osant oscar osees osier ossue ossus osteo otage otant otees otite ouais ouate oubli ouche ouest ouies ourdi ourle ourse ouste outil outre ouvre ovale ovees ovide ovine ovins ovnis ovule oxyde oyant ozone pacha packs pacse pacte padre pagee pagel pager pages pagne pagre paien paies pains paire pairs pajot palan palee pales palet palie palir palis palle palme palpe palus pamee pamer pames pampa panda panee panel paner panes panne panse pansu pante panty paons papal papas papes papis papys paque parce parcs pardi paree pareo parer pares paria parie paris parka parle parme parmi paroi parti parts party parue parus passe patch patee pater pates patin patio patir patre patte pattu paume pause pavee paver paves pavot payee payer payes peage peaux pecan peche pechu pegre peine peint pekin pelee peler peles pelle penal pendu penil penis penos pense pente pentu pepes pepie pepin pepon perce perco percu perdu peres perfo perfs perif peril perir peris perle perme perms perse perso perte pesee peser peses peson peste pesto petee peter petes petit peton petri peurs peves phare phase philo phone photo piafs piano picot piece pieds piege piers piete pieux pifee pifer pifes piffe pigee piger piges pigne pilaf pilee piler piles pille pilon pilou pince pinot pinte pinup pions pipee piper pipes pipis pipos pique pires pises pisse piste pitch pites pitie piton pitre pitta pivot pixel pizza place plage plaid plaie plain plane plans plant plate plats plebe plein pleur plexi pliee plier plies plint plocs plomb plots plouc plouf plouk ploye pluie plume pneus poche podal poele poeme poete pogne poids poile poils poilu poing point poire poker polar poles polie polio polir polis polka polys pomme pompe ponce ponch pondu poney ponte ponts pools popes popup poque porcs pores porte porto ports posee poser poses poste posts potee poter potes potet potin pouah pouce pouet poufs pouic poule pouls poupe preau prepa prete prets preux prevu priee prier pries prime primo prise prive proba probe procs prods profs proie projo prolo promo promu prone prose proto proue prout proxy prude prune psitt puant pubis pucee pucer puces puche pucks puees puise puits pulls pulpe pulse pumas punch punie punir punis punit punks puree pures purge purin putte putts quads quais quand quant quark quart quasi qubit quels quete queue quiet quota rabat rabes rabot racee racer races racle radar radee rader rades radie radin radio radis rafle rafts rager rages ragot rague raide raidi raids raies rails raine raire raler rales ralle ramee ramer rames rampe rance ranch ranci rando range rangs rapee raper rapes rapia rappe rapts raque rares rasee raser rases rassi rasta ratee rater rates ratio raton ratte raver raves ravie ravin ravir ravis rayee rayer rayes rayon reacs reagi reant rebue rebus rebut recap recel reces reche recif recit recre recru recto recue recul recup recus redac redif redit reduc redue redus reels reelu refus regal regel regie regir regis regle reglo regne reine reins rejet relai relax relie relou relue relui relus remis remix remue renal rendu renee renes renie renne renom rente repas repit repli replu repos repro repue repus resas reste resto retif retro reuni revee rever reves revif revue revus rhino rhume rhums riant rible riche ricin ridee rider rides riens rieur riffe riffs rifle rifts rimee rimer rimes rince rings riote ripee riper ripes ripou rires risee rites rival rivee river rives rivet rixes robee rober robes robin robot roche rocou rodee rodeo roder rodes rogne rogue roidi roles rolle rolls roman rompu ronce ronde rondi ronds ronge roque rosee roser roses rosie rosir rosis rosse rotee roter rotes rotie rotir rotis rotor rouan rouee rouer roues rouet rouge rougi rouie rouir rouis roule round route rover royal ruade ruant ruban rubis ruche rudes ruees rugby rugie rugir rugis ruile ruine rumba runes rupee ruper rupes rupin rural rusee ruser ruses rushs russe sable sabot sabre sacre safre sagas sages saine sains saint saisi sakes salee saler sales salie salin salir salis salle salon salsa salse salto salue salut salve samba samus sangs sante saoul sapee saper sapes sapin saque sasse satan satin sauce saufs sauge saule sauna saune saupe saure sauri saurs saute sauts sauve savon saxos sbire scalp scans sceau scene sciee scier scies scion scoop scoot scope score scout seant seaux sebum seche secte segas seide seine seing seins seize selfs selle selon selve semee semer semes semis senat senne sense senti seoir sepia serbe serfs serie serin serpe serre serte serti serum serve servi seuil seule seuls seums seves sevir sevre sexee sexer sexes sexue sexys shoot short shows shunt siege siens sieur sigle sigma signe silex silos singe sinoc sinon sinue sinus sioux sires sirop sisal sises sites sitot situe skais skate skiee skier skies skiff skifs skins slame slams slash slice slide slims slips slows slurp smack smala smart smash smics smogs smoks smurf snack snobe snobs soaps sobre socio socle sodas sodee sodes soeur sofas softs soies soifs soins soirs sojas solde soles solex solos somme sonar sonde songe sonne sonos sorte sorti sorts sosie sosot sotie sotte souci soude soues souks soule souls soupe sourd souri soute soyer space spams speed spets spire spore sport spots spray squat stade staff stage stand stars stase stats steak stele steno steps stere stick stock stops store stras strie strix style stylo suage suant suave subie subir subis sucee sucer suces sucon sucre suede suees sueur suffi suies suife suifs suint suite suivi sujet sumos supee super supes suppo supra sural sures suret surfe surfs surge surgi surie surir suris sushi swags sweat swing sympa tabac table tabou tache tacle tacos tacot tacts taffe tagge tague taies taire talcs talee taler tales talle talon talus tamis tance tanga tango tanks tanne tante taons tapee taper tapes tapie tapir tapis tapon taque tarde taree tarer tares tarie tarif tarir taris tarot tarse tarte tarti taser tasse tatee tater tates tatie tatin tatis tatou taude tauds taule taupe taxee taxer taxes taxis tchao tchat tchin tecks teddy tefal teint teles telle tempe tempi tempo temps tendu tenia tenir tenor tente tenue tenus terce terme terne terni terre terri terse tesla teste tests tetee teter tetes tetin teton tetra tette tetue tetus teufs texte texto theme these thons thora thugs thune thuya thyms tiare tibia tiede tiedi tiens tiers tiffe tigre tilde tille tilte timon tinte tipis tique tiree tirer tires tiret tison tisse tissu titan titis titre toast tofus toges toile toise toits tolee toles tombe tomee tomer tomes tomme tonal tondo tondu toner tongs tonic tonka tonne tonte tonus topee toper topes topic topos toque torah tordu tores torse torts torve tosse total totem toton totos touee touer toues toure tours toute touts trace tracs tract trahi trail train trait trame trams trapu trash treks trema trend treve trial tribu triee trier tries trigo trike trime trios tripe trips trocs trois troll tronc trone trots troue trous truck trucs truie trust tsars tuage tuant tubas tubee tuber tubes tuees tueur tuile tulle tunee tuner tunes turbo turcs turfs tutos tutus tuyau tweed tweet twist typee typer types typos tyran tzars ubacs ultra ulule ulves unies union unite univs untel urees urger urine urnes ursin usage usant usees usine usite usuel usure utile uvale uvaux vache vagal vagin vagir vague vaine vains vairs valet valse value valus valve vampe vamps vanne vante vapes vapos vaque varan varie vases vaste veaux vecue vecus vegan veine veler veles velin velle velos velte velue velus velux venal vendu venge venin venir vente vents venue venus verbe verdi verge verif verin verni verre verse verso verte verts vertu verve vesou vesse veste vetir vetos vetue vetus veufs veule veuve vexee vexer vexes vibre vices vicie videe video vider vides vieil viele vieux vigie vigil vigne viles villa ville vinee viner vines vingt vinyl viocs viral viree virer vires viril virus visee viser vises vison visse vital vites vitre vivat vives vivre vizir vocal vodka voeux vogue voici voies voila voile voire volee voler voles volet volte volts vomie vomir vomis votee voter votes votif votre vouee vouer voues voulu voute voyou vracs vraie vrais vroom vroum vulve wagon waouh watts wifis wikis wraps xyste yacht yacks yetis yeuse yeyes yodel yodle yogas yoles youpi yoyos yucca zains zanzi zappe zarbi zarbs zebre zebus zelee zeles zeros zeste zigue zincs zippe zizis zoile zombi zonal zonas zonee zoner zones zoome zooms zouke zouks zozos zumba\".split(\" \");\nexport const ANSWERS_SET = new Set(ANSWERS);\nexport const ALLOWED =\n \"abaca abale abats abbes abces abdos abees abers abeti abies abima abime ables aboie abois aboli abord abots about aboya aboye abras abria abrie abris abusa abuse abuta abute abyme acais acare acces accon accot accro accru accul accus acera acere achar achat acheb aches acide acier acini acmes acnes acons acore acras acres actai actas actat actee acter actes actez actif actus aculs acyle adacs adage adavs addax adent adieu adire adjar admet admis admit adnee adnes adobe adonc adons adora adore adrar adret adula adule aedes aerai aeras aerat aeree aerer aeres aerez aeros afare afars afats affin affut afros after agaca agace agada agame agami agape agate agave agees agent agglo aghas agies agile agios agira agita agite agnat agnel agnie agnis agoni agora agrea agree agreg agres aguis ahana ahane ahans ahuri aicha aiche aidai aidas aidat aidee aider aides aidez aient aieul aieux aigle aigre aigri aigue aigus ailee ailes ailla aille aimai aimas aimat aimee aimer aimes aimez ainee aines ainou ainsi aioli airai airas airat airco airee airer aires airez aisee aises aisys ajonc ajour ajout ajuts akans akene akita album aldin aldol aleas alems alene aleph alesa alese alevi aleze alfas algal algie algol algue alias alibi alien alios alise alita alite alize allai allas allat allee aller alles alleu allez allia allie alloc almee aloes alois alors alose alpax alpee alper alpes alpha alpin altea alter altos alule aluna alune aluni aluns alvin alyas alyte amans amant amati ambla amble ambon ambra ambre amena amene amere amers amibe amict amide amies amigo amine amish amman ammis amoks amome amont amour amphi ample ampli amuie amuir amuis amuit amura amure amusa amuse amyle anale anars anaux anche ancra ancre andin anees anels aneth anges angle angon angor angus anier anils anima anime anion anisa anise anite anjou ankhs annal annee anniv anode anoli anona anone anons ansee anses antan antes antre aorte aouta aoute aouts apero aphte apide apiol apion aplat apnee apode appas appat appel appli appui aprem apres aptes apura apure apyre arabe arack aracs araks arasa arase arbre arche archi archs arcon ardue ardus arecs arena arene arete argan argas argol argon argot argua argue argus arhat arias aride arien arisa arise armai armas armat armee armer armes armet armez armon arobe arole arols arome arqua arque arret arroi arsin arsis artel artys arums aryen aryle arzel asado asana asdic asics asile asine asins aspes aspic aspis asple aspre asque asram assai assec asses assez assis assit assos aster astes astic astis astre ataca atele atemi athee athle atipa atlas atman atoca atoll atome atone atour atout atres aubes aubin aucun audio audit augee auges auget aulas aulne aunai aunas aunat aunee auner aunes aunez aurai auras aurez aussi autan autel autos autre avahi avais avait avala avale avals avant avare avens avent avenu avera avere avers aveux avide avien aviez avili avina avine avion avisa avise aviso aviva avive avoie avoir avons avoua avoue avoya avoye avril awacs awale awele axais axait axant axees axels axene axent axera axial axiez axile axoas axone axons ayant ayons azeri azobe azora azore azota azote azura azure azurs azyme babas babel babil babys bacha bache bachi bacla bacle bacon bacul badai badas badat badee bader bades badez badge badin baffa baffe bafra bafre bagad bagel baggy bagne bagou bagua bague bahai bahts bahut baies baile baine bains baisa baise balai balan bales balla balle balsa balte bamba banal banat banco bancs banda bande bangs banjo banne banni banon bantu baous baqua baque barba barbe barbu barda barde bards barge baril barjo barns baron barra barre barri barye barza basai basal basas basat basee baser bases basez basic basie basin basir basis basit bassa basse basta baste batai batas batat batch batee bater bates batez baths batie batik batir batis batit baton batte battu bauds bauge baume bavai bavas bavat bavee baver baves bavez bayai bayas bayat bayer bayes bayez bayle bayou bazar bazin bazou beais beait beant beate beats beauf beaux bebes bebop becha beche becot becta becte bedes bedon beent beera begue begum begus behai beiez beige bekee bekes belai belas belat belee beler beles belez belga belge belle belon bemba bemol benef benet benie benin benir benis benit benji benne bento beons berca berce beret berge berme berna berne berot beryl beryx besas besef beset betas betee betel betes betie betis beton bette beuhs beure beurk beurs beuse bevue bezef biais biaxe bibis bible bibli bibus bicha biche bicol bicot bides bidet bidon bidou biefs biens biere biffa biffe biges bigla bigle bigor bigos bigot bigre bigue bijou biker bilai bilan bilas bilat bilee biler biles bilez bilie billa bille bills bimbo binai binas binat bindi binee biner bines binez bingo binon biome biote bipai bipas bipat bipee biper bipes bipez bique birbe birrs bisai bisas bisat bisee biser bises biset bisez bisoc bison bisou bissa bisse bitai bitas bitat bitee biter bites bitez bitis bitos bitta bitte bittu bitue bitus biwas bizet bizou bizut black blaff blair blama blame blanc blaps blasa blase blast blaze bleds bleme blemi blesa blese blets bletz bleue bleui bleus blind blini blitz block blocs blogs blond bloom blots blues bluet bluff blush bluta blute bobby bobet bobos bobun bocal boche bocks bodhi bodys boers boete boeuf boges bogey bogie bogua bogue boiar boide boira boire boisa boise boita boite boive bokit bolas boldo bolee bolet bolos bolus bomba bombe bomee bomes bomme bonda bonde bondi bonds bongo bonif bonis bonne bonte bonus bonze books booms boost boots boras borax borda borde bordj bords boree bores borie borin borna borne borts bosco boson bossa bosse bossu botes botos botox botta botte boucs bouda boude boudi boudu bouee boues bouge bouif boula boule bouma boume boums boure bourg bours bousa bouse bouta boute bouts bouzy bovin bowal boxai boxas boxat boxee boxer boxes boxez boxon boyau brada brade braie brais brait brama brame brand brans brasa brase brava brave bravi bravo braya braye break brede brefs brela brele breme brens brent breve bribe brick brida bride briee brief bries briks brima brime brins brion brios brisa brise brize brocs broda brode broie brols brome brook broue broum brous brout broya broye bruie bruir bruis bruit brula brule bruma brume brune bruni bruns brute bruts bubon bucha buche buees bugga bugge buggy bugle bugna bugne buire bulbe bulbs bulge bulla bulle bulls bulot bumes bunas buqua buque burat bures burgs burin burka burle burne buron burqa busai busas busat buscs busee buser buses busez bushs busse buste butai butas butat butee buter butes butez butin butor butos butta butte buvee buvez buzet buzza buzze byeri bytes caban cabas cabla cable cabot cabra cabre cabri cabus cacao cacas cacha cache cacou caddy cades cadet cadis cador cadra cadre caduc cafes cafre cafta cafte cagee cages caget cagna cagne cagot cagou cagua cague cahot caids caieu caion cairn cajan cajet cajou cajun cakes cakta cakti calai calao calas calat calee caler cales calez calfs calin calla calle calls calma calme calmi calos calot calta calte calus calva camai camas camat camba cambe camee cameo camer cames camez campa campe campo camps camus canai canal canar canas canat candi canee caner canes canez cange canif canin canna canne canoe canon canot canta cante cants canus canut caoua capai capas capat capea capee caper capes capet capez capon capos capot cappa capre capta capte caqua caque carat carbo carda carde caret carex cargo caria carie caris carme carne carpe carra carre carry carta carte carva carvi carys casai casas casat casco casee caser cases casez cashs cassa casse casta caste catas catch cates catho catie catin catir catis catit caude cauri causa cause cavai cavas cavat cavea cavee caver caves cavet cavez cavum cayes cayeu cayon ceans cebes cedai cedas cedat cedee ceder cedes cedex cedez cedis cedre cegep ceins ceint celai celas celat celee celer celes celez cella celle celte celui cenes cenne cense cents cepee cepes cerat cerce cerfs cerna cerne cesar cessa cesse ceste cetol cette cezig chahs chair chais chale champ chans chant chaos chape chapo chars chats chaud chaut chaux cheap cheba chebs check chefs cheik chene cheni chenu chera chere cheri chers cheva cheve chiac chiai chias chiat chics chiee chien chier chies chiez chile chili china chine chino chiot chipa chipe chipo chips chiro choco chocs choie choir chois choit choix choke choma chome chopa chope chops chore chose chott choux choya choye chtis chues chums chuta chute chuts chvas chyle chyme cibla cible cicla cicle cidre ciels cieux cigue cilie cilla cille cimes cines cipal cippe cipre cirai ciras cirat circa ciree cirer cires cirez ciron cirre cirse ciste citai citas citat citee citer cites citez cives civet civil clade claie claim clair clama clame clamp clams clans clape clapi claps clark clash clava clave clays clean clebs clefs clerc click clics clims clins clips clito cliva clive clodo clona clone clopa clope clora clore close cloua cloud cloue cloup clous clown clubs clues cluse coach coati cobea cobee cobes cobol cobra cobza cocas cocci cocha coche cocon cocos cocue cocus codai codas codat codec codee coder codes codex codez codon coefs coeur cogna cogne cohue coing coins coirs coita coite coits cokes colas colee colin colis colla colle coloc colon colos colts colza comas combe combi combo comma comme compo comte concu conde condo cones conga conge conne connu conso conta conte cools copal copia copie copla coppa copra copte coque coran corbs corda corde cores corgi corme corna corne cornu coron corpo corps corsa corse corso cossa cosse cossu cosys cotai cotas cotat cotee coter cotes cotez cotie cotir cotis cotit coton cotre cotta cotte couac couda coude couds couic coula coule coupa coupe coups coure cours court couru couse cousu couta coute couts couva couve couvi couvs coxai coxal coxas coxat coxee coxer coxes coxez coyau coyer crabe crack cracs crade crado craie crama crame crana crane crans craps crase crash craus craux crave crawl creai creas creat credo creee creek creer crees creez crema creme crena crene crepa crepe crepi crepu creta crete crets creux creva creve criai crias criat cribs crics criee crier cries criez crime crins crisa crise criss croco crocs croie crois croit croix crole cross croup crown crows cruel crues cruor cubai cubas cubat cubee cuber cubes cubez cubis cucul cucus cueva cufat cuira cuire cuirs cuise cuita cuite cuits culai culas culat culee culer cules culex culez culot culte cumin cumul cupro curai curas curat curee curer cures curez curie curry cutis cuvai cuvas cuvat cuvee cuver cuves cuvez cyans cycas cycle cyclo cygne cymes cyons czars dabas dabes daces dache dadas dagua dague dahir dahls dahus dails daims daine daira dakin dalit dalla dalle dalot damai daman damas damat damee damer dames damez damna damne dance dandy danio dansa danse darce darda darde dards daris darne daron darse dashi datai datas datat datee dater dates datez datif datte dauba daube dauws dayak deala deale deals debat debet debit debut debye decan decas decca deces deche dechu decis decks decor decos decri decru decue decus decut dedia dedie dedis dedit defet defia defie defis defit degat degel degre degue degun deite delai delco delia delie delit delot delta demes demet demie demis demit demon demos denar dendi denia denie denim denis dense denta dente denti dents dentu denua denue depit deplu depot derby derme derny desir desks detox dette deugs deuil deust devet devez devia devie devin devis devon devot devra dewar dhals dhikr dhole dhoti dials diams diane diapo dibis dicos dicta dicte didot diene diesa diese diete dieux diffa digit digne digon digue dilua dilue dimes dinai dinar dinas dinat dinde diner dines dinez dingo dinka diode diola diols diots dirai diras dires direz dirlo disco dises dispo disse dites divan divas dives divin divis divot diwan dixie dixit djain djeun djinn dobok dobra docks docte docus dodos dodue dodus dogat doges dogme dogon dogue doigt doina doits doive dojos dolai dolas dolat dolby dolce dolee doler doles dolez dolic dolly dolma dolos domes domus donas donau donax doner dongs donna donne donut dopai dopas dopat dopee doper dopes dopez dorai doras dorat doree dorer dores dorez dorin doris dorme dormi dosai dosas dosat dosee doser doses dosez dosha dosse dotai dotal dotas dotat dotee doter dotes dotez douai douar douas douat douce douci doucs douee douer doues douez doufe doula douma doums douro douta doute douve douze doxas doyen draft drags draie drain drame drams drapa drape draps drava drave draya draye drege dreve drift drill dring drink driva drive droit drole drome drone dropa drope drops drues drums drupe druse druze duale duals duaux ducal ducat duces duche dudit duels dugon duita duite duits dulie dumes dunes dunks duodi dupai dupas dupat dupee duper dupes dupez duqua duque durai dural duras durat durci duree durer dures durez durit durum duses dusse dutes duvet dyade dykes dynes dzeta eagle ebahi ebats ebene eboua eboue ecala ecale ecang ecart echai echas echat echec echee echer eches echet echez echos echue echus echut ecima ecime eclat eclos eclot ecoin ecole ecolo ecopa ecope ecota ecote ecots ecran ecria ecrie ecrin ecris ecrit ecrou ecrue ecrus ecsta ecula ecule ecuma ecume ecura ecure edams edens edile edita edite edito edits eduen effet efrit egaie egala egale egara egard egare egaux egaya egaye egeen egide egout eider eject ejets eland elans elave elbot elegi eleis elemi eleva eleve elfes eliai elias eliat elida elide eliee elier elies eliez elima elime elira elire elise elite elles eloge eloxe eluai eluas eluat eluda elude eluee eluer elues eluez elyme email emana emane emaux embat embua embue embus embut emeri emets emeus emeut emiai emias emiat emiee emier emies emiez emirs emise emois emoji emoud emous empan empli emues emula emule emyde encan encas encor encra encre endos enema enfer enfeu enfin enfla enfle enfui engin enjeu enlia enlie ennui enols enoua enoue entai entas entat entee enter entes entez entra entre envia envie envoi envol epair epais epand epars epart epata epate epave epees epela epele ephod epiai epias epiat epica epice epiee epier epies epieu epiez epige epila epile epina epine epite epode epois epoux epoxy epris eprit eprom epuca epuce epura epure equin erbue ergol ergot erige erine eroda erode errai erras errat errer erres errez erses escha esche escot esker espar essai esses essor ester estes estoc etage etaie etain etais etait etala etale etals etama etame etang etant etape etats etaux etaya etaye etend eteta etete eteuf ether ethos etier etiez etige etira etire etocs etole etres etron etude etuis etuva etuve eumes euros eusse eutes evada evade evasa evase eveil event evida evide evier evita evite evohe ewees exact exams exces exclu exeat exema exige exigu exila exile exils exine exits exode exons expat expia expie expos extra eyras fable faces facha fache facho facon fadai fadas fadat fadee fader fades fadet fadez fados faena fagne fagot faims faine faire faite faits fakes fakir falle fallu falot falun famas famee fames fanai fanal fanas fanat fancy fanee faner fanes fanez fange fangs fanny fanon fanum faons farad farca farce farci farda farde fards fares fario faros farsi farta farte farts fasce fasse fassi faste fatal fates fatma fatum fatwa faune fauta faute fauve favus faxai faxas faxat faxee faxer faxes faxez fayot feale feaux fecal feces fedes feins feint felai felas felat felee feler feles felez felin felle felon femme femur fende fends fendu fenil fente ferai feral feras ferez feria ferie ferir ferla ferle ferma ferme fermi ferra ferre ferry ferte ferue ferus fessa fesse fessu fetai fetas fetat fetee feter fetes fetez fetus feues feuil feujs feula feule feves fiais fiait fiant fibre fibro ficha fiche fichu ficus fiees fiefs field fiels fient fiera fiere fiers fieux fifis fifre figea figee figer figes figez figue fiiez filai filao filas filat filee filer files filet filez filin fille filma filme filmo films filon filos filou fimes final fines finie finir finis finit finns fiole fions fiord fiote fioul fiqhs firme firth fiscs fissa fisse fites fitou fitta fitte fixai fixas fixat fixee fixer fixes fixez fixie fixin fjeld fjell fjord flags flair flana flanc flane flans flapi flash flats fleau flein flenu flets fleur flics flint flips flirt flocs floes flood flops flore flots floua floue flous flows fluai fluas fluat fluer flues fluet fluez fluor fluos flush fluta flute fluxa fluxe flyer focal focus foehn foene fohna fohne fohns foies foils foins foira foire folie folio folks folle fonca fonce fonda fonde fonds fondu fonge fonio fonte fonts foots forai foras forat forca force forci foree forer fores foret forez forge forma forme forte forts forum fossa fosse fouee fouet fouge fouie fouir fouis fouit foula foule fours fouta foute foutu fovea foxee foxes foyer fracs fraie frais frake franc frape frasa frase fraya fraye freak frein frele fremi frene freon frere freta frete frets freux frics frigo frima frime fripa fripe frira frire frisa frise frita frite frits fritz frocs froid frola frole front froua froue fruit fucus fudge fuels fuero fugua fugue fugus fuies fuira fuita fuite fulls fumai fumas fumat fumee fumer fumes fumet fumez funes funin funks funky furax furet furia furie fusai fusas fusat fusee fusel fuser fuses fusez fusil fusse fuste futal futee futes futon futur fuyez gabas gabie gable gacha gache gades gadin gadje gadji gadjo gaffa gaffe gagas gagea gagee gager gages gagez gagna gagne gaiac gaies gaina gaine gains gaita gaite gaize galas galba galbe gales galet galla galle gallo galon galop gamay gamba gambe gamer gamet gamin gamma gamme gamou ganga gangs ganja gansa ganse ganta gante gants garai garas garat garce garda garde garee garer gares garez garis garni garou garum gasba gaspi gasps gatai gatas gatat gatee gater gates gatez gatta gatte gaude gaudi gaula gaule gaupe gaura gaurs gauss gavai gavas gavat gavee gaver gaves gavez gavot gayal gazai gazas gazat gazee gazer gazes gazez gazon gazou geais geant gecko geeke geeks geins geint gelai gelas gelat gelee geler geles gelez gelif gemie gemir gemis gemit gemma gemme genai genal genas genat genee gener genes genet genez genie genou genre gente gents geode geole gerai geras gerat gerba gerbe gerca gerce geree gerer geres gerez gerle germa germe gesir gesse geste ghees gibet gibus gicla gicle gifla gifle gifts gigas gigot gigua gigue gilde gilet gille girie girls girly giron gisez gitai gitan gitas gitat gitee giter gites gitez giton givra givre givry glaca glace glams glana gland glane glapi glass glati glebe glena glene gleys glial glide glies globe glome glosa glose gloss gloup gluai gluas gluat gluau gluee gluer glues gluez gluis glume gluon gnawa gnete gnole gnome gnons gnose gnouf gnous goals gobai gobas gobat gobee gober gobes gobez gobie godai godas godat godee goder godes godet godez gogea gogee goger goges gogez goglu gogol gogos gojis golee golem golfa golfe golfs golgi gombo gomma gomme gonde gonds gones gongs gonio gonze gopak goral gords gores goret gorge goron gossa gosse gotha gothe goths goton gouda gouet gouge goule goulu goums goura gourd goure gouro gours gouta goute gouts goutu goyas goyim graal grace grada grade graff grafs grain grale grana grand graus graux grava grave gravi grays greai greas great grebe grecs greee green greer grees greez grege grela grele grena grene grenu gresa grese greva greve grief grill grils grima grime griot grips grisa grise grive grogs groie groin grole groma groom group gruau grues gruge grume gruon gruta grute guais guano guars gueai gueas gueat guede gueee gueer guees gueez guepe guere gueri guete guets gueux gueze gugus guibs guida guide guili guipa guipe guise guppy gurus gusse guyot guzla gwerz gwoka gyoza gypse gyres gyrin gyros gyrus habit habla hable hacha hache hacke hadal hadji hadjs haida haies haiks haiku haine haira haire hajes hakas hakka halai halal halas halat halbi halde halee haler hales halez halle halls halon halos halte halva hamac hampe hanap hands hanse hanta hante hapax happa happe haram haras harda harde hardi hards harem haret harka harki harle harpa harpe harts hasch hases haste hasts hatai hatas hatat hatee hater hates hatez hatif haute hauts havai havas havat havee haver haves havez havie havir havis havit havre hayon hazan hebdo hecto helai helas helat helee heler heles helez helio helix hello hemes henne henni henry herba herbe herbu heres heron heros herpe hersa herse hertz herve hetre heure heurs heurt hevea hiais hiait hiant hibou hiees hient hiera hifis hihan hiiez hijab hiles hindi hions hippo hippy hissa hisse hiver hobby hocas hocco hocha hoche hogan hoirs hokis homes homme homos honni honte hopak hopie hopis horas horde horst hosta hosto hosts hotel hotes hotta hotte hotus houai houas houat houee houer houes houez houka houla houle hourd houri house hovas hoyau huais huait huant huard huart hucha huche huees huent huera huhau huiez huila huile humai humas humat humee humer humes humez humus hunes huons huppe hures hurla hurle huron husky hutia hutin hutte hutue hutus hydne hydre hyene hymen hymne hyper hypes hyphe hypne iambe ibere iboga iceux ichor icone ictus ideal ideel idees idiot idole iftar igame igbos igloo iglou ignee ignes igues ikats ileal ileon ilets ileus ilien ilion ilote ilots image imago imams imans imbue imbus imide imine imita imite immun impec imper impie impot impro impur incas inchs incus indes index indic indol indou indri indue indus ineat infos infox infra infus inies inlay innee innes innue innus inoui input insti inter intis intox intro inuit inuks inule invar invit iodai iodas iodat iodee ioder iodes iodez iodla iodle ioula ioule ipeca ippon irais irait irien iriez irisa irise iroko irone irons iront isard isbas islam ismes isola isole issas issue issus items itera itere ithos iules ivres iwans ixage ixais ixait ixant ixees ixent ixera ixias ixiez ixode ixons jabla jable jabot jacee jacks jacos jacot jacta jacte jades jadis jaina jaine jains jajas jalap jales jalon jambe jante japon jappa jappe jaque jarde jards jarre jarta jarte jasai jasas jasat jasee jaser jases jasez jaspa jaspe jassa jasse jatis jatte jauge jaune jauni javas javel jayet jazze jazzy jeans jeeps jello jenny jerez jerka jerke jerks jeses jesus jetai jetas jetat jetee jeter jetes jetez jeton jette jeudi jeuna jeune jezes jihad jives jocko jodel jodla jodle jogga jogge joice joies joins joint jojos joker jolie jolis jomon jonca jonce joncs joran jotas jouai joual jouas jouat jouee jouer joues jouet jouez jougs jouir jouis jouit joule jours jouta joute joyau jubes jucha juche judas judds judos judru jugal jugea jugee juger juges jugez juifs juins juive julep jules julie julot jumar jumbo jumel jumpa jumpe jumps junco junks junky junte jupes jupon jurai juras jurat juree jurer jures jurez juron jurys jusee juste jutai jutas jutat juter jutes jutez kabic kabig kabye kacha kache kadis kafir kagou kakis kales kalis kamis kanak kanas kanat kanji kaons kapok kapos kappa karen karma karst karts katas kavas kawai kawas kawis kayac kayak kebab kefie kefir kefta kekes kelps kemia kenaf kenas kendo kepis kerma kerns ketch ketje keufs keums khans khats khmer khobz khoin khols kicks kiefs kifai kifas kifat kifee kifer kifes kifez kiffa kiffe kikis kilim kilos kilts kinas kines kippa kitch kites kivas kiwis klaft knack knout koala koans kodak kohol koine kokas kolas kombu kondo kongo koppa koras kores kotai kotas kotat koter kotes kotez kotos kouba kraal krach kraft kraks kreml kriek krill kriss ksars ksour kunas kurde kurus kyats kylix kyrie kyste kyudo labbe label labie labos labre labri lacai lacas lacat lacee lacer laces lacet lacez lacha lache lacis lacks lacte ladin ladre ladys lagan lager lagon lahar laics laide laids laies laina laine laird laite laits laius laize lakhs lamai lamas lamat lamba lambi lambs lamee lamer lames lamez lamie lampa lampe lanca lance lande lands lange laobe lapai lapas lapat lapee laper lapes lapez lapie lapin lapis lapon lapse lapsi laqua laque larda larde lards lares large largo laris larix larme larve laser lassa lasse lassi lasso latex latif latin latta latte laure lause lauze lavai lavas lavat lavee laver laves lavez lavis lavra layai layas layat layee layer layes layez layon lazes lazzi lebel lecha leche lecon ledit legal legat leger leges legos legua legue lehms lemme lemur lente lento lents leone lepre lepta lepte lerch lerot lesai lesas lesat lesee leser leses lesez lesta leste lests letal lette leude leurs levai levas levat levee lever leves levez levis levre lexie lexis liage liais liait liane liant liard liber libre lices licha liche licol licou lidar lidos lieds liees liege liens lient liera lieue lieur lieus lieux lifta lifte lifts liges light ligie ligna ligne ligot ligua ligue liiez likee liker likes lilas limai liman limas limat limba limbe limbo limee limer limes limez limon liner linga linge links linon linos lions lippe lippu lirac lirai liras lires lirez liron lises lisez lisps lissa lisse lista liste litai litas litat litee liter lites litez litho litra litre liure lives livet livra livre lloyd loase lobai lobas lobat lobby lobee lober lobes lobez lobie lobis local locha loche lochs locos locus loden lodge loess lofai lofas lofat lofer lofes lofez lofts logea logee loger loges logez login logis logos logua logue loirs lolos lomos lompe lones longe longs lonzo lonzu looch loofa looke looks lopes lopin loque loran lords loris lorry loser loses lotes lotie lotir lotis lotit lotos lotta lotte lotus louai louas louat louee louer loues louez loufs louis louma loupa loupe loups loura lourd loure louva louve lovai lovas lovat lovee lover loves lovez loyal loyer lubie lucre lueur luffa lugea lugee luger luges lugez luira luire luise lulus lumas lumen lumes lumps lunch lundi lunee lunes lupin lupus lurex luron lusin lusse lutai lutas lutat lutee luter lutes lutez luths lutin lutta lutte luxai luxas luxat luxee luxer luxes luxez luzin lycee lycra lyoba lyrai lyras lyrat lyrer lyres lyrez lyric lysai lysas lysat lysee lyser lyses lysez maars macha mache macho macis macla macle macon macre macro madre maerl mafes maffe mafia mages magie magma magna magne magot mahdi maias maies mails mains maint maire majes major makis makos males malin malis malle malms malon malta malte malts malus maman mamas mamba mambo mamee mames mamet mamie mamma mammo mammy mamys manas manat manda mande manes manga mange mango mania manie manif manip manne manon manou mansa manse manta mante manul maohi maori maous mappa mappe maqam maqua maque marae maras marcs mardi maree mares marge maria marie marin maris marks marle marli marna marne marra marre marri marte masai maser maset masos massa masse mataf matai matas matat match matee mater mates matez maths matie matif matin matir matis matit maton matos matou matte matus mauls maure maury mauve maxis mayas mayen mayes mayos mazai mazas mazat mazee mazer mazes mazet mazez mazot meats mecha meche medes media medis medit medoc mefia mefie megas megie megir megis megit megot meiji melai melas melat melba melee meler meles melez melia meloe melon melos memee memes memos menai menas menat menee mener menes menez menin menon mense mente menti menue menus merci merda merde meres merle merls merlu merou mesas meson messe metal metas meteo metis metra metre metro mette meufs meula meule meure meurs meurt meute meuve mezes mezig mezze mezzo miaou micas miche micro midis miels miens mieux migra migre mikve milan miler miles mille mimai mimas mimat mimee mimer mimes mimez mimis minai minas minat mince minci minee miner mines minet minez mings minis minon minot minou minus mique mirai miras mirat miree mirer mires mirez miros misai misas misat misee miser mises misez misos misse mitai mitan mitas mitat mitee miter mites mitez miton mitre mixai mixas mixat mixee mixer mixes mixez mixte mneme moais moche mocos modal modem modes modif moere mofla mofle mogol mohos moies moine moins moira moire moisa moise moisi moite moiti mojos mokas mokos moles molle molli mollo molto molys momes momie monda monde monel monep monoi monos monta monte monts moocs mooks moore moqua moque moral morce morde mords mordu mores morge morio morna morne morse morte morts morue morve mosan mossi motel motet motif motos motta motte motus mouds moues moula moule moult moulu mound mouts moxas moyai moyas moyat moyee moyen moyer moyes moyeu moyez muais muait muant mucha muche mucor mucus mudra muees muent muera muets mufle mufti muges mugie mugir mugis mugit muids muiez mulch mules mulet mulla mulls mulon mulot mulud mumes munda mungo munie munir munis munit muons murai mural muras murat muree murer mures muret murex murez murge murie murin murir muris murit murol muron musai musas musat muscs muscu musee muser muses musez musli mussa musse musts mutai mutas mutat mutee muter mutes mutez mutin myase mylar myome myope myrte mythe mytho naans nabab nabis nabla nable nabot nacho nacra nacre nadir naevi nafes nagas nagea nagee nager nages nagez nagis nahua naias naifs naine nains naira naive najas nakfa nanan nanar nanas nanti napee napel nappa nappe narco nards narra narre narse nasal nases nashi nasse natal natel natif natta natte naval navel naves navet navra navre nazca nazes nazie nazis ndama ndole neant nebka necks necro neems nefle negre negro negus neige nells nemes nemis nenes nenni neons neper nepes nerds neres nerfs nervi nette neufs neume neuve neves neveu niais niait niant nibar nicam nicha niche nicol nidas niebe niece niees nieme nient niera niets nifes niiez nille nimba nimbe ninas ninja niole niolo niolu nions nippa nippe niqab niqua nique nitra nitre nitro nival nives nixes nizam nobel noble nocai nocas nocat nocer noces nocez nocif nodal noels noeme noese noeud noies noire noirs noise nolis nomas nomes nomma nomme nonce nones nonne nonos nopal norde nordi noria noris norma norme notai notas notat notee noter notes notez notre nouai nouas nouat nouba noucs nouee nouer noues nouet nouez novae novai novas novat novee nover noves novez novis noyai noyas noyat noyau noyee noyer noyes noyez nuage nuais nuait nuant nubas nucal nuees nuent nuera nuers nuiez nuira nuire nuise nuits nulle nuons nuque nurse nuton nyala nylon oasis obeie obeir obeis obeit obele obels obera obere obese obier obits objet oblat obole obtus obvia obvie occis ocean ocrai ocras ocrat ocree ocrer ocres ocrez octal octas octet ocule oculi odeon odeur oeils oeufs oeuve offre oflag ogams ogham ogive ognon ogres oidie oigne oille oings ointe oints oisif oison okapi okras oleum olive omble ombra ombre omega omets omise omras onces oncle ondee ondes ondin ongle onlay onsen opale opens opera opere opiat opina opine opium optai optas optat opter optes optez orage orale orant oraux orbes ordis ordos ordre orees orges orgie orgue oriel orins oriya orles orlon ormes ormet ornai ornas ornat ornee orner ornes ornez orobe oromo orpin orque ortie orval orvet osais osait osant oscar osees osent osera oside osier osiez osmie osons osque ossue ossus osteo ostos otage otais otait otant otees otent otera otiez otite otomi otons ouais ouata ouate oubli ouche oueds ouest oufti ouies oumma ounce ourdi ourla ourle ourse ouste outil outra outre ouvra ouvre ouzos ovale ovate ovees ovide ovine ovins ovnis ovula ovule oxers oxime oxyda oxyde oyant oyats ozene ozona ozone pacas pacha packs pacsa pacse pacte padan paddy padel padou padre paean pagea pagee pagel pager pages pagez pagne pagre pagus paien paies pains paire pairs pajot pakol palan palas palee pales palet palie palir palis palit palle palma palme palot palox palpa palpe palud palus pamai pamas pamat pamee pamer pames pamez pampa panai panas panat panax panca panda panee panel paner panes panez panga panic panka panne pansa panse pansu pante panty paons papal papas papes papet papis papou papys paqua paque parai paras parat parce parcs pardi paree pareo parer pares parez paria parie paris parka parla parle parme parmi paroi paros parse parsi parte parti parts party parue parus parut paseo passa passe patas patch patee pater pates patin patio patir patis patit paton patou patre patro patte pattu pauma paume pausa pause pavai pavas pavat pavee paver paves pavez pavie pavot paxon payai payas payat payee payer payes payez payse peage peans peaux pecan pecha peche pechu pedes pedum pedza pedze pegot pegre pegua pegue peina peine peins peint pekan peket pekin pekoe pelai pelas pelat pelee peler peles pelez pella pelle pelta pelte penal pence pende pends pendu penes penil penis penne penny penon penos pensa pense pente pentu penty peons pepee pepes pepia pepie pepin pepon perca perce perco percu perde perds perdu peres perfo perfs perie perif peril perir peris perit perla perle perme perms perot perre perse perso perte pesai pesas pesat pesee peser peses pesez peson pesos pesse pesta peste pesto petai petas petat petee peter petes petez petit peton petre petri pette petun peufs peuhl peule peuls peurs peves pezes phaco phage phare phase philo phlox phone phono photo phots phyla physe piafs piano pians pible picas picon picot picte piece pieds piege piers pieta piete pieux pieze pifai pifas pifat pifee pifer pifes pifez piffa piffe pigea pigee piger piges pigez pigna pigne pikas pilaf pilai pilas pilat pilau pilaw pilee piler piles pilet pilez pilla pille pilon pilot pilou pilum pinca pince pines pinne pinot pinta pinte pinup pions pipai pipas pipat pipee piper pipes pipez pipis pipit pipos piqua pique pires pisan pisco pises pissa pisse pista piste pitas pitch pites pitie piton pitou pitre pitta pives pivot pixel pizza placa place plage plaid plaie plain plais plait plana plane plans plant plate plats plebe plein pleur pleut plexi pliai plias pliat pliee plier plies pliez plint plion plocs ploie plomb plots plouc plouf plouk ploya ploye plugs pluie pluma plume pneus pocha poche podal podia podie poela poele poeme poete pogna pogne pogos poids poila poile poils poilu poing poins point poire poise poker polar poles polie polio polir polis polit polje polka polos polys pombe pomma pomme pompa pompe ponca ponce ponch ponde ponds pondu poney ponge ponor ponot ponta ponte ponts pools popaa popah popes popup poqua poque porcs pores porno porta porte porto ports posai posas posat posca posee poser poses posez posta poste posts potee poter potes potet potin potto potue potus pouah pouca pouce pouet poufs pouic poule pouls pound poupe poyas prame praos prase preau prele prend prepa preta prete prets preux prevu priai prias priat priee prier pries priez prima prime primo prion prisa prise priva prive proba probe procs prods profs proie projo prolo promo promu prona prone prose prote proto proue prout provo proxo proxy prude prune psitt psoas psore ptose puais puait puant pubis pucai pucas pucat pucee pucer puces pucez puche pucks pudus puees puent puera puiez puine puisa puise puits pujas pulas pulls pulpe pulsa pulse pumas pumes punas punch punie punir punis punit punks punts punus puons pupes puree pures purge purin puros purot pusse putes putta putte putti putto putts pyrex qanun qibla qings quado quads quais quand quant quark quart quasi qubit queer quels quena queta quete queue queux quick quiet quilt quine quint quipo quipu quota raags rabab raban rabat rabbi rabes rabla rable rabot racee racer races rachi racho racks racla racle radai radar radas radat radee rader rades radez radia radie radin radio radis radja radon rafla rafle rafts ragas ragea rager rages ragez ragga ragot ragua rague raias raide raidi raids raies rails raina raine raira raire raita rajah rajas rakis rakus ralai ralas ralat raler rales ralez ralla ralle ramai ramas ramat ramee ramen ramer rames ramez ramie ramin ramis rampa rampe rance ranch ranci rando rands range rangs ranis raout rapai rapas rapat rapee raper rapes rapez raphe rapia rapin rappa rappe rapts raqua raque rares rasai rasas rasat rasee raser rases rasez rashs rassi rasta ratai ratas ratat ratee ratel rater rates ratez ratio raton ratte raval raver raves ravie ravin ravir ravis ravit rayai rayas rayat rayee rayer rayes rayez rayia rayon rbati reacs reagi reais reait reale reals reant reaux rebab rebat rebec rebeu rebot rebue rebus rebut recap recel reces recez reche recif recit recks recre recru recta recto recue recul recup recus recut redac redan redie redif redis redit redon redox reduc redue redus redut reels reelu reent reera refis refit refus regal regel regie regir regis regit regla regle reglo regna regne regur reiez reiki reine reins rejet relai relax relia relie relis relit relou relue relui relus relut remet remis remit remix remiz remua remue renal rende rends rendu renee renes renia renie renne renom renon renta rente reons repas repic repit repli replu repos repro repue repus reput resas resta reste resto retif retro reuni revai revas revat revee rever reves revet revez revif revis revit revue revus rheme rheto rhino rhodo rhuma rhumb rhume rhums riads riais riait rials riant ribat ribla rible ribot riche richi ricin ridai ridas ridat ridee rider rides ridez riels riens rient rieur riffe riffs rifla rifle rifts riiez rikio rimai rimas rimat rimee rimer rimes rimez rinca rince rings rioja rions riota riote ripai ripas ripat ripee riper ripes ripez ripou rirai riras rires rirez risee riser rishi risse riste rital rites rivai rival rivas rivat rivee river rives rivet rivez rixes riyal robai robas robat robee rober robes robez robin robot robre rocha roche rocks rocou rodai rodas rodat rodee rodeo roder rodes rodez rogna rogne rogue roide roidi rokhs roles rolle rolls roman rompe romps rompt rompu ronce ronde rondi rondo ronds roneo ronge ronin roofs roqua roque rosai rosas rosat rosee roser roses rosez rosie rosir rosis rosit rossa rosse rosti rotai rotas rotat rotee roter rotes rotez rotie rotin rotir rotis rotit rotor rotos rouai rouan rouas rouat rouee rouer roues rouet rouez roufs rouge rough rougi rouie rouir rouis rouit roula roule roumi round routa route rover royal ruade ruais ruait ruant ruban rubis rucha ruche rucks rudes ruees ruent ruera rugby rugie rugir rugis rugit ruiez ruila ruile ruina ruine rully rumba rumbs rumen rumex runes ruolz ruons rupai rupas rupat rupee ruper rupes rupez rupin rural rusai rusas rusat rusee ruser ruses rusez rushs russe ryads ryals saami sabar sabin sabir sabla sable sabot sabra sabre sache sacra sacre sacys sadhu sados safou safre sagas sages sagou sagum sahel sahib saies saiga saine sains saint saisi saite sajou sakes sakis sakti salai salam salar salas salat salee salep saler sales salez salie salin salir salis salit salle salol salon salop salpe salsa salse salto salua salue salut salve samba sambo sames samie samis samit sammy samos sampi samus sanas sango sangs sanie sante sanve sanza saola saoul sapai sapas sapat sapee saper sapes sapez sapin saqua saque saras sarde sarin saris sarod saron saros sarts sassa sasse satan satay sates satin satis sauca sauce saufs sauge saule sauna saune saupe saura saure sauri saurs sauta saute sauts sauva sauve savez savon saxes saxon saxos sayon sbire scalp scans scare scato scats sceau scene schah schwa sciai scias sciat sciee scier scies sciez scion scone scoop scoot scopa scope scora score scout scrub scuds scull scuta seant seaux sebka sebum secam secco secha seche secte secus sedan sedon sedum segas seide seime seine seing seins seize selfs sella selle selon seltz selva selve semai semas semat semee semer semes semez semis senat senau senes senne sensa sense sente senti seoir sepia serac serai seran seras serbe seres serez serfs serge seria serie serin serpe serra serre serte serti serum serve servi setar seton seuil seule seuls seums seves sevir sevis sevit sevra sevre sexee sexer sexes sexte sexto sexue sexys sezig shahs shako shama shana shans sheds shelf sheol shiba shido shift shire shits shogi shona shoot short shots shows shoyu shunt sials sicav sicla sicle sidas sidis siege siens siera sieur sigle sigma signa signe sikhe sikhs silai silas silat siler siles silex silez silos silts silys simas singe sinoc sinon sinua sinue sinus sioux sipos sires sirex sirli sirop sisal sises sitar sites sitot situa situe siums sixte skais skate skats skeet skiai skias skiat skiee skier skies skiez skiff skifs skins skips skons skuas skuns slame slams slang slash slave slica slice slide slims slips sloop slows slums slurp slush smack smala smalt smart smash smics smogs smoks smolt smurf snack snifa snife sniff snifs snoba snobe snobs soaps sobre socca socio socle sodas sodee sodes soeur sofas softs soies soifs soins soirs sojas solda solde solea solen soles solex solin solos soman somas sombe somma somme sonal sonar sonda sonde sones songe songs sonie sonna sonne sonos sopor sorbe sores sorgo sorte sorti sorts sosie sosot sotch sotho sotie sotte souci souda soude soues soufi souks soula soule souls soums souna soupa soupe sourd souri soute soyas soyer soyez space spahi spams spare spart spath spats speck speed speos spets sphex spica spics spins spire spita spite spitz spore sport spots sprat spray sprue spume squat squaw stade staff stage stamm stand stars stase stats steak stele stemm stems steno stent steps stera stere stick stilb stipe stock stone stops store stots stout stras stria strie strip strix stucs studs stuka stupa stups stuut styla style stylo suage suais suait suant suave suber subie subir subis subit subla suble sucai sucas sucat sucee sucer suces sucez sucon sucra sucre sudra suede suees suent suera sueur sueve suffi sufis suide suies suiez suifa suife suifs suint suite suive suivi sujet sulky sumac sumes sumos sunna suons supai supas supat supee super supes supez supin suppo supra surah sural sures suret surfa surfe surfs surge surgi surie surin surir suris surit suros sushi susse sutes sutra swags swaps swazi sweat swing swins sylis sylve sympa syrah syrte taals tabac tabar tabes tabla table tabor tabou tabun tacca tacet tacha tache tacks tacla tacle tacon tacos tacot tacts taels taffe tafia tagal tagga tagge tagme tagua tague tahrs taies taiga taiji taino tains taira taire taise takas takin talai talas talat talcs taleb taled talee taler tales talet talez talla talle talon talus tamas tamia tamil tamis tanca tance tanga tango tangs tanin tanka tanks tanna tanne tanns tante taons tapai tapas tapat tapee taper tapes tapez tapie tapin tapir tapis tapit tapon taqua taque taraf tarai taras tarat tarda tarde taree tarer tares taret tarez targe tarie tarif tarin tarir taris tarit taros tarot tarse tarte tarti taser tassa tasse tatai tatar tatas tatat tatee tater tates tatez tatie tatin tatis tatou tauda taude tauds taule tauon taupa taupe taure tavel taxai taxas taxat taxee taxer taxes taxez taxie taxis taxol taxon taxum taxus tayra tchan tchao tchat tchin teams tecks teddy tefal teffs teins teint tejus tekee tekes teles telex telle tells tempe tempi tempo temps tende tends tendu tenez tenge tenia tenir tenno tenon tenor tenta tente tenue tenus tepui terca terce terme terne terni terra terre terri tersa terse tesla testa teste tests tetai tetas tetat tetee teter tetes tetez tetin teton tetra tette tetue tetus teufs teves texan texta texte texto tezig thaie thais thali thane theme these theta thete thiof thiol thons thora thugs thune thuya thyms tians tiare tibia tical tiede tiedi tiens tient tiers tiffe tifos tigea tiger tiges tigez tigra tigre tikis tilde tilla tille tilta tilte tilts timon tines tinta tinte tipai tipas tipat tipee tiper tipes tipez tipis tippa tippe tiqua tique tirai tiras tirat tiree tirer tires tiret tirez tisai tisas tisat tiser tises tisez tison tissa tisse tissu titan titis titra titre titus tjale tmese toast tobys tofus toges toila toile toisa toise toits tokai tokaj tokay tolai tolar tolas tolat tolba tolee toler toles tolet tolez tolle tolus tomai toman tomas tomat tomba tombe tomee tomer tomes tomez tomme tommy tonal tonca tonde tondo tonds tondu toner tonfa tongs tonic tonie tonka tonna tonne tonte tonus topai topas topat topee toper topes topez topic topos toqua toque torah torde tords tordu torea toree tores torii toril toron torrs torse torte torts tortu torve torys tosas tossa tosse total totem toton totos touai touas touat touee touer toues touez toura tourd toure tours toute touts trabe traca trace tracs tract trahi traie trail train trais trait trama trame tramp trams trans trapp trapu trash treks trema trend treve triai trial trias triat tribu trick trics tridi triee trier tries triez trigo trike trima trime trine trins triol trios tripa tripe trips trocs trois trole troll trona tronc trone trope trots troua troue trous truck trucs truie trust tsars tsuba tsuga ttoro tuage tuais tuait tuant tubai tubas tubat tubee tuber tubes tubez tuees tuent tuera tueur tufte tuiez tuila tuile tulle tumba tumes tunee tuner tunes tuons tupie tupis tuque turbe turbo turco turcs turfs turne tusse tutes tutie tutos tutsi tutti tutus tuyau tweed tween tweet twill twins twist typai typas typat typee typer types typez typha typon typos tyran tzars ubacs ubris ugnis uhlan ukase ulema ulnas ultra ulula ulule ulves umami umbos ummas unaus unaux unies unifs union unira unite univs untel urane urate urdus urees urgea urger urina urine urnes ursin urubu usage usais usait usant usees usent usera usiez usina usine usite usnee usons usuel usure utile uvale uvaux uvees uvula uvule uzbek vacha vache vacoa vagal vagin vagir vagis vagit vagua vague vainc vaine vains vaire vairs valet valez valga valsa valse value valus valut valve vampa vampe vamps vanda vanna vanne vanta vante vapes vapos vaqua vaque varan varia varie varna varon varus varve vasai vasas vasat vasee vaser vases vasez vaste vatus veaux veces vecue vecus vecut vedas vegan veina veine velai velar velas velat velds veldt veler veles velet velez velie velin velle velos velot velte velue velum velus velux venal venda vende vends vendu venes venet venez venge venin venir venta vente vents venue venus verbe verdi verge verif verin verne verni verra verre versa verse verso verte verts vertu verve vesce vesou vespa vessa vesse veste vetes vetez vetir vetis vetit vetos vetue vetus veufs veule veuve vexai vexas vexat vexee vexer vexes vexez vibor vibra vibre vibro vices vichy vicia vicie vidai vidas vidat videe video vider vides videz vieil viele viens vient viets vieux vigie vigil vigne viles villa ville vimes vinai vinas vinat vinee viner vines vinez vingt vinyl viocs viola viole viols virai viral viras virat viree vireo virer vires virez viril virus visai visas visat visee viser vises visez vison visou vissa visse vista vital vites vitra vitre vivat vives vivez vivra vivre vizir vlogs vocal vodka voeux vogua vogue voici voies voila voile voire voise volai volas volat volee voler voles volet volez volis volta volte volts volve vomer vomie vomir vomis vomit votai votas votat votee voter votes votez votif votre vouai vouas vouat vouee vouer voues vouez vouge voulu vouta voute voyer voyez voyou vracs vraie vrais vroom vroum vulgo vulve wagon wales walis waouh waqfs wasps watte watts weber wedge welsh wenge wenze wharf whigs whips whist widia wifis wikis wimax winch wiski wolof wraps wurms wushu xalam xenon xeres xerus xhosa xiang xieme xipho xylol xyste yacht yacks yakas yamba yangs yapok yards yassa yasse yawls yeble yetis yeuse yeyes yodel yodla yodle yogas yogis yoles yorks youpi yoyos yuans yucca yukos yuzus zabre zains zaire zakat zamak zamia zamus zanis zanni zanzi zappa zappe zarbi zarbs zarma zazen zazou zebra zebre zebus zeine zelee zeles zende zends zeros zesta zeste zigue zikrs zincs zippa zippe zizis zloty zoide zoile zombi zonai zonal zonas zonat zonee zoner zones zonez zooma zoome zooms zorse zouka zouke zouks zozos zumba\".split(\n \" \"\n );\nexport const ALLOWED_SET = new Set(ALLOWED);\nexport const DAILY_GAMES = [[\"rides\", \"serie\", \"treks\", \"ulves\"],[\"badas\", \"minis\", \"copte\", \"damas\"],[\"strie\", \"expos\", \"solda\", \"front\"],[\"veler\", \"manse\", \"elfes\", \"laces\"],[\"lente\", \"bonda\", \"ordis\", \"jurat\"],[\"pires\", \"topes\", \"fumee\", \"diner\"],[\"typee\", \"oeufs\", \"barde\", \"bijou\"],[\"roser\", \"cafes\", \"danse\", \"grecs\"],[\"figue\", \"grogs\", \"chome\", \"plein\"],[\"cloud\", \"close\", \"folle\", \"raper\"],[\"mener\", \"effet\", \"chine\", \"store\"],[\"recre\", \"jacot\", \"epele\", \"rugis\"],[\"couru\", \"raies\", \"gobes\", \"bovin\"],[\"aisee\", \"exigu\", \"seant\", \"teles\"],[\"reins\", \"aprem\", \"nonne\", \"pacse\"],[\"jeton\", \"aigre\", \"tibia\", \"labbe\"],[\"vecus\", \"titre\", \"sonde\", \"corpo\"],[\"gnole\", \"roles\", \"gents\", \"rosee\"],[\"point\", \"reuni\", \"tries\", \"visse\"],[\"trone\", \"cyans\", \"loses\", \"huppe\"],[\"celee\", \"frole\", \"juter\", \"accro\"],[\"tendu\", \"anier\", \"bacon\", \"voyou\"],[\"dates\", \"clair\", \"bongo\", \"assez\"],[\"envoi\", \"exema\", \"chose\", \"skies\"],[\"rotes\", \"epris\", \"tuber\", \"rayee\"],[\"bevue\", \"jarte\", \"bingo\", \"frire\"],[\"colos\", \"filet\", \"arbre\", \"ovees\"],[\"liage\", \"douce\", \"meles\", \"echec\"],[\"lutes\", \"pause\", \"modem\", \"zeros\"],[\"enjeu\", \"tetus\", \"kolas\", \"films\"],[\"curer\", \"flore\", \"conge\", \"pompe\"],[\"jalon\", \"cocon\", \"aorte\", \"apode\"],[\"luges\", \"rayer\", \"tuant\", \"timon\"],[\"agora\", \"munir\", \"cloue\", \"alibi\"],[\"brute\", \"taper\", \"salon\", \"gabie\"],[\"gangs\", \"ponts\", \"bache\", \"apnee\"],[\"lobes\", \"abuse\", \"hiver\", \"donne\"],[\"foule\", \"lunch\", \"natif\", \"rotor\"],[\"mezzo\", \"beche\", \"figes\", \"river\"],[\"saque\", \"rouet\", \"texto\", \"boeuf\"],[\"bruit\", \"atoll\", \"echer\", \"daron\"],[\"rouge\", \"elier\", \"hadal\", \"okapi\"],[\"dieux\", \"salsa\", \"gyres\", \"cause\"],[\"vexes\", \"chefs\", \"eclos\", \"ignee\"],[\"pattu\", \"ceder\", \"patre\", \"taons\"],[\"trois\", \"aussi\", \"labos\", \"niece\"],[\"jauge\", \"chape\", \"votee\", \"faste\"],[\"salis\", \"kifer\", \"semee\", \"houle\"],[\"ruade\", \"levis\", \"galop\", \"agees\"],[\"boite\", \"ninja\", \"dogme\", \"thune\"],[\"fours\", \"baser\", \"funky\", \"roues\"],[\"yoyos\", \"broye\", \"vetir\", \"muees\"],[\"annee\", \"truck\", \"ether\", \"nazes\"],[\"ouais\", \"quete\", \"morse\", \"segas\"],[\"manie\", \"flute\", \"borde\", \"choye\"],[\"canes\", \"bolee\", \"ronds\", \"garee\"],[\"sauce\", \"vente\", \"situe\", \"relax\"],[\"yacks\", \"bravo\", \"coter\", \"champ\"],[\"brele\", \"obeis\", \"prise\", \"fagot\"],[\"rotee\", \"lotir\", \"proba\", \"safre\"],[\"caste\", \"recus\", \"skiff\", \"blase\"],[\"echus\", \"noise\", \"usuel\", \"vante\"],[\"geree\", \"tondo\", \"demis\", \"sorts\"],[\"digue\", \"remue\", \"lieue\", \"caver\"],[\"chipe\", \"scies\", \"index\", \"anses\"],[\"salut\", \"aeres\", \"prepa\", \"avers\"],[\"retif\", \"bonus\", \"vetos\", \"lucre\"],[\"rager\", \"remix\", \"tetra\", \"carat\"],[\"allee\", \"sorti\", \"huche\", \"faire\"],[\"lupus\", \"momes\", \"regie\", \"stase\"],[\"boxee\", \"lodge\", \"osier\", \"layer\"],[\"ecrie\", \"havir\", \"codec\", \"dores\"],[\"dalle\", \"pareo\", \"peage\", \"zarbs\"],[\"perce\", \"bonis\", \"tasse\", \"sciee\"],[\"bases\", \"alize\", \"enlie\", \"palme\"],[\"abots\", \"fioul\", \"colis\", \"horde\"],[\"amuie\", \"boxer\", \"gosse\", \"tecks\"],[\"clims\", \"mages\", \"legue\", \"suffi\"],[\"suife\", \"ictus\", \"poilu\", \"salee\"],[\"reduc\", \"ursin\", \"altos\", \"julie\"],[\"groin\", \"chocs\", \"moisi\", \"prose\"],[\"matte\", \"venir\", \"laure\", \"pitie\"],[\"noyer\", \"soude\", \"vesse\", \"muris\"],[\"minus\", \"ecrin\", \"acide\", \"vigne\"],[\"gicle\", \"roder\", \"ultra\", \"guepe\"],[\"trous\", \"poles\", \"mises\", \"cites\"],[\"aneth\", \"rages\", \"swags\", \"delai\"],[\"mixer\", \"juche\", \"aphte\", \"paver\"],[\"pepon\", \"tison\", \"jaser\", \"benji\"],[\"gerbe\", \"probe\", \"mache\", \"types\"],[\"betes\", \"round\", \"encas\", \"prods\"],[\"abris\", \"jable\", \"hutte\", \"chaux\"],[\"virer\", \"linos\", \"torah\", \"males\"],[\"seuls\", \"molle\", \"laide\", \"airer\"],[\"fanee\", \"phone\", \"hydre\", \"fuite\"],[\"emois\", \"puree\", \"odeur\", \"ripes\"],[\"ratio\", \"miros\", \"posee\", \"avens\"],[\"erbue\", \"teter\", \"rhino\", \"amour\"],[\"frics\", \"eveil\", \"herse\", \"moite\"],[\"plant\", \"etang\", \"entre\", \"gesir\"],[\"cadre\", \"abyme\", \"adage\", \"touer\"],[\"atone\", \"filme\", \"nocif\", \"etats\"],[\"duper\", \"engin\", \"aioli\", \"tiree\"],[\"plans\", \"intox\", \"enfui\", \"credo\"],[\"grise\", \"patte\", \"hiant\", \"codes\"],[\"blogs\", \"proue\", \"basin\", \"huant\"],[\"motus\", \"nuque\", \"biote\", \"quasi\"],[\"hotte\", \"duree\", \"munie\", \"ouvre\"],[\"chant\", \"rebue\", \"paons\", \"tarif\"],[\"egard\", \"kifes\", \"amere\", \"rince\"],[\"sures\", \"aller\", \"admis\", \"green\"],[\"piffe\", \"nasal\", \"padre\", \"gerer\"],[\"opter\", \"epine\", \"loves\", \"sympa\"],[\"salto\", \"halee\", \"avien\", \"cameo\"],[\"toges\", \"lause\", \"octet\", \"voter\"],[\"payes\", \"tarde\", \"torse\", \"cousu\"],[\"lover\", \"repli\", \"tutos\", \"exils\"],[\"piges\", \"etole\", \"aigus\", \"sises\"],[\"kebab\", \"dicos\", \"miche\", \"lupin\"],[\"osant\", \"scalp\", \"dolce\", \"voies\"],[\"ambon\", \"ennui\", \"sorte\", \"renee\"],[\"matos\", \"giter\", \"tutus\", \"bobos\"],[\"frere\", \"somme\", \"casee\", \"aires\"],[\"ceint\", \"medoc\", \"niole\", \"debat\"],[\"suies\", \"stele\", \"vains\", \"harde\"],[\"exces\", \"venge\", \"lever\", \"houer\"],[\"mordu\", \"jazze\", \"opere\", \"celte\"],[\"laics\", \"edits\", \"cages\", \"boire\"],[\"primo\", \"drive\", \"carpe\", \"limon\"],[\"macon\", \"fenil\", \"relus\", \"prime\"],[\"ratee\", \"triee\", \"graux\", \"ronde\"],[\"tetue\", \"ciree\", \"rougi\", \"bondi\"],[\"poque\", \"batir\", \"rixes\", \"terre\"],[\"ample\", \"atour\", \"ilets\", \"dicte\"],[\"begue\", \"reces\", \"felin\", \"tisse\"],[\"galet\", \"latex\", \"polar\", \"juive\"],[\"bisee\", \"miner\", \"vites\", \"brout\"],[\"ravin\", \"mooks\", \"sabre\", \"ambre\"],[\"robot\", \"snack\", \"gueri\", \"robee\"],[\"verin\", \"scoop\", \"miles\", \"rimer\"],[\"babys\", \"intro\", \"trime\", \"avise\"],[\"veste\", \"panse\", \"sonne\", \"farde\"],[\"hamac\", \"degre\", \"axial\", \"petee\"],[\"genou\", \"acons\", \"marin\", \"talus\"],[\"hosto\", \"dinde\", \"gatee\", \"zoner\"],[\"flans\", \"cocas\", \"dupes\", \"assos\"],[\"greve\", \"limbo\", \"nabot\", \"joues\"],[\"enter\", \"lotus\", \"saint\", \"miens\"],[\"fonge\", \"itere\", \"table\", \"calme\"],[\"gaudi\", \"profs\", \"typos\", \"style\"],[\"hatee\", \"riote\", \"banni\", \"corde\"],[\"patir\", \"boots\", \"audio\", \"couvi\"],[\"vivre\", \"jante\", \"oeils\", \"videe\"],[\"pucks\", \"vides\", \"dopes\", \"obeir\"],[\"vinee\", \"poses\", \"baril\", \"stats\"],[\"jetee\", \"finir\", \"paies\", \"vulve\"],[\"vetue\", \"vroum\", \"tabac\", \"rimee\"],[\"dorer\", \"rompu\", \"lacee\", \"hymne\"],[\"peles\", \"mollo\", \"baque\", \"famee\"],[\"fluor\", \"tolee\", \"blues\", \"juifs\"],[\"bords\", \"goute\", \"aieux\", \"quais\"],[\"tetin\", \"rabat\", \"trier\", \"ourdi\"],[\"crier\", \"genes\", \"botes\", \"vomie\"],[\"obeie\", \"appel\", \"nival\", \"lache\"],[\"jeter\", \"colon\", \"tweed\", \"taule\"],[\"ruees\", \"chapo\", \"acnes\", \"comte\"],[\"canif\", \"gites\", \"cidre\", \"balle\"],[\"euros\", \"boost\", \"creux\", \"serfs\"],[\"comme\", \"juges\", \"civet\", \"gigot\"],[\"viner\", \"tonus\", \"crane\", \"sotte\"],[\"rubis\", \"aidee\", \"carte\", \"funin\"],[\"poter\", \"refus\", \"coque\", \"demos\"],[\"tissu\", \"cheri\", \"etale\", \"gouge\"],[\"bleue\", \"radar\", \"loger\", \"gogos\"],[\"crics\", \"venue\", \"moire\", \"luron\"],[\"limer\", \"essor\", \"opine\", \"revus\"],[\"dette\", \"sauri\", \"photo\", \"totos\"],[\"clope\", \"veule\", \"silos\", \"bossu\"],[\"stage\", \"flein\", \"saure\", \"creme\"],[\"layes\", \"pipis\", \"longs\", \"check\"],[\"celes\", \"geeks\", \"ecrou\", \"exile\"],[\"viles\", \"monte\", \"vitre\", \"liker\"],[\"ripee\", \"eclat\", \"asine\", \"panne\"],[\"spire\", \"poule\", \"resto\", \"longe\"],[\"lompe\", \"hacke\", \"cieux\", \"ortie\"],[\"penis\", \"belee\", \"place\", \"avoue\"],[\"neuve\", \"salue\", \"cires\", \"rouie\"],[\"etude\", \"flood\", \"avide\", \"aimer\"],[\"lofer\", \"rares\", \"fakes\", \"terme\"],[\"slips\", \"pente\", \"epars\", \"rapia\"],[\"barjo\", \"doree\", \"diete\", \"juron\"],[\"crawl\", \"livre\", \"jurys\", \"uvaux\"],[\"jeune\", \"proxy\", \"lacer\", \"peser\"],[\"pince\", \"fixer\", \"adore\", \"eliee\"],[\"urnes\", \"tomme\", \"verre\", \"rendu\"],[\"etame\", \"decru\", \"pekin\", \"anale\"],[\"dodus\", \"bagou\", \"mixte\", \"crees\"],[\"otage\", \"malte\", \"ravie\", \"luire\"],[\"reglo\", \"mains\", \"rudes\", \"pises\"],[\"vague\", \"scene\", \"joyau\", \"devot\"],[\"oraux\", \"icone\", \"crime\", \"erode\"],[\"celle\", \"heure\", \"perso\", \"rupin\"],[\"verdi\", \"tarir\", \"myope\", \"agree\"],[\"tomes\", \"bulot\", \"bette\", \"saper\"],[\"sceau\", \"sodas\", \"claps\", \"rayon\"],[\"login\", \"suede\", \"ecrue\", \"piger\"],[\"appui\", \"limbe\", \"carie\", \"fendu\"],[\"skate\", \"ajonc\", \"potin\", \"guete\"],[\"neons\", \"bines\", \"flous\", \"alpha\"],[\"foire\", \"brefs\", \"hatif\", \"flair\"],[\"malle\", \"cycle\", \"dodos\", \"emise\"],[\"genre\", \"cette\", \"spray\", \"merci\"],[\"asile\", \"huees\", \"capee\", \"novae\"],[\"orpin\", \"coing\", \"tempe\", \"becot\"],[\"trait\", \"tares\", \"verbe\", \"idees\"],[\"villa\", \"guide\", \"troll\", \"boxon\"],[\"dense\", \"anees\", \"tonal\", \"brule\"],[\"coups\", \"impur\", \"epieu\", \"peses\"],[\"tronc\", \"durer\", \"brave\", \"azyme\"],[\"cedes\", \"potes\", \"mardi\", \"herbe\"],[\"laius\", \"salin\", \"faite\", \"fouir\"],[\"gravi\", \"gourd\", \"sites\", \"epice\"],[\"aerer\", \"fiole\", \"crash\", \"sigle\"],[\"usine\", \"perir\", \"gnons\", \"angle\"],[\"nenni\", \"palle\", \"sirop\", \"ecrit\"],[\"bruts\", \"sucon\", \"appas\", \"poete\"],[\"miser\", \"video\", \"concu\", \"blocs\"],[\"voues\", \"sauna\", \"aubes\", \"wifis\"],[\"roule\", \"neufs\", \"grime\", \"alles\"],[\"beurk\", \"ecart\", \"score\", \"obese\"],[\"jupes\", \"crabe\", \"lapee\", \"roche\"],[\"lubie\", \"cacao\", \"zains\", \"calot\"],[\"boule\", \"pipee\", \"jurer\", \"nocer\"],[\"cuber\", \"maire\", \"ville\", \"cache\"],[\"mieux\", \"etage\", \"trash\", \"lyser\"],[\"inoui\", \"felee\", \"miaou\", \"heros\"],[\"foret\", \"silex\", \"rosir\", \"moine\"],[\"cerne\", \"mufle\", \"demon\", \"mazee\"],[\"etire\", \"agres\", \"berne\", \"atout\"],[\"puche\", \"zebre\", \"mitee\", \"tenir\"],[\"creee\", \"vives\", \"shows\", \"nuage\"],[\"peson\", \"bison\", \"savon\", \"cuver\"],[\"tests\", \"vairs\", \"notre\", \"noeud\"],[\"pilon\", \"poele\", \"draps\", \"deuil\"],[\"benie\", \"helee\", \"thugs\", \"colle\"],[\"taxee\", \"igloo\", \"moule\", \"strix\"],[\"adnee\", \"route\", \"matir\", \"cogne\"],[\"cross\", \"repos\", \"lemme\", \"juste\"],[\"haras\", \"clamp\", \"couac\", \"decor\"],[\"stick\", \"nappe\", \"puant\", \"clics\"],[\"sense\", \"luxes\", \"odeon\", \"sabot\"],[\"celer\", \"papes\", \"caoua\", \"polis\"],[\"morts\", \"clefs\", \"vetus\", \"seing\"],[\"botte\", \"brief\", \"palpe\", \"tapie\"],[\"divan\", \"arome\", \"haies\", \"axels\"],[\"jugal\", \"nages\", \"perle\", \"halle\"],[\"diapo\", \"argus\", \"geant\", \"quand\"],[\"sevir\", \"gland\", \"dedit\", \"arena\"],[\"siens\", \"sauve\", \"sourd\", \"piete\"],[\"guili\", \"fraye\", \"biere\", \"arobe\"],[\"belle\", \"bruns\", \"caves\", \"purin\"],[\"micro\", \"regel\", \"liner\", \"rhume\"],[\"zeste\", \"epile\", \"infus\", \"ecope\"],[\"vegan\", \"lofts\", \"gruge\", \"aimes\"],[\"singe\", \"rouan\", \"argot\", \"isole\"],[\"amant\", \"bizut\", \"penos\", \"these\"],[\"biche\", \"ornes\", \"runes\", \"napee\"],[\"gazee\", \"tubas\", \"brode\", \"stock\"],[\"hante\", \"moues\", \"bisou\", \"rayes\"],[\"evase\", \"quota\", \"coton\", \"paves\"],[\"harpe\", \"porcs\", \"abces\", \"bugge\"],[\"sonos\", \"curry\", \"echos\", \"hoche\"],[\"globe\", \"beant\", \"eches\", \"slice\"],[\"jeans\", \"haiku\", \"tuyau\", \"barbu\"],[\"geode\", \"antre\", \"anise\", \"venal\"],[\"jours\", \"epier\", \"taser\", \"ossue\"],[\"tombe\", \"skier\", \"hello\", \"melba\"],[\"duels\", \"meute\", \"jures\", \"minet\"],[\"scier\", \"copie\", \"large\", \"brune\"],[\"tours\", \"fleau\", \"ajour\", \"prive\"],[\"blets\", \"fumer\", \"siege\", \"ferie\"],[\"sumos\", \"beaux\", \"voute\", \"imper\"],[\"usage\", \"polys\", \"anche\", \"slide\"],[\"lourd\", \"egaye\", \"douve\", \"piste\"],[\"snobe\", \"verte\", \"secte\", \"ferus\"],[\"baron\", \"matie\", \"melee\", \"rible\"],[\"logis\", \"tapes\", \"tripe\", \"canne\"],[\"album\", \"ocree\", \"vouer\", \"naval\"],[\"arete\", \"toile\", \"pacte\", \"pifee\"],[\"pardi\", \"valse\", \"lumen\", \"pieds\"],[\"vigil\", \"otees\", \"noces\", \"groom\"]];","import { START_DATE,GAME_PERIOD_MS, TimeUnits } from \"./constants\";\nimport { RelativeTimeFormatUnit } from \"./types\";\n\nexport const getCurrentDailySeed = () => {\n return ((new Date().getTime() - START_DATE.getTime()) / (1000 * 5)) >> 0;\n};\n\nexport const getDateSeed = (seed: number) => {\n let time = START_DATE.getTime() + (seed)*GAME_PERIOD_MS;\n let date = new Date(time);\n return date.toLocaleDateString(\"fr\");\n}\n\nexport const indexOfAll = (str: string, char: string): number[] =>\n str\n .split(\"\")\n .map((c, i) => (c === char ? i : null))\n .filter((i) => i !== null) as number[];\n\nexport const gtagWrap = (\n command: \"event\",\n eventName: string,\n eventParams?: Gtag.CustomParams | Gtag.ControlParams | Gtag.EventParams\n) => {\n // @ts-ignore\n if (window.gtag) {\n gtag(command, eventName, eventParams);\n }\n};\n\nexport const vibrate = (vibrateMode: boolean) => {\n if ((navigator.vibrate)&&(vibrateMode)) {\n navigator.vibrate(1);\n }\n};\n\nexport const padNumber = (n: number, width: number, z?: string) => {\n z = z || \"0\";\n const nStr = n + \"\";\n return nStr.length >= width\n ? nStr\n : new Array(width - nStr.length + 1).join(z) + nStr;\n};\n\nexport const timeUntil = (date1: Date, date2: Date) => {\n if (\"RelativeTimeFormat\" in Intl) {\n // @ts-ignore\n const rtf = new Intl.RelativeTimeFormat(\"fr\", { numeric: \"auto\" });\n const elapsed = date2.valueOf() - date1.valueOf();\n for (const u in TimeUnits) {\n const unit = u as RelativeTimeFormatUnit;\n if (Math.abs(elapsed) > TimeUnits[unit] || u === \"secondes\") {\n return rtf.format(Math.round(elapsed / TimeUnits[unit]), unit);\n }\n }\n return `${elapsed} ms`;\n }\n\n const ms = date2.getTime() - date1.getTime();\n let interval = Math.floor(ms / TimeUnits.hour);\n if (interval > 1) {\n return \"dans \" + interval + \" heures\";\n }\n interval = Math.floor(ms / TimeUnits.minute);\n if (interval > 1) {\n return \"dans \" + interval + \" minutes\";\n }\n return \"dans \" + Math.floor(ms / TimeUnits.second) + \" secondes\";\n};\n","import MersenneTwister from \"mersenne-twister\";\nimport { Component, createContext, createEffect, useContext } from \"solid-js\";\nimport {\n createStore,\n DeepReadonly,\n produce,\n SetStoreFunction,\n Store,\n} from \"solid-js/store\";\nimport {\n ALLOWED_SET,\n ALPHABET,\n DAILY_GAMES,\n ANSWERS,\n ANSWERS_SET,\n BLACKLIST_SET,\n GAME_COLS,\n GAME_PERIOD_MS,\n GAME_ROWS,\n NUM_GAMES,\n START_DATE,\n} from \"./constants\";\nimport {\n BoxState,\n GameData,\n GameMode,\n GamesData,\n GamesDataProviderFuncs,\n} from \"./types\";\nimport { gtagWrap } from \"./utils\";\n\nexport const generateBoxStatesFromGuess = (\n guess: string,\n answer: string\n): BoxState[] => {\n const ans = answer.split(\"\");\n const gue = guess.split(\"\");\n const states: BoxState[] = new Array(GAME_COLS).fill(\"none\");\n const guessLetters: { [letter: string]: number } = {};\n\n for (let column = 0; column < GAME_COLS; column++) {\n guessLetters[gue[column]] = 0;\n }\n for (let column = 0; column < GAME_COLS; column++) {\n if (ans[column] === gue[column]) {\n ans[column] = \" \";\n guessLetters[gue[column]] = 2;\n gue[column] = \" \";\n states[column] = \"correct\";\n }\n }\n for (let column = 0; column < GAME_COLS; column++) {\n if (\n ans.indexOf(gue[column]) !== -1 &&\n ans[column] !== gue[column] &&\n gue[column] !== \" \"\n ) {\n if (guessLetters[gue[column]] != 2) {\n guessLetters[gue[column]] = 1;\n }\n ans[ans.indexOf(gue[column])] = \" \";\n states[column] = \"diff\";\n }\n }\n\n return states;\n};\n\nexport const generateAllGamesBoxStates = (\n guesses: string[],\n answers: string[]\n): BoxState[][][] => {\n const states: BoxState[][][] = [[], [], [], []];\n for (let i = 0; i < answers.length; i++) {\n const guessIndex = guesses.indexOf(answers[i]);\n for (let g = 0; g < guesses.length; g++) {\n if (g <= guessIndex || guessIndex === -1) {\n states[i].push(generateBoxStatesFromGuess(guesses[g], answers[i]));\n }\n }\n }\n return states;\n};\n\nexport const generateWordsFromSeed = (seed: number): string[] => {\n let answers: string[] | undefined;\n if(DAILY_GAMES[seed-1] != null){\n answers = DAILY_GAMES[seed-1];\n } else {\n const rnd = new MersenneTwister(seed);\n rnd.random_int31();\n rnd.random_int31();\n rnd.random_int31();\n rnd.random_int31();\n do {\n answers = [\n ANSWERS[rnd.random_int31() % ANSWERS.length],\n ANSWERS[rnd.random_int31() % ANSWERS.length],\n ANSWERS[rnd.random_int31() % ANSWERS.length],\n ANSWERS[rnd.random_int31() % ANSWERS.length],\n ];\n } while (\n answers[0] === answers[1] ||\n answers[0] === answers[2] ||\n answers[0] === answers[3] ||\n answers[1] === answers[2] ||\n answers[1] === answers[3] ||\n answers[2] === answers[3] ||\n BLACKLIST_SET.has(answers[0]) ||\n BLACKLIST_SET.has(answers[1]) ||\n BLACKLIST_SET.has(answers[2]) ||\n BLACKLIST_SET.has(answers[3])\n );\n \n }\n return answers;\n};\n\nfunction createLocalStore(): [Store, SetStoreFunction] {\n const date = new Date();\n const currentDailySeed =\n ((date.getTime() - START_DATE.getTime()) / GAME_PERIOD_MS) >> 0;\n const gamesData: GamesData = {\n daily: {\n seed: 0,\n guesses: [],\n answers: [],\n current: \"\",\n states: [[], [], [], []],\n answersCorrect: [-1, -1, -1, -1],\n history: new Array(GAME_ROWS + 4).fill(0),\n currentStreak: 0,\n maxStreak: 0,\n },\n free: {\n seed: 0,\n guesses: [],\n answers: [],\n current: \"\",\n states: [[], [], [], []],\n answersCorrect: [-1, -1, -1, -1],\n history: new Array(GAME_ROWS + 4).fill(0),\n currentStreak: 0,\n maxStreak: 0,\n },\n archives: {\n seed: 0,\n guesses: [],\n answers: [],\n current: \"\",\n states: [[], [], [], []],\n answersCorrect: [-1, -1, -1, -1],\n history: new Array(GAME_ROWS + 4).fill(0),\n currentStreak: 0,\n maxStreak: 0,\n },\n darkMode: true,\n blindMode: false,\n qwertyMode: false,\n vibrateMode: true,\n sharingMode: true,\n hintMode: false,\n fitMode: true,\n keyboardHeight: 1,\n width: 0,\n height: 0\n };\n const osDarkMode = window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n try {\n const darkMode = window.localStorage.getItem(\"dark_mode\");\n if (darkMode === null) {\n gamesData.darkMode = osDarkMode;\n } else {\n gamesData.darkMode = darkMode === \"true\";\n }\n } catch (e) {\n gamesData.darkMode = osDarkMode;\n }\n const blindMode = window.localStorage.getItem(\"blind_mode\");\n if (blindMode === null) {\n gamesData.blindMode = false;\n } else {\n gamesData.blindMode = blindMode === \"true\";\n }\n const fitMode = window.localStorage.getItem(\"fit_mode\");\n if (fitMode === null) {\n gamesData.fitMode = true;\n } else {\n gamesData.fitMode = fitMode === \"true\";\n }\n const keyboardHeight = window.localStorage.getItem(\"keyboard_height\");\n if (keyboardHeight === null) {\n gamesData.keyboardHeight = 1;\n } else {\n gamesData.keyboardHeight = parseFloat(keyboardHeight);\n }\n const qwertyMode = window.localStorage.getItem(\"qwerty_mode\");\n if (qwertyMode === null) {\n gamesData.qwertyMode = false;\n } else {\n gamesData.qwertyMode = qwertyMode === \"true\";\n }\n const vibrateMode = window.localStorage.getItem(\"vibrate_mode\");\n if (vibrateMode === null) {\n gamesData.vibrateMode = true;\n } else {\n gamesData.vibrateMode = vibrateMode === \"true\";\n }\n const sharingMode = window.localStorage.getItem(\"sharing_mode\");\n if (sharingMode === null) {\n gamesData.sharingMode = true;\n } else {\n gamesData.sharingMode = sharingMode === \"true\";\n }\n const hintMode = window.localStorage.getItem(\"hint_mode\");\n if (hintMode === null) {\n gamesData.hintMode = false;\n } else {\n gamesData.hintMode = hintMode === \"true\";\n }\n ([\"daily\", \"free\", \"archives\"] as GameMode[]).forEach((mode) => {\n let gameData: GameData;\n try {\n let lastSeed = Number(window.localStorage.getItem(\"last_\" + mode));\n if(mode == \"archives\"){\n if((lastSeed <= 0)||(lastSeed >= currentDailySeed)){\n lastSeed = currentDailySeed - 1;\n }\n }\n const guesses = window.localStorage.getItem(mode + \"_guesses\") || \"\";\n const historyStr = window.localStorage.getItem(mode + \"_history\");\n const history = historyStr\n ? historyStr.split(\",\").map(Number)\n : new Array(GAME_ROWS + 4).fill(0);\n const currentStreak = Number(\n window.localStorage.getItem(mode + \"_current_streak\") || 0\n );\n const maxStreak = Number(\n window.localStorage.getItem(mode + \"_max_streak\") || 0\n );\n if (lastSeed && (mode === \"free\" || mode === \"archives\" || lastSeed === currentDailySeed)) {\n const guessesArr = guesses ? guesses.split(\",\") : [];\n const answers = generateWordsFromSeed(lastSeed);\n gameData = {\n seed: lastSeed,\n guesses: guessesArr,\n answers,\n current: \"\",\n states: generateAllGamesBoxStates(guessesArr, answers),\n answersCorrect: [0, 1, 2, 3].map((i) =>\n guessesArr.indexOf(answers[i])\n ),\n history,\n currentStreak,\n maxStreak,\n };\n gtagWrap(\"event\", \"restore\", {\n mode: mode,\n daily_seed: mode === \"daily\" ? lastSeed : mode === \"archives\" ? lastSeed : undefined,\n });\n } else {\n const seed = mode === \"daily\" ? currentDailySeed : mode === \"archives\" ? currentDailySeed-1 : date.getTime();\n const answers = generateWordsFromSeed(seed);\n gameData = {\n seed: seed,\n guesses: [],\n answers,\n current: \"\",\n states: generateAllGamesBoxStates([], answers),\n answersCorrect: [-1, -1, -1, -1],\n history,\n currentStreak,\n maxStreak,\n };\n gtagWrap(\"event\", \"start\", {\n mode: mode,\n daily_seed: mode === \"daily\" ? seed : mode === \"archives\" ? lastSeed : undefined,\n });\n }\n } catch (e) {\n const seed = mode === \"daily\" ? currentDailySeed : mode === \"archives\" ? currentDailySeed-1 : date.getTime();\n const answers = generateWordsFromSeed(seed);\n gameData = {\n seed: seed,\n guesses: [],\n answers,\n current: \"\",\n states: generateAllGamesBoxStates([], answers),\n answersCorrect: [-1, -1, -1, -1],\n history: new Array(GAME_ROWS + 4).fill(0),\n currentStreak: 0,\n maxStreak: 0,\n };\n gtagWrap(\"event\", \"start\", {\n mode: mode,\n daily_seed: mode === \"daily\" ? seed : mode === \"archives\" ? seed : undefined,\n });\n }\n gamesData[mode] = gameData;\n });\n\n const [state, setState] = createStore(gamesData);\n\n createEffect(() => {\n try {\n window.localStorage.setItem(\"dark_mode\", String(state.darkMode));\n window.localStorage.setItem(\"blind_mode\", String(state.blindMode));\n window.localStorage.setItem(\"qwerty_mode\", String(state.qwertyMode));\n window.localStorage.setItem(\"vibrate_mode\", String(state.vibrateMode));\n window.localStorage.setItem(\"sharing_mode\", String(state.sharingMode));\n window.localStorage.setItem(\"hint_mode\", String(state.hintMode));\n window.localStorage.setItem(\"fit_mode\", String(state.fitMode));\n window.localStorage.setItem(\"keyboard_height\", String(state.keyboardHeight));\n window.localStorage.setItem(\"last_archives\", String(state[\"archives\"].seed));\n window.localStorage.setItem(\"archives_guesses\", state[\"archives\"].guesses.join(\",\"));\n ([\"daily\", \"free\"] as GameMode[]).forEach((mode) => {\n window.localStorage.setItem(\"last_\" + mode, String(state[mode].seed));\n window.localStorage.setItem(\n mode + \"_guesses\",\n state[mode].guesses.join(\",\")\n );\n window.localStorage.setItem(\n mode + \"_history\",\n state[mode].history.join(\",\")\n );\n window.localStorage.setItem(\n mode + \"_current_streak\",\n String(state[mode].currentStreak)\n );\n window.localStorage.setItem(\n mode + \"_max_streak\",\n String(state[mode].maxStreak)\n );\n });\n } catch (e) {\n // Do nothing if there is no local storage\n }\n });\n return [state, setState];\n}\n\nexport const GamesDataContext =\n createContext<[DeepReadonly, GamesDataProviderFuncs]>();\n\ntype GamesDataProviderProps = {};\nconst GamesDataProvider: Component = (props) => {\n const [state, setState] = createLocalStore();\n const isGameComplete = (mode: GameMode | false) => {\n if(mode != false){\n return (\n state[mode].guesses.length === GAME_ROWS ||\n state[mode].answers.filter(\n (answer) => state[mode].guesses.indexOf(answer) >= 0\n ).length === 4\n );\n } else {\n return false;\n }\n };\n const addLetter = (mode: GameMode, letter: string) => {\n setState(\n produce((s) => {\n if (s[mode].current.length < 5 && !isGameComplete(mode)) {\n s[mode].current += letter;\n }\n })\n );\n };\n const deleteLetter = (mode: GameMode) => {\n setState(\n produce((s) => {\n if (s[mode].current.length > 0 && !isGameComplete(mode)) {\n s[mode].current = s[mode].current.slice(0, -1);\n }\n })\n );\n };\n const submitCurrent = (mode: GameMode) => {\n setState(\n produce((s) => {\n if (\n s[mode].current.length === 5 &&\n (ANSWERS_SET.has(s[mode].current) ||\n ALLOWED_SET.has(s[mode].current)) &&\n !isGameComplete(mode)\n ) {\n const guess = s[mode].current;\n s[mode].guesses.push(guess);\n s[mode].current = \"\";\n for (let i = 0; i < NUM_GAMES; i++) {\n const answerIndex = s[mode].guesses.indexOf(s[mode].answers[i]);\n if (\n answerIndex === -1 ||\n answerIndex === s[mode].guesses.length - 1\n ) {\n s[mode].states[i].push(\n generateBoxStatesFromGuess(guess, s[mode].answers[i])\n );\n }\n s[mode].answersCorrect[i] = s[mode].guesses.indexOf(\n s[mode].answers[i]\n );\n }\n gtagWrap(\"event\", \"guess\", {\n mode: mode,\n daily_seed: mode === \"daily\" ? s[mode].seed : mode === \"archives\" ? s[mode].seed : undefined,\n word: guess,\n });\n if (isGameComplete(mode)) {\n const totalCorrect = s[mode].answersCorrect.reduce(\n (prev, correct) => (prev += correct >= 0 ? 1 : 0),\n 0\n );\n if (totalCorrect === 4) {\n const maxGuessIndex = Math.max(...s[mode].answersCorrect);\n s[mode].history[maxGuessIndex]++;\n s[mode].currentStreak++;\n if (s[mode].currentStreak > s[mode].maxStreak) {\n s[mode].maxStreak = s[mode].currentStreak;\n }\n gtagWrap(\"event\", \"win\", {\n mode: mode,\n daily_seed: mode === \"daily\" ? s[mode].seed : mode === \"archives\" ? s[mode].seed : undefined,\n guesses: s[mode].guesses,\n num_guesses: maxGuessIndex + 1,\n });\n } else {\n s[mode].history[GAME_ROWS + totalCorrect]++;\n if (s[mode].currentStreak > 0) {\n gtagWrap(\"event\", \"streak_reset\", {\n mode: mode,\n daily_seed: mode === \"daily\" ? s[mode].seed : mode === \"archives\" ? s[mode].seed : undefined,\n current_streak: s[mode].currentStreak,\n max_streak: s[mode].maxStreak,\n });\n }\n s[mode].currentStreak = 0;\n gtagWrap(\"event\", \"loss\", {\n mode: mode,\n daily_seed: mode === \"daily\" ? s[mode].seed : mode === \"archives\" ? s[mode].seed : undefined,\n guesses: s[mode].guesses,\n total_correct: totalCorrect,\n });\n }\n }\n } else {\n s[mode].current = \"\";\n }\n })\n );\n };\n const store: [DeepReadonly, GamesDataProviderFuncs] = [\n state,\n {\n setDarkMode(darkMode: boolean) {\n setState(\n produce((s) => {\n s.darkMode = darkMode;\n })\n );\n },\n setDimensions(w: number, h:number) {\n setState(\n produce((s) => {\n s.width = w;\n s.height = h;\n })\n );\n },\n setBlindMode(blindMode: boolean) {\n setState(\n produce((s) => {\n s.blindMode = blindMode;\n })\n );\n },\n setQwertyMode(qwertyMode: boolean) {\n setState(\n produce((s) => {\n s.qwertyMode = qwertyMode;\n })\n );\n },\n setVibrateMode(vibrateMode: boolean) {\n setState(\n produce((s) => {\n s.vibrateMode = vibrateMode;\n })\n );\n },\n setSharingMode(sharingMode: boolean) {\n setState(\n produce((s) => {\n s.sharingMode = sharingMode;\n })\n );\n },\n setHintMode(hintMode: boolean) {\n setState(\n produce((s) => {\n s.hintMode = hintMode;\n })\n );\n },\n setFitMode(fitMode: boolean) {\n setState(\n produce((s) => {\n s.fitMode = fitMode;\n })\n );\n },\n setKeyboardHeight(keyboardHeight: number) {\n setState(\n produce((s) => {\n s.keyboardHeight = keyboardHeight;\n })\n );\n },\n sendKey(mode: GameMode, e: KeyboardEvent) {\n if (e.ctrlKey) return;\n if (e.key === \"Backspace\") {\n deleteLetter(mode);\n } else if (e.key === \"Enter\") {\n submitCurrent(mode);\n } else {\n const key = e.key.toLocaleLowerCase();\n if (ALPHABET.indexOf(key) == -1) return;\n addLetter(mode, key);\n }\n },\n isGameComplete,\n addLetter,\n deleteLetter,\n submitCurrent,\n resetDailyIfOld() {\n const date = new Date();\n const currentDailySeed =\n ((date.getTime() - START_DATE.getTime()) / GAME_PERIOD_MS) >> 0;\n if (currentDailySeed !== state.daily.seed) {\n setState(\n produce((s) => {\n s.daily.seed = currentDailySeed;\n s.daily.guesses = [];\n s.daily.answers = generateWordsFromSeed(currentDailySeed);\n s.daily.current = \"\";\n s.daily.states = [[], [], [], []];\n s.daily.answersCorrect = [-1, -1, -1, -1];\n })\n );\n }\n },\n resetFree() {\n const newSeed = new Date().getTime();\n setState(\n produce((s) => {\n s.free.seed = newSeed;\n s.free.guesses = [];\n s.free.answers = generateWordsFromSeed(newSeed);\n s.free.current = \"\";\n s.free.states = [[], [], [], []];\n s.free.answersCorrect = [-1, -1, -1, -1];\n })\n );\n },\n resetArchives() {\n setState(\n produce((s) => {\n s.archives.guesses = [];\n s.archives.current = \"\";\n s.archives.states = [[], [], [], []];\n s.archives.answersCorrect = [-1, -1, -1, -1];\n })\n );\n },\n goToArchives(newSeed: number) {\n const date = new Date();\n const currentDailySeed = ((date.getTime() - START_DATE.getTime()) / GAME_PERIOD_MS) >> 0;\n if(newSeed >= currentDailySeed){\n newSeed = currentDailySeed - 1;\n } else if(newSeed < 1){\n newSeed = 1;\n }\n console.log(generateWordsFromSeed(newSeed));\n setState(\n produce((s) => {\n s.archives.seed = newSeed;\n s.archives.guesses = [];\n s.archives.answers = generateWordsFromSeed(newSeed);\n s.archives.current = \"\";\n s.archives.states = [[], [], [], []];\n s.archives.answersCorrect = [-1, -1, -1, -1];\n })\n );\n },\n },\n ];\n\n setInterval(() => {\n store[1].resetDailyIfOld();\n }, 1000);\n\n return (\n \n {props.children}\n \n );\n};\n\nexport const useGamesDataContext = () => {\n const context = useContext(GamesDataContext);\n if (!context || !context.length)\n throw new Error(\"GamesDataContext has been used outside provider\");\n return context;\n};\n\nexport default GamesDataProvider;\n","import { Component, JSX } from \"solid-js\";\n\ntype TwitterIconProps = {\n height?: number;\n};\nexport const TwitterIcon: Component = (props) => {\n return (\n \n \n \n \n \n );\n};\n\ntype GithubIconProps = {\n height?: number;\n};\nexport const GithubIcon: Component = (props) => {\n return (\n \n \n \n );\n};\n\ntype FacebookIconProps = {\n height?: number;\n};\nexport const FacebookIcon: Component = (props) => {\n return (\n \n \n \n );\n};\n\ntype RedditIconProps = {\n height?: number;\n};\nexport const RedditIcon: Component = (props) => {\n return (\n \n \n \n );\n};\n\ntype InstagramIconProps = {\n height?: number;\n};\nexport const InstagramIcon: Component = (props) => {\n return (\n \n \n \n );\n};\n\nexport const HelpIcon: Component = () => {\n return (\n \n \n \n );\n};\n\nexport const ChevronDownIcon: Component = (\n props\n) => {\n return (\n \n \n \n );\n};\n\nexport const PrevIcon: Component = (\n props\n) => {\n return (\n \n \n \n );\n};\n\nexport const NextIcon: Component = (\n props\n) => {\n return (\n \n \n \n );\n};\n\nexport const StartIcon: Component = (\n props\n) => {\n return (\n \n \n \n );\n};\n\nexport const EndIcon: Component = (\n props\n) => {\n return (\n \n \n \n );\n};\n\nexport const DonateIcon: Component = (props) => {\n return (\n \n \n \n );\n};\n\nexport const PatreonIcon: Component = (props) => {\n return (\n \n \n \n );\n};\n\nexport const ArchivesIcon: Component = (props) => {\n return (\n \n \n \n );\n};\n\nexport const CalendarIcon: Component = (props) => {\n return (\n \n \n \n );\n};\n\nexport const DiceIcon: Component = (props) => {\n return (\n \n \n \n );\n};\n\nexport const ParametersIcon: Component = (props) => {\n return (\n \n \n \n );\n};\n\nexport const ShareIcon: Component = () => {\n return (\n \n \n \n );\n};\n\nexport const LinkIcon: Component = () => {\n return (\n \n \n \n );\n};\n\n\nexport const ClipboardCopyIcon: Component = () => {\n return (\n \n \n \n );\n};\n\nexport const SaveIcon: Component = () => {\n return (\n \n \n \n );\n};\n\nexport const PlusIcon: Component = () => {\n return (\n \n \n \n );\n};\n\nexport const StatisticsIcon: Component = () => {\n return (\n \n \n \n );\n};\n","import { Component, createMemo, createSignal, JSX, onCleanup } from \"solid-js\";\nimport { GAME_PERIOD_MS, START_DATE } from \"./constants\";\nimport { useGamesDataContext } from \"./GameDataProvider\";\nimport { PlusIcon } from \"./icons\";\nimport { GameMode } from \"./types\";\nimport { timeUntil, vibrate } from \"./utils\";\n\ntype NewGameButtonProps = {\n onClick?: JSX.EventHandlerUnion;\n class?: string;\n};\nconst NewGameButton: Component = (props) => {\n return (\n \n {props.children}\n \n );\n};\n\ntype ArchivesButtonProps = {\n onClick?: JSX.EventHandlerUnion;\n class?: string;\n};\nconst NextArchivesButton: Component = (props) => {\n return (\n \n {props.children}\n \n );\n};\nconst PrevArchivesButton: Component = (props) => {\n return (\n \n {props.children}\n \n );\n};\n\ntype GameCompleteBannerProps = {\n mode: GameMode;\n};\nconst GameCompleteBanner: Component = (props) => {\n const [gamesData, gamesDataFuncs] = useGamesDataContext();\n\n const numWordsCorrect = createMemo(() =>\n gamesData[props.mode].answersCorrect.reduce(\n (prev, correct) => (prev += correct >= 0 ? 1 : 0),\n 0\n )\n );\n\n const nextDailyTime = createMemo(() => {\n return new Date(\n START_DATE.getTime() + (gamesData[props.mode].seed + 1) * GAME_PERIOD_MS\n );\n });\n\n const [currentDate, setCurrentDate] = createSignal(new Date());\n\n const timer = setInterval(() => setCurrentDate(new Date()), 1000);\n onCleanup(() => clearInterval(timer));\n\n return (\n
\n \n {numWordsCorrect() === 4\n ? \"Quordle Résolu !\"\n : numWordsCorrect() === 3\n ? \"Si proche !\"\n : \"Encore un effort...\"}\n
\n {props.mode === \"free\" ? (\n {vibrate(gamesData.vibrateMode); gamesDataFuncs.resetFree();}}>\n
\n \n
Nouvel entrainement
\n
\n
\n ) : props.mode === \"daily\" ? (\n
Prochain jeu {timeUntil(currentDate(), nextDailyTime())}
\n ) : (\"\")}\n \n );\n};\n\nexport default GameCompleteBanner;\n","import fileSaver from \"file-saver\";\nimport { DeepReadonly } from \"solid-js/store\";\nimport { GAME_COLS, GAME_ROWS } from \"./constants\";\nimport { BoxState, GameData, GameMode, ShareType } from \"./types\";\nimport { useGamesDataContext } from \"./GameDataProvider\";\nimport { gtagWrap } from \"./utils\";\n\nexport const getNumEmoji = (num: number) => {\n if (num < 0) {\n return \"\\uD83D\\uDFE5\";\n } else if (num === 0) {\n return \"1️⃣\";\n } else if (num === 1) {\n return \"2️⃣\";\n } else if (num === 2) {\n return \"3️⃣\";\n } else if (num === 3) {\n return \"4️⃣\";\n } else if (num === 4) {\n return \"5️⃣\";\n } else if (num === 5) {\n return \"6️⃣\";\n } else if (num === 6) {\n return \"7️⃣\";\n } else if (num === 7) {\n return \"8️⃣\";\n } else if (num === 8) {\n return \"9️⃣\";\n }\n};\n\nconst getEmojiRow = (states: readonly BoxState[] | undefined) => {\n let emojis = \"\";\n if (!states || states.length === 0) {\n return \"\\u2B1B\\u2B1B\\u2B1B\\u2B1B\\u2B1B\";\n }\n for (let i = 0; i < states.length; i++) {\n if (states[i] === \"correct\") {\n emojis += \"\\uD83D\\uDFE9\";\n } else if (states[i] === \"diff\") {\n emojis += \"\\uD83D\\uDFE8\";\n } else if (states[i] === \"none\") {\n emojis += \"\\u2B1C\";\n }\n }\n return emojis;\n};\n\nconst getColorFromState = (state: BoxState | undefined) => {\n if (!state) return \"#2d2d2d\";\n if (state === \"correct\") return \"#00cc88\";\n if (state === \"diff\") return \"#ffcc00\";\n if (state === \"none\") return \"#e0e0e0\";\n return \"#2d2d2d\";\n};\n\nfunction roundRect(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n height: number,\n radius: number\n) {\n const radius_obj = { tl: radius, tr: radius, br: radius, bl: radius };\n ctx.beginPath();\n ctx.moveTo(x + radius_obj.tl, y);\n ctx.lineTo(x + width - radius_obj.tr, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius_obj.tr);\n ctx.lineTo(x + width, y + height - radius_obj.br);\n ctx.quadraticCurveTo(\n x + width,\n y + height,\n x + width - radius_obj.br,\n y + height\n );\n ctx.lineTo(x + radius_obj.bl, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius_obj.bl);\n ctx.lineTo(x, y + radius_obj.tl);\n ctx.quadraticCurveTo(x, y, x + radius_obj.tl, y);\n ctx.closePath();\n ctx.fill();\n}\n\nexport const getShareText = (\n mode: GameMode,\n gameData: DeepReadonly,\n sharingMode: boolean\n): [string, string] => {\n let textShare = \"\";\n if ((mode === \"daily\")||(mode === \"archives\")) {\n textShare =\n \"@QuordleFr Jour #\" +\n gameData.seed.toString(10) +\n \"\\n\" +\n getNumEmoji(gameData.answersCorrect[0]) +\n getNumEmoji(gameData.answersCorrect[1]) +\n \"\\n\" +\n getNumEmoji(gameData.answersCorrect[2]) +\n getNumEmoji(gameData.answersCorrect[3]);\n } else {\n textShare =\n \"@QuordleFr Entrainement\\n\" +\n getNumEmoji(gameData.answersCorrect[0]) + getNumEmoji(gameData.answersCorrect[1]) + \" (\" + gameData.answers[0].toUpperCase() + \" - \" + gameData.answers[1].toUpperCase() + \")\\n\" + getNumEmoji(gameData.answersCorrect[2]) + getNumEmoji(gameData.answersCorrect[3]) + \" (\" + gameData.answers[2].toUpperCase() + \" - \" + gameData.answers[3].toUpperCase() + \")\";\n }\n\n textShare += \"\\nquordle.desmaths.fr\";\n const textMobileShare = textShare;\n console.log(sharingMode);\n if(sharingMode){\n textShare += \"\\n\";\n let l1 = GAME_ROWS - 1;\n if (gameData.answersCorrect[0] >= 0 && gameData.answersCorrect[1] >= 0) {\n l1 = Math.max(gameData.answersCorrect[0], gameData.answersCorrect[1]);\n }\n let l2 = GAME_ROWS - 1;\n if (gameData.answersCorrect[2] >= 0 && gameData.answersCorrect[3] >= 0) {\n l2 = Math.max(gameData.answersCorrect[2], gameData.answersCorrect[3]);\n }\n for (let i = 0; i <= l1; i++) {\n textShare +=\n getEmojiRow(gameData.states[0][i]) +\n \" \" +\n getEmojiRow(gameData.states[1][i]) +\n \"\\n\";\n }\n textShare += \"\\n\";\n for (let i = 0; i <= l2; i++) {\n textShare +=\n getEmojiRow(gameData.states[2][i]) +\n \" \" +\n getEmojiRow(gameData.states[3][i]) +\n \"\\n\";\n }\n }\n return [textShare, textMobileShare];\n};\n\nexport const shareGame = async (\n mode: GameMode,\n gameData: DeepReadonly,\n shareType: ShareType,\n sharingMode: boolean\n) => {\n const [textShare, textMobileShare] = getShareText(mode, gameData, sharingMode);\n\n gtagWrap(\"event\", \"share\", {\n mode: mode,\n share_type: shareType,\n daily_seed: mode === \"daily\" ? gameData.seed : undefined,\n });\n\n if (shareType === \"clipboard\") {\n // Deprecated in favor of document.execCommand(\"copy\") method\n navigator.clipboard\n .writeText(textShare)\n .then(() => alert(\"Résultats copiés dans le presse-papier !\"))\n .catch((e) => {\n console.error(e);\n alert(\"Erreur lors de la copie dans le presse-papier !\");\n });\n } else if (shareType === \"share\") {\n navigator\n .share({\n text: textShare,\n })\n .catch((e) => console.error(e));\n } else if (shareType === \"image\" || shareType === \"image_save\") {\n const canvas = document.createElement(\"canvas\");\n canvas.style.display = \"none\";\n\n let l1 = GAME_ROWS - 1;\n if (gameData.answersCorrect[0] >= 0 && gameData.answersCorrect[1] >= 0) {\n l1 = Math.max(gameData.answersCorrect[0], gameData.answersCorrect[1]);\n }\n let l2 = GAME_ROWS - 1;\n if (gameData.answersCorrect[2] >= 0 && gameData.answersCorrect[3] >= 0) {\n l2 = Math.max(gameData.answersCorrect[2], gameData.answersCorrect[3]);\n }\n\n const size = 64;\n const padding = size / 16;\n const radius = size / 8;\n const fontScale = 0.75;\n const textPadding = size / 4;\n canvas.width = (size + padding) * 11 - padding;\n canvas.height = (size + padding) * (l1 + 1 + l2 + 1 + 4) - padding;\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) return;\n\n ctx.fillStyle = \"black\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n // draw words 1 + 2\n let x = 0;\n let y = 0;\n for (let i = 0; i <= l1; i++) {\n let states = gameData.states[0][i];\n for (x = 0; x < GAME_COLS; x++) {\n ctx.fillStyle = getColorFromState(states?.[x]);\n roundRect(\n ctx,\n x * (size + padding),\n y * (size + padding),\n size,\n size,\n radius\n );\n }\n\n states = gameData.states[1][i];\n for (x = 6; x < GAME_COLS + 6; x++) {\n ctx.fillStyle = getColorFromState(states?.[x - 6]);\n roundRect(\n ctx,\n x * (size + padding),\n y * (size + padding),\n size,\n size,\n radius\n );\n }\n y++;\n }\n\n // draw middle text\n ctx.font = size * fontScale + \"px Arial\";\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"alphabetic\";\n ctx.fillStyle = \"#ffffff\";\n\n const titleText =\n mode === \"free\"\n ? \"@QuordleFr Entrainement\"\n : \"@QuordleFr Jour #\" + gameData.seed.toString(10);\n let metrics = ctx.measureText(titleText);\n let fontHeight = metrics.actualBoundingBoxAscent;\n ctx.fillText(\n titleText,\n canvas.width / 2,\n y * (size + padding) + size - (size - fontHeight) / 2,\n canvas.width - textPadding * 2\n );\n y++;\n for (let row = 0; row < 2; row++) {\n for (let i = 0; i < 2; i++) {\n ctx.fillStyle =\n gameData.answersCorrect[i + row * 2] >= 0 ? \"#00a6ed\" : \"#f8312f\";\n const dir = i * 2 - 1;\n const xTopCenter =\n canvas.width / 2 + dir * (padding / 2) + dir * (size / 2);\n roundRect(\n ctx,\n xTopCenter - size / 2,\n y * (size + padding),\n size,\n size,\n radius\n );\n if (gameData.answersCorrect[i + row * 2] >= 0) {\n ctx.textAlign = \"center\";\n ctx.fillStyle = \"#ffffff\";\n const numText = String(gameData.answersCorrect[i + row * 2] + 1);\n metrics = ctx.measureText(numText);\n fontHeight =\n metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent;\n ctx.fillText(\n numText,\n xTopCenter,\n y * (size + padding) + size - (size - fontHeight) / 2,\n size\n );\n }\n }\n if (mode === \"free\") {\n ctx.textAlign = \"right\";\n ctx.fillStyle = \"#ffffff\";\n let wordText = gameData.answers[0 + row * 2].toUpperCase();\n metrics = ctx.measureText(wordText);\n fontHeight =\n metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent;\n ctx.fillText(\n wordText,\n canvas.width / 2 - padding / 2 - size - textPadding,\n y * (size + padding) + size - (size - fontHeight) / 2,\n canvas.width / 2 - padding - size - textPadding * 2\n );\n ctx.textAlign = \"left\";\n wordText = gameData.answers[1 + row * 2].toUpperCase();\n metrics = ctx.measureText(wordText);\n fontHeight =\n metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent;\n ctx.fillText(\n wordText,\n canvas.width / 2 + padding / 2 + size + textPadding,\n y * (size + padding) + size - (size - fontHeight) / 2,\n canvas.width / 2 - padding - size - textPadding * 2\n );\n }\n y++;\n }\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillStyle = \"#ffffff\";\n ctx.fillText(\n \"quordle.desmaths.fr\",\n canvas.width / 2,\n y * (size + padding) + size / 2,\n canvas.width\n );\n y++;\n\n // draw words 3 + 4\n for (let i = 0; i <= l2; i++) {\n x = 0;\n let states = gameData.states[2][i];\n for (x = 0; x < GAME_COLS; x++) {\n ctx.fillStyle = getColorFromState(states?.[x]);\n roundRect(\n ctx,\n x * (size + padding),\n y * (size + padding),\n size,\n size,\n radius\n );\n }\n\n states = gameData.states[3][i];\n for (x = 6; x < GAME_COLS + 6; x++) {\n ctx.fillStyle = getColorFromState(states?.[x - 6]);\n roundRect(\n ctx,\n x * (size + padding),\n y * (size + padding),\n size,\n size,\n radius\n );\n }\n y++;\n }\n\n const blob: Blob | null = await new Promise((resolve) =>\n canvas.toBlob(resolve)\n );\n\n if (!blob) return;\n const filename = `quordle-${mode === \"free\" ? \"entrainement\" : \"jour\"}-${\n gameData.seed\n }.png`;\n const file = new File([blob], filename, { type: \"image/png\" });\n\n if (shareType === \"image\") {\n navigator\n .share({\n files: [file],\n text: textMobileShare,\n })\n .catch((e) => console.error(e));\n } else if (shareType === \"image_save\") {\n fileSaver.saveAs(file, filename);\n }\n }\n};\n","import { Component, createMemo, createSignal, JSX } from \"solid-js\";\nimport { CAN_SHARE_IMAGE, CAN_SHARE_TEXT } from \"./constants\";\nimport { useGamesDataContext } from \"./GameDataProvider\";\nimport { ClipboardCopyIcon, SaveIcon, ShareIcon, LinkIcon, TwitterIcon } from \"./icons\";\nimport { getNumEmoji, getShareText, shareGame } from \"./share\";\nimport { GameMode } from \"./types\";\nimport { gtagWrap, vibrate } from \"./utils\";\n\ntype ShareButtonsProps = {\n onClick?: JSX.EventHandlerUnion;\n class?: string;\n};\nconst ShareButton: Component = (props) => {\n return (\n \n {props.children}\n \n );\n};\n\ntype GameShareProps = {\n mode: GameMode;\n};\nconst GameShare: Component = (props) => {\n const [gamesData, gamesDataFuncs] = useGamesDataContext();\n\n const [textAreaRef, setTextAreaRef] = createSignal<\n HTMLTextAreaElement | undefined\n >(undefined);\n\n const [showTextArea, setShowTextArea] = createSignal(false);\n\n const shareText = createMemo(\n () => getShareText(props.mode, gamesData[props.mode], gamesData.sharingMode)[0]\n );\n \n const LinkDef1 = \"https://1mot.net/\" + gamesData[props.mode].answers[0];\n const LinkDef2 = \"https://1mot.net/\" + gamesData[props.mode].answers[1];\n const LinkDef3 = \"https://1mot.net/\" + gamesData[props.mode].answers[2];\n const LinkDef4 = \"https://1mot.net/\" + gamesData[props.mode].answers[3];\n\n return (\n
\n
\n
\n = 0,\n \"text-rose-600\": gamesData[props.mode].answersCorrect[0] < 0,\n }}\n >\n {gamesData[props.mode].answers[0].toLocaleUpperCase()}\n \n \n {getNumEmoji(gamesData[props.mode].answersCorrect[0])}\n \n
\n
\n \n {getNumEmoji(gamesData[props.mode].answersCorrect[1])}\n \n = 0,\n \"text-rose-600\": gamesData[props.mode].answersCorrect[1] < 0,\n }}\n >\n {gamesData[props.mode].answers[1].toLocaleUpperCase()} \n \n
\n
\n
\n
\n = 0,\n \"text-rose-600\": gamesData[props.mode].answersCorrect[2] < 0,\n }}\n >\n {gamesData[props.mode].answers[2].toLocaleUpperCase()}\n \n \n {getNumEmoji(gamesData[props.mode].answersCorrect[2])}\n \n
\n
\n \n {getNumEmoji(gamesData[props.mode].answersCorrect[3])}\n \n = 0,\n \"text-rose-600\": gamesData[props.mode].answersCorrect[3] < 0,\n }}\n >\n {gamesData[props.mode].answers[3].toLocaleUpperCase()} \n \n
\n
\n
\n {CAN_SHARE_TEXT && (\n {\n vibrate(gamesData.vibrateMode);\n shareGame(props.mode, gamesData[props.mode], \"share\", gamesData.sharingMode);\n }}\n >\n
\n \n
Partager
\n
\n \n )}\n {CAN_SHARE_IMAGE ? (\n
\n {\n vibrate(gamesData.vibrateMode);\n shareGame(props.mode, gamesData[props.mode], \"image\", gamesData.sharingMode);\n }}\n >\n
\n \n
Image
\n
\n \n {\n vibrate(gamesData.vibrateMode);\n shareGame(props.mode, gamesData[props.mode], \"image_save\", gamesData.sharingMode);\n }}\n >\n \n \n
\n ) : (\n {\n vibrate(gamesData.vibrateMode);\n shareGame(props.mode, gamesData[props.mode], \"image_save\", gamesData.sharingMode);\n }}\n >\n
\n \n
Sauvegarder en image
\n
\n \n )}\n
\n {textAreaRef() && (\n
\n {\n vibrate(gamesData.vibrateMode);\n gtagWrap(\"event\", \"share\", {\n mode: props.mode,\n share_type: \"clipboard\",\n daily_seed:\n props.mode === \"daily\"\n ? gamesData[props.mode].seed\n : undefined,\n });\n setShowTextArea(true);\n const textArea = textAreaRef();\n if (textArea) {\n textArea.select();\n document.execCommand(\"copy\");\n const selection = window.getSelection && window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n }\n textArea.blur();\n }\n alert(\"Résultats copiés dans le presse-papier !\");\n }}\n >\n
\n \n
Copier
\n
\n \n
\n )}\n \n {shareText()}\n \n
\n );\n};\n\nexport default GameShare;\n","import { Component, createSignal, createMemo } from \"solid-js\";\nimport { ALLOWED_SET, ANSWERS_SET, NUM_GAMES_X } from \"./constants\";\nimport { useGamesDataContext } from \"./GameDataProvider\";\nimport { createResizeObserverPoly } from \"./ResizeObserverPoly\";\nimport { BoxState, GameMode } from \"./types\";\n\ntype GameTileState = BoxState | \"invalid\";\ntype TemporalState = \"past\" | \"present\" | \"future\" | \"never\" | \"nevernow\";\n\ntype GameTileRendererProps = {\n mode: GameMode;\n gameRow: number;\n gameCol: number;\n actualCol: number;\n state: GameTileState;\n letter: string;\n placeholder: string;\n rowTemporalState: TemporalState;\n};\nexport const GameTileRenderer: Component = (props) => {\n const [gamesData, gamesDataFuncs] = useGamesDataContext();\n\n const widthBox = createMemo(() => {\n const wscreen = gamesData.width;\n const hscreen = gamesData.height;\n const hsquare = (wscreen-56)/10;\n if(!props.mode){\n return(\"height:\" + hsquare + \"px; font-size:\" + (hsquare/1.25) + \"px;\");\n }\n let harchives = props.mode === \"archives\" ? 42 : 0;\n let hfit = gamesDataFuncs.isGameComplete(props.mode) ? Math.max(16, (hscreen - 90 - harchives)/18) : Math.max(16, (hscreen - hsquare*2 - 90 - harchives)/16);\n if((gamesData.fitMode == false)||(props.rowTemporalState == \"present\")||((props.rowTemporalState === \"nevernow\")&&((!gamesDataFuncs.isGameComplete(props.mode))))){\n return(\"height:\" + hsquare + \"px; font-size:\" + (hsquare/1.25) + \"px;\");\n } else {\n return(\"font-weight:bold;height:\" + Math.min(hfit, hsquare) + \"px; font-size:\" + (Math.min(hfit, hsquare)/1.25) + \"px;\");\n }\n });\n \n return (\n \n
\n
\n
\n );\n};\n\ntype GameTileProps = {\n mode: GameMode;\n gameX: number;\n gameY: number;\n gameCol: number;\n gameRow: number;\n};\nconst GameTile: Component = (props) => {\n const gameIndex = props.gameX + props.gameY * NUM_GAMES_X;\n\n const [gamesData] = useGamesDataContext();\n\n const actualCol = createMemo(() => {\n const gameData = gamesData[props.mode];\n const current = gameData.current;\n return current.length;\n });\n \n const shouldRenderLetter = createMemo(() => {\n const gameData = gamesData[props.mode];\n const current = gameData.current;\n const guesses = gameData.guesses;\n const answer = gameData.answers[gameIndex];\n const answerIndex = guesses.indexOf(answer);\n return (\n props.gameRow <= answerIndex ||\n (answerIndex === -1 && props.gameRow < guesses.length) ||\n (answerIndex === -1 &&\n props.gameRow === guesses.length &&\n props.gameCol < current.length)\n );\n });\n\n const letter = createMemo(() => {\n const gameData = gamesData[props.mode];\n const guesses = gameData.guesses;\n const current = gameData.current;\n let letter: string = \"\";\n if (!shouldRenderLetter()) {\n return letter;\n } else if (props.gameRow < guesses.length) {\n letter = guesses[props.gameRow][props.gameCol];\n } else if (props.gameRow === guesses.length) {\n letter = current[props.gameCol];\n }\n return letter.toUpperCase();\n });\n\n const gameTileState = createMemo((): GameTileState => {\n const gameData = gamesData[props.mode];\n const guesses = gameData.guesses;\n const states = gameData.states;\n const current = gameData.current;\n if (shouldRenderLetter()) {\n if (props.gameRow < guesses.length) {\n return states[gameIndex][props.gameRow]?.[props.gameCol] || \"none\";\n } else if ( current.indexOf(\"?\") > -1 ) {\n return \"none\";\n } else if ( props.gameRow === guesses.length && current.length === 5 && !ALLOWED_SET.has(current) && !ANSWERS_SET.has(current) ) {\n return \"invalid\";\n }\n }\n return \"none\";\n });\n \n const shouldRenderPlaceholder = createMemo(() => {\n const gameData = gamesData[props.mode];\n const current = gameData.current;\n const guesses = gameData.guesses;\n const answer = gameData.answers[gameIndex];\n const answerIndex = guesses.indexOf(answer);\n return (\n props.gameRow <= answerIndex ||\n (answerIndex === -1 && props.gameRow < guesses.length) ||\n (answerIndex === -1 && props.gameRow === guesses.length)\n );\n });\n \n const placeholder = createMemo(() => {\n const gameData = gamesData[props.mode];\n const guesses = gameData.guesses;\n const answer = gameData.answers[gameIndex];\n if (!shouldRenderPlaceholder()) {\n return \"\";\n }\n for(var i = 0; i < guesses.length ; i++){\n if(guesses[i][props.gameCol] == answer[props.gameCol]){\n return answer[props.gameCol].toUpperCase();\n }\n }\n return \"\";\n });\n\n const temporalState = createMemo((): TemporalState => {\n const gameData = gamesData[props.mode];\n const guesses = gameData.guesses;\n const answerIndex = gameData.answersCorrect[gameIndex];\n\n // Have we already answered this row? We will never guess post-answer\n if ((props.gameRow === guesses.length)&&(answerIndex !== -1 && answerIndex < props.gameRow)) return \"nevernow\";\n \n if (answerIndex !== -1 && answerIndex < props.gameRow) return \"never\";\n\n if (guesses.length > props.gameRow) return \"past\";\n\n if (props.gameRow === guesses.length) return \"present\";\n return \"future\";\n });\n\n return (\n \n );\n};\n\nexport default GameTile;\n","import { NavLink } from \"solid-app-router\";\nimport Dismiss from \"solid-dismiss\";\nimport { Component, createSignal } from \"solid-js\";\nimport favicon48 from \"./assets/favicon-48.png\";\nimport { useGamesDataContext } from \"./GameDataProvider\";\nimport {\n ChevronDownIcon,\n DonateIcon,\n HelpIcon,\n PatreonIcon,\n StatisticsIcon,\n CalendarIcon,\n DiceIcon,\n ArchivesIcon,\n ParametersIcon\n} from \"./icons\";\nimport { GameMode } from \"./types\";\nimport { vibrate } from \"./utils\";\n\ntype HeaderProps = {\n mode: GameMode;\n onOpenTutorial: () => void;\n onOpenStatistics: () => void;\n onOpenParameters: () => void;\n};\nconst Header: Component = (props) => {\n const [gamesData, gamesDataFuncs] = useGamesDataContext();\n\n const [open, setOpen] = createSignal(false);\n const [btnEl, setBtnEl] = createSignal();\n /*\n none: \"#d1d5db\",\n diff: \"#ffcc00\",\n correct: \"#00cc88\",\n if(gamesData.blindMode){\n colorOptions.diff = \"#60a5fa\";\n colorOptions.correct = \"#fb923c\";\n }\n */\n return (\n
\n \n );\n};\n\nexport default Header;\n","import { Component, createMemo } from \"solid-js\";\nimport { ALPHABET, KEYBOARD_KEYS_AZERTY, KEYBOARD_KEYS_QWERTY } from \"./constants\";\nimport { useGamesDataContext } from \"./GameDataProvider\";\nimport { BoxState, GameMode } from \"./types\";\nimport { vibrate } from \"./utils\";\n\ntype KeyProps = {\n mode: GameMode;\n x: number;\n y: number;\n key: string;\n};\nconst Key: Component = (props) => {\n const [gamesData, gamesDataFuncs] = useGamesDataContext();\n\n const keyLower = createMemo(() => props.key.toLocaleLowerCase());\n \n const keyType = createMemo(() => {\n const guesses = gamesData[props.mode].guesses;\n\n let keyHasBeenGuessed = false;\n for (let g = 0; g < guesses.length; g++) {\n if (guesses[g].indexOf(keyLower()) >= 0) {\n keyHasBeenGuessed = true;\n break;\n }\n }\n \n let keyIsNotUtil = true;\n \n for (let c = 0; c < 4; c++) {\n const gameStates = gamesData[props.mode].states[c];\n for (let row = 0; row < gameStates.length; row++) {\n for (let col = 0; col < gameStates[row].length; col++) {\n if (keyLower() === guesses[row][col] && (gameStates[row][col] === \"correct\" || gameStates[row][col] === \"diff\")) {\n keyIsNotUtil = false;\n }\n }\n }\n }\n if (!keyHasBeenGuessed) {\n return(0);\n } else if(keyIsNotUtil) {\n return(1);\n } else {\n return(2);\n }\n });\n\n const keyStyle = createMemo(() => {\n const guesses = gamesData[props.mode].guesses;\n\n let keyHasBeenGuessed = false;\n for (let g = 0; g < guesses.length; g++) {\n if (guesses[g].indexOf(keyLower()) >= 0) {\n keyHasBeenGuessed = true;\n break;\n }\n }\n let percent = gamesData.keyboardHeight*10;\n if (!keyHasBeenGuessed) {\n return(\"padding-bottom:calc(\" + percent + \"% - 0.25rem);\");\n }\n const colorOptions: { [key in BoxState]: string } = {\n none: \"#d1d5db\",\n diff: \"#ffcc00\",\n correct: \"#00cc88\",\n };\n if(gamesData.darkMode){\n colorOptions.none = \"#9ca3af\";\n }\n if(gamesData.blindMode){\n colorOptions.diff = \"#60a5fa\";\n colorOptions.correct = \"#fb923c\";\n }\n \n const keyColors = [\n colorOptions.none,\n colorOptions.none,\n colorOptions.none,\n colorOptions.none,\n ];\n for (let c = 0; c < keyColors.length; c++) {\n const gameStates = gamesData[props.mode].states[c];\n for (let row = 0; row < gameStates.length; row++) {\n for (let col = 0; col < gameStates[row].length; col++) {\n if (\n keyLower() === guesses[row][col] &&\n (gameStates[row][col] === \"correct\" ||\n gameStates[row][col] === \"diff\")\n ) {\n if (gameStates[row][col] === \"correct\") {\n keyColors[c] = colorOptions.correct;\n } else if (\n gameStates[row][col] === \"diff\" &&\n keyColors[c] !== colorOptions.correct\n ) {\n keyColors[c] = colorOptions.diff;\n }\n }\n }\n }\n }\n if((keyColors[1] == colorOptions.none)&&(keyColors[2] == colorOptions.none)&&(keyColors[3] == colorOptions.none)&&(keyColors[0] == colorOptions.none)){\n return(\"padding-bottom:calc(\" + percent + \"% - 0.25rem);\");\n } else {\n return (\"background:conic-gradient(\" + keyColors[1] + \" 0deg 90deg, \" + keyColors[3] + \" 90deg 180deg, \" + keyColors[2] + \" 180deg 270deg, \" + keyColors[0] + \" 270deg 360deg);padding-bottom:calc(\"+ percent + \"% - 0.25rem);\");\n }\n });\n return (\n {\n vibrate(gamesData.vibrateMode);\n gamesDataFuncs.sendKey(\n props.mode,\n new KeyboardEvent(\"keydown\", {\n keyCode: props.key.startsWith(\"enter\")\n ? 13\n : props.key.startsWith(\"bs\")\n ? 8\n : ALPHABET.indexOf(props.key.toLocaleLowerCase()) + 65,\n key: props.key.startsWith(\"enter\")\n ? \"Enter\"\n : props.key.startsWith(\"bs\")\n ? \"Backspace\"\n : props.key.toLocaleLowerCase(),\n })\n );\n }}\n >\n \n \n );\n};\n\ntype KeyboardProps = {\n mode: GameMode;\n};\n\nconst Keyboard: Component = (props) => {\n const [gamesData] = useGamesDataContext();\n return (\n
\n {(gamesData.qwertyMode?KEYBOARD_KEYS_QWERTY:KEYBOARD_KEYS_AZERTY).map((row, y) => (\n
\n {row.map((key, x) => (\n \n ))}\n
\n ))}\n
\n );\n};\n\n\nexport default Keyboard;\n","import { ResizeObserver as ResizeObserverPoly } from \"@juggle/resize-observer\";\nimport { createEffect, createSignal, onCleanup } from \"solid-js\";\n\ntype ObservedSize = {\n width: number | undefined;\n height: number | undefined;\n};\n\ntype ResizeHandler = (size: ObservedSize, ref: Element) => void;\n\nexport function createResizeObserverPoly(opts: {\n onResize: ResizeHandler;\n refs?: T | T[] | (() => T | T[]);\n}): (arg: T) => void {\n const [otherRefs, setOtherRefs] = createSignal([]);\n // @ts-ignore\n const refCallback = (e: T) => setOtherRefs((l: T[]) => l.concat(e));\n const previousMap = new Map();\n const resizeObserver = new ResizeObserverPoly((entries) => {\n if (!Array.isArray(entries)) {\n return;\n }\n for (const entry of entries) {\n const newWidth = Math.round(entry.contentRect.width);\n const newHeight = Math.round(entry.contentRect.height);\n const previous = previousMap.get(entry.target);\n if (\n !previous ||\n previous.width !== newWidth ||\n previous.height !== newHeight\n ) {\n const newSize = { width: newWidth, height: newHeight };\n opts.onResize(newSize, entry.target);\n previousMap.set(entry.target, { width: newWidth, height: newHeight });\n }\n }\n });\n createEffect((oldRefs?: T[]) => {\n let refs: T[] = [];\n if (opts.refs) {\n const optsRefs =\n typeof opts.refs === \"function\" ? opts.refs() : opts.refs;\n if (Array.isArray(optsRefs)) refs = refs.concat(optsRefs);\n else refs.push(optsRefs);\n }\n refs = refs.concat(otherRefs());\n oldRefs = oldRefs || [];\n oldRefs.forEach((oldRef) => {\n if (!(oldRef in refs)) {\n resizeObserver.unobserve(oldRef);\n previousMap.delete(oldRef);\n }\n });\n refs.forEach((ref) => {\n if (!(ref in oldRefs!)) {\n resizeObserver.observe(ref);\n }\n });\n return refs;\n });\n onCleanup(() => resizeObserver.disconnect());\n return refCallback;\n}\n","import { Component, createMemo, createSignal } from \"solid-js\";\nimport { GAME_ROWS, NUM_GAMES } from \"./constants\";\nimport { useGamesDataContext } from \"./GameDataProvider\";\nimport { GameMode } from \"./types\";\n\nconst winHistoryIndices = [...Array(GAME_ROWS - (NUM_GAMES - 1)).keys()].map(\n (x) => x + (NUM_GAMES - 1)\n);\nconst lossHistoryIndices = [...Array(NUM_GAMES).keys()]\n .map((x) => x + GAME_ROWS)\n .reverse();\n\ntype StatisticsProps = {\n mode: GameMode;\n onCloseStatistics: () => void;\n};\nconst Statistics: Component = (props) => {\n const [gamesData, gamesDataFuncs] = useGamesDataContext();\n\n const [lossDistributionOpen, setLossDistributionOpen] = createSignal(false);\n\n const mode = props.mode === \"free\" ? props.mode : \"daily\";\n\n const winMaxValue = createMemo(() =>\n Math.max(\n ...gamesData[mode].history.slice(NUM_GAMES - 1, GAME_ROWS),\n 1\n )\n );\n const lossMaxValue = createMemo(() =>\n Math.max(...gamesData[mode].history.slice(GAME_ROWS), 1)\n );\n\n const numWins = createMemo(() =>\n gamesData[mode].history\n .slice(NUM_GAMES - 1, GAME_ROWS)\n .reduce((prev, num) => prev + num, 0)\n );\n\n const numLosses = createMemo(() =>\n gamesData[mode].history\n .slice(GAME_ROWS)\n .reduce((prev, num) => prev + num, 0)\n );\n\n const totalGames = createMemo(() => numWins() + numLosses());\n\n const currentGameNumCorrect = createMemo(() =>\n gamesData[mode].answersCorrect.reduce(\n (prev, correct) => (prev += correct >= 0 ? 1 : 0),\n 0\n )\n );\n const currentGameMaxCorrect = createMemo(() =>\n Math.max(...gamesData[mode].answersCorrect)\n );\n const currentGameWin = createMemo(\n () =>\n gamesDataFuncs.isGameComplete(mode) &&\n currentGameNumCorrect() === NUM_GAMES\n );\n const currentGameLoss = createMemo(\n () =>\n gamesDataFuncs.isGameComplete(mode) &&\n currentGameNumCorrect() < NUM_GAMES\n );\n\n return (\n
\n
\n \n \n \n \n \n
\n
\n
\n Statistiques {mode === \"daily\" ? \"quotidiennes\" : \"d'entrainement\"}\n
\n
\n
\n {numWins() + numLosses()}\n \n Joués\n \n
\n
\n \n {Math.round(\n (totalGames() > 0 ? numWins() / totalGames() : 0) * 100\n )}\n \n \n % Gagnés\n \n
\n
\n {gamesData[mode].currentStreak}\n \n Série\n
\n actuelle\n
\n
\n
\n {gamesData[mode].maxStreak}\n \n Meilleure\n
\n Série\n
\n
\n
\n
Distribution des victoires
\n
\n (# essais pour trouver les 4 mots)\n
\n
\n {winHistoryIndices.map((i) => (\n
\n
{i + 1}
\n \n {gamesData[mode].history[i]}\n
\n
\n ))}\n
\n {numLosses() > 0 && (\n <>\n
\n
Gagnés - {numWins()}
\n
{numLosses()} - Perdus
\n
\n setLossDistributionOpen(!lossDistributionOpen())}\n >\n \n \n
\n \n )}\n {lossDistributionOpen() && (\n <>\n
Distribution des défaites
\n
(# mots ratés)
\n
\n {lossHistoryIndices.map((i) => (\n
\n
{NUM_GAMES - (i - GAME_ROWS)}
\n \n {gamesData[mode].history[i]}\n
\n
\n ))}\n \n \n )}\n \n \n );\n};\n\nexport default Statistics;\n","import { Component } from \"solid-js\";\nimport { GameTileRenderer } from \"./GameTile\";\nimport {\n FacebookIcon,\n GithubIcon,\n InstagramIcon,\n RedditIcon,\n TwitterIcon,\n} from \"./icons\";\nimport { BoxState, GameMode } from \"./types\";\n\ntype TutorialWordType = [string, BoxState[]];\nconst TUTORIAL_WORDS: TutorialWordType[] = [\n [\"POINT\", [\"correct\", \"none\", \"none\", \"none\", \"none\"]],\n [\"ANGLE\", [\"none\", \"diff\", \"none\", \"none\", \"none\"]],\n [\"CORDE\", [\"none\", \"none\", \"none\", \"none\", \"none\"]],\n [\"MATHS\", [\"none\", \"none\", \"none\", \"none\", \"none\"]],\n [\"MATHS\", [\"none\", \"none\", \"diff\", \"none\", \"correct\"]],\n [\"MATHS\", [\"none\", \"none\", \"none\", \"diff\", \"none\"]],\n [\"MATHS\", [\"none\", \"correct\", \"none\", \"none\", \"diff\"]],\n];\n\ntype TutorialWordProps = {\n word: TutorialWordType;\n};\nconst TutorialWord: Component = (props) => {\n return props.word[0]\n .split(\"\")\n .map((letter, i) => (\n \n ));\n};\n\ntype TutorialProps = {\n mode: GameMode;\n onCloseTutorial: () => void;\n};\nconst Tutorial: Component = (props) => {\n return (\n
\n
\n \n \n \n \n \n
\n
\n
\n Trouvez les 4 mots à la fois en 9 essais maximum.\n
\n
\n Chaque essai doit être un mot valide. Appuyez sur la touche \"Entrée\" [⏎] pour\n valider. Après chaque essai, la couleur des tuiles vous indique les lettres qui sont\n bien placées et celles qui sont mal placées.\n
\n
Exemples
\n
\n \n
\n
\n La lettre P est présente dans le mot cherché à cette place.\n
\n
\n \n
\n
\n La lettre N est présente dans dans le mot cherché mais pas à cette place.\n
\n
\n \n
\n
\n Les lettres C, O, R, D, E ne sont pas présentes dans le mot cherché.\n
\n
\n Quand vous faites un essai dans ce jeu, vous testez ce mot \n pour les quatre à deviner. Ces quatre mots à trouver sont différents.\n
\n
Pour cet essai avec le mot \"MATHS\" :
\n
\n
\n \n
\n
\n \n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
    \n
  1. Le mot en haut à gauche ne contient aucune lettre de \"MATHS\".
  2. \n
  3. Le mot en haut à droite contient le T à une autre place et le S\n à cette place.\n
  4. \n
  5. Le mot en bas à gauche contient le H à une autre place.
  6. \n
  7. Le mot en bas à droite contient le A à cette place et le S\n à une autre place.\n
  8. \n
\n
\n Vous n'avez que 9 essais pour trouver les 4 mots à la fois. Ce ne sera pas si facile...\n
\n
\n Un nouveau défi quotidien (commun à tous) est disponible chaque jour à minuit. Bonne chance !\n
\n
Développé par Nicolas Desmaths.fr
\n
\n \n
\n \n
\n \n
\n \n
\n \n
\n
\n QuordleFr\n
\n
Basé sur le travail de Freddie Meyer
\n
\n \n
\n
\n Quordle\n
\n
\n
\n );\n};\n\nexport default Tutorial;\n","import { Component, createMemo, createSignal } from \"solid-js\";\nimport { GAME_ROWS, NUM_GAMES } from \"./constants\";\nimport { useGamesDataContext } from \"./GameDataProvider\";\nimport { GameMode } from \"./types\";\nimport { vibrate } from \"./utils\";\n\ntype ParametersProps = {\n mode: GameMode;\n onCloseParameters: () => void;\n};\nconst Parameters: Component = (props) => {\n const [gamesData, gamesDataFuncs] = useGamesDataContext();\n return (\n
\n
\n \n \n \n \n \n
\n
\n
\n Paramètres\n
\n
\n \n
\n vibrate(gamesData.vibrateMode)}\n onChange={(e) =>\n gamesDataFuncs.setDarkMode(e.currentTarget.checked)\n }\n />\n
\n
\n
\n
Mode sombre
\n \n
\n
\n \n
\n vibrate(gamesData.vibrateMode)}\n onChange={(e) =>\n gamesDataFuncs.setBlindMode(e.currentTarget.checked)\n }\n />\n
\n
\n
\n
Mode daltonien
\n \n
\n
\n \n
\n vibrate(gamesData.vibrateMode)}\n onChange={(e) =>\n gamesDataFuncs.setQwertyMode(e.currentTarget.checked)\n }\n />\n
\n
\n
\n
Clavier Qwerty
\n \n \n
\n \n
\n vibrate(gamesData.vibrateMode)}\n onChange={(e) =>\n gamesDataFuncs.setVibrateMode(e.currentTarget.checked)\n }\n />\n
\n
\n
\n
Vibrations
\n \n \n
\n \n
\n vibrate(gamesData.vibrateMode)}\n onChange={(e) =>\n gamesDataFuncs.setHintMode(e.currentTarget.checked)\n }\n />\n
\n
\n
\n
Affichage lettres trouvées
\n \n \n
\n \n
\n vibrate(gamesData.vibrateMode)}\n onChange={(e) =>\n gamesDataFuncs.setSharingMode(e.currentTarget.checked)\n }\n />\n
\n
\n
\n
Partage jeu complet
\n \n \n
\n
\n \n \n
\n
\n
\n
\n \n \n (gamesDataFuncs.setKeyboardHeight(parseFloat(e.currentTarget.value)))\n }/>\n
\n
\n \n \n );\n};\n\nexport default Parameters;\n","import { useSearchParams } from \"solid-app-router\";\nimport { Component, createMemo, createSignal, onCleanup } from \"solid-js\";\nimport {\n GAME_COLS,\n GAME_ROWS,\n IS_IN_WEB_APP_IOS,\n NUM_GAMES_X,\n NUM_GAMES_Y,\n} from \"./constants\";\nimport GameCompleteBanner from \"./GameCompleteBanner\";\nimport { useGamesDataContext } from \"./GameDataProvider\";\nimport GameShare from \"./GameShare\";\nimport GameSquare from \"./GameTile\";\nimport Header from \"./Header\";\nimport Keyboard from \"./Keyboard\";\nimport { createResizeObserverPoly } from \"./ResizeObserverPoly\";\nimport Statistics from \"./Statistics\";\nimport Tutorial from \"./Tutorial\";\nimport Parameters from \"./Parameters\";\nimport { GameMode } from \"./types\";\nimport { gtagWrap, vibrate, getDateSeed } from \"./utils\";\nimport { PrevIcon, NextIcon, StartIcon, EndIcon } from \"./icons\";\n\n/**\n * Create resize observer is a helper primitive for binding resize events.\n *\n * @param opts.refs - Either an `Element`, an array of `Element`s, or a signal returning one of these.\n * @param opts.onResize - Function handler to trigger on resize\n * @return A callback that can be used to add refs to observe resizing\n *\n */\n\nconst NUM_GAMES_X_ARR = [...Array(NUM_GAMES_X).keys()];\nconst NUM_GAMES_Y_ARR = [...Array(NUM_GAMES_Y).keys()];\nconst GAME_ROWS_ARR = [...Array(GAME_ROWS).keys()];\nconst GAME_COLS_ARR = [...Array(GAME_COLS).keys()];\n\ntype GameQuadrantProps = {\n mode: GameMode;\n gameX: number;\n gameY: number;\n};\nconst GameQuadrant: Component = (props) => {\n return (\n
\n {GAME_ROWS_ARR.map((rowIndex) => (\n
\n {GAME_COLS_ARR.map((colIndex) => (\n \n ))}\n
\n ))}\n
\n );\n};\n\ntype GameProps = {\n mode: GameMode;\n};\nconst Game: Component = (props) => {\n const [gamesData, gamesDataFuncs] = useGamesDataContext();\n\n const [searchParams, setSearchParams] = useSearchParams();\n\n const [fontSize, setFontSize] = createSignal(35);\n\n const keyEventListener = (e: KeyboardEvent) => {\n e.preventDefault();\n gamesDataFuncs.sendKey(props.mode, e);\n };\n document.addEventListener(\"keydown\", keyEventListener);\n onCleanup(() => document.removeEventListener(\"keydown\", keyEventListener));\n\n const tutorialOpen = createMemo(\n () => searchParams.overlay === \"tutorial\"\n );\n const statisticsOpen = createMemo(\n () => searchParams.overlay === \"statistics\"\n );\n const parametersOpen = createMemo(\n () => searchParams.overlay === \"parameters\"\n );\n \n const refCallback = createResizeObserverPoly({\n onResize: ({ width, height }) => {\n if ((width)&&(height)) {\n gamesDataFuncs.setDimensions(width, height);\n setFontSize(width / 15);\n }\n },\n });\n\n return (\n \n {\n vibrate(gamesData.vibrateMode);\n gtagWrap(\"event\", \"tutorial\", {\n mode: props.mode,\n });\n setSearchParams({ overlay: \"tutorial\" });\n }}\n onOpenStatistics={() => {\n vibrate(gamesData.vibrateMode);\n gtagWrap(\"event\", \"statistics\", {\n mode: props.mode,\n });\n setSearchParams({ overlay: \"statistics\" });\n }}\n onOpenParameters={() => {\n vibrate(gamesData.vibrateMode);\n gtagWrap(\"event\", \"parameters\", {\n mode: props.mode,\n });\n setSearchParams({ overlay: \"parameters\" });\n }}\n />\n \n {gamesDataFuncs.isGameComplete(props.mode) && (\n \n )}\n \n \n {props.mode == \"archives\" && (\n <>\n
{getDateSeed(gamesData.archives.seed)}
\n \n )}\n
\n {NUM_GAMES_Y_ARR.map((gameY) => (\n
\n {NUM_GAMES_X_ARR.map((gameX) => (\n \n ))}\n
\n ))}\n
\n \n \n {gamesDataFuncs.isGameComplete(props.mode) ? (\n \n ) : (\n \n )}\n \n \n {\n vibrate(gamesData.vibrateMode);\n setSearchParams({ overlay: undefined });\n }}\n />\n \n \n {\n vibrate(gamesData.vibrateMode);\n setSearchParams({ overlay: undefined });\n }}\n />\n \n \n {\n vibrate(gamesData.vibrateMode);\n setSearchParams({ overlay: undefined });\n }}\n />\n \n \n );\n};\n\nexport default Game;\n","import { Link } from \"solid-app-router\";\nimport { Component } from \"solid-js\";\n\ntype NotFoundProps = {};\nconst NotFound: Component = (props) => {\n return (\n
\n
\n
\n

404

\n
\n Oops! Page not found\n
\n

\n The page you’re looking for doesn’t exist.\n

\n \n Back to Daily Quordle\n \n
\n
\n
\n );\n};\n\nexport default NotFound;\n","import { Route, Routes } from \"solid-app-router\";\nimport { Component, createEffect, createMemo, createResource, useContext } from \"solid-js\";\nimport Game from \"./Game\";\nimport { GamesDataContext } from \"./GameDataProvider\";\nimport NotFound from \"./NotFound\";\n\nconst App: Component = () => {\n const context = createMemo(() => useContext(GamesDataContext));\n\n createEffect(() => {\n if (context()?.[0].darkMode) {\n document.documentElement.classList.add(\"dark\");\n } else {\n document.documentElement.classList.remove(\"dark\");\n }\n });\n\n return context() ? (\n \n } />\n } />\n } />\n } />\n \n ) : null;\n};\n\nexport default App;\n","import { hashIntegration, Router } from \"solid-app-router\";\nimport { render } from \"solid-js/web\";\nimport App from \"./App\";\nimport GamesDataProvider from \"./GameDataProvider\";\nimport \"./index.css\";\n\nrender(\n () => (\n \n \n \n \n \n ),\n document.getElementById(\"root\") as HTMLElement\n);\n"],"names":["NUM_GAMES_X","NUM_GAMES_Y","NUM_GAMES","GAME_ROWS","GAME_COLS","TimeUnits","year","month","day","hour","minute","second","START_DATE","Date","GAME_PERIOD_MS","ALPHABET","KEYBOARD_KEYS_AZERTY","KEYBOARD_KEYS_QWERTY","indexOf","navigator","platform","toLowerCase","userAgent","includes","document","IS_IN_WEB_APP_IOS","window","test","matchMedia","matches","CAN_SHARE_TEXT","share","canShare","text","CAN_SHARE_IMAGE","files","File","Blob","type","BLACKLIST","BLACKLIST_SET","Set","ANSWERS","split","ANSWERS_SET","ALLOWED","ALLOWED_SET","DAILY_GAMES","getDateSeed","seed","time","getTime","date","toLocaleDateString","gtagWrap","command","eventName","eventParams","gtag","vibrate","vibrateMode","timeUntil","date1","date2","Intl","rtf","RelativeTimeFormat","numeric","elapsed","valueOf","u","unit","Math","abs","format","round","ms","interval","floor","generateBoxStatesFromGuess","guess","answer","ans","gue","states","Array","fill","guessLetters","column","generateAllGamesBoxStates","guesses","answers","i","length","guessIndex","g","push","generateWordsFromSeed","rnd","MersenneTwister","random_int31","has","currentDailySeed","gamesData","daily","current","answersCorrect","history","currentStreak","maxStreak","free","archives","darkMode","blindMode","qwertyMode","sharingMode","hintMode","fitMode","keyboardHeight","width","height","osDarkMode","localStorage","getItem","e","parseFloat","forEach","mode","gameData","lastSeed","Number","historyStr","map","guessesArr","daily_seed","undefined","state","setState","createStore","createEffect","setItem","String","join","GamesDataContext","createContext","GamesDataProvider","props","createLocalStore","isGameComplete","filter","addLetter","letter","produce","s","deleteLetter","slice","submitCurrent","answerIndex","word","totalCorrect","reduce","prev","correct","maxGuessIndex","max","num_guesses","current_streak","max_streak","total_correct","store","setDarkMode","setDimensions","w","h","setBlindMode","setQwertyMode","setVibrateMode","setSharingMode","setHintMode","setFitMode","setKeyboardHeight","sendKey","ctrlKey","key","toLocaleLowerCase","resetDailyIfOld","resetFree","newSeed","resetArchives","goToArchives","console","log","setInterval","children","useGamesDataContext","context","useContext","Error","TwitterIcon","GithubIcon","HelpIcon","ChevronDownIcon","PrevIcon","NextIcon","StartIcon","EndIcon","ArchivesIcon","CalendarIcon","DiceIcon","ParametersIcon","ShareIcon","LinkIcon","ClipboardCopyIcon","SaveIcon","PlusIcon","StatisticsIcon","NewGameButton","onClick","class","GameCompleteBanner","gamesDataFuncs","numWordsCorrect","createMemo","nextDailyTime","currentDate","setCurrentDate","createSignal","timer","onCleanup","clearInterval","getNumEmoji","num","getEmojiRow","emojis","getColorFromState","ctx","x","y","radius","radius_obj","tl","tr","br","bl","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","getShareText","textShare","toString","toUpperCase","textMobileShare","l1","l2","shareGame","shareType","share_type","clipboard","writeText","then","alert","catch","error","canvas","createElement","style","display","size","padding","fontScale","textPadding","getContext","fillStyle","fillRect","roundRect","font","textAlign","textBaseline","titleText","metrics","measureText","fontHeight","actualBoundingBoxAscent","fillText","row","dir","xTopCenter","numText","actualBoundingBoxDescent","wordText","blob","Promise","resolve","toBlob","filename","file","fileSaver","saveAs","ShareButton","GameShare","textAreaRef","setTextAreaRef","showTextArea","setShowTextArea","shareText","LinkDef1","LinkDef2","LinkDef3","LinkDef4","toLocaleUpperCase","textArea","select","execCommand","selection","getSelection","removeAllRanges","blur","GameTileRenderer","widthBox","wscreen","hscreen","hsquare","harchives","hfit","rowTemporalState","min","gameCol","actualCol","placeholder","GameTile","gameIndex","gameX","gameY","shouldRenderLetter","gameRow","gameTileState","shouldRenderPlaceholder","temporalState","Header","open","setOpen","btnEl","setBtnEl","onOpenTutorial","ref","onOpenStatistics","onOpenParameters","getBoundingClientRect","bottom","Key","keyLower","keyType","keyHasBeenGuessed","keyIsNotUtil","c","gameStates","col","keyStyle","percent","colorOptions","none","diff","keyColors","KeyboardEvent","keyCode","startsWith","Keyboard","opts","otherRefs","setOtherRefs","refCallback","l","concat","previousMap","Map","resizeObserver","ResizeObserverPoly","entries","isArray","entry","newWidth","contentRect","newHeight","previous","get","target","newSize","onResize","set","oldRefs","refs","optsRefs","oldRef","unobserve","delete","observe","disconnect","winHistoryIndices","keys","lossHistoryIndices","reverse","Statistics","lossDistributionOpen","setLossDistributionOpen","winMaxValue","lossMaxValue","numWins","numLosses","totalGames","currentGameNumCorrect","currentGameMaxCorrect","currentGameWin","currentGameLoss","onCloseStatistics","TUTORIAL_WORDS","TutorialWord","Tutorial","onCloseTutorial","Parameters","onCloseParameters","currentTarget","checked","value","NUM_GAMES_X_ARR","NUM_GAMES_Y_ARR","GAME_ROWS_ARR","GAME_COLS_ARR","GameQuadrant","rowIndex","colIndex","GameSquare","Game","searchParams","setSearchParams","useSearchParams","fontSize","setFontSize","keyEventListener","preventDefault","addEventListener","removeEventListener","tutorialOpen","overlay","statisticsOpen","parametersOpen","createResizeObserverPoly","NotFound","App","documentElement","classList","add","remove","render","hashIntegration","getElementById"],"mappings":"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AS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SAAS,CAAC,QAAS,QAAS,QAAS,SA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"}