parenting advice from Care and Feeding.

Two twentysomething men standing apart, looking mad at each other
Photo illustration by Slate. Photo by Getty Images Plus.

Care and Feeding is Slate’s parenting advice column. Have a question for Care and Feeding? Submit it here or post it in the Slate Parenting Facebook group.

Dear Care and Feeding,

Our two adult sons (26 and 28) have always had completely different personalities and interests, and when they were growing up, they always did their own thing. I was hoping that once they were adults, they would have a relationship, but they still prefer to have nothing to do with each other. At one point not that long ago, one of them made a vague reference to some serious transgression on his brother’s part, something having to do with a girl. I felt that it wouldn’t be helpful for me to get involved or even hear the details, so that’s all I know about it. My husband and I keep hoping for a reconciliation, but it doesn’t look like that’s going to happen. I have close relationships with my own siblings, and I see loving relationships between many of my friends’ children. I’m just sick about this. My husband has tried to force a relationship between them, which doesn’t work. For my part, I just stew about it. Can you give me some perspective?

—Love Them Both but They Hate Each Other

Dear LTBbTHEO,

I’m know it’s disappointing—it must feel awful—that your children don’t have a relationship. I feel for you. And I’m sorry too that your sons are missing out on a relationship that for some people is sustaining (the way your close relationships with your siblings seem to be for you). But the fact is there are plenty of siblings who don’t like each other. And while it’s possible (but by no means certain) that you might have been able to do something to encourage togetherness between them when they were children, that’s ancient history now—and you simply hoping they would grow into friends once they were adults was wishful thinking.

I have to say, before I offer any advice, that the “serious transgression … something having to do with a girl” gives me pause. There’s no way to know whether this means “I was dating someone until he expressed romantic interest in her, and then she started dating him instead” or something much darker and uglier, like sexual assault. Without more information (and for the record, I would have asked for an explanation or elaboration, but I’m not you)—and since you say that the two have never had much to do with each other (even as small children?)—I’m going to indulge my own capacity for wishful thinking and assume that what the one brother was alluding to was on the personal-affront end of the spectrum.

In any case, I believe you have mixed up your own needs with theirs (common enough—all parents do this at least sometimes). It’s important for you to find a way to let go of your own expectations when it comes to their relationship, because there is nothing you can (or should) do to turn these two adult men into loving brothers. And your husband needs to stop trying to force this on them (or he will eventually find himself frozen out by both of them). Mind you, I’m not saying there’s no chance that your sons will find a way to each other eventually. Some siblings without anything in common but shared parents, even those with unpleasant histories between and behind them, do become closer as time passes and their circumstances change (when they both have children, for example … or when their parents are near the end of their lives, or when they’re gone). But other siblings never do grow close and in fact move further and further apart—and I can assure you that people can have rich, full lives without close relationships with their siblings. Either way, this is between the two of them. Concentrate on your separate relationships with each of them, and in particular on the aspects of these relationships that are in your control—i.e., your part in it, not theirs.

Help! How can I support Slate so I can keep reading all the advice from Dear Prudence, Care and Feeding, Ask a Teacher, and How to Do It? Answer: Join Slate Plus.

Dear Care and Feeding,

I have a tricky relationship with my mother, whom I love very much. She loves me too, but I believe she is deeply affected by past trauma as a young woman and by her own mother’s controlling behavior. It causes her to lash out and harshly criticize me (or anyone) she has problems or confrontations with, and she just cannot be reasoned with. If I talk about something she’s done or said that’s bothering me, she will furiously try to defend herself (and she is so insecure she takes offense at everything). It isn’t just me—she has had strained relationships at one time or another with my siblings and their wives/girlfriends, her stepchildren (who are quite difficult, to be fair), her cousins, her in-laws, and even her friends. I do my best to stick to nonconfrontational topics with her, but it causes me a lot of emotional pain that I can’t just tell her how I feel. She’s an incredible grandmother to my children and for that I am grateful, and I’m working on this for their sake too.

—Drifting Away Reluctantly

Dear DAR,

Recognizing the limits of our relationships is a crucial part of growing up.

Recognizing the limits of our relationships is a crucial part of growing up (which can be an ongoing process that lasts one’s whole life long!). So is making decisions about whether and how to continue being in relationships that don’t fulfill all of our needs, that leave us feeling thwarted, frustrated, and hurt. It seems pretty clear that you don’t want to walk away from your relationship with your mother. So let’s face facts: first, that she is not, and most likely never will be, someone you can talk to about how you feel—especially not how you feel about her and her behavior, past or present; and second, that there is nothing you can do to make her able to tolerate such conversations.

As I’ve said before, more times than I can count: The only aspect of a relationship we’re in control of is our own response, our own behavior—our own part in the equation. Your mother, no matter how much she may love you (and you her), is incapable of giving you something important that you need from her. Can you accept this limitation and appreciate and enjoy what there is good about having her in your life? It’s no small thing that she is able to be a good grandmother (like lots of less than ideal mothers, who manage to redeem themselves in this way). I’m not minimizing your pain—I am well aware of how upsetting this particular dynamic is—but if you want to maintain a relationship with her (even if only for your children’s sake)—if you don’t want to drift away—you’re going to have to find a means to make peace with her inability to be the mother you need her to be.

• If you missed Monday’s Care and Feeding column, read it here.

• Discuss this column in the Slate Parenting Facebook group!

Dear Care and Feeding,

Whose job is it to initiate contact on a regular basis—the child’s or the parent’s? I am a woman in my 20s, living in a different state from either of my parents. My father is an essential worker and therefore extremely busy, but even before the pandemic, he practically never reached out to me. If I didn’t occasionally text him song recommendations and if he didn’t occasionally send me links to articles, we’d probably never talk. I haven’t talked to my stepmom, with whom I have had a warm relationship for most of my life, in weeks. My mother and I are in touch more often, but I’m always the one texting her. If I don’t initiate it, she would never think to send me a text on her own. (She prefers to call me out of the blue, which definitely isn’t my preferred method of communication.) So although we text every day, she’s never the one reaching out. Is this normal? Is it my job—and my job only—to start conversations with my parents? It seems strange to me that they don’t want to know how I’m doing and what I’m up to! What do you think?

—Contactless

Dear Contactless,

I think a whole bunch of things. (Among them: that the grass is always greener. I know my twentysomething daughter would be jealous of you, because she would like it very much if I didn’t text her quite so often, and if I were less interested in how she’s doing and what she’s up to. So hold on to that perspective—that we always wish for what we don’t have.) Of course it isn’t your job to reach out to your parents. But it also isn’t their job to reach out to you. Relationships are complicated because the people in them don’t always have the same needs or expectations. If you have a need to be in touch with your parents more than they feel a need to be in touch with you, you’re going to be the one “reaching out.” I know it hurts your feelings (you want them to want to be in touch more!), but I think you’re going to have to find a way to accept this. And let me make two gentle suggestions: One is that it isn’t quite fair to complain that your mother doesn’t reach out to you when the fact is she does, just not in the precise way you prefer (why do you get to set the rules for how contact will occur?). The other, which is related to the first and which I assure you I mean in the most loving possible way, is that you need to grow up a little. By which I mean not only that you must learn to accept that you can’t have things exactly your way at all times when it comes to (and not only when it comes to!) your relationships with your parents … but also that, at this point in your life, it’s not such a terrible thing not to have daily contact with your parents. There is a possibility that they are collectively trying to teach you this.

Dear Care and Feeding,

I could use some guidance. My sister and I are not currently speaking (which is a long story that boils down to: I didn’t support her marrying her controlling and emotionally manipulative husband), and she is expecting her first child. The baby was just diagnosed with anencephaly, and his life expectancy is very short. I am heartbroken for my sister. I want to reach out, but I am afraid if I do I will subject myself to an onslaught of abuse from her husband (this has happened in the past). I am working with a therapist to manage my feelings, but do you have any advice about what an appropriate thing to say to her would be? I don’t want to send some generic expression of grief, but I also don’t think now is a good time to rehash our past issues.

—Grieving Older Sibling

Dear Grieving,

“I love you. I’m thinking about you and your baby, and my heart breaks for you. I’m here if you need me.” Nothing else need be—or should be—said. My heart breaks for her too.

—Michelle

More Advice From Slate

I was quite surprised last weekend when my eighth-grade daughter was invited to a coed party last weekend that the parents knew about, but for which they weren’t present. I am alarmed by parents at this age allowing an unsupervised party. But apparently, I’m the only one who has an issue with it, and other parents are fine with their children attending. Should kids this age be having unchaperoned parties?

'));else
if (!0 === d.b.getConfig("enableSendAllBids")) return;
p.native =
title: (t = e.native).products[0].title,
body: t.products[0].description,
sponsoredBy: t.advertiser.description,
icon: t.advertiser.logo,
image: t.products[0].image,
clickUrl: t.products[0].click_url,
privacyLink: t.privacy.optout_click_url,
privacyIcon: t.privacy.optout_image_url,
cta: t.products[0].call_to_action,
price: t.products[0].price,
impressionTrackers: t.impression_pixels.map(function (t)
return t.url;
)
, p.mediaType = h.c;

else e.video ? (p.vastUrl = e.displayurl, p.mediaType = h.d) : p.ad = e.creative;
c.push(p);
}), c;
},
onTimeout: function onTimeout(t)
T() && Criteo.PubTag.Adapters.Prebid.GetAdapter(t.auctionId).handleBidTimeout();
,
onBidWon: function onBidWon(t)
T() && Criteo.PubTag.Adapters.Prebid.GetAdapter(t.auctionId).handleBidWon(t);
,
onSetTargeting: function onSetTargeting(t)
T() && Criteo.PubTag.Adapters.Prebid.GetAdapter(t.auctionId).handleSetTargeting(t);

};

function T()
return "undefined" != typeof Criteo && Criteo.PubTag && Criteo.PubTag.Adapters && Criteo.PubTag.Adapters.Prebid;

