Nintendo a construit une industrie artisanale en revendant ses classiques encore et encore Le service de console virtuelle de la société, qui était disponible sur Wii, Wii U et 3DS, hébergeait un échantillon impressionnant d’anciens jeux, mais il vous facturerait également 5 dollars pour le privilège de jouer à Galaga Cela n’a jamais semblé grand chose Nous n’avons sûrement pas besoin de distribuer les archives au coup par coup, n’est-ce pas? Pourquoi quelqu’un dépenserait-il de l’argent réel pour un jeu vieux de 30 ans? Heureusement, Nintendo a magnifiquement répondu à ces scrupules sur le Switch Quiconque possède la console et s’abonne à ses 3 $Le service Switch Online de 99 par mois accède automatiquement à une multitude de titres NES et SNES Nintendo a consciencieusement ajouté à ce catalogue chaque mois, et aujourd’hui, 86 jeux en direct sur le client Pour mettre cela en perspective, il n’y a que 50 jeux disponibles sur les mini-consoles rétro NES Classic et SNES Classic combinées.

On a l’impression que presque tout le monde a acheté un Switch pendant la quarantaine La manie d’Animal Crossing était difficile à ignorer Donc, si vous êtes un nouveau venu chez Nintendo, vous ne savez peut-être pas que l’ordinateur de poche posé sur votre table basse héberge plusieurs décennies d’histoire du jeu. Certains des titres du service ont été décimés par le passage du temps, mais il y a une poignée d’icônes des années 80 et 90 qui résistent étonnamment bien en 2021. Nous mettons donc en évidence 20 anciens jeux sur Switch Online qui valent le détour aujourd’hui Nos critères sont doubles; évidemment, nous voulions distinguer certains des classiques incontestables de l’époque, mais nous avons également prêté attention aux jeux qui offrent des expériences multijoueurs solides comme le roc et ne nécessitent pas beaucoup de courbe d’apprentissage. Nous ne nous attendons pas à ce que vous sautiez tête la première dans un RPG impénétrable de l’administration Reagan, d’accord? Profitez de la liste et du voyage dans le passé

Il existe d’autres jeux Zelda plus anciens sur Switch Online, mais les deux premières entrées de la série – et Zelda II: The Adventure of Link en particulier – sont soutenues par une secousse préhistorique qui désactivera probablement tous les nouveaux arrivants. (C’était le milieu des années 80 Vous deviez être là) Au lieu de cela, si vous êtes partant pour la chasse à la Triforce, faites tourner A Link to the Past L’interprétation SNES de la saga intemporelle de Nintendo résiste étonnamment bien aux normes modernes La conception des niveaux reste inventive et hermétique, et le charme éternel d’Hyrule brûle à travers les graphismes 16 bits étincelants. Si vous avez été sevré exclusivement sur 3-D Zelda et que vous cherchez à élargir vos horizons, A Link to the Past est un bon remède Ne vous attendez pas à quelque chose de similaire à Breath of the Wild C’est un jeu vidéo très différent

Nous aborderons certains des autres jeux Mario dans une entrée ultérieure, mais nous devons prendre un moment pour distinguer Super Mario Bros 2 Son histoire déconcertante à elle seule vaut la peine de démarrer Nintendo, fort du succès sismique du lancement de la NES en Amérique, travaillait dur pour produire une suite du premier Super Mario Bros jeu livré avec la console Il a proposé une itération naturelle du design original – avec une légère pincée de nouveaux mécanismes – mais l’a jugé trop difficile pour le public occidental doux et stupide. (Pourquoi Nintendo a déjà perçu les joueurs américains naissants de cette façon, nous ne le saurons peut-être jamais) Donc, cette version de Super Mario Bros 2 n’est sorti qu’au Japon, et à la place, Nintendo a attrapé un jeu vidéo totalement indépendant appelé Doki Doki Panic, l’a reskinné avec des personnages de Mario et l’a expédié à l’étranger.

Le Super Mario Bros américanisé 2 est un rêve de fièvre Mario passe le plus clair de son temps à ramasser des navets et à les lancer sur des pygmées ressemblant à des mimiques Tous les archvillains canoniques sont remplacés par une galerie de voleurs entièrement différente (Bowser est introuvable!) Et les concepteurs de la narration se lavent les mains de toute l’épreuve en affirmant que les événements du jeu se déroulent entièrement dans un rêve étrange que Mario avait fait, probablement après un trop grand nombre de champignons Si vous voulez un instantané de la déréglementation de l’industrie du jeu vidéo dans les années 80, Super Mario Bros 2 est en attente et prêt

Premièrement, les mauvaises nouvelles Ce n’est pas le Punch-Out de Mike Tyson Quelque part en cours de route, Nintendo a perdu les droits de licence du plus grand boxeur macho devenu acteur de l’univers Tyson a été le boss final du titre original sorti en 1987, et franchement, il est plutôt normal qu’il soit le méchant dans l’un des rares jeux vidéo à porter son nom. Mais Nintendo a depuis échangé contre un remplaçant générique, vaguement en forme de Tyson, nommé Mr Dream, qui par hasard partage les animations et les mouvements du champion Tout ce qui peut contourner la loi sur le droit d’auteur, je suppose

Mais qui se soucie des retcons? Punch-Out !! reste l’un des plus grands jeux NES de tous les temps En surface, vous regardez une simulation de boxe extrêmement dépouillée avec une suite d’adversaires au codage racial douteux gardant le support. Creusez un peu plus profondément, cependant, et vous vous rendrez compte que Punch-Out !! est en fait un jeu de rythme Tous vos esquives, jabs et uppercuts vibrent à un rythme discret entre les cordes Amorcer un crochet du gauche et contrer avec un haymaker dévastateur est toujours l’une des sensations les plus satisfaisantes de l’histoire du jeu vidéo. Pariez toujours sur Little Mac

La WWE est incapable de faire un bon jeu de lutte professionnelle Chaque année, il sort une nouvelle édition annualisée qui explore de nouvelles dimensions profondes de l’ineptie déconcertante Le dernier, WWE 2K20, est tellement criblé de bugs qu’il pourrait légitimement être classé M pour l’horreur corporelle Et pourtant, il y a littéralement 30 ans, Nintendo avait tout compris La Pro Wrestling de 1987 est peut-être un peu plus rigide que ce que vous pouvez trouver sur les consoles modernes, mais elle est professionnellement fonctionnelle Vous pouvez monter le ridoir de manière fiable sans vous coincer dans la skybox, et tous les boutons font ce qu’ils sont censés faire Cela compte vraiment comme une amélioration!

Metroid est-il la série de jeux vidéo la plus influente de tous les temps? Le principe fondamental du jeu – explorer une carte gigantesque, non linéaire, initialement écrasante qui devient lentement plus traversable en raison d’un éventail de power-ups et d’une bonne mémoire musculaire à l’ancienne – a été coopté par tout, de Hollow Knight à Batman: Arkham Asylum Où serions-nous sans Samus Aran? Certains irréductibles ne jurent que par la trilogie Prime à la première personne sur GameCube et Wii, mais pour mon argent, Super Metroid sera toujours l’étoile du Nord de la franchise Profitez d’un monde extraterrestre vivant et tortueux rempli à ras bord avec certains des sprites les plus monstrueux jamais rendus sur une machine 2D Nintendo devient rarement sombre, mais quand c’est le cas, les résultats peuvent être glorieux

Donkey Kong Country est unique en son genre En apparence, ce n’est qu’un autre jeu de plateforme mettant en vedette l’une des mascottes les plus tertiaires de Nintendo. Mais ensuite, vous plongez dans la bande-son calme et éthérée et admirez un coucher de soleil brûlant sur la canopée des arbres verdoyants, ou vous émerveillez devant l’étrange profondeur Magic Eye des modèles de personnages qui semblent diviser la différence entre 2-D et 3. ré Le gameplay est ici – ces singes contrôlent bien – mais je plonge le plus souvent dans Donkey Kong Country pour un autre avant-goût de son atmosphère indélébile, qui n’a jamais été vraiment recréée par aucun studio depuis Un classique chill-out, maintenant et pour toujours Il en va de même pour ses deux suites qui sont également disponibles sur Switch Online

Gradius était à l’origine un jeu d’arcade Konami à l’ancienne, et comme la plupart des logiciels livrés dans une armoire, c’est vraiment, vraiment difficile Cela reste vrai pour le port NES de 1986, qui fait un travail étonnamment bon pour préserver l’action pulpeuse et de combat des étoiles sur des spécifications limitées. Honnêtement, c’est peut-être le jeu NES le plus beau de tous les temps, mais vous n’aurez pas la capacité d’apprécier ces visuels tout en esquivant simultanément environ 2 milliards de balles par écran. C’est le tao de Gradius; L’euphorie des joueurs ne peut être obtenue que grâce à une armée de tourelles, de vaisseaux mères et d’astéroïdes qui veulent tous que vous soyez mort

Honnêtement, si Switch Online accordait l’accès à Super Mario All-Stars et rien d’autre, ce serait toujours une très bonne affaire En 1993, Nintendo a sorti une cartouche contenant quatre classiques NES froids, embellis et mis à l’échelle pour la plus costaud Super Nintendo. Inclus sont Super Mario Bros, le Super Mario Bros susmentionné 2, Super Mario Bros 3, et une bizarrerie appelée Super Mario Bros: The Lost Levels, qui était la suite originale du premier jeu sorti uniquement au Japon (Nous en avons parlé plus tôt) Dans l’ensemble, All-Stars est l’un des meilleurs packages jamais publiés pour une console; une distillation parfaite des années d’or de Nintendo, saupoudrée du tendre amour et du soin que la société met toujours en valeur lorsqu’elle manipule les joyaux de la couronne Vous pouvez appeler l’un de ces jeux votre favori de tous les temps et personne ne clignerait des yeux

Bien sûr, le seul jeu que les All-Stars ne possède pas est l’indomptable Super Mario World. Mais ça va, car World est également disponible sur Switch Online Il est difficile de générer une vision originale de ce qui a longtemps été un consensus Le plus grand jeu de tous les temps, mais permettez-moi de le dire ainsi: tout ce que la société a appris à aimer de Mario – les ersatz de maisons hantées, le changement de marque de Bowser en tant que fop peu sûr, l’existence même of Yoshi – a fait ses débuts dans le monde La plate-forme est serrée, exigeante et pleine d’élan, et comme toujours, Nintendo est capable d’injecter une énorme quantité de personnage dans le royaume champignon sans véritable récit, dialogue ou enjeux émotionnels. Vous traverserez un fief appelé Chocolate Island et découvrirez une multitude de secrets qui développent l’imagination Mario arrive au sanctuaire de Bowser et voit qu’il a transformé son château en le site d’une fureur toute la nuit Si vous n’avez jamais joué à un jeu Mario – l’enfer, si vous n’avez jamais joué à un jeu vidéo – c’est un bon point de départ

Avant Madden et EA, et un pipeline sans fin de simulateurs de football avec des itérations marginales sur les bords, il n’y avait que le Tecmo Bowl Choisissez l’une des 12 équipes de la NFL librement adaptées à la NES et ouvrez un playbook composé d’exactement quatre pièces (Run 1, Run 2, Pass 1, Pass 2) Tecmo Bowl n’a évidemment pas les cloches et les sifflets des extravagances de football sur des machines modernes, mais honnêtement, les jeux de canapé de Madden se distillent généralement en deux amis exécutant les mêmes jeux encore et encore. Tecmo Bowl a cloué la même sensation il y a près de 35 ans

Les années 80 ont été l’âge d’or de la difficulté des jeux vidéo, et la NES se vantait d’un gant oppressant de Battletoads, Contra et les premiers jeux Mega Man Mais pour mon argent, rien ne se rapproche de l’original Ninja Gaiden La mort est partout à travers ces 20 niveaux – des psychopathes portant des cagoules vous tirent constamment à l’arrière et semblent toujours apparaître au moment exact où vous calculez un autre saut risqué sur une petite plate-forme. Mais ce qui fait que Ninja Gaiden se démarque le plus rétrospectivement, c’est à quel point il raconte son histoire C’est l’un des premiers jeux à incorporer des intermèdes de type bande dessinée entre ses chapitres – des cinématiques rudimentaires, essentiellement – qui seraient cooptés par chaque concepteur à la recherche du moyen idéal de dérouler un récit dans un jeu vidéo. Revenez-y pour la leçon d’histoire et un aperçu de la précision mécanique que nous exigions autrefois de nos enfants de 8 ans

Pauvre combat de ballon Le jeu a toutes les références de certaines des franchises légendaires de Nintendo – sortant sur les consoles américaines la même année que le Metroid original – mais il n’a jamais tout à fait chevauché le Zeitgeist de ses pairs les plus célèbres. Au lieu de cela, revisiter Balloon Fight, c’est un peu comme regarder dans l’immensité du laboratoire Nintendo et regarder toutes les expériences qui n’ont pas touché terre. Le jeu est toujours bon; vous incarnez un garçon malheureux flottant autour d’une triade de ballons de fête, évitant les paratonnerres et le monstre marin qui se cache dans les profondeurs ci-dessous – semblable au classique du cabinet Joust Mais nous n’avons pas fini par hériter d’une chronologie où Balloon Fight a éclipsé Mario en tant que première carte de visite de Nintendo. Quel monde ce serait

Nous devons inclure Donkey Kong Jr pour exactement une raison: c’est la seule fois que Mario a été choisi comme méchant Oui, après les événements du très, très ancien jeu d’arcade Donkey Kong, Mario fait emprisonner cruellement le singe comme le méchant de King Kong Le fils de Donkey Kong escalade les vignes, évite d’étranges monstres crocodiles et libère papa de l’emprise du plombier diabolique Le jeu en lui-même n’a rien de spécial, mais cela vaut la peine de démarrer pour assister néanmoins à Heel Mario

Crystalis était une entrée tardive dans le catalogue NES Il est sorti en 1990, un an avant que le SNES n’arrive aux États-Unis, et il est clair que les développeurs SNK avaient absorbé d’innombrables leçons des cinq années précédentes de pionnier 8 bits. Vous cherchez ici un RPG standard de haut en bas avec un monde ouvert appétissant qui rappelle immédiatement le premier Zelda Certains tropes rudimentaires D&D – nivellement avec des points d’expérience, un système de gradient d’écoles de magie – sont bien en place, et la netteté de l’animation pousse les deux kilobits de RAM de la console à ses limites extérieures Crystalis se lance même dans une histoire postmoderne étrange, impliquant le sommeil cryogénique et une guerre nucléaire dans la lointaine année 1997, comme une pierre angulaire de chaque trope narratif qui a symbolisé les années 80. Cela en fait un envoi parfait pour la NES, tant que vous ignorez le fait que les développeurs ont publié de nouveaux jeux pour la console, par exemple, en 1994.

Blaster Master a époustouflé les esprits en 1988 avec une seule innovation; la possibilité de sortir d’un véhicule Cela semble doux selon les normes modernes, mais sur la NES, c’était carrément révolutionnaire Un enfant nommé Jason pilote un gros char équipé d’une tourelle qui brise le bunker, et à tout moment, il peut glisser par la porte latérale et explorer les crevasses dans lesquelles sa course ne peut pas rentrer. Boom, structure de jeu vidéo scindée à jamais C’est tout ce qu’il fallait au début

Je ne suis même pas complètement hyperbolique Blaster Master est un véritable point de repère dans l’héritage Nintendo Les développeurs Sunsoft vont jusqu’à changer complètement l’angle de la caméra lorsque vous explorez certaines parties du monde en solo – passant d’un défilement latéral standard à une perspective descendante, Zelda-ish L’une des choses les plus fascinantes à propos de Switch Online est d’être témoin des risques que les studios étaient prêts à assumer sur une technologie ancienne En ce sens, Blaster Master ne fera que devenir de plus en plus impressionnant avec le temps

Vous ne recevrez aucun argument de ma part, ni de personne d’autre, selon laquelle Star Fox a l’air un peu janky sur un téléviseur grand écran aujourd’hui Mais considérez l’audace de son histoire d’origine La Super Nintendo a été conçue comme une machine 2-D, et les développeurs du monde entier l’ont utilisée pour créer des classiques 2-D indélébiles Mais une petite équipe d’Argonaut Software n’était pas satisfaite de ces limitations et s’est attaquée à une puce de cartouche spécialisée qui leur permettait de fabriquer un jeu de tir intergalactique de combat aérien où vous pouviez piloter un vaisseau spatial en trois dimensions.

Chugs Star Fox Il traîne ses pieds autour de 15 images par seconde, et comparé aux environnements scintillants disponibles ailleurs sur la console, les niveaux sont fades, nus et souvent monochromes. (Tout ce jus de performance a été détourné vers la technologie volante, je suppose) Mais c’est toujours une sacrée relique Pour un moment brillant, la SNES pourrait faire une impression Nintendo 64 raisonnable

Tetris Attack n’est pas un jeu Tetris C’est l’une des anciennes indiscrétions de Nintendo La société a mis la main sur la licence et a sorti une cartouche de puzzle match-trois qui n’avait précisément rien de commun avec Tetris. Si vous possédez un Switch et que vous cherchez à creuser dans des clairières saines à quatre rangées, regardez ailleurs (Tetris 99 est une bonne option) Mais si vous voulez un jeu de puzzle merveilleusement mouvementé à part entière, l’hérétique Tetris Attack a ce dont vous avez besoin Vous avez joué à d’innombrables versions de ce design de base dans des jeux mobiles comme Bejeweled et Candy Crush Mais ce qui rend Tetris Attack supérieur, c’est son mode à deux joueurs, où le nettoyage de votre plateau laisse tomber d’énormes charges utiles de déchets insolubles sur votre rival. Il n’y a pas de chiffres à ce sujet, mais je dois imaginer que Tetris Attack a entraîné plus de ragequits et de ruptures d’amis que tout autre jeu sur la SNES. Rien n’est plus féroce sur le service

Nintendo a hésité à importer la bibliothèque Nintendo 64 sur Switch Online de la manière dont elle a cannibalisé ses offres NES et SNES, ce qui signifie que Mario Kart 64 n’est pas disponible sur la plate-forme Ce n’est cependant pas un problème, car les vrais élitistes de Mario Kart comprennent que le premier jeu de la série, Super Mario Kart, reste le summum de Nintendo. Non, ce n’est pas en 3D, oui, la liste est limitée à huit caractères, mais la manipulation sur le SNES est surnaturellement douce – quelque chose que le contrôleur blocky 64 ne pourrait jamais approcher Il ne possède pas non plus le fromage aggravant qui a assiégé la franchise dans les entrées récentes Cette coquille bleue, qui traque celui qui occupe la première place et le punit pour sa victoire, est introuvable Tous saluent Super Mario Kart; tout était en descente d’ici

Kirby a atteint un sommet tôt Tout le respect que je dois à l’adorable Epic Yarn, à l’inventif Canvas Curse et au facile Air Ride, mais rien après 1996 n’a supplanté les sommets de Kirby Super Star Le jeu SNES capture le métamorphe rose malléable dans sa forme fondamentale: engloutir des ennemis, voler leurs chapeaux et progresser à travers une série de niveaux qui semblent mettre l’accent sur la créativité et le kawaii par rapport à la difficulté. On ne se souviendra jamais de Kirby comme d’un membre du haut panthéon de Nintendo, mais sa principale directive – absorber de nouveaux pouvoirs et se déchaîner sur une étoile filante – n’a jamais vieilli. Démarrez sur Switch Online et découvrez à quel point Peak Kirby peut être joyeux

Il est présenté comme une suite de Super Mario World, mais comme Super Mario Bros 2 avant elle, l’île de Yoshi est un départ déconcertant Yoshi est rapidement devenu l’une des mascottes les plus appréciées de Nintendo à l’époque de la SNES, c’est pourquoi il a sorti un jeu Mario qui a complètement retiré Mario de la procédure. Au lieu de cela, vous jouez en tant qu’entité connue sous le nom de Baby Mario – soulevant toutes sortes de questions canoniques – qui est perdue sur une nation entièrement peuplée de Yoshis. Ils mettent Baby Mario sur leur dos et résolvent de ramener le bébé à la maison

Alors oui, Super Mario World 2 est un peu une valeur aberrante, mais il arbore également de magnifiques environnements d’aquarelle, des pics de difficulté désorientants et un mécanisme de lancer d’œufs tranchant qui a conduit à plus de points forts de la vitesse que tout autre jeu sur cette liste Cela vaut certainement le coup d’œil si vous n’y avez jamais touché auparavant, ne serait-ce que pour vous poser des questions provocantes sur la généalogie de la famille Mario

Déjà abonné?
Connectez-vous ou liez votre abonnement à un magazine

Déjà abonné?
Connectez-vous ou liez votre abonnement à un magazine

Déjà abonné?
Connectez-vous ou liez votre abonnement à un magazine

= 0? (u = fsubstr (0, v), c = fsubstr (v 1)) 🙁 u = f, c = “”), i = decodeURIComponent (u), l = decodeURIComponent (c), hasOwnProperty (o, i)? isArray (o [i])? o [i ]push (l): o [i] = [o [i], l]: o [i] = l} return o}; var isArray = ArrayisArray || function (r) {return “[object Array]” === ObjectprototypetoStringappel (r)};
}, {}];
la fenêtremodules [“1208”] = [function (require, module, exports) {“use strict”; var stringifyPrimitive = function (r) {switch (typeof r) {case “string”: return r; case “boolean”: return r? “true”: “false”; case “number”: return isFinite (r)? r: “”; default: return “”}}; moduleexports = function (r, e, t, n) {return e = e || “&”, t = t || “=”, null === r&& (r = void 0), “object” == typeof r? map (objectKeys (r), function (n) {var i = encodeURIComponent (stringifyPrimitive (n)) t; return isArray (r [n])? map (r [n], function (r) {return i encodeURIComponent (stringifyPrimitive (r))})join (e): i encodeURIComponent (stringifyPrimitive (r [n]))})join (e): n? encodeURIComponent (stringifyPrimitive (n)) t encodeURIComponent (stringifyPrimitive (r)): “”}; var isArray = ArrayisArray || function (r) {return “[object Array]” === ObjectprototypetoStringcall (r)}; function map (r, e) {if (rmap) retour rmap (e); pour (var t = [], n = 0; n0&&a [alength-1]) && (6 === i [0] || 2 === i [0])) {o = 0; continue} if (3 === i [0] && (! a || i [1]> a [0] &&i [1] “:” akbar-men “,” ∑ “:” majmou “,” ¤ “:” omla “}, az: {}, ca: {” ∆ “: “delta”, “∞”: “infini”, “♥”: “amor”, “&”: “i”, “|”: “o”, “”: “mes que”, “∑”: “suma dels “,” ¤ “:” moneda “}, cz: {” ∆ “:” delta “,” ∞ “:” nekonecno “,” ♥ “:” laska “,” & “:” a “,” | ” : “nebo”, “”: “vice jako”, “∑”: “soucet”, “¤”: “mena”}, de: {“∆”: “delta”, “∞”: “unendlich”, ” ♥ “:” Liebe “,” & “:” und “,” | “:” oder “,” “:” groesser als “,” ∑ “:” Summe von “,” ¤ “:” Waehrung “}, dv : {“∆”: “delta”, “∞”: “kolunulaa”, “♥”: “loabi”, “&”: “aai”, “|”: “noonee”, “”: “ah vure bodu” , “∑”: “jumula”, “¤”: “faisaa”}, en: {“∆”: “delta”, “∞”: “infinity”, “♥”: “love”, “&”: ” et “,” | “:” ou “,” “:” supérieur à “,” ∑ “:” somme “,” ¤ “:” devise “}, es: {” ∆ “:” delta “,” ∞ ” : “infinito”, “♥”: “amor”, “&”: “y”, “|”: “u”, “”: “mas que”, “∑”: “suma de los”, “¤” : “moneda”}, fr: {“∆”: “delta”, “∞”: “infiniment”, “♥”: “Amour”, “&”: “et”, “|”: “ou”, ” “:” superieure a “,” ∑ “:” somme des “,” ¤ “:” monna ie “}, gr: {}, hu: {” ∆ “:” delta “,” ∞ “:” vegtelen “,” ♥ “:” szerelem “,” & “:” es “,” | “:” vagy “,” “:” nagyobb menthe “,” ∑ “:” szumma “,” ¤ “:” penznem “}, il: {” ∆ “:” delta “,” ∞ “:” infinito “,” ♥ “: “amore”, “&”: “e”, “|”: “o”, “”: “maggiore di”, “∑”: “somma”, “¤”: “moneta”}, lt: {}, lv: {“∆”: “delta”, “∞”: “bezgaliba”, “♥”: “milestiba”, “&”: “un”, “|”: “vai”, “”: “lielaks neka” , “∑”: “summa”, “¤”: “valuta”}, my: {“∆”: “kwahkhyaet”, “∞”: “asaonasme”, “♥”: “akhyait”, “&”: ” nhin “,” | “:” tho “,” “:” kyithaw “,” ∑ “:” paungld “,” ¤ “:” ngwekye “}, mk: {}, nl: {” ∆ “:” delta ” , “∞”: “oneindig”, “♥”: “liefde”, “&”: “en”, “|”: “of”, “”: “groter dan”, “∑”: “som”, ” ¤ “:” valuta “}, pl: {” ∆ “:” delta “,” ∞ “:” nieskonczonosc “,” ♥ “:” milosc “,” & “:” i “,” | “:” lub ” , “”: “wieksze niz”, “∑”: “suma”, “¤”: “waluta”}, pt: {“∆”: “delta”, “∞”: “infinito”, “♥”: ” amor “,” & “:” e “,” | “:” ou “,” “:” maior que “,” ∑ “:” soma “,” ¤ “:” moeda “}, ro: {” ∆ ” : “delta”, “∞”: “infini”, “♥”: “dragoste”, “&”: “si”, “|”: “sau”, “”: “mai mare ca”, “∑”: “suma”, “¤”: “valuta”}, ru: {“∆”: “delta”, “∞”: “beskonechno”, “♥”: “lub ov “,” & “:” i “,” | “:” ili “,” “:” bolche “,” ∑ “:” summa “,” ¤ “:” valjuta “}, sk: {” ∆ “: “delta”, “∞”: “nekonecno”, “♥”: “laska”, “&”: “a”, “|”: “alebo”, “”: “viac ako”, “∑”: “sucet “,” ¤ “:” mena “}, sr: {}, tr: {” ∆ “:” delta “,” ∞ “:” sonsuzluk “,” ♥ “:” ask “,” & “:” ve ” , “|”: “veya”, “”: “buyuktur”, “∑”: “toplam”, “¤”: “para birimi”}, uk: {“∆”: “delta”, “∞”: ” bezkinechnist “,” ♥ “:” lubov “,” & “:” i “,” | “:” abo “,” “:” bilshe “,” ∑ “:” suma “,” ¤ “:” valjuta “} , vn: {“∆”: “delta”, “∞”: “vo cuc”, “♥”: “yeu”, “&”: “va”, “|”: “hoac”, “”: “lon hon “,” ∑ “:” tong “,” ¤ “:” tien te “}}; if (” string “! = typeof e) return” “; if (” string “== typeof a&& (A = a) , m = Ien, c = Cfr, “objet” == typeof a) pour (g dans n = amaintenirCase ||! 1, O = acustom&& “object” == type d’unpersonnalisé? apersonnalisé: O, u = atronquer> 1&&atronquer ||! 1, l = auric ||! 1, s = auricNoSlash ||! 1, r = amarque ||! 1, S =! 1! == asymboles &&! 1! == alang, A = aséparateur || A, l&& (p = bjoin (“”)), s&& (p = zjoindre (“”)), r&& (p = [“”,”! “,” ~ “,” * “,” ‘”,” (“,”) “]join (“”)), m = alang&&I [alang] &&S? I [alang]: S? Ifr: {}, c = alang&&C [alang]? C [alang]:! 1 === alang ||! 0 === alang? {}: Cfr, untitleCase&& “nombre” == type d’untitleCaselongueur&&ArrayprototypetoStringappel (untitleCase)? (untitleCaseforEach (fonction (e) {O [e “”] = e “”}), t =! 0): t = !! atitleCase, uncustom&& “nombre” == type d’unDouanelongueur&&ArrayprototypetoStringappel (unpersonnalisé) &&aDouaneforEach (function (e) {O [e “”] = e “”}), Objecttouches (O)forEach (fonction (a) {var n; n = alength> 1? new RegExp (“\ b” o (a) “\ b”, “gi”): new RegExp (o (a), “gi”), e = eremplacer (n, O [a])}), O) p = g; pour (p = o (p = A), f =! 1, y =! 1, d = 0, k = (e = eremplacer (/ (^ s | s $) / g, “”))longueur; d = 0? (j = g, g = “”):! 0 === y? (g = U [j] v [g], j = “”): g = f&&v [g]match (/ [A-Za-z0-9] /)? “” v [g]: v [g], f =! 1, y =! 1): g dans U? (j = g, g = ” “, d === k-1&& (g = U [j]), y =! 0) :! m [g] || l&&-1! == brejoindre(“”)indexOf (g) || s&&-1! == zrejoindre(“”)indexOf (g)? (! 0 === y? (g = U [j] g, j = “”, y =! 1): f&& (/ [A-Za-z0-9] /test (g) || Esubstr (-1)match (/ A-Za-z0-9] /)) && (g = “” g), f =! 1) 🙁 g = f || Esubstr (-1)match (/ [A-Za-z0-9] /)? A m [g]: m [g], g = void 0! == e [d 1] &&e [d 1]match (/ [A-Za-z0-9] /)? A: “”, f =! 0), E = greplace (new RegExp (“[^ \ w \ s” p “_-]”, “g”), A); renvoie t&& (E = Eremplacer (/ ( w) ( S *) / g, fonction (e, a, n) {var t = atoUpperCase () (null! == n? n: “”); return Objecttouches (O)indexOf (ttoLowerCase ()) u&& (h = EcharAt (u) === A, E = Etranche (0, u), h || (E = Etranche (0, ElastIndexOf (A)))), n || t || (E = EtoLowerCase ()), E}, t = function (e) {return function (a) {return n (a, e)}}, o = function (e) {return eremplacer (/ [- \ ^ $ *?() | [] {} /] / g, “\ $ &”)}, i = function (e, a) {for (var n in a) if (a [n] === e) return! 0}; if (“undefined”! = typeof module&&modulemodule d’exportation)exportations = n, moduleexportationscreateSlug = t; else if (“undefined”! = typeof define&&defineamd) define ([], function () {return n}); else try {if (egetSlug || ecreateSlug) throw “speakurl: les globals existent / (getSlug | createSlug) /”; egetSlug = n, ecreateSlug = t} catch (e) {}} (ceci);
}, {}];
la fenêtremodules [“1235”] = [function (require, module, exports) {var namespace = “expire_mixin”; function expirePlugin () {var e = thiscreateStore (cestockage, nul, ceci_namespacePrefix namespace); return {set: function (t, n, a, r) ​​{thishasNamespace (espace de noms) || eset (n, r); return t ()}, get: function (e, n) {thishasNamespace (espace de noms) || tcall (this, n); return e ()}, remove: function (t, n) {thishasNamespace (espace de noms) || eremove (n); return t ()}, getExpiration: function (t, n) {return eget (n)}, removeExpiredKeys: function (e) {var n = []; thischacun (fonction (e, t) {npush (t)}); for (var a = 0; a = 0; r -) {var l = localStorage ()key (r); e (read (l), l)}} function remove (e) {return localStorage ()removeItem (e)} function clearAll () {return localStorage ()module clear ()}exports = {nom: “localStorage”, lire: lire, écrire: écrire, chacun: chacun, supprimer: supprimer, clearAll: clearAll};
}, {“1237”: 1237}];
la fenêtremodules [“1239”] = [fonction (exiger, module, exportations) {moduleexports = {name: “memoryStorage”, read: read, write: write, each: each, remove: remove, clearAll: clearAll}; var memoryStorage = {}; function read (e) {return memoryStorage [e]} function write (e, r) {memoryStorage [e] = r} fonction each (e) {for (var r in memoryStorage) memoryStoragehasOwnProperty (r) &&e (memoryStorage [r], r)} function remove (e) {delete memoryStorage [e]} function clearAll (e) {memoryStorage = {}}
}, {}];
la fenêtremodules [“1276”] = [function (require, module, exports) {! function (e) {var t = function (e) {return new y (e)}; tversion = “068 “,” undefined “! = Typeof module&&moduleexportations? moduleexports = t: “function” == typeof define&&defineamd? define (function () {return t}): etypogr = t; var n = function (e, t) {return new RegExp (e, t)}, s = /] *> / i, r = tamp = function (e) {var t = / ( s |) (& | & | & # 38;) ( s |) / g; if (e || “string” == typeof e) return ereplace (/ ()? ([^)? / g, fonction (e, n, r, a) {retourne a = a || “”, (n = n || “”)correspondance (s)? n r a: n (r = rremplacer (t, ‘$ 1& $ 3’)) a})}, a = tord = function (e) {if (e || “string” == typeof e) {var t, n = f (e), r = [], a =! 1, p = / ( d) (st | nd | rd | th) / g; renvoie nforEach (fonction (e) {“tag” === etype? (rpousser (etxt), t = sexec (etxt), a =! (! t || void 0! == t [1])): a? rpousser (etxt): rpousser (eSMSremplacer (p, ‘$ 1 $ 2’))}), rjoin (“”)}}, p = tinitQuotes = fonction (e) {var t = n (“(?: (?:] *> | ^) \ s * (?:] *> \ s *) *) (?: (” | ” | “) | (‘|’ | ‘))”, “I”); if (e || “string” == typeof e) renvoie ereplace (t, fonction (e, t, n) {var s = t? “dquo”: “quo”, r = t || n; return [etranche (0, elastIndexOf (r)), ”, r, “”]join (“”)})}, c = twidont = function (e) {var t = “(?:] *?>) *? [^ \ s] (? 🙁 ?: a | em | span | strong | i | b) [^>] * ?>) *? “, s = n (” (\ s “t” \ s “t”) (?: \ s) ([^ \ s] (?: \ s * (?: a | em | span | strong | i | b) [^>] *?> \ s * \*) *? (?: \ s *? (?: p | h [1-6] | li | dt | dd)> | $)) “,” gi “); renvoie eremplacer (s, ‘$ 1 $ 2’)}, i = tcaps = function (e) {var t, r = f (e), a = [], p =! 1, c = n (“((\ b [AZ \ d] * [AZ] \ d * [AZ] [AZ \ d ‘] * \ b) | (\ b [AZ] \\ s? (?: [A-Z] \\ s?)) (?: \ s | \ b | $)) “,” g “); renvoie rforEach (fonction (e) {“tag” === etype Apousser (etxt), t = sexec (etxt), p =! (! t || void 0! == t [1])): p? apousser (etxt): apousser (eSMSreplace (c, fonction (e, t, n, s) {var r, a; renvoie n? ‘% s’remplacer (“% s”, n) 🙁 “” === stranche (-1)? (r = stranche (0, -1), a = “”) 🙁 r = s, a = “”), ‘% s1% s2’remplacer (“% s1”, r)remplacer (“% s2”, a))}))}), adécoupertypogrifie = fonction (e) {var t = e; retourne ejquery&&ehtml&& (t = ehtml ()), t = r (t), t = c (t), t = u (t), t = i (t), t = p (t), t = a (t)}; var l , o, u = tsmartypants = function (e) {var t, n, r = f (e), a = [], p = [], c = “”, i = “”, l =! 1, o = “”; return rforEach (fonction (e) {if (“tag” === etype Apousser (etxt), nul! == (i = sexec (etxt)) && (c = i [2]toLowerCase (), i [1]? (plongueur> 0&&c === p [plength-1] &&ppop (), 0 === plength&& (l =! 1)) 🙁 ppush (c), l =! 0)); else {if (n = (n = eSMS)replace (/ (rock) ‘n’ (roll) / gi, “$ 1’n’ $ 2 “), t = nslice (-1),! l) commutateur (n = g (n), n = h (n), n = d (n), n = x (n)) {case “‘”: n = / S /test (o)? “” “:” ‘”; break; case ‘”‘: n = / S /test (o)? “” “:” “”; break; par défaut: n = m (n)} o = t, apush (n)}}), ajoin (“”)}, f = ttokenize = function (e) {for (var t, n = [], s = 0, r = / ([^] *>) / gi; null! == (t = rexec (e));) {var a = t [1], p = t [2]; a&&npush ({type: “text”, txt: a}), npush ({type: “tag”, txt: p}), s = rlastIndex} retourne rlastIndex) / g, “$ 1 -“)}, d = tsmartEllipses = fonction (e) {retourne eremplacer(/\/g,”…”)remplacer(/ / g, “…”)}, x = tsmartBackticks = fonction (e) {retourne eremplacer (/ “ / g, “” “)remplacer (/ ” / g, “” “)}, m = tsmartQuotes = fonction (e) {var t = “(? =% s \ B)”remplacer (“% s”, “[! ” # \ $ \% \ ‘() *, -\ /:;? \ @ \ [\\] \ ^ _ `{|} ~]”), s = “[^ \ \ t \ r \ n \ [ {\ (\ -] “, r = n (” (\ s | | – | & [mn] tiret; | – | – | ȁ [34];) ‘(? = \ w) “,” g “), a = n (” (“s”) ‘(?! \ s | s \ b | \ d) “,” g “), p = n (” (“s” ) ‘(?! \ s | s \ b) “,” g “), c = n (‘ (\ s | | – | & [mn] tiret; | – | – | ȁ [34] 😉 “(? = \ w) ‘,” g “), i = n (‘” (? = \ s) ‘, “g”), l = n (“(” s’) “‘, “g”); retourne eremplacer (n (“^ ‘% s”remplacer (“% s”, t), “g”), “’ “)remplacer (n (‘^ “% s’remplacer (“% s”, t), “g”), “” “)remplacer (/ “‘(? = w) / g,” “‘ “)remplacer (/ ‘”(? = w) / g,” ‘” “)remplacer (/ b ‘(? = d {2} s) / g, “’ “)remplacer (r, “$ 1” “)remplacer (a, “$ 1” “)remplacer (p, “$ 1’ $ 2 “)remplacer(“‘”,”‘”)remplacer (c, “$ 1” “)remplacer (i, “” “)remplacer (l, “$ 1” “)replace (‘”‘,” “”)}, y = function (e) {this_wrapped = e}, v = fonction (e, n) {yprototype [e] = fonction () {retourne e = nappeler (t, ceci_wrapped), ce_chaîne? t (e)chain (): e; var e}}; pour (l dans t) thasOwnProperty (l) && ((o = t [l]) &&oconstructeur&&ocall&&oappliquer) &&v (l, t [l]); yprototypechain = function () {renvoie ceci_chain =! 0, ceci}, yprototypevalue = function () {renvoie ceci_wrapped}} (ceci);
}, {}];
la fenêtremodules [“1358”] = [function (require, module, exports) {“use strict”; const universalAgora = require (1360), universalRest = require (9), universalQuery = require (1359), _ get = require (23) ; function searchByQueryWithRawResults (e, r) {const t = `// $ {rsitehôte} $ {80! == rsiteport? `: $ {rsiteport} `:” “} $ {rsitechemin} / _ agora / _search`; retourne universalRestpost (t, e,! 0)} function getProducts (e, r, t) {return searchByQueryWithRawResults (universalAgorabuildProductsQuery (e), r)alors (e => {const r = universalQueryformatSearchResult (e); return {total: eles coupstotal, produits: t? universalAgorafilterByLocale (r): r}})} function getMerchantsList (e) {renvoie searchByQueryWithRawResults (universalAgorabuildMerchantsAggregation (1e6, _get (e, “siteagoraLocale “)), e)alors (universalQueryformatAggregationResults ({aggregationName: “merchants”, field: “key”, subfield: “name”}))} moduleexportationsgetProduct = universalAgoragetProduct, moduleexportationsgetProducts = getProducts, moduleexportationsgetMerchantsList = getMerchantsList, moduleexportationssearchByQueryWithRawResults = searchByQueryWithRawResults, moduleexportationsbuildMerchantsByUrlQuery = universalAgorabuildMerchantsByUrlQuery;
}, {“9”: 9, “23”: 23, “1359”: 1359, “1360”: 1360}];
la fenêtremodules [“1359”] = [function (require, module, exports) {“use strict”; const _map = require (50), _ get = require (23), _ isArray = require (150), _ set = require (107) , _isObject = require (88), _ cloneDeep = require (60), _ uniq = require (91); function formatSearchResult (e) {return _map (eles coupshits, “_ source”)} function newQuery (e) {if (! e) throw new Error (“Un` index` est requis pour construire une requête “); return {index: e, type:” _ doc “, body: {requête: {}}}} function addShould (e, o) {var t = _get (e, “bodyrequetebooléenshould “, void 0), r = _isArray (o); return t? r? _set (e,” bodyrequetebooléendevrait “, tconcat (o)) 🙁 tpush (o), _ set (e, “corpsrequetebooléendevrait “, t)): _ set (e,” corpsrequetebooléendevrait “, r? o: [o]), e} function addMust (e, o) {var t = _get (e,” bodyrequetebooléenmust “, void 0), r = _isArray (o); return t? r? _set (e,” bodyrequetebooléendoit “, tconcat (o)) 🙁 tpush (o), _ set (e, “corpsrequetebooléendoit “, t)): _ set (e,” corpsrequetebooléenmust “, r? o: [o]), e} function addMustNot (e, o) {var t = _get (e,” bodyrequetebooléenmust_not “, void 0), r = _isArray (o); return t? r? _set (e,” bodyrequetebooléenmust_not “, tconcat (o)) 🙁 tpush (o), _ set (e, “corpsrequetebooléenmust_not “, t)): _ set (e,” corpsrequetebooléenmust_not “, r? o: [o]), e} function addFilter (e, o) {var t = _get (e,” bodyrequetebooléenfilter “, void 0); if (! _ isObject (o)) throw new Error (” Filter query required to be an object “); return t? _isArray (t)? (tpush (o), _ set (e, “corpsrequetebooléenfiltre “, t)): _ set (e,” corpsrequetebooléenfiltre “, [_ cloneDeep (t), o]): _ set (e,” corpsrequetebooléenfilter “, o), e} function addMinimumShould (e, o) {if (” number “! = typeof o) throw new Error (” Un nombre est requis comme second argument “); return _set (e,” bodyrequetebooléenminimum_should_match “, o), e} fonction addSort (e, o) {var t = _get (e,” corpssort “); retourne _isArray (t) || _set (e,” corpstrier “, t = []), tpush (o), e} function addSize (e, o) {if (! o&&0! == o) return e; if (o = parseInt (o), isNaN (o)) throw new Error (`Le deuxième argument doit être un nombre: $ {o} `); return _set (e,” corpssize “, o)} function addFrom (e, o) {if (! o&&0! == o) return e; if (o = parseInt (o), isNaN (o)) throw new Error (` Le second argument doit être un nombre: $ {o} `); return _set (e,” corpsfrom “, o)} function onlyWithTheseFields (e, o) {if (! _ isArray (o)) throw new Error (” Second argument is required to be an Array “); return _set (e,” body_la sourceinclude “, _ uniq (o)), e} function onlyWithinThisSite (e, o) {return osubsiteSlug? addFilter (e, {terme: {sous-site: osubsiteSlug}}) 🙁 addFilter (e, {terme: {site: oslug}}), addMustNot (e, {existe: {field: “subsite”}})), e} function onlyWithinThisDomain (e, o) {return addFilter (e, {prefix: {canonicalUrl: `http: // $ {ohost} `}}), e} function withinThisSiteAndCrossposts (e, o) {var t = {term: {}}, r = {bool: {should: [], minimum_should_match: 1}}; return tterm [“crosspost”(osubsiteSlug || olimace)] =! 0, rbooléendevraientpousser (t), osubsiteSlug? rbooléendevraientpush ({terme: {sous-site: osubsiteSlug}}) 🙁 rbooléendevraientpush ({term: {site: oslug}}), addMustNot (e, {existe: {field: “subsite”}})), addFilter (e, r), e} function withinThisDomainOrCrossposts (e, o) {return addShould (e, {term: {[ `crosspost$ {osubsiteSlug || oslug} `]:! 0}}), addShould (e, {préfixe: {canonicalUrl:` http: // $ {ohost} `}}), addMinimumShould (e, 1), e} function moreLikeThis (e, o, t) {let r = {fields: [” tags “], comme: {_ index: eindex, _type: “_ doc”, _ id: o}, include:! 1, min_term_freq: 1, max_query_terms: 12, min_doc_freq: 1}; return {more_like_this: Objectassign (r, t)}} function addAggregation (e = {}, o) {const {body: t = {}} = e; return o? (taggs? _set (e, “corpsaggs “, Objetattribuer (taggs, o)): _ set (e, “corpsaggs “, o), e): e} function formatAggregationResults ({aggregationName: e =” “, field: o =” “, subfield: t =” “, skipEmpty: r =! 0}) {return function (s = {}) {let i = _get (s, `agrégations$ {e} $ {t? “”t””:””} buckets`, []); renvoie r&& (i = ifiltre (e => 0! == _ get (e, “doc_count”, 0))), imap (e => e [o] || “”)}} function addGeo (e, o) {if (! _ isArray (o)) throw new Error (“Second argument is required to be an Array”); if ( 2! == olength) throw new Error (“Le tableau doit avoir une longueur de 2”); if (osome (isNaN)) throw new Error (“Le tableau ne doit contenir que des nombres”); return _set (e, “bodyrequetegeo_shapeemplacementformetype “,” point “), _ set (e,” corpsrequetegeo_shapeemplacementformecoordonnées “, o), e} function combineFunctionScoreQueries (e, o) {let t = _cloneDeep (_get (e,” bodyrequête “, {})), r = _cloneDeep (_get (o,” corpsrequête “, {})), s = _get (e,” corpssort “); retourne _set (e,” corpsrequête “, {}), _ set (e,” corpsrequetefunction_scorefonctions “, []), ecorpsrequetefunction_scoreles fonctionspush ({filtre: t, poids: 20}), ecorpsrequetefunction_scoreles fonctionspush ({filter: r, weight: 10}), ecorpsrequetefunction_scorescore_mode = “max”, ecorpsrequetefunction_scoremin_score = 10, _isArray (s) || _set (e, “corpstrier “, s = []), sunshift ({_ score: “desc”}), e} function addNestedObjQuery (e, o, t) {if (! e) throw new Error (“Il n’y a pas de requête de base pour effectuer l’opération addNestedObjQuery”); if (! o ) throw new Error (“Il n’y a pas de chemin d’objet imbriqué sur lequel effectuer la requête imbriquée”); if (! t) throw new Error (“Il n’y a pas de chemin de requête imbriqué pour effectuer la requête imbriquée”); return _set (e , “imbriqué”, {chemin: o, requête: t}), e} fonction addMatchAll (e) {return _set (e, “corpsquery “, {match_all: {}}), e} moduleexportations = nouvelle requête, moduleexportationsaddGeo = addGeo, moduleexportationsaddAggregation = addAggregation, moduleexportationsaddShould = addShould, moduleexportationsaddFilter = addFilter, moduleexportationsaddMust = addMust, moduleexportationsaddMustNot = addMustNot, moduleexportationsaddMinimumShould = addMinimumShould, moduleexportationsaddSort = addSort, moduleexportationsaddSize = addSize, moduleexportationsaddFrom = addFrom, moduleexportationsonlyWithTheseFields = onlyWithTheseFields, moduleexportationsonlyWithinThisSite = onlyWithinThisSite, moduleexportationsonlyWithinThisDomain = onlyWithinThisDomain, moduleexportationswithinThisSiteAndCrossposts = withinThisSiteAndCrossposts, moduleexportationswithinThisDomainOrCrossposts = withinThisDomainOrCrossposts, moduleexportationsformatAggregationResults = formatAggregationResults, moduleexportationsformatSearchResult = formatSearchResult, moduleexportationsmoreLikeThis = moreLikeThis, moduleexportationscombineFunctionScoreQueries = combineFunctionScoreQueries, moduleexportationsaddNestedObjQuery = addNestedObjQuery, moduleexportationsaddMatchAll = addMatchAll;
}, {“23”: 23, “50”: 50, “60”: 60, “88”: 88, “91”: 91, “107”: 107, “150”: 150}];
la fenêtremodules [“1360”] = [function (require, module, exports) {(function (process, __ filename) {(function () {
“use strict”; const _forEach = require (41), _ get = require (23), _ filter = require (134), _ map = require (50), _ isEmpty = require (87), urlParse = require (51), log = nécessitent (22)setup ({fichier: __ nom de fichier}), queryService = require (1359), universalRest = require (9), AGORA_HOST = windowtraiterenvAGORA_HOST, AGORA_ELASTIC_PREFIX = fenêtretraiterenvAGORA_ELASTIC_PREFIX, AGORA_ENDPOINT = AGORA_HOST? `$ {AGORA_HOST} / api / v1`: null, requestHeader = {” Content-Type “:” application / json “}, PRODUCTS_INDEX =” agora-products “, AFFILIATES_INDEX =” affiliés_INDEX ” = “détaillants”, FILTER_KEY = {marchands: “nom”, affiliés: “affilié”}, URL_RE = / ^ https?: / /* $ /; function getProducts (e, t) {const {limit: r = 100, start: a = 0, search: s = “”, sortDate: c = “desc”} = e, n = `$ {AGORA_ENDPOINT } / products? limit = $ {r} &start = $ {a} &search = $ {encodeURIComponent (s)} &sortDate = $ {c} `; return fetch (n)alors (handleResponse)alors (e => t? filterByLocale (e, t): e)alors (e => ({total: elongueur, produits: e}))catch (handleError (n))} function getProduct (e, t) {const r = `$ {AGORA_ENDPOINT} / products / $ {e}`; if (! AGORA_ENDPOINT) throw new Error (“Aucun point de terminaison Agora n’a été défini” ); if (“string”! = typeof e) throw new Error (“request must provide a product id”); return fetch (r)alors (handleResponse)alors (e => t? filterByLocale (e, t): e)catch (handleError (r))} function postProduct (e) {const t = `$ {AGORA_ENDPOINT} / products`, r = {method:” POST “, headers: requestHeader, body: JSONstringify (e)}; renvoie fetch (t, r)alors (handleResponse)catch (handleError (t))} function putProduct (e, t) {const r = `$ {AGORA_ENDPOINT} / products / $ {e}`, a = {method: “PUT”, headers: requestHeader, body: JSONstringify (t)}; renvoie fetch (r, a)alors (handleResponse)catch (handleError (r))} function patchProduct (e, t) {const r = `$ {AGORA_ENDPOINT} / products / $ {e}`, a = {method: “PATCH”, headers: requestHeader, body: JSONstringify (t)}; renvoie fetch (r, a)alors (handleResponse)catch (handleError (r))} function deleteProduct (e) {const t = `$ {AGORA_ENDPOINT} / products / $ {e}`; return fetch (t, {method: “DELETE”, headers: requestHeader})alors (handleResponse)catch (handleError (t))} function getMerchantList (e) {const {limit: t = 100, fields: r = “”} = e; return Promiserésoudre ([{name: “Amazon”}])catch (handleError (“”))} function getMerchant (e) {const t = `$ {AGORA_ENDPOINT} / merchants / $ {e}`; if (“string”! = typeof e) throw new Error (“request must provide un identifiant de produit “); renvoie fetch (t)alors (handleResponse)catch (handleError (t))} function patchMerchant (e, t) {const r = `$ {AGORA_ENDPOINT} / merchants / $ {e}`, a = {method: “PATCH”, headers: requestHeader, body: JSONstringify (t)}; renvoie fetch (r, a)alors (handleResponse)catch (handleError (r))} function postMerchant (e) {const t = `$ {AGORA_ENDPOINT} / merchants`, r = {method:” POST “, headers: requestHeader, body: JSONstringify (e)}; renvoie fetch (t, r)alors (handleResponse)catch (handleError (t))} function putMerchant (e, t) {const r = `$ {AGORA_ENDPOINT} / merchants / $ {e}`, a = {method: “PUT”, headers: requestHeader, body: JSONstringify (t)}; renvoie fetch (r, a)alors (handleResponse)catch (handleError (r))} function deleteMerchant (e) {const t = `$ {AGORA_ENDPOINT} / merchants / $ {e}`; return fetch (t, {method: “DELETE”, headers: requestHeader})alors (handleResponse)catch (handleError (t))} function postLocale (e) {const t = `$ {AGORA_ENDPOINT} / locales /`, r = {method: “POST”, headers: requestHeader, body: JSONstringify (e)}; renvoie fetch (t, r)alors (handleResponse)catch (handleError (t))} function patchLocale (e, t) {const r = `$ {AGORA_ENDPOINT} / locales / $ {e}`, a = {method: “PATCH”, headers: requestHeader, body: JSONstringify (t)}; renvoie fetch (r, a)alors (handleResponse)catch (handleError (r))} function handleResponse (e) {try {return ejson ()alors (t => {si (estatus> = 400) {const e = _get (t, “messagedétails [0]message “); throw new Error (e)} return t})} catch (e) {throw new Error (emessage)}} function handleError (e) {return t => {throw log (“warn”, `Failed request to $ {e}`, t), new Error (`request to $ {e} failed`)}} function buildProductsQuery ({search: e = “”, limit: t = 100, start: r = 0, sortDate: a = “”, filters: s, locale: c}) {const n = queryService (PRODUCTS_INDEX), o = s&CSSEETCHARObjectclé (s)longueur? Objetclé (s)filtre (e => ArrayisArray (s [e]) &&s [e]length): [], i = {}, u = {}; if (prependElasticPrefix (n), e || olongueur || c || queryServiceaddMatchAll (n), c&& (queryServiceaddMust (i, {match: {“localeslocale “: c}}), queryServiceaddMust (u, {match: {“marchandslocale “: c}})), e) if (isURL (e)) queryServiceaddMust (n, [queryServiceaddNestedObjQuery ({}, “marchands”, {match: {“marchandsbuyUrl “: e}})]); else {const t = {}; queryServiceaddShould (t, [{match: {“localesproductId “: e}}, {match: {” localesname “: {query: e, boost: 2}}}]), queryServiceaddMinimumShould (t, 1), queryServiceaddMust (i, _get (t, “corpsrequête “))} si (olongueur) {const e = {}; oforEach (t => {const r = s [t], a = FILTER_KEY [t], c = {}; a&& (c [`marchands$ {a} `] = r, queryServiceaddShould (e, {terms: c}))}), queryServiceaddMinimumShould (e, 1), queryServiceaddMust (u, _get (e, “corpsquery “))} return _isEmpty (i) || queryServiceaddMust (n, [queryServiceaddNestedObjQuery ({}, “locales”, _ get (i, “bodyquery “))]), _ isEmpty (u) || queryServiceaddMust (n, [queryServiceaddNestedObjQuery ({}, “marchands”, _ get (u, “corpsquery “))]), queryServiceaddSize (n, t), r> = 0&&queryServiceaddFrom (n, r), “desc” === a || “asc” === a? queryServiceaddSort (n, {updatedAt: {order: a}}): e&&queryServiceaddSort (n, {_ score: {order: “desc”}}), n} function prependElasticPrefix (e) {return eindex = AGORA_ELASTIC_PREFIX? `$ {AGORA_ELASTIC_PREFIX} _ $ {eindex} `: eindex, e} function buildMerchantsAggregation (e = 1e6, t) {const r = queryService (PRODUCTS_INDEX); return prependElasticPrefix (r), queryServiceaddMust (r, {match: {active:! 0}}), t&&queryServiceaddMust (r, queryServiceaddNestedObjQuery ({}, “marchands”, _ get (queryServiceaddMust ({}, {match: {“marchandslocale “: t}}),” corpsquery “))), queryServiceaddAggregation (r, {marchands: {nested: {path: “merchants”}, aggs: {name: {terms: {field: “marchandsnom “, taille: e}}}}}), queryServiceaddSize (r, 0), r} function isURL (e) {return URL_REtest (e)} function filterByLocale (e, t, r = {locales: “US”}) {const a = ArrayisArray (e); if (_isEmpty (e)) return a? []: {}; const s = [“locales”, “marchands”], c = a? e: [e], n = Objectkeys (r), o = _map (c, e => {const a = Objectassign ({}, e); return _forEach (s, s => {if (Objectclés (a)inclut (s)) {const c = t? _filter (e [s], [“locale”, t]): e [s]; a [s] = c,! clongueur&&ninclut (s) && (a [s] = (_ filtre (e [s], [“locale”, r [s]]) || [])carte (e => (eid = nul, elocale = t, e)))}}), aname = _get (a, “locales [0]name “,” “), a}); renvoie a&&olength? o: _get (o, “[0]”, {})} fonction searchByQueryWithRawResults (e, t) {const r = `// $ {tsitehôte} $ {80! == tsiteport? `: $ {tsiteport} `:” “} $ {tsitechemin} / _ agora / _search`; retourne universalRestpost (r, e,! 0)} function buildMerchantsByUrlQuery (e) {const t = queryService (PRODUCTS_INDEX); renvoie prependElasticPrefix (t), queryServiceaddNestedObjQuery (tcorpsrequête, “marchands”, {match: {“marchandsbuyUrl “: e}}), t} function getAffiliatesByLocale (e, t) {const r = queryService (AFFILIATES_INDEX); return prependElasticPrefix (r), queryServiceaddMust (r, {match: {locale: e}}), queryServiceaddSize (r, 1e3), queryServiceaddSort (r, {name: “asc”}), searchByQueryWithRawResults (r, t)alors (e => _ get (e, “frappeles coups”,[])map (e => _ get (e, “_ source”, {})))} function getRetailersByAffiliateId (e, t) {const r = queryService (RETAILERS_INDEX); return e? (prependElasticPrefix (r), queryServiceaddMust (r, [queryServiceaddNestedObjQuery ({}, “affiliateRetailers”, {match: {“affiliateRetailersaffiliateId “: e}})]), queryServiceaddSize (r, 1e3), queryServiceaddSort (r, {name: “asc”}), searchByQueryWithRawResults (r, t)alors (e => _ get (e, “frappeles coups”,[])map (e => _ get (e, “_ source”, {})))): Promesserejette ()} function getMerchantsList (e) {renvoie searchByQueryWithRawResults (buildMerchantsAggregation (1e6, _get (e, “siteagoraLocale “)), e)alors (queryServiceformatAggregationResults ({nomagrégation: “marchands”, champ: “clé”, sous-champ: “nom”}))} function queryRetailersByUrl (e, t) {const r = urlParse (e)hébergersplit (“www”)join (“”), a = queryService (RETAILERS_INDEX); renvoie queryServiceaddMust (a, {match: {domaines: r}}), prependElasticPrefix (a), queryServiceaddSize (a, 10), searchByQueryWithRawResults (a, t)alors (e => _ get (e, “frappeles coups”,[])map (e => _ get (e, “_ source”, {})))} require (208), moduleexportations = {buildProductsQuery: buildProductsQuery, buildMerchantsAggregation: buildMerchantsAggregation, getProducts: getProducts, getProduct: getProduct, postProduct: postProduct, putProduct: putProduct, patchProduct: patchProduct, postProducts, getProduct: getProduct, postProduct: postProduct, putProduct: putProduct, patchProduct: patchProduct, postProducts: getProduct: getProduct, postProduct: postProduct, putProduct: putProduct, patchProduct: patchProduct, postProducts: getProduct: getProduct, postProduct: postProduct, putProduct: putProduct, patchProduct: patchProduct, postProduct: patchMerchantMerchant: patchMerchantMerchant: patchMerchant , putMerchant: putMerchant, deleteMerchant: deleteMerchant, isURL: isURL, filterByLocale: filterByLocale, patchLocale: patchLocale, postLocale: postLocale, buildMerchantsByUrlQuery: buildMerchantsByUrlQuery, getAffiliatesByLocale: getAffiliatesByLocale, searchByQueryWithRawResults: searchByQueryWithRawResults, getRetailersByAffiliateId: getRetailersByAffiliateId, getMerchantsList: getMerchantsList, queryRetailersByUrl: queryRetailersByUrl};

})appeler (ceci)})call (this, require (11), “/ services / universal / agorajs “)}, {” 9 “: 9,” 11 “: 11,” 22 “: 22,” 23 “: 23,” 41 “: 41,” 50 “: 50,” 51 “: 51,” 87 “: 87,” 134 “: 134,” 208 “: 208,” 1359 “: 1359}];
la fenêtremodules [“1361”] = [function (require, module, exports) {“use strict”; const _map = require (50), _ mapValues ​​= require (203), _ Reduce = require (89), _ assign = require (138) , _get = require (23), _ pickBy = require (139), _ find = require (42), affiliateFields = [“siteShortKey”, “pageUri”, “productId”, “utmMedium”, “utmSource”, “format”, ” utmCampaign “,” referrer “,” deviceAbbreviation “,” zone “], affiliateSettings = {amazon: {domaines: [” amazoncom “,” amazoncouk “], subtagKey:” ascsubtag “, maxLength: 99, délimiteur:” standard “, encoder:! 1}, narrativ: {domaines: [” shop-linksco / “], subtagKey:” u1 “, maxLength: 99, délimiteur:” standard “, encoder:! 0}, rakuten: {domaines: [” clicliensynergiecom / deeplink “,” linksynergyWalmartcom / deeplink “], subtagKey:” u1 “, maxLength: 72, délimiteur:” standard “, encoder:! 1}, shareasale: {domaines: [” shareasalecom “], subtagKey:” afftrack “, maxLength: 99, délimiteur:” standard “, encoder:! 1}, skimlinks: {domaines: [” goredirigercom “], subtagKey:” xcust “, maxLength: 50, délimiteur:” alt “, encoder:! 1}, impact: {domaines: [], subtagKey:” subId2 “, maxLength: 99, délimiteur:” standard “, encoder:! 1}, avantlink: {domaines: [“avantlinkcom “], subtagKey:” ctc “, maxLength: 64, délimiteur:” alt “, encoder:! 1}, cj: {domaines: [” tkqlhcecom “,” jdoqocycom “,” dpbolvwnet “,” anrdoezrsnet “,” kqzyfjcom “], subtagKey:” sid “, maxLength: 64, délimiteur:” alt “, encoder:! 1, joinBy:” / “, assignBy:” / “, positionné:! 0, position:” after “, positionKey: “type / dlg /”}, partenariat: {domaines: [“prfhn “], subtagKey:” pubref “, maxLength: 100, délimiteur:” alt “, encoder:! 1, joinBy:” / “, assignBy:”: “, positionné:! 0, position:” avant “, positionKey: “destination”}, pepperjam: {domaines: [“gopjncom “,” pntraccom “,” pjtracom “,” pjatrcom “,” pntrscom “,” pntracom “], subtagKey:” sid “, maxLength: 100, délimiteur:” alt “, encoder:! 1}, awin: {domaines: [” awin1com “], subtagKey:” pref1 “, maxLength: 100, délimiteur:” alt “, encoder:! 1, positionné:! 0, position:” before “, positionKey:” ued “}}, subtagDictionary = {siteShortKey:” “, pageUri:” p “, productId:” i “, zone:” z “, deviceAbbreviation:” d “, utmSource:” s “, utmMedium:” m “, utmCampaign:” c “, referrer:” r “, format: “t”}, délimiteurs = {standard: [“[“, “]”], alt: [“__”, “_”]}; function parseValueFromSubtag (e, t, i) {const a = t [ 0] et [1], s = isplit (a) [1] || “”; retourne s? ssplit (t [0]) [0]: null} function parseSubtag (e, t = délimiteursstandard) {return _pickBy (_mapValues ​​(subtagDictionary, i => parseValueFromSubtag (i, t, e)))} function generateSubtag (e, t, i = délimiteursstandard, a =! 1) {const s = (e => t => `$ {e [0]} $ {t} $ {e [1]}`) (i); soit n = _reduce (affiliateFields, (t, i) => {const a = s (subtagDictionary [i]), n = e [i]; return t (n? an: “”)}, “”); return a&& (n = encodeURIComponent (n )), n} fonction applySubtagMaxlength (e, t) {var i = t-3 * (ediviser(“,”)longueur-1 esplit (“|”)length-1); retourne esubstr (0, i)} function getSubtagData ({getters: e, champs: t = [], visitState: i, locals: a, productLink: s}) {let n = {}; retourne tforEach (t => {n [t] = e [t] &&e [t] ({visitState: i, locaux: a, productLink: s})}), n} function parseQuery (e = “”) {return esplit (“&”)réduire ((e, t) => {const i = tsplit (“=”) [0], a = tsplit (“=”) [1]; return void 0! == a&& (e [i] = a), e}, {})} function processSubtagPosition ({url: e, positionKey: t, subtagKey: i, position : a = “after”, subtagString: s, joinBy: n, assignBy: o} = {}) {const [r, l] = esplit (t), u = `$ {i} $ {o} $ {s}`, g = []; if (“after” === a) {if (! l) return e; const [a, s = “”] = lsplit (`$ {i} $ {o}`), d = sdivisé (n)tranche (1)joindre (n); gpush (`$ {r} $ {t}`, u), a&&gpush (a), d&&gpush (d)} if (“before” === a) {const [e, a = “”] = rsplit (`$ {i} $ {o}`), s = adivisé (n)tranche (1)joindre (n); gpush (e), s&&gpousser (s), gpush (u, `$ {t} $ {l}`)} retourne gréduire ((e, t) => {renvoyer etranche (-1) === n&& (e = etranche (0, -1)), elongueur? [e, t]join (n): t}, “”)} function processSubtag ({getters: e, affiliate: t, url: i, visitState: a = {}, locaux: s}) {const n = affiliateFields, o = _get ( affiliateSettings [t], “subtagKey”), r = _get (affiliateSettings [t], “maxLength”), l = _get (affiliateSettings [t], “encode”), u = _get (affiliateSettings [t], “delimiter” ), g = _get (affiliateSettings [t], “positionné”,! 1), d = _get (affiliateSettings [t], “position”), c = _get (affiliateSettings [t], “positionKey”), p = _get (affiliateSettings [t], “assignBy”, “=”), m = _get (affiliateSettings [t], “joinBy”, “&”), f = délimiteurs [u]; laissez b, y, S = iindexOf (“?”)> = 0? idiviser(“?”)pop (): “”, h = parseQuery (S), _ = getSubtagData ({getters: e, fields: n, visitState: a, locals: s, productLink: i}); return o&& (y = h [o] || “”, y = applySubtagMaxlength (b = generateSubtag (_ = _ assign (parseSubtag (y, f), _ pickBy (_)), t, f, l), r), h [o] = y, S = _map (h, (e, t) => `$ {t} = $ {e}`)join (“&”), i = g? processSubtagPosition ({url: i, positionKey: c, subtagKey: o, position: d, subtagString: y, joinBy: m, assignBy: p}): isplit (“?”) [0] `? $ {S}`), i} function getAffiliate (e) {const t = Objectkeys (affiliateSettings); return _find (t, t => _ find (affiliateSettings [t]domaines, t => ecomprend (ttoLowerCase ()))) || “”} function createSubtagProcessor (e) {return ({url: t, visitState: i, locals: a, affiliate: s}) => (s = getAffiliate (t) || s) ? processSubtag ({getters: e, url: t, affiliate: s, visitState: i, locaux: a}): “”} moduleexportationsgenerateSubtag = generateSubtag, moduleexportationsgetAffiliate = getAffiliate, moduleexportationscreateSubtagProcessor = createSubtagProcessor, moduleexportationsprocessSubtag = processSubtag;
}, {“23”: 23, “42”: 42, “50”: 50, “89”: 89, “138”: 138, “139”: 139, “203”: 203}];
la fenêtremodules [“article-navclient “] = [function (require, module, exports) {” use strict “; const dom = require (3), _ throttle = require (37), $ visibilité = require (4), $ popup = require (53), $ gtm = require (2), {reportSocial: reportSocial} = require (52), auth0 = require (12); moduleexportations = (t => {soit e = domtrouve(“en-tête de page “), i = domtrouve(“article-content “), o = domtrouver (t, “deepscroll-headline “), r = domtrouver (t, “deepscroll-rubric “), l = domtrouver (t, “deepscroll-rubric-sponsorisé “), s = domtrouve(“article en-tête d’article rubrique “), n = domfind (“# deepscroll_center_divider”), a = domtrouve(“paragraphe d’argile “), d = domtrouver (t, “logo “), c = domtrouver (t, “dyn-cut-logo “), p = domtrouver (t, “article-nav-top “), u = domtrouver (t, “article-nav-deepscroll “), m = domfind (‘link [rel = “canonical”]’), f = m&&mgetAttribute (“href”), g = domfind (‘meta [propriété = “og: image”]’)? domfind (‘meta [propriété = “og: image”]’)getAttribute (“content”): “”, h = domfind (‘meta [property = “og: title”]’)? domfind (‘meta [property = “og: title”]’)getAttribute (“content”): “”, y = domtrouver (t, “lien de partagefacebook “), w = domtrouver (t, “lien de partagetwitter “), v = domtrouver (t, “lien de partagepinterest “), b = tclassListcontient (“header-simple”), x = windowgetComputedStyle (d, null)getPropertyValue (“- targetFlexBasis”), L = fenêtregetComputedStyle (d, null)getPropertyValue (“- verticalStart”) || 0, C = fenêtregetComputedStyle (d, null)getPropertyValue (“- verticalEnd”) || 0, $ =! 1, _ = 55; fonction k () {_ = parseInt (fenêtregetComputedStyle (d, null)getPropertyValue (“- stickyTop”)) || _, C = $ visibilitégetViewportWidth ()> = 1180? fenêtregetComputedStyle (d, null)getPropertyValue (“- verticalEndDesktop”) || C: fenêtregetComputedStyle (d, null)getPropertyValue (“- verticalEnd”) || C} fonction S () {$ =! 1, P ()} fonction P () {let {top: o} = tgetBoundingClientRect (), r = fenêtregetComputedStyle (d, null)getPropertyValue (“- baseFlexBasis”), l = r-x, s = (_- egetBoundingClientRect ()haut) / _, n = Mathématiquesmax (0, mathématiquesmin (1, s)), m = L-C-2, f = Mathématiquesrond (L- (m * n 2)), g = Mathceil (r-l * n); si (st? eclassListadd (“en-tête après défilement”): eclassListremove (“en-tête après défilement”), pstyletop = C “px”, ustyletop = C “px”, vide (dstyleflexBasis = x “px”)} fenêtrescrollY> o? tclassListadd (“after-scroll”): tclassListremove (“after-scroll”), fenêtrescrollY> o? eclassListadd (“en-tête après défilement”): eclassListremove (“en-tête après défilement”), pstyletop = f “px”, ustyletop = f “px”, dstyleflexBasis = g “px”, c&& (cstyleflexBasis = g “px”), $ visibilitégetViewportWidth ()> = 1180&&i&&function () {const t = a? $ visibilitégetPageOffset (a)top-70: 0, e = $ visibilitégetPageOffset (i)top, o = Mathmax (e, t); retourne Mathmax (fenêtrescrollY, documentcorpsscrollTop)> = o} ()? tclassListajouter (“défilement profond”): tclassListremove (“deep-scroll”)} fonction V (t) {var e = tcurrentTarget, i = egetAttribute (“href”), o = egetAttribute (“data-handle”), r = $ popupgetPopupClass (eclassList), l = $ visibilitéisBelowPrimaryContent (e)? “bottom”: “top”; $ gtmreportNow ({event: “social-share-widget”, clickLocation: l, socialNetwork: r}), reportSocial (r), $ visibilitégetViewportWidth ()> = 768&&r&& (tpreventDefault (), $ popuppopWindow (r, o, i))}! function () {const e = _throttle (P, 30); if (k (), domfindAll (t, “lien de partage”)forEach (t => taddEventListener (“clic”, V)), y&& (yhref = “http: // wwwFacebookcom / sharer / sharerphp? u = “f”? utm_source = fb&utm_medium = s3&utm_campaign = sharebutton-t “), w&& (whref = “https: // twittercom / share? text = “encodeURIComponent (h)” &url = “f”? utm_source = tw&utm_medium = s3&utm_campaign = sharebutton-t&via = “wgetAttribute (“data-handle”)), v&& (vhref = “http: // pinterestcom / pin / create / button /? url = “f”? utm_source = pin&utm_medium = s3&utm_campaign = sharebutton-t&description = “encodeURIComponent (h)” &media = “g), b) return; auth0on (“init”, () => {auth0isSubscriber () &&tclassListajouter (“abonné”)}), fenêtreaddEventListener (“scroll”, e), fenêtreaddEventListener (“redimensionner”, S), fenêtreaddEventListener (“redimensionner”, k), s? sclassListcontient (“rubric-sponsor-story”) &&l? (rclassListsupprimer (“visible”), lclassListajouter (“visible”), ltextContent = stexte || stextContent) 🙁 rtextContent = stexte || stextContent, rhref = shref || “#”) 🙁 nstyledisplay = “aucun”, rstyledisplay = “aucun”); S (), otextContent = h} ()});
}, {“2”: 2, “3”: 3, “4”: 4, “12”: 12, “37”: 37, “52”: 52, “53”: 53}];
la fenêtremodules [“nav-search-buttonclient “] = [function (require, module, exports) {” use strict “; const dom = require (3), $ gtm = require (2), {reportSearch: reportSearch} = require (52), openClass =” open “, closeClass =” fermé “; moduleexportations = (e => {const s = e, t = domtrouver (e, “nav-search-button-trigger “), n = domtrouver (e, “nav-search-form “), o = domtrouver (e, “search-input “); fonction i () {const e = domfind (“corps”); sclassListbascule (closeClass), sclassListbascule (openClass), eclassListbascule (“désactivé”), eclassListtoggle (“search-active”)} fonction c () {i (), sclassListcontient (openClass) &&ofocus ()} fonction a (e) {! scontient (ecible) &&sclassListcontient (openClass) &&i ()} fonction r (e) {27 === ekeyCode&&sclassListcontient (openClass) &&i ()} fonction d (e) {epreventDefault (), $ gtmreportCustomEvent ({category: “search”, label: “on =” windowemplacementhref, action: ovaleur}), reportSearch ((ovaleur || “”)split (“”), () => nsubmit ())}! fonction (e, s, t) {s&&saddEventListener (“clic”, c); t&&taddEventListener (“soumettre”, d); eaddEventListener (“clic”, a), documentaddEventListener (“keydown”, r), eaddEventListener (“touchend”, a), naddEventListener (“soumettre”, d)} (domfind (“corps”), t, domtrouver (e, “nav-search-form submit “))});
}, {“2”: 2, “3”: 3, “52”: 52}];
la fenêtremodules [“nav-dropdown-buttonclient “] = [function (require, module, exports) {” use strict “; const dom = require (3), visibilité = require (4), {reportSearch: reportSearch} = require (52); function getNextSiblings (e) {const t = []; soit i = e; pour (; i = inextElementSibling;) tpush (i); retourne t} fonction getMainChildren (e, t) {let i = [], n = efirstChild; pour (; n = nnextElementSibling;) ncontient (t)? nisSameNode (t) || (i = iconcat (getMainChildren (n, t))): ipush (n); return i} function isMobile () {return visibilitégetViewportWidth () {let t; const i = equerySelector (“nav-dropdown-button-trigger “), n = domfind (“corps”), o = domtrouve(“haut “), l = domtrouve(“liste de confettis “), s = domtrouve(“nav-dropdown-button_nymag-homepage “), r = domfind (“en-têteen-tête de page “) || o, c = domfind (‘[data-editable = “main”]’), a = domle plus proche (e, “en-tête de page “), d = a? aquerySelectorAll (“image de confettisbleu “):” “, g = a? aquerySelectorAll (“image de confettisvert “):” “, u = a? aquerySelectorAll (“image de confettisorange “):” “, f = a? aquerySelectorAll (“image de confettisorange2 “):” “, m = a? aquerySelectorAll (“image de confettisrose “):” “, p = a? aquerySelectorAll (“image de confettisviolet “):” “, h = a? aquerySelectorAll (“image de confettisjaune “):” “, y = equerySelectorAll (“dropdown-nav-search-form “); fonction b (e) {soit t = ecurrentTarget, i = tquerySelector (“nav-search-input “), n = i? ivaleursplit (“”): []; epreventDefault (), reportSearch (n, () => tsoumettre ())} iaddEventListener (“click”, () => {initializeHeight (e), v ()}); for (soit e = 0, t = ylongueur; e (fonction (e) {eclassListremove (“c-right”, “c-rightdown”, “c-left”, “c-leftdown”)}) (e))}, 500)} ()) 🙁 isetAttribute (“aria-extended”, “true”), t = fenêtrescrollY), eclassListbascule (“fermé”), eclassListbascule (“ouvrir”), nclassListtoggle (“disabled”), a&&eisSameNode (s)? function () {if (ocontient (e)) {const e = getMainChildren (o, s); S (e), w (o)} if (ccontient (e)) {const e = getMainChildren (c, s); oclassListtoggle (“composant caché”), w (c), S (e)} eclassListtoggle (“open-mobile”)} (): a&&! y&&r&& (w (r), function () {const i = eclassListcontient (“ouvrir”)? 0: t; fenêtrescrollTo ({top: i})} ())} fonction w (e) {S (getNextSiblings (e))} fonction S (e) {eforEach (e => {eclassListtoggle (“hidden-component”)})} naddEventListener (“clic”, t => {! econtient (tcible) &&eclassListcontient (“open”) &&v ()}), documentaddEventListener (“keydown”, t => {27 === tkeyCode&&eclassListcontient (“ouvrir”) &&v ()})});
}, {“3”: 3, “4”: 4, “52”: 52}];
la fenêtremodules [“suivreclient “] = [function (require, module, exports) {” use strict “; const _find = require (42), $ popup = require (53); DScontrôleur (“suivre”, [fonction () {fonction e (e) {ceciel = e, cecipoignée = egetAttribute (“data-handle”)} retourne eprototype = {événements: {clic: “openFollow”}, openFollow: function (e) {var t, n, a = $ popupposition, o = $ popupparams, l = {}, r = {w: 780, h: 500}, s = nouveau a (rw, rh), c = cecielclassList; lhandle = cecipoignée, rgauche = sgauche, rhaut = stop, n = _find ([{className: “facebook”, url: “https: // facebookcom / {handle} “, réseau:” Facebook “}, {className:” pinterest “, url:” http: // wwwpinterestcom / {handle} “, réseau:” Pinterest “}, {className:” instagram “, url:” https: // wwwinstagramcom / {handle} “, réseau:” Instagram “}, {className:” rss “, url:” http: // feedsbrûleur d’alimentationcom / {handle} “, réseau:” RSS “}, {className:” twitter “, url:” https: // twittercom / intent / follow? screen_name = {handle} &tw_p = followbutton&variant = 20 “, réseau:” Twitter “}, {className:” snapchat “, url:” https: // wwwSnapchatcom / discover / {handle} “, réseau:” Snapchat “}], function (e) {return ccontient (eclassName)}), lurl = nURLreplace (“{handle}”, lpoignée), lréseau = nréseau, lname = “Suivre” lpoignée “on” lréseau, t = nouveau o (l, r), fenêtreouvert (tadresse, tnom, tcaractéristiques), epreventDefault ()}}, e}]);
}, {“42”: 42, “53”: 53}];
la fenêtremodules [“lien-commentairesclient “] = [function (require, module, exports) {” use strict “; const dom = require (3), _ get = require (23), _ isFinite = require (110), ajax = require (109); DScontroller (“comments-link”, [function () {var t, e = “http: //” documentdocumentElementgetAttribute (“data-uri”) “html “; function n (n) {var o; (thisel = n, cecoral_talk_root = ngetAttribute (“data-coral-talk”), cecicommentsCount = domtrouver (n, “comments-link-count “), cecicommentsText = domtrouver (n, “comments-link-text “), ceciisNavVariation = nclassListcontient (“comments-link_article-nav”), cecutoffCnt = ngetAttribute (“data-cutoffCnt”) || 1e3, t = `$ {cecicoral_talk_root} / api / v1 / graph / ql`, cecishouldRenderCommentStream ()) && (o = thisonCommentCountFetchedlier (ceci), ajaxsendReceiveJson ({méthode: “GET”, url: t ‘? query = {asset (url: “‘ e ‘”) {totalCommentCount}}’, dataType: “json”}, function (t, e) {var n = _get (e, “donnéesactiftotalCommentCount “, 0); return t? o (t): _ isFinite (n)? void o (null, n): o (” Unexpected Coral-Talk response “)}))} return nprototypeonCommentCountFetched = function (t, e) {if (t) return consolewarn (t); e> 0&& (ceisNavVariation&&e1? “s”: “”), ceelclassListremove (“no-comments”))}, nprototypeshouldRenderCommentStream = function () {return-1! == eindexOf (“@ published”)}, n}]);
}, {“3”: 3, “23”: 23, “109”: 109, “110”: 110}];
la fenêtremodules [“head-gtmclient “] = [function (require, module, exports) {” use strict “; const {getCLS: getCLS, getFID: getFID, getLCP: getLCP} = require (142), isProduction = require (10) (); function reportWebVitals (e) {isProduction || consolelog (“reportWebVitals:% O”, e); const t = “string” == typeof enom? eNomtoUpperCase (): enom; fenêtredataLayer = fenêtredataLayer || [], fenêtredataLayerpush ({event: “analyticsEvent”, event_action: t, event_category: “Web Vitals”, event_label: eid, valeur_événement: edelta, eventAction: t, eventCategory: “Web Vitals”, eventLabel: eid, eventNonInt:! 0, eventValue: edelta, nonInteraction:! 0, transport: “balise”})} getCLS (e => {edelta = Mathrond (1e3 * edelta), reportWebVitals (e)}), getFID (e => {edelta = Mathrond (edelta), reportWebVitals (e)}), getLCP (e => {edelta = Mathrond (edelta), reportWebVitals (e)});
}, {“10”: 10, “142”: 142}];
la fenêtremodules [“annonces-concertsclient “] = [function (require, module, exports) {” use strict “; const customMappings = {” crime-assault “:” Power “,” Care Money Product “:” Power “,” féminisme-politique-identité ” : “Power”, “culture-media”: “Culture”, célébrité: “Culture”, vivant: “Style”, mode: “Style”, shopping: “Style”, mariages: “Style”, beauté: “Style” , animaux: “Soi”, “apprentissage de la créativité”: “Soi”, “relations-amis famille”: “Soi”, “santé mentale personnalité comportement social”: “Soi”, “apprentissage de la créativité”: “Soi”, “santé -wellness “:” Self “, parentalité:” Self “,” relations-sexe dating mariage “:” Self “}, striptags = require (54); function installConcertAds () {const e = new URLSearchParams (windowemplacementchercher)get (“concert_config_url”), t = e || fenêtreconcertConfigUrl; fenêtre_nymPermutive || consolewarn (“ConcertAds initialisant sans Permutive”), fenêtreconcertAds = createConcertAds (), fenêtreconcertsloadRemoteConfig (t)alors (function () {fenêtreconcertsinstall ()})} function createConcertAds () {const e = getAuthStatus (); let t = getData (“title”), n = windowemplacementhref, i = getData (“section”), o = “”, a = getData (“type”), r = getData (“vertical”); t&& (t = striptags (htmlDecode (t))fractionné (“”)), n = ntranche (nlastIndexOf (“/”) 1); const l = {kw: getKeywords (), network: r, page_type: a, entry_group: i, keywords: t, pn: n}; return “Homepage” === a? o = “homepage”: “Section Page” === a&& (o = (o = windowemplacementchemin)remplacer (/ // g, “”)), i&&-1 === iindexOf (“”) && (o = i), customMappings [i] && (o = customMappings [i]), fenêtreemplacementnom d’hôterencontre(/aws / i) CSSEETCHAR& (lclay_sandbox_env = r), nouvelle fenêtreConcertAds ({cmd: [], emplacements: [], dfpVariables: l, slugPath: “/” oreplace (/ – | – / g, “-“), connecté: “non authentifié”! == e, paywallActive: getPaywallStatus (e)})} function getKeywords () {try {const e = window_nymPermutifarticlemots-clés; renvoyer e&&elongueur> 0&&esome (Boolean)? e: (documentquerySelector (‘meta [name = “keywords”]’) || documentquerySelector (‘meta [property = “article: tag”]’))getAttribute (“contenu”)diviser(“,”)map (fonction (e) {retour etrim ()})} catch (e) {return}} function getData (e) {if (window_nymPermutive) {if (e dans la fenêtre_nymPermutive) fenêtre de retour_nymPermutive [e]; if (fenêtre_nymPermutifarticle&&e dans la fenêtre_nymPermutifarticle) fenêtre de retour_nymPermutifarticle [e]; if (fenêtre_nymPermutifuser&&e dans la fenêtre_nymPermutifutilisateur) fenêtre de retour_nymPermutifuser [e]}} function htmlDecode (e) {var t = documentcreateElement (“div”); retourne tinnerHTML = e, 0 === tchildNodeslongueur? “”: tchildNodes [0]nodeValue} fonction getAuthStatus () {const e = JSONparse (localStoragegetItem (“auth0: profile”)), t = e? e [“http: // nymagcom / app_metadata “]: null; retourne t? thas_subscription? “intitulé”: “unentitled”: “unauthenticated”} function getPaywallStatus (e) {const t = getData (“totalCount”) || 0; return Boolean (t> = 3&& “intitulé”! == e)} windowConcertAds? InstallConcertAds (): fenêtreaddEventListener (“concertAdsReady”, installConcertAds);
}, {“54”: 54}];
la fenêtremodules [“dernières-nouvellesclient “] = [function (require, module, exports) {” use strict “; const dom = require (3), lazyLoad = require (96); function lazyLoadImage (a) {const o = domfind (a, “img [data-src]”), d = domfindAll (a, “source [data-srcset]”), e = domle plus proche (a, “result “); if (o&&e) {new lazyLoadLazyLoader (e, o, d)init ()}} function handleLazyLoad (a) {(domfindAll (a, “résultat “) || [])module forEach (lazyLoadImage)}exportations = (a => {handleLazyLoad (a)});
}, {“3”: 3, “96”: 96}];
la fenêtremodules [“coral-talkclient “] = [function (require, module, exports) {” use strict “; const dom = require (3), store = require (116), visibilité = require (4), auth0 = require (12), TALK_AUTH = “talk: auth_token”; let coralEmbed, hasEmbedScriptLoaded =! 1, hasCoralTalkRendered =! 1; function renderComments (e) {if (hasEmbedScriptLoaded&&! hasCoralTalkRendered) {const t = {talk: `$ {eCORAL_TALK_HOST} `, auth_token: getAuthToken (), asset_url: eTALK_ASSET_URL}; hasCoralTalkRendered =! 0, coralEmbed = fenêtrecorailParlezrendre (ecommentStreamContainer, t)}} function getAuthToken (e) {var t = e&&e [“http: // nymagcom / coral_talk “] || auth0getTalkJwt (), i = magasinget (TALK_AUTH); retourne t? i&&t == i? i: (storeset (TALK_AUTH, t), t) 🙁 i&&storeremove (TALK_AUTH), null)} function coralLogin () {coralEmbedlogin (getAuthToken ())} function embedScript (e, t) {let i = documentcreateElement (“script”); itype = “text / javascript”, iasynchrone =! 0, jesrc = e, jeaddEventListener (“load”, () => {hasEmbedScriptLoaded =! 0, renderComments (t)}), documentgetElementsByTagName (“tête”) [0]appendChild (i)} fonction initVerificationMessage () {auth0isAuthenticated () &&auth0rafraichir (); soit e = documentquerySelector (“coral-talk-container “); auth0isAuthenticated () &&! auth0isEmailVerified () && (einsertAdjacentHTML (“beforebegin”, ‘ n n Veuillez vérifier votre compte pour activer les commentaires Vous n’avez pas reçu d’e-mail de vérification? Renvoyer l’e-mail maintenant n ‘), documentquerySelector (“lien d’activation “)addEventListener (“click”, sendVerificationEmail))} function sendVerificationEmail () {let e = documentquerySelector (“coral-talk-verify-address “); return fetch (` https: // $ {fenêtreemplacementhost} / _ user / verification-email? user_id = $ {auth0getUserID ()} `, {méthode:” GET “, headers: {” Content-Type “:” application / json “}})alors (e => e)alors (t => {t&&200 == tstatut? einnerHTML = “L’e-mail de vérification a été envoyé avec succès”: einnerHTML = `$ {tstatusText} `})catch (e => consolelog (e))} function tryScriptEmbedding (e, t) {initVerificationMessage (), hasEmbedScriptLoaded? renderComments (t): embedScript (tEMBED_URL, t)} function addVisibilityListener (e, t) {nouvelle visibilitéVisible (e, {preloadThreshold: 750})on (“preload”, () => tryScriptEmbedding (e, t))} function removeSignInButton (e) {e&&eparentNode&&domremoveElement (e)} fonction init (e) {const t = egetAttribute (“data-coral-talk-host”), i = `$ {t} / static / embedjs`, n = `http: // $ {documentdocumentElementgetAttribute (“data-uri”)}html`, a = “vrai” === egetAttribute (“maintenance des données”), o = -1! == nindexOf (“@ published”), r = equerySelector (“corail-talk-container “), s = equerySelector (“coral-talk-btn-signin “), c = {CORAL_TALK_HOST: t, EMBED_URL: i, commentStreamContainer: r, signInButton: s, TALK_ASSET_URL: n} ;! a&&o&CSSE (on (“init”, () => {addVisibilityListener (e, c), saddEventListener (“clic”, () => auth0showLogin ()), auth0isAuthenticated () &&removeSignInButton (s)}), auth0on (“login”, t => {removeSignInButton (s), getAuthToken (t), visibilitéisElementInViewport (e) &&attemptScriptEmbedding (c), hasCoralTalkRendered&&coralLogin ()})), auth0on (“logout”, () => {magasinsupprimer le module (TALK_AUTH)}))}exportations = init;
}, {“3”: 3, “4”: 4, “12”: 12, “116”: 116}];
la fenêtremodules [“chorégrapheclient “] = [function (require, module, exports) {” use strict “; const cookie = require (40), _ get = require (23), _ omit = require (80), {insertSpeedBumpComponents: insertSpeedBumpComponents} = require (77 ), {insertNewsletterSpeedBumpComponents: insertNewsletterSpeedBumpComponents} = require (78), {generateGrowl: generateGrowl} = require (76), gtm = require (2), {getLocalStorage: getLocalStorage, setLocalStorage: setLocalStorage} = require (14), {reportPaywall } = require (52), moment = require (24), {getClientHistory: getClientHistory, updateClientHistoryWithPageData: updateClientHistoryWithPageData} = require (79), auth0 = require (12), {Scenario: Scenario} = require (73), cidReadyEvent = ” nymcid-set “, cidKey =” nymcid “, isProduction = require (10) (), logger = require (74)Logger (() => getLocalStorage (“show_choreographer_logs”)), {Verdon: Verdon} = require (75), TEST_COHORT_FLAG = “OptimizeCohort”; function displayDebug (e = “”) {if (“droit”! == ediviser(“#”)pop ()) return; const t = _get (fenêtre, “dataLayer [0]userDetails “, {}), o = _get (fenêtre,” dataLayer [0]pageDétailsfeatureTypes “,” “), n = oinclut (“magazine”)? “magazine”: “”, r = ocomprend (“fonctionnalité”)? “en vedette”: “”, i = “Valeur de l’article:” (n || r || “article”), a = _get (JSONparse (localStoragegetItem (“auth0: profile”)), “http: // nymagcom / app_metadata “), l =” Statut d’authentification: “(a?” authentifié “:” non authentifié “), s =” Statut du droit: “(!! a&&ahas_subscription? “intitulé”: “unentitled”), c = Objectclés (_omit (t, “newYorkMediaUserID”))map (e => `$ {e}: $ {t [e]}`), d = documentcorps, g = documentcreateElement (“div”), u = documentcreateElement (“ul”); [i, l, s,c]carte (e => {const t = documentcreateElement (“li”); retourne tclassListadd (“debug-item”), tappendChild (documentcreateTextNode (e)), t})forEach (e => {uappendChild (e)}), uclassListadd (“puces de données”), gclassListadd (“debug-chorégraphe”), gclassListadd (“affichage-debug-data”), gappendChild (u), dappendChild (g)} fonction initializeChoreographer (e) {const t = egetAttribute (“data-site-slug”), o = pageShouldCountAsView (t), n = auth0isSubscriber (); retourne t? getClientId (cidKey, 8e3)alors (e => (enregistreurh1 (“Chorégraphe initialisé”), enregistreurlog (`clientId: $ {e}`), enregistreurlog (`la page compte comme une vue: $ {o}`), fenêtrenymViewsResponse || (o? updateClientHistoryWithPageData (e, t): getClientHistory (e))))then (r => {if (loggergroupe (), enregistreurh2 (“Historique du client”), enregistreurtable (r), enregistreurgroupEnd (), isNCR ()) return; const {scénarios: i, touts: a, testCohort: l = “”} = readJSONFromScript (equerySelector (“script”)); if (! (l === (documentcorpsjeu de données [TEST_COHORT_FLAG] || “”))) return; const s = imap (e => Scénario (Objetassign ({}, e, {historique: r, siteSlug: t, isSubscriber: n})))filtre (e => (enregistreurgroupe (), enregistreurh2 (“Évaluation des scénarios”), enregistreurlog (e), enregistreurgroupEnd (), eshouldShow))réduire ((e, {action: t, min: o, nombre: n}) => {const r = afind (({value: e}) => e === t); renvoie r? (e [rtype] = r, e [rtaper]viewCount = n-o, e): e}, {}); enregistreurgroupe (), enregistreurh2 (“Active Touts”), enregistreurjournal (s), enregistreurgroupEnd (), executeTouts (e, o, s, r)})catch (consoleerreur): consoleerreur (“siteSlug introuvable”)} function documentIncludesComponent (e) {document de retourquerySelector (`[data-uri * =” / $ {e} / “]`)} function pageShouldCountAsView (e) {const t = “strategist” === e, o = [“product”, “product-grid” ]find (e => documentIncludesComponent (e)); return t ||! o} function executeTouts (e, t, o = {}, n) {const {global: r} = n, i = {featureArticleCount: rFeature || 0, magazineArticleCount: rMagazine || 0, standardArticleCount: rArticle || 0, totalArticleCount: rtotal || 0}, a = fenêtreconcertAds, l = fenêtreConcertAds; if (o [“speed-bump”] && (_get (a, “adsBlocked”,! 0)? InsertSpeedBumpComponents (findTemplate (e, “speed-bump”), o [“speed-bump”], i) :unecycle de vielistenAndPlayback (lévénementsslotsInserted, () => {insertSpeedBumpComponents (findTemplate (e, “speed-bump”), o [“speed-bump”], i)})), o [“newsletter-speed-bump”] && (_get (a , “adsBlocked”,! 0)? insertNewsletterSpeedBumpComponents (findTemplate (e, “newsletter-speed-bump”), o [“newsletter-speed-bump”], i): acycle de vielistenAndPlayback (lévénementsslotsInserted, () => {insertNewsletterSpeedBumpComponents (findTemplate (e, “newsletter-speed-bump”), o [“newsletter-speed-bump”], i)})), o [“branded-growl”] &&brandedTakeoverTime (o [“branded-growl”]) &&t) enregistreur de retourlog (“should show branded growl”), void growlManager (findTemplate (e, “branded-growl”), {baseTrackingData: i, body: o [“branded-growl”]brandedGrowlBody, contentClass: “branded-content”, cta: o [“branded-growl”]brandedGrowlCTA, imageUrl: o [“branded-growl”]imageUrl, lien: o [“branded-growl”]brandedGrowlLink, nom: o [“branded-growl”]nom, scrollDepth: o [“branded-growl”]brandedGrowlScrollDepth, titre: o [“branded-growl”]brandedGrowlTitle, toutType: “branded growl”}, “# branded-growl”); if (t&&o [“content-cliff”]) contentCliff (findTemplate (e, “content-cliff”), o [“content-cliff”] , o [“content-cliff”]viewsLeft, n); else {if (t&&o [“cliff-takeover”]) return / nouvelles de coronavirus | pivot | paywall exclure / itest (fenêtre_nymGtmPagebalises)? void (isProduction&&loggerlog (“Clause de contenu interdite en raison d’une correspondance de balise exclue:”, fenêtre_nymGtmPagetags)): void cliffTakeover (findTemplate (e, “paywall-reader-interface”), i, o [“cliff-takeover”]); if (o [“growl-newletter”] ||! o [“promo- growl “]) if (o [” baby-growl “]) babyGrowl (findTemplate (e,” paywall-reader-interface “), i, o [” baby-growl “]); else {if (! o [” warning-growl-2 “]) return o [” warning-growl “] &&shouldWarn ()? (setContentCliffWarningDisplayed (), loggerlog (“devrait afficher un avertissement”), void growlManager (findTemplate (e, “warning-growl”), {contentClass: “warning-content”, title: o [“warning-growl”]warningGrowlTitle, nom: o [“warning-growl”]nom, scrollDepth: o [“warning-growl”]warningGrowlScrollDepth, cta: o [“warning-growl”]warningGrowlCTA, corps: o [“warning-growl”]warningGrowlBody, lien: o [“warning-growl”]warningGrowlLink, baseTrackingData: i, toutType: “warning growl”}, “# warning-growl”)): void 0; warningGrowl (findTemplate (e, “paywall-reader-interface”), i, o [“warning-growl- 2 “])} else growlManager (findTemplate (e,” growl-message “), {contentClass:” promo-content “, title: void 0, name: o [” promo-growl “]nom, scrollDepth: o [“promo-growl”]promoGrowlScrollDepth, cta: o [“promo-growl”]promoGrowlCTA, corps: o [“promo-growl”]promoGrowlMessage, lien: o [“promo-growl”]promoGrowlLink, baseTrackingData: i, toutType: “promo growl”}, “# growl-message”)}} function shouldWarn () {return! contentCliffWarningDisplayed ()} function getContentCliffWarningDisplayedKey () {const e = new Date, t = egetMonth (); return`content-cliff-warning-displayed – $ {egetFullYear ()} – $ {t} `} function contentCliffWarningDisplayed () {const e = getContentCliffWarningDisplayedKey (); return” true “=== getLocalStorage (e)} function setContentCliffWarningDisplayed () {const e = getContentCliffKey (); return” true “=== getLocalStorage (e)} function setContentCliffWarningDisplayed () {const e = getContentCliffKey () e, “true”)} function growlManager (e, {contentClass: t, scrollDepth: o, name: n, title: r, body: i, cta: a, link: l, baseTrackingData: s, toutType: c, imageUrl : d = null}, g = “”) {const u = function () {const e = ` n n n n $ {r} n $ {d? ”:” “} n $ {i} n $ {d? “: “”} n $ {a} n n n n `; retourner le documentcreateRange ()createContextualFragment (e)} (), p = {creative: i, id: c, name: n, position: “growl”}; uquerySelector (“a”)addEventListener (“click”, () => promotionReport (“Click”, s, p)), generateGrowl (e, g, {content: u, scrollDepth: o, onShow: () => promotionReport (“View”, s , p)})} function contentCliff (e, t, o, n) {const {first_visit: r, global: i} = n, a = {totalArticleCount: itotal || 0, standardArticleCount: iArticle || 0, featureArticleCount: iFeature || 0, magazineArticleCount: iMagazine || 0}, {contentCliffBody: l} = t, s = documentimportNode (e,! 0)querySelector (“content-cliff “), c = documentquerySelector (“contenu de l’article> clay-paragraph “), d = {creative: l, id:” content cliff “, name:” Content Cliff “, position:” in-article “}; s&& (cinsertAdjacentHTML (“afterend”, sexternalHTML), require (“content-cliffclient “) (documentquerySelector (“content-cliff “), {contentCliffOptions: t, viewsLeft: o, firstVisit: Number (r), onShow: () => promotionReport (” View “, a, d), onClickCliff: () => promotionReport (” Click ” , a, d)}))} function verdonFosseToutSetter (e, t, o, n, r) {const i = new Verdon ({container: “paywall-reader-interface “, url:” https: // fossenymagcom / fosse / v153 / indexhtml “}), a = etype, l = {email: auth0getEmail (), isAuthenticated: auth0isAuthenticated (), isSubscriber: auth0isSubscriber ()}; nclassListajouter (a), jeune fois (“frame: ready”, () => {isendMessage (“tout: show”, {readerState: l, toutType: a, toutData: e}), r&&isendMessage (“frame: height”)}), ion (“tout: visible”, () => {promotionReport (“View”, t, o)}), ion (“tout: sign-in”, () => {auth0showLogin (fenêtreemplacementhref)}), jeon (“tout: déconnexion”, () => {auth0déconnexion ()}), ion (“tout: ignorer”, () => {nclassListajouter (“ignorer”), jesendMessage (“tout: hide”, {toutType: a, toutData: e})}), ion (“tout: subscribe”, () => {ectaLink = replaceQueryParams (ectaLink), promotionReport (“Click”, t, o), fenêtreouvert (ectaLink, “_ ​​vide”)}), ion (“frame: height”, e => {nstylehauteur = `$ {echarge utilecurrentHeight 10} px`}), ion (“tout: view-account”, () => {fenêtreemplacementhref = “https: // sous-marinsnymagcom / account “})} function promotionReport (e, t, o) {const {creative: n, id: r, name: i, position: a} = o; tevent = `cepromotion $ {e} `, tecommerce = {promoView: {promotions: [{creative: ntrim (), id: r, nom: i, position: a}]}}, gtmreportNow (t), reportPaywall ({creative: ntrim (), eventType: e, id: r, nom: i, position: a})} function babyGrowl (e, t, o) {const n = documentimportNode (e,! 0)querySelector (“paywall-reader-interface “), r = {creative: obabygrowlDescription, id: “baby growl”, nom: “baby growl”, position: “growl”}; documentcorpsappendChild (n), octaLink = obabygrowlCtaLink, octaText = obabygrowlMessage, otitre = obabygrowlDescription, verdonFosseToutSetter (o, t, r, n)} fonction cliffTakeover (e, t, o) {const {cliffTakeoverCTA: n, cliffTakeoverCtaLink: r, cliffTakeoverDescription: i, cliffTakeoverImage: a, cliffTakeoverPromo: l, cliffTakeoverStatus: s : c} = o, d = documentimportNode (e,! 0)querySelector (“paywall-reader-interface “), g = documentquerySelectorAll (“clay-paragraph “), u = {creative: l, id:” content cliff “, name:” Content Cliff “, position:” growl “}, p = {cta: n, ctaLink: r, description: i, image : a, promo: l, statut: s, type: c}; documentcorpsappendEnfant (d), gforEach ((e, t) => {0! == t&&eremove ()}), verdonFosseToutSetter (p, t, u, d,! 0), documentquerySelector (“html”)styleoverflowY = “caché”, documentcorpsstyleposition = “fixed”} function warningGrowl (e, t, o) {const {type: n, warningGrowl2CTA: r, warningGrowl2CtaLink: i, warningGrowl2Description: a, warningGrowl2Image: l, warningGrowl2Promo: s, warningGrowl2Status: c} = o, d = documentimportNode (e,! 0)querySelector (“paywall-reader-interface “), g = {creative: s, id:” warning growl “, name:” Warning Growl “, position:” growl “}, u = {cta: r, ctaLink: i, description: a , image: l, promo: s, statut: c, type: n}; documentcorpsappendChild (d), verdonFosseToutSetter (u, t, g, d,! 0)} function getClientId (e = “”, t = 8e3) {let o = cookieget (e); return o? Promiserésoudre (o): new Promise ((o, n) => {const r = setTimeout (() => {n (`could not find key: $ {e} on cookie after $ {t} ms`)}, t); fenêtreaddEventListener (cidReadyEvent, () => {clearTimeout (r), o (cookieget (e))})})} function readJSONFromScript (e) {try {return JSONparsiinnerHTML)} catch (e) {return {touts: [], scénarios: []}}} function findTemplate (e, t = “”) {const o = e&&equerySelector (`[data-template-id =” $ {t} “]`); return o&&ocontent} function isNCR () {return / [? &] source = ncr /test (emplacementsearch)} function brandedTakeoverTime (e) {const {startTime: t, endTime: o, startDate: n, endDate: r} = e, i = nconcat (“”, t), a = rconcat (“”, o), l = moment (i), s = moment (a); moment de retour ()isBetween (l, s)} function OptimizeDebugger () {return new Promise (e => {const t = windowemplacementsearch || “”; if (t) {const o = new URLSearchParams (t), n = oget (“nom-attribut-d’optimisation”) || “”, r = oget (“optimiser-valeur-attribut”) || “”, i = oget (“optimiser-délai”) || 0, a = oget (“optimiser-cookie”) ||! 1; setTimeout (() => {a&& (documentcookie = randomNymcid ()), documentcorpssetAttribute (`data – $ {n}`, r), e ()}, i)} else e ()})} function randomNymcid () {return`nymcid = $ {(() => ([1e7] – 1e3 -4e3 -8e3 -1e11)remplacer (/ [018] / g, e => (e ^ 16 * cryptogetRandomValues ​​(nouveau Uint8Array (1)) [0] >> e / 4)toString (16) [0])) ()} `} function replaceQueryParams (e) {const t = windowemplacementsearch || “”; if (t) {const o = new URLSearchParams (t); if (einclut (“?”)) {const t = esplit (“?”), n = new URLSearchParams (t [1]); for (soit oentrées ()) nset (e [0], e [1]); e = `$ {t [0]}? $ {ntoString ()} `} else e =` $ {e}? $ {otoString ()} `} return e} moduleexportations = (e => nouvelle promesse (e => {auth0on (“init”, () => {e ()})})alors (() => OptimizeDebugger ())then (() => {displayDebug (fenêtreemplacementhref), initializeChoreographer (e)}));
}, {“2”: 2, “10”: 10, “12”: 12, “14”: 14, “23”: 23, “24”: 24, “40”: 40, “52”: 52 , “73”: 73, “74”: 74, “75”: 75, “76”: 76, “77”: 77, “78”: 78, “79”: 79, “80”: 80, ” content-cliffclient “:” content-cliffclient”}];
la fenêtremodules [“grognementclient “] = [function (require, module, exports) {” use strict “; require (140); const _some = require (59), dom = require (3), localStorageKeyRoot =” slideout – “, {getLocalStorage: getLocalStorage , setLocalStorage: setLocalStorage} = require (14); moduleexportations = ((e, t) => {const {contenu: o, onShow: s, scrollDepth: r = 50, ignorable: i =! 1} = t, n = Number (r || egetAttribute (“data-display-at-page-scroll-pourcentage”)), a = domtrouver (e, “modal “), l =” slideout- “(tid || egetAttribute (“id”)), c = getLocalStorage (l); fonction d () {aclassListadd (“hidden”)} fonction g () {setLocalStorage (l,! 0), d ()} i&&c? eremove () 🙁 o&&equerySelector (“[data-content]”)appendChild (o), n&&function (e = 50) {const t = new IntersectionObserver (e => {_ some (e, “isIntersecting”) && (astyletop = “hériter”, aclassListremove (“hidden”, “initial”), “function” == typeof s&&s (), tdésobserver (a))}); astyletop = `$ {documentquerySelector (“corps”)scrollHeight / (100 / e)} px`, tobserver (a)} (n), equerySelector (“ignore-modal “)addEventListener (“clic”, () => i? g (): d ()), eaddEventListener (“grogner: cacher”, d), eaddEventListener (“grogner: rejeter”, g))});
}, {“3”: 3, “14”: 14, “59”: 59, “140”: 140}];
la fenêtremodules [“ralentisseurclient “] = [fonction (require, module, exports) {” use strict “; const gtm = require (2), visibilité = require (4); moduleexports = ((e, i) => {if (! i ||! e) return; const {nom: o, speedbumpDescription: r, speedbumpMessage: t, speedbumpLink: n, baseTrackingData: s} = i, c = new visibilitéVisible (e, {shownThreshold:5}); equerySelector (“la description”)innerHTML = r, equerySelector (“lien-promo “)innerHTML = t, equerySelector (“lien-promo “)href = n, eclassListremove (“réduit”), con (“montré”, function () {if (visibilitéisElementNotHidden (e)) {soit e = s; eevent = “cepromotionView “, eecommerce = {promoView: {promotions: [{name: o, creative: r, id: “speed bump”, position: “in-article”}]}}, gtmreportNow (e), cdétruire ()}}), equerySelector (“lien-promo “)addEventListener (“clic”, function () {let e = s; eevent = “cepromotionCliquez sur “, eecommerce = {promoClick: {promotions: [{name: o, creative: r, id: “speed bump”, position: “in-article”}]}}, gtmreportNow (e)})});
}, {“2”: 2, “4”: 4}];
la fenêtremodules [“newsletter-speed-bumpclient “] = [function (require, module, exports) {” use strict “; const {loadRecaptcha: loadRecaptcha} = require (108), _ isEmpty = require (87), _ set = require (107), _ kebabCase = require (81 ), gtm = require (2), auth0 = require (12), visibilité = require (4), COMPONENT_NAME = “newsletter-speed-bump”, EMAIL_VALID_REGEX = / ^ (?: (?: [^ () [ ] \,;: s @ “] (?: [^ () [] \,;: s @ “]) *) | (” “)) @ (?: (?: [[0-9] {1,3} [0-9] {1,3} [0-9] {1,3} [0-9] {1,3}]) | (?: (?: [A-zA-Z -0-9] ) [a-zA-Z] {2,})) $ /, LOCAL_STORAGE_KEY_NAME = “newsletterSpeedBumpSignUpStatus _”, MAX_EMAIL_LENGTH = 50; function setClass (e, t) {eclassListadd (t)} function getRequestUrl (e) {return egetAttribute (“action”)} fonction getPageType (e) {const t = e? egetAttribute (“content”): “”; return _kebabCase (t)} function getPayloadObject (e, t, r, s) {const n = {}; return _set (n, `varssource _ $ {t} `,` $ {COMPONENT_NAME} _ $ {s} `), nemail = r, nlistes = {}, nlistes [t] =! 0, nrecaptcha = e, nsignuppage = `$ {documentemplacementhref} _ $ {t} `, n [` source _ $ {t} `] =” newsleter_speedbump “, n} moduleexports = ((e, t) => {if (! t ||! e) return; if (“success” === windowstockage localgetItem (`$ {LOCAL_STORAGE_KEY_NAME} $ {tnewsletterSpeedBumpNewsletterId} `)) return void eremove (); const {baseTrackingData: r, nom: s, newsletterSpeedBumpCtaCopy: n, newsletterSpeedBumpDescription: i, newsletterSpeedBumpHeadline: a, newsletterSpeedBumpNewsletterId: o, newsletterSpeedBumpThankYouMessage: c, RECAPTCHA_PUBLIC_KEY = l0}getEmail (), d = equerySelector (“description “), p = equerySelector (“saisiremail “), m = equerySelector (“message d’erreur “), h = equerySelector (“forme “), E = equerySelector (“form-container “), y = equerySelector (“form-recaptcha-container “), g = equerySelector (“titre “), v = equerySelector (“conteneur “), S = equerySelector (“saisirnewsletterId “), _ = equerySelector (“recaptcha-wrapper “), L = equerySelector (“saisirsoumettre “), w = equerySelector (“text-container “), q = nouvelle visibilitéVisible (e, {shownThreshold:5}); u&& (premoveAttribute (“obligatoire”), eclassListadd (“connecté”)), dinnerHTML = i, ginnerHTML = a, Svaleur = o, Lvaleur = n, qon (“montré”, function () {if (visibilitéisElementNotHidden (e)) {const e = r; eevent = “cepromotionView “, eecommerce = {promoView: {promotions: [{creative: `$ {a} | $ {i} `, id:” accélération de la newsletter “, nom: s, position:” in-article “}]}}, gtmreportNow (e), qdétruire ()}}), paddEventListener (“focus”, () => {_classListremove (“hidden”)}), haddEventListener (“soumettre”, t => {tpreventDefault (); const s = new XMLHttpRequest, n = u || equerySelector (“saisire-mail”)valeur, i = getPageType (documentquerySelector (‘meta [nom = “type”]’)); u ||! (nlongueur> = 50) &&EMAIL_VALID_REGEXtest (n)? loadRecaptcha (l, “newsletterSubmit”,! 0)alors (a => {sopen (“POST”, getRequestUrl (h),! 0), ssetRequestHeader (“Content-Type”, “application / json; charset = UTF-8”), saddEventListener (“load”, s => {const a = scurrentTarget || scible; si (aétat> = 200&&astatussetClass (e, “succès”)), [d, E, m, _]forEach (e => setClass (e, “hidden”)), ginnerHTML = creplace (“{{email}}”, n), minnerHTML = “”; const s = JSONanalyser (unréponse), l = _isEmpty (ssailthruIds)? “”: Objetvaleurs (ssailthruIds) [0], u = r; uevent = “ceacheter “, uecommerce = {achat: {actionField: {id: l, revenu: “000 “}, produits: [{category:” inscription à la newsletter “, nom: Svaleur, quantité: 1, variante: `$ {COMPONENT_NAME} – $ {i}`}]}}, gtmreportNow (u), setTimeout (() => {eclassListadd (“hidden”)}, 5e3), tpreventDefault ()} sinon minnerHTML = “* Une erreur s’est produite Veuillez réessayer”}), saddEventListener (“erreur”, () => {mclassListsupprimer (“caché”), minnerHTML = “* Une erreur s’est produite Veuillez réessayer”}), senvoyer (JSONstringify (getPayloadObject (a, o, n, i))), tpreventDefault ()}): minnerHTML = “* Veuillez saisir une adresse e-mail valide”})});
}, {“2”: 2, “4”: 4, “12”: 12, “81”: 81, “87”: 87, “107”: 107, “108”: 108}];
la fenêtremodules [“content-cliffclient “] = [function (require, module, exports) {” use strict “; const auth0 = require (12), isProduction = require (10) (), logger = require (74)Enregistreur (() =>! IsProduction); moduleexportations = ((t, e) => {si (! e) retourne; enregistreurgroupe (), enregistreurh2 (“Content Cliff”); const {contentCliffOptions: o, firstVisit: n, onShow: r, onClickCliff: i} = e, c = 300, l = Number (documentquerySelector (“[data-components-count]”)getAttribute (“data-components-count”)), u = 3, s = [“taboola”], a = “# content-cliff”, f = t, d = function () {let t = 0; return documentquerySelectorAll (“[data-word-count]”)forEach (fonction (e) {t = nombre (egetAttribute (“data-word-count”) || 0,10) || 0}), t} (), g = function (t, e) {function o (t) {return Mathrond (tgetTime () / 1e3 / 60)} const n = o (t), r = o (e); return nr} (new Date, new Date (n)) {}, show: () => {r () , function () {(p = function (t = “”) {retourner le documentquerySelectorAll (`$ {t} ~ *`)} (a))forEach (t => tremove ()), function () {const {contentCliffStatus: e, contentCliffPromo: n, contentCliffCTA: r, contentCliffURL: c} = o, l = tquerySelector (“[data-content-cliff-status]”), u = tquerySelector (“[data-content-cliff-promo]”), s = tquerySelector (“[data-content-cliff-cta]”); s&&ssetAttribute (“href”, c), s&&sinsertAdjacentHTML (“afterbegin”, r), l&&linsertAdjacentHTML (“afterbegin”, e), u&&uinsertAdjacentHTML (“afterbegin”, n), s&&saddEventListener (“clic”, i)} (), fclassListremove (“réduit”), e = s, eforEach (t => {const e = documentquerySelector (`[data-uri * =” / $ {t} / “]`); e&&esupprimer ()}), maddEventListener (“clic”, () => auth0showLogin ()); var e} ()}} [function () {if (dl) return loggerlog (`le nombre de mots de l’article $ {d} était trop court pour la falaise`), enregistreurlog (`le nombre de composants d’article est inférieur à $ {u} et n’est pas éligible pour la falaise`),” noop “; if (g&&isProduction) return” noop “; g&&loggerlog (`La première vérification de session était $ {g}! Montrant quand même la falaise: isProduction => $ {isProduction}`); if (/ coronavirus news | pivot | paywall exclude / itest (fenêtre_nymGtmPagetags)) return isProduction&&loggerlog (“Clause de contenu interdite en raison d’une correspondance de balise exclue:”, fenêtre_nymGtmPagetags), “noop”; retourne “show”} ()], m = tquerySelector (“content-cliff-login “); let p = []; renvoyer le journallog (`ne devrait pas démarrer en production en raison de la fenêtre de première session de 30 minutes: $ {g}`), enregistreurgroupEnd (), auth0on (“login”, () => {fclassListadd (“réduit”), (p = tableauprototypetrancheappel (p, 0)inverser())forEach (t => finsertAdjacentElement (“afterend”, t)), p = []}), “function” == typeof h? h (): void 0});
}, {“10”: 10, “12”: 12, “74”: 74}];
la fenêtremodules [“annonceclient “] = [function (require, module, exports) {” use strict “; const _forEach = require (41), _ max = require (43), _ find = require (42), _ includes = require (44), $ visibilité = require (4), dom = require (3), MAX_MOBILE_RE = / [[0-9] {1,3} – (768 | 600) /, MAX_TABLET_RE = / [0-9] {3} – (1024 | 1180) /, DESKTOP_RE = / (1024 | 1180) -plus /, AD_NAME_SELECTOR = ‘[data-name ^ = “/ 4088 /”], [data-name ^ = “/ 172968584 /”]’; var flaggedComponentsOnPage = function () {var e, t = documentquerySelector (“article-content “), n = []; renvoie t&&_forEach ([‘article-sidebar [data-width = “large”] ‘], fonction (a) {e = tquerySelectorAll (a), _ forEach (e, fonction (e) {npush (e)})}), n} (); function getElementsVerticalOverlap (e, t) {var n = egetBoundingClientRect (), a = tgetBoundingClientRect (); return! (nhaut> abas || nrightadroite)? abas-nhaut: 0} function getElementsOverlapAmount (e, t) {var n, a = []; return _forEach (t, function (t) {n = getElementsVerticalOverlap (e, t), apush (n)}), _ max (a)} function getNYMagAdChannel (e) {var t = “”; switch (e) {case “informations sur l’entreprise”: t = “société”; break; case “new york guide les choses & to do “: t =” to-do “; break; case” other “: t = e; break; case” guides sponsorisés “: t =” s-guides “; break; case” urbanist “: t =” urbanist “; break; default: t =” “} return t} function appendSectionToDfpAds () {var e, t, n, a = documentquerySelector (“meta [property = ‘og: site_name’]”), o = documentquerySelector (“article [data-content-channel]”), i = documentquerySelectorAll (AD_NAME_SELECTOR); a&& (e = acontenu), o&& (t = ogetAttribute (“canal de contenu de données”)toLowerCase ()), t&& “New York Magazine” === e&& (n = getNYMagAdChannel (t)), n&&appendToAdd (i, n)} fonction appendPageTypeToDfp (document)querySelector (“corps> div “) || {}, t = documentquerySelector (“body”) || {}, n = e&&eclassList, a = n&&nlongueur?[n]: [], o = _find (a, e => einclut (“fonctionnalité”)), i = documentquerySelectorAll (AD_NAME_SELECTOR); n&& (o? appendPageNumberPositionToDfpAds (i, “Feature”): ncontient (“lede-gallery-content”)? appendPageNumberPositionToDfpAds (i, “Image_Gallery”): tclassListcontains (“one-column-layout”)? appendPageNumberPositionToDfpAds (i, “One_Column_Article”): ncontains (“article-content”) &&appendPageNumberPositionToDfpAds (i, “Standard_Article”))} function appendPageNumberPositionToDfpAds (e, t) {const n = [“528×379”, “1100×200”, “1×1”]; let a e = e || ], o = domtrouve(“ad-splash “), i = domtrouver (section “wrapper “), r = domtrouve(“secondaire “), d = domtrouve(“bas “), s = domtrouve(“primary “), c = {IA: {xsMobile: {normal: 1, grid: 1}, mobile: {normal: 1, grid: 1}, tablet: {normal: 1, grid: 1}, desktop: {normal : 1, grille: 1}}, BA: {xsMobile: {normal: 1, grille: 1}, mobile: {normal: 1, grille: 1}, tablette: {normal: 1, grille: 1}, bureau: {normal: 1, grille: 1}}}; aforEach (e => {soit a, l = “”, u = ebase de donnéestailles, m = eclassListvaleur, p = _find (n, e => ucomprend (e)), g = eparentElementclassListcontient (“image-gallery-mobile-grid-ad”); if (u&&! p || esetAttribute (“nom-données”, egetAttribute (“data-name”) “/” t), i&&u&&! p) {let n, u; if (o&&ocontient (e)? l = “LB”: i&&icontient (e)? l = “IA” 🙁 r&&rcontient (e) || d&&dcontient (e) || s&&scontient (e)) && (l = “BA”), c [l]) {if (! (u = checkForAdViewport (m))) return; g? (n = c [l] [u]grille, c [l] [u]grille) 🙁 n = c [l] [u]normal, c [l] [u]normal), a = n {esetAttribute (“nom-données”, egetAttribute (“data-name”) “/” t)})} function injectGoogleScripts () {var e = documentcreateElement (“script”), t = documentcreateElement (“script”), n = documentcreateDocumentFragment (); esrc = “// wwwgoogletagservicescom / tag / js / gptjs “, easync = “async”, tsrc = “// pagead2googlesyndicationcom / pagead / js / adsbygooglejs “, tasync = “async”, nappendChild (e), nappendChild (t), documentgetElementsByTagName (“corps”) [0]appendChild (n)} appendSectionToDfpAds (), appendPageTypeToDfpAds (), injectGoogleScripts (), DScontroller (“ad”, [“adService”, function (e) {return function (t) {var n, a, o, i = tgetAttribute (“data-offload”), r = new $ visibilitéVisible (t, {preloadThreshold: i? WindowinnerHeight / 4: 200}), d =! 1; fonction s () {fenêtreinnerWidth> = 1180&&tparentElementclassListcontient (“ad-repeat”) &&flaggedComponentsOnPagelength&& (a = getElementsOverlapAmount (t, flaggedComponentsOnPage), o = parseInt (tparentElementgetAttribute (“data-gap”), 10), tstylemarginTop = o 30 a “px”)} fonction c () {s (), erefresh (n)} fonction l () {esupprimer (n), d || (d =! 0, rsur (“montré”, c))} documentquerySelector (‘script [data-name = “concert-ads”]’) || (n = ecréer (t), rvisibilité && $isElementNotHidden (t)? (eaddToPageLoadQueue (n), i&&ron (“hidden”, l)) 🙁 ron (“précharge”, fonction () {! nslot&& $ visibilitéisElementNotHidden (t) && (s (), eload (n))}), i&&ron (“hidden”, l)), ceadData = n)}}]);
}, {“3”: 3, “4”: 4, “41”: 41, “42”: 42, “43”: 43, “44”: 44}];
la fenêtremodules [“sticky-listclient “] = [function (require, module, exports) {” use strict “; const dom = require (3), $ gtm = require (2), _ get = require (23), stickyContainer = require (” sticky-containerclient “); DScontroller (“sticky-list”, [“$ window”, function (t) {var e = require (218), i = 40; function s (s) {let n, r = function (t) {let s = t [0], n = 0, r = ehauteur (cecontentArea), h = thiszone de contenuoffsetHeight; if (thisconteneursconteneurslongueur) {si (scibleoffsetHeight) {let t = thiséruptionsfindIndex (t => (function (t, e) {return t! == documentcorpsCSSEETCHARCSSEETCHARtcontient (e)}) (t, scibleparentElement)); if (t> -1&&ceciévasions [t]) {let e = thisévasions [t]offsetHeight i; ceconteneurs [t]stylemarginBottom = `$ {e} px`}} if (h! == thiscurrentHeigh) {const t = erect (cerightRail, cecicontentArea); cecurrentHeight = h, cecirightRailstylehauteur = r-ttop-a (cerightRail) “px”, ceciéruptionsforEach ((s, r) => {soit a = erect (s, cecontentArea), h = eintersection (a, t); si (h) {soit e, s = htop-ttop-n; n = s hhauteur i, ceciconteneurs [r]styleheight = `$ {s} px`, ceciconteneurs [r]styleminHeight = `$ {s} px`, e = ceciévasions [r]offsetHeight je, ceconteneurs [r]stylemarginBottom = `$ {e} px`}})}}}lier (ceci); tinnerWidth {let n = _get (e, “ensemble de donnéesnom “,” “), r = ntranche (-1) || “1”, a = [“Image_Gallery”, “Standard_Article”, “Feature”, “One_Column_Article”]trouver (t => ncomprend (t)) || “”; cerightRailparentElementclassListcontient (“tertiaire”) &&a&& (ebase de donnéesname = parseInt (i, 10) se === t) || 0; retourne itranche (s 1)réduire ((t, e) => t (eoffsetHeight || 0), 0) || 0} retourne sprototype = {setPins: function () {const t = erect (cerightRail, cecicontentArea), i = ehauteur (cecontentArea), s = i-ttop-a (cerightRail); soit n, h, o, l; if (thispopulatePinsList (), s1&&tclassListadd (“multi-enfants”), l = 0; l {const t = Arrayde (eenfants); laissez o, a, i = 0; for (; i {handleLazyLoad (a)});
}, {“3”: 3, “96”: 96}];
la fenêtremodules [“articleclient “] = [function (require, module, exports) {” use strict “; const $ visibilité = require (4), $ gtm = require (2), ImageZoom = require (56), $ sentry = require (57) ; DScontrôleur (“article”, [fonction () {var e = 40; fonction t (t) {const i = documentquerySelector (“emballage> tertiaire “), n = tquerySelector (“lede-image-wrapperà fond perdu “), r = tquerySelector (“attributionà fond perdu “), o = tquerySelector (“article-en-tête “), l = o? oquerySelector (“img”): null, c = function () {let t = ogetBoundingClientRect ()hauteur; n&& (t = ngetBoundingClientRect ()hauteur 25, r&& (t = rgetBoundingClientRect ()hauteur)), istylepaddingTop = t e “px”}; i&&o&& (fenêtreinnerWidtht (e)), $ sentinelleinitializeIDListeners ()}}]);
}, {“2”: 2, “4”: 4, “56”: 56, “57”: 57}];
la fenêtremodules [“balisesclient “] = [function (require, module, exports) {” use strict “; const _forEach = require (41); DScontroller (“tags”, [function () {function e (e) {thisel = e} retourne eprototype = {événements: {“aplus cliquez sur “:” showAll “}, showAll: function (e) {var t = ecible, o = cecielquerySelectorAll (“licaché “); _ forEach (o, function (e) {eclassListremove (“hidden”)}), tparentNoderemoveChild (t), epreventDefault ()}}, e}]);
}, {“41”: 41}];
la fenêtremodules [“youtubeclient “] = [function (require, module, exports) {” use strict “; const youtubeVideoPlayer = require (297), $ visibilité = require (4), {reportVideo: reportVideo} = require (52), $ gtm = require (2), thirdParty = require (95); function updateElementAttributes (e, t) {esetAttribute (“data-video-id”, tvideoId)} function getAnalyticsCustomDimensions (e) {return {event: “youtubeVideo”, youtubeVideoId: egetAttribute (“data-video-id”), youtubeVideoLocation: egetAttribute (“data-track-video-location”), youtubeVideoType: egetAttribute (“data-track-video-type”), youtubeVideoTitle: egetAttribute (“data-track-video-title”), youtubeChannelName: egetAttribute (“data-track-channel-name”), youtubeVideoDuration: emodule getAttribute (“data-track-video-duration”)}}exportations = (e => {var t, i = “vrai” === egetAttribute (“data-autoplay-video”), o = {videoContainerId: egetAttribute (“id-élément-de-données”)trim (), videoId: egetAttribute (“data-video-id”)trim (), playerParams: {loop: 1, autoplay: i? 1: 0, controls: 1, enablejsapi: 1, modestbranding: 1, rel: 0, showinfo: 0, wmode: “transparent”}, customParams: {autoPlayNextVideo : egetAttribute (“data-autoplay-next-video”)trim (), trackVideoType: egetAttribute (“data-track-video-type”)trim (), customPlayer: egetAttribute (“lecture personnalisée des données”)trim (), templateid: egetAttribute (“id-élément-de-données”)trim (), muet: i}}, a = getAnalyticsCustomDimensions (e); thirdPartyincludeScript (“https: // wwwYoutubecom / iframe_api “),” Sponsorisé “=== ocustomParamstrackVideoType&& (oplayerParamslist = “”), (t = new $ visibilitéVisible (e, {preloadThreshold: 800}))visibilité && $isElementNotHidden (e) ?! 0 === fenêtrenymYTApiReady? youtubeVideoPlayerinit (o): documentaddEventListener (“nym-youtube-event: youtube-api-ready”, function () {youtubeVideoPlayerinit (o)}): ton (“preload”, function () {youtubeVideoPlayerinit (o)}), documentaddEventListener (“prêt pour le joueur-” ovideoContainerId, function () {reportVideo ({videoId: ayoutubeVideoId || null, channelName: ayoutubeChannelName || null, emplacement: ayoutubeVideoLocation || null, titre: ayoutubeVideoTitle || null, durée: ayoutubeVideoDuration}), $ gtmreportNow (Objetattribuer ({youtubeAction: “player ready”}, a))}), documentaddEventListener (“player-start-” ovideoContainerId, fonction (t) {egetAttribute (“data-video-id”)! == tjoueurvideoId&& (updateElementAttributes (e, tplayer), a = getAnalyticsCustomDimensions (e), reportVideo ({videoId: ayoutubeVideoId || null, channelName: ayoutubeChannelName || null, emplacement: ayoutubeVideoLocation || null, titre: ayoutubeVideoTitle || null, durée: ayoutubeVideoDuration}), $ gtmreportNow (Objetattribuer ({événement: “youtubeVideoReset”, youtubeVideoId: tjoueurvideoId, youtubeChannelName: “New York Magazine”})))})});
}, {“2”: 2, “4”: 4, “52”: 52, “95”: 95, “297”: 297}];
la fenêtremodules [“memo-pixelclient “] = [function (require, module, exports) {” use strict “; (() => {var e = documentcreateElement (“script”); easynchrone =! 0, etype = “texte / javascript”, esrc = documentemplacementprotocole “// d16xpr36wrmcmkcloudfrontnet / js / mémojs “, (documentgetElementsByTagName (“head”) [0] || documentgetElementsByTagName (“corps”) [0])appendChild (e)}) (), moduleexportations = (() => {});
}, {}];
la fenêtremodules [“liens-affiliésclient “] = [function (require, module, exports) {” use strict “; const dom = require (3), _ includes = require (44), _ startsWith = require (48), globalClick = require (46), visit = require (47), productSubtags = require (49); var exclusHostnames, skimlinksBaseUrl, skimlinksId, visitState, productUrl, ignoreDataAttribute = “data-affiliate-links-ignore”, article = fenêtredocumentquerySelector (“article”), isSponsored = article&& “Sponsor Story” === articlegetAttribute (“type de données”); function setExcludedHostnames (t) {hiddenHostnames = (tgetAttribute (“noms-d’hôtes-exclus-données”) || “”)toLowerCase ()split (“,”)} function isSkimLink (t) {return !! (skimlinksId = tgetAttribute (“data-skimlinks”))} function isExcluded (t) {return _includes (hiddenHostnames, t) || _startsWith (t, “www”) &&_includes (noms d’hôte exclus, tslice (4)) || isSponsored} function isUrlProtocol (t) {return 0! == tindexOf (“mailto:”) &&0! == tindexOf (“javascript:”)} function getTargetHostname (t) {return (tnom d’hôte || thôte || thref || “”)toLowerCase ()} function convertSkimlinkUrl (t) {return (skimlinksBaseUrl = skimlinksBaseUrl || skimlinksId? “// allerredirigercom /? xs = 1&id = “skimlinksId” &sref = “encodeURIComponent (fenêtreemplacementhref) “&url =”: void 0) &&skimlinksBaseUrl encodeURIComponent (t)} function hasIgnoreAttribute (t) {return “true” === tgetAttribute (ignoreDataAttribute)} fonction convertSkimlink (t) {var e, i, r, s = domle plus proche (tcible, “a”), n = s&&shref; n&&nlongueur&&! tdefaultPrevented&& (i = getTargetHostname (s) ,! isUrlProtocol (n) || isExcluded (i) || hasIgnoreAttribute (s) || productSubtagsgetAffiliate (n) || (e = convertSkimlinkUrl (n)) && (productUrl = n, r = s&&sgetAttribute (“data-track-id”), shref = productSubtagsensureSubtag ({url: e, productId: r, visitState: visitState, anchorEl: s})))} function revertSkimLink (t) {var e = domle plus proche (tcible, “a”), i = e&&ehref || “”; iinclut (skimlinksBaseUrl) &&i&&ilongueur&&productUrl&& (emodule href = productUrl)}exportations = (t => {const e = isSkimLink (t); visiteonceReady (function (t) {visitState = t}), e&& (setExcludedHostnames (t), globalClickaddHandler (convertSkimlink, revertSkimLink))});
}, {“3”: 3, “44”: 44, “46”: 46, “47”: 47, “48”: 48, “49”: 49}];
la fenêtremodules [“gtmclient “] = [function (require, module, exports) {” use strict “; const $ gtm = require (2); DScontroller (“gtm”, [function () {return function (t) {$ gtminit (tgetAttribute (“data-container-id”), tgetAttribute (“data-site-slug”))}}]);
}, {“2”: 2}];
la fenêtremodules [“global-navclient “] = [function (require, module, exports) {” use strict “; const dom = require (3), auth0 = require (12), signInButton = domtrouve(“user-signin “), signOutButton = domtrouve(“user-signout “), globalNav = domfind (‘[class ^ = “global-nav”]’), corps = domfind (“body”), dropdownItems = domTrouver tout(“dropdown-wrap “), gtm = require (2), pageUri = require (136)getPageUri (); function closeDropdowns (e) {let n = globalNavquerySelectorAll (“menu déroulantopen “); dropdownItemsforEach (fonction (t) {soit o = tquerySelector (“liste déroulante “) ;! n || tcontient (ecible) &&27! == ekeyCode || oclassListremove (“open”)})} function gtmSendReport (e, n, t) {let o = {eventCategory: “ecommerce”, eventAction: “componentClick”, marque: e, dimension23: “global-nav”, list: pageUri , pageZone: “header”, variant: “nav-link”}; “global-nav-link” === t&& (oeventLabel = nhref), gtmreportNow (o)} fonction init (e) {auth0on (“init”, () => {signInButtonaddEventListener (“clic”, fonction (e) {epreventDefault (), auth0showLogin ()}), signOutButtonaddEventListener (“clic”, fonction (e) {epreventDefault (), auth0logout (), gtmSendReport (“Déconnexion”, ecible, “lien-info-utilisateur”)}), auth0isAuthenticated () &&eclassListadd (“connecté”), auth0isSubscriber () &&eclassListadd (“abonné”), equerySelectorAll (“lien utilisateur “)forEach (e => {eclassListadd (“active”)})}), auth0on (“login”, () => {eclassListadd (“connecté”), auth0isSubscriber () &&eclassListadd (“abonné”)}), auth0on (“déconnexion”, () => {eclassListremove (“connecté”), eclassListremove (“abonné”)})} dropdownItemsforEach (fonction (e) {eaddEventListener (“clic”, fonction () {equerySelector (“menu déroulant”)classListtoggle (“open”)})}), corpsaddEventListener (“clic”, closeDropdowns), documentaddEventListener (“keydown”, closeDropdowns), globalNavaddEventListener (“clic”, fonction (e) {soit n = ecible; nclassListcontient (“global-nav-track”) &&gtmSendReport (ntext, n, “global-nav-link”)}), moduleexportations = init;
}, {“2”: 2, “3”: 3, “12”: 12, “136”: 136}];
la fenêtremodules [“montage de module aaalegacy “] = [function (require, module, exports) {” use strict “; const eventify = require (164), _ pickBy = require (139), _ each = require (299), fingerprintjs2 = require (301), DS = require (300); function registerGlobals () {windowDS = DS, fenêtreEventify = eventify, fenêtreFingerprint2 = fingerprintjs2, DSvaleur (“Eventify”, eventify), DSvalue (“Fingerprint2”, fingerprintjs2), DSvaleur (“$ document”, fenêtredocument), DSvalue (“$ window”, window)} function mountDollarSliceComponents () {DSservice (“composants”, [“$ document”, “$ module”, fonction (e, n) {var r = _pickBy (ndéfinitions, e => eproviderStrategy === nfournisseurscontrôleur), o = Objetkeys (r); function t (e) {return r => {try {nget (e, r)} catch (e) {logMountError (r, e)}}} _ each (o, n => {var r = equerySelectorAll (‘[data-uri * = “/ _ composants /’ n ‘/”]’), o = equerySelectorAll (‘[data-uri $ = “/ _ composants /’ n ‘”]’); _ each (r, t (n)), _ each (o, t (n))}), cecomposants = o}]), DSget (“components”)} function logMountError (e, n) {const r = eexterneHTMLtranche (0, eexterneHTMLindexOf (einnerHTML)); consoleerror (“Erreur lors de la connexion du contrôleur à” r, n)} registerGlobals (), documentaddEventListener (“DOMContentLoaded”, () => {mountDollarSliceComponents ()});
}, {“139”: 139, “164”: 164, “299”: 299, “300”: 300, “301”: 301}];
la fenêtremodules [“annonceslegacy “] = [function (require, module, exports) {” use strict “; const _map = require (50), _ forEach = require (41), _ isString = require (184), _ intersectionWith = require (302), _ isEqual = require (190), _ each = require (299), _ debounce = require (100), _ sortBy = require (123), page = require (136), visit = require (47); DSservice (“adService”, [“Eventify”, “$ cid”, “$ document”, “$ window”, function (e, t, a, i) {var o, n, s, r, d, c, l, u, g, p, m = {}, h = this, f = [], b = visitegetQueryParamsObject ([“utm_campaign”]), w = documentquerySelector (‘script [data-type = “ad-a9”]’); documentquerySelector (‘script [data-name = “concert-ads”]’) || (iNYM = {}, jeNYManalytics = {}, iNYManalytiqueadStartTime = iperformanceMaintenant jegoogletag = igoogletag || {}, jegoogletagcmd = igoogletagcmd || [], c = igoogletag, w&& (igoogletagcmd = igoogletagcmd || [], igoogletagcmdpush (fonction () {igoogletagpubades ()disableInitialLoad ()}), l = isetInterval (function () {void 0! == fenêtreapstag&&void 0! == fenêtreapstagtimeout && (iclearInterval (l), fenêtreapstagcleared =! 0, l = null)}, 10), setTimeout (function () {l&& (iclearInterval (l), jegoogletagpubades ()rafraîchir (), fenêtreapstag || consolelog (“MESSAGE: dépassement du délai d’attente pour le chargement A9, abandon”))}, 500)), u = documentcreateElement (“script”), g = documentcreateDocumentFragment (), p = documentgetElementsByTagName (“head”) [0], usrc = “https: // zdouvescom / voxprebidheader841653991752 / moatheaderjs “, gappendChild (u), pinsertBefore (g, pfirstChild), o = fonction (e) {var t, a, o = edata, n = []; retourne ochargé? e: (ochargé =! 0, t = nul, (t = otailles? cdefineSlot (onom otailles, oidentifiant)addService (cpubades ()): cdefineOutOfPageSlot (onom oidentifiant)addService (cpubades ()))setTargeting (“adid”, oid), bhasOwnProperty (“utm_campaign”) &&tsetTargeting (“utmcamp”, butm_campaign), a = hgetAdCount (oétiquette), tsetTargeting (“label”, oétiquette “_” osite “-” a), caffichage (oid), cpubades ()addEventListener (“slotOnload”, function () {iNYManalytiquefirstAdLoadTime || (iNYManalytiquefirstAdLoadTime = iperformanceMaintenant jeNYManalytiquefirstAdLoadLabel = eLes donnéeslabel)}), (n = v (o))? fenêtreapstag&&windowapstagcleared&CSSEETCHARfenêtreapstagfetchBids ({slots: [n], timeout: windowapstagtimeout}, function () {ccmdpush (function () {fenêtreapstagsetDisplayBids (), cpubades ()refresh ([t], {changeCorrelator:! 1})})}): cpubades ()rafraîchir ([t], {changeCorrelator:! 1}), eslot = t, e)}, n = fonction (e) {var a, i, o, n = t (), s = egetAttribute (“nom-données”), r = egetAttribute (“data-tailles”), d = egetAttribute (“étiquette de données”), c = egetAttribute (“site de données”); n = eid, r&&rlongueur? (r = rsplit (“,”), a = [], _ map (r, function (e) {e = esplit (“x”), i = parseInt (e [0]), o = parseInt (e [1]), apush ([i, o])})) 🙁 eclassListajouter (“oop”), a =! 1), cecidata = {id: n, nom: s, tailles: a, chargé:! 1, étiquette: d, site: c}, m [n] = this}, r = function (e) {ccmdpush (fonction () {var t = o (e); m [eLes donnéesid] = t})}, s = fonction (e) {var t = []; eslot? (t = v (e)) &&windowapstag&&windowapstagcleared&CSSEETCHARfenêtreapstagfetchBids ({slots: [t], timeout: windowapstagtimeout}, function () {ccmdpush (function () {fenêtreapstagsetDisplayBids (), cpubades ()rafraîchir ([eslot], {changeCorrelator:! 1})})}): e&&r (e)}, ccmdpush (fonction () {var e, t, o, n = pagegetMeta (“article: tag”), s = pagegetMeta (“auteur”), r = iemplacementhref, d = (e = adirigerquerySelector (“head-gtm “), t = acorpsquerySelector (“gtm “), e&&” top “=== egetAttribute (“data-gtm”)? “gtmtop”: t&& “bottom” === tgetAttribute (“data-gtm”)? “gtmbottom”: “”); o = [], _ forEach ([n, s, d], function (e) {_ forEach (esplit (“,”), fonction (e) {(e = egarniture()toLowerCase ()remplacer (/ s / g, “-“)remplacer (/ ‘| ’/ g,” “))longueur&&opush (e)})}), cpubades ()setTargeting (“kw”, o), cpubades ()setTargeting (“groupe_entrée”, o), r = rtranche (rlastIndexOf (“/”) 1), cpubades ()setTargeting (“pn”, r), cCompagnonAds ()setRefreshUnfilledSlots (! 0), cpubades ()enableAsyncRendering (), cenableServices ()}), ceload = r, cecicreate = function (e) {return new n (e)}, cecirafraichir = fonction (e) {var t; _isString (e)? (t = thisgetById (e), s (t)): s (e)}, cecisupprimer = fonction (e) {var t = eLes donnéesid; ungetElementById (t)innerHTML = “”}, cecigetAdCount = function (e) {var t, a = 0, i = Objecttouches (m); retourne _chaque (i, fonction (i) {(t = m [i])Les donnéeschargé&&tLes donnéeslabel === e&&a}), a}, cecigetById = function (e) {return m [e]}, d = _debounce (function () {var e = {TopLeaderboard: 1, RightColTopMPU: 2, outOfPage: 99, “homepageTakeover / TopLeaderboard”: 1}, t = _sortBy (f, fonction (t) {retourne e [tLes donnéeslabel] || 10}); _ forEach (t, function (e) {return eLes donnéestailles? r (e): isetTimeout (function () {r (e)}, 2e3)}), f = []}, 10), ceaddToPageLoadQueue = fonction (e) {fpush (e), d ()}); fonction v (e) {var t, a = etailles; renvoie a = _intersectionWith (a, [[970,250], [970,90], [728,90], [300,600], [300,250], [320,100], [320,50]], _ isEqual), etaillesles tailleslength&& (t = {slotID: eid, tailles: a, slotName: elabel}), t}}]);
}, {“41”: 41, “47”: 47, “50”: 50, “100”: 100, “123”: 123, “136”: 136, “184”: 184, “190”: 190 , “299”: 299, “302”: 302}];
la fenêtremodules [“cidlegacy “] = [function (require, module, exports) {” use strict “; DSservice (“$ cid”, function () {var r = Mathétage (100 * Mathrandom ()); return function () {return “cid-” r}});
}, {}];
la fenêtremodules [“facebooklegacy “] = [function (require, module, exports) {” use strict “; DSservice (“facebook”, [function () {thisfb = fonction (i) {fenêtreFB&CSSEETCHARfenêtreFBI]appliquer (ceci, Arrayprototypetranchecall (arguments, 1))}}]);
}, {}];
require = (function e (t, n, r) {function s (o, u) {if (! n [o]) {if (! t [o]) {var a = typeof require == “function” &&require ; if (! u&&a) return a (o,! 0); if (i) return i (o,! 0); var f = new Error (“Cannot find module ‘” o “‘”); throw fcode = “MODULE_NOT_FOUND”, f} var l = n [o] = {exportations: {}}; t [o] [0]appeler (lexportations, fonction (e) {var n = t [o] [1] [e]; retourne s (n? n: e)}, l, lexportations, e, t, n, r)} retourne n [o]exports} var i = typeof require == “function” &&require; for (var o = 0; o typeof key === ‘string’ && keyrencontre(/héritage $ /))forEach (clé => fenêtrerequire (clé));
}

function tryToMount (fn, el, nom) {
essayer {
fn (el); // initier le contrôleur
} catch (e) {
const elementTag = elexterneHTMLtranche (0, elexterneHTMLindexOf (elinnerHTML));
consoleerror (`Erreur lors de l’initialisation du contrôleur pour” $ {name} “sur” $ {elementTag} “`, e);
}
}
/ **
* monter le clientcontrôleurs de composants js
* /

function mountComponentModules () {
Objetclés (fenêtremodules)filter (key => typeof key === ‘string’ && clérencontre(/client $ /))forEach (clé => {
laissez controllerFn = fenêtrerequire (clé);

if (typeof controllerFn === ‘fonction’) {
nom de const = cléremplacer(‘client’, ”),
instancesSelector = `[data-uri * =” _ composants / $ {nom} / “]`,
defaultSelector = `[data-uri $ =” _ composants $ {name} “]`,
instances = documentquerySelectorAll (instancesSelector),
defaults = documentquerySelectorAll (defaultSelector);

for (let el des instances) {
tryToMount (controllerFn, el, nom);
}

for (laissez el des valeurs par défaut) {
tryToMount (controllerFn, el, nom);
}
}
});
} // Assurez-vous qu’une fenêtre `traiterenvNODE_ENV` est disponible dans le client pour toutes les dépendances,
// services ou composants qui pourraient en avoir besoin
// note: la valeur “ est échangée contre la variable d’environnement réelle dans / lib / cmd / compile / scriptsjs

la fenêtreprocess = fenêtreprocessus || {};
la fenêtretraiterenv = fenêtretraiterenv || {};

si (! fenêtretraiterenvNODE_ENV) {
la fenêtretraiterenvNODE_ENV = ”;
} // remarque: les contrôleurs hérités qui nécessitent des services hérités (eg dollar-tranche) doit
// attend que DOMContentLoaded s’initialise, car les fichiers eux-mêmes doivent d’abord être montés

mountLegacyServices ();
mountComponentModules ();
//]]

Mario Series, Nintendo Switch, Super Nintendo Entertainment System

Actualités – FR – Les 20 meilleurs jeux sur Nintendo Switch Online

Source: https://www.vulture.com/article/nintendo-switch-online-best-games-nes-snes.html

En s’appuyant sur ses expertises dans les domaines du digital, des technologies et des process , CSS Engineering vous accompagne dans vos chantiers de transformation les plus ambitieux et vous aide à faire émerger de nouvelles idées, de nouvelles offres, de nouveaux modes de collaboration, de nouvelles manières de produire et de vendre.

CSS Engineering s’implique dans les projets de chaque client comme si c’était les siens. Nous croyons qu’une société de conseil devrait être plus que d’un conseiller. Nous nous mettons à la place de nos clients, pour aligner nos incitations à leurs objectifs, et collaborer pour débloquer le plein potentiel de leur entreprise. Cela établit des relations profondes et agréables.

Nos services:

  1. Création des sites web professionnels
  2. Hébergement web haute performance et illimité
  3. Vente et installation des caméras de vidéo surveillance
  4. Vente et installation des système de sécurité et d’alarme
  5. E-Marketing

Toutes nos réalisations ici https://www.css-engineering.com/en/works/