If fans were already less pleased with the order of elimination for RuPaul’s Drag Race Down Under in last week’s episode, they ended up being pushed to the breaking point. [Trixie Mattel voice:] Ho-NEY! The real backlash to Art Simone’s re-entry into the competition has been fierce, unlike almost anything I’ve seen on social media regarding the show in recent years (aside, perhaps, from the bottom line of support for Bimini after it lost Drag Race UK crown for Lawrence Chaney.) In a really ironic twist to the usual kind of fan backlash that Drag Race generates (aka racist bile, which is hurled at any POC queen who lip-syncs over a white queen wins), Art said that she did so was inundated with abuse over her return. I’ve mostly seen a meme being shared. I can’t quite recall the picture – it was basically like “When the first all-white Top 7 becomes the first all-white Top Eight,” which is pretty funny – but given the toxicity of Parasocial des Drag Race-fandom relationships to the participants, it is not difficult to imagine that the vitriol is directed against art. Sometimes I wish I had a direct line to people who are compelled to bully real people online just so I could tell them to take a deep breath and reconsider the need to call a complete stranger a disgusting, dirty minor . (Moll is a Down Under substitute for sluts, whores, etc.) Even if it’s in the interests of the “common good” or whatever – you think more POC queens deserve to be in the top seven – it is still a pretty cheap mode of “advocacy”. There are thousands more tangible and useful things you can do to support POC communities than telling a random drag queen to kill yourself!

Other than that, what do I know? I’m just a slut with a dream and a laptop. I know you didn’t come here to be briefed on online bullying by a guy who quarreled in a bar less than 24 hours ago after queuing, and so on with the summary. After last week’s big elimination – another cause for consternation among fans, it seems – Karen, who sent Anita to pack, is a mess. This is either real sadness or false sadness and I really can’t tell. She keeps making jokes, but also yells openly. (Attributable.)

Kita is also upset about her enemy getting out, not least because she feels like the Australian queens are pretending the New Zealand queens are just filler – a perception she and Elektra little do to prevent the reading mini challenge. Unlike their snatch game, the Down Under queens live up to this beloved challenge, delivering a handful of transcendent readings, though perhaps not as many good readings as the general ferocity of these queens suggests. The clear highlight is Art Simone, in large part due to an immediately iconic read by Etcetera that depends on the fact that she is not binary and uses she / she pronouns from drag without resorting to transphobia. </ As the queens prepare for their brand challenge – they have to design their own yeast spread, a reference to the legendary Australian Vegemite, a delicious, thick, salty black paste made from a yeast concentrate byproduct – Etcetera begins with very clear, as always, that she feels like she is miles ahead of these girls. This particular kind of shit (the delusion) wears my gears down to the end. If Etcetera were as tall and iconic as she imagines, she would have won every challenge. Instead, she was mostly safe except for a week below. The cherry on this sundae comes when Etcetera says she's not a seedy queen. The bile from her! It's a bizarre, mind-boggling site after four episodes of nothing but snide readings in the confessional and workroom.

When it comes to filming their commercials, the queens are trained by Suzanne Paul, a UK-born New Zealand legend which is ubiquitous in commercials due to its ubiquity. I didn’t know about her before the show, but her Wikipedia entry is wonderful read. Some Fun Facts About Suzanne Paul: In 2006, she won the Metro magazine title “Woman of Greatest Integrity”; She became a millionaire by selling a product called Suzanne Clip. She has had three television shows called “Second Honeymoon”, “Flea Market” and “Guess Who’s Coming for Dinner”. She runs a clothing line for women under five feet. and in the 80s she briefly changed her name to Kathleen. In other words, true queen shit and basically the only person in a position to judge the quality of commercials with branded yeast.

Most queens do well enough at recording, with notable exceptions like Etcetera – whose The idea of ​​”elevation beyond fart and tit jokes” is … pee jokes? – and Scarlet, who is just warming up her Jennifer Coolidge character and trying to reach Michelle with her new “glamorous” catchphrase. (Unless I missed a memo and it actually starts.) Elektra is the real head-turner: not only does she look stunning in bell bottoms and a white blouse, but she also knows how to steer herself and the crew. Michelle questions her imitation of RuPaul – which, to be fair, is probably a pretty disastrous idea – but for the most part, it seems Elektra is the one to beat in this race. And good for you! After putting her ego aside and actually improving last week, things are finally looking good for Elektra.

As the queens prepare for the runway, Art (of the producers) has to ask if anyone ever has anything in tow did what they regret. Scarlet cagily admits that she’s blackfaceed in the past, as anyone who keeps up with the drama outside of the show knows. While I believe that people acknowledge the damage they have done, atone for it and get past it, the way Scarlet admits this is a bit insincere – noting that “many other queens” have and have done it too so on. Etcetera and Art are entitled to urge Scarlet on for this shot; Blackface is a difficult thing to fake ignorance about, especially when you consider that it has only been a matter of years. Etcetera eloquently and kindly explains the violence that lies beneath the “It’s All Gags” veneer that often excuses things like blackface in a way that feels accessible and revealing to both the viewer and Scarlet.

Usually this would be the end of such a technical moment. Up – gag! – RuPaul asks Scarlet about it on the runway. Scarlet has just been trained by Etcetera and is delivering a black face apologia for the second time, this time with less caginess and more (possibly false) deep pathos. It’s a wild little moment that is made even wilder by the fact that Ru takes the opportunity to meditate on the culture of demolition. All in all, I think this is a great way for the show to target gaffes like that. It would also have been a happy ending for the saga of Scarlet’s cancellation if she hadn’t apologized a little bit cautiously after filming. Oh!

On the runway, Maxi Shield stuns as usual, this time at a wonderful picnic at Hanging Rock. I can’t get enough of Maxi’s fashion. As Michelle reminded her two weeks ago, she’s the fun one and the beautiful and the glamorous and we can see it every week. Maxi, if you’re reading this: never change yourself! I love you! Elektra pays a sweet, if confusing, homage to New Zealand’s native wildlife, while Art pays a sweet, if confusing, homage to Kath Day-Knight. Etcetera’s runway is finally living up to the hype it has been creating all season with a one-of-a-kind reveal that feels really interesting and representative of the Australian bush.

In the commercials, the New Zealand girls are fucking fucking it. Electra’s commercial is fun and self-centered, while daycare is wild and disrespectful. Most Australian girls are doing extremely well. Art and Karen are doing pretty well, Maxi not doing as well as expected, and Etcetera and Scarlet have me file a complaint with the Cringe department. Here’s the thing about beautiful and fashionable people: because they never had to be funny to be popular with others, they never developed a real sense of humor. (I’d kill to have this problem!) Elektra wins the challenge (!!) and it’s well deserved – perhaps for the first time in the history of this show a contestant is taking criticism and actively getting better at it. Talk about a shock!

In lip syncing, my beloved Maxi Shield is paired with Etcetera Etcetera, a pairing that has felt a bit inevitable since the first episode when Maxi discovered she was literally twice as old as Etcetera . If that lip-syncing proves one thing, this age is nothing more than a number: Despite Etcetera’s incredible self-confidence (“Picnic on the hanging skirt? Rather like the hell to get off the stage” is a sentence I’ll borrow). Maxi is an absolutely magnetic performer and exudes joy from playing a classic like “Absolutely Everybody”. She even has a microphone somehow! She is Vanessa Amorosi and it is not a game for Etcetera. Overall, it’s an incredible lip-sync and also good proof that presence is sometimes far more important than a breakup, for example. And just like that, another girl is sent to pack, and our first all-white top eight are all white top seven again. What’s next? A pure white top six !?

Already a subscriber?
Sign up or link your magazine subscription

Already a subscriber?
Sign up or link your magazine subscription

Already a subscriber?
Sign up or link your magazine subscription

Already a subscriber?
Sign up or link your magazine subscription

= 0 (u = f (str, 0, v), c = f (str 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 = Array.isArray || function (r) {return “[object Array]” === Object.prototype.toString.call (r)};
}, {}];
window.modules [“1188”] = [function (required, module, export) {“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 “”}}; module.exports = 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 = Array.isArray | | function (r) {return “[object Array]” === Object.prototype.toString.call (r)}; Function assignment (r, e) {if (r.map) return r.map (e); for (var t = [], n = 0; n0&&a [a.length-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”, “∞”: “infinite”, “♥”: “amor”, “&”: “i”, “|”: “o”, “”: “mes que”, “∑”: “suma dels”, “¤”: “moneda”}, cz: {“∆”: “delta”, “∞”: “nekonecno”, ” ♥ “:” laska “,” & “:” a “,” | “:” nebo “,” “:” vice jako “,” ∑ “:” soucet “,” ¤ “:” mena “}, de: {“∆”: “delta”, “∞”: “infinite”, “♥”: “love”, “&”: “and”, “|”: “or”, “”: “greater than”, ” ∑ “:” Sum of “,” ¤ “:” Currency “}, dv: {” ∆ “:” delta “,” ∞ “:” kolunulaa “,” ♥ “:” loabi “,” & “:” aai “,” | “:” noonee “,” “:” ah vure bodu “,” ∑ “:” jumula “,” ¤ “:” faisaa “}, en: {” ∆ “:” delta “,” ∞ ” : “infinite”, “♥”: “love”, “&”: “and”, “|”: “or”, “”: “greater than”, “∑”: “sum”, “¤”: ” Currency “}, es: {” ∆ “:” Delta “,” ∞ “:” infinito “,” ♥ “:” amor “,” & “:” y “,” | “:” u “,” “: “mas que”, “∑”: “suma de los”, “¤”: “moneda”}, fr: {“∆”: “Delta”, “∞”: “Infiniment”, “♥”: “Amour”, “&”: “et”, “|”: “ou “,” “:” superieure a “,” ∑ “:” somme des “,” ¤ “:” monnaie “}, gr: {}, hu: {” ∆ “:” delta “,” ∞ “:” vegtelen “,” ♥ “:” szerelem “,” & “:” es “,” | “:” vagy “,” “:” nagyobb mint “,” ∑ “:” szu mma “,” ¤ “:” penznem “}, it: {” ∆ “:” 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 “,” ♥ “:” leads “,” & “:” 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”, ” ∞ “:” infinit “,” ♥ “:” dragoste “,” & “:” si “,” | “:” sau “,” “:” mai mare ca “,” ∑ “:” suma “,” ¤ “:” valuta “}, ru: {” ∆ “:” delta “,” ∞ “:” beskonechno “,” ♥ “:” lubov “,” & “:” i “,” | “:” ili “, “”: “bolshe”, “∑”: “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 = I.en, c = C.en,” object “== type of a) for (g in n = a.maintainCase ||! 1, O = a .custom&& “object” == type of a.custom? a.custom: O, u = a.truncate> 1&&a.truncate ||! 1, l = a.uric ||! 1, s = a.uricNoSlash || ! 1, r = a.mark ||! 1, S =! 1! == a.symbols&&! 1! == a.lang, A = a.separator || A, l&& (p = b.join (” “)), s&& (p = z.join (” “)), r&& (p = [“. “,”! “,” ~ “,” * “,” ‘”,” (“,”) “] . join (“”)), m = a.lang&&I [a.lang] && S? I [a.lang]: S? I.en: {}, c = a.lang&&C [a.lang]? C [ a.lang] :! 1 === a.lang ||! 0 == = a.lang? {}: C.en, a.titleCase&& “number” == typeof a.titleCase.length&&Array.prototype.toString. call ( a.titleCase)? (a.titleCase.forEach (function (e) {O [e “”] = e “”}), t =! 0): t = !! a.titleCase, a.custom&& “number” == typeof a.custom.length&&Array.prototype.toString.call (a. custom) &&a.custom.forEach (function (e) {O “e” “” }), Object.keys (O) .forEach (function (a) {var n; n = a.length> 1 new RegExp (“\ b” o (a) “\ b”, “gi”): new RegExp (o (a), “gi”), e = e.replace (n, O [a])}), O) p = g; for (p = o (p = A), f =! 1, y =! 1, d = 0, k = (e = e.replace (/ (^ s | ) s $) / g, “” )). Length; 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 in U? (J = g, g = “”, d === k-1&& (g = U [j]), y =! 0) :! M [g ] || l&&-1! == b.join (“”) .indexOf (g) || s&&-1! == z.join (“”). indexOf (g)? (! 0 === y? (g = U [j] g, j = “”, y =! 1): f&& (/ [A-Za-z0-9] /. Test (g) || E. substr (-1). match ( / A-Za-z0-9] /)) && (g = “” g), f =! 1) πŸ™ g = f || E.substr (-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 = g.replace (new RegExp (“[^ \ w \ s” p “_-]”, “g”), A); return t&& (E = E.replace (/ ( w) ( S *) / g, function (e, a, n) {var t = a.toUpperCase () (null! == n? N: “”); return Object. keys (O) .indexOf (t.toLowerCase ()) u&& (h = E.charAt (u) === A, E = E.slice (0, u), h || (E = E.slice (0, E.lastIndexOf (A)))), n || t || (E = E.toLowerCase ()), E}, t = function (s) {return function (a) {return n (a, e)}}, o = function (s) {return e.replace (/ [- \ ^ $ *?. () | [] {} /] / g, “\ $ &”)}, i = function (e, a) {for (var n in a) if (a [ n] === e) return! 0}; if (“undefined”! = type of module &&module.exports) module.exports = n, module.exports.createSlug = t; else if (“undefined”! = typeof define&&define.amd) define ([], function () {return n}); else try {if (e.getSlug || e.createSlug) throw “Speakingurl: Globals exists /(getSlug|createSlug)/”;e.getSlug=n,e.createSlug=t Genealogiecatch(e)} Genealogie(this );
}, {}];
window.modules [“1218”] = [function (required, module, export) {var namespace = “expire_mixin”; Function expirePlugin () {var e = this.createStore (this.storage, null, this._namespacePrefix namespace); return {set: function (t, n, a, r) ​​{this.hasNamespace (Namespace) || e.set (n, r); return t ()}, get: function (e, n) {this.hasNamespace (Namespace) || t.call (this, n); return e ()}, remove: function (t, n) {this.hasNamespace (Namespace) || e.remove (n); return t ()}, getExpiration: function (t, n) {return e.get (n)}, removeExpiredKeys: function (s) {var n = []; this.each (function (e, t) {n.push (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 (). clear ()} module.exports = {Name: “localStorage”, Read: Read, Write: Write, each: Remove: Remove, DeleteAll: DeleteAll};
}, {“1220”: 1220}];
window.modules [“1222”] = [Function (required, module, export) {module.exports = {Name: “memoryStorage”, read: read, write: write, each: remove: remove, deleteAll: deleteAll}; var memoryStorage = {}; Function read (e) {return memoryStorage [e]} Function write (e, r) {memoryStorage [e] = r} Function each (e) {for (var r in memoryStorage) memoryStorage.hasOwnProperty (r) &&e (memoryStorage [ r], r)} function remove (e) {delete memoryStorage [e]} function clearAll (e) {memoryStorage = {}}
}, {}];
window.modules [“1243”] = [function (required, module, export) {! Function (s) {var t = function (s) {return new y (e)}; t.version = “0.6.8”, “undefined”! = typeof module&&module.exports? module.exports = t: “function” == typeof define&&define.amd? define (function () {return t}): e.typogr = t; var n = function (e, t) {return new RegExp (e, t)}, s = /] *> / i, r = t.amp = function (e) {var t = / ( s |) ( & | & | & # 38;) ( s |) / g; if (e || “string” == typeof e) e.replace (/ ()? ([^)? / G, function (e, n, r, a) {return a = a || “”, ( n = n || “”). match (s)? nra: n (r = r.replace (t, ‘$ 1& $ 3’)) a})}, a = t.ord = function (e) { if (e || “string” == typeof e) {var t, n = f (e), r = [], a =! 1, p = / ( d) (st | nd | rd | th) / g; return n.forEach (function (e) {“tag” === e.type? (r.push (e.txt), t = s.exec (e.txt), a =! (! t || void 0! == t [1])): a? R.push (e.txt): r.push (e.txt.replace (p, ‘$ 1 $ 2’))}), r.join (” “)}}, p = t.initQuotes = function (s) {var t = n (” (?: (?:] *> | ^) \ s * (?:] *> \ s *) * ) (?: (“|” | “) | (‘|’ | ‘))”, “i”); if (e || “string” = = typeof e) return e.replace (t, function (e , t, n) {var s = t? “dquo”: “quo”, r = t || n; return [e.slice (0, e.lastIndexOf (r)), ”, r, “”] . join (“”)})}, c = t.widont = function (s) {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 “); return e.replace (s, ‘$ 1 $ 2’)}, i = t.caps = function (e) {var t, r = f (e), a = [], p =! 1, c = n (“((\ b [AZ \ d] * [AZ] \ d * [AZ] [) AZ \ d ‘] * \ b) | (\ b [AZ] \. \ s? (?: [AZ] \. \ s?)) (?: \ s | \ b | $)) “,” g “) ; return r.forEach (function (e) {“tag” === e.type? (a.push (e.txt), t = s.exec (e.txt), p =! (! t || void 0! == t [1])): p? a.push (e.txt): a.push (e.txt.replace (c, function (e, t, n, s) {var r, a ; return n? ‘% s’.replace (“% s”, n) πŸ™ “” === s.slice (-1)? (r = s.slice (0, -1), a = “” ) πŸ™ r = s, a = “”), ‘% s1% s2’.replace (“% s1”, r) .replace (“% s2”, a))}))}), a.join ( “”)}; t.typogrify = function (e) {var t = e; return e.jquery&&e.html&& (t = e.html ()), t = r (t), t = c (t), t = u (t), t = i (t), t = p (t), t = a (t)}; va r l, o, u = t function (e) {var t, n, r = f (e), a = [], p = [], c = “”, i = “”, l =! 1, o = “”; return r.forEach (function (s) {if (“tag” === e.type) a.push (e.txt), null! == (i = s.exec (e.txt)) && (c = i [2] .toLowerCase (), i [1]? (p.length> 0&&c === p [p.length-1] &&p.pop (), 0 === p.length&& (l =! 1 )) πŸ™ p.push (c), l =! 0)); else {if (n = (n = e.txt) .replace (/ (rock) ‘n’ (roll) / gi, “$ 1 ‘n’ $ 2 “), t = n.Slice (-1),! l) switch (n = g (n)), n = h (n), n = d (n), n = x (n )) {case “‘”: n = / S / .test (o)? “‘”: “‘”; break; case ‘”‘: n = / S / .test (o)?” “:” “; break; default: n = m (n)} o = t, a.push (n)}}), a.join (” “)}, f = t.tokenize = function (s) { for (var t, n = [], s = 0, r = / ([^] *>) / gi; null! == (t = r.exec (e));) {var a = t [1 ], p = t [2]; a&&n.push ({type: “text”, txt: a}), n.push ({type: “Tag”, txt: p}), s = r.lastIndex} return r.lastIndex) / g, “$ 1 -“)}, d = t.smartEllipses = function (s) {return e.replace (/…/ g, “…”). Replace (/ . . ./ g, “…”)}, x = t.smartBackticks = function (s) {return e.replace (/ “ / g, “” “). replace (/ ” / g, “” “)}, m = t.smartQuotes = function (s) {var t =” (? =% s \ B) “. Replace (“% s “,” [! “# \ $ \% \ ‘() *, -. \ /:;? \ @ \ [\\] \ ^ _` {|} ~] “), s = “[^ \ \ t \ r n \ [\ {\ (\ -]”, r = n (“(\ s | | – | & [mn] dash; | – | – | ȁ [34];) ‘(? = \ w) “,” g “), a = n (” (“s”)’ (?! \ s | s \ b | \ d ) “,” g “), p = n (” (“s”) ‘(?! \ s | s \ b) “,” g “), c = n (‘ (\ s | | – | & [mn] dash; | – | – | ȁ [34];) “(? = \ w) ‘,” g “), i = n (‘” (? = \ s) ‘, “g “), l = n (” (“) s’)” ‘, “g”); return e.replace (n (“^’% s” .replace (“% s”, t), “g”) , “‘”). replace (n (‘ ^ “% s’.replace (“% s “, t),” g “),” “). replace (/ “‘(? = w) / g,” “‘”). replace (/ ‘”(? = w) / g,”‘ “”). Replace (/ b ‘(? = D {2} s) / g, “‘”). Replace (r, “$ 1 ‘”). replace (a, “$ 1 ‘”). replace (p, “$ 1 ‘$ 2”). replace (“‘”, “‘”). replace (c, “$ 1” “). replace (i,” “”) .replace (l, “$ 1” “). replace (‘”‘, “” “)}, y = function (s) { this._wrapped = e}, v = function (e, n) {y.prototype [e] = function () {return e = n.call (t, this._wrapped), this._chain? t (e). chain (): e; var e}}; for (l in t) t.hasOwnProperty (l) && ((o = t [l]) &CS SEANDCHARo.constructor&&o.call&&o.apply) ); y.prototype.chain = function () {return this._chain =! 0, this}, y.prototype.value = function) this._wrapped}} (this);
}, {}];
window.modules [“1339”] = [function (required, module, export) {“use strict”; const universalAgora = required (1341), universalRest = required (19), universalQuery = required (1340), _ get = required (9); Function searchByQueryWithRawResults (e, r) {const t = `// $ {r.site.host} $ {80! == r.site.port? `: $ {R.site.port}`: “”} $ {r.site.path} / _ agora / _search`; return universalRest.post (t, e,! 0)} function getProducts (e, r, t) {return searchByQueryWithRawResults (universalAgora.buildProductsQuery (e), r) .then (e => {const r = universalQuery.formatSearchResult (e ); return {total: e.hits.total, products: t? universalAgora.filterByLocale (r): r}})} function getMerchantsList (e) {return searchByQueryWithRawResults (universalAgora.buildMerchantsAggregation (1e6, _get (e, “site. agoraLocale “)), e) .then (universalQuery.formatAggregationResults ({aggregation name:” dealer “, field:” key “, subfield:” name “))} module.exports.getProduct = universalAgora.getProduct, module.exports.getProducts = getProducts, module.exports.getMerchantsList = getMerchantsList, module.exports.searchByQueryWithR awResults = searchByQueryWithRawResults, module.exports.buildMerchantsByUrlQuery = universalAgora.buildMerchantsByUrlQuery;
}, {9: 9, 19: 19, 1340: 1340, 1341: 1341}];
window.modules [“1340”] = [function (required, module, export) {“use strict”; const _map = require (72), _ get = require (9), _ isArray = require (171), _ set = require (129), _ isObject = require (108), _ cloneDeep = require (90), _ uniq = require (113); function formatSearchResult (e) {return _map (e.hits.hits, “_ source”)} function newQuery (e) {if (! e) throw new Error (“An” index “is required to create a query”); return {index: e, type: “_ doc”, body: {query: {}}}} function addShould (e, o) {var t = _get (e, “body.query.bool.should”, void 0 ), r = _isArray (o); return t? r? _set (e, “body.query.bool.should”, t.concat (o)) πŸ™ t.push (o), _ set (e, “body.query.bool.should”, t)): _ set (e, “body.query.bool.should”, r? o: [o]), e} function addMust (e, o) {var t = _get (e, “body.query.bool.must”, void 0), r = _isArray (o); return t? r? _set (e, “body.query.bool.must”, t.concat (o)) πŸ™ t.push (o), _ set (e, “body.query.bool.must”, t)): _ set (e, “body.query.bool.must”, r? o: [o]), e} Function addMustNot (e, o) {var t = _get (e, “body.query.bool.must_not”, void 0), r = _isArray (o); return t? r? _set (e, “body.query.bool.must_not”, t. concat (o)) πŸ™ t.push (o), _ set (e, “body.query.bool.must_not”, t)): _ set (e, “body.query.bool.must_not”, r? o: [o]), e} function addFilter (e, o) {var t = _get (e, “body.query.bool.filter”, void 0); if (! _ isObject (o)) throws a new error (“filter”) query required to be an object “); returns t? _isArray (t)? (t.push (o), _ set (e, “body.query.bool.filter”, t)): _ set (e, “body. query.bool.filter”, [_ cloneDeep (t), o]): _ set (e, “body.query. bool.filter “, o), e} Function addMinimumShould (e, o) {if (” number “! = typeof o) throw new Error (” A number is required as the second argument “); return _set (e,” body .query.bool.minimum_should_match “, o), e} Function addSort (e, o) {var t = _get (e,” body.sort “); return _isArray (t) || _set (e,” body.sort “, t = []), t.push (o), e} function addSize (e, o) {if (! o&&0! == o) return e; if (o = parseInt (o), isNaN (o) ) triggers a new error (`the second argument must be a number: $ {o}`); return _set (e, “body.size”, o)} function addFrom (e, o) {if (! o&&0! == o) returns e; if (o = parseInt (o), isNaN (o)) throws a new error (`The second argument must be a Be a number: $ {o} `); return _set (e, “body.from”, o)} function onlyWithTheseFields (e, o) {if (! _ isArray (o)) throws a new error (“The second argument must be an array”); return _set (e, “body._source.include”, _ uniq (o)), e} function onlyWithinThisSite (e, o) {return o.subsiteSlug? AddFilter (e, {term: {subsite: o. SubsiteSlug}}) πŸ™ addFilter (e, {term: {site: o.slug}}), addMustNot (e, {exists: {field: “subsite”}} )), e} function onlyWithinThisDomain (e, o) {return addFilter (e, {Prefix: {canonicalUrl: `http: // $ {o.host}`}}), e} Function within this SiteAndCrossposts (e, o ) {var t = {term: {}}, r = {bool: {should: [], minimum_should_match: 1}}; return t.term [“crosspost”. (o.subsiteSlug || o.slug)] =! 0, r.bool.should.push (t), o.subsiteSlug? r.bool.should.push ({term: {subsite: o.subsiteSlug}}): (r.bool.should.push ({term: {site: o.slug}}), addMustNot (e, {exists: {field: “subsite”}})), addFilter (e, r), e} Function within thisDomainOrCrossposts (e, o) {return addShould (e, {term: {[`crosspost. $ {o.subsiteSlug || o .slug} `] :! 0}}), addShould (e, {Prefix: {canonicalUrl:` http: // $ {o.host} `}}), addMinimumShould (e, 1), e} Function moreLikeThis ( e, o, t) {let r = {fields: [“tags”], like: {_index: e.index, _type: “_ doc”, _ id: o}, include:! 1, min_term_freq: 1, max_query_terms: 12, min_doc_freq: 1}; return {more_like_this: Object.assign (r, t)}} function addAggregation (e = {}, o) {const {body: t = {}} = e; return o? (t.aggs? _set (e, “body.aggs”, Object.assign (t.aggs, o)): _ set (e, “body.aggs”, o), e): e} Function formatAggregationResults ({aggregationName : e = “”, field: o = “”, subfield: t = “”, skipEmpty: r =! 0}) {return function (s = {}) {let u = _get (s, `aggregations. $ {E } $ {t? “.” T “.”: “.”} Buckets`, []); return r&& (u = u.filter (e => 0! == _ get (e, “doc_count”, 0))), u.map (e => e [o] || “”)}} function addGeo (e, o) {if (! _ isArray (o)) throws a new error (“The second argument must be an array”); if (2! == o.length) throw new Error (“Array must be length 2”); if (o.some (isNaN)) throw new Error (“Array may only contain numbers”); return _set (e, “body.query.geo_shape.location.shape.type”, “point”), _ set (e, “body.query.geo_shape.location.shape.coordinates”, o), e} function combinFunctionScoreQueries (e, o) {let t = _cloneDeep (_get (e, “body.query”, {})), r = _cloneDeep (_get (o, “body.query”, {})), s = _get (e , “body.sort”); return _set (e, “body.query”, {}), _ set (e, “body.query.function_score.functions”, []), e.body.query.function_score.functions.push ({filter: t , weight: 20}), e.body.query.function_score.functions.push ({filter: r, weight: 10}), e.body.query.function_score.score_mode = “max”, e.body. query.function_score.min_score = 10, _isArray (s) || _set (e, “body.sort”, s = []), s.unshift ({_ score: “desc”}), e} Function addNestedObjQuery (e, o, t) {if (! e) solves a new one Error from (“There is no basic query to perform the addNestedObjQuery ion operation”); if (! o) throws a new error (“There is no nested object path on which to run the nested query”); if (! t) throws a new error (“There is no nested query path to run the nested query against”); return _set (e, “nested”, {path: o, query: t}), e} function addMatchAll (e) {return _set (e, “body.query”, {match_all: {}}), e} function addMultiMatch (e, o) {const t = _get (e, “body.query.bool.must”, void 0), {fields: r, type: s, character string: u} = o, i = {multi_match: { query: u, fields: r, type: s}}; return t? (t.push (i), _ set (e, “body.query.bool.must”, t)): _ set (e, “body.query.bool.must”, [i]), e} module .exports = newQuery, module.exports.addGeo = addGeo, module.exports.addAggregation = addAggregation, module.exports.addShould = addShould, module. exports.addFilter = addFilter, module.exports.addMust = addMust, module.exports.addMustNot = addMustNot, module.exports.addMinimumShould = addMinimumShould, module.exports.addSort = addSort, module.exports.addSize = addSize, module.exports. addFrom = addFrom, module.exports.onlyWithTheseFields = only with synthesis fields, module.exports.onlyWithinThisS ITE = only within this site, module.exports.onlyWithinThisDomain = only within this domain, module.exports.withinThisSiteAndCrossposts = withinThisSiteAndCrossposts, module.exports.withinThisDomainOrCrossposts = withinThisDomainOrCrossposts, module.exports.formatAggregationResults = formatAggregationResults, module.exports.formatSearchResult = formatSearchResult, module.exports.moreLikeThis = moreLikeThis, module.exports.combineFunctionScoreQueries = combinFunctionScoreQueries, module.exports.addNestedObjQuery = addNestedOblljQuultiMatch = addNestedOblljQuultiMatch = addNestedOblljQuery, module.export = addMatchAatchA = addMatchAlls. ;
}, {9: 9, 72: 72, 90: 90, 108: 108, 113: 113, 129: 129, 171: 171}];
window.modules [“1341”] = [function (required, module, export) {(function (process, __ file name) {(function () {
“use strict”; const _forEach = require (62), _ get = require (9), _ filter = require (155), _ map = require (72), _ isEmpty = require (109), urlParse = require (73), log = require (32) .setup ({file: __ filename}), queryService = require (1340), universalRest = require (19), AGORA_HOST = window.process.env.AGORA_HOST, AGORA_ELASTIC_PREFIX = window.process.env.AGORA_ELASTIC_PREFDPIC = AGORA_FELAST ? `$ {AGORA_HOST} / api / v1`: null, requestHeader = {” Content Type “:” application / json “}, PRODUCTS_INDEX =” Agora Products “, AFFILIATES_INDEX =” Partners “, RETAILERS_INDEX =” Retailers “, FILTER_KEY = { Dealer: “Name”, Partner: “Partner”}, URL_RE = / ^ https?: / /.*$/; Function getProducts (e, t) {const {limit: r = 100, start: a = 0, search: s = “”, sortDate: i = “desc”} = e, n = `$ {AGORA_ENDPOINT} / products? limit = $ {r} &start = $ {a} &search = $ {encodeURIComponent (s)} &sortDate = $ {i} `; return fetch (n) .then (handleResponse) .then (e => t? filterByLocale (e, t): e) .then (e => ({total: e. length, products: e})). catch (handleError (n))} function getProduct (e, t) {const r = `$ {AGORA_ENDPOI NT} / products / $ {e}`; if (! AGORA_ENDPOINT) triggers a new error (“No Agora endpoint was specified”); if (“string”! = Typeof e) triggers a new error (“Requirement must provide a product id”); return fetch (r) .then (handleResponse) .then (e => t? filterByLocale (e, t): e) .catch (handleError (r))} function postProduct (e) {const t = `$ {AGORA_ENDPOINT} / products`, r = {method: “POST”, header: requestHeader, body: JSON.stringify (e)}; Return value (t, r) .then (handleResponse) .catch (handleError (t))} Function putProduct (e, t) {const r = `$ {AGORA_ENDPOINT} / products / $ {e}`, a = {Method: “PUT”, header: requestHeader, body: JSON.stringify (t)}; return fetch (r, a) .then (handleResponse) .catch (handleError (r))} function patchProduct (e, t) {const r = `$ {AGORA_ENDPOINT} / products / $ {e}`, a = {method : “PATCH”, header: requestHeader, body: JSON.stringify (t)}; return fetch (r, a) .then (handleResponse) .catch (handleError (r))} function deleteProduct (e) {const t = `$ {AGORA_ENDPOINT} / products / $ {e}`; return fetch (t, {method: “DELETE”, header: requestHeader}). Then (handleResponse) .catch (handleError (t))} function getMerchantList (e) {const {limit: t = 100, fields: r = “”} = e; return Promise.resolve ([{name: “Amazon”}]). catch (handleError (“”))} function getMerchant (e) {const t = `$ {AGORA_ENDPOINT} / Merchants / $ {e}`; if (“string”! = typeof e) throws a new error (“Request must specify a merchant ID”); return fetch (t) .then (handleResponse) .catch (handleError (t))} function patchMerchant (e, t) {const r = `$ {AGORA_ENDPOINT} / Merchants / $ {e}`, a = {method: ” PATCH “, header: requestHeader, body: JSON.stringify (t)}; return fetch (r, a) .then (handleResponse) .catch (handleError (r))} function postMerchant (e) {const t = `$ {AGORA_ENDPOINT} / Merchants`, r = {method:” POST “, header: requestHeader, body: JSON.stringify (e)}; return fetch (t, r) .then (handleResponse) .catch (handleError (t))} function putMerchant (e, t) {const r = `$ {AGORA_ENDPOINT} / Merchants / $ {e}`, a = {method : “PUT”, header: requestHeader, body: JSON.stringify (t)}; return fetch (r, a) .then (handleResponse) .catch (handleError (r))} function deleteMerchant (e) {const t = `$ {AGORA_ENDPOINT} / Merchants / $ {e}`; return fetch (t, {method: “DELETE”, head ers: requestHeader}). then (handleResponse) .catch (handleError (t))} function migrateMerchants (e) {const t = `$ {AGORA_ENDPOINT} / Händler / migrate-Affiliate`, r = {method:” POST “, header: requestHeader, body: JSON.stringify (e)}; return fetch (t, r) .then (handleResponse) .catch (handleError (t))} function getRetailers (e) {const {limit: t = 100, start: r = 0} = e, a = `$ {AGORA_ENDPOINT } / Retailer? limit = $ {t} &start = $ {r} `; return fetch (a) .then (handleResponse) .then (e => ({total: e.length, retailer: e})). catch (handleError (a))} function getRetailer (e) {const t = `$ {AGORA_ENDPOINT} / retailer / $ {e}`; return fetch (t). then (handleResponse) .catch (handleError (t))} function postRetailer (e) {const t = `$ {AGORA_ENDPOINT} / retailer`, r = {method:” POST “, header: requestHeader, body: JSON.stringify ( e)}; return fetch (t, r) .then (handleResponse) .catch (handleError (t))} Function putRetailer (e, t) {const r = `$ {AGORA_ENDPOINT} / retailer / $ {e}`, a = {method : “PUT”, headers: requestHeader, body: JSON.stringify (t)}; return fetch (r, a) .then (handleResponse) .catch (handleError (r))} function deleteRetailer (e) {const t = `$ {AGORA_ENDPOINT} / retailer / $ {e}`; return fetch (t, {method: “DELETE”, header: requestHeader}). then (handleResponse) .catch (handleError (t))} function getAffiliates (e) {const {limit: t = 100, start: r = 0} = e, a = `$ {AGORA_ENDPOINT} / affiliates? limit = $ {t} &start = $ {r} `; return fetch (a) .then (handleResponse) .then (e => ({total: e.length, Affiliates: e})). catch (handleError (a))} function getAffiliateRetailers (e) {const t = `$ {AGORA_ENDPOINT} / retailers / $ {e} / affiliates`; return fetch (t) .then (handleResponse) .catch (handleError (t))} function getAffiliateRetailer (e, t) {const r = `$ {AGORA_ENDPOINT} / Retailer / $ {e} / Affiliates / $ {t}` ; return fetch (r) .then (handleResponse) .catch (handleError (r))} function postAffiliateRetailer (e, t) {const r = `$ {AGORA_ENDPOINT} / Retailer / $ {e} / Affiliates`, a = {method : “POST”, header: requestHeader, body: JSON.stringify (t)}; Return value (r, a) .then (handleResponse) .catch (handleError (r))} Function putAffiliateRetailer (e, t, r) {const a = `$ {AGORA_ENDPOINT} / Retailers / $ {e} / Affiliates / $ { t} `, s = {method:” PUT “, header: requestHeader, body: JSON.stringify (r)}; return fetch (a, s) .then (handleResponse) .catch (handleError (a))} Function deleteAffiliateRetailer (e, t) {const r = `$ {AGORA_ENDPOINT} / Retailer / $ {e} / Affiliates / $ {t } `; return fetch (r, {method: “DELETE”, header: requestHeader}). catch (handleError (r))} function postLocale (e) {const t = `$ {AGORA_ENDPOINT} / locales /`, r = {method: “POST”, header: requestHeader, body: JSON.stringify (e)}; return fetch (t, r) .then (handleResponse) .catch (handleError (t))} function patchLocale (e, t) {const r = `$ {AGORA_ENDPOINT} / locales / $ {e}`, a = {method : “PATCH”, header: requestHeader, body: JSON.stringify (t)}; return fetch (r, a) .then (handleResponse) .catch (handleError (r))} function handleResponse (e) {try {return e.json (). then (t => {if (e.status> = 400) {const e = _get (t, “message.details [0] .message”); throw a new error (e)} return t})} catch ( e) {throw new Fehler (e.message)}} function handleError (e) {return t => {throw log (“warn”, `failed request to $ {e}`, t), new error (`request to $ {e} failed `)}} Function buildProductsCross y ({search: e =” “, limit: t = 100, start: r = 0, sortDate: a =” “, filter: s, locale: i}) {const n = queryService (PRODUCTS_INDEX), c = s&&Object .keys (s) .length? Object.keys (s) .filter (e => Array.isArray (s [e]) &&s [e] .length): [], o = {}, l = {}; if (prependElasticPrefix (n), e || c.length || i || queryService.addMatchAll (n), i&& (queryService.addMust (o, {match: {“locales.locale”: i}}), queryService. addMust (l, {match: {“Merchants.locale”: i}})), e) if (isURL (e)) queryService.addMust (n, [queryService.addNestedObjQuery ({}, “Merchants”, {match: {“Merchants.buyUrl”: e}})]); else {const t = {}; queryService.addShould (t, [{match: {“locales.productId”: e}}, {match: {“locales. name”: {query: e, boost: 2}}}]), queryService.addMinimumShould (t , 1), queryService.addMust (o, _get (t, “body.query”))} if (c.length) {const e = {}; c.forEach (t => {const r = s [t], a = FILTER_KEY [t], i = {}; a&& (i [`Dealer. $ {a}`] = r, queryService.addMust (e, {Terms: i}))}), queryService.addMust (l, _get (e, “body.query”))} return _isEmpty (o) || queryServic e.addMust (n, [queryService.addNestedObjQuery ({}, “locales”, _ get (o, “body.query”))]), _ isEmpty (l) || queryService.addMust (n, [queryService.addNestedObjQuery ({)}, “Dealer”, _ get (l, “body.query”))]), queryService.addSize (n, t), r> = 0&&queryService.addFrom ( n, r), “desc” === a || “asc” === a? queryService.addSort (n, {updatedAt: {order: a}}): e&&queryService.addSort (n, {_ score: {order: “desc”}}), n} function prependElasticPrefix (e) {return e.index = AGORA_ELASTIC_PREFIX? `$ {AGORA_ELASTIC_PREFIX} _ $ {e.index}`: e.index, e} Function buildMerchantsAggregation (e = 1e6, t) {const r = queryService (PRODUCTS_INDEX); r), queryService.addMust (r, {match: {active:! 0}}), t&&queryService.addMust (r, queryService.addNestedObjQuery ({}, “Dealer”, _ get (queryService.addMust ({}, {match : {“Merchants.locale”: t}}), “body.query”))), queryService.addAggregation (r, {Dealer: {nested: {Path: “Dealer”}, Aggs: {Name: {Terms: {Field: “Merchants.name”, size: e}}}}}), queryService.addSize (r, 0), r} function isURL (e) {return URL_RE.test (e)} function filterByLocale (e, t, r = {locales: “US”}) {const a = Array.isArray (e); if (_isEmpty (e)) return a? []: {}; const s = [“locales”, “dealers”], i = a? e: [e], n = object key (r), c = _map (i, e => {const a = Object.assign ({}, e); return _forEach (s, s => {if (Object.keys (a) .includes (s)) {const i = t? _filter (e [s], [“locale”, t]): e [s]; a [s] = i,! i.length&&n.includes ( s) && (a [s] = (_ filter (e [s], [“locale”, r [s]]) || []). map (e => (e.id = null, e.locale = t, e))}}), a.name = _get (a, “locales [0] .name”, “”), a}); return a&&c.length? c: _get (c, “[0] “, {})} Function searchByQueryWithRawResults (e, t) {const r =` // $ {t .site.host} $ {80! == t.site.port? `: $ {T.site.port} `:” “} $ {t.site.path} / _ agora / _search`; return universalRest.post (r, e,! 0)} function buildMerchantsByUrlQuery (e) {const t = queryService (PRODUCTS_INDEX); return prependElasticPrefix ( t), queryService.addNestedObjQuery (t.body.query, “trader”, {match: {“trader. buyUrl”: e}}), t} function getAffiliatesByLocale (e, t) {const r = quer yService (AFFILIATES_INDE X); return prependElasticPrefix (r), queryService.addMust (r, {match: {locale: e}}), queryService.addSize (r, 1e3), queryService.addSort (r, {name: “asc”}), searchByQueryWithRawResults (r , t) .then (e => _ get (e, “Hits.hits”, []). map (e => _ get (e, “_ source”, {}))} function buildRetailersQuery ({search: e = “”, limit: t = 50, start: r = 0, direction: a = “asc”, locale: s = “US”}) {const i = queryService (RETAILERS_INDEX); return prependElasticPrefix (i), queryService .addMust (i, {match: {locale: s}}), e? queryService.addMultiMatch (i, {fields: [“Name”, “Domains ^ 2”], string: e, type: “Phrase prefix”}) πŸ™ queryService.addSort (i, {“name.keyword”: a}), queryService.addSize (i, t), r> = 0&&queryService.addFrom (i, r)), i} function getRetailersList (e, t) {return searchByQueryWithRawResults (buildRetailersQuery (e), t) .then (e => ({total: _get (e, “Hits.total”, 0), retailer: _get (e, “Hits.hits”, []). map (e => _ get (e, “_ source”, {}))})}} function n getRetailersByAffiliateId (e, t, r) {const a = queryService (RETAILERS_INDEX); return e? (prependElasticPrefix (a), ask yService.addMust (a, {match: {locale: r}}), queryService.addMust (a, [queryService.addNestedObjQuery ({}, “AffiliateRetailers”, {Match: {“AffiliateRetailers.affiliateId “: e}})]), queryService.addSize (a, 1e4), queryService.addSort (a, {” name.keyword “:” asc “}), searchByQueryWithRawResults (a, t) .then (e => _ get (e, “Hits.hits)”, []). map (e => _ get (e, “_ source”, {}))): Promise.reject ()} function getMerchantsList (e) {return searchByQueryWithRawResults (buildMerchantsAggregation (1e6, _get (e, “) site.agoraLocale”)), e) .then (queryService.formatAggregationResults ({aggregation name: “Dealer”, field: “Key”, subfield: “Name”}))} Function queryRetailersByUrl (e, t, r) {const a = urlParse (e) .host.split (“www.”). join (“”), s = queryService (RETAILERS_INDEX); return queryService.addMust (s, {match: {locale: r}}), queryService.addMust (s, {match: {Domains: a}}), prependElasticPrefix (s), queryService.addSize (s, 10), searchByQueryWithRawResults (s, t) .then (e => _ get (e, “Hits.hits”, []). map (e => _ get (e, “_ source”, {}))} function queryRetailersByName (e , t, r) {const a = queryService (RETAIL ERS_INDEX); return queryService.addMust (a, {match: {locale: r}}), queryService.addMust (a, {match: {“name.keyword”: e }}), prependElasticPrefix (a), queryService.addSize (a, 10), searchByQueryWithRawResults (a, t) .then (e => _ get (e, “Hits.hits”, []). map (e => _ get (e, “_ source”, {})))} require (229), module.exports = {buildProductsQuery: buildProductsQuery, buildMerchantsAggregation: buildMerchantsAggregation, getProducts: getProducts, getProduct: getProduct, postProduct: postProduct: putProduct: putProduct: , postMerchant: postMerchant, patchMerchant: patchMerchant, putMerchant: putMerchant, deleteMerchant: deleteMerchant, migrateMerchants : MigrateMerchants, getRetailers: getRetailers, getRetailersList: getRetailersList, getRetailer: getRetailer, post retailer: post retailer, putRetailer: putRetailer, deleteRetailer: deleteRetailer, getRetailersByAffiliateId: getRetailersByAffiliateId, getAffiliates: getAffiliates, getAffiliateRetailers: getAffiliateRe tailers getAffiliateRetailer: getAffiliateRetailer, post affiliate retailer: post affiliate retailer, putAffiliateRetailer: putAffiliateRetailer, deleteAffiliateRetailer: deleteAffiliateRetailer, isURL: isURL, filterByLocale: filterByLocale, patch locale: patch locale, post locale: post locale, buildMerchantsByUrlQuery: buildMerchantsByUrlQuery, getAffiliatesByLocale: getAffiliatesByLocale, searchByQueryWithRawResults: searchByQueryWithRawResults, getMerchantsList: getMerchantsList, queryRetailersByUrl: queryRetailersByUrl, queryRetailersByName: queryRetailersByName};

}). call (this)}). call (this, require (25), “/ services / universal / agora.js”)}, {“9”: 9, “19”: 19, “25”: 25 32: 32, 62: 62, 72: 72, 73: 73, 109: 109, 155: 155, 229: 229, 1340: 1340}] ;;
window.modules [“1342”] = [function (required, module, export) {“use strict”; const _map = require (72), _ mapValues ​​= require (224), _ reduce = require (112), _ assign = require (159), _ get = require (9), _ pickBy = require (160), _ find = require (65), AffiliateFields = [“siteShortKey”, “pageUri”, “productId”, “utmMedium”, “utmSource”, “sessionCount”, “format”, “utmCampaign”, “referrer”, “deviceAbbreviation” , “zone”], AffiliateSettings = {amazon: {Domains: [“amazon.com”, “amazon.co.uk”], subtagKey: “ascsubtag” “, maxLength: 99, separator:” Standard “, coding:! 1}, narrative: {Domains: [“shop-links.co/”‹,subtagKey:”u1″,maxLength:99,delimiter:”standard”, encode:! 0}, rakuten: {Domains: [“click. linksynergy.com/deeplink”,”linksynergy.walmart.com/deeplink”‹,subtagKey:”u1″,maxLength:72,delimiter:”standard”,encode:! 1}, shareasale: {Domains: [“shareasale.com “], subtagKey:” afftrack “, maxLength: 99, separator:” standard “, encode:! 1}, Skimlinks: {Domains: [” go.redirectingat .com “], subtagKey:” xcust “, maxLength: 50, Delimiter:” old “, encode:! 1}, effect: {Domains: [], subtagKey: “subId2”, maxLeng th: 99, separator: “Standard”, coding:! 1}, Avantlink: {Domains: [“avantlink.com”], SubtagKey: “ctc”, maxLength: 64, separator: “old”, coding:! 1}, cj: {Domains: [“tkqlhce.com”, “jdoqocy.com”, “dpbolvw.net”, “anrdoezrs.net”, “kqzyfj.com”], subtagKey: “sid”, maxLength: 64, Separator: “old”, code:! 1, joinBy: “/”, assignBy: “/”, positioned:! 0, position: “after”, positionKey: “type / dlg /”}, partnerize: {Domains: [“prf .hn”], subtagKey: “pubref”, maxLength: 100, separator: “old”, encode:! 1, joinBy: “/”, assignBy: “:”, positioned:! 0, position: “before”, positionKey: “target”}, Pepperjam: {Domains: [“gopjn.com”, “pntrac.com”, “pjtra.com”, “pjatr.com”, “pntrs.com” , “pntra.com”], subtagKey: “sid”, maxLength: 100, separator: “old”, encode:! 1}, awin: {Domains: [“awin1.com”], subtagKey: “pref1”, maxLength: 100, separator: “old”, encode:! 1, positioned:! 0, position: “before”, positionKey: “ued”}}, subtagDictionary = {siteShortKey: “”, pageUri: “p”, productId: “i”, zone: “z”, deviceAbbreviation: “d”, utmSource: “s”, utmMedium: “m”, utmCampaign: “c”, sessionCount: “u”, referrer: “r”, format: “t”}, separator s = {standard: [“[“, “]”] , old: [“__”, “_”]}; Function parseValueFromSubtag (e, t, i) {const a = t [0] et [1], s = i.split (a) [1] || “”; return s? s.split (t [0]) [0]: null} function parseSubtag (e, t = delimiters.standard) {return _pickBy (_mapValues ​​(subtagDictionary, i => parseValueFromSubtag (i, t, e))} function generateSubtag ( e, t, i = limiter.standard, a =! 1) {const s = (e => t => `$ {e [0]} $ {t} $ {e [1]}`) (i) ; let n = _reduce (AffiliateFields, (t, i) => {const a = s (subtagDictionary [i]), n = e [i]; return t (n? an: “”)}, “”); return a&& (n = encodeURIComponent (n)), n} Function applySubtagMaxlength (e, t) {var i = t-3 * (e .split (“,”). length-1 e.split (“|”). length-1); return e.substr (0, i)} function getSubtagData ({getters: e, fields: t = [], visitState: i, locals: a, productLink: s}) {let n = {}; return t.forEach (t => {n [t] = e [t] &&e [t] ({visitState: i, locals: a, productLink: s})}), n} function parseQuery (e = “”) {return e.split (“&”). redu ((e, t) => {const i = t.split (“=)”) [0], a = t.split (“=”) [1] ; return void 0! == a&CSS EANDCHAR (e [i] = a), e}, {})} func tion processSubtagPosition ({url: e, positionKey: t, subtagKey: i, position: a = “after”, subtagString: s, joinBy: n, assignBy: o} = {}) {const [r, l] = e. split (t), u = `$ {i} $ {o} $ {s}`, g = []; if (“after” === a) {if (! l) return e; const [a, s = “”] = l.split (`$ {i} $ {o}`), d = s.split (n) .slice (1) .join (n); g.push (`$ {r} $ {t}`, u), a&&g.push (a), d&&g.push (d)} if (“before” === a) {const [e, a = ” “] = r.split (` $ {i} $ {o} `), s = a.split (n) .slice (1) .join (n); g.push (e), s&&g.push (s), g.push (u, `$ {t} $ {l}`)} return g.reduce ((e, t) => {return e.slice ( -1) === n&& (e = e.slice (0, -1)), e.length? [E, t] .join (n): t}, “”)} function processSubtag ({getters: e , Affiliate: t, url: i, visitState: a = {}, local: s}) {const n = AffiliateFields, o = _get (AffiliateSettings [t], “subtagKey”), r = _get (AffiliateSettings [t], “maxLength”), l = _get (AffiliateSettings [t], “encode”), u = _get (AffiliateSettings [t], “separator”), g = _get (AffiliateSettings [t], “positioned”,! 1), d = _get (AffiliateSettings [t], “Position”), c = _get (AffiliateSettings [t]], “positionKey”), p = _get (AffiliateSettings [t], “assignBy”, “=”), m = _get (AffiliateSettings [t], “joinBy”, “&”), f = delimiter [u]; let b, y, S = i. indexOf (“?”)> = 0? i.split (“?”). pop (): “”, h = parseQuery (S), _ = getSubtagData ({getters: e, fields: n, visitState: a, local: 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}): i.split (“?”) [0] `? $ {S}`), i} Function getAffiliate (e) {const t = Object.keys (AffiliateSettings); Return _find (t, t => _ find (AffiliateSettings [t] .domains, t => e.includes (t. ToLowerCase ()))) || “”} 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, Locals: a}): “”} module.exports.generateSubtag = generateSubtag, module.exports.getAffiliate = getAffiliate, module.expo rts.createSubtagProcessor = createSubtagProcessor, module.exports.processSubtag = processSubtag;
}, {9: 9, 65: 65, 72: 72, 112: 112, 159: 159, 160: 160, 224: 224}];
window.modules [“article-nav.client”] = [function (required, module, export) {“use strict”; const dom = required (4), _ throttle = required (59), $ visibility = required (5), $ popup = require (74), $ gtm = require (3), {reportSocial: reportSocial} = require (75) , auth0 = require (7); module.exports = (t => {let e = dom.find (“.page-header”), i = dom.find (“. article-content”), r = dom.find (t, “. deepscroll- headline “), o = dom.find (t,”. deepscroll-rubric “), s = dom.find (t,”. deepscroll-rubric-sponsored “), l = dom.find (“. article .article- header .rubric “), n = dom.find (” # deepscroll_center_divider “), a = dom.find (“. tone paragraph “), d = dom.find (t,”. logo “), c = dom. find (t, “. dyn-cut-logo”), p = dom.find (t, “. article-nav-top”), u = dom.find (t, “. article-nav-deepscroll”), m = dom.find (‘link [rel = “canonical”]’), f = m&&m.getAttribute (“href”), g = dom.find (‘meta [property = “og: image”]’)? dom .find (‘meta [property = “og: image”]’) .getAttribute (“content”): “”, h = dom.find (‘meta [property = “og: title”]’)? dom.find (‘meta [property = “og: title”]’). getAttribute (“content”): “”, y = dom.find (t, “. share -link.facebook”), w = dom.find (t , “. share-link.twitter”), v = dom.find (t, “. share-link.pinterest”), b = t.cla ssList.contains (“header-simple”), x = window.getComputedStyle (d, null) .getPropertyValue (“- targetFlexBasis”), L = window.getComputedStyle (d, null) .getPropertyValue (“- verticalStart”) || 0, C = window.getComputedStyle (d, null) .getPropertyValue (“- verticalEnd”) || 0, $ =! 1, _ = 55; Function k () {_ = parseInt (window.getComputedStyle (d, null)) .getPropertyValue (“- stickyTop”)) || _, C = $ visibility.getViewportWidth ()> = 1180? window.getComputedStyle (d, null) .getPropertyValue (“- verticalEndDesktop”) || C: window.getComputedStyle (d, null) .getPropertyValue (“- verticalEnd”) || C} function S () {$ =! 1, P ()} Function P () {let {top: r} = t.getBoundingClientRect (), o = window.getComputedStyle (d, null) .getPropertyValue (“- baseFlexBasis”), s = ox, l = ( _- e.getBoundingClientRect (). top) / _, n = Math.max (0, Math. min (1, l)), m = LC-2, f = Math.round (L- (m * n 2 )), g = Math.ceil (os * n); if (lt? e.classList.add (“Header-After-Scroll”): e.classList.remove (“Header-After-Scroll”), p.style.transfo rm = `translateY ($ {C} px) `, u.style.transform =` translateY ($ {C} px) `, void (d.style.flexBasis = x” px “)} window.scrollY> r? t.classList.add (” after-scroll ” ): t.classList.remove (“after-scroll”), window.scrollY> r? e.classList.add (“header-after-scroll”): e.classList .remove (“header-after-scroll”) , p.style.transform = `translateY ($ {f} px)`, u.style.transform = `translateY ($ {f} px)`, d.style. flexBasis = g “px”, c&& (c. style.flexBasis = g “px”), $ Visibility.getViewportWidth ()> = 1180&&i&&function () {const t = a? 0, e = $ Visibility.getPageOffset (i) .top, r = Math.max (e, t ); Returns Math.max (window.scrollY, document.body.scrollTop)> = r} ()? T.classList .add (“deep-scroll”): t.classList.remove (“deep-scroll”)} Function V (t) {var e = t.currentTarget, i = e.getAttribute (“href”), r = e .getAttribute (“D atenhandle “), o = $ popup.getPopupClass (e.classList), s = $ Visibility.isBelowPrimaryContent (e)? “bottom”: “top”; $ gtm.reportNow ({event: “social-share-widget”, clickLocation: s, socialNetw ork: o}), reportSocial (o), $ Visibility.getViewportWidth ()> = 768&&o&& (t.preventDefault (), $ popup .popWindow (o, r, i))}! function () {const e = _throttle P, 30); if (k (), dom.findAll (t, “. Share-link”). ForEach (t => t.addEventListener (“click”, V)), y&& (y.href = “http: // www. facebook.com/sharer/sharer.php? u = “f”? utm_source = fb&utm_medium = s3&utm_campaign = sharebutton-t “), w&& (w.href =” https: // titter? text = “encodeURIComponent = “f”? utm_source = tw&utm_medium = s3&utm_campaign = sharebutton-t&via = “w.getAttribute (” data-handle “)), vCSSEANDAR. com / pin / create / button /? url =” fCH “? utssm_mediumamp =” fCH “? = sharebutton-t&description = “encodeURIComponent (h)” &media = “g), b) return; auth0.on”) => {auth0.isSubscriber () &&t.classList.add (“subscribed to”)}), window.addEventL istener (“scroll”, e), window.addEventListener (“resize”, S), window.addEventListener (“resize”, k), l? l.classList.contains (“rubric-sponsor-story”) &&s? (o.classList.remove (“visible”), s.classList.add (“visible”), s.textContent = l.text || l.textContent) πŸ™ o.textContent = l.text || l.textContent , o.href = l.href || “#”) πŸ™ n.style.display = “none”, o.style.display = “none”); S (), r.textContent = h} ()}) ;;
}, {3: 3, 4: 4, 5: 5, 7: 7, 59: 59, 74: 74, 75: 75}];
window.modules [“nav-search-button.client”] = [function (required, module, export) {“use strict”; const dom = required (4), $ gtm = required (3), {reportSearch: reportSearch} = require (75), openClass = “open”, closeClass = “closed”; module.exports = (e => {const s = e, t = dom.find (e, “. nav-search-button-trigger”), n = dom.find (e, “. nav-search-form” ), o = dom.find (e, “. search-input”); function i () {const e = dom.find (“body”); s.classList.toggle (closeClass), s.classList.toggle ( openClass), e.classList.toggle (“disabled”), e.classList.toggle (“search-active”)} function c () {i (), s.classList.contains (openClass) &&o.focus ()} Function a (e) {! S.contains (e.target) &&s.classList.contains (openClass) &&i ()} function) {27 === e.keyCode&&s.classList.contains (openClass) &i (e) {e.preventDefault (), $ gtm.reportCustomEvent ({category: “search”, label: “on =” window.location.href, action: o.value}), reportSearch ((o.value || “”). split (“”), () => n.submit ())}! function (e, s, t) {s&&s.addEventListener (“click”, c); t&&t.addEventListener (“submit”, d); e.addEventListener (“click”, a), document.addEventListener (“keydown”, r), e) .addEventListener (“touchend”, a), n.addEventListener (“submit”, d)} (dom.find ( “body”), t, dom.find (e, “. nav-search-form submit”))});
}, {“3”: 3, “4”: 4, “75”: 75}];
window.modules [“nav-dropdown-button.client”] = [function (required, module, export) {“use strict”; const dom = required (4), visibility = required (5), {reportSearch: reportSearch} = require (75); function getNextSchildren (e) {const t = []; let i = e; for (; i = i.nextElementSibling;) t.push (i); return t} function getMainChildren (e, t) {let i = [], n = e.firstChild; for (; n = n.nextElementSibling;) n.contains (t)? n.isSameNode (t) || (i = i.concat (getMainChildren (n, t)))): i.push (n); return i} function isMobile () {return visibility.getViewportWidth () {let t; const i = e.querySelector (“. nav-dropdown-button-trigger”), n = dom.find (“body”), o = dom.find (“. top”), l = dom.find (“. confetti-list “), s = dom.find (“. nav-dropdown-button_nymag-homepage “”), r = dom.find (“header.page-header”) || o, c = dom.find (‘ [data-editable = “main”] ‘), a = dom.closest (e, “. Page header”), d = a? a.querySelectorAll (“. confetti-image.blue”): “”, g = a ? a.querySelectorAll (“. confetti-image.green”): “”, u = a? a.querySelectorAll (“. confetti-image.orange”): “”, f = a? a.querySelectorAll (“. confetti -image.orange2 “):” “, m = a? a.querySe lectorAll (“. confetti-image.pink “):” “, p = a? a.querySelectorAll (“. confetti-image.purple “): “”, h = a? a.querySelectorAll (“. confetti-image. yellow”): “”, y = e.querySelectorAll (“. dropdown-nav-search-form”); function b (e) {let t = e.currentTarget, i = t.querySelector (“. nav-search- input”), n = i? i.value.split (“”): []; e.preventDefault (), reportSearch (n, () => t.submit ())} i.addEventListener (“click” , () => {initializeHeight (e), v ()}); for (let e = 0, t = y.length; e (function (e) {e.classList.remove (“c-right”, “c -rightdown”, “c-left”, “c-leftdown”) }) (e))}, 500)} ()) πŸ™ i.setAttribute (“aria-expanded”, “true”), t = window .scrollY), e.classList.toggle (“closed”), e .classList.toggle (“open”), n.classList.toggle (“deactivated”), a&&e.isSameNode (s)? function () {if (o.contains (e)) {const e = getMainChildren (o, s); S (e), w (o)} if (c.contains (e)) {const e = getMainChildren (c, s); o. classList.toggle (“hidden component”), w (c), S (e)} e.classList.toggle (“open-mobile”)} (): a&&! y&&r&& (w (r), function () {const i = e .classList.contains (“open”)? 0: t; window.scrollTo ({top: i})} ())} function w (e) { S (getNextSchildren (e))} Function S (e) {e .forEach (e => {e.classList.toggle (“hidden component”)})} n.addEventListener (“click”, t => {! E .contains (t.target) &&e.classList.contains (“open”) &&v ()}), document.addEventListener (“keydown”, t => {27 === t.keyCode&&e.contains (“openList” ) &&v ()})});
}, {“4”: 4, “5”: 5, “75”: 75}];
window.modules [“follow.client”] = [function (required, module, export) {“use strict”; const _find = require (65), $ popup = require (74); DS.controller (“follow”, [function () {function e (e) {this.el = e, this.handle = e.getAttribute (“data handle”)} return e.prototype = {events: {click: ” openFollow “}, openFollow: Function (s) {var t, n, a = $ popup.position, o = $ popup.params, l = {}, r = {w: 780, h: 500}, s = new a (rw, rh), c = this.el.classList; l.handle = this.handle, r.left = s.left, r.top = s.top, n = _find ([{className: “facebook” , url: “https: //facebook.com/ Genealogiehandle Genealogie “,network:”Facebook” Genealogie {{className:”pinterest”,url:”http://www.pinterest.com/ regis-handle} “,network : “Pinterest”}, {className: “instagram”, URL: “https://www.instagram.com/ Zonenhandle}”, network: “Instagram”}, {className: “rss”, URL: “http: //feeds.feedburner. com / {handle} “, network:” RSS “}, {class name:” Twitter “, URL:” https://twitter.com/intent/follow?screen_name=phiahandle Genealogie&tw_p=followbutton&variant = 2.0 “, network:” Twitter “}, {className:” snapchat “, URL:” https://www.snapchat.com/discover/ Genealogiehandle} “, netw ork:” Snapchat “}], radio tion (e) {return c.contains (e.className)}), l.url = n.url.replace (“{handle}”, l.handle), l.network = n.network, l.name = “Follow” l.handle “on” l.network, t = new o (l, r), window.open (t.address, t.name, t.features), e. PreventDefault ()}}, e}]);
}, {“65”: 65, “74”: 74}];
window.modules [“comment-link.client”] = [function (required, module, export) {“use strict”; const dom = required (4), _ get = required (9), _ isFinite = required (131), ajax = require (130); DS.controller (“comments link”, [function () {var t, e = “http: //” document.documentElement.getAttribute (“data-uri”) “.html”; function n (n) {var o; (this.el = n, this.coral_talk_root = n.getAttribute (“data coral talk”), this.commentsCount = dom.find (n, “. comments link number”), this.commentsText = dom.find (n, “. Comments-Link-Text”), this.isNavVariation = n.classList.contains (“Comments-Link-Article-Nav”), this.cutoffCnt = n.getAttribute (“data-cutoffCnt” ) || 1e3, t = `$ {this.coral_talk_root} /api/v1/graph/ql`,this.shouldRenderCommentStream ()) && (o = this.onCommentCountFetched.bind (this), ajax. SendReceiveJson ({method: “GET”, URL: t ‘? Query = {Asset (URL: “‘ e ‘”) {totalCommentCount}}’, data type: “json”}, function (t, e) {var n = _get (e, ” data.asset.totalCommentCount “, 0); return t? o (t): _ isFinite (n)? void o (null, n): o (” Unexpected Coral Talk response “)})}) return n. per totype.onCommentCountFetched = function (t, e) {if (t) retur n console.warn (t); e> 0&& (this.isNavVariation&&e1? “s”: “”), this.el.classList.remove (“no- comments”))}, n.prototype.shouldRenderCommentStream = function () {return-1! == e.indexOf (“@ shared”)}, n}]);
}, {4: 4, 9: 9, 130: 130, 131: 131}];
window.modules [“head-gtm.client”] = [function (required, module, export) {“use strict”; const {getCLS: getCLS, getFID: getFID, getLCP: getLCP} = require (163), isProduction = require (8) (); function reportWebVitals (e) {isProduction || console.log (“reportWebVitals:% O”, e); const t = “string” == typeof e.name?e.name.toUpperCase (): e.name; window.dataLayer = window.dataLayer || [], window.dataLayer.push ({event: “analysisEvent”, event_action: t, event_category: “Web Vitals”, event_label: e.id, event_value: e .delta, eventAction: t, eventCategory: “Web Vitals”, eventLabel: e.id, eventNonInt:! 0, eventValue: e.delta, nonInteraction:! 0, transport: “beacon”})} getCLS (e => {e.delta = Math.round (1e3 * e.delta) , reportWebVitals (e)}), getFID (e => {e.delta = Math.round (e.delta), reportWebVitals (e)}), getLCP (e => {e.delta = Math.round (e. delta), reportWebVitals (e)});
}, {“8”: 8, “163”: 163}];
window.modules [“concert-ads.client”] = [function (required, module, export) {“use strict”; const customMappings = {“Crime-Assault”: “Power”, “Career-Money-Productivity”: “Power”, “Feminism-Politics-Identity”: “Power”, “Culture-Media”: “Culture”, Celebrity: “Culture”, life: “style”, fashion: “style”, shopping: “style”, weddings: “style”, beauty: “style”, animals: “self”, “learning creativity”: “self”, ” Relationship-friends family “:” self “,” mental health personality social behavior “:” self “,” learning “creativity”: “self”, “health-wellness”: “self”, parenting: “self”, “relationship -Sex dating marriage “:” self “}, striptags = require (76); function installConcertAds () {const e = new URLSearchParams (window.location.search) .get (” konzert_config_url “), t = e || window.concertConfigUrl; window._nymPermutive || console.warn (“ConcertAds will be initialized without Permutive”), window.concertAds = createConcertAds (), window.concertAds.loadRemoteConfig (t) .then (function () {window.concertAds.install ()})} function createConcertAds () {co nst e = getAuthStatus (); let t = getD ata (“title”), n = window.location.href, i = getData (“section”), o = “”, a = getData (“type”), r = getData (“vertical”) ; t&& (t = striptags (htmlDecode (t)). split (“”)), n = n.slice (n.lastIndexOf (“/”) 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 = window.location.pathname). Replace (/ // g, “”)), i&&-1 === i.index ( “”) && (o = i), customMappings [i] && (o = customMappings [i]), window.location .hostname.match (/ . Aws ./ i) ​​&& (l.clay_sandbox_env = r ), new window.ConcertAds ({cmd: [], Slots: [], dfpVariables: l, slugPath: “/” or replace (/ – | – / g, “-“), registered: “not authenticated”! == e, paywallActive: getPaywallStatus (e)})} function getKeywords () {try {const e = window._nymPermutive.article.keywords; return e&&e.length> 0&&e.some (Boolean)? e: (document.querySelector (‘meta [name = “keywords”]’) || document.querySelector (‘meta [property = “article: tag”]’)). getAttribute (“content”). split (“,”). map (function (e) {return e.trim ()})} catch (e) {return}} function getData (e) {if (window._nymPermutive) {if (e in window._nymPermutive) return window._nymPermutive [ e]; if (window._nymPermutive.article&&e in window._nymPermutive.article) return window. _nymPermutive.article [e]; if (window._nymPermutive.user&&e in window._nymPermutive.user) return window._nymPermutive.user [e]}} function htmlDecode (e) {var t = document.createElement (“div”); return t.innerHTML = e, 0 === t.childNodes.length? “”: t.childNodes [0] .nodeValue} function getAuthStatus () {const e = JSON.parse (localStorage.getItem (“auth0: profile”))), t = e? e [“http://nymag.com/app_metadata”]: null; return t? t.has_subscription? “with the title”: “unentitled”: “not authenticated”} function getPaywallStatus (e) {const t = getData (“totalCount”) || 0; return Boolean (t> = 3&& “with the title”! == e)} window.ConcertAds? installConcertAds (): window.addEventListener (“konzertAdsReady”, in StallConcertAds);
}, {“76”: 76}];
window.modules [“latest-news.client”] = [function (required, module, export) {“use strict”; const dom = required (4), lazyLoad = required (117); Function lazyLoadImage (a) {const o = dom.find (a, “img [data-src]”), d = dom.findAll (a, “source [data-srcset]”), e = dom.closest (a , “. result”); if (o&&e) {new lazyLoad.LazyLoader (e, o, d) .init ()}} function handleLazyLoad (a) {(dom.findAll (a, “. result”) || []). forEach (lazyLoadImage)} module.exports = (a => {handleLazyLoad (a)});
}, {“4”: 4, “117”: 117}];
window.modules [“coral-talk.client”] = [function (required, module, export) {“use strict”; const dom = required (4), store = required (137), visibility = required (5), auth0 = require (7), TALK_AUTH = “talk: auth_token”; let coralEmbed, hasEmbedScriptLoaded =! 1, hasCoralTalkRendered =! 1; function renderComments (e) {if (hasEmbedScriptLoaded&&! hasCoralTalkRerted {const) {e.CORAL_TALK_HOST} `, auth_token: getAuthToken (), asset_url: e.TALK_ASSET_URL}; hasCoralTalkRendered =! 0, coralEmbed = window.Coral.Talk.render (e.commentStreamContainer, t)}} function getAuthToken (e) {e) = e&&e [“http://nymag.com/coral_talk”] || auth0.getTalkJwt (), i = store.get (TALK_AUTH); return t? i&&t == i? i: (store.set (TALK_AUTH, t), t) πŸ™ i&&store.remove (TALK_AUTH), null)} function coralLogin () {coralEmbed.login (getAuthToken ())} function embeddedScript (e, t) {let i = document.createElement (“script”); i.type = “text / javascript”, i.async =! 0, i.src = e, i.addEventListener (“load”, () => {hasEmbedScriptLoaded =! 0, r enderComments (t)}), document.getElementsByTagName (“head”) [0] .appendChild (i) } Function initVerificationMessage () {auth0.isAuthenticated () &&auth0.refresh (); let e = document.querySelector (“. coral -talk-container”); auth0.isAuthenticated () &&! auth0.isEmailVerified () && (e.insertAdjacentHTML (“beforebegin”, ‘ n n Please check your account to enable commenting. You haven’t received a confirmation email? Send the email again now . N ‘), document.querySelector (“. Activation-link”). AddEventListener (“click”, sendVerificationEmail))} function sendVerificationEmail () {let e = document.querySelector (“. Coral-talk -verify-address” ); return fetch (`https: // $ {window.location.host} / _user / verification-email? user_id = $ {auth0.getUserID ()}`, {method: “GET”, headers: {“Content-Type” : “application / json”}}). Then (e => e) .then (t => {t&&200 == t.status? E.innerHTML = “Confirmation email was sent successfully”: e.innerHTML = `$ {t.statusText}`}) . catch (e => console.log (e))} Function tryScriptEmbedding (e, t) {initVerificationMessage (), hasEmbedScriptLoaded? renderComments (t): embeddedScript (t .EMBED_URL, t)} function addVisibilityListener (e, t) {new Visibility.Visible (e, {PreloadThreshold: 750}). On (“Preload”, () => tryScriptEmbedding (e, t))} function removeSignInButton (e) {e&&e.parentNode&&dom.removeElement (e)} function (e) {const init Talk -Host “), i =` $ {t} / static / embedded.js`, n = `http: // $ {document.documentElement.getAttribute (” data-uri “)}. html`, a = “true” === e.getAttribute (“data-care”), o = -1! == n.indexOf (“@ published”), r = e.querySelector (“. coral-talk-container”), s = e.querySelector (“. coral-talk-btn-signin”), c = {CORAL_TALK_HOST : t, EMBED_URL: i, commentStreamContainer: r, signInButton: s, TALK_ASSET_URL: n} ;! “, () => auth0.showLogin ()), auth0.isAuthenticated () &&removeSignInButton (s)}), auth0.on (” login “, t => {removeSignInButton (s), getAuthToken (t), visibility.isElementInViewport (e) &&attemptScriptEmbedding (c), hasCoralTalkRendered&&coralLogin ()}), auth0.on (“logout”, () => {store.remove (TALK_AUTH)})} module.exports = init;
}, {4: 4, 5: 5, 7: 7, 137: 137}];
window.modules [“choreographer.client”] = [function (required, module, export) {“use strict”; const cookie = required (63), _ get = require (9), _ omit = require (95), {insertSpeedBumpComponents: insertSpeedBumpComponents} = require (99), {insertNewsletterSpeedBumpComponents: insertNewsletterSpeedBumpComponents} = require (100), {generateGrowl: generateGrowl } = require (98), gtm = require (3), {getLocalStorage: getLocalStorage, setLocalStorage: setLocalStorage: setLocalStorage: setLocalStorage: setLocalStorage: setLocalStorage: setLocalStorage: setLocalStorage: setLocalStorage: setLocalStorage 45), require moment = require (50), {getClientHistory: getClientHistory, updateClientHistoryWithPageData: updateClientHistoryWithPageData} = require (101), auth0 = require (7), {scenario: scenario} = require (96), cidReadyEvent = “nymcid-set”, cidKey = “nymcid”, isProduction = require (8) (), logger = require (94) .Logger (() => getLocalStorage (“show_choreographer_logs”)), {Verdon: Verdon} = require (97), TEST_COHORT_FLAG = “optimizeCohort” ; Function displayDebug (e = “”) {if (“Permission”! == e.split (“#”). Pop ()) return; const t = _get (window, “dataLayer [0] .userDetails”, {}), o = _get (window, “dataLayer [0] .pageDetails.featureTypes”, “”), n = o.includes (“magazine” )? “magazine”: “”, r = o.includes (“feature”)? “Featured”: “”, i = “Value of the article:” (n || r || “Article”), a = _get (JSON.parse (localStorage.getItem (“auth0: profile”)), “http: //nymag.com / app_metadata “), l =” Authentication status: “(a?” authenticated “:” not authenticated “), s =” authorization status: “(!! a&&a.has_subscription?” with the title “:” unentitled “), c = Object .keys (_omit (t,” newYorkMediaUserID “)). map (e => `$ {e}: $ {t [e]}`), d = document.body, g = document.createElement (“div”), u = document.createElement (“ul”); [i, l, s, … c] .map (e => {const t = document.createElement (“li”); return t.classList.add (“debug-item”), t.appendChild (document .createTextNode (e)), t}). forEach (e => {u.appendChild (e)}), u.classList.add (“data-bullets”), g.classList.add (“Debug Choreographer”), g.classList.add (“Debug- Show data “), g.appendChild (u), d.appendChild (g)} Function initializeChoreographer (e) {const t = e.getAttribute (” data-site-slug “), o = pageShouldCountAsView (t), n = auth0.isSubscribe r (); return t? getClientId (cidKey, 8e3) .then (e => (logger.h1 (“Choreographer initialized”)), logger.log (`clientId: $ {e}`), logger.log (`page counts as view: $ { o} `), window.nymViewsResponse || (o? updateClientHistoryWithPageData (e, t): getClientHistory (e)))). then (r => {if (logger.group (), logger .h2 (“Client history”), logger.table (r), logger.groupEnd (), isNCR ()) return; const {scenarios: i, touts: a, testCohort: l = “”} = readJSONFromScript (e. querySelector (“script”)); if (! (l === (document.body.dataset [TEST_COHORT_FLAG] || “”))) return; const s = i.map (e => scenario (Object.assign ({}, e, {history: r, siteSlug: t, isSubscriber: n}))). filter (e => (logger.group (), logger.h2 (“Evaluate scenarios”), logger.log (e), logger.groupEnd (), e.shouldShow)). redu ((e, {action: t, min: o, number: n}) => {const r = a.find (({value: e}) => e === t); return r? (e [r.type] = r, e [r.type] .viewCount = no, e) : e}, {}); logger.group (), logger. h2 (“Active Touts”), logger.log (s), logger.groupEnd (), executeTouts (e, o, s, r)}). catch (console.error): console.error (“siteSlug not found.”)} function documentInclud esComponent (e) {return document.querySelector (`[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: r.Feature || 0, magazineArticleCount: r.Magazine || 0, standardArticleCount: r.Article || 0, totalArticleCount: r.total || 0}, a = window.concertAds, l = window.ConcertAds; if (o [“Speed-Bump”] && (_get (a, “adsBlocked”,! 0)? insertSpeedBumpComponents (findTemplate (e, “Speed-Bump”), o [“Speed-Bump”], i): a .lifecycle.listenAndPlayback (l.events.slotsInserted, () => {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): a.lifecycle. listenAndPlayback (l.events.slotsInserted, () => {insertNewsletterSpeedBumpComponents (findTemplate (e, “ne wsletter-speed-batch”), o [“newsletter-speed-ramp”], i)})), o [“branded -growl “] &&brandedTakeoverTime (o [” branded-growl “]) &&t) return logger.log (” should show brand growl “), void growlManager (findTemplate (e,” brand growl “), {baseTrackingData: body: o [“brand growl”]. brandedGrowlBody, contentClass: “brand content”, cta : o [“Branded-Growl”]. BrandedGrowlCTA, imageUrl: o [“Branded-Growl”]. ImageUrl, Link: o [“Branded-Growl”]. BrandedGrowlLink, Name: o [“Branded-Growl”]. Name, scrollDepth: o [“Branded-Growl”]. BrandedGrowlScrollDepth, title: 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 / coronavirus news | pivot | paywall exclude / i.test (window._nymGtmPage.tags)? void (isProduction&&logger.log (“Content Cliff no-op due to excluded tag matc h:”, window._nymGtmPage.tags)): 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 growls”]); else {if (! o [“Warning-Growling-2”]) return o [“Warning-Growling”] &&shouldWarn ()? (setContentCliffWarningDisplayed (), logger.log (“should show warning”), void growlManager (findTemplate () e, “warning-growl”), {contentClass: “warning-content”, title: o [“warning-growl”] . warningGrowlTitle, Name: o [“Warning-growl”]. Name, scrollDepth: o [“Warning-growl”]. warningGrowlScrollDepth, cta: o [“Warning-growl”]. warningGrowlCTA, body: o [“Warning-growl “]. warningGrowlBody, Link: 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-Gro “wl”]. Name, scrollDepth: o [“Promo-Growl”]. PromoGrowlScrollDepth, cta: o [“Promo-Growl”]. PromoGrowlCTA, body: o [“Promo-Growl”]. PromoGrowlMessage, Link: o [“promo-growl”]. promoGrowlLink, baseTrackingData: i, toutType: “promo growl”}, “# growl-message”)}} Function shouldWarn () { return! contentCliffWarningDisplayed ()} function getContentCliffWarningDisplayedKey () {const e = new Date, t = e.getMonth (); return`content-cliff-warning-displayed – $ {e.getFullYear ()} – $ {t} `} Function contentCliffWarningDisplayed () {const e = getContentCliffWarningDisplayedKey (); return “true” === getLocalStorage (e)} function setContentCliffWarningDisplayed () {const e = getContentCliffWarningDisplayedKey (); return} function, “growl”) (e) 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 `; return document.createRange (). createContextualFragment (e)} (), p = {creative: i, id: c, name: n, position: “growl”}; u.querySelector (“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: i.total || 0, standardArticleCount: i.Article || 0, featureArticleCount: i.Feature || 0, magazineArticleCount: i.Magazine || 0}, {contentCliffBody: l} = t, s = document.importNode (e,! 0) .querySelector (“. Content-cliff”), c = document.querySelector (“. Article-content> .clay -agraph” ), d = {creative: l, id: “content cliff”, name: “Content Cliff”, position: “in-article”}; s&& (c.insertAdjacentHTML (“afterend”, s.outerHTML), require (“content-cliff.client”) (document.querySelector (“. content-cliff”), {contentCliffOptions: t, viewsLeft: o, firstVisit: number (r), onShow: () => PromotionReport (“view”, a, d), onClickCliff: () => PromotionReport (“click”, a, d)})}} Function ion verdonFosseToutSetter (e, t, o , n, r) {const i = new Verdon ({Container: “.paywall-reader-interface”, URL: “https://fosse.nymag.com/fosse/v1.6.1 /index.html”}), a = e.type, l = {email: auth0.getEmail (), isAuthenticated: auth0.isAuthenticated (), isSubscriber: auth0.isSubscriber ()}; n.classList.add (a), i.once (“frame: ready “, () => {i.sendMessage (” tout: show “, {readerState: l, toutType: a, toutData: e}), r&&i.sendMessage (” frame: height “))}), i.on (“tout: visible”, () => {PromotionReport (“View”, t, o)}), i.on (“tout: sign-in”, () => {auth0 .showLogin (window.location. href)}), i.on (“tout: log-out”, () => {auth0.logout ()}), i.on (“tout: dismissed “, () => {n.classList.add (” dismissed “), i.sendMessage (” tout: hide “, {toutType: a, toutData: e})}), i.on (” tout: subscribe ” , () => {e.ctaLink = replaceQueryParams (e.ctaLink), PromotionReport (“Click”, t, o), window.open (e.ctaLink, “_ ​​blank”)}), i.on ( “frame: height”, e => {n.style.height = `$ {e.payload.currentHeight 10} px`}), i.on (” tout: view-account “, () => {window. location.href = “https: / /subs.nymag.com/account”♀))Function promotion onReport (e, t, o) {const {creative: n, id: r, name: i, position: a} = o ; t.event = `eec.promotion $ {e}`, t.ecommerce = {promoView: {Promotions: [{Creative: n.trim (), ID: r, Name: i, Position: a}]}}, gtm.reportNow (t), reportPaywall ({Creative: n.trim (), eventType: e, id: r, name: i, position: a})} function babyGrowl (e, t, o) {const n = document .importNode (e,! 0) .querySelector (“. paywall-reader-interface”), r = {creative: o.babygrowlDescription, id: “Baby Growl”, Name: “Baby Growl”, Position: “Growl”} ; document.body.appendChild (n), o.ctaLink = o.babygrowlCtaLink, o. ctaText = o.babygrowlMessage, o.headline = o.babygrowlDescription, verdonFosseToutSetter (o, t, r, n)} Function cliffTakeover (e, t , o): a, cliffTakeoverPromo: l, cliffTakeoverStatus: s, type: c} = o, d = document.importNode (e,! 0) .querySelector (“. paywall-reader-interface”), g = document.querySelectorAll (“. Sound paragraph”), u = {Creative: l, ID: “Content Cliff”, Name: “Content Cliff”, Position: “Growl”}, p = {cta: n, ctaLink: r, Description: i, image: a, promo: l, status: s, type: c}; document.body.appendChild (d), g.forEach ((e, t) => {0! == t&&e.remove ()}), verdonFosseToutSetter (p, t, u, d,! 0), document.querySelector (“html”). style.overflowY = “hidden”, document.body.style.position = “fixed”} function warningGrowl (e, t, o) {const {type: n, warningGrowl2CTA: r, warningGrowl2CtaLink: i, warningGrowl2Description: a, warningGrowl2Image: l, warningGrowl2Promo: s, warningGrowl2Status: c} = o, d = document.importNode (e,! 0) .querySelector (e,! 0). “.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, status: c, type: n}; document.body.appendChild (d), verdonFosseToutSetter (u, t, g, d,! 0)} function getClientId (e = “”, t = 8e3) {let o = cookie.get (e); return o? Promise.resolve (o): new promise ((o, n) => {const r = setTimeout (() => {n (`) key could not be found: $ {e} on cookie after $ {t} ms `)}, t); window.addEventListener (cidReadyEvent, () => {clearTimeout (r), o (cookie.get (e))})})} function readJSONFromScript (e) {try {return JSON.parse (e.innerHTML)} catch ( e) {return {touts: [], scenarios: []}}} function findTemplate (e, t = “”) {const o = e&&e.querySelector (`[data- template-id =” $ {t} “] `); return o&&o.content} function isNCR () {return / [? &] source = ncr / .test (location.search)} function brandedTakeoverTime (e) {const {startTime: t, endTime: o, startDate: n, endDate: r} = e, i = n.concat (“”, t), a = r.concat (“”, o), l = moment (i), s = moment (a); return moment (). isBetween (l, s)} function optimizeDebugger () {return new promise (e => {const t = window.location.search || “”; if (t) {const o = new URLSearchParams (t), n = o .get (“Optimize attribute name”) || “”, r = o.get (“Optimize attribute value”) || “”, i = o .get (“Optimize-Delay”) || 0, a = o.get (“Optimize-Cookie”) ||! 1; setTimeout (() => {a&& (document.cookie = randomNymcid ()), document. Body.setAttribute (`data – $ {n}`, r), e ( )}, i)} else e ()})} function randomNymcid () {return`nymcid = $ {(() => ([1e7] -1e3 -4e3 -8e3 -1e11) .replace (/ [018] / g, e => (e ^ 16 * crypto.getRandomValues ​​(new Uint8Array (1)) [0] >> e / 4) .toString (16) [0])) ()} `} function replaceQueryParams (e ) {const t = window.location.search || “”; if (t) {const o = new URLSearchParams (t); if (e.includes (“?”)) {const t = e.split (“?”), n = new URLSearchParams (t [1]); for (let e from o.entries ()) n. set (e [0], e [1]); e = `$ {t [0]}? $ {n.toString ()} `} else e =` $ {e}? $ {o.toString ()} `} return e} module.exports = (e => new promise (e => {auth0.on (” init “, () => {e ()})}). then (() => optimizeDebugger ()). then (() => {displayDebug (window.location.href), initializeChoreographer (e)}));
}, {3: 3, 7: 7, 8: 8, 9: 9, 45: 45, 50: 50, 63: 63, 75: 75 94: 94, 95: 95, 96: 96, 97: 97, 98: 98, 99: 99, 100: 100, 101: 101 content-cliff.client “:” content-cliff.client “}];
window.modules [“growl.client”] = [function (required, module, export) {“use strict”; require (161); const _some = require (84), dom = require (4), localStorageKeyRoot = “slideout -“, {getLocalStorage: getLocalStorage, setLocalStorage: setLocalStorage} = require (45); module.exports = ((e, t) => {const {content: o, onShow: s, scrollDepth: r = 50, rejectable: i =! 1} = t, n = number (r || e.getAttribute ( “Data display-on-page scroll percentage”)), a = dom.find (e, “. Modal”), l = “slideout-” (t.id || e.getAttribute (“id”)), c = getLocalStorage (l); function d () {a.classList.add (“hidden”)} function g () {setLocalStorage (l,! 0), d ()} i&&c? e.remove () πŸ™ o&&e .querySelector (“[data content]”). appendChild (o), n&&function (e = 50) {const t = new Inters e => {_ some (e, “isIntersecting”) && (a.style.top = “inherit “, a.classList.remove (” hidden “,” initial “),” function “== typeof s&&s (), t .unobserve (a))}); a.style.top =` $ {document.querySelector ( “body”). scrollHeight / (100 / e)} px`, t.observe (a)} (n), e.querySelector (“. dismissed-modal”). addEventListener (“click”, () => i ? g (): d ()), e.addEventListener (“growl: hide”), d), e.addEventLi stener (“growl: dismiss”, g))});
}, {4: 4, 45: 45, 84: 84, 161: 161}];
window.modules [“speed-batch.client”] = [function (required, module, export) {“use strict”; const gtm = required (3), visibility = required (5); module.exports = ((e, i) => {if (! i ||! e) return; const {name: o, speedbumpDescription: r, speedbumpMessage: t, speedbumpLink: n, baseTrackingData: s} = i, c = new visibility.Visible (e, {shownThreshold: .5}); e.querySelector (“. description”). innerHTML = r, e.querySelector (“. promo-link”). innerHTML = t, e.querySelector ( “. promo-link”) .href = n, e.classList.remove (“reduced”), c.on (“shown”, function () {if (visibility.isElementNotHidden (e)) {let e = s; e.event = “eec. PromotionView”, e.ecommerce = {PromoView: {Promotions: [{Name: o, Creative: r, ID: “Speed ​​Bump”, Position: “In-Article”}]}} , gtm.reportNow (e), c .destroy ()}}), e.querySelector (“. promo-link”). addEventListener (“click”, function () {let e = s; e.event = “eec .promotionClick “, e.ecommerce = {promoClick: {Promotions: [{Name: o, Creative: r, ID:” Speed ​​Bump “, Position:” In-Article “}]}}, gtm.reportNow (e )})});
}, {“3”: 3, “5”: 5}];
window.modules [“newsletter-speed-ramp.client”] = [function (required, module, export) {“use strict”; const {loadRecaptcha: loadRecaptcha} = require (128), _ isEmpty = require (109), _ set = require (129), _ kebabCase = require (103), gtm = require (3), auth0 = require (7), Visibility = require (5), 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) {e.classList.add (t)} Function getRequestUrl (e) {return e.getAttribute (“action”) {const t = e? e.getAttribute (“content”): “”; return _kebabCase (t)} function getPayloadObject (e, t, r, s) {const n = {}; return _set (n, `vars. source _ $ {t}`, `$ {COMPONENT_NAME} _ $ {s}`), n.email = r, n.lists = {}, n.lists [t] =! 0, n.recaptcha = e, n .signuppage = `$ {document.location.href} _ $ {t}`, n [`source _ $ {t}`] = “newsleter_speedbump”, n} module.exports = ((e, t) => {if (! t ||! e) return; if (“success” === window.localStorage.getItem (`$ {LOCAL_STORAGE_KEY_NAME} $ {t.newsletterSpeedBumpNewsletterId}`)) return void e.remove (); const {baseTrackingData: r, name: s, newsletterSpeedBumpCtaCopy: n, newsletterSpeedBumpDescription: i, newsletterSpeedBumpHeadline: a, newsletterSpeedBumpNewsletterId: o, newsletterSpeedBumpThankYouMessage: cE, d = “e.query e.querySelector (“. input.email”), m = e.querySelector (“. error-message”), h = e.querySelector (“. form”), E = e.querySelector (“. Form-container” ), y = e.querySelector (“. Form-recaptcha-container”), g = e.querySelector (“. Headline”), v = e.querySelector (“.container”), S = e.querySelector (“. input.newsletterId “), _ = e.querySelector (“. recaptcha-wrapper “), L = e.querySelector (“. input.submit “), w = e.querySelector (“. text-container “), q = new visibility. Visible (e, {threshold value shown: .5}); u&& (p.removeAttribute (” required “), e.classList.add (” signed- “) in”)) , d.innerHTML = i, g.innerHTML = a, S.value = o, L. value = n, q.on (“shown”, function () {if (visibility.isElementNotHidden (e)) {const e = r; e.event = “eec.promotionView”, e.ecommerce = {promoView: {promotions: [{creative: `$ {a} | $ {i}`, id: “Newsletter Speed ​​Bump”, name: s, Position: “In-Artikel”}]}}, gtm.reportNow (e), q.destroy ()}}), p.addEventListener (“focus”, () => {_. classList.remove (” hidden “)}), h.addEventListener (” submit “, t => {t.preventDefault (); const s = new XMLHttpRequest, n = u | | e.querySelector (“. input.email “). value, i = getPageType (document.querySelector (‘meta [name = “type”]’)); u ||! (n.length> = 50) &&EMAIL_VALID_REGEX. test (n)? loadRecaptcha (l, “newsletterSubmit”,! 0) .then (a => {s.open (“POST”, getRequestUrl (h),! 0), s.setReques tHeader (“Content-Type”, “application / json; charset = UTF-8 “), s.addEventListener (” load “, s => {const a = s.currentTarget || s.target; if (a.status> = 200&&a.statussetClass (e,” Success “)) , [d, E, m, _]. forEach (e => setClass (e, “hidden”)), g.innerHTML = c.replace (“{{email}}”, n), m.innerHTML = ” “; const s = JSON.parse (a.response), l = _isEmpty (s.sailthruIds)?” “: Object.values ​​(s.sailthruIds) [0], u = r; u.event =” eec .purchase “, u.ecommerce = {Purchase: {actionField: {id: l, Sales:” 0.00 “}, Products: [{Category:” Newsletter Registration “, Name: S.Value, Quantity: 1, Variant: `$ {COMPONENT_NAME} – $ {i}`}]}}, gtm.reportNow (u), setTimeout (() => {e.classList.add (“hidden”)}, 5e3), t.preventDefault ()} else m.innerHTML = “* An error has occurred. Please try again.”}), S.addEventListener (“error”, () => {m.classList.remove (“hidden”), m .innerHTML = “* An error occurred. Please try again.”}), s.send (JSON.stringify (getPayloadObject (a, o, n, i))), t.preventDefau lt ()}): m.innerHTML = “* Please enter a valid email address”})});
}, {3: 3, 5: 5, 7: 7, 103: 103, 109: 109, 128: 128, 129: 129}];
window.modules [“content-cliff.client”] = [function (require, module, exports) {“use strict”; const auth0 = require (7), isProduction = require (8) (), logger = require (94 ) .Logger (() =>! IsProduction); module.exports = ((t, e) => {if (! E) return; logger.group (), logger.h2 (“Content Cliff”); const { contentCliffOptions: o, firstVisit: n, onShow: r, onClickCliff: i} = e, c = 300, l = Number (document.querySelector (“[data-components-count]”). getAttribute (“data-components-count “)), u = 3, s = [” taboola “], a =” # content-cliff “, f = t, d = function () {let t = 0; return document.querySelectorAll (” [data-word -count] “). forEach (function (e) {t = Number (e.getAttribute (” data-word-count “) || 0.10) || 0}), t} (), g = function ( t, e) {function o (t) {return Math.round (t.getTime () / 1e3 / 60)} const n = o (t), r = o (e); return no} (new Date, new Date (n)) {}, show: () => {r (), function () {(p = function (t = “”) {return document.querySelectorAll (`$ {t} ~ *`)} ( a)). forEach (t => t.remove ()), function () {const {contentCliffStatus: e, contentCliffPromo: n, contentCliffCTA: r, contentCliffURL: c} = o, l = t.querySelector (“[data -content- cliff-status] “), u = t.querySelector (” [data-content-cliff-promo] “), s = t.querySelector (” [data-content-cliff-cta] “); s&&s.setAttribute (” href”,c),s&&s.insertAdjacentHTML(“afterbegin”,r),l&&l.insertAdjacentHTML(“afterbegin”,e),u&&u.insertAdjacentHTML(“afterbegin”,n),s&&s.addEventListener(“click”,i)} (),f.classList.remove(“collapsed”),e=s,e.forEach(t=>{const e=document.querySelector(`[data-uri*=”/${t}/”]` );e&&e.remove()}),m.addEventListener(“click”,()=>auth0.showLogin());var e}()}}[function(){if(dl)return logger.log( `article word count ${d} was too short for the cliff`),logger.log(`article components count is smaller than ${u} and not eligible for the cliff`),”noop”;if(g&&isProduction)return “noop”;g&&logger.log(`First session check was ${g}! Showing the cliff anyway: isProduction => ${isProduction}`);if(/coronavirus news|pivot|paywall exclude/i.test(window._nymGtmPage.tags))return isProduction&&logger.log(“Content cliff no-op due to excluded tag match: “,window._nymGtmPage.tags),”noop”;return”show”}()],m=t.querySelector(“.content-cliff-login”);let p=[];return logger.log(`should noop in production due to 30-minute first-session window: ${g}`),logger.groupEnd(),auth0.on(“login”,()=>{f.classList.add(“collapsed”),(p=Array.prototype.slice.call(p,0).reverse()).forEach(t=>f.insertAdjacentElement(“afterend”,t)),p=[]}),”function”==typeof h?h():void 0});
}, {“7″:7,”8″:8,”94”:94}];
window.modules [“ad.client”] = [Funktion (erforderlich, Modul, Export) {“use strict”; const _forEach = require (62), _ max = require (64), _ find = require (65), _ contains = require (66), $ visibility = require (5), dom = require (4), 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 = document.querySelector (“. article-content”), n = []; return t&&_forEach ([‘. article-sidebar [data-width = “large”] ‘], Funktion (a) {e = t.querySelectorAll (a), _ forEach (e, Funktion (e) {n.push (e)})}), n} (); Funktion getElementsVerticalOverlap (e, t) { var n = e.getBoundingClientRect (), a = t.getBoundingClientRect (); return! (n.top> a.bottom || n.righta.right)? a.bottom-n.top: 0} Funktion getElementsOverlapAmount (e , t) {var n, a = []; return _forEach (t, Funktion (t) {n = getElementsVerticalOverlap (e, t), a.push (n)}), _ max (a)} Funktion getNYMagAdChannel (e) {var t = “”; switch (e) {case “Unternehmensinformationen”: t = “comp any”;break;case”new york guides & things to do”:t=”to-do”;break;case”other”:t=e;break;case”sponsored guides”:t=”s-guides”;break;case”urbanist”:t=”urbanist”;break;default:t=””}return t}function appendSectionToDfpAds(){var e,t,n,a=document.querySelector(“meta[property=’og:site_name’]”),o=document.querySelector(“article[data-content-channel]”),i=document.querySelectorAll(AD_NAME_SELECTOR);a&&(e=a.content),o&&(t=o.getAttribute(“data-content-channel”).toLowerCase()),t&&”New York Magazine”===e&&(n=getNYMagAdChannel(t)),n&&appendToAdd(i,n)}function appendPageTypeToDfpAds(){let e=document.querySelector(“.body > div”)||{},t=document.querySelector(“body”)||{},n=e&&e.classList,a=n&&n.length?[…n]:[],o=_find(a,e=>e.includes(“feature”)),i=document.querySelectorAll(AD_NAME_SELECTOR);n&C SSEANDCHAR(o?appendPageNumberPositionToDfpAds(i,”Feature “):n.contains(“lede-gallery-content”)?appendPageNumberPositionToDfpAds(i,”Image_Gallery”):t.classList.contains(“one-column-layout”)?appendPageNumberPositionToDfpAds(i,”One_Column_Article”):n.contains(“article-content”)&&appendPageNumberPositionToDfpAds(i,”Standard_Article”))}function appendPageNumberPositionToDfpAds(e,t){const n=[“528×379″,”1100×200″,”1×1”];let a=e||[],o=dom.find(“.ad-splash”),i=dom.find(“section.wrapper”),r=dom.find(“.secondary”),d=dom.find(“.bottom”),s=dom.find(“.primary”),c={IA:{xsMobile:{normal:1,grid:1},mobile:{normal:1,grid:1},tablet:{normal:1,grid:1},desktop:{normal:1,grid:1}},BA:{xsMobile:{normal:1,grid:1},mobile:{normal:1,grid:1},tablet:{normal:1,grid:1},desktop:{normal:1,grid:1}}};a.forEach(e=>{let a,l=””,u=e.dataset.sizes,m=e.classList.value,p=_find(n,e=>u.includes(e)),g=e.parentElement.classList.contains(“image-gallery-mobile-grid-ad”);if(u&&!p||e.setAttribute(” data-name”,e.getAttribute(“data-name”) “/” t),iCSSEANDCHA R&u&&!p){let n,u;if(o&&o.contains(e)?l=”LB”:i&&i.contains(e)?l=”IA”:(r&&r.contains(e)||d&&d.contains(e)||s&&s.contains(e))&&(l=”BA”),c[l]){if(!(u=checkForAdViewport(m)))return;g?(n=c[l][u].grid,c[l][u].grid ):(n=c[l][u].normal,c[l][u].normal ),a=n{e.setAttribute(“data-name”,e.getAttribute(“data-name”) “/” t)})}function injectGoogleScripts(){var e=document.createElement(“script”),t=document.createElement(“script”),n=document.createDocumentFragment();e.src=”//www.googletagservices.com/tag/js/gpt.js”,e.async=”async”,t.src=”//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js”,t.async=”async”,n.appendChild(e),n.appendChild(t),document.getElementsByTagName(“body”)[0].appendChild(n)}appendSectionToDfpAds(),appendPageTypeToDfpAds(),injectGoogleScripts(),DS.controller(“ad”,[“adServic e”,function(e){return function(t){var n,a,o,i=t.getAttribu te(“data-offload”),r=new $visibility.Visible(t,{preloadThreshold:i?window.innerHeight/4:200}),d=!1;function s(){window.innerWidth>=1180&&t.parentElement.classList.contains(“ad-repeat”)&&flaggedComponentsOnPage.length&&(a=getElementsOverlapAmount(t,flaggedComponentsOnPage),o=parseInt(t.parentElement.getAttribute(“data-gap”),10),t.style.marginTop=o 30 a “px”)}function c(){s(),e.refresh(n)}function l(){e.remove(n),d||(d=!0,r.on(“shown”,c))}document.querySelector(‘script[data-name=”concert-ads”]’)||(n=e.create(t),r.preload&&$visibility.isElementNotHidden(t)?(e.addToPageLoadQueue(n),i&&r.on(“hidden”,l)):(r.on(“preload”,function(){!n.slot&&$visibility.isElementNotHidden(t)&&(s(),e.load(n))}),i&&r.on(“hidden”,l)),this.adData=n)}}]);
}, {“4”: 4, “5”: 5, “62”: 62, “64”: 64, “65”: 65, “66”: 66}];
window.modules [“sticky-list.client”] = [Funktion (erforderlich, Modul, Export) {“use strict”; const dom = required (4), $ gtm = required (3), _ get = required (9), stickyContainer = require (“sticky-container.client”); DS.controller (“sticky-list”, [“$ window”, Funktion (t) {var e = require (239), i = 40; function s ( s) {sei n, r = Funktion (t) {sei s = t [0], n = 0, r = e.Höhe (this.contentArea), h = this.contentArea.offsetHeight; if (this.containers&&this. container.length) {if (s.target.offsetHeight) {let t = this.breakouts.findIndex (t => (Funktion (t, e) {return t! == document.body&&t.contains (e)}) ( t, s.target.parentElement)); if (t> -1&&this.breakouts [t]) {let e = this.breakouts [t] .offsetHeight i; this.containers [t] .style.marginBottom = `$ { e} px`}} if (h! == this.currentHeigh) {const t = e.rect (this.rightRail, this.contentArea); this.currentHeight = h, this.rightRail.style.height = rt.top -a (this.rightRail) “px”, this.breakouts.forEach ((s, r) => {let a = e.rect (s, this.contentArea), h = e.intersection (a, t); wenn (h) {sei e, s = h.top-t. top-n;n =s h.height i,this.containers[r].style.height=`${s}px`,this.containers[r].s tyle.minHeight=`${s}px`,e=this.breakouts[r].offsetHeight i,this.containers[r].style.marginBottom=`${e}px`}})}}}.bind(this);t.innerWidth{let n=_get(e,”dataset.name”,””),r=n.slice(-1)||”1″,a=[“Image_Gallery”,”Standard_Article”,”Feature”,”One_Column_Article”].find(t=>n.includes(t))||””;this.rightRail.parentElement.classList.contains(“tertiary”)&&a&&(e.dataset.name=parseInt(i,10) se===t)||0;return i.slice(s 1).reduce((t,e)=>t (e.offsetHeight||0),0)||0}return s.prototype={setPins:function(){const t=e.rect(this.rightRail,this.contentArea),i=e.height(this.contentArea),s=i-t.top-a(this.rightRail);let n,h,o,l;if(this.populatePinsList(),s1&&t.classList.add(“multi-children”),l=0;l{const t=Array.from(e.children);let o,a,i=0;for(;i{handleLazyLoad(a)});
}, {“4”: 4, “117”: 117}];
window.modules [“article.client”] = [function (required, module, export) {“use strict”; const $ visibility = required (5), $ gtm = required (3), ImageZoom = required (78), $ sentry = require (79); DS.controller (“article”, [function () {var e = 40; function t (t) {const i = document.querySelector (“. Wrapper> .tertiary”), n = t.querySelector (“. Lede- image-wrapper.full-bleed “), r = t.querySelector (“. attribution.full-bleed “), o = t.querySelector (“. article-header “), l = o? o.querySelector (” img “): null, c = function () {let t = o.getBoundingClientRect (). height; n&& (t = n.getBoundingClientRect (). height 25, r&& (t = r.getBoundingClientRect () .height)), i .style.paddingTop = te “px”}; i&&o&& (window.innerWidtht (e)), document.addEventListener (“closeBanner”, function () {i (e)}), $ sentry .initializeIDListeners ()}}]) ;
}, {3: 3, 5: 5, 78: 78, 79: 79}];
window.modules[“tags.client”] = [function(require,module,exports){“use strict”;const _forEach=require(62);DS.controller(“tags”,[function(){function e(e){this.el=e}return e.prototype={events:{“a.more click”:”showAll”},showAll:function(e){var t=e.target,o=this.el.querySelectorAll(“li.hidden”);_forEach(o,function(e){e.classList.remove(“hidden”)}),t.parentNode.removeChild(t),e.preventDefault()}},e}]);
}, {“62”:62}];
window.modules [“newsletter-flex-text.client”] = [function (required, module, export) {“use strict”; const dom = required (4), _ kebabCase = required (103), _ isEmpty = required (109)), _ set = require (129), permutive = require (75), cmptName = “newsletter-flex-text”, {loadRecaptcha: loadRecaptcha} = require (128), gtm = require (3), 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,})) $ /,MAX_EMAIL_LENGTH=50;DS.controller(cmptName,[“$window”,function(e) Genealogie function t ( t) {this.el = t, this.email = dom.find (t, “. Email”), this.title = dom.find (t, “. title”), this.description = dom.find (t , “. description”), this.source = dom.find (t, “. source”), this .form = dom.find (t, “. form”), this.returnMsg = dom.find (t, ” . return-message “), this.newsletterId = dom.find (t,”. newsletterId “). value, this.expandedTerms = dom.find (t,”. expanded-Terms “), this.recaptchaKey = this.form .dataset.recaptchaPublicKey , this.local = e.localStorage, this.session = e.sessionStorage, this.api Endpoint = this.form.dataset.post, this.displayComponent ()} return t.prototype = {getPageType: function () {var e = dom.find (‘meta [name = “type”]’), t = e e.getAttribute (“content”): “”; return _kebabCase (t)}, getPayloadObject: function (e) {var t = {}; return t.email = this.email.value, t.recaptcha = e, _set (t, `vars.source _ $ {this.newsletterId}`, `$ {cmptName} _ $ {this.getPageType ()}`) , t.lists = {}, t.lists [this.newsletterId] =! 0, t}, displayComponent: function () {var t = this, s = “success” === this.local [“signUpColumnStatus” this.newsletterId.toString ()], i = “true” === this. form.getAttribute (“data display after login”); if (! s || i) {if (this.el.classList.remove (“initially hidden”), this.form.classList.remove (“initially hidden”), setTimeout (function () {t.el.classList .remove (“opacity-zero”)}, 100), this.session) try {this.session.setItem (“signUpColumn”, “displayed”)} catch (e) {}} else t.el.parentElement.classList .add (“newsletter reduced”); e.addEventListener (“unload”, function () {t.session.removeItem (“signUpColumn”)})}, events: {“. form submit”: “submitForm”, “. email keypress”: “clearMsg”, “. Terms button click”: “showTerms”}, clearMsg: function () {this.returnMsg.innerHTML = “”}, showTerms: function () {this.expandedTerms. classList.add (“active”), this.expandedTerms.setAttribute (“aria-hidden”, “false”)}, submitForm: function (e) {let t = this.form.getAttribute (“data-error-msg” )); e.preventDefault (), this.email.value.length> = 50 ||! EMAIL_VALID_REGEX.test (this.email.value)? (t&& “”! == t || (t = “* Please enter a valid email”), this.returnMsg.innerHTML = t, this.returnMsg.focus ()): loadRecaptcha (this.recaptchaKey, ” newsletterSubmit “,! 0) .then (e => fetch (this.apiEndpoint, {method:” POST “, header: {” Content-Type “:” application / json “}, body: JSON.stringify (this.getPayloadObject (e))}). Then (e => e.json ()). Then (e => {e&&e.ok? this.successHandle (e): this.errorHandle ()}). catch (e => this .errorHandle (e))}, reportGTM: function (e) {const t = _isEmpty (e.sailthruIds)? “”: Object.values ​​(e.sailthruIds) [0]; let s = {event: “eec .purchase “}; s.ecommerce = {purchase: {actionField: {id: t, Revenue:” 0.00 “}, products: [{Category:” Newsletter registration “, number: 1, name: this.newsletterId.toString (), Variant: `$ {cmptName} – $ {this.getPageType ()}`}]}}, gtm.reportNow (s)}, errorHandle: function (e) {this.returnMsg.classList.add (“error “), this.returnMsg.innerHTML = e ||” An error occurred n. Please try again. “, This.returnMsg.focus ()}, successHandle: function (e) {let t = this, s = this.form.getAttribute (” data-success-title-msg “), i = this. Form.getAttribute ( “data-success-description-msg”); if (s&& “”! == s || (s = “Thank you, you’re done!”), i&& “”! == i || (i = “You get the next newsletter in your inbox. “), window.fbq&&window.fbq (” track “,” Lead “), permutive.reportNewsletterSubscribe ([this.newsletterId]), this.reportGTM (e), this.title.innerHTML = s , this.description.innerHTML = i, this.returnMsg.focus (), this.el.classList.add (“success”), setTimeout (function () {t.el.classList. add (“opacity-zero”) , setTimeout (function () {t.el.classList.add (“initially hidden”), t.el.parentElement.classList.add (“newsletter-collapsed”)}, 1e3)}, 5e3), this.local) try {this.local.setItem (“signUpColumnStatus” this.newsletterId.toString (), “success”)} catch (e) {}}}, t}]);
}, {3: 3, 4: 4, 75: 75, 103: 103, 109: 109, 128: 128, 129: 129}];
window.modules[“memo-pixel.client”] = [function(require,module,exports){“use strict”;(()=>{var e=document.createElement(“script”);e.async=!0,e.type=”text/javascript”,e.src=document.location.protocol “//d16xpr36wrmcmk.cloudfront.net/js/memo.js”,(document.getElementsByTagName(“head”)[0]||document.getElementsByTagName(“body”)[0]).appendChild(e)})(),module.exports=(()=>{});
}, {}];
window.modules [“Affiliate-Links.client”] = [Funktion (erforderlich, Modul, Export) {“use strict”; const dom = required (4), _ contains = required (66), _ StartsWith = required (70), globalClick = require (69), visit = require (68), productSubtags = require (71); var excludedHostnames, skimlinksBaseUrl, skimlinksId, visitState, productUrl, ignoreDataAttribute = “Data-Affiliate-Links-Ignore”, Article = Window.Document. querySelector (“article”), isSponsored = article&& “Sponsor Story” === article.getAttribute (“Datentyp”); Function setExcludedHostnames (t) {excludedHostnames = (t.getAttribute (“Data excluded host names”) | | “”). toLowerCase (). split (“,”)} Funktion isSkimLink (t) {return !! (skimlinksId = t.getAttribute (“data-skimlinks”))} Funktion isExcluded (t) {return _includes (ausgeschlossenHostnames , t) || _startsWith (t, “www.”) &&_includes (ausgeschlossenHostnames, t.slice (4)) || isSponsored} function isUrlProtocol (t) {return 0! == t.indexOf (“mailto:”) &&0 ! == t.indexOf (“javascript:”)} Funktion getTargetHostname (t) {return (t.ho. stname||t.host||t.href||””).toLowerCase()}function convertSkimlinkUrl(t){return(skimlinksBaseUrl=skimlinksBaseUrl||skimlinksId?”//go.redirectingat.com/?xs=1&id=” skimlinksId “&sref=” encodeURIComponent(window.location.href) “&url=”:void 0)&&skimlinksBaseUrl encodeURIComponent(t)}function hasIgnoreAttribute(t){return”true”===t.getAttribute(ignoreDataAttribute)}function convertSkimlink(t){var e,i,r,s=dom.closest(t.target,”a”),n=s&&s.href;n&&n.length&&!t.defaultPrevented&&(i=getTargetHostname(s),!isUrlProtocol(n)||isExcluded(i)||hasIgnoreAttribute(s)||productSubtags.getAffiliate(n)||(e=convertSkimlinkUrl(n))&&(productUrl=n,r=s&&s.getAttribute(“data-track-id”),s.href=productSubtags.ensureSubtag({url:e,productId:r,visitState:visitState,anchorEl:s})) )}function revertSkimLink(t){var e=dom.closest(t.target,”a”),i=e&C SSEANDCHARe.href||””;i.includes(skimlinksBaseUrl)&&i&&i.length&&productUrl&&(e.href=productUrl)}module.exports=(t=>{const e=isSkimLink(t);visit.onceReady(function(t){visitState=t}),e&&(setExcludedHostnames(t),globalClick.addHandler(convertSkimlink,revertSkimLink))});
}, {“4”: 4, “66”: 66, “68”: 68, “69”: 69, “70”: 70, “71”: 71}];
window.modules [“gtm.client”] = [Funktion (erforderlich, Modul, Export) {“use strict”; const $ gtm = required (3); DS.controller (“gtm”, [function () {return function (t) {$ gtm.init (t.getAttribute (“data container ID”), t.getAttribute (“data site slug”))}}] );
}, {“3”: 3}];
window.modules [“global-nav.client”] = [Funktion (erforderlich, Modul, Export) {“use strict”; const dom = required (4), auth0 = required (7), signInButton = dom.find (“.user-signin”), signOutButton = dom.find (“. user-signout”), globalNav = dom.find (‘ [class ^ = “global-nav”] ‘), body = dom.find (“body”)), dropdownItems = dom.findAll (“. dropdown-wrap”), gtm = require (3), pageUri = require ( 157). GetPageUri (); function closeDropdowns (e) {let n = globalNav.querySelectorAll (“. dropdown .open “); dropdownItems.forEach (Funktion (t) {let o = t.querySelector (“. dropdown “);! n || t.contains (e.target) &&27! == e.keyCode || o. classList.remove (“open”)})} Funktion gtmSendReport (e, n, t) {let o = {eventCategory: “ecommerce”, eventAction: “componentClick”, Marke: e, Dimension23: “global-nav”, Liste : pageUri, pageZone: “header”, Variante: “nav-link”}; “global-nav-link” === t&& (o.eventLabel = n.href), gtm.reportNow (o)} function init (e ) {auth0.on (“init”, () => {signInButton.addEventListener (“click”, Funktion (e) {e.preventDefault (), auth0.showLogin ()}), signOutButton.add EventListener (“click”, Funktion (e) {e.preventDefault (), auth0.logout (), gtmSendReport (“Abmelden”, e.target, “Benutzerinfo-Link”)}), auth0.isAuthenticated () &&e.classList.add (“angemeldet”), auth0.isSubscriber () &&e.classList.add (“abonniert”), e.querySelectorAll (“. User-link”). ForEach (e => {e.classList .add (“active”)})}), auth0.on (“login”, () => {e.classList.add (“angemeldet”), auth0.isSubscriber () &&e.classList.add (” abonniert “)}), auth0.on (” logout “, () => {e.classList.remove (” angemeldet “), e.classList.remove (” abonniert “)})} dropdownItems.forEach (Funktion (e) {e.addEventListener (“click”, function () {e.querySelector (“. dropdown”). classList.toggle (“open “)})}), body.addEventListener (“click”, closeDropdowns), document.addEventListener (“keydown”, closeDropdowns), globalNav.addEventListener (“click”, Funktion (e) {let n = e.target; n.classList.contains (“global-nav-track”) &&gtmSendReport (n.text , n, “global-nav-link”)}), module.exports = init;
}, {3: 3, 4: 4, 7: 7, 157: 157}];
window.modules[“aaa-module-mounting.legacy”] = [function(require,module,exports){“use strict”;const eventify=require(185),_pickBy=require(160),_each=require(320),fingerprintjs2=require(319),DS=require(318);function registerGlobals(){window.DS=DS,window.Eventify=eventify,window.Fingerprint2=fingerprintjs2,DS.value(“Eventify”,eventify),DS.value(“Fingerprint2”,fingerprintjs2),DS.value(“$document”,window.document),DS.value(“$window”,window)}function mountDollarSliceComponents(){DS.service(“components”,[“$document”,”$module”,function(e,n){var r=_pickBy(n.definitions,e=>e.providerStrategy===n.providers.controller),o=Object.keys(r);function t(e){return r=>{try{n.get(e,r)}catch(e){logMountError(r,e)}}}_each(o,n=>{var r=e.querySelectorAll(‘[data-uri*=”/_components/’ n ‘/”]’),o=e.querySelectorAll(‘[data-uri$=”/_components/’ n ‘”]’);_each(r,t(n)),_each(o,t(n))}),this.components=o}]),DS.get(“components”)}function logMountError(e,n){const r=e.outerHTML.slice(0,e.outerHTML.indexOf(e.innerHTML));console.error(“Error attaching controller to ” r,n)}registerGlobals(),document.addEventListener(“DOMContentLoaded”,()=>{mountDollarSliceComponents()});
}, {“160″:160,”185″:185,”318″:318,”319″:319,”320”:320}];
window.modules[“ads.legacy”] = [function(require,module,exports){“use strict”;const _map=require(72),_forEach=require(62),_isString=require(204),_intersectionWith=require(321),_isEqual=require(210),_each=require(320),_debounce=require(120),_sortBy=require(143),page=require(157),visit=require(68);DS.service(“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=visit.getQueryParamsObject([“utm_campaign”]),w=document.querySelector(‘script[data-type=”ad-a9″]’);document.querySelector(‘script[data-name=”concert-ads”]’)||(i.NYM={},i.NYM.analytics={},i.NYM.analytics.adStartTime=i.performance.now(),i.googletag=i.googletag||{},i.googletag.cmd=i.googletag.cmd||[],c=i.googletag,w&&(i.googletag.cmd=i.googletag.cmd||[],i.googletag.cmd.push(function(){i.googletag.pubads().disableInitialLoad()}),l=i.setInterval(function(){void 0!==window.apstag&&void 0!==window.apstag.timeout&&(i.cle arInterval(l),window.apstag.cleared=!0,l=null)},10),setTimeout(function(){l&&(i.clearInterval(l),i.googletag.pubads().refresh(),window.apstag||console.log(“MESSAGE: Timeout for A9 load exceeded, aborting”))},500)),u=document.createElement(“script”),g=document.createDocumentFragment(),p=document.getElementsByTagName(“head”)[0],u.src=”https://z.moatads.com/voxprebidheader841653991752/moatheader.js”,g.appendChild(u),p.insertBefore(g,p.firstChild),o=function(e){var t,a,o=e.data,n=[];return o.loaded?e:(o.loaded=!0,t=null,(t=o.sizes?c.defineSlot(o.name,o.sizes,o.id).addService(c.pubads()):c.defineOutOfPageSlot(o.name,o.id).addService(c.pubads())).setTargeting(“adid”,o.id),b.hasOwnProperty(“utm_campaign”)&&t.setTargeting(“utmcamp”,b.utm_campaign),a=h.getAdCount(o.label),t.setTargeting(“label”,o.label “_” o.site “-” a),c.display(o.id),c.pubads().addEventListener(“slotOnload”,function(){i.NYM.analytics.firstAdLoadTime||(i.NYM.analytics.firstAdLoadTime=i. p erformance.now(),i.NYM.analytics.firstAdLoadLabel=e.data.label)}),(n=v(o))?window.apstag&&window.apstag.cleared&&window.apstag.fetchBids({slots:[n],timeout:window.apstag.timeout},function(){c.cmd.push(function(){window.apstag.setDisplayBids(),c.pubads().refresh([t],{changeCorrelator:!1})})}):c.pubads().refresh([t],{changeCorrelator:!1}),e.slot=t,e)},n=function(e){var a,i,o,n=t(),s=e.getAttribute(“data-name”),r=e.getAttribute(“data-sizes”),d=e.getAttribute(“data-label”),c=e.getAttribute(“data-site”);n=e.id,r&&r.length?(r=r.split(“,”),a=[],_map(r,function(e){e=e.split(“x”),i=parseInt(e[0]),o=parseInt(e[1]),a.push([i,o])})):(e.classList.add(“oop”),a=!1),this.data={id:n,name:s,sizes:a,loaded:!1,label:d,site:c},m[n]=this},r=function(e){c.cmd.push(function(){var t=o(e);m[e.data.id]=t})},s=function(e){var t=[];e.slot?(t=v(e))&&window.apstag&&window.apstag.cleared&&window.a ps tag.fetchBids({slots:[t],timeout:window.apstag.timeout},function(){c.cmd.push(function(){window.apstag.setDisplayBids(),c.pubads().refresh([e.slot],{changeCorrelator:!1})})}):e&&r(e)},c.cmd.push(function(){var e,t,o,n=page.getMeta(“article:tag”),s=page.getMeta(“author”),r=i.location.href,d=(e=a.head.querySelector(“.head-gtm”),t=a.body.querySelector(“.gtm”),e&&”top”===e.getAttribute(“data-gtm”)?”gtmtop”:t&&”bottom”===t.getAttribute(“data-gtm”)?”gtmbottom”:””);o=[],_forEach([n,s,d],function(e){_forEach(e.split(“,”),function(e){(e=e.trim().toLowerCase().replace(/s/g,”-“).replace(/’|’/g,””)).length&&o.push(e)})}),c.pubads().setTargeting(“kw”,o),c.pubads().setTargeting(“entry_group”,o),r=r.slice(r.lastIndexOf(“/”) 1),c.pubads().setTargeting(“pn”,r),c.companionAds().setRefreshUnfilledSlots(!0),c.pubads().enableAsyncRendering(),c.enableServices()}),this.load=r,this.create=function(e){return new n(e)},this.re fre sh = Funktion (e) {var t; _isString (e)? (t = this.getById (e), s (t)): s (e)}, this.remove = Funktion (e) {var t = e .data.id; a.getElementById (t) .innerHTML = “”}, this.getAdCount = function (s) {var t, a = 0, i = Object.keys (m); return _each (i, function ( i) {(t = m [i]). data.loaded&&t.data.label === e&&a}), a}, this.getById = Funktion (e) {return m [e]}, d = _debounce (Funktion () {var e = {TopLeaderboard: 1, RightColTopMPU: 2, outOfPage: 99, “homepageTakeover / TopLeaderboard”: 1}, t = _sortBy (f, Funktion (t) {return e [t.data.label] || 10}); _ forEach (t, Funktion (e) {return e.data.sizes? R (e): i.setTimeout (Funktion () {r (e)}, 2e3)}), f = []}, 10), this.addToPageLoadQueue = Funktion (e) {f.push (e), d ()}); Funktion v (e) {var t, a = e.sizes; return a = _intersectionWith (a, [[970,250 ], [970,90], [728,90], [300,600], [300,250], [320,100], [320,50]], _ isEqual), e.sizes&&e.sizes.length&& (t = {slotID: e .id, Größen: a, slotName: e.label}), t}}]);
}, {“62″:62,”68″:68,”72″:72,”120″:120,”143″:143,”157″:157,”204″:204,”210″:210,”320″:320,”321”:321}];
window.modules[“cid.legacy”] = [function(require,module,exports){“use strict”;DS.service(“$cid”,function(){var r=Math.floor(100*Math.random());return function(){return”cid-” r}});
}, {}];
window.modules[“facebook.legacy”] = [function(require,module,exports){“use strict”;DS.service(“facebook”,[function(){this.fb=function(i){window.FB&&window.FB[i].apply(this,Array.prototype.slice.call(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 f.code=”MODULE_NOT_FOUND”,f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==”function”&&require;for(var o=0;o typeof key === ‘string’ && key.match(/.legacy$/)).forEach(key => window.require(key));
}}

function tryToMount (fn, el, name) {
try {
fn (el); // init the controller
} catch (e) {
const elementTag = el.outerHTML.slice (0, el.outerHTML.indexOf (el.innerHTML));
console.error (`Error initializing controller for” $ {name} “on” $ {elementTag} “`, e);
}}
}}
/ **
* Mount Client.js component controller
* /

function mountComponentModules () {
Object.keys (window.modules) .filter (key => typeof key === ‘string’ && key.match (/ . Client $ /)). ForEach (key => {
let controllerFn = window.require (key);

if (typeof controllerFn === ‘function’) {
const name = key.replace (‘. client’, ”),
instancesSelector = `[data-uri * =” _ components / $ {name} / “]`,
defaultSelector = `[data-uri $ =” _ components $ {name} “]`,
instances = document.querySelectorAll (instancesSelector),
defaults = document.querySelectorAll (defaultSelector);

for (let el of instances) {
tryToMount (controllerFn, el, name);
}}

for (let el of defaults) {
tryToMount (controllerFn, el, name);
}}
}}
});
} // Make sure that a `window.process.env.NODE_ENV` is available in the client for any dependencies,
// services, or components that could require it
// Note: The value “ is exchanged for the actual environment variable in /lib/cmd/compile/scripts.js

window.process = window.process || {};
window.process.env = window.process.env || {};

if (! window.process.env.NODE_ENV) {
window.process.env.NODE_ENV = ”;
} // note: legacy controllers that require legacy services (e.g. dollar-slice) must
// wait for DOMContentLoaded to initialize themselves, as the files themselves must be mounted first

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

Ref: https://www.vulture.com