function C(t) t.sizes;

function A(t, e)
return Array.isArray(t[0]) ? t.map(function (t)
return e(t);
) : [e(t)];

function S(t)
return t[0] + "x" + t[1];

function I(t)
return void 0 === t[0] && void 0 === t[1] ? "2x2" : t[0] + "x" + t[1];

function R(t)
return void 0 !== f.deepAccess(t, "params.video") && void 0 !== f.deepAccess(t, "mediaTypes.video");

function x()
try
var t,
e,
r,
i,
o,
n = "criteo_fast_bid",
s = "// Hash: ",
a = y.getDataFromLocalStorage(n);
null !== a && (t = a.indexOf("n"), (e = a.substr(0, t).trim()).substr(0, s.length) !== s ? (f.logWarn("No hash found in FastBid"), y.removeDataFromLocalStorage(n)) : (r = e.substr(s.length), i = a.substr(t + 1), Object(p.verify)(i, r, g, b) ? (f.logInfo("Using Criteo FastBid"), (o = document.createElement("script")).type = "text/javascript", o.text = i, f.insertElement(o)) : (f.logWarn("Invalid Criteo FastBid found"), y.removeDataFromLocalStorage(n))));
catch (t)

Object(i.registerBidder)(s);
},
382: function _(t, e, r)
"use strict";

Object.defineProperty(e, "__esModule",
value: !0
);
var a = r(383),
p = r(384);

e.verify = function (t, e, r, i)
var o = new a.BigInteger(a.b64toHex(e)),
n = new a.BigInteger(a.b64toHex(r)),
s = o.modPowInt(i, n);
return a.removeExtraSymbols(s.toHexString()) === p.Sha256.hash(t);
;
,
383: function _(t, e, r) {
"use strict";

var i;
Object.defineProperty(e, "__esModule",
value: !0
);
var o = (g.prototype.toHexString = function ()
if (this.s < 0) return "-" + this.negate().toHexString(); var t, e = !1, r = "", i = this.t, o = this.DB - i * this.DB % 4; if (0 < i--) for (o < this.DB && 0 < (t = this[i] >> o) && (e = !0, r = c(t)); 0 <= i;) = this[--i] >> (o += this.DB - 4)) : (t = this[i] >> (o -= 4) & 15, o <= 0 && (o += this.DB, --i)), 0 < t && (e = !0), e && (r += c(t)); return e ? r : "0"; , g.prototype.fromHexString = function (t) if (null !== t) this.t = 0, this.s = 0; for (var e = t.length, r = !1, i = 0; 0 <= --e;) = o << i, (i += 4) >= this.DB && (i -= this.DB));

this.clamp(), r && g.ZERO.subTo(this, this);

, g.prototype.negate = function ()
var t = T();
return g.ZERO.subTo(this, t), t;
, g.prototype.abs = function ()
return this.s < 0 ? this.negate() : this; , g.prototype.mod = function (t) var e = T(); return this.abs().divRemTo(t, null, e), this.s < 0 && 0 < e.compareTo(g.ZERO) && t.subTo(e, e), e; , g.prototype.copyTo = function (t) for (var e = this.t - 1; 0 <= e; --e) t[e] = this[e]; t.t = this.t, t.s = this.s; , g.prototype.lShiftTo = function (t, e) for (var r = t % this.DB, i = this.DB - r, o = (1 << i) - 1, n = Math.floor(t / this.DB), s = this.s << r & this.DM, a = this.t - 1; 0 <= a; --a) e[a + n + 1] = this[a] >> i

for (a = n - 1; 0 <= a; --a) e[a] = 0; e[n] = s, e.t = this.t + n + 1, e.s = this.s, e.clamp(); , g.prototype.invDigit = function () if (this.t < 1) return 0; var t = this[0]; if (0 == (1 & t)) return 0; var e = 3 & t; return 0 < (e = (e = (e = (e = e * (2 - (15 & t) * e) & 15) * (2 - (255 & t) * e) & 255) * (2 - ((65535 & t) * e & 65535)) & 65535) * (2 - t * e % this.DV) % this.DV) ? this.DV - e : -e; , g.prototype.dlShiftTo = function (t, e) for (var r = this.t - 1; 0 <= r; --r) e[r + t] = this[r]; for (r = t - 1; 0 <= r; --r) e[r] = 0; e.t = this.t + t, e.s = this.s; , g.prototype.squareTo = function (t) for (var e = this.abs(), r = t.t = 2 * e.t; 0 <= --r;) t[r] = 0; for (r = 0; r < e.t - 1; ++r) var i = e.am(r, e[r], t, 2 * r, 0, 1); (t[r + e.t] += e.am(r + 1, 2 * e[r], t, 2 * r + 1, i, e.t - r - 1)) >= e.DV && (t[r + e.t] -= e.DV, t[r + e.t + 1] = 1);

0 < t.t && (t[t.t - 1] += e.am(r, e[r], t, 2 * r, 0, 1)), t.s = 0, t.clamp(); , g.prototype.multiplyTo = function (t, e) var r = this.abs(), i = t.abs(), o = r.t; for (e.t = o + i.t; 0 <= --o;) e[o] = 0; for (o = 0; o < i.t; ++o) e[o + r.t] = r.am(0, i[o], e, o, 0, r.t); e.s = 0, e.clamp(), this.s != t.s && g.ZERO.subTo(e, e); , g.prototype.divRemTo = function (t, e, r) { var i = t.abs(); if (!(i.t <= 0)) var o = this.abs(); if (o.t < i.t) return null != e && e.fromHexString("0"), void (null != r && this.copyTo(r)); null == r && (r = T()); var n = T(), s = this.s, a = t.s, p = this.DB - C(i[i.t - 1]); 0 < p ? (i.lShiftTo(p, n), o.lShiftTo(p, r)) : (i.copyTo(n), o.copyTo(r)); var u = n.t, c = n[u - 1]; if (0 != c) var d = c * (1 << this.F1) + (1 < u ? n[u - 2] >> this.F2 : 0),
h = this.FV / d,
f = (1 << this.F1) / d, l = 1 << this.F2, m = r.t, v = m - u, y = null == e ? T() : e; for (n.dlShiftTo(v, y), 0 <= r.compareTo(y) && (r[r.t++] = 1, r.subTo(y, r)), g.ONE.dlShiftTo(u, y), y.subTo(n, n); n.t < u;) n[n.t++] = 0; for (; 0 <= --v;) var b = r[--m] == c ? this.DM : Math.floor(r[m] * h + (r[m - 1] + l) * f); if ((r[m] += n.am(0, b, r, v, 0, u)) < b) for (n.dlShiftTo(v, y), r.subTo(y, r); r[m] < --b;) r.subTo(y, r); null != e && (r.drShiftTo(u, e), s != a && g.ZERO.subTo(e, e)), r.t = u, r.clamp(), 0 < p && r.rShiftTo(p, r), s < 0 && g.ZERO.subTo(r, r); }, g.prototype.rShiftTo = function (t, e) e.s = this.s; var r = Math.floor(t / this.DB); if (r >= this.t) e.t = 0;else
var i = t % this.DB,
o = this.DB - i,
n = (1 << i) - 1; e[0] = this[r] >> i;

for (var s = r + 1; s < this.t; ++s) e[s - r - 1] 0 < i && (e[this.t - r - 1] , g.prototype.drShiftTo = function (t, e) for (var r = t; r < this.t; ++r) e[r - t] = this[r]; e.t = Math.max(this.t - t, 0), e.s = this.s; , g.prototype.subTo = function (t, e) for (var r = 0, i = 0, o = Math.min(t.t, this.t); r < o;) i += this[r] - t[r], e[r++] = i & this.DM, i >>= this.DB;

if (t.t < this.t) for (i -= t.s; r < this.t;) i += this[r], e[r++] = i & this.DM, i >>= this.DB;

i += this.s;
else
for (i += this.s; r < t.t;) i -= t[r], e[r++] = i & this.DM, i >>= this.DB;

i -= t.s;

e.s = i < 0 ? -1 : 0, i < -1 ? e[r++] = this.DV + i : 0 < i && (e[r++] = i), e.t = r, e.clamp(); , g.prototype.clamp = function () for (var t = this.s & this.DM; 0 < this.t && this[this.t - 1] == t;) --this.t; , g.prototype.modPowInt = function (t, e) var r = new (t < 256 , g.prototype.exp = function (t, e) if (4294967295 < t , g.prototype.isEven = function () return 0 == (0 < this.t ? 1 & this[0] : this.s); , g.prototype.compareTo = function (t) var e = this.s - t.s; if (0 != e) return e; var r = this.t; if (0 != (e = r - t.t)) return this.s < 0 ? -e : e; for (; 0 <= --r;) if (0 != (e = this[r] - t[r])) return e; return 0; , g.prototype.am1 = function (t, e, r, i, o, n) for (; 0 <= --n;) var s = e * this[t++] + r[i] + o; o = Math.floor(s / 67108864), r[i++] = 67108863 & s; return o; , g.prototype.am2 = function (t, e, r, i, o, n) for (var s = 32767 & e, a = e >> 15; 0 <= --n;) var p = 32767 & this[t], u = this[t++] >> 15,
c = a * p + u * s;
o = ((p = s * p + ((32767 & c) << 15) + r[i] + (1073741823 & o)) >>> 30) + (c >>> 15) + a * u + (o >>> 30), r[i++] = 1073741823 & p;

return o;
, g.prototype.am3 = function (t, e, r, i, o, n)
for (var s = 16383 & e, a = e >> 14; 0 <= --n;) var p = 16383 & this[t], u = this[t++] >> 14,
c = a * p + u * s;
o = ((p = s * p + ((16383 & c) << 14) + r[i] + o) >> 28) + (c >> 14) + a * u, r[i++] = 268435455 & p;

return o;
, g);

function g(t)
null !== t && this.fromHexString(t);

function T()
return new o(null);

function C(t)
var e,
r = 1;
return 0 != (e = t >>> 16) && (t = e, r += 16), 0 != (e = t >> 8) && (t = e, r += 8), 0 != (e = t >> 4) && (t = e, r += 4), 0 != (e = t >> 2) && (t = e, r += 2), 0 != (e = t >> 1) && (t = e, r += 1), r;

e.BigInteger = o, e.nbi = T, e.nbits = C;

for (var n = [], s = "0".charCodeAt(0), a = 0; a <= 9; ++a) n[s++] = a; for (s = "a".charCodeAt(0), a = 10; a < 36; ++a) n[s++] = a; for (s = "A".charCodeAt(0), a = 10; a < 36; ++a) n[s++] = a; function p(t, e) var r = n[t.charCodeAt(e)]; return null == r ? -1 : r; e.intAt = p; var u = "0123456789abcdefghijklmnopqrstuvwxyz"; function c(t) return u.charAt(t); e.int2char = c; e.b64toHex = function (t) for (var e = "", r = 0, i = 0, o = 0; o < t.length && "=" != t.charAt(o); ++o) (r = 0 == r ? (e += c(n >> 2), i = 3 & n, 1) : 1 == r ? (e += c(i << 2 return 1 == r && (e += c(i << 2)), e; , e.removeExtraSymbols = function (t) return t.replace(/^1f+00/, "").replace("3031300d060960864801650304020105000420"https://slate.com/human-interest/2020/09/,""); ; var d = (h.prototype.convert = function (t) , h.prototype.revert = function (t) return t; , h.prototype.reduce = function (t) t.divRemTo(this.m, null, t); , h.prototype.mulTo = function (t, e, r) t.multiplyTo(e, r), this.reduce(r); , h.prototype.sqrTo = function (t, e) t.squareTo(e), this.reduce(e); , h); function h(t) this.m = t; var f = (l.prototype.convert = function (t) var e = T(); return t.abs().dlShiftTo(this.m.t, e), e.divRemTo(this.m, null, e), t.s < 0 && 0 < e.compareTo(o.ZERO) && this.m.subTo(e, e), e; , l.prototype.revert = function (t) var e = T(); return t.copyTo(e), this.reduce(e), e; , l.prototype.reduce = function (t) for (; t.t <= this.mt2;) t[t.t++] = 0; for (var e = 0; e < this.m.t; ++e) var r = 32767 & t[e], i = r * this.mpl + ((r * this.mph + (t[e] >> 15) * this.mpl & this.um) << 15) & t.DM; for (t[r = e + this.m.t] += this.m.am(0, i, t, e, 0, this.m.t); t[r] >= t.DV;)
t[r] -= t.DV, t[++r]++;

t.clamp(), t.drShiftTo(this.m.t, t), 0 <= t.compareTo(this.m) && t.subTo(this.m, t); , l.prototype.mulTo = function (t, e, r) t.multiplyTo(e, r), this.reduce(r); , l.prototype.sqrTo = function (t, e) t.squareTo(e), this.reduce(e); , l); function l(t) this.m = t, this.mp = t.invDigit(), this.mpl = 32767 & this.mp, this.mph = this.mp >> 15, this.um = (1 << t.DB - 15) - 1, this.mt2 = 2 * t.t; function m(t) var e = T(); return e.fromHexString(t.toString()), e; e.nbv = m, o.ZERO = m(0), o.ONE = m(1), i = "Microsoft Internet Explorer" == navigator.appName ? (o.prototype.am = o.prototype.am2, 30) : "Netscape" != navigator.appName ? (o.prototype.am = o.prototype.am1, 26) : (o.prototype.am = o.prototype.am3, 28), o.prototype.DB = i, o.prototype.DM = (1 << i) - 1, o.prototype.DV = 1 << i; o.prototype.FV = Math.pow(2, 52), o.prototype.F1 = 52 - i, o.prototype.F2 = 2 * i - 52; }, 384: function _(t, e, r) "use strict"; Object.defineProperty(e, "__esModule", value: !0 ); var i = (S.hash = function (t) ""); for (var e = [1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987, 1925078388, 2162078206, 2614888103, 3248222580, 3835390401, 4022224774, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, 2554220882, 2821834349, 2952996808, 3210313671, 3336571891, 3584528711, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, 2428436474, 2756734187, 3204031479, 3329325298], r = [1779033703, 3144134277, 1013904242, 2773480762, 1359893119, 2600822924, 528734635, 1541459225], i = (t += String.fromCharCode(128)).length / 4 + 2, o = Math.ceil(i / 16), n = new Array(o), s = 0; s < o; s++) n[s] = new Array(16); for (var a = 0; a < 16; a++) t.charCodeAt(64 * s + 4 * a + 2) << 8 var p = 8 * (t.length - 1) / Math.pow(2, 32), u = 8 * (t.length - 1) >>> 0;

for (n[o - 1][14] = Math.floor(p), n[o - 1][15] = u, s = 0; s < o; s++) for (var c = new Array(64), d = 0; d < 16; d++) c[d] = n[s][d]; for (d = 16; d < 64; d++) c[d] = S.q1(c[d - 2]) + c[d - 7] + S.q0(c[d - 15]) + c[d - 16] >>> 0;

for (var h = r[0], f = r[1], l = r[2], m = r[3], v = r[4], y = r[5], b = r[6], g = r[7], d = 0; d < 64; d++) var T = g + S.z1(v) + S.Ch(v, y, b) + e[d] + c[d], C = S.z0(h) + S.Maj(h, f, l); g = b, b = y, y = v, v = m + T >>> 0, m = l, l = f, f = h, h = T + C >>> 0;

r[0] = r[0] + h >>> 0, r[1] = r[1] + f >>> 0, r[2] = r[2] + l >>> 0, r[3] = r[3] + m >>> 0, r[4] = r[4] + v >>> 0, r[5] = r[5] + y >>> 0, r[6] = r[6] + b >>> 0, r[7] = r[7] + g >>> 0;

for (var A = new Array(r.length), g = 0; g < r.length; g++) A[g] = ("00000000" + r[g].toString(16)).slice(-8); return A.join(""); , S.utf8Encode = function (e) try return new TextEncoder().encode(e).reduce(function (t, e) return t + String.fromCharCode(e); , ""); catch (t) return unescape(encodeURIComponent(e)); , S.ROTR = function (t, e) return e >>> t , S.z0 = function (t)
return S.ROTR(2, t) ^ S.ROTR(13, t) ^ S.ROTR(22, t);
, S.z1 = function (t)
return S.ROTR(6, t) ^ S.ROTR(11, t) ^ S.ROTR(25, t);
, S.q0 = function (t)
return S.ROTR(7, t) ^ S.ROTR(18, t) ^ t >>> 3;
, S.q1 = function (t)
return S.ROTR(17, t) ^ S.ROTR(19, t) ^ t >>> 10;
, S.Ch = function (t, e, r)
return t & e ^ ~t & r;
, S.Maj = function (t, e, r)
return t & e ^ t & r ^ e & r;
, S);

function S()

e.Sha256 = i;

}, [380]);
pbjsChunk([187], {
481: function _(e, r, t)
e.exports = t(482);
,
482: function _(e, r, t) {
"use strict";

Object.defineProperty(r, "__esModule",
value: !0
), t.d(r, "spec", function ()
return m;
);
var b = t(0),
y = t(2),
h = t(3),
i = t(11),
l = t.n(i),
a = t(483),
n = t.n(a),
s = t(1);

function v(e)
return (v = "function" == typeof Symbol && "symbol" == _typeof(Symbol.iterator) ? function (e)
return _typeof(e);
: function (e)
return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : _typeof(e);
)(e);

var o = [y.b, y.d],
g = 100,
w = 300,
x = 3600,
I = !0,
P =
JPY: 1
;

function p(e)

function d(e)
return Array.isArray(e) && 2 === e.length && n()(e[0]) && n()(e[1]);

function c(e, r)
if (d(e)) return e[0] === r[0] && e[1] === r[1];

for (var t = 0; t < e.length; t++) if (e[t][0] === r[0] && e[t][1] === r[1]) return 1; function u(e, r, t, i) , p.user.ext = "" )), r.uspConsent && b.deepSetValue(p, "regs.ext.us_privacy", r.uspConsent), r.refererInfo && (p.site.page = r.refererInfo.referer)); var c = , u = r && r.bidderCode var m = { code: "ix", gvlid: 10, supportedMediaTypes: o, isBidRequestValid: function isBidRequestValid(e) if (!d(e.params.size)) return b.logError("ix bidder params: bid size has invalid format."), !1; if (!c(e.sizes, e.params.size)) return b.logError("ix bidder params: bid size is not included in ad unit sizes."), !1; if (e.hasOwnProperty("mediaType") && !b.contains(o, e.mediaType)) return !1; if (e.hasOwnProperty("mediaTypes") && !b.deepAccess(e, "mediaTypes.banner.sizes") && !b.deepAccess(e, "mediaTypes.video.playerSize")) return !1; if ("string" != typeof e.params.siteId && "number" != typeof e.params.siteId) return b.logError("ix bidder params: siteId must be string or number value."), !1; var r, t, i = e.params.hasOwnProperty("bidFloor"), a = e.params.hasOwnProperty("bidFloorCur"); return !!(!i && !a , buildRequests: function buildRequests(e, r) for (var t, i, a = [], n = [], s = [], o = null, d = 0; d < e.length; d++) return 0 < n.length && a.push(u(e, r, n, 7.2)), 0 < s.length && a.push(u(e, r, s, 8.1)), a; , interpretResponse: function interpretResponse(e, r) { var t = []; if (!e.hasOwnProperty("body") || !e.body.hasOwnProperty("seatbid")) return t; for (var i, a, n, s, o = e.body, d = o.seatbid, p = 0; p < d.length; p++) if (d[p].hasOwnProperty("bid")) for (var c = d[p].bid, u = JSON.parse(r.data.r), m = 0; m < c.length; m++) var f = function (r, e) if (r) return l()(e, function (e) return e.id === r; ); (c[m].impid, u.imp); i = c[m], a = o.cur, n = f, s = void 0, s = , P.hasOwnProperty(a) ? s.cpm = i.price / P[a] : s.cpm = i.price / g, s.requestId = i.impid, s.dealId = b.deepAccess(i, "ext.dealid"), s.netRevenue = I, s.currency = a, s.creativeId = i.hasOwnProperty("crid") ? i.crid : "-", b.deepAccess(i, "ext.vasturl") ? (s.vastUrl = i.ext.vasturl, s.width = n.video.w, s.height = n.video.h, s.mediaType = y.d, s.ttl = x) : (s.ad = i.adm, s.width = i.w, s.height = i.h, s.mediaType = y.b, s.ttl = w), s.meta = , s.meta.networkId = b.deepAccess(i, "ext.dspid"), s.meta.brandId = b.deepAccess(i, "ext.advbrandid"), s.meta.brandName = b.deepAccess(i, "ext.advbrand"), t.push(s); return t; }, transformBidParams: function transformBidParams(e) return b.convertTypes( siteID: "number" , e); , getUserSyncs: function getUserSyncs(e) return e.iframeEnabled ? [ type: "iframe", url: "https://js-sec.indexww.com/um/ixmatch.html" ] : []; }; Object(s.registerBidder)(m); } }, [481]); pbjsChunk([184], { 493: function _(e, t, r) e.exports = r(494); , 494: function _(e, t, r) { "use strict"; Object.defineProperty(t, "__esModule", value: !0 ), r.d(t, "spec", function () return l; ); var s = r(0), d = r(3), n = r(1), a = r(9); function g() return (g = Object.assign var o, i, c, u = Object(a.b)(), l = { code: "kargo", isBidRequestValid: function isBidRequestValid(e) return !(!e , buildRequests: function buildRequests(e, t) var r, n = d.b.getConfig("currency"), a = n && n.adServerCurrency , interpretResponse: function interpretResponse(e, t) var r = e.body, n = []; for (var a in r) var o = r[a], i = void 0; o.metadata && o.metadata.landingPageDomain && (i = clickUrl: o.metadata.landingPageDomain ), n.push( requestId: a, cpm: Number(o.cpm), width: o.width, height: o.height, ad: o.adm, ttl: 300, creativeId: o.id, dealId: o.targetingCustom, netRevenue: !0, currency: t.currency, meta: i ); return n; , getUserSyncs: function getUserSyncs(e) var t = [], r = l._generateRandomUuid(), n = l._getClientId(); if (e.iframeEnabled && r && n) for (var a = 0; a < 5; a++) t.push( type: "iframe", url: "https://crb.kargo.com/api/v1/initsyncrnd/UUID?seed=SEED&idx=INDEX".replace("UUID", n).replace("SEED", r).replace("INDEX", a) ); return t; , _readCookie: function _readCookie(e) if (!u.cookiesAreEnabled()) return null; for (var t = "".concat(e, "="), r = document.cookie.split(";"), n = 0; n < r.length; n++) for (var a = r[n]; " " === a.charAt(0);) a = a.substring(1, a.length); if (0 === a.indexOf(t)) return a.substring(t.length, a.length); return null; , _getCrbFromCookie: function _getCrbFromCookie() try var e = JSON.parse(decodeURIComponent(l._readCookie("krg_crb"))); if (e && e.v) var t = JSON.parse(atob(e.v)); if (t) return t; return ; catch (e) return ; , _getCrbFromLocalStorage: function _getCrbFromLocalStorage() try return JSON.parse(atob(l._getLocalStorageSafely("krg_crb"))); catch (e) return ; , _getCrb: function _getCrb() var e = l._getCrbFromLocalStorage(); return Object.keys(e).length ? e : l._getCrbFromCookie(); , _getKruxUserId: function _getKruxUserId() return l._getLocalStorageSafely("kxkar_user"); , _getKruxSegments: function _getKruxSegments() return l._getLocalStorageSafely("kxkar_segs"); , _getKrux: function _getKrux() var e = l._getKruxSegments(), t = []; return e && (t = e.split(",")), userID: l._getKruxUserId(), segments: t ; , _getLocalStorageSafely: function _getLocalStorageSafely(e) try return u.getDataFromLocalStorage(e); catch (e) return null; , _getUserIds: function _getUserIds(e, t) var r = l._getCrb(), n = , optOut: r.optOut, usp: t ; return e && (n.tdID = e), n; , _getClientId: function _getClientId() return l._getCrb().clientId; , _getAllMetadata: function _getAllMetadata(e, t) return userIDs: l._getUserIds(e, t), krux: l._getKrux(), pageURL: window.location.href, rawCRB: l._readCookie("krg_crb"), rawCRBLocalStorage: l._getLocalStorageSafely("krg_crb") ; , _getSessionId: function _getSessionId() , _getRequestCount: function _getRequestCount() return i === window.location.pathname ? ++c : (i = window.location.pathname, c = 0); , _generateRandomUuid: function _generateRandomUuid() try 128; var t = Array.prototype.map.call(new Uint8Array(e), function (e) return ("00" + e.toString(16)).slice(-2); ).join(""); return t.slice(0, 8) + "-" + t.slice(8, 12) + "-" + t.slice(12, 16) + "-" + t.slice(16, 20) + "-" + t.slice(20); catch (e) return ""; }; Object(n.registerBidder)(l); } }, [493]); pbjsChunk([110], { 677: function _(e, r, t) e.exports = t(678); , 678: function _(e, r, t) { "use strict"; Object.defineProperty(r, "__esModule", value: !0 ), t.d(r, "FASTLANE_ENDPOINT", function () return o; ), t.d(r, "VIDEO_ENDPOINT", function () return l; ), t.d(r, "SYNC_ENDPOINT", function () return a; ), t.d(r, "spec", function () return h; ), r.hasVideoMediaType = c, r.masSizeOrdering = S, r.determineRubiconVideoSizeId = C, r.getPriceGranularity = j, r.hasValidVideoParams = k, r.hasValidSupplyChainParams = T, r.encodeParam = w, r.resetUserSync = function () R = !1; ; var g = t(0), i = t(1), b = t(3), u = t(2); function v(e, r) function () throw new TypeError("Invalid attempt to destructure non-iterable instance.nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); (); function n(e, r) r > e.length) && (r = e.length);

for (var t = 0, i = new Array(r); t < r; t++) i[t] = e[t]; return i; function y() function p(e, r, t) return r in e ? Object.defineProperty(e, r, value: t, enumerable: !0, configurable: !0, writable: !0 ) : e[r] = t, e; function x(e) return (x = "function" == typeof Symbol && "symbol" == _typeof(Symbol.iterator) ? function (e) return _typeof(e); : function (e) return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : _typeof(e); )(e); var o = "https://fastlane.rubiconproject.com/a/api/fastlane.json", l = "https://prebid-server.rubiconproject.com/openrtb2/auction", a = "https://eus.rubiconproject.com/usync.html", d = FASTLANE: id: "dt.id", keyv: "dt.keyv", pref: "dt.pref" , PREBID_SERVER: id: "id", keyv: "keyv" , f = 1: "468x60", 2: "728x90", 5: "120x90", 8: "120x600", 9: "160x600", 10: "300x600", 13: "200x200", 14: "250x250", 15: "300x250", 16: "336x280", 17: "240x400", 19: "300x100", 31: "980x120", 32: "250x360", 33: "180x500", 35: "980x150", 37: "468x400", 38: "930x180", 39: "750x100", 40: "750x200", 41: "750x300", 42: "2x4", 43: "320x50", 44: "300x50", 48: "300x300", 53: "1024x768", 54: "300x1050", 55: "970x90", 57: "970x250", 58: "1000x90", 59: "320x80", 60: "320x150", 61: "1000x1000", 64: "580x500", 65: "640x480", 66: "930x600", 67: "320x480", 68: "1800x1000", 72: "320x320", 73: "320x160", 78: "980x240", 79: "980x300", 80: "980x400", 83: "480x300", 85: "300x120", 90: "548x150", 94: "970x310", 95: "970x100", 96: "970x210", 101: "480x320", 102: "768x1024", 103: "480x280", 105: "250x800", 108: "320x240", 113: "1000x300", 117: "320x100", 125: "800x250", 126: "200x600", 144: "980x600", 145: "980x150", 152: "1000x250", 156: "640x320", 159: "320x250", 179: "250x600", 195: "600x300", 198: "640x360", 199: "640x200", 213: "1030x590", 214: "980x360", 221: "1x1", 229: "320x180", 230: "2000x1400", 232: "580x400", 234: "6x6", 251: "2x2", 256: "480x820", 257: "400x600", 258: "500x200", 259: "998x200", 264: "970x1000", 265: "1920x1080", 274: "1800x200", 278: "320x500", 282: "320x400", 288: "640x380" ; g._each(f, function (e, r) return f[e] = r; ); var h = { code: "rubicon", gvlid: 52, supportedMediaTypes: [u.b, u.d], isBidRequestValid: function isBidRequestValid(e) if ("object" !== x(e.params)) return !1; for (var r = 0, t = ["accountId"https://slate.com/human-interest/2020/09/,"siteId"https://slate.com/human-interest/2020/09/,"zoneId"]; r < t.length; r++) if (e.params[t[r]] = parseInt(e.params[t[r]]), isNaN(e.params[t[r]])) return g.logError("Rubicon: wrong format of accountId or siteId or zoneId."), !1; var i = m(e, !0); return !!i && ("video" !== i , buildRequests: function buildRequests(e, u) { var n, r = e.filter(function (e) return "video" === m(e); ).map(function (e) { e.startTime = new Date().getTime(); var r, t, i = { id: e.transactionId, test: b.b.getConfig("debug") ? 1 : 0, cur: ["USD"], source: tid: e.transactionId , tmax: b.b.getConfig("TTL") || 1e3, imp: [ ], ext: prebid: cache: vastxml: returnCreative: !1 , targeting: includewinners: !0, includebidderkeys: !1, pricegranularity: j(b.b) , bidders: rubicon: integration: b.b.getConfig("rubicon.int_type") }; "rubicon" !== e.bidder && (i.ext.prebid.aliases = p(, e.bidder, "rubicon")), t = "function" != typeof e.getFloor || b.b.getConfig("rubicon.disableFloors") ? parseFloat(g.deepAccess(e, "params.floor")) : "object" !== x(r = e.getFloor( currency: "USD", mediaType: "video", size: A(e, "video") )) || "USD" !== r.currency || isNaN(parseInt(r.floor)) ? void 0 : parseFloat(r.floor), isNaN(t) || (i.imp[0].bidfloor = t), i.imp[0].ext[e.bidder].video.size_id = C(e), function (r, t, e) if (!r) return; "object" === x(b.b.getConfig("app")) ? r.app = b.b.getConfig("app") : r.site = page: I(t, e) ; "object" === x(b.b.getConfig("device")) && (r.device = b.b.getConfig("device")); t.params.video.language && ["site"https://slate.com/human-interest/2020/09/,"device"].forEach(function (e) r[e] && (r[e].content = y( language: t.params.video.language , r[e].content)); ); (i, e, u), function (e, r) "object" === x(e.imp[0].video) && void 0 === e.imp[0].video.skip && (e.imp[0].video.skip = r.params.video.skip); "object" === x(e.imp[0].video) && void 0 === e.imp[0].video.skipafter && (e.imp[0].video.skipafter = r.params.video.skipdelay); "object" === x(e.imp[0].video) && void 0 === e.imp[0].video.pos && ("atf" === r.params.position ? e.imp[0].video.pos = 1 : "btf" === r.params.position && (e.imp[0].video.pos = 3)); var t = A(r, "video"); e.imp[0].video.w = t[0], e.imp[0].video.h = t[1]; (i, e); var n, o = _(e, "PREBID_SERVER"); o && g.deepSetValue(i, "user.ext.digitrust", o), u.gdprConsent && ("boolean" == typeof u.gdprConsent.gdprApplies && (n = u.gdprConsent.gdprApplies ? 1 : 0), g.deepSetValue(i, "regs.ext.gdpr", n), g.deepSetValue(i, "user.ext.consent", u.gdprConsent.consentString)), u.uspConsent && g.deepSetValue(i, "regs.ext.us_privacy", u.uspConsent), e.userId && "object" === x(e.userId) && (e.userId.tdid || e.userId.pubcid || e.userId.lipb || e.userId.idl_env) && (g.deepSetValue(i, "user.ext.eids", []), e.userId.tdid && i.user.ext.eids.push( source: "adserver.org", uids: [ id: e.userId.tdid, ext: rtiPartner: "TDID" ] ), e.userId.pubcid && i.user.ext.eids.push( source: "pubcommon", uids: [ id: e.userId.pubcid ] ), e.userId.lipb && e.userId.lipb.lipbid && (i.user.ext.eids.push( source: "liveintent.com", uids: [ id: e.userId.lipb.lipbid ] ), i.user.ext.tpid = source: "liveintent.com", uid: e.userId.lipb.lipbid , Array.isArray(e.userId.lipb.segments) && e.userId.lipb.segments.length && g.deepSetValue(i, "rp.target.LIseg", e.userId.lipb.segments)), e.userId.idl_env && i.user.ext.eids.push( source: "liveramp.com", uids: [ id: e.userId.idl_env ] )), !0 === b.b.getConfig("coppa") && g.deepSetValue(i, "regs.coppa", 1), e.schain && T(e.schain) && g.deepSetValue(i, "source.ext.schain", e.schain); var a, s = y(, e.params.inventory, b.b.getConfig("fpd.context")), d = y(, e.params.visitor, b.b.getConfig("fpd.user")); g.isEmpty(s) && g.isEmpty(d) || (a = bidders: [u.bidderCode], config: fpd: , g.isEmpty(s) || (a.config.fpd.site = s), g.isEmpty(d) || (a.config.fpd.user = d), g.deepSetValue(i, "ext.prebid.bidderconfig.0", a)); var c = g.deepAccess(e, "fpd.context.pbAdSlot"); return "string" == typeof c && c && g.deepSetValue(i.imp[0].ext, "context.data.adslot", c), e.storedAuctionResponse && g.deepSetValue(i.imp[0], "ext.prebid.storedauctionresponse.id", e.storedAuctionResponse.toString()), g.deepSetValue(i.imp[0], "ext.prebid.auctiontimestamp", u.auctionStart), method: "POST", url: l, data: i, bidRequest: e ; }); return !0 !== b.b.getConfig("rubicon.singleRequest") ? r.concat(e.filter(function (e) return "banner" === m(e); ).map(function (e) var i = h.createSlotParams(e, u); return method: "GET", url: o, data: h.getOrderedParams(i).reduce(function (e, r) var t = i[r]; return g.isStr(t) && "" !== t , "") + "slots=1&rand=".concat(Math.random()), bidRequest: e ; )) : (n = e.filter(function (e) return "banner" === m(e); ).reduce(function (e, r) , ), r.concat(Object.keys(n).reduce(function (r, e) var t, i; return t = n[e], i = 10, t.map(function (e, r) return r % i == 0 ? t.slice(r, r + i) : null; ).filter(function (e) return e; ).forEach(function (e) var i = h.combineSlotUrlParams(e.map(function (e) return h.createSlotParams(e, u); )); r.push( method: "GET", url: o, data: h.getOrderedParams(i).reduce(function (e, r) , "") + "slots=".concat(e.length, "&rand=").concat(Math.random()), bidRequest: e ); ), r; , []))); }, getOrderedParams: function getOrderedParams(e) var r = /^tg_v/, t = /^tg_i/, i = ["account_id"https://slate.com/human-interest/2020/09/,"site_id"https://slate.com/human-interest/2020/09/,"zone_id"https://slate.com/human-interest/2020/09/,"size_id"https://slate.com/human-interest/2020/09/,"alt_size_ids"https://slate.com/human-interest/2020/09/,"p_pos"https://slate.com/human-interest/2020/09/,"gdpr"https://slate.com/human-interest/2020/09/,"gdpr_consent"https://slate.com/human-interest/2020/09/,"us_privacy"https://slate.com/human-interest/2020/09/,"rp_schain"https://slate.com/human-interest/2020/09/,"tpid_tdid"https://slate.com/human-interest/2020/09/,"tpid_liveintent.com"https://slate.com/human-interest/2020/09/,"tg_v.LIseg"https://slate.com/human-interest/2020/09/,"dt.id"https://slate.com/human-interest/2020/09/,"dt.keyv"https://slate.com/human-interest/2020/09/,"dt.pref"https://slate.com/human-interest/2020/09/,"rf"https://slate.com/human-interest/2020/09/,"p_geo.latitude"https://slate.com/human-interest/2020/09/,"p_geo.longitude"https://slate.com/human-interest/2020/09/,"kw"].concat(Object.keys(e).filter(function (e) return r.test(e); )).concat(Object.keys(e).filter(function (e) return t.test(e); )).concat(["tk_flint"https://slate.com/human-interest/2020/09/,"x_source.tid"https://slate.com/human-interest/2020/09/,"x_source.pchain"https://slate.com/human-interest/2020/09/,"p_screen_res"https://slate.com/human-interest/2020/09/,"rp_floor"https://slate.com/human-interest/2020/09/,"rp_secure"https://slate.com/human-interest/2020/09/,"tk_user_key"]); return i.concat(Object.keys(e).filter(function (e) return -1 === i.indexOf(e); )); , combineSlotUrlParams: function combineSlotUrlParams(n) if (1 === n.length) return n[0]; var i = n.reduce(function (r, t, i) return Object.keys(t).forEach(function (e) r.hasOwnProperty(e) ), r; , ), o = new RegExp("^([^;]*)(;1)+$"); return Object.keys(i).forEach(function (e) var r = i[e].join(";"), t = r.match(o); i[e] = t ? t[1] : r; ), i; , createSlotParams: function createSlotParams(e, r) , serializeSupplyChain: function serializeSupplyChain(e) if (!T(e)) return ""; var r = e.ver, t = e.complete, i = e.nodes; return "".concat(r, ",").concat(t, "!").concat(h.serializeSupplyChainNodes(i)); , serializeSupplyChainNodes: function serializeSupplyChainNodes(e) var t = ["asi"https://slate.com/human-interest/2020/09/,"sid"https://slate.com/human-interest/2020/09/,"hp"https://slate.com/human-interest/2020/09/,"rid"https://slate.com/human-interest/2020/09/,"name"https://slate.com/human-interest/2020/09/,"domain"]; return e.map(function (r) return t.map(function (e) ""); ).join(","); ).join("!"); , interpretResponse: function interpretResponse(d, e) { var c = e.bidRequest; if (!(d = d.body) || "object" !== x(d)) return []; if (d.seatbid) var r = g.deepAccess(d, "ext.errors.rubicon"); Array.isArray(r) && 0 < r.length && g.logWarn("Rubicon: Error in video response"); var o = []; return d.seatbid.forEach(function (n) []).forEach(function (e) var r = ; e.id && (r.seatBidId = e.id), e.dealid && (r.dealId = e.dealid); var t, i = g.deepAccess(d, "ext.responsetimemillis.rubicon"); c && i && (c.serverResponseTimeMs = i), g.deepAccess(e, "ext.prebid.type") === u.d ? (r.mediaType = u.d, (t = g.deepAccess(e, "ext.prebid.targeting")) && "object" === x(t) && (r.adserverTargeting = t), e.ext.prebid.cache && "object" === x(e.ext.prebid.cache.vastXml) && e.ext.prebid.cache.vastXml.cacheId && e.ext.prebid.cache.vastXml.url ? (r.videoCacheKey = e.ext.prebid.cache.vastXml.cacheId, r.vastUrl = e.ext.prebid.cache.vastXml.url) : t && t.hb_uuid && t.hb_cache_host && t.hb_cache_path && (r.videoCacheKey = t.hb_uuid, r.vastUrl = "https://".concat(t.hb_cache_host).concat(t.hb_cache_path, "?uuid=").concat(t.hb_uuid)), e.adm && (r.vastXml = e.adm), e.nurl && (r.vastUrl = e.nurl), !r.vastUrl && e.nurl && (r.vastUrl = e.nurl)) : g.logWarn("Rubicon: video response received non-video media type"), o.push(r); ); ), o; var t = d.ads; return "object" !== x(c) || Array.isArray(c) || "video" !== m(c) || "object" !== x(t) || (t = t[c.adUnitCode]), !Array.isArray(t) || t.length < 1 ? [] : t.reduce(function (e, r, t) if ("ok" !== r.status) return e; var i, n, o, a, s = Array.isArray(c) ? c[t] : c; return s && "object" === x(s) ? (i = ""https://slate.com/human-interest/2020/09/,"-").concat(r.advertiser , r.creative_type && (i.mediaType = r.creative_type), r.creative_type === u.d ? (i.width = s.params.video.playerWidth, i.height = s.params.video.playerHeight, i.vastUrl = r.creative_depot_url, i.impression_id = r.impression_id, i.videoCacheKey = r.impression_id) : (i.ad = (o = r.script, a = r.impression_id, "nnnx3c!-- Rubicon Project Ad Tag --x3en

nn

nn")), n = v(f[r.size_id].split("x").map(function (e)
return Number(e);
), 2), i.width = n[0], i.height = n[1]), i.rubiconTargeting = (Array.isArray(r.targeting) ? r.targeting : []).reduce(function (e, r)
return e[r.key] = r.values[0], e;
,
rpfl_elemid: s.adUnitCode
), e.push(i)) : g.logError("Rubicon: bidRequest undefined at index position:".concat(t), c, d), e;
, []).sort(function (e, r)
return (r.cpm );
},
getUserSyncs: function getUserSyncs(e, r, t, i)
if (!R && e.iframeEnabled)
var n = "";
return t && "string" == typeof t.consentString && ("boolean" == typeof t.gdprApplies ? n += "?gdpr=".concat(Number(t.gdprApplies), "&gdpr_consent=").concat(t.consentString) : n += "?gdpr_consent=".concat(t.consentString)), i && (n += "".concat(n ? "&" : "?"https://slate.com/human-interest/2020/09/,"us_privacy=").concat(encodeURIComponent(i))), R = !0,
type: "iframe",
url: a + n
;

,
transformBidParams: function transformBidParams(e)
return g.convertTypes(
accountId: "number",
siteId: "number",
zoneId: "number"
, e);

};

function _(e, r) !d[n]) return null;
var o = d[n];

var a = function () null;
();

if (!a

function I(e, r) r.refererInfo.referer;
return e.params.secure ? t.replace(/^http:/i, "https:") : t;

function A(e, r)
var t = e.params;

if ("video" === r)
var i = [];
return t.video && t.video.playerWidth && t.video.playerHeight ? i = [t.video.playerWidth, t.video.playerHeight] : Array.isArray(g.deepAccess(e, "mediaTypes.video.playerSize")) && 1 === e.mediaTypes.video.playerSize.length ? i = e.mediaTypes.video.playerSize[0] : Array.isArray(e.sizes) && 0 < e.sizes.length && Array.isArray(e.sizes[0]) && 1 < e.sizes[0].length && (i = e.sizes[0]), i; var n = []; return Array.isArray(t.sizes) ? n = t.sizes : void 0 !== g.deepAccess(e, "mediaTypes.banner.sizes") ? n = s(e.mediaTypes.banner.sizes) : Array.isArray(e.sizes) && 0 < e.sizes.length ? n = s(e.sizes) : g.logWarn("Rubicon: no sizes are setup or found"), S(n); function s(e) return g.parseSizesInput(e).reduce(function (e, r) var t = parseInt(f[r], 10); return t && e.push(t), e; , []); function c(e) return "object" === x(g.deepAccess(e, "params.video")) && void 0 !== g.deepAccess(e, "mediaTypes.".concat(u.d)); function m(e, r) var t = 1 < arguments.length && void 0 !== r && r; return c(e) ? -1 === ["outstream"https://slate.com/human-interest/2020/09/,"instream"].indexOf(g.deepAccess(e, "mediaTypes.".concat(u.d, ".context"))) ? void (t && g.logError("Rubicon: mediaTypes.video.context must be outstream or instream")) : A(e, "video").length < 2 ? void (t && g.logError("Rubicon: could not determine the playerSize of the video")) : (t && g.logMessage("Rubicon: making video request for adUnit", e.adUnitCode), "video") : 0 === A(e, "banner").length ? void (t && g.logError("Rubicon: could not determine the sizes for banner request")) : (t && g.logMessage("Rubicon: making banner request for adUnit", e.adUnitCode), "banner"); function S(e) var n = [15, 2, 9]; return e.sort(function (e, r) ); function C(e) var r = parseInt(g.deepAccess(e, "params.video.size_id")); return isNaN(r) ? "outstream" === g.deepAccess(e, "mediaTypes.".concat(u.d, ".context")) ? 203 : 201 : r; function j(e) return ranges: low: [ max: 5, increment: .5 ], medium: [ max: 20, increment: .1 ], high: [ max: 20, increment: .01 ], auto: [ max: 5, increment: .05 , min: 5, max: 10, increment: .1 , min: 10, max: 20, increment: .5 ], dense: [ max: 3, increment: .01 , min: 3, max: 8, increment: .05 , min: 8, max: 20, increment: .5 ], custom: e.getConfig("customPriceBucket") && e.getConfig("customPriceBucket").buckets [e.getConfig("priceGranularity")] ; function k(r) var t = !0, e = Object.prototype.toString.call([]), i = Object.prototype.toString.call(0), n = mimes: e, protocols: e, maxduration: i, linearity: i, api: e ; return Object.keys(n).forEach(function (e) Object.prototype.toString.call(g.deepAccess(r, "mediaTypes.video." + e)) !== n[e] && (t = !1, g.logError("Rubicon: mediaTypes.video." + e + " is required and must be of type: " + n[e])); ), t; function T(e) g.logError("Rubicon: required schain params missing")), r; function w(e, r) return "rp_schain" === e ? "rp_schain=".concat(r) : "".concat(e, "=").concat(encodeURIComponent(r)); var R = !1; Object(i.registerBidder)(h); } }, [677]); pbjsChunk([93], { 719: function _(e, t, r) e.exports = r(720); , 720: function _(e, t, r) { "use strict"; Object.defineProperty(t, "__esModule", value: !0 ), r.d(t, "spec", function () return o; ), r.d(t, "_isInbounds", function () return a; ), t._getPlatform = v; var n = r(1), y = r(0), i = r(2), c = r(3), g = r(10), d = r(44); function h(e, t) function (e, t) 32)(?:Clamped)?Array$/.test(r)) return s(e, t); (e, t) function s(e, t) t > e.length) && (t = e.length);

for (var r = 0, n = new Array(t); r < t; r++) n[r] = e[r]; return n; function u() function p(e, t, r) return t in e ? Object.defineProperty(e, t, value: r, enumerable: !0, configurable: !0, writable: !0 ) : e[t] = r, e; var b = "sonobi", l = Object(y.generateUUID)(), o = { code: b, supportedMediaTypes: [i.b, i.d], isBidRequestValid: function isBidRequestValid(e) if (!e.params) return !1; if (!e.params.ad_unit && !e.params.placement_id) return !1; if (!Object(y.deepAccess)(e, "mediaTypes.banner") && !Object(y.deepAccess)(e, "mediaTypes.video")) return !1; if (Object(y.deepAccess)(e, "mediaTypes.banner")) if (!Object(y.deepAccess)(e, "mediaTypes.banner.sizes") && !e.params.sizes) return !1; else if (Object(y.deepAccess)(e, "mediaTypes.video")) if ("outstream" === Object(y.deepAccess)(e, "mediaTypes.video.context") && !e.params.sizes) return !1; if ("instream" === Object(y.deepAccess)(e, "mediaTypes.video.context") && !Object(y.deepAccess)(e, "mediaTypes.video.playerSize")) return !1; return !0; , buildRequests: function buildRequests(e, t) var r = e.map(function (e) var t = function (e) if (e.params.ad_unit) return e.params.ad_unit; return e.params.placement_id; (e); return /^[/]?[d]+[[/].+[/]?]?$/.test(t) ? (t = "/" === t.charAt(0) ? t : "/" + t, p(, "".concat(t, "), n = ; r.forEach(function (e) u(n, e); ); var i = key_maker: JSON.stringify(n), ref: t.refererInfo.referer, s: Object(y.generateUUID)(), pv: l, vp: v(), lib_name: "prebid", lib_v: "3.23.0", us: 0 ; c.b.getConfig("userSync") && c.b.getConfig("userSync").syncsPerBidder && (i.us = c.b.getConfig("userSync").syncsPerBidder), d.a.canBidderRegisterSync("iframe", b) ? i.ius = 1 : i.ius = 0, Object(y.deepAccess)(e[0], "params.hfa") && (i.hfa = Object(y.deepAccess)(e[0], "params.hfa")), e[0].params.referrer && (i.ref = e[0].params.referrer), t && t.gdprConsent && (i.gdpr = t.gdprConsent.gdprApplies ? "true" : "false", t.gdprConsent.consentString && (i.consent_string = t.gdprConsent.consentString)); var s = function (t) e.privacy && e.privacy.optout) return null; return e; ("fhnS5drwmH"); s && (i.digid = s.id, i.digkeyv = s.keyv), e[0].schain && (i.schain = JSON.stringify(e[0].schain)), Object(y.deepAccess)(e[0], "userId") && 0 < Object.keys(e[0].userId).length && (i.userid = JSON.stringify(e[0].userId)); var o = e[0].params.keywords; if (o && (i.kw = o), t && t.uspConsent && (i.us_privacy = t.uspConsent), Object(y.isEmpty)(n)) return null; var a = "https://apex.go.sonobi.com/trinity.json"; return Object(y.deepAccess)(e[0], "params.bid_request_url") && (a = Object(y.deepAccess)(e[0], "params.bid_request_url")), method: "GET", url: a, withCredentials: !0, data: i, bidderRequests: e ; , interpretResponse: function interpretResponse(e, l) { var f = e.body, m = [], v = l.data.ref; return 0 === Object.keys(f.slots).length || Object.keys(f.slots).forEach(function (e) var t = f.slots[e], r = e.split("), m; }, getUserSyncs: function getUserSyncs(e, t) var r = []; try e.pixelEnabled && t[0].body.sbi_px.forEach(function (e) r.push( type: e.type, url: e.url ); ); catch (e) return r; }; function f(e) return Object(y.deepAccess)(e, "mediaTypes.video") ? "" : e.params.sizes ? Object(y.parseSizesInput)(e.params.sizes).join(",") : Object(y.deepAccess)(e, "mediaTypes.banner.sizes") ? Object(y.parseSizesInput)(Object(y.deepAccess)(e, "mediaTypes.banner.sizes")).join(",") : e.sizes ? Object(y.parseSizesInput)(e.sizes).join(",") : void 0; function m(e) f=".concat(e.params.floor) : ""; var j = function j(i, s) return function (e, t) "outstream" === i ? (r = t, n = s, "https://".concat(e, "apex.go.sonobi.com/vast.xml?vid=").concat(r, "&ref=").concat(encodeURIComponent(n))) : '‘;
var r, n;
;
;

var a = function a(e)
var r = 0 < arguments.length && void 0 !== e ? e : window; return function () var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : 0, t = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : Number.MAX_SAFE_INTEGER; return r.innerWidth >= e && r.innerWidth < t; ; ; function v() var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : window, t = a(e), r = 992, n = 768; return t(0, 768) ? "mobile" : t(n, r) ? "tablet" : "desktop"; function O(i) i.renderer.push(function () var e = h(i.getSize().split("x"), 2), t = e[0], r = e[1], n = new window.SbiOutstreamRenderer(); n.init( vastUrl: i.vastUrl, height: r, width: t ), n.setRootElement(i.adUnitCode); ); Object(n.registerBidder)(o); } }, [719]); pbjsChunk([85], { 741: function _(e, r, t) e.exports = t(742); , 742: function _(e, r, t) { "use strict"; Object.defineProperty(r, "__esModule", value: !0 ), t.d(r, "spec", function () return n; ); var a = t(1), d = t(0), p = 12, o = 11, c = 0, u = 22, n = code: "teads", supportedMediaTypes: ["video"https://slate.com/human-interest/2020/09/,"banner"], isBidRequestValid: function isBidRequestValid(e) var r, t, a = !1; return void 0 !== e.params && (r = i(d.getValue(e.params, "placementId")), t = i(d.getValue(e.params, "pageId")), a = r && t), a , buildRequests: function buildRequests(e, r) var t = e.map(I), a = referrer: function (e) var r = ""; e && e.refererInfo && e.refererInfo.referer && (r = e.refererInfo.referer); return r; (r), data: t, deviceWidth: screen.width, hb_version: "3.23.0" ; e[0].schain && (a.schain = e[0].schain); var n, d, i, s = r.gdprConsent; return r && s && (n = "boolean" == typeof s.gdprApplies, d = "string" == typeof s.consentString, i = n ? function (e, r, t) var a = p; e ? function (e, r) return e && 1 === r ? e.hasGlobalScope (r, t) && (a = o) : a = c; return a; (s.gdprApplies, s.vendorData, s.apiVersion) : u, a.gdpr_iab = consent: d ? s.consentString : "", status: i, apiVersion: s.apiVersion ), r && r.uspConsent && (a.us_privacy = r.uspConsent), method: "POST", url: "https://a.teads.tv/hb/bid-request", data: JSON.stringify(a) ; , interpretResponse: function interpretResponse(e) var t = []; return (e = e.body).responses && e.responses.forEach(function (e) var r = cpm: e.cpm, width: e.width, height: e.height, currency: e.currency, netRevenue: !0, ttl: e.ttl, ad: e.ad, requestId: e.bidId, creativeId: e.creativeId, placementId: e.placementId ; e.dealId && (r.dealId = e.dealId), t.push(r); ), t; ; function I(e) var r, t = , a = d.getValue(e.params, "placementId"), n = d.getValue(e.params, "pageId"); return t.sizes = (r = e, d.parseSizesInput(function (e) d.isArray(r) (r))), t.bidId = d.getBidIdParameter("bidId", e), t.bidderRequestId = d.getBidIdParameter("bidderRequestId", e), t.placementId = parseInt(a, 10), t.pageId = parseInt(n, 10), t.adUnitCode = d.getBidIdParameter("adUnitCode", e), t.auctionId = d.getBidIdParameter("auctionId", e), t.transactionId = d.getBidIdParameter("transactionId", e), t; function i(e) return 0 < parseInt(e); Object(a.registerBidder)(n); } }, [741]); pbjsChunk([76], { 761: function _(r, e, t) r.exports = t(762); , 762: function _(r, e, t) { "use strict"; Object.defineProperty(e, "__esModule", value: !0 ), t.d(e, "tripleliftAdapterSpec", function () return s; ); var n = t(2), i = t(1), o = t(0), u = t(3); function p(r) return function (r) if (Array.isArray(r)) return d(r); (r) function d(r, e) var a = !0, c = null, s = { code: "triplelift", supportedMediaTypes: [n.b], isBidRequestValid: function isBidRequestValid(r) return void 0 !== r.params.inventoryCode; , buildRequests: function buildRequests(r, e) { var t, n = "https://tlx.3lift.com/header/auction?", i = function (r) { var e = , t = r[0].schain; e.imp = r.map(function (r, e) { return id: e, tagid: r.params.inventoryCode, floor: r.params.floor, banner: format: r.sizes.filter(l).map(function (r) return w: r[0], h: r[1] ; ) ; }); var n = [].concat(p(function (r) return f(r, "tdid"https://slate.com/human-interest/2020/09/,"adserver.org"https://slate.com/human-interest/2020/09/,"TDID"); (r)), p(function (r) return f(r, "idl_env"https://slate.com/human-interest/2020/09/,"liveramp.com"https://slate.com/human-interest/2020/09/,"idl"); (r)), p(function (r) return f(r, "criteoId"https://slate.com/human-interest/2020/09/,"criteo.com"https://slate.com/human-interest/2020/09/,"criteoId"); (r))); 0 < n.length && (e.user = ext: eids: n ); t && (e.ext = schain: t ); return e; }(r); return n = o.tryAppendQueryString(n, "lib"https://slate.com/human-interest/2020/09/,"prebid"), n = o.tryAppendQueryString(n, "v"https://slate.com/human-interest/2020/09/,"3.23.0"), e && e.refererInfo && (t = e.refererInfo.referer, n = o.tryAppendQueryString(n, "referrer", t)), e && e.timeout && (n = o.tryAppendQueryString(n, "tmax", e.timeout)), e && e.gdprConsent && (void 0 !== e.gdprConsent.gdprApplies && (a = e.gdprConsent.gdprApplies, n = o.tryAppendQueryString(n, "gdpr", a.toString())), void 0 !== e.gdprConsent.consentString && (c = e.gdprConsent.consentString, n = o.tryAppendQueryString(n, "cmp_cs", c))), e && e.uspConsent && (n = o.tryAppendQueryString(n, "us_privacy", e.uspConsent)), !0 === u.b.getConfig("coppa") && (n = o.tryAppendQueryString(n, "coppa", !0)), n.lastIndexOf("&") === n.length - 1 && (n = n.substring(0, n.length - 1)), o.logMessage("tlCall request built: " + n), method: "POST", url: n, data: i, bidderRequest: e ; }, interpretResponse: function interpretResponse(r, e) []).map(function (r) return function (r, e) var t = , n = e.width (t, r); ); , getUserSyncs: function getUserSyncs(r, e, t, n) var i = function (r) if (!r) return; if (r.iframeEnabled) return "iframe"; if (r.pixelEnabled) return "image"; (r); if (i) var u = "https://eb2.3lift.com/sync?"; return "image" === i && (u = o.tryAppendQueryString(u, "px", 1), u = o.tryAppendQueryString(u, "src"https://slate.com/human-interest/2020/09/,"prebid")), null !== c && (u = o.tryAppendQueryString(u, "gdpr", a), u = o.tryAppendQueryString(u, "cmp_cs", c)), n && (u = o.tryAppendQueryString(u, "us_privacy", n)), [ type: i, url: u ]; }; function f(r, e, t, n) { return r.map((o = e, function (r) return r && r.userId && r.userId[o]; )).filter(function (r) return !!r; ).map((i = t, u = n, function (r) return source: i, uids: [ id: r, ext: rtiPartner: u ] ; )); var i, u, o; } function l(r) return 2 === r.length && "number" == typeof r[0] && "number" == typeof r[1]; Object(i.registerBidder)(s); } }, [761]); pbjsChunk([75], { 763: function _(e, r, t) e.exports = t(764); , 764: function _(e, r, t) { "use strict"; Object.defineProperty(r, "__esModule", value: !0 ), t.d(r, "spec", function () return v; ); var m = t(0), s = t(1), o = t(10), c = t(2), f = "Bid from response has no auid parameter - ", l = "Bid from response has no adm parameter - ", p = "Array of bid objects is empty", g = "Can't find in requested bids the bid with auid - ", u = "Seatbid array from response has empty item", y = "Response is empty", b = "Response has empty seatbid array", h = "Seatbid from response has no array of bid objects - ", v = { code: "trustx", supportedMediaTypes: [c.b, c.d], isBidRequestValid: function isBidRequestValid(e) return !!e.params.uid; , buildRequests: function buildRequests(e, r) []).forEach(function (e) m.isEmpty(e.params.keywords) ); var t = pt: l, auids: p.join(","), sizes: m.getKeys(f).join(","), r: o, wrapperType: "Prebid_js", wrapperVersion: "3.23.0" ; return a && (t.keywords = JSON.stringify(a)), r && (r.refererInfo && r.refererInfo.referer && (t.u = r.refererInfo.referer), r.timeout && (t.wtimeout = r.timeout), r.gdprConsent && (r.gdprConsent.consentString && (t.gdpr_consent = r.gdprConsent.consentString), t.gdpr_applies = "boolean" == typeof r.gdprConsent.gdprApplies ? Number(r.gdprConsent.gdprApplies) : 1), r.uspConsent && (t.us_privacy = r.uspConsent)), method: "GET", url: "https://sofia.trustx.org/hb", data: m.parseQueryStringParameters(t).replace(/&$/, ""), bidsMap: u ; , interpretResponse: function interpretResponse(e, r, t) { var s = 2 < arguments.length && void 0 !== t ? t : o.a; e = e && e.body; var n, d = [], i = r.bidsMap, a = r.data.pt; return e ? e.seatbid && !e.seatbid.length && (n = b) : n = y, !n && e.seatbid && e.seatbid.forEach(function (e) { !function (e, d, r, t, s) (function (e) m.logError(p) : m.logError(h + JSON.stringify(e)) : m.logError(u); return e && e.bid && e.bid[0]; (e), i, a, d, s); }), n && m.logError(n), d; }, getUserSyncs: function getUserSyncs(e) if (e.pixelEnabled) return [ type: "image", url: "https://sofia.trustx.org/push_sync" ]; }; function E(e) var r; r = e.value, m.isArray(r) && 0 < r.length && "" === e.value[0] && delete e.value; function w(e) e.renderer.push(function () window.ANOutstreamVideo.renderAd( targetId: e.adUnitCode, adResponse: e.adResponse ); ); Object(s.registerBidder)(v); } }, [763]); pbjs.processQueue(); }, ]; window.modules["via.legacy"] = [function(require,module,exports){"use strict"; DS.service("via", function () { "use strict"; // remove `via` from url, to be used after amplitude logs it to prevent users from sharing such urls function removeFromLocation() var url = new URL(location.href); url.searchParams.delete("via"); history.replaceState(null, "", url.toString()); // and add `via` param to any outbound links function addViaToUrl(href, via) // keys correspond to "page_types" in editable_components.yml var PREFIXES = article: "article", homepage: "homepage", "vertical front": "section", "rubric front": "rubric" ; var pageType; function setPageType(amplitudePageType) pageType = PREFIXES[amplitudePageType]; var DELIMITER = "_"; function concatVia(node, via) var tag = node.dataset && node.dataset.via; if (tag) via = (via.length ? tag + DELIMITER : tag) + via; return via; function addToClickedLinks() document.documentElement.addEventListener("click", function (e) var a; var via = ""; // detect link nodes and collect via directives to append to the href var node = e.target; // the element where this event originated may have been removed from the dom, e.g. in the case of the OIL CMP which disappears after you interact with it while (node && node !== e.currentTarget) if (node.tagName === "A") a = node; via = concatVia(node, via); node = node.parentNode; if (a && via) if (pageType) via = pageType + DELIMITER + via; a.href = addViaToUrl(a.href, via); ); function addToSubmittedForms() document.documentElement.addEventListener("submit", function (e) var form = e.target; // collect via directives var via = ""; var node = e.target; while (node !== e.currentTarget) via = concatVia(node, via); node = node.parentNode; if (via) if (pageType) via = pageType + DELIMITER + via; // dynamically create a hidden input for the form url var input = document.createElement("input"); input.type = "hidden"; input.name = "via"; input.value = via; form.appendChild(input); ); // start listening only once, when first injected addToClickedLinks(); addToSubmittedForms(); return setPageType: setPageType, removeFromLocation: removeFromLocation ; }); }, ]; window.modules["visibility.legacy"] = [function(require,module,exports){"use strict"; DS.service("$visibility", ["$document"https://slate.com/human-interest/2020/09/,"$window"https://slate.com/human-interest/2020/09/,"_throttle"https://slate.com/human-interest/2020/09/,"Eventify", function ($document, $window, _throttle, Eventify) var list = [], Visible, VisibleEvent; /** * @param number a * @param number b * @returns * * @see http://jsperf.com/math-min-vs-if-condition-vs/8 */ function min(a, b) return a < b ? a : b; /** * @param number a * @param number b * @returns * * @see http://jsperf.com/math-min-vs-if-condition-vs/8 */ function max(a, b) return a > b ? a : b;

/**
* Fast loop through watched elements
*/

function onScroll()
list.forEach(updateVisibility);

/**
* updates seen property
* @param Visble item
* @param evt
* @fires Visible#shown
* @fires Visible#hidden
*/

function updateSeen(item, evt)
var px = evt.visiblePx,
percent = evt.visiblePercent; // if some pixels are visible and we’re greater/equal to threshold

if (px && percent >= item.shownThreshold && !item.seen)
item.seen = true;
setTimeout(function ()
item.trigger(“shown”, new VisibleEvent(“shown”, evt));
, 15); // if no pixels or percent is less than threshold
else if ((!px
/**
* sets preload property
* @param Visible item
* @param evt
* @param Number innerHeight
* @fires Visible#preload
*/

function updatePreload(item, evt, innerHeight)
if (!item.preload && item.preloadThreshhold && shouldBePreloaded(evt.target, evt.rect, item.preloadThreshhold, innerHeight))
item.preload = true;
setTimeout(function ()
item.trigger(“preload”, new VisibleEvent(“preload”, evt));
, 15);

/**
* Trigger events
* @param Visible item
*/

function updateVisibility(item) innerHeight),
evt =
target: item.el,
rect: rect,
visiblePx: px,
visiblePercent: percent
;
updateSeen(item, evt);
updatePreload(item, evt, innerHeight);

/**
* Return normalized viewport height
* @return number
*/

function getViewportHeight()
return $window.innerHeight
/**
* Return normalized viewport width
* @return number
*/

function getViewportWidth()
return $window.innerWidth
/**
* make sure an element isn’t hidden by styles or etc
* @param Element el
* @return Boolean
*/

function isElementNotHidden(el)
return el && el.offsetParent !== null && !el.getAttribute(“hidden”) && getComputedStyle(el).display !== “none” && getComputedStyle(el).visibility !== “hidden”;

/**
* Apparently the fastest way…
* @param Element el
* @returns boolean
* @example if (!$visibility.isElementInViewport(el)) …
*/

function isElementInViewport(el)
/**
* @param Element el
* @param ClientRect rect
* @param Number preloadThreshhold
* @param Number innerHeight
* @return Boolean
*/

function shouldBePreloaded(el, rect, preloadThreshhold, innerHeight)
return rect.top <= innerHeight + preloadThreshhold && isElementNotHidden(el); /** * Create a one-dimensional spacial hash of x * @param number x * @param number stepSize * @param number optimalK * @param number base * @return number */ function getLinearSpacialHash(x, stepSize, optimalK, base) var index = Math.floor(x / (stepSize /** * @param ClientRect rect * @param number innerHeight * @returns number */ function getVerticallyVisiblePixels(rect, innerHeight) return min(innerHeight, max(rect.bottom, 0)) - min(max(rect.top, 0), innerHeight); /** * Get offset of element relative to entire page * * @param Element el * @returns left: number, top: number * @see http://jsperf.com/offset-vs-getboundingclientrect/7 */ function getPageOffset(el) var offsetLeft = el.offsetLeft, offsetTop = el.offsetTop; while (el = el.offsetParent) offsetLeft += el.offsetLeft; offsetTop += el.offsetTop; return left: offsetLeft, top: offsetTop ; /** * Create a new Visible class to observe when elements enter and leave the viewport * * Call destroy function to stop listening (this is until we have better support for watching for Node Removal) * @param Element el * @param shownThreshold: number, hiddenThreshold: number [options] * @class * @example this.visible = new $visibility.Visible(el); */ Visible = function Visible(el, options) 0; list.push(this); updateVisibility(this); // set immediately to visible or not ; Visible.prototype = /** * Stop triggering. */ destroy: function destroy() // remove from list list.splice(list.indexOf(this), 1); /** * @name Visible#on * @function * @param 'hidden' e EventName * @param function cb Callback */ /** * @name Visible#trigger * @function * @param 'hidden' e * @param */ ; Eventify.enable(Visible.prototype); VisibleEvent = function VisibleEvent(type, options) var _this = this; this.type = type; Object.keys(options).forEach(function (key) _this[key] = options[key]; ); ; // listen for scroll events (throttled) $document.addEventListener("scroll", _throttle(onScroll, 200)); // public this.getPageOffset = getPageOffset; this.getLinearSpacialHash = getLinearSpacialHash; this.getVerticallyVisiblePixels = getVerticallyVisiblePixels; this.getViewportHeight = getViewportHeight; this.getViewportWidth = getViewportWidth; this.isElementNotHidden = isElementNotHidden; this.isElementInViewport = isElementInViewport; this.Visible = Visible; ]); }, ]; 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",fvar 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

Amelia J. Bell

Next Post

Penske Automotive Group, Inc. (PAG): Hedge Funds Are Nibbling

Wed Oct 7 , 2020
At the end of February we announced the arrival of the first US recession since 2009 and we predicted that the market will decline by at least 20% in (see why hell is coming). We reversed our stance on March 25th after seeing unprecedented fiscal and monetary stimulus unleashed by […]