Skip to content

Instantly share code, notes, and snippets.

@euskadi31
Last active September 7, 2017 21:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save euskadi31/ec3e82bf94da2ea9bd430a5f3a1042af to your computer and use it in GitHub Desktop.
Save euskadi31/ec3e82bf94da2ea9bd430a5f3a1042af to your computer and use it in GitHub Desktop.
/*
* Copyright (c) 2010 Apple Inc. All rights reserved.
*/
function articleHeight() {
var e = document.getElementById("article").offsetHeight,
t = parseFloat(getComputedStyle(document.getElementById("article")).marginTop);
return e + 2 * t
}
function smoothScroll(e, t, n, i) {
function a(t, n) {
scrollEventIsSmoothScroll = !0, e.scrollTop = n, setTimeout(function() {
scrollEventIsSmoothScroll = !1
}, 0)
}
const o = 1e3 / 60;
var r = e.scrollTop,
s = r + t,
l = 0,
m = articleHeight() - window.innerHeight;
if (l > s && (s = l), s > m && (s = m), r != s) {
var d = Math.abs(s - r);
if (d < Math.abs(t) && (n = n * d / Math.abs(t)), smoothScrollingAnimator) {
var c = smoothScrollingAnimator.animations[0],
u = c.progress,
g = u > .5 ? 1 - u : u,
h = n / (1 - g),
p = -g * h,
f = Math.sin(Math.PI / 2 * g),
S = f * f,
C = (r - s * S) / (1 - S);
return abortSmoothScroll(), smoothScrollingAnimator = new AppleAnimator(h, o, i), smoothScrollingAnimation = new AppleAnimation(C, s, a), smoothScrollingAnimator.addAnimation(smoothScrollingAnimation), void smoothScrollingAnimator.start(p)
}
smoothScrollingAnimator = new AppleAnimator(n, o, i), smoothScrollingAnimation = new AppleAnimation(r, s, a), smoothScrollingAnimator.addAnimation(smoothScrollingAnimation), smoothScrollingAnimator.start()
}
}
function abortSmoothScroll() {
smoothScrollingAnimator.stop(AnimationTerminationCondition.Interrupted), smoothScrollingAnimator = null, smoothScrollingAnimation = null
}
function articleScrolled() {
!scrollEventIsSmoothScroll && smoothScrollingAnimator && abortSmoothScroll(), ReaderJSController.articleScrolled()
}
function traverseReaderContent(e, t) {
if (e) {
var n = e.offsetTop,
i = document.createTreeWalker(document.getElementById("article"), NodeFilter.SHOW_ELEMENT, {
acceptNode: function(e) {
var t = e.classList;
return t.contains("page-number") || t.contains("float") || t.contains("page") || t.contains("scrollable") || "HR" === e.tagName || 0 === e.offsetHeight || "inline" === getComputedStyle(e).display || n === e.offsetTop ? NodeFilter.FILTER_SKIP : NodeFilter.FILTER_ACCEPT
}
});
return i.currentNode = e, i[t]()
}
}
function nextReaderContentElement(e) {
return traverseReaderContent(e, "nextNode")
}
function previousReaderContentElement(e) {
return traverseReaderContent(e, "previousNode")
}
function articleTitleElement() {
return document.querySelector("#article .page .title")
}
function keyDown(e) {
var t = !(e.metaKey || e.altKey || e.ctrlKey || e.shiftKey),
n = !e.metaKey && !e.altKey && !e.ctrlKey && e.shiftKey;
switch (e.keyCode) {
case 8:
n ? ReaderJSController.goForward() : t && ReaderJSController.goBack(), e.preventDefault();
break;
case 74:
ContentAwareScrollerJS.scroll(ContentAwareNavigationDirection.Down);
break;
case 75:
ContentAwareScrollerJS.scroll(ContentAwareNavigationDirection.Up)
}
}
function getArticleScrollPosition() {
scrollInfo = {}, scrollInfo.version = 1;
var e = document.getElementsByClassName("page");
if (!e.length)
return scrollInfo.pageIndex = 0, scrollInfo;
scrollInfo.pageIndex = e.length - 1;
var t,
n = window.scrollY;
for (t = 0; t < e.length; t++) {
var i = e[t];
if (i.offsetTop + i.offsetHeight >= n) {
scrollInfo.pageIndex = t;
break
}
}
return scrollInfo
}
function restoreInitialArticleScrollPosition() {
var e = document.getElementsByClassName("page"),
t = e[initialScrollPosition.pageIndex];
t && (document.body.scrollTop = t.offsetTop)
}
function restoreInitialArticleScrollPositionIfPossible() {
if (!didRestoreInitialScrollPosition) {
if (!initialScrollPosition && (initialScrollPosition = ReaderJSController.initialArticleScrollPosition(), !initialScrollPosition || !initialScrollPosition.pageIndex))
return void (didRestoreInitialScrollPosition = !0);
var e = document.getElementsByClassName("page-number").length;
initialScrollPosition.pageIndex >= e || (setTimeout(restoreInitialArticleScrollPosition, DelayBeforeRestoringScrollPositionInMs), didRestoreInitialScrollPosition = !0)
}
}
function makeWideElementsScrollable() {
for (var e = document.querySelectorAll("table, pre"), t = e.length, n = 0; t > n; ++n) {
var i = e[n];
if (!i.classList.contains("float") && !i.parentElement.classList.contains("scrollable")) {
var a = document.createElement("div");
i.parentElement.insertBefore(a, i), i.remove(), a.appendChild(i), a.classList.add("scrollable")
}
}
}
function fontSettings(e) {
const t = [15, 16, 17, 18, 19, 20, 21, 23, 26, 28, 37, 46],
n = ["25px", "26px", "27px", "28px", "29px", "30px", "31px", "33px", "37px", "39px", "51px", "62px"],
i = {
System: {
lineHeights: ["25px", "26px", "27px", "29px", "30px", "31px", "32px", "33px", "38px", "39px", "51px", "62px"],
cssClassName: "system"
},
Athelas: {
cssClassName: "athelas"
},
Charter: {
lineHeights: ["25px", "26px", "27px", "28px", "29px", "30px", "32px", "34px", "38px", "39px", "51px", "62px"],
cssClassName: "charter"
},
Georgia: {
lineHeights: ["25px", "26px", "27px", "28px", "29px", "30px", "32px", "34px", "38px", "41px", "51px", "62px"],
cssClassName: "georgia"
},
"Iowan Old Style": {
lineHeights: ["25px", "26px", "27px", "28px", "29px", "30px", "32px", "34px", "38px", "39px", "51px", "62px"],
cssClassName: "iowan"
},
Palatino: {
lineHeights: ["25px", "26px", "27px", "28px", "29px", "30px", "31px", "34px", "37px", "40px", "51px", "62px"],
cssClassName: "palatino"
},
Seravek: {
lineHeights: ["25px", "26px", "27px", "28px", "28px", "30px", "31px", "34px", "37px", "39px", "51px", "62px"],
cssClassName: "seravek"
},
"Times New Roman": {
cssClassName: "times"
},
"Hiragino Sans W3": {
cssClassName: "hiraginosans",
lineHeights: ["1.85em", "1.78em", "1.74em", "1.71em", "1.72em", "1.73em", "1.75em", "1.76em", "1.78em", "1.9em", "1.92em", "2em"]
},
"Hiragino Kaku Gothic ProN": {
cssClassName: "hiraginokaku",
lineHeights: ["1.85em", "1.78em", "1.74em", "1.7em", "1.69em", "1.68em", "1.69em", "1.7em", "1.74em", "1.85em", "1.9em", "2em"]
},
"Hiragino Mincho ProN": {
cssClassName: "hiraginomincho",
lineHeights: ["1.75em", "1.72em", "1.69em", "1.66em", "1.64em", "1.56em", "1.53em", "1.56em", "1.6em", "1.65em", "1.69em", "1.72em"]
},
"Hiragino Maru Gothic ProN": {
cssClassName: "hiraginomaru",
lineHeights: ["1.85em", "1.78em", "1.74em", "1.7em", "1.69em", "1.68em", "1.69em", "1.7em", "1.74em", "1.85em", "1.9em", "2em"]
},
"PingFang SC": {
lineHeights: ["1.85em", "1.78em", "1.74em", "1.7em", "1.69em", "1.68em", "1.69em", "1.7em", "1.74em", "1.85em", "1.9em", "2em"],
cssClassName: "pingfangsc"
},
"Heiti SC": {
lineHeights: ["1.85em", "1.78em", "1.74em", "1.7em", "1.7em", "1.71em", "1.72em", "1.75em", "1.8em", "1.9em", "1.95em", "2em"],
cssClassName: "heitisc"
},
"Songti SC": {
lineHeights: ["1.8em", "1.78em", "1.74em", "1.72em", "1.71em", "1.72em", "1.73em", "1.75em", "1.8em", "1.9em", "1.95em", "1.96em"],
cssClassName: "songtisc"
},
"Kaiti SC": {
lineHeights: ["1.75em", "1.72em", "1.69em", "1.66em", "1.64em", "1.56em", "1.53em", "1.56em", "1.6em", "1.65em", "1.69em", "1.72em"],
cssClassName: "kaitisc"
},
"Yuanti SC": {
lineHeights: ["1.95em", "1.93em", "1.9em", "1.87em", "1.85em", "1.8em", "1.83em", "1.85em", "1.88em", "1.9em", "1.91em", "1.92em"],
cssClassName: "yuantisc"
},
"Libian SC": {
fontSizes: [27, 28, 29, 30, 31, 32, 33, 35, 37, 40, 42, 46],
lineHeights: ["1.65em", "1.63em", "1.62em", "1.61em", "1.6em", "1.6em", "1.61em", "1.62em", "1.63em", "1.64em", "1.64em", "1.65em"],
cssClassName: "libiansc"
},
"Weibei SC": {
fontSizes: [21, 22, 23, 24, 25, 26, 27, 29, 32, 34, 39, 43],
lineHeights: ["1.65em", "1.63em", "1.62em", "1.61em", "1.6em", "1.6em", "1.61em", "1.62em", "1.63em", "1.64em", "1.64em", "1.65em"],
cssClassName: "weibeisc"
},
"Yuppy SC": {
lineHeights: ["1.75em", "1.73em", "1.7em", "1.67em", "1.65em", "1.6em", "1.63em", "1.65em", "1.68em", "1.7em", "1.71em", "1.72em"],
cssClassName: "yuppysc"
},
"PingFang TC": {
lineHeights: ["1.85em", "1.78em", "1.75em", "1.72em", "1.7em", "1.7em", "1.7em", "1.72em", "1.75em", "1.82em", "1.85em", "1.9em"],
cssClassName: "pingfangtc"
},
"Heiti TC": {
lineHeights: ["1.85em", "1.78em", "1.75em", "1.72em", "1.71em", "1.71em", "1.72em", "1.75em", "1.78em", "1.82em", "1.86em", "1.9em"],
cssClassName: "heititc"
},
"Songti TC": {
lineHeights: ["1.8em", "1.78em", "1.74em", "1.73em", "1.72em", "1.72em", "1.73em", "1.75em", "1.8em", "1.9em", "1.95em", "1.96em"],
cssClassName: "songtitc"
},
"Kaiti TC": {
fontSizes: [20, 21, 22, 23, 24, 25, 26, 28, 31, 33, 38, 43],
lineHeights: ["1.63em", "1.62em", "1.62em", "1.6em", "1.56em", "1.53em", "1.5em", "1.53em", "1.56em", "1.6em", "1.62em", "1.63em"],
cssClassName: "kaititc"
},
"Yuanti TC": {
lineHeights: ["1.95em", "1.93em", "1.9em", "1.87em", "1.85em", "1.8em", "1.83em", "1.85em", "1.88em", "1.9em", "1.91em", "1.92em"],
cssClassName: "yuantitc"
},
"Libian TC": {
fontSizes: [27, 28, 29, 30, 31, 32, 33, 35, 37, 40, 42, 46],
lineHeights: ["1.65em", "1.63em", "1.62em", "1.61em", "1.6em", "1.6em", "1.61em", "1.62em", "1.63em", "1.64em", "1.64em", "1.65em"],
cssClassName: "libiantc"
},
"Weibei TC": {
fontSizes: [21, 22, 23, 24, 25, 26, 27, 29, 32, 34, 39, 43],
lineHeights: ["1.65em", "1.63em", "1.62em", "1.61em", "1.6em", "1.6em", "1.61em", "1.62em", "1.63em", "1.64em", "1.64em", "1.65em"],
cssClassName: "weibeitc"
},
"Yuppy TC": {
lineHeights: ["1.75em", "1.73em", "1.7em", "1.67em", "1.65em", "1.6em", "1.63em", "1.65em", "1.68em", "1.7em", "1.71em", "1.72em"],
cssClassName: "yuppytc"
},
"Apple SD Gothic Neo": {
cssClassName: "applesdgothicneo"
},
"Nanum Gothic": {
cssClassName: "nanumgothic"
},
"Nanum Myeongjo": {
cssClassName: "nanummyeongjo"
},
"Khmer Sangam MN": {
cssClassName: "khmersangammn"
},
"Lao Sangam MN": {
cssClassName: "laosangam"
},
Thonburi: {
cssClassName: "thonburi"
},
Damascus: {
cssClassName: "damascus"
},
Kefa: {
cssClassName: "kefa"
},
"Arial Hebrew": {
cssClassName: "arialhebrew"
},
Mshtakan: {
cssClassName: "mshtakan"
},
"Plantagenet Cherokee": {
cssClassName: "plantagenetcherokee"
},
"Euphemia UCAS": {
cssClassName: "euphemiaucas"
},
"Kohinoor Bangla": {
cssClassName: "kohinoorbangla"
},
"Bangla Sangam MN": {
cssClassName: "banglasangammn"
},
"Gujarati Sangam MN": {
cssClassName: "gujarati"
},
"Gurmukhi MN": {
cssClassName: "gurmukhi"
},
"Kohinoor Devanagari": {
cssClassName: "kohinoordevanagari"
},
"ITF Devanagari": {
cssClassName: "itfdevanagari"
},
"Kannada Sangam MN": {
cssClassName: "kannada"
},
"Malayalam Sangam MN": {
cssClassName: "malayalam"
},
"Oriya Sangam MN": {
cssClassName: "oriya"
},
"Sinhala Sangam MN": {
cssClassName: "sinhala"
},
InaiMathi: {
cssClassName: "inaimathi"
},
"Tamil Sangam MN": {
cssClassName: "tamil"
},
"Kohinoor Telugu": {
cssClassName: "Kohinoor Telugu"
},
"Telugu Sangam MN": {
cssClassName: "telugu"
}
};
var a = i[e];
return a ? (a.fontSizes || (a.fontSizes = t), a.lineHeights || (a.lineHeights = n), a) : a
}
function loadTwitterJavaScript() {
window.twttr = function(e, t, n) {
var i,
a,
o = e.getElementsByTagName(t)[0];
if (!e.getElementById(n))
return a = e.createElement(t), a.id = n, a.src = "https://platform.twitter.com/widgets.js", o.parentNode.insertBefore(a, o), window.twttr || (i = {
_e: [],
ready: function(e) {
i._e.push(e)
}
})
}(document, "script", "twitter-wjs")
}
function richTweetWasCreated(e) {
var t = e.parentNode.querySelector(".simple-tweet");
t.classList.add("hidden")
}
function replaceSimpleTweetsWithRichTweets() {
if (ReaderJS._isJavaScriptEnabled()) {
var e = document.querySelectorAll("[data-reader-tweet-id]"),
t = e.length;
t && (loadTwitterJavaScript(), twttr.ready(function(n) {
for (var i = 0; t > i; ++i) {
var a = e[i];
n.widgets.createTweet(a.getAttribute("data-reader-tweet-id"), a, {
dnt: !0
}).then(richTweetWasCreated)
}
}))
}
}
function prepareTweetsInPrintingMailingFrame(e) {
for (var t = e.querySelectorAll(".tweet-wrapper"), n = t.length, i = 0; n > i; ++i) {
var a = t[i],
o = a.querySelector("iframe");
o && o.remove();
var r = a.querySelector(".simple-tweet");
r && r.classList.remove("hidden")
}
}
function localeForElement(e) {
var t = ReaderJSController.bestLocaleForString(e.textContent);
return t && t.length && "und" !== t ? t : "en"
}
function anchorForURL(e) {
var t = document.createElement("a");
return t.href = e, t
}
function stopExtendingElementBeyondTextColumn(e) {
e.classList.remove("extendsBeyondTextColumn"), e.style.removeProperty("width"), e.style.removeProperty("-webkit-margin-start")
}
function leadingMarginAndPaddingAppliedToElementFromAncestors(e) {
for (var t = 0, n = e.parentElement; n && !n.classList.contains("page");) {
var i = getComputedStyle(n);
t += parseFloat(i["-webkit-padding-start"]) + parseFloat(i["-webkit-margin-start"]), n = n.parentElement
}
return t
}
function extendElementBeyondTextColumn(e, t, n) {
e.classList.add("extendsBeyondTextColumn"), e.style.setProperty("width", t + "px"), e.style.setProperty("-webkit-margin-start", (n - t) / 2 - leadingMarginAndPaddingAppliedToElementFromAncestors(e) + "px")
}
function textSizeIndexIsValid(e) {
return "number" == typeof e && e >= MinTextZoomIndex && MaxTextZoomIndex >= e
}
function monitorMouseDownForPotentialDeactivation(e) {
lastMouseDownWasOutsideOfPaper = e && ReaderAppearanceJS.usesPaperAppearance() && !document.getElementById("article").contains(e.target)
}
function deactivateIfEventIsOutsideOfPaperContainer(e) {
lastMouseDownWasOutsideOfPaper && e && ReaderAppearanceJS.usesPaperAppearance() && !document.getElementById("article").contains(e.target) && ReaderJSController.requestDeactivationFromUserAction()
}
function updatePageNumbers() {
for (var e = document.getElementsByClassName("page-number"), t = e.length, n = ReaderJS.isLoadingNextPage(), i = 0; t > i; ++i)
n ? e[i].textContent = getLocalizedString("Page %@").format(i + 1) : e[i].textContent = getLocalizedString("Page %@ of %@").format(i + 1, t)
}
function incomingPagePlaceholder() {
return document.getElementById("incoming-page-placeholder")
}
function addIncomingPagePlaceholder(e) {
var t = document.createElement("div");
t.className = "page", t.id = "incoming-page-placeholder";
var n = document.createElement("div");
n.id = "incoming-page-corner";
var i = document.createElement("div");
i.id = "incoming-page-text", i.innerText = getLocalizedString(e ? "Loading Next Page\u2026" : "Connect to the Internet to view remaining pages."), n.appendChild(i), t.appendChild(n), document.getElementById("article").appendChild(t)
}
function removeIncomingPagePlaceholder() {
var e = incomingPagePlaceholder();
e.parentNode.removeChild(e)
}
function nextPageContainer() {
return document.getElementById("next-page-container")
}
function getLocalizedString(e) {
var t = localizedStrings[e];
return t ? t : e
}
function nextPageLoadComplete() {
if (nextPageContainer().removeEventListener("load", nextPageLoadComplete, !1), ReaderJS.pageNumber++, ReaderJS.readerOperationMode == ReaderOperationMode.OffscreenFetching) {
var e = ReaderJS.pageURLs[ReaderJS.pageURLs.length - 1];
ReaderJSController.nextPageLoadComplete(ReaderJS.pageNumber, e, "next-page-container")
}
ReaderJSController.prepareNextPageFrame("next-page-container");
var t = ReaderJSController.nextPageArticleFinder();
t.pageNumber = ReaderJS.pageNumber, t.suggestedRouteToArticle = ReaderJS.routeToArticle, t.previouslyDiscoveredPageURLStrings = ReaderJS.pageURLs;
var n = t.adoptableArticle();
n && (ReaderJS.createPageFromNode(n), ReaderJS.routeToArticle = t.routeToArticleNode()), nextPageContainer().removeAttribute("src"), ReaderJSController.clearNextPageArticleFinder(), ReaderJS.canLoadNextPage() ? ReaderJS.setNextPageURL(t.nextPageURL()) : ReaderJS.setCachedNextPageURL(t.nextPageURL()), updatePageNumbers(), restoreInitialArticleScrollPositionIfPossible(), ReaderJS.isLoadingNextPage() || ReaderJS.doneLoadingAllPages()
}
function contentElementTouchingTopOfViewport() {
var e = articleTitleElement();
do {
var t = e.getBoundingClientRect();
if (t.top <= 0 && t.bottom >= 0)
return e
} while (e = nextReaderContentElement(e));
return null
}
var LoadNextPageDelay = 250,
MaxNumberOfNextPagesToLoad = 80,
ReaderOperationMode = {
Normal: 0,
OffscreenFetching: 1,
ArchiveViewing: 2
},
DelayBeforeRestoringScrollPositionInMs = 1e3;
String.prototype.format = function() {
for (var e = this.split("%@"), t = 0, n = arguments.length; n > t; ++t)
e.splice(2 * t + 1, 0, arguments[t].toString());
return e.join("")
};
var AnimationTerminationCondition = {
Interrupted: 0,
CompletedSuccessfully: 1
};
AppleAnimator = function(e, t, n) {
this.startTime = 0, this.duration = e, this.interval = t, this.animations = [], this.animationFinishedCallback = n, this.currentFrameRequestID = null, this._firstTime = !0;
var i = this;
this.animate = function() {
function e(e, t, n) {
return t > e ? t : e > n ? n : e
}
var t,
n,
a,
o,
n = (new Date).getTime(),
r = i.duration;
t = e(n - i.startTime, 0, r), n = t / r, a = .5 - .5 * Math.cos(Math.PI * n), o = t >= r;
for (var s = i.animations, l = s.length, m = i._firstTime, d = 0; l > d; ++d)
s[d].doFrame(i, a, m, o, n);
return o ? void i.stop(AnimationTerminationCondition.CompletedSuccessfully) : (i._firstTime = !1, void (this.currentFrameRequestID = requestAnimationFrame(i.animate)))
}
}, AppleAnimator.prototype = {
start: function(e) {
var t = (new Date).getTime(),
n = this.interval;
this.startTime = t - n, e && (this.startTime += e), this.currentFrameRequestID = requestAnimationFrame(this.animate)
},
stop: function(e) {
this.animationFinishedCallback && this.animationFinishedCallback(e), this.currentFrameRequestID && cancelAnimationFrame(this.currentFrameRequestID)
},
addAnimation: function(e) {
this.animations[this.animations.length] = e
}
}, AppleAnimation = function(e, t, n) {
this.from = e, this.to = t, this.callback = n, this.now = e, this.ease = 0, this.progress = 0
}, AppleAnimation.prototype = {
doFrame: function(e, t, n, i, a) {
var o;
o = i ? this.to : this.from + (this.to - this.from) * t, this.now = o, this.ease = t, this.progress = a, this.callback(e, o, n, i)
}
};
var scrollEventIsSmoothScroll = !1,
smoothScrollingAnimator,
smoothScrollingAnimation;
window.addEventListener("scroll", articleScrolled, !1);
const ContentAwareNavigationMarker = "reader-content-aware-navigation-marker",
ContentAwareNavigationAnimationDuration = 200,
ContentAwareNavigationElementOffset = 8,
ContentAwareNavigationDirection = {
Up: 0,
Down: 1
};
ContentAwareScroller = function() {
this._numberOfContentAwareScrollAnimationsInProgress = 0
}, ContentAwareScroller.prototype = {
_contentElementAtTopOfViewport: function() {
var e = articleTitleElement();
do if (!(e.getBoundingClientRect().top < ContentAwareNavigationElementOffset))
return e;
while (e = nextReaderContentElement(e));
return null
},
_clearTargetOfContentAwareScrolling: function() {
var e = document.getElementById(ContentAwareNavigationMarker);
e && e.removeAttribute("id")
},
_contentAwareScrollFinished: function(e) {
e === AnimationTerminationCondition.CompletedSuccessfully && (--this._numberOfContentAwareScrollAnimationsInProgress, this._numberOfContentAwareScrollAnimationsInProgress || (smoothScrollingAnimator = null, smoothScrollingAnimation = null, this._clearTargetOfContentAwareScrolling()))
},
scroll: function(e) {
var t,
n,
i = document.getElementById(ContentAwareNavigationMarker),
a = i || this._contentElementAtTopOfViewport();
if (e === ContentAwareNavigationDirection.Down) {
var o = Math.abs(a.getBoundingClientRect().top - ContentAwareNavigationElementOffset) < 1;
t = i || o ? nextReaderContentElement(a) : a
} else if (e === ContentAwareNavigationDirection.Up)
if (a === articleTitleElement()) {
if (0 === document.body.scrollTop)
return;
n = -1 * document.body.scrollTop
} else
t = previousReaderContentElement(a);
t && (n = t.getBoundingClientRect().top - ContentAwareNavigationElementOffset), ++this._numberOfContentAwareScrollAnimationsInProgress, smoothScroll(document.body, n, ContentAwareNavigationAnimationDuration, this._contentAwareScrollFinished.bind(this)), this._clearTargetOfContentAwareScrolling(), t && (t.id = ContentAwareNavigationMarker)
}
}, window.addEventListener("keydown", keyDown, !1);
var didRestoreInitialScrollPosition = !1,
initialScrollPosition;
const ThemeSettings = {
White: {
cssClassName: "white"
},
Gray: {
cssClassName: "gray"
},
Sepia: {
cssClassName: "sepia"
},
Night: {
cssClassName: "night"
}
},
ConfigurationVersion = 4,
ShouldSaveConfiguration = {
No: !1,
Yes: !0
},
ShouldRestoreReadingPosition = {
No: !1,
Yes: !0
},
MinTextZoomIndex = 0,
MaxTextZoomIndex = 11,
MaximumWidthOfImageOrVideoExtendingBeyondTextContainer = 1050,
ReaderConfigurationJavaScriptEnabledKey = "javaScriptEnabled";
ReaderAppearanceController = function() {
this._defaultTextSizeIndexProducer = function() {
return 3
}, this._readerSizeClassProducer = function() {
return "all"
}, this._shouldUsePaperAppearance = function() {
return this.articleWidth() + 140 < this.documentElementWidth()
}, this._canLayOutContentBeyondMainTextColumn = !0, this._defaultFontFamilyName = "System", this._defaultThemeName = "White", this.configuration = {}, this._textSizeIndex = null, this._fontFamilyName = this._defaultFontFamilyName, this._themeName = this._defaultThemeName
}, ReaderAppearanceController.prototype = {
initialize: function() {
this.applyConfiguration(ReaderJSController.initialConfiguration()), /Macintosh/g.test(navigator.userAgent) ? document.body.classList.add("mac") : document.body.classList.add("ios")
},
applyConfiguration: function(e) {
var t = this._validConfigurationAndValidityFromUntrustedConfiguration(e),
n = t[0],
i = t[1],
a = n.fontSizeIndexForSizeClass[this._readerSizeClassProducer()];
textSizeIndexIsValid(a) ? this.setCurrentTextSizeIndex(a, ShouldSaveConfiguration.No) : (this.setCurrentTextSizeIndex(this._defaultTextSizeIndexProducer(), ShouldSaveConfiguration.No), i = !1);
var o = this._locale(),
r = n.fontFamilyNameForLanguageTag[o];
r && fontSettings(r) || (r = this._defaultFontFamilyNameForLanguage(o), i = !1), this.setLocale(o), this.setFontFamily(r, ShouldSaveConfiguration.No), this.setTheme(n.themeName, ShouldSaveConfiguration.No), this.configuration = n, i || this._updateSavedConfiguration()
},
_validConfigurationAndValidityFromUntrustedConfiguration: function(e) {
var t = {
fontSizeIndexForSizeClass: {},
fontFamilyNameForLanguageTag: {},
themeName: null
},
n = !0;
e || (e = {}, n = !1);
var i = (e || {}).version;
(!i || "number" != typeof i || ConfigurationVersion > i) && (e = {}, n = !1);
var a = (e || {}).fontSizeIndexForSizeClass;
if (a && "object" == typeof a)
for (var o in a) {
var r = a[o];
textSizeIndexIsValid(r) ? t.fontSizeIndexForSizeClass[o] = r : n = !1
}
else
n = !1;
var s = e.fontFamilyNameForLanguageTag;
s && "object" == typeof s ? t.fontFamilyNameForLanguageTag = s : (t.fontFamilyNameForLanguageTag = {}, n = !1);
var l = e.themeName;
return l && "string" == typeof l && ThemeSettings[l] ? t.themeName = l : (t.themeName = this._defaultThemeName, n = !1), [t, n]
},
_updateSavedConfiguration: function() {
this.configuration.fontSizeIndexForSizeClass[this._readerSizeClassProducer()] = this._textSizeIndex, this.configuration.fontFamilyNameForLanguageTag[this._locale()] = this._fontFamilyName, this.configuration.themeName = this._themeName;
var e = this.configuration;
e.version = ConfigurationVersion, ReaderJSController.didSetConfiguration(e)
},
applyAppropriateFontSize: function() {
var e = this.configuration.fontSizeIndexForSizeClass[this._readerSizeClassProducer()];
e && this.setCurrentTextSizeIndex(e, ShouldSaveConfiguration.No)
},
makeTextLarger: function() {
this._textSizeIndex < this._currentFontSettings().fontSizes.length - 1 && this.setCurrentTextSizeIndex(this._textSizeIndex + 1, ShouldSaveConfiguration.Yes)
},
makeTextSmaller: function() {
this._textSizeIndex > 0 && this.setCurrentTextSizeIndex(this._textSizeIndex - 1, ShouldSaveConfiguration.Yes)
},
articleWidth: function() {
return document.getElementById("article").getBoundingClientRect().width
},
_textColumnWidthInPoints: function() {
return parseFloat(getComputedStyle(document.querySelector("#article .page")).width)
},
documentElementWidth: function() {
return document.documentElement.clientWidth
},
setCurrentTextSizeIndex: function(e, t) {
e !== this._textSizeIndex && (this._textSizeIndex = e, this._rebuildDynamicStyleSheet(), this.layOutContent(), t === ShouldSaveConfiguration.Yes && this._updateSavedConfiguration())
},
currentFontCSSClassName: function() {
return this._currentFontSettings().cssClassName
},
_currentFontSettings: function() {
return fontSettings(this._fontFamilyName)
},
setLocale: function(e) {
if (e !== this._lastSetLocale) {
var t = document.body.classList;
const n = "locale-";
t.remove(n + this._lastSetLocale), t.add(n + e), this._lastSetLocale = e
}
},
setFontFamily: function(e, t) {
var n = document.body,
i = fontSettings(e);
n.classList.contains(i.cssClassName) || (this._fontFamilyName && n.classList.remove(fontSettings(this._fontFamilyName).cssClassName), n.classList.add(i.cssClassName), this._fontFamilyName = e, this.layOutContent(), t === ShouldSaveConfiguration.Yes && this._updateSavedConfiguration())
},
_theme: function() {
return ThemeSettings[this._themeName]
},
setTheme: function(e, t) {
var n = document.body,
i = ThemeSettings[e];
n.classList.contains(i.cssClassName) || (this._theme() && n.classList.remove(this._theme().cssClassName), n.classList.add(i.cssClassName), this._themeName = e, t === ShouldSaveConfiguration.Yes && this._updateSavedConfiguration())
},
usesPaperAppearance: function() {
return document.documentElement.classList.contains("paper")
},
layOutContent: function(e) {
void 0 === e && (e = ShouldRestoreReadingPosition.Yes), this._shouldUsePaperAppearance() ? document.documentElement.classList.add("paper") : document.documentElement.classList.remove("paper"), makeWideElementsScrollable(), this._canLayOutContentBeyondMainTextColumn && (this._layOutImagesAndVideoElementsBeyondTextColumn(), this._layOutElementsContainingTextBeyondTextColumn(), this._layOutVideos()), this._layOutMetadataBlock(), e === ShouldRestoreReadingPosition.Yes && ReadingPositionStabilizerJS.restorePosition()
},
_layOutMetadataBlock: function() {
var e = document.querySelector(".metadata");
if (e) {
var t = e.querySelector(".byline"),
n = e.querySelector(".date");
if (!t || !n)
return void e.classList.add("singleline");
for (var i = t.getClientRects(), a = i.length, o = n.getClientRects(), r = o.length, s = 0, l = 0; a > l; ++l)
s += i[l].width;
for (var l = 0; r > l; ++l)
s += o[l].width;
const m = 25;
s + m > this._textColumnWidthInPoints() ? e.classList.remove("singleline") : e.classList.add("singleline")
}
},
_layOutImagesAndVideoElementsBeyondTextColumn: function() {
for (var e = this.canLayOutContentMaintainingAspectRatioBeyondTextColumn(), t = article.querySelectorAll("img, video"), n = t.length, i = 0; n > i; ++i)
this.setImageOrVideoShouldLayOutBeyondTextColumnIfAppropriate(t[i], e)
},
_layOutElementsContainingTextBeyondTextColumn: function() {
const e = {
PRE: !0,
TABLE: !1
},
t = 22;
for (var n = document.querySelectorAll(".scrollable pre, .scrollable table"), i = n.length, a = 0; i > a; ++a) {
for (var o = n[a], r = o.parentElement, s = r; s; s = s.parentElement)
"BLOCKQUOTE" === s.tagName && s.classList.add("simple");
stopExtendingElementBeyondTextColumn(r);
var l = o.scrollWidth,
m = this._textColumnWidthInPoints();
if (!(m >= l)) {
var d = getComputedStyle(document.querySelector(".page")),
c = 0;
if (e[o.tagName]) {
var u = parseFloat(d["-webkit-padding-start"]) + parseFloat(d["-webkit-margin-start"]);
c = Math.min(u, t)
}
var g = Math.min(l, this._widthAvailableForLayout() - 2 * c);
extendElementBeyondTextColumn(r, g, m)
}
}
},
_layOutVideos: function() {
function e(e) {
return e.src && /^(.+\.)?youtube\.com\.?$/.test(anchorForURL(e.src).hostname)
}
const t = 16 / 9;
for (var n, i, a = ReaderAppearanceJS.canLayOutContentMaintainingAspectRatioBeyondTextColumn(), o = article.querySelectorAll("iframe"), r = o.length, s = 0; r > s; ++s) {
var l = o[s];
if (e(l)) {
var m;
if (l.parentElement.classList.contains("iframe-wrapper") ? m = l.parentElement : (m = document.createElement("div"), m.className = "iframe-wrapper", l.nextSibling ? l.parentNode.insertBefore(m, l.nextSibling) : l.parentNode.appendChild(m), m.appendChild(l)), n || (n = Math.min(MaximumWidthOfImageOrVideoExtendingBeyondTextContainer, this._widthAvailableForLayout())), i || (i = this._textColumnWidthInPoints()), a && n > i) {
m.style.height = n / t + "px", extendElementBeyondTextColumn(m, n, i), l.style.height = "100%";
var d = this.usesPaperAppearance() ? 2 : 0;
l.style.width = n - d + "px"
} else
stopExtendingElementBeyondTextColumn(m), m.style.width = "100%", m.style.height = this._textColumnWidthInPoints() / t + "px"
}
}
},
canLayOutContentMaintainingAspectRatioBeyondTextColumn: function() {
const e = 700;
if (window.innerHeight >= e)
return !0;
const t = 1.25;
return window.innerWidth / window.innerHeight <= t
},
setImageOrVideoShouldLayOutBeyondTextColumnIfAppropriate: function(e, t) {
if (t && !e.closest("blockquote, table, .float")) {
var n,
i = this._textColumnWidthInPoints(),
a = parseFloat(e.getAttribute("width"));
n = isNaN(a) ? e.naturalWidth : a;
var o = Math.min(n, Math.min(MaximumWidthOfImageOrVideoExtendingBeyondTextContainer, this._widthAvailableForLayout()));
if (o > i)
return void extendElementBeyondTextColumn(e, o, i)
}
stopExtendingElementBeyondTextColumn(e)
},
_widthAvailableForLayout: function() {
return this.usesPaperAppearance() ? this.articleWidth() : this.documentElementWidth()
},
_rebuildDynamicStyleSheet: function() {
for (var e = document.getElementById("dynamic-article-content").sheet; e.cssRules.length;)
e.removeRule(0);
var t = this._currentFontSettings().fontSizes[this._textSizeIndex] + "px",
n = this._currentFontSettings().lineHeights[this._textSizeIndex];
e.insertRule("#article { font-size: " + t + "; line-height: " + n + "; }")
},
_locale: function() {
var e = document.getElementById("article").style.webkitLocale;
return e && e.length ? e : ""
},
_defaultFontFamilyNameForLanguage: function(e) {
const t = {
am: "Kefa",
ar: "Damascus",
hy: "Mshtakan",
bn: "Kohinoor Bangla",
chr: "Plantagenet Cherokee",
gu: "Gujarati Sangam MN",
"pa-Guru": "Gurmukhi MN",
he: "Arial Hebrew",
hi: "Kohinoor Devanagari",
ja: "Hiragino Mincho ProN",
kn: "Kannada Sangam MN",
km: "Khmer Sangam MN",
ko: "Apple SD Gothic Neo",
lo: "Lao Sangam MN",
ml: "Malayalam Sangam MN",
or: "Oriya Sangam MN",
si: "Sinhala Sangam MN",
ta: "InaiMathi",
te: "Kohinoor Telugu",
th: "Thonburi",
"zh-Hans": "PingFang SC",
"zh-Hant": "PingFang TC",
"iu-Cans": "Euphemia UCAS"
};
var n = t[e];
return n ? n : this._defaultFontFamilyName
}
};
var lastMouseDownWasOutsideOfPaper = !1;
ReaderController = function() {
this.pageNumber = 1, this.pageURLs = [], this.articleIsLTR = !0, this.loadingNextPage = !1, this.loadingNextPageManuallyStopped = !1, this.cachedNextPageURL = null, this.lastKnownUserVisibleWidth = 0, this.lastKnownDocumentElementWidth = 0, this._readerWillBecomeVisible = function() {}, this._readerWillEnterBackground = function() {}, this._distanceFromBottomOfArticleToStartLoadingNextPage = function() {
return NaN
}, this._clickingOutsideOfPaperRectangleDismissesReader = !1, this._shouldSkipActivationWhenPageLoads = function() {
return !1
}, this._shouldConvertRelativeURLsToAbsoluteURLsWhenPrintingOrMailing = !1, this._deferSendingContentIsReadyForDisplay = !1, this._isJavaScriptEnabled = function() {
return !0
}
}, ReaderController.prototype = {
setOriginalURL: function(e) {
this.originalURL = e, this.pageURLs.push(e), document.head.getElementsByTagName("base")[0].href = this.originalURL
},
setNextPageURL: function(e) {
if (!e || -1 !== this.pageURLs.indexOf(e) || this.pageNumber + 1 === MaxNumberOfNextPagesToLoad)
return void this.setLoadingNextPage(!1);
this.setLoadingNextPage(!0), this.pageURLs.push(e);
var t = function() {
nextPageContainer().addEventListener("load", nextPageLoadComplete, !1), nextPageContainer().src = e
};
this.readerOperationMode == ReaderOperationMode.OffscreenFetching ? t() : this.nextPageLoadTimer = setTimeout(t, LoadNextPageDelay)
},
pauseLoadingNextPage: function() {
this.readerOperationMode == ReaderOperationMode.Normal && (nextPageContainer().removeEventListener("load", nextPageLoadComplete, !1), this.cachedNextPageURL || (this.cachedNextPageURL = this.pageURLs.pop()), nextPageContainer().src = null, this.nextPageLoadTimer && clearTimeout(this.nextPageLoadTimer), ReaderJSController.didChangeNextPageLoadingState(!1))
},
stopLoadingNextPage: function() {
nextPageContainer().removeEventListener("load", nextPageLoadComplete, !1), nextPageContainer().src = null, this.nextPageLoadTimer && clearTimeout(this.nextPageLoadTimer), this.isLoadingNextPage() && (this.setLoadingNextPage(!1), this.loadingNextPageManuallyStopped = !0)
},
isLoadingNextPage: function() {
return this.loadingNextPage
},
setLoadingNextPage: function(e) {
this.loadingNextPage != e && (e ? addIncomingPagePlaceholder(ReaderJSController.canLoadFromNetwork()) : removeIncomingPagePlaceholder(), this.loadingNextPage = e, ReaderJSController.didChangeNextPageLoadingState(this.loadingNextPage))
},
doneLoadingAllPages: function() {
ReaderJSController.doneLoadingReaderPage()
},
loaded: function() {
if (this.readerOperationMode = ReaderJSController.readerOperationMode(), !ReaderJSController.originalArticleFinder() || this._shouldSkipActivationWhenPageLoads())
return void ReaderJSController.deactivateNow();
this.loadArticle(), ReadingPositionStabilizerJS.initialize();
var e = ReaderJSController.cachedTopScrollOffset();
if (e > 0)
document.body.scrollTop = e;
else {
var t = document.getElementById("safari-reader-element-marker");
if (t) {
var n = parseFloat(t.style.top) / 100,
i = t.parentElement,
a = i.getBoundingClientRect();
document.body.scrollTop = window.scrollY + a.top + a.height * n, i.removeChild(t)
}
}
this._clickingOutsideOfPaperRectangleDismissesReader && (document.documentElement.addEventListener("mousedown", monitorMouseDownForPotentialDeactivation), document.documentElement.addEventListener("click", deactivateIfEventIsOutsideOfPaperContainer));
var o = function() {
this.setUserVisibleWidth(this.lastKnownUserVisibleWidth)
}.bind(this);
window.addEventListener("resize", o, !1);
var r = this._bestLocale,
s = function() {
ReaderJSController.contentIsReadyForDisplay(r)
};
this._deferSendingContentIsReadyForDisplay ? setTimeout(s, 0) : s()
},
setUserVisibleWidth: function(e) {
var t = ReaderAppearanceJS.documentElementWidth();
e === this.lastKnownUserVisibleWidth && t === this.lastKnownDocumentElementWidth || (this.lastKnownUserVisibleWidth = e, this.lastKnownDocumentElementWidth = t, ReaderAppearanceJS.applyAppropriateFontSize(), ReaderAppearanceJS.layOutContent())
},
loadArticle: function() {
var e = ReaderJSController.originalArticleFinder();
if (e.article || e.articleNode(!0), !e.article)
return this.setOriginalURL(e.contentDocument.baseURI), void this.doneLoadingAllPages();
this.routeToArticle = e.routeToArticleNode(), this.displayTitle = e.articleTitle(), this.displaySubhead = e.articleSubhead(), this.metadataElement = e.adoptableMetadataBlock(), this.articleIsLTR = e.articleIsLTR();
var t = e.adoptableArticle().ownerDocument;
if (document.title = t.title, this.setOriginalURL(t.baseURI), this.readerOperationMode == ReaderOperationMode.ArchiveViewing)
return ReaderAppearanceJS.initialize(), void ReaderAppearanceJS.layOutContent();
var n = e.adoptableArticle();
if (this._isJavaScriptEnabled()) {
var i = e.nextPageURL();
this.setNextPageURL(i)
} else {
for (var a = n.querySelectorAll("iframe"), o = a.length, r = 0; o > r; ++r)
a[r].remove();
this.stopLoadingNextPage()
}
this.updateLocaleFromElement(n), this.createPageFromNode(n), ReaderAppearanceJS.initialize(), i || (e.adoptableMultiPageContentElements().forEach(this.createPageFromNode, this), updatePageNumbers()), this.isLoadingNextPage() || this.doneLoadingAllPages()
},
loadNewArticle: function() {
if (!ReaderJSController.originalArticleFinder())
return void ReaderJSController.deactivateNow();
for (var e = document.getElementById("article"); e.childNodes.length >= 1;)
e.removeChild(e.firstChild);
this.reinitialize(), document.body.scrollTop = 0, this.loadArticle()
},
reinitialize: function() {
this.pageNumber = 1, this.pageURLs = [], this.articleIsLTR = !0, this.loadingNextPage = !1, this.loadingNextPageManuallyStopped = !1, this.routeToArticle = void 0, this.displayTitle = void 0, this.displaySubhead = void 0, this.originalURL = void 0, this.nextPageLoadTimer = void 0, this.readerOperationMode = ReaderJSController.readerOperationMode(), this.cachedNextPageURL = null
},
createPageFromNode: function(e) {
var t = document.createElement("div");
t.className = "page", this.articleIsLTR || t.classList.add("rtl");
var n = document.createElement("div");
n.className = "page-number", t.appendChild(n);
var i = document.createElement("h1");
if (i.className = "title", i.textContent = this.displayTitle, t.appendChild(i), this.displaySubhead) {
var a = document.createElement("h2");
a.className = "subhead", a.textContent = this.displaySubhead, t.appendChild(a)
}
if (this.metadataElement && this.metadataElement.innerText) {
var o = document.createElement("div");
for (o.className = "metadata"; this.metadataElement.firstChild;)
o.appendChild(this.metadataElement.firstChild);
t.appendChild(o)
}
for (; e.firstChild;)
t.appendChild(e.firstChild);
var r = document.getElementById("article");
r.insertBefore(t, incomingPagePlaceholder()), replaceSimpleTweetsWithRichTweets(), ReaderAppearanceJS.layOutContent(ShouldRestoreReadingPosition.No), updatePageNumbers(), restoreInitialArticleScrollPositionIfPossible();
for (var s = t.querySelectorAll("img"), l = s.length, m = 0; l > m; ++m)
s[m].onload = function(e) {
var t = e.target;
ReaderAppearanceJS.setImageOrVideoShouldLayOutBeyondTextColumnIfAppropriate(t, ReaderAppearanceJS.canLayOutContentMaintainingAspectRatioBeyondTextColumn()), t.onload = null
};
this._fixImageElementsWithinPictureElements()
},
removeAttribute: function(e, t) {
for (var n = e.querySelectorAll("[" + t + "]"), i = n.length, a = 0; i > a; a++)
n[a].removeAttribute(t)
},
preparePrintingMailingFrame: function() {
var e = this.printingMailingFrameElementId(),
t = document.getElementById(e);
t && document.body.removeChild(t), t = document.createElement("iframe"), t.id = e, t.style.display = "none", t.style.position = "absolute", document.body.appendChild(t);
var n = t.contentDocument,
i = document.createElement("base");
i.href = this.originalURL, n.head.appendChild(i);
var a = document.createElement("div");
a.className = "original-url";
var o = document.createElement("a");
o.href = this.originalURL, o.textContent = this.originalURL, a.appendChild(document.createElement("br")), a.appendChild(o), a.appendChild(document.createElement("br")), a.appendChild(document.createElement("br")), n.body.appendChild(a), n.body.appendChild(this.sanitizedFullArticle()), n.head.appendChild(document.getElementById("print").cloneNode(!0));
var r = n.createElement("title");
r.innerText = document.title, n.head.appendChild(r)
},
sanitizedFullArticle: function() {
var e = document.getElementById("article").cloneNode(!0);
e.removeAttribute("tabindex");
for (var t = e.querySelectorAll(".title"), n = 1; n < t.length; ++n)
t[n].remove();
for (var i = e.querySelectorAll(".page-number, #incoming-page-placeholder"), n = 0; n < i.length; ++n)
i[n].remove();
if (prepareTweetsInPrintingMailingFrame(e), this._shouldConvertRelativeURLsToAbsoluteURLsWhenPrintingOrMailing) {
var a = e.querySelectorAll("img, video, audio, source");
const o = /^http:\/\/|^https:\/\/|^data:/i;
for (var n = 0; n < a.length; n++) {
var r = a[n],
s = r.getAttribute("src");
o.test(s) || r.setAttribute("src", r.src)
}
}
for (var l = e.querySelectorAll(".extendsBeyondTextColumn"), m = l.length, n = 0; m > n; ++n)
stopExtendingElementBeyondTextColumn(l[n]);
for (var d = e.querySelectorAll(".delimeter"), c = d.length, n = 0; c > n; ++n)
d[n].innerText = "\u2022";
e.classList.add(ReaderAppearanceJS.currentFontCSSClassName()), e.classList.add("exported");
for (var u = document.getElementById("article-content").sheet.cssRules, g = u.length, h = 0; g > h; ++h) {
var p = u[h].selectorText,
f = u[h].style;
if (f) {
var S = f.cssText;
e.matches(p) && (e.style.cssText += S);
for (var C = e.querySelectorAll(p), x = C.length, v = 0; x > v; ++v)
C[v].style.cssText += S
}
}
return e
},
printingMailingFrameElementId: function() {
return "printing-mailing-frame"
},
updateLocaleFromElement: function(e) {
this._bestLocale = localeForElement(e), document.getElementById("article").style.webkitLocale = "'" + this._bestLocale + "'"
},
canLoadNextPage: function() {
if (this.readerOperationMode != ReaderOperationMode.Normal)
return !0;
var e = document.querySelectorAll(".page"),
t = e[e.length - 1],
n = t.getBoundingClientRect(),
i = this._distanceFromBottomOfArticleToStartLoadingNextPage();
return isNaN(i) ? !0 : !(n.bottom - window.scrollY > i)
},
setCachedNextPageURL: function(e) {
e ? (this.cachedNextPageURL = e, ReaderJSController.didChangeNextPageLoadingState(!1)) : this.setNextPageURL(e)
},
loadNextPage: function() {
null != this.cachedNextPageURL && (this.setNextPageURL(this.cachedNextPageURL), this.cachedNextPageURL = null, ReaderJSController.didChangeNextPageLoadingState(!0))
},
resumeCachedNextPageLoadIfNecessary: function() {
ReaderJS.cachedNextPageURL && ReaderJS.canLoadNextPage() && ReaderJS.loadNextPage()
},
readerWillBecomeVisible: function() {
document.body.classList.remove("cached"), this.resumeCachedNextPageLoadIfNecessary(), this._readerWillBecomeVisible()
},
readerWillEnterBackground: function() {
(ReaderJS.isLoadingNextPage() || ReaderJS.loadingNextPageManuallyStopped) && this.pauseLoadingNextPage();
for (var e = document.querySelectorAll("audio, video"), t = 0, n = e.length; n > t; ++t)
e[t].pause();
document.body.classList.add("cached"), this._readerWillEnterBackground()
},
_fixImageElementsWithinPictureElements: function() {
setTimeout(function() {
for (var e = !1, t = document.querySelectorAll("#article picture img"), n = t.length, i = 0; n > i; ++i) {
var a = t[i],
o = a.previousElementSibling;
o && (a.remove(), o.after(a), e = !0)
}
e && ReaderAppearanceJS.layOutContent()
}, 0)
}
}, ReadingPositionStabilizer = function() {
this.elementTouchingTopOfViewport = null, this.elementTouchingTopOfViewportOffsetFromTopOfElementRatio = 0
}, ReadingPositionStabilizer.prototype = {
initialize: function() {
this.setTrackPosition(!0)
},
setTrackPosition: function(e) {
this._positionUpdateFunction || (this._positionUpdateFunction = this._updatePosition.bind(this)), e ? window.addEventListener("scroll", this._positionUpdateFunction, !1) : window.removeEventListener("scroll", this._positionUpdateFunction, !1)
},
_updatePosition: function() {
var e = contentElementTouchingTopOfViewport();
if (!e)
return void (this.elementTouchingTopOfViewport = null);
this.elementTouchingTopOfViewport = e;
var t = this.elementTouchingTopOfViewport.getBoundingClientRect();
this.elementTouchingTopOfViewportOffsetFromTopOfElementRatio = t.height > 0 ? t.top / t.height : 0
},
restorePosition: function() {
if (this.elementTouchingTopOfViewport) {
var e = this.elementTouchingTopOfViewport.getBoundingClientRect(),
t = document.body.scrollTop + e.top - e.height * this.elementTouchingTopOfViewportOffsetFromTopOfElementRatio;
t > 0 && (document.body.scrollTop = t), this._updatePosition()
}
}
};
var ContentAwareScrollerJS = new ContentAwareScroller,
ReaderAppearanceJS = new ReaderAppearanceController,
ReadingPositionStabilizerJS = new ReadingPositionStabilizer,
ReaderJS = new ReaderController;
/*
* Copyright (c) 2010 Apple Inc. All rights reserved.
*/
function hostnameMatchesHostKnownToContainEmbeddableMedia(e) {
const t = /^(.+\.)?(youtube\.com|vimeo\.com|dailymotion\.com|soundcloud\.com|mixcloud\.com|embedly\.com|embed\.ly)\.?$/;
return t.test(e)
}
function lazyLoadingImageURLForElement(e) {
const t = /(data:image\/)?gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==/,
n = {
"data-lazy-src": 1,
"data-original": 1,
datasrc: 1,
"data-src": 1,
"original-src": 1,
"rel:bf_image_src": 1,
"deferred-src": 1,
"data-mediaviewer-src": 1
},
i = {
original: 1
};
var r = e.getAttribute("src"),
a = /transparent|empty/i.test(r) || t.test(r);
const o = 2;
for (var l = e, s = 0; l && o > s; l = l.parentElement, ++s)
for (var c = l.attributes, u = c.length, m = 0; u > m; ++m) {
var d = c[m].nodeName;
if (n[d.toLowerCase()])
return l.getAttribute(d);
var h = /\.(jpe?g|png|gif|bmp)$/i.test(c[d].value);
if (i[d.toLowerCase()] && h)
return l.getAttribute(d);
if (a && /^data.*(src|source)$/i.test(d) && h)
return l.getAttribute(d)
}
return null
}
function sanitizeElementByRemovingAttributes(e) {
const t = /^on|^id$|^class$|^style$|^autofocus$/;
for (var n = e.attributes, i = 0; i < n.length; ++i) {
var r = n[i].nodeName;
t.test(r) && (e.removeAttribute(r), i--)
}
}
function characterNeedsScoreMultiplier(e) {
if (!e || 0 === e.length)
return !1;
var t = e.charCodeAt(0);
return t > 11904 && 12031 > t ? !0 : t > 12352 && 12543 > t ? !0 : t > 12736 && 19903 > t ? !0 : t > 19968 && 40959 > t ? !0 : t > 44032 && 55215 > t ? !0 : t > 63744 && 64255 > t ? !0 : t > 65072 && 65103 > t ? !0 : t > 131072 && 173791 > t ? !0 : t > 194560 && 195103 > t
}
function domDistance(e, t, n) {
for (var i = [], r = e; r;)
i.unshift(r), r = r.parentNode;
var a = [];
for (r = t; r;)
a.unshift(r), r = r.parentNode;
for (var o = Math.min(i.length, a.length), l = Math.abs(i.length - a.length), s = o; s >= 0 && i[s] !== a[s]; --s)
if (l += 2, n && l >= n)
return n;
return l
}
function fontSizeFromComputedStyle(e, t) {
var n = parseInt(e.fontSize);
return isNaN(n) && (n = t ? t : BaseFontSize), n
}
function contentTextStyleForNode(e, t) {
function n(e) {
if (isNodeWhitespace(e))
return null;
var t = getComputedStyle(e.parentNode);
return "none" !== t["float"] ? null : t
}
for (var i = "descendant::text()[not(parent::h1) and not(parent::h2) and not(parent::h3) and not(parent::h4) and not(parent::h5) and not(parent::h6)]", r = e.evaluate(i, t, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null), a = r.snapshotLength, o = 0; a > o; ++o) {
for (var l = r.snapshotItem(o), s = !1, c = l.parentElement; c !== t; c = c.parentElement)
if (NegativeRegEx.test(c.className)) {
s = !0;
break
}
if (!s) {
var u = n(l);
if (u)
return u
}
}
return null
}
function isNodeWhitespace(e) {
return e && e.nodeType === Node.TEXT_NODE ? !/\S/.test(e.data) : !1
}
function removeWhitespace(e) {
return e.replace(/\s+/g, "")
}
function isElementNode(e) {
return !(!e || e.nodeType !== Node.ELEMENT_NODE)
}
function computedStyleIndicatesElementIsInvisibleDueToClipping(e) {
if ("absolute" !== e.position)
return !1;
var t = e.clip.match(/^rect\((\d+px|auto), (\d+px|auto), (\d+px|auto), (\d+px|auto)\)$/);
if (!t || 5 !== t.length)
return !1;
var n = t.map(function(e) {
return parseInt(e)
}),
i = n[1];
isNaN(i) && (i = 0);
var r = n[2],
a = n[3],
o = n[4];
return isNaN(o) && (o = 0), i >= a || r >= o
}
function isElementVisible(e) {
var t = getComputedStyle(e);
if ("visible" !== t.visibility || "none" === t.display)
return !1;
if (cachedElementBoundingRect(e).height)
return !0;
var n = document.createRange();
return n.selectNode(e), !!n.getBoundingClientRect().height
}
function isElementPositionedOffScreen(e) {
var t = cachedElementBoundingRect(e);
return t.height && t.width ? t.bottom <= 0 || t.right <= 0 : !1
}
function elementDepth(e) {
for (var t = 0; e; e = e.parentElement)
t++;
return t
}
function depthOfElementWithinElement(e, t) {
for (var n = 0; e !== t; e = e.parentElement) {
if (!e)
return NaN;
n++
}
return n
}
function nearestAncestorElementWithTagName(e, t, n) {
var i = {};
if (n)
for (var r = 0; r < n.length; ++r)
i[n[r]] = !0;
if (i[e.tagName])
return null;
for (; e = e.parentElement;) {
var a = e.tagName;
if (i[a])
break;
if (a === t)
return e
}
return null
}
function cachedElementBoundingRect(e) {
if (e._cachedElementBoundingRect)
return e._cachedElementBoundingRect;
var t = e.getBoundingClientRect();
return ReaderArticleFinderJS._elementsWithCachedBoundingRects.push(e), ReaderArticleFinderJS._cachedScrollX || ReaderArticleFinderJS._cachedScrollY ? (e._cachedElementBoundingRect = {
top: t.top + ReaderArticleFinderJS._cachedScrollY,
right: t.right + ReaderArticleFinderJS._cachedScrollX,
bottom: t.bottom + ReaderArticleFinderJS._cachedScrollY,
left: t.left + ReaderArticleFinderJS._cachedScrollX,
width: t.width,
height: t.height
}, e._cachedElementBoundingRect) : (e._cachedElementBoundingRect = t, e._cachedElementBoundingRect)
}
function clearCachedElementBoundingRects() {
for (var e = ReaderArticleFinderJS._elementsWithCachedBoundingRects, t = e.length, n = 0; t > n; ++n)
e[n]._cachedElementBoundingRect = null;
ReaderArticleFinderJS._elementsWithCachedBoundingRects = []
}
function trimmedInnerTextIgnoringTextTransform(e) {
var t = e.innerText;
if (!/\S/.test(t))
return e.textContent.trim();
var n = getComputedStyle(e),
i = n.textTransform;
return "uppercase" === i || "lowercase" === i ? e.textContent.trim() : t.trim()
}
function levenshteinDistance(e, t) {
for (var n = e.length, i = t.length, r = new Array(n + 1), a = 0; n + 1 > a; ++a)
r[a] = new Array(i + 1), r[a][0] = a;
for (var o = 0; i + 1 > o; ++o)
r[0][o] = o;
for (var o = 1; i + 1 > o; ++o)
for (var a = 1; n + 1 > a; ++a)
if (e[a - 1] === t[o - 1])
r[a][o] = r[a - 1][o - 1];
else {
var l = r[a - 1][o] + 1,
s = r[a][o - 1] + 1,
c = r[a - 1][o - 1] + 1;
r[a][o] = Math.min(l, s, c)
}
return r[n][i]
}
function stringSimilarity(e, t) {
var n = Math.max(e.length, t.length);
return n ? (n - levenshteinDistance(e, t)) / n : 0
}
function stringsAreNearlyIdentical(e, t) {
return e === t ? !0 : stringSimilarity(e, t) > StringSimilarityToDeclareStringsNearlyIdentical
}
function elementIsCommentBlock(e) {
if (/(^|\s)comment/.test(e.className))
return !0;
var t = e.getAttribute("id");
return !(!t || 0 !== t.indexOf("comment"))
}
function elementLooksLikeEmbeddedTweet(e) {
if ("IFRAME" !== e.tagName)
return !1;
if (!e.contentDocument)
return !1;
var t = e.contentDocument.documentElement,
n = 0,
i = t.querySelector("blockquote");
i && TweetURLRegex.test(i.getAttribute("cite")) && ++n;
var r = t.querySelector("[data-iframe-title]");
return r && TweetIframeTitleRegex.test(r.getAttribute("data-iframe-title")) && ++n, e.classList.contains("twitter-tweet") && ++n, t.querySelector("[data-tweet-id]") && ++n, n > 2
}
function elementLooksLikePartOfACarousel(e) {
const t = /carousel-|carousel_|-carousel|_carousel/,
n = 3;
for (var i = e, r = 0; n > r; ++r) {
if (!i)
return !1;
if (t.test(i.className) || t.test(i.getAttribute("data-analytics")))
return !0;
i = i.parentElement
}
}
function shouldPruneIframe(e, t) {
return e.srcdoc ? !0 : hostnameMatchesHostKnownToContainEmbeddableMedia(anchorForURL(e.src, t).hostname) ? !1 : !elementLooksLikeEmbeddedTweet(e.originalElement)
}
function languageScoreMultiplierForTextNodes(e) {
if (!e || !e.length)
return 1;
for (var t = Math.min(e.length, DefaultNumberOfTextNodesToCheckForLanguageMultiplier), n = 0, i = 0, r = 0; t > r; r++) {
for (var a = e[r].nodeValue.trim(), o = Math.min(a.length, NumberOfCharactersPerTextNodeToEvaluateForLanguageMultiplier), l = 0; o > l; l++)
characterNeedsScoreMultiplier(a[l]) && n++;
i += o
}
return n >= i * MinimumRatioOfCharactersForLanguageMultiplier ? ScoreMultiplierForChineseJapaneseKorean : 1
}
function scoreMultiplierForElementTagNameAndAttributes(e) {
for (var t = 1, n = e; n; n = n.parentElement) {
var i = n.getAttribute("id");
i && (ArticleRegEx.test(i) && (t += ArticleMatchBonus), CommentRegEx.test(i) && (t -= CommentMatchPenalty), CarouselRegEx.test(i) && (t -= CarouselMatchPenalty));
var r = n.className;
r && (ArticleRegEx.test(r) && (t += ArticleMatchBonus), CommentRegEx.test(r) && (t -= CommentMatchPenalty), CarouselRegEx.test(r) && (t -= CarouselMatchPenalty)), "ARTICLE" === n.tagName && (t += ArticleMatchBonus)
}
return 0 > t ? 0 : t
}
function elementAtPoint(e, t) {
if ("undefined" != typeof ReaderArticleFinderJSController && ReaderArticleFinderJSController.nodeAtPoint) {
var n = ReaderArticleFinderJSController.nodeAtPoint(e, t);
return n && n.nodeType !== Node.ELEMENT_NODE && (n = n.parentElement), n
}
return document.elementFromPoint(e, t)
}
function userVisibleURLString(e) {
return "undefined" != typeof ReaderArticleFinderJSController && ReaderArticleFinderJSController.userVisibleURLString ? ReaderArticleFinderJSController.userVisibleURLString(e) : e
}
function anchorRunsJavaScriptOnActivation(e) {
var t = e.href;
return "javascript:" === t.trim().substring(0, 11).toLowerCase()
}
function anchorForURL(e, t) {
var n = t.createElement("a");
return n.href = e, n
}
function anchorLinksToAttachment(e) {
return /\battachment\b/i.test(e.getAttribute("rel"))
}
function anchorLinksToTagOrCategoryPage(e) {
return /\bcategory|tag\b/i.test(e.getAttribute("rel"))
}
function anchorLooksLikeDownloadFlashLink(e) {
return /^https?:\/\/(www\.|get\.)(adobe|macromedia)\.com\/(((products|[a-zA-Z]{1,2}|)\/flashplayer|flashplayer|go\/getflash(player)?)|(shockwave\/download\/(index|download)\.cgi\?P1_Prod_Version=ShockwaveFlash)\/?$)/i.test(e.href)
}
function elementsHaveSameTagAndClassNames(e, t) {
return e.tagName === t.tagName && e.className === t.className
}
function selectorForElement(e) {
for (var t = e.tagName, n = e.classList, i = n.length, r = 0; i > r; r++)
t += "." + n[r];
return t
}
function elementFingerprintForDepth(e, t) {
function n(e, t) {
if (!e)
return "";
var o = [];
o.push(selectorForElement(e));
var l = e.children,
s = l.length;
if (s && t > 0) {
o.push(i);
for (var c = 0; s > c; ++c)
o.push(n(l[c], t - 1)), c !== s - 1 && o.push(a);
o.push(r)
}
return o.join("")
}
const i = " / ",
r = " \\",
a = " | ";
return n(e, t)
}
function childrenOfParentElement(e) {
var t = e.parentElement;
return t ? t.children : []
}
function arrayOfKeysAndValuesOfObjectSortedByValueDescending(e) {
var t = [];
for (var n in e)
e.hasOwnProperty(n) && t.push({
key: n,
value: e[n]
});
return t.sort(function(e, t) {
return t.value - e.value
}), t
}
function walkElementSubtree(e, t, n) {
if (!(0 > t)) {
for (var i = e.children, r = i.length, a = t - 1, o = 0; r > o; ++o)
walkElementSubtree(i[o], a, n);
n(e, t)
}
}
function elementIndicatesItIsASchemaDotOrgArticleContainer(e) {
var t = e.getAttribute("itemtype");
return /^https?:\/\/schema\.org\/(News)?Article$/.test(t)
}
function cleanStyleAndClassList(e) {
e.classList.length || e.removeAttribute("class"), e.getAttribute("style") || e.removeAttribute("style")
}
function getVisibleNonWhitespaceTextNodes(e, t, n, i, r) {
function a(e) {
var t = e.children[0];
if (t)
for (var n = t.children, i = n.length, r = 0; i > r; ++r)
if ("none" !== getComputedStyle(n[r])["float"])
return !1;
return !0
}
function o(e, i) {
if (e.nodeType === Node.TEXT_NODE)
return void (/\S/.test(e.nodeValue) && s.push(e));
if (e.nodeType === Node.ELEMENT_NODE && isElementVisible(e) && !(n && ++l > n || r && r.has(e))) {
var u = e.tagName;
if ("IFRAME" !== u && "FORM" !== u) {
if (c[u])
i--;
else if ("UL" !== u && "OL" !== u || !a(e)) {
var m = e.parentElement;
if (m) {
var d = m.tagName;
"SECTION" !== d || e.previousElementSibling || e.nextElementSibling || i--
}
} else
i--;
var h = i + 1;
if (t > h)
for (var g = e.childNodes, f = g.length, p = 0; f > p; ++p)
o(g[p], h)
}
}
}
var l = 0,
s = [],
c = {
P: 1,
STRONG: 1,
B: 1,
EM: 1,
I: 1,
SPAN: 1,
SECTION: 1
};
return i && (c.CENTER = 1, c.FONT = 1), o(e, 0), s
}
function mapOfVisibleTextNodeComputedStyleReductionToNumberOfMatchingCharacters(e, t) {
const n = 100;
for (var i = {}, r = getVisibleNonWhitespaceTextNodes(e, n), a = r.length, o = 0; a > o; ++o) {
var l = r[o],
s = l.length,
c = l.parentElement,
u = getComputedStyle(c),
m = t(u);
i[m] ? i[m] += s : i[m] = s
}
return i
}
function keyOfMaximumValueInDictionary(e) {
var t,
n;
for (var i in e) {
var r = e[i];
(!n || r > n) && (t = i, n = r)
}
return t
}
function elementIsProtected(e) {
return e.classList.contains("protected") || e.querySelector(".protected")
}
function dominantFontFamilyAndSizeForElement(e) {
var t = mapOfVisibleTextNodeComputedStyleReductionToNumberOfMatchingCharacters(e, function(e) {
return e.fontFamily + "|" + e.fontSize
});
return keyOfMaximumValueInDictionary(t)
}
function dominantFontSizeInPointsFromFontFamilyAndSizeString(e) {
return e ? parseInt(e.split("|")[1]) : null
}
function canvasElementHasNoUserVisibleContent(e) {
if (!e.width || !e.height)
return !0;
for (var t = e.getContext("2d"), n = t.getImageData(0, 0, e.width, e.height).data, i = 0, r = n.length; r > i; i += 4) {
var a = n[i + 3];
if (a)
return !1
}
return !0
}
function findArticleNodeSelectorsInWhitelistForHostname(e, t) {
const n = [[AppleDotComAndSubdomainsRegex, "*[itemprop='articleBody']"], [/^(.+\.)?buzzfeed\.com\.?$/, "article #buzz_sub_buzz"], [/^(.+\.)?mashable\.com\.?$/, ".parsec-body .parsec-container"], [/^(.+\.)?cnet\.com\.?$/, "#rbContent.container"], [/^(.+\.)?engadget\.com\.?$/, "main article #page_body"]];
for (var i = n.length, r = 0; i > r; ++r) {
var a = n[r],
o = a[0];
if (o.test(e.toLowerCase())) {
var l = a[1],
s = t(l);
if (s)
return
}
}
}
function functionToPreventPruningDueToInvisibilityInWhitelistForHostname(e) {
const t = [[/^mobile\.nytimes\.com\.?$/, function(e, t) {
var n = e;
if (!t)
return !1;
for (; n && n !== t;) {
if (n.classList.contains("hidden"))
return !0;
n = n.parentElement
}
return !1
}]];
for (var n = t.length, i = 0; n > i; ++i) {
var r = t[i],
a = r[0];
if (a.test(e.toLowerCase()))
return r[1]
}
return null
}
function elementIsAHeader(e) {
return !!{
H1: 1,
H2: 1,
H3: 1,
H4: 1,
H5: 1,
H6: 1
}[e.tagName]
}
function leafElementForElementAndDirection(e, t) {
var n = e.ownerDocument,
i = n.createTreeWalker(n.body, NodeFilter.SHOW_ELEMENT, {
acceptNode: function(e) {
return 0 === e.children.length ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP
}
});
return i.currentNode = e, i[t]()
}
function previousLeafElementForElement(e) {
return leafElementForElementAndDirection(e, "previousNode")
}
function nextLeafElementForElement(e) {
return leafElementForElementAndDirection(e, "nextNode")
}
function nextNonFloatingVisibleElementSibling(e) {
for (var t = e; t = t.nextElementSibling;)
if (isElementVisible(t) && "none" === getComputedStyle(t)["float"])
return t;
return null
}
function elementWithLargestAreaFromElements(e) {
var t = e.length;
if (!t)
return null;
for (var n, i = 0, r = 0; t > r; ++r) {
var a = e[r],
o = cachedElementBoundingRect(a),
l = o.width * o.height;
l > i && (n = a, i = l)
}
return n
}
function unwrappedArticleContentElement(e) {
for (var t = e;;) {
for (var n = t.childNodes, i = n.length, r = null, a = 0; i > a; ++a) {
var o = n[a],
l = o.nodeType,
s = function() {
return l === Node.ELEMENT_NODE ? !0 : l === Node.TEXT_NODE ? !isNodeWhitespace(o) : !1
}();
if (s) {
if (r)
return t;
var c = o.tagName;
if ("DIV" !== c && "ARTICLE" !== c && "SECTION" !== c)
return t;
r = o
}
}
if (!r)
break;
t = r
}
return t
}
function elementsMatchingClassesInClassList(e, t) {
return elementsOfSameClassIgnoringClassNamesMatchingRegexp(e, t)
}
function elementsMatchingClassesInClassListIgnoringCommonLayoutClassNames(e, t) {
const n = /clearfix/i;
return elementsOfSameClassIgnoringClassNamesMatchingRegexp(e, t, n)
}
function elementsMatchingClassesInClassListIgnoringClassesWithNumericSuffix(e, t) {
const n = /\d+$/;
return elementsOfSameClassIgnoringClassNamesMatchingRegexp(e, t, n)
}
function elementsOfSameClassIgnoringClassNamesMatchingRegexp(e, t, n) {
for (var i = "", r = e.length, a = 0; r > a; ++a) {
var o = e[a];
n && n.test(o) || (i += "." + o)
}
try {
return t.querySelectorAll(i)
} catch (l) {
return []
}
}
function imageIsContainedByContainerWithImageAsBackgroundImage(e) {
var t = e.parentElement;
if (!t || !t.style.backgroundImage)
return !1;
var n = /url\((.*)\)/.exec(t.style.backgroundImage);
if (!n || 2 !== n.length)
return !1;
var i = n[1];
return i === e.src
}
function childrenWithParallelStructure(e) {
var t = e.children;
if (!t)
return [];
var n = t.length;
if (!n)
return [];
for (var i = {}, r = 0; n > r; ++r) {
var a = t[r];
if (!CandidateTagNamesToIgnore[a.tagName] && a.className)
for (var o = a.classList, l = o.length, s = 0; l > s; ++s) {
var c = o[s],
u = i[c];
u ? u.push(a) : i[c] = [a]
}
}
var m = Math.floor(n / 2);
for (var c in i) {
var u = i[c];
if (u.length > m)
return u
}
return []
}
const ReaderMinimumScore = 1600,
ReaderMinimumAdvantage = 15,
ArticleMinimumScoreDensity = 4.25,
CandidateMinimumWidth = 280,
CandidateMinimumHeight = 295,
CandidateMinimumArea = 17e4,
CandidateMaximumTop = 1300,
CandidateMinimumWidthPortionForIndicatorElements = .5,
CandidateMinumumListItemLineCount = 4,
CandidateTagNamesToIgnore = {
A: 1,
EMBED: 1,
FORM: 1,
HTML: 1,
IFRAME: 1,
OBJECT: 1,
OL: 1,
OPTION: 1,
SCRIPT: 1,
STYLE: 1,
svg: 1,
UL: 1
},
PrependedArticleCandidateMinimumHeight = 50,
AppendedArticleCandidateMinimumHeight = 200,
AppendedArticleCandidateMaximumVerticalDistanceFromArticle = 150,
StylisticClassNames = {
justfy: 1,
justify: 1,
left: 1,
right: 1,
small: 1
},
CommentRegEx = /comment|meta|footer|footnote/,
CommentMatchPenalty = .75,
ArticleRegEx = /(?:(?:^|\s)(?:(post|hentry|entry)[-_]?(?:content|text|body)?|article[-_]?(?:content|text|body|page)?)(?:\s|$))/i,
ArticleMatchBonus = .5,
CarouselRegEx = /carousel/i,
CarouselMatchPenalty = .75,
SectionRegex = /section|content.*component/i,
DensityExcludedElementSelector = "#disqus_thread, #comments, .userComments",
PositiveRegEx = /article|body|content|entry|hentry|page|pagination|post|related-asset|text/i,
NegativeRegEx = /advertisement|breadcrumb|combx|comment|contact|disqus|footer|link|meta|mod-conversations|promo|related|scroll|share|shoutbox|sidebar|social|sponsor|subscribe|tags|toolbox|widget|[-_]ad$|zoom-(in|out)/i,
VeryPositiveClassNameRegEx = /instapaper_body/,
VeryNegativeClassNameRegEx = /instapaper_ignore/,
SharingRegex = /email|print|rss|digg|slashdot|delicious|reddit|share|twitter|facebook|pinterest|whatsapp/i,
VeryLiberalCommentRegex = /comment/i,
AdvertisementHostRegex = /^adserver\.|doubleclick.net$/i,
SidebarRegex = /sidebar/i,
MinimumAverageDistanceBetweenHRElements = 400,
MinimumAverageDistanceBetweenHeaderElements = 400,
PortionOfCandidateHeightToIgnoreForHeaderCheck = .1,
DefaultNumberOfTextNodesToCheckForLanguageMultiplier = 3,
NumberOfCharactersPerTextNodeToEvaluateForLanguageMultiplier = 12,
MinimumRatioOfCharactersForLanguageMultiplier = .5,
ScoreMultiplierForChineseJapaneseKorean = 3,
MinimumContentMediaHeight = 150,
MinimumContentMediaWidthToArticleWidthRatio = .25,
MaximumContentMediaAreaToArticleAreaRatio = .2,
LinkContinueMatchRegEx = /continue/gi,
LinkNextMatchRegEx = /next/gi,
LinkPageMatchRegEx = /page/gi,
LinkListItemBonus = 5,
LinkPageMatchBonus = 10,
LinkNextMatchBonus = 15,
LinkContinueMatchBonus = 15,
LinkNextOrdinalValueBase = 3,
LinkMismatchValueBase = 2,
LinkMatchWeight = 200,
LinkMaxVerticalDistanceFromArticle = 200,
LinkVerticalDistanceFromArticleWeight = 150,
LinkCandidateXPathQuery = "descendant-or-self::*[(not(@id) or (@id!='disqus_thread' and @id!='comments')) and (not(@class) or @class!='userComments')]/a",
LinkDateRegex = /\D(?:\d\d(?:\d\d)?[\-\/](?:10|11|12|0?[1-9])[\-\/](?:30|31|[12][0-9]|0?[1-9])|\d\d(?:\d\d)?\/(?:10|11|12|0[1-9])|(?:10|11|12|0?[1-9])\-(?:30|31|[12][0-9]|0?[1-9])\-\d\d(?:\d\d)?|(?:30|31|[12][0-9]|0?[1-9])\-(?:10|11|12|0?[1-9])\-\d\d(?:\d\d)?)\D/,
LinkURLSearchParameterKeyMatchRegex = /(page|^p$|^pg$)/i,
LinkURLPageSlashNumberMatchRegex = /\/.*page.*\/\d+/i,
LinkURLSlashDigitEndMatchRegex = /\/\d+\/?$/,
LinkURLArchiveSlashDigitEndMatchRegex = /archives?\/\d+\/?$/,
LinkURLBadSearchParameterKeyMatchRegex = /author|comment|feed|id|nonce|related/i,
LinkURLSemanticMatchBonus = 100,
LinkMinimumURLSimilarityRatio = .75,
HeaderMinimumDistanceFromArticleTop = 200,
HeaderLevenshteinDistanceToLengthRatio = .75,
MinimumRatioOfListItemsBeingRelatedToSharingToPruneEntireList = .5,
FloatMinimumHeight = 130,
ImageSizeTiny = 32,
ToleranceForLeadingImageWidthToArticleWidthForFullWidthPresentation = 50,
MaximumFloatWidth = 325,
AnchorImageMinimumWidth = 100,
AnchorImageMinimumHeight = 100,
MinimumHeightForImagesAboveTheArticleTitle = 50,
MainImageMinimumWidthAndHeight = 83,
BaseFontSize = 16,
BaseLineHeightRatio = 1.125,
MaximumExactIntegralValue = 9007199254740992,
TitleCandidateDepthScoreMultiplier = .1,
TextNodeLengthPower = 1.25,
LazyLoadRegex = /lazy/i,
StringSimilarityToDeclareStringsNearlyIdentical = .97,
FindArticleMode = {
Element: !1,
ExistenceOfElement: !0
},
AppleDotComAndSubdomainsRegex = /.*\.apple\.com\.?$/,
SchemaDotOrgArticleContainerSelector = "*[itemtype='https://schema.org/Article'], *[itemtype='https://schema.org/NewsArticle'], *[itemtype='http://schema.org/Article'], *[itemtype='http://schema.org/NewsArticle']",
CleaningType = {
MainArticleContent: 0,
MetadataContent: 1,
LeadingFigure: 2
},
MaximumWidthOrHeightOfImageInMetadataSection = 20,
TweetURLRegex = /^https?:\/\/(.+\.)?twitter\.com\/.*\/status\/(.*\/)*[0-9]+\/?$/i,
TweetIframeTitleRegex = /tweet/i;
CandidateElement = function(e, t) {
this.element = e, this.contentDocument = t, this.textNodes = this.usableTextNodesInElement(this.element), this.rawScore = this.calculateRawScore(), this.tagNameAndAttributesScoreMultiplier = this.calculateElementTagNameAndAttributesScoreMultiplier(), this.languageScoreMultiplier = 0, this.depthInDocument = 0
}, CandidateElement.extraArticleCandidateIfElementIsViable = function(e, t, n, i) {
const r = "a, b, strong, i, em, u, span";
var a = cachedElementBoundingRect(e),
o = cachedElementBoundingRect(t.element);
if ((i && a.height < PrependedArticleCandidateMinimumHeight || !i && a.height < AppendedArticleCandidateMinimumHeight) && e.childElementCount && e.querySelectorAll("*").length !== e.querySelectorAll(r).length)
return null;
if (i) {
if (a.bottom > o.top)
return null
} else if (a.top < o.bottom)
return null;
if (!i) {
var l = a.top - o.bottom;
if (l > AppendedArticleCandidateMaximumVerticalDistanceFromArticle)
return null
}
if (a.left > o.right || a.right < o.left)
return null;
if (elementLooksLikePartOfACarousel(e))
return null;
var s = new CandidateElement(e, n);
return s.isPrepended = i, s
}, CandidateElement.candidateIfElementIsViable = function(e, t, n) {
var i = cachedElementBoundingRect(e);
return i.width < CandidateMinimumWidth || i.height < CandidateMinimumHeight ? null : i.width * i.height < CandidateMinimumArea ? null : !n && i.top > CandidateMaximumTop ? null : CandidateElement.candidateElementAdjustedHeight(e) < CandidateMinimumHeight ? null : new CandidateElement(e, t)
}, CandidateElement.candidateElementAdjustedHeight = function(e) {
for (var t = cachedElementBoundingRect(e), n = t.height, i = e.getElementsByTagName("form"), r = i.length, a = 0; r > a; ++a) {
var o = i[a],
l = cachedElementBoundingRect(o);
l.width > t.width * CandidateMinimumWidthPortionForIndicatorElements && (n -= l.height)
}
for (var s = e.querySelectorAll("ol, ul"), c = s.length, u = null, a = 0; c > a; ++a) {
var m = s[a];
if (!(u && u.compareDocumentPosition(m) & Node.DOCUMENT_POSITION_CONTAINED_BY)) {
var d = m.getElementsByTagName("li"),
h = d.length,
g = cachedElementBoundingRect(m);
if (h) {
var f = g.height / h,
p = getComputedStyle(d[0]),
E = parseInt(p.lineHeight);
if (isNaN(E)) {
var v = fontSizeFromComputedStyle(p);
E = v * BaseLineHeightRatio
}
g.width > t.width * CandidateMinimumWidthPortionForIndicatorElements && CandidateMinumumListItemLineCount > f / E && (n -= g.height, u = m)
} else
n -= g.height
}
}
return n
}, CandidateElement.prototype = {
calculateRawScore: function() {
for (var e = 0, t = this.textNodes, n = t.length, i = 0; n > i; ++i)
e += this.rawScoreForTextNode(t[i]);
return e
},
calculateElementTagNameAndAttributesScoreMultiplier: function() {
return scoreMultiplierForElementTagNameAndAttributes(this.element)
},
calculateLanguageScoreMultiplier: function() {
0 === this.languageScoreMultiplier && (this.languageScoreMultiplier = languageScoreMultiplierForTextNodes(this.textNodes))
},
depth: function() {
return this.depthInDocument || (this.depthInDocument = elementDepth(this.element)), this.depthInDocument
},
finalScore: function() {
return this.calculateLanguageScoreMultiplier(), this.basicScore() * this.languageScoreMultiplier
},
basicScore: function() {
return this.rawScore * this.tagNameAndAttributesScoreMultiplier
},
scoreDensity: function() {
var e = 0,
t = this.element.querySelector(DensityExcludedElementSelector);
t && (e = t.clientWidth * t.clientHeight);
for (var n = this.element.children || [], i = n.length, r = 0; i > r; ++r) {
var a = n[r];
elementIsCommentBlock(a) && (e += a.clientWidth * a.clientHeight)
}
for (var o = cachedElementBoundingRect(this.element).width * cachedElementBoundingRect(this.element).height, l = o * MaximumContentMediaAreaToArticleAreaRatio, s = cachedElementBoundingRect(this.element).width * MinimumContentMediaWidthToArticleWidthRatio, c = this.element.querySelectorAll("img, object, video"), u = c.length, r = 0; u > r; ++r) {
var m = cachedElementBoundingRect(c[r]);
if (m.width >= s && m.height > MinimumContentMediaHeight) {
var d = m.width * m.height;
l > d && (e += d)
}
}
for (var h = this.basicScore(), g = o - e, f = this.textNodes.length, p = 0, E = 0, r = 0; f > r; ++r) {
var v = this.textNodes[r].parentNode;
v && (E += fontSizeFromComputedStyle(getComputedStyle(v)), p++)
}
var N = BaseFontSize;
return p && (N = E /= p), this.calculateLanguageScoreMultiplier(), h / g * 1e3 * (N / BaseFontSize) * this.languageScoreMultiplier
},
usableTextNodesInElement: function(e) {
var t = [];
if (!e)
return t;
const n = {
A: 1,
DD: 1,
DT: 1,
NOSCRIPT: 1,
OL: 1,
OPTION: 1,
PRE: 1,
SCRIPT: 1,
STYLE: 1,
TD: 1,
UL: 1,
IFRAME: 1
};
var i = this.contentDocument,
r = function(e) {
const r = "text()|*/text()|*/a/text()|*/li/text()|*/li/p/text()|*/span/text()|*/em/text()|*/i/text()|*/strong/text()|*/b/text()|*/font/text()|blockquote/*/text()|div[count(./p)=count(./*)]/p/text()|div[count(*)=1]/div/p/text()|div[count(*)=1]/div/p/*/text()";
for (var a = i.evaluate(r, e, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null), o = a.snapshotLength, l = 0; o > l; ++l) {
var s = a.snapshotItem(l);
n[s.parentNode.tagName] || s._countedTextNode || isNodeWhitespace(s) || (s._countedTextNode = !0, t.push(s))
}
};
r(e);
for (var a = childrenWithParallelStructure(e), o = a.length, l = 0; o > l; ++l) {
var s = a[l];
r(s)
}
for (var c = t.length, l = 0; c > l; ++l)
delete t[l]._countedTextNode;
return t
},
addTextNodesFromCandidateElement: function(e) {
for (var t = this.textNodes.length, n = 0; t > n; ++n)
this.textNodes[n].alreadyCounted = !0;
for (var i = e.textNodes, r = i.length, n = 0; r > n; ++n)
i[n].alreadyCounted || this.textNodes.push(i[n]);
for (var t = this.textNodes.length, n = 0; t > n; ++n)
this.textNodes[n].alreadyCounted = null;
this.rawScore = this.calculateRawScore()
},
rawScoreForTextNode: function(e) {
const t = 20;
if (!e)
return 0;
var n = e.length;
if (t > n)
return 0;
var i = e.parentNode;
if (!isElementVisible(i))
return 0;
for (var r = 1; i && i !== this.element;)
r -= .1, i = i.parentNode;
return Math.pow(n * r, TextNodeLengthPower)
},
shouldDisqualifyDueToScoreDensity: function() {
return this.scoreDensity() < ArticleMinimumScoreDensity
},
shouldDisqualifyDueToHorizontalRuleDensity: function() {
for (var e = this.element.getElementsByTagName("hr"), t = e.length, n = 0, i = cachedElementBoundingRect(this.element), r = .7 * i.width, a = 0; t > a; ++a)
e[a].clientWidth > r && n++;
if (n) {
var o = i.height / n;
if (MinimumAverageDistanceBetweenHRElements > o)
return !0
}
return !1
},
shouldDisqualifyDueToHeaderDensity: function() {
var e = "(h1|h2|h3|h4|h5|h6|*/h1|*/h2|*/h3|*/h4|*/h5|*/h6)[a[@href]]",
t = this.contentDocument.evaluate(e, this.element, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null),
n = t.snapshotLength;
if (n > 2) {
for (var i = 0, r = cachedElementBoundingRect(this.element), a = r.height * PortionOfCandidateHeightToIgnoreForHeaderCheck, o = 0; n > o; ++o) {
var l = t.snapshotItem(o),
s = cachedElementBoundingRect(l);
s.top - r.top > a && r.bottom - s.bottom > a && i++
}
var c = r.height / i;
if (MinimumAverageDistanceBetweenHeaderElements > c)
return !0
}
return !1
},
shouldDisqualifyDueToSimilarElements: function(e) {
function t(e, t) {
if (!e || !t)
return !1;
var n = 1;
return e.className ? e.className === t.className : elementFingerprintForDepth(e, n) === elementFingerprintForDepth(t, n)
}
const n = "h1, h2, h3, h4, h5, h6";
var i = function(e) {
const t = /related-posts/i;
for (var n = e.parentElement; n && n !== this.contentDocument.body; n = n.parentElement)
if (t.test(n.className))
return !0;
return !1
}.bind(this),
r = this.element;
if ("ARTICLE" === r.parentElement.tagName)
return !1;
if ("LI" === r.tagName || "DD" === r.tagName)
for (var a = r.parentNode, o = a.children.length, l = 0; o > l; ++l) {
var s = a.children[l];
if (s.tagName === r.tagName && s.className === r.className && s !== r)
return !0
}
var c = r.classList;
if (c.length || (r = r.parentElement, r && (c = r.classList, c.length || (r = r.parentElement, r && (c = r.classList)))), c.length) {
e || (e = []);
for (var u = e.length, l = 0; u > l; ++l)
e[l].element.candidateElement = e[l];
for (var m = elementsMatchingClassesInClassListIgnoringCommonLayoutClassNames(c, this.contentDocument), d = !1, h = elementDepth(r), g = i(r), f = m.length, l = 0; f > l; ++l) {
var s = m[l];
if (s !== r && s.parentElement !== r && r.parentElement !== s && isElementVisible(s)) {
var p = s.candidateElement;
if ((p || (p = new CandidateElement(s, this.contentDocument))) && p.basicScore() * ReaderMinimumAdvantage > this.basicScore()) {
if (s.closest("section") && r.closest("section"))
return !1;
if (SectionRegex.test(s.className) && SectionRegex.test(r.className))
return !1;
if (i(s) && !g)
return !1;
if (!d && cachedElementBoundingRect(s).bottom < cachedElementBoundingRect(this.element).top) {
d = !0;
continue
}
if (t(r.previousElementSibling, s.previousElementSibling) || t(r.nextElementSibling, s.nextElementSibling)) {
var E = r.querySelector(n),
v = s.querySelector(n);
if (E && v && elementsHaveSameTagAndClassNames(E, v))
return !0;
if (E = r.previousElementSibling, v = s.previousElementSibling, E && v && elementIsAHeader(E) && elementIsAHeader(v) && elementsHaveSameTagAndClassNames(E, v))
return !0
}
if (elementDepth(s) === h)
for (; s.parentElement && r.parentElement && s.parentElement !== r.parentElement;)
s = s.parentElement, r = r.parentElement;
for (; r.childElementCount <= 1;) {
if (!r.childElementCount || !s.childElementCount)
return !1;
if (s.childElementCount > 1)
return !1;
if (r.firstElementChild.tagName !== s.firstElementChild.tagName)
return !1;
r = r.firstElementChild, s = s.firstElementChild
}
if (s.childElementCount <= 1)
return !1;
var v = s.firstElementChild,
N = s.lastElementChild,
E = r.firstElementChild,
C = r.lastElementChild;
if (v.tagName !== E.tagName)
return !1;
if (N.tagName !== C.tagName)
return !1;
var A = v.className,
S = N.className,
R = E.className,
M = N.className,
y = M === R ? 2 : 1;
if (A.length || R.length) {
if (!A.length || !R.length)
return !1;
if (A === R && elementsMatchingClassesInClassList(E.classList, r).length <= y)
return !0
}
if (S.length || M.length) {
if (!S.length || !M.length)
return !1;
if (S === M && elementsMatchingClassesInClassList(N.classList, r).length <= y)
return !0
}
var b = E.clientHeight,
T = C.clientHeight;
return b && v.clientHeight && T && N.clientHeight ? b === v.clientHeight || T === N.clientHeight : !1
}
}
}
for (var l = 0; u > l; ++l)
e[l].element.candidateElement = null
}
return !1
},
shouldDisqualifyForDeepLinking: function() {
function e(e) {
var t = e.pathname.substring(1).split("/");
return t[t.length - 1] || t.pop(), t
}
const t = 5;
for (var n = this.element, i = this.contentDocument.location, r = e(i), a = r.length, o = [], l = n.getElementsByTagName("a"), s = l.length, c = 0; s > c; c++) {
var u = l[c];
if (i.host === u.host && !(e(u).length <= a || 0 !== (u.host + u.pathname).indexOf(i.host + i.pathname) || anchorLinksToAttachment(u) || (o.push(u), o.length < t))) {
var m = n.offsetTop + n.offsetHeight / t;
return o[0].offsetTop < m
}
}
return !1
}
}, String.prototype.lastInteger = function() {
const e = /[0-9]+/g;
var t = this.match(e);
return t ? parseInt(t[t.length - 1]) : NaN
};
ReaderArticleFinder = function(e) {
this.contentDocument = e, this.didSearchForArticleNode = !1, this.article = null, this.didSearchForExtraArticleNode = !1, this.extraArticle = null, this.leadingImage = null, this._cachedScrollY = 0, this._cachedScrollX = 0, this._elementsWithCachedBoundingRects = [], this._cachedContentTextStyle = null, this.pageNumber = 1, this.prefixWithDateForNextPageURL = null, this.previouslyDiscoveredPageURLStrings = []
}, ReaderArticleFinder.prototype = {
isReaderModeAvailable: function() {
return this.findArticleBySearchingWhitelist() ? !0 : (this.cacheWindowScrollPosition(), this.findArticleFromMetadata(FindArticleMode.ExistenceOfElement) ? !0 : (this.article = this.findArticleByVisualExamination(), this.article && this.articleIsLTR(), !!this.article))
},
prepareToTransitionToReader: function() {
this.adoptableArticle(!0), this.nextPageURL(), this.articleIsLTR()
},
nextPageURL: function() {
if (!this._nextPageURL) {
var e = this.nextPageURLString();
"undefined" != typeof ReaderArticleFinderJSController && e && (e = ReaderArticleFinderJSController.substituteURLForNextPageURL(e)), this._nextPageURL = e
}
return this._nextPageURL
},
containerElementsForMultiPageContent: function() {
const e = /(.*page[^0-9]*|.*article.*item[^0-9]*)(\d{1,2})(.*)/i,
t = 3;
for (var n, i = [], r = this.articleNode(), a = 0;;) {
if (n = e.exec(r.getAttribute("id")))
break;
if (r = r.parentElement, !r || a++ === t)
return []
}
for (var l = childrenOfParentElement(r), o = l.length, s = 0; o > s; ++s) {
var c = l[s];
if (c !== r) {
var m = e.exec(c.getAttribute("id"));
m && m[1] === n[1] && m[3] === n[3] && (isElementVisible(c) && !isElementPositionedOffScreen(c) || i.push(c))
}
}
return i
},
adoptableMultiPageContentElements: function() {
return this.containerElementsForMultiPageContent().map(function(e) {
return this.cleanArticleNode(e, e.cloneNode(!0), CleaningType.MainArticleContent, !1)
}, this)
},
classNameIsSignificantInRouteComputation: function(e) {
return e ? !(e.toLowerCase() in StylisticClassNames) : !1
},
shouldIgnoreInRouteComputation: function(e) {
return "SCRIPT" === e.tagName || "LINK" === e.tagName || "STYLE" === e.tagName ? !0 : "TR" !== e.tagName ? !1 : !e.offsetHeight
},
routeToArticleNode: function() {
for (var e = [], t = this.articleNode(); t;) {
var n = {};
n.tagName = t.tagName;
var i = t.getAttribute("id");
i && (n.id = i), this.classNameIsSignificantInRouteComputation(t.className) && (n.className = t.className), n.index = 1;
for (var r = t.previousElementSibling; r; r = r.previousElementSibling)
this.shouldIgnoreInRouteComputation(r) || n.index++;
e.unshift(n), t = t.parentElement
}
return e
},
adjustArticleNodeUpwardIfNecessary: function() {
if (this.article) {
var e;
for (e = this.article.element; e; e = e.parentElement)
if (VeryPositiveClassNameRegEx.test(e.className))
return void (this.article.element = e);
if (e = this.article.element, "HEADER" === e.tagName && "ARTICLE" === e.parentElement.tagName)
return void (this.article.element = e.parentElement);
var t = e.previousElementSibling;
if (t && "FIGURE" === t.tagName && "ARTICLE" === e.parentElement.tagName)
return void (this.article.element = e.parentElement);
var n = "SECTION" === e.tagName ? e : nearestAncestorElementWithTagName(e, "SECTION", ["ARTICLE"]);
if (n) {
var i = n.parentElement,
r = function() {
for (var e = i.children, t = e.length, r = 0; t > r; ++r) {
var a = e[r],
l = a.tagName;
if (a !== n && ("SECTION" === l || "HEADER" === l))
return !0
}
return !1
}();
if (r && (/\barticleBody\b/.test(i.getAttribute("itemprop")) || "MAIN" === i.tagName || "main" === i.getAttribute("role") || "ARTICLE" === i.tagName || i === this.contentDocument.body))
return void (this.article.element = i)
}
const a = /intro/i,
l = /body|content/i;
if (e = this.article.element, a.test(e.className) && e.nextElementSibling && l.test(e.nextElementSibling.className) || l.test(e.className) && e.previousElementSibling && a.test(e.previousElementSibling.className))
return void (this.article.element = e.parentElement);
if ("ARTICLE" !== e.tagName) {
var o = e.parentElement.closest("*[itemprop='articleBody']");
if (o && o.parentElement.closest(SchemaDotOrgArticleContainerSelector))
return void (this.article.element = o)
}
var s = e.closest("article");
if (s) {
e = unwrappedArticleContentElement(e);
var c = elementDepth(e);
"P" !== e.tagName || e.className || (e = e.parentElement, c--);
var m = elementsMatchingClassesInClassListIgnoringCommonLayoutClassNames(e.classList, this.contentDocument);
1 === m.length && (m = elementsMatchingClassesInClassListIgnoringClassesWithNumericSuffix(e.classList, this.contentDocument));
for (var h = m.length, d = 0; h > d; ++d) {
var u = m[d];
if (e !== u && c === elementDepth(u) && isElementVisible(u) && !u.querySelector("article") && dominantFontFamilyAndSizeForElement(e) === dominantFontFamilyAndSizeForElement(u))
return void (this.article.element = s)
}
}
if (e = this.article.element, !e.getAttribute("id") && e.className) {
var g = e.tagName,
f = e.className,
p = e.parentElement;
if (p)
for (var v = p.children, d = 0, E = v.length; E > d; ++d) {
var N = v[d];
if (N !== e && N.tagName === g && N.className === f) {
var S = CandidateElement.candidateIfElementIsViable(N, this.contentDocument, !0);
if (S && !(S.finalScore() < ReaderMinimumScore))
return void (this.article.element = p)
}
}
}
}
},
findArticleBySearchingWhitelist: function() {
var e,
t = this.contentDocument;
return findArticleNodeSelectorsInWhitelistForHostname(t.location.hostname, function(n) {
var i = t.querySelectorAll(n);
return 1 === i.length ? (e = new CandidateElement(i[0], t), !0) : void 0
}), e
},
articleNode: function(e) {
return this.didSearchForArticleNode || (this.article = this.findArticleBySearchingWhitelist(), this.article || (this.article = this.findArticleBySearchingAllElements()), this.article || (this.article = this.findArticleByVisualExamination()), this.article || (this.article = this.findArticleFromMetadata()), !this.article && e && (this.article = this.findArticleBySearchingAllElements(!0)), this.adjustArticleNodeUpwardIfNecessary(), this.article && (this.article.element = unwrappedArticleContentElement(this.article.element)), this.didSearchForArticleNode = !0, this.article && this.articleIsLTR()), this.article ? this.article.element : null
},
extraArticleNode: function() {
return this.didSearchForArticleNode || this.articleNode(), this.didSearchForExtraArticleNode || (this.extraArticle = this.findExtraArticle(), this.didSearchForExtraArticleNode = !0), this.extraArticle ? this.extraArticle.element : null
},
cacheWindowScrollPosition: function() {
this._cachedScrollY = window.scrollY, this._cachedScrollX = window.scrollX
},
contentTextStyle: function() {
return this._cachedContentTextStyle ? this._cachedContentTextStyle : (this._cachedContentTextStyle = contentTextStyleForNode(this.contentDocument, this.articleNode()), this._cachedContentTextStyle || (this._cachedContentTextStyle = getComputedStyle(this.articleNode())), this._cachedContentTextStyle)
},
commaCountIsLessThan: function(e, t) {
for (var n = 0, i = e.textContent, r = -1; t > n && (r = i.indexOf(",", r + 1)) >= 0;)
n++;
return t > n
},
calculateLinkDensityForPruningElement: function(e, t) {
var n = removeWhitespace(e.textContent).length;
if (!n)
return 0;
for (var i = this.article.element, r = function() {
for (var t = e.originalElement; t && t !== i; t = t.parentElement)
if ("none" !== getComputedStyle(t)["float"])
return t;
return null
}(), a = e.getElementsByTagName("a"), l = 0, o = a.length, s = 0; o > s; ++s) {
var c = a[s];
!r && c.href && t && t === dominantFontFamilyAndSizeForElement(c.originalElement) || (l += removeWhitespace(c.textContent).length)
}
return l / n
},
shouldPruneElement: function(e, t, n) {
const i = .33,
r = .5,
a = .2,
l = 25,
o = 4e4;
var s = e.tagName;
if (!e.parentElement)
return !1;
if (t.classList.contains("footnotes"))
return !1;
if ("FIGURE" === e.parentElement.tagName && e.querySelector("img"))
return !1;
if ("IFRAME" === s)
return shouldPruneIframe(e, this.contentDocument);
if ("OBJECT" !== s && "EMBED" !== s && "CANVAS" !== s) {
for (var c = !1, m = e.childNodes.length, h = 0; m > h; ++h) {
var d = e.childNodes[h],
u = d.nodeType;
if (u === Node.ELEMENT_NODE || u === Node.TEXT_NODE && !isNodeWhitespace(d)) {
c = !0;
break
}
}
if (!c) {
if ("P" === s) {
var g = e.previousSibling,
f = e.nextSibling;
if (g && g.nodeType === Node.TEXT_NODE && !isNodeWhitespace(g) && f && f.nodeType === Node.TEXT_NODE && !isNodeWhitespace(f))
return !1
}
return !0
}
if ("P" === s)
return !1
}
if ("CANVAS" === s) {
if (window.innerWidth === t.width && window.innerHeight === t.height)
return !0;
const p = /progressive/i;
return p.test(t.className) && "IMG" === t.nextElementSibling.tagName ? !0 : canvasElementHasNoUserVisibleContent(t) ? !0 : "CUFON" === e.parentNode.tagName
}
if (e.closest("figure") && e.querySelector("picture"))
return !1;
var v = 0;
if (t) {
if (VeryNegativeClassNameRegEx.test(t.className))
return !0;
var E = t.className,
N = t.getAttribute("id");
PositiveRegEx.test(E) && v++, PositiveRegEx.test(N) && v++, NegativeRegEx.test(E) && v--, NegativeRegEx.test(N) && v--
}
if (0 > v)
return !0;
if (elementIsProtected(e) || e.querySelector(".tweet-wrapper"))
return !1;
if ("UL" === s || "OL" === s) {
if (t.querySelector("iframe") && t.querySelector("script"))
return !0;
var S = t.children,
y = S.length;
if (!y)
return !0;
for (var T = 0, A = 0, h = 0; y > h; ++h) {
var b = S[h];
if (SharingRegex.test(b.className))
T++;
else {
var C = b.children,
x = C.length;
1 === x && SharingRegex.test(C[0].className) && T++
}
NegativeRegEx.test(S[h].className) && A++
}
return T / y >= MinimumRatioOfListItemsBeingRelatedToSharingToPruneEntireList ? !0 : A / y >= MinimumRatioOfListItemsBeingRelatedToSharingToPruneEntireList
}
if ("OBJECT" === s) {
var D = e.querySelector("embed[src]"),
I = D ? anchorForURL(D.src, this.contentDocument) : null;
if (I && hostnameMatchesHostKnownToContainEmbeddableMedia(I.hostname))
return !1;
var R = e.getAttribute("data");
return I = R ? anchorForURL(R, this.contentDocument) : null, !I || !hostnameMatchesHostKnownToContainEmbeddableMedia(I.hostname)
}
if (1 === e.childElementCount) {
var L = e.firstElementChild;
if ("A" === L.tagName)
return !1;
if ("SPAN" === L.tagName && "converted-anchor" === L.className && nearestAncestorElementWithTagName(L, "TABLE"))
return !1
}
var M = e.getElementsByTagName("img"),
B = M.length;
if (B) {
for (var F = 0, h = 0; B > h; ++h) {
var O = M[h].originalElement;
if (isElementVisible(O)) {
var P = cachedElementBoundingRect(O);
F += P.width / B * (P.height / B)
}
}
if (F > o)
return !1
}
if (!this.commaCountIsLessThan(e, 10))
return !1;
var _ = e.getElementsByTagName("p").length,
w = e.getElementsByTagName("br").length,
q = _ + Math.floor(w / 2);
if (B > q)
return !0;
if (e.getElementsByTagName("li").length > q && dominantFontFamilyAndSizeForElement(t.querySelector("li")) !== n)
return !0;
if (e.getElementsByTagName("input").length / q > i)
return !0;
if (e.textContent.length < l && 1 !== B)
return !0;
if (e.querySelector("embed"))
return !0;
var k = this.calculateLinkDensityForPruningElement(e, n);
if (v >= 1 && k > r)
return !0;
if (1 > v && k > a)
return !0;
if ("TABLE" === s) {
var W = removeWhitespace(e.innerText).length,
U = removeWhitespace(t.innerText).length;
if (.5 * U >= W)
return !0
}
return !1
},
wordCountIsLessThan: function(e, t) {
for (var n = 0, i = e.textContent, r = -1; (r = i.indexOf(" ", r + 1)) >= 0 && t > n;)
n++;
return t > n
},
leadingImageIsAppropriateWidth: function(e) {
return this.article && e ? e.getBoundingClientRect().width >= this.article.element.getBoundingClientRect().width - ToleranceForLeadingImageWidthToArticleWidthForFullWidthPresentation : !1
},
newDivFromNode: function(e) {
var t = this.contentDocument.createElement("div");
return e && (t.innerHTML = e.innerHTML), t
},
headerElement: function() {
if (!this.article)
return null;
var e = this.article.element.previousElementSibling;
if (e && "HEADER" === e.tagName)
return e;
var t = this._articleTitleElement;
if (!t)
return null;
var n = t.parentElement;
if (n && "HEADER" === n.tagName && !this.article.element.contains(n))
for (var i = n.querySelectorAll("img"), r = i.length, a = 0; r > a; ++a) {
var l = i[a],
o = cachedElementBoundingRect(l);
if (o.width >= MainImageMinimumWidthAndHeight && o.height >= MainImageMinimumWidthAndHeight)
return n
}
return null
},
adoptableLeadingImage: function() {
const e = 5,
t = /credit/,
n = /caption/,
i = /src|alt/;
if (!this.article || !this.leadingImage || !this.leadingImageIsAppropriateWidth(this.leadingImage))
return null;
var r = this.leadingImage.closest("figure");
if (r)
return this.cleanArticleNode(r, r.cloneNode(!0), CleaningType.LeadingFigure, !0);
var a = this.leadingImage.parentNode,
l = null,
o = null,
s = a.children.length;
if ("DIV" === a.tagName && s > 1 && e > s)
for (var c = a.cloneNode(!0).querySelectorAll("p, div"), m = c.length, h = 0; m > h; ++h) {
var d = c[h];
t.test(d.className) ? l = d.cloneNode(!0) : n.test(d.className) && (o = d.cloneNode(!0))
}
for (var u = this.leadingImage.cloneNode(!1), g = u.attributes, h = 0; h < g.length; ++h) {
var f = g[h].nodeName;
i.test(f) || (u.removeAttribute(f), h--)
}
var p = this.contentDocument.createElement("div");
if (p.className = "leading-image", p.appendChild(u), l) {
var v = this.newDivFromNode(l);
v.className = "credit", p.appendChild(v)
}
if (o) {
var E = this.newDivFromNode(o);
E.className = "caption", p.appendChild(E)
}
return p
},
articleBoundingRect: function() {
return this._articleBoundingRect ? this._articleBoundingRect : (this._articleBoundingRect = cachedElementBoundingRect(this.article.element), this._articleBoundingRect)
},
adoptableArticle: function(e) {
if (this._adoptableArticle)
return this._adoptableArticle.cloneNode(!0);
clearCachedElementBoundingRects(), this.cacheWindowScrollPosition();
var t = this.articleNode(e);
if (this._adoptableArticle = t ? t.cloneNode(!0) : null, !this._adoptableArticle)
return this._adoptableArticle;
if (this._adoptableArticle = this.cleanArticleNode(t, this._adoptableArticle, CleaningType.MainArticleContent, !1), "P" === this._adoptableArticle.tagName) {
var n = document.createElement("div");
n.appendChild(this._adoptableArticle), this._adoptableArticle = n
}
var i = this.extraArticleNode();
if (i) {
var r = this.cleanArticleNode(i, i.cloneNode(!0), CleaningType.MainArticleContent, !0);
r && (this.extraArticle.isPrepended ? this._adoptableArticle.insertBefore(r, this._adoptableArticle.firstChild) : this._adoptableArticle.appendChild(r));
var a = cachedElementBoundingRect(this.article.element),
l = cachedElementBoundingRect(this.extraArticle.element),
o = {
top: Math.min(a.top, l.top),
right: Math.max(a.right, l.right),
bottom: Math.max(a.bottom, l.bottom),
left: Math.min(a.left, l.left)
};
o.width = o.right - o.left, o.height = o.bottom - o.top, this._articleBoundingRect = o
}
this._articleTextContent = this._adoptableArticle.innerText;
var s = this.headerElement();
if (this.leadingImage && (!s || !s.contains(this.leadingImage))) {
var c = this.adoptableLeadingImage();
c && this._adoptableArticle.insertBefore(c, this._adoptableArticle.firstChild)
}
var m = !!s;
if (m && i && (i === s && (m = !1), m)) {
var h = i.compareDocumentPosition(s);
(h & Node.DOCUMENT_POSITION_CONTAINS || h & Node.DOCUMENT_POSITION_CONTAINED_BY) && (m = !1)
}
if (m) {
var d = this.cleanArticleNode(s, s.cloneNode(!0), CleaningType.MainArticleContent, !0);
d && this._adoptableArticle.insertBefore(d, this._adoptableArticle.firstChild)
}
return this._adoptableArticle
},
elementPinToEdge: function(e) {
const t = {
AREA: 1,
BR: 1,
CANVAS: 1,
EMBED: 1,
FRAME: 1,
HR: 1,
IMG: 1,
INPUT: 1
},
n = 120;
if (window.scrollY < n)
return null;
var i = cachedElementBoundingRect(e),
r = e.ownerDocument.elementFromPoint((i.left + i.right) / 2, 0);
r && r.tagName in t && (r = r.parentElement);
for (var a = r; a && a !== e;)
a = a.parentNode;
return a ? r : null
},
dominantContentSelectorAndDepth: function(e) {
const t = 2;
var n = {},
i = {};
walkElementSubtree(e, t, function(e, t) {
if (isElementVisible(e)) {
var r = selectorForElement(e) + " | " + t;
i[r] ? i[r] += 1 : (i[r] = 1, n[r] = e)
}
});
var r,
a = arrayOfKeysAndValuesOfObjectSortedByValueDescending(i);
switch (a.length) {
case 0:
break;
case 1:
r = a[0].key;
break;
default:
var l = a[0];
l.value > a[1].value && (r = l.key)
}
if (!r)
return null;
var o = n[r];
return {
selector: selectorForElement(o),
depth: depthOfElementWithinElement(o, e)
}
},
functionToPreventPruningElementDueToInvisibility: function() {
var e = functionToPreventPruningDueToInvisibilityInWhitelistForHostname(this.contentDocument.location.hostname);
return e || function() {
return !1
}
},
cleanArticleNode: function(e, t, n, i) {
function r(e) {
v += e, E && (E += e), N && (N += e), S && (S += e), y && (y += e)
}
function a() {
1 === E && (E = 0), 1 === N && (N = 0), 1 === S && (S = 0), 1 === y && (y = 0)
}
function l() {
const t = .8;
var n = cachedElementBoundingRect(e);
if (0 === n.width || 0 === n.height)
return !0;
var i,
r = childrenWithParallelStructure(e),
a = r.length;
if (a) {
i = [];
for (var l = 0; a > l; ++l) {
var o = r[l];
if ("none" === getComputedStyle(o)["float"])
for (var s = o.children, c = s.length, m = 0; c > m; ++m)
i.push(s[m]);
else
i.push(o)
}
} else
i = e.children;
for (var h = i.length, d = 0, l = 0; h > l; ++l) {
var u = i[l];
"none" !== getComputedStyle(u)["float"] && (d += u.innerText.length)
}
var g = e.innerText.length,
f = d / g;
return f > t
}
function o(t) {
const n = 50;
if (cachedElementBoundingRect(t).height > n)
return !1;
const i = {
UL: 1,
LI: 1,
NAV: 1
};
return i[t.tagName] ? !0 : t.parentElement === e && !t.nextElementSibling
}
function s(e, t) {
const n = .9;
return !(cachedElementBoundingRect(e).height > n * cachedElementBoundingRect(t).height)
}
function c(e, t) {
const n = 1.1,
i = 1.4;
if (t && V) {
var r = t > i * V || z.test(T.className) && t > n * V;
r && !e.closest(".pullquote") && (e.classList.add("pullquote"), e.classList.contains("float") || (e.style.width = null, cleanStyleAndClassList(e)))
}
}
function m(e, t) {
for (var n = e[t]; n; n = n[t])
if (!isNodeWhitespace(n) && n.nodeType !== Node.COMMENT_NODE)
return !1;
return !0
}
const h = {
FORM: 1,
SCRIPT: 1,
STYLE: 1,
LINK: 1,
BUTTON: 1
},
d = {
DIV: 1,
TABLE: 1,
OBJECT: 1,
UL: 1,
CANVAS: 1,
P: 1,
IFRAME: 1,
ASIDE: 1,
SECTION: 1,
FOOTER: 1,
NAV: 1,
OL: 1,
MENU: 1,
svg: 1
},
u = {
I: 1,
EM: 1
},
g = {
B: 1,
STRONG: 1,
H1: 1,
H2: 1,
H3: 1,
H4: 1,
H5: 1,
H6: 1
},
f = /lightbox/i;
var p = [],
v = 0,
E = 0,
N = 0,
S = 0,
y = 0,
T = e,
A = T.ownerDocument.defaultView,
b = t,
C = this.articleTitle(),
x = this._articleTitleElement,
D = (this.articleSubhead(), this._articleSubheadElement),
I = x && cachedElementBoundingRect(x).top > cachedElementBoundingRect(e).bottom,
R = this.elementPinToEdge(e),
L = null,
M = isElementVisible(e),
B = new Set([x, D]),
F = new Set;
if (n === CleaningType.MainArticleContent) {
this.updateArticleBylineAndDateElementsIfNecessary();
var O = this.articleBylineElement();
O && F.add(O);
var P = this.articleDateElement();
P && F.add(P)
}
var _ = this.dominantContentSelectorAndDepth(e),
w = l(),
q = new Set;
this.previouslyDiscoveredPageURLStrings.forEach(function(e) {
q.add(e)
});
var k = this.nextPageURL();
k && q.add(k);
var W = null;
this._articleTitleElement && (W = cachedElementBoundingRect(this._articleTitleElement));
var U = this.functionToPreventPruningElementDueToInvisibility(),
H = dominantFontFamilyAndSizeForElement(e),
V = dominantFontSizeInPointsFromFontFamilyAndSizeString(H);
const z = /pull(ed)?quote/i;
for (var G = [], j = []; T;) {
var Y = null,
X = b.tagName,
K = !1;
if (b.originalElement = T, T === R && (L = b), X in h && (Y = b), !Y && T !== e && B.has(T) ? Y = b : !Y && T !== e && F.has(T) ? (b.parentElementBeforePruning = b.parentElement, Y = b, G.push(b)) : elementIsAHeader(b) && previousLeafElementForElement(T) === x && b.classList.add("protected"), !Y && ("H1" === X || "H2" === X)) {
var J = T.offsetTop - e.offsetTop;
if (J < HeaderMinimumDistanceFromArticleTop) {
var Q = trimmedInnerTextIgnoringTextTransform(T),
$ = Q.length * HeaderLevenshteinDistanceToLengthRatio;
levenshteinDistance(C, Q) <= $ && (Y = b)
}
}
if (Y || this.isMediaWikiPage() && /editsection/.test(T.className) && (Y = b), "VIDEO" === X)
if (b.getAttribute("src")) {
b.classList.add("protected");
var Z = cachedElementBoundingRect(T);
b.setAttribute("width", Z.width), b.setAttribute("height", Z.height), b.setAttribute("controls", !0), b.removeAttribute("autoplay"), b.removeAttribute("preload"), b.removeAttribute("style")
} else
Y = b;
var ee;
if (Y || (ee = getComputedStyle(T)), !Y && "DIV" === X && LazyLoadRegex.test(T.className) && !T.innerText) {
var te = lazyLoadingImageURLForElement(b);
if (te) {
var ne = this.contentDocument.createElement("img");
ne.setAttribute("src", te), b.parentNode.replaceChild(ne, b), b = ne, b.originalElement = T, X = b.tagName, Y = b, b.classList.add("protected")
}
}
if (!Y && "DIV" === X && b.parentNode) {
var ie = T.querySelectorAll("a, blockquote, dl, div, img, ol, p, pre, table, ul"),
re = E || "none" !== ee["float"];
if (!re && !ie.length) {
for (var ae = b.parentNode, le = this.contentDocument.createElement("p"); b.firstChild;) {
var oe = b.firstChild;
le.appendChild(oe)
}
ae.replaceChild(le, b), L === b && (L = le), b = le, b.originalElement = T, X = b.tagName
}
}
if (!Y && b.parentNode && X in d && p.push(b), Y || (isElementPositionedOffScreen(T) ? Y = b : T === e || E || "none" === ee["float"] || w || !(cachedElementBoundingRect(T).height >= FloatMinimumHeight || T.childElementCount > 1) || (E = 1)), !Y) {
if (sanitizeElementByRemovingAttributes(b), n === CleaningType.MetadataContent)
if ("|" === b.innerText)
b.innerText = "", b.classList.add("delimiter");
else if ("TIME" === b.tagName) {
var se = b.previousElementSibling;
if (se && "SPAN" === se.tagName && !se.classList.contains("delimiter")) {
var ce = this.contentDocument.createElement("span");
ce.classList.add("delimiter"), b.before(ce)
}
} else
"FIGURE" === X && (Y = b);
if ("both" === ee.clear && b.classList.add("clear"), "UL" === X || "OL" === X || "MENU" === X) {
if (W && cachedElementBoundingRect(T).top < W.top)
Y = b;
else if ("none" === ee["list-style-type"] && "none" === ee["background-image"]) {
for (var me = T.children, he = me.length, de = !0, ue = 0; he > ue; ++ue) {
var ge = getComputedStyle(me[ue]);
if ("none" !== ge["list-style-type"] || 0 !== parseInt(ge["-webkit-padding-start"])) {
de = !1;
break
}
}
de && b.classList.add("list-style-type-none")
}
if (T.querySelector("code")) {
const fe = /monospace|menlo|courier/i;
var pe = dominantFontFamilyAndSizeForElement(T);
fe.test(pe) && (b.classList.add("code-block"), b.classList.add("protected"))
}
}
if (S || "normal" === ee.fontStyle || (X in u || (b.style.fontStyle = ee.fontStyle), S = 1), !y && "normal" !== ee.fontWeight) {
if (!(X in g)) {
var ve = parseInt(ee.fontWeight),
Ee = null;
isNaN(ve) ? Ee = ee.fontWeight : 400 >= ve || ve >= 500 && (Ee = "bold"), Ee && (b.style.fontWeight = Ee)
}
y = 1
}
if (E && "SECTION" !== X && s(T, e) || "ASIDE" === X) {
var pe = dominantFontFamilyAndSizeForElement(T),
Ne = dominantFontSizeInPointsFromFontFamilyAndSizeString(pe),
Se = pe && pe === H;
if (1 === E && (cachedElementBoundingRect(T).width <= MaximumFloatWidth ? b.setAttribute("class", "auxiliary float " + ee["float"]) : Se || b.classList.add("auxiliary")), b.closest(".auxiliary")) {
var ye = T.style.getPropertyValue("width");
if ("table" === ee.display && /%/.test(ye) && parseInt(ye) < 2)
b.style.width = ee.width;
else if (ye)
b.style.width = ye;
else {
var Te = A.getMatchedCSSRules(T, "", !0);
if (Te)
for (var Ae = Te.length, ue = Ae - 1; ue >= 0; --ue) {
ye = Te[ue].style.getPropertyValue("width");
var be = parseInt(ye);
if (ye && (isNaN(be) || be > 0)) {
b.style.width = ye;
break
}
}
}
1 !== E || ye || (b.style.width = cachedElementBoundingRect(T).width + "px")
}
c(b, Ne)
}
if ("TABLE" === X)
N || (N = 1);
else if ("IMG" === X) {
var te = lazyLoadingImageURLForElement(b);
if (te) {
b.setAttribute("src", te);
var Ce = !!b.closest("figure");
if (!Ce)
for (var xe = T.attributes, De = xe.length, ue = 0; De > ue; ++ue)
if (f.test(xe[ue].nodeName)) {
Ce = !0;
break
}
Ce && b.classList.add("protected"), K = !0
}
b.removeAttribute("border"), b.removeAttribute("hspace"), b.removeAttribute("vspace");
var Ie = b.getAttribute("align");
if (b.removeAttribute("align"), "left" !== Ie && "right" !== Ie || (b.classList.add("float"), b.classList.add(Ie)), !E && !K) {
var Re = cachedElementBoundingRect(T),
Le = Re.width,
Me = Re.height;
imageIsContainedByContainerWithImageAsBackgroundImage(T) ? b.classList.add("protected") : 1 === Le && 1 === Me ? Y = b : W && Me < MinimumHeightForImagesAboveTheArticleTitle && Re.bottom < W.top ? Y = b : Le < ImageSizeTiny && Me < ImageSizeTiny && b.setAttribute("class", "reader-image-tiny")
}
if (n === CleaningType.MetadataContent) {
var Re = cachedElementBoundingRect(T);
(Re.width > MaximumWidthOrHeightOfImageInMetadataSection || Re.height > MaximumWidthOrHeightOfImageInMetadataSection) && (Y = b)
}
} else if ("FONT" === X)
b.removeAttribute("size"), b.removeAttribute("face"), b.removeAttribute("color");
else if ("A" === X && b.parentNode) {
var Be = b.getAttribute("href");
if ("author" === T.getAttribute("itemprop"))
b.classList.add("protected");
else if (Be && Be.length && ("#" === Be[0] || anchorRunsJavaScriptOnActivation(b))) {
const Fe = {
LI: 1,
SUP: 1
};
if (!N && !b.childElementCount && 1 === b.parentElement.childElementCount && !Fe[b.parentElement.tagName]) {
var Oe = this.contentDocument.evaluate("text()", b.parentElement, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
Oe.snapshotLength || (Y = b)
}
if (!Y) {
var le = this.contentDocument.createElement("span");
if (1 === b.childElementCount && "IMG" === b.firstElementChild.tagName) {
var Pe = b.firstElementChild;
Pe.width > AnchorImageMinimumWidth && Pe.height > AnchorImageMinimumHeight && le.setAttribute("class", "converted-image-anchor")
}
for (le.className || le.setAttribute("class", "converted-anchor"); b.firstChild;)
le.appendChild(b.firstChild);
b.parentNode.replaceChild(le, b), b = le, L === b && (L = le)
}
} else if (AdvertisementHostRegex.test(b.host) && !b.innerText)
Y = b;
else if (x && !I && x.compareDocumentPosition(T) & document.DOCUMENT_POSITION_PRECEDING && cachedElementBoundingRect(T).top < cachedElementBoundingRect(x).top)
j.push(b);
else {
var _e = T.children;
1 === _e.length && "IMG" === _e[0].tagName && !T.innerText && anchorLooksLikeDownloadFlashLink(T) && (Y = b)
}
} else if ("ASIDE" === X || "BLOCKQUOTE" === X || "Q" === X || "DIV" === X && z.test(T.className)) {
var pe = dominantFontFamilyAndSizeForElement(T),
Ne = dominantFontSizeInPointsFromFontFamilyAndSizeString(pe);
c(b, Ne)
}
}
if (ee && M && !K) {
var we = "none" === ee.display || "visible" !== ee.visibility || computedStyleIndicatesElementIsInvisibleDueToClipping(ee);
if (we) {
var qe = _ ? v === _.depth && selectorForElement(T) === _.selector : !1;
qe || U(T, e) || (Y = b)
}
}
if (!Y && elementIsCommentBlock(T) && (Y = b), !Y && W && cachedElementBoundingRect(T).top < W.top && VeryLiberalCommentRegex.test(T.className) && b.parentElement && (Y = b), !Y && "A" === X && q.has(T.href)) {
for (var ke, We, Ue = T, He = b; (Ue = Ue.parentElement) && (He = He.parentElement);) {
const Ve = 10;
if (cachedElementBoundingRect(Ue).top - cachedElementBoundingRect(T).top > Ve)
break;
if (Ue === e)
break;
o(Ue) && (ke = Ue, We = He)
}
ke && (Y = We, T = ke, b = We, b.originalElement = T, X = b.tagName), Ue = null, He = null, ke = null, We = null
}
!Y || Y.parentElement || i || (Y = null);
var ze = Y ? null : T.firstElementChild;
if (ze)
T = ze, b = b.firstElementChild, r(1);
else {
for (var Ge; T !== e && !(Ge = T.nextElementSibling);)
T = T.parentElement, b = b.parentElement, r(-1);
if (T === e) {
if (Y && !elementIsProtected(Y))
if (Y.parentElement)
Y.remove();
else if (i)
return null;
break
}
T = Ge, b = b.nextElementSibling, a()
}
if (Y && !elementIsProtected(Y))
if (Y.parentElement)
Y.remove();
else if (i)
return null
}
for (var je = t.querySelectorAll("iframe"), Ye = je.length, ue = 0; Ye > ue; ++ue) {
var Xe = je[ue];
if (elementLooksLikeEmbeddedTweet(Xe.originalElement)) {
var Ke = this.adoptableSimpleTweetFromTwitterIframe(Xe);
Ke && Xe.parentElement.replaceChild(Ke, Xe)
}
Xe.classList.add("protected"), Xe.setAttribute("sandbox", "allow-scripts allow-same-origin")
}
for (var ue = p.length - 1; ue >= 0; --ue) {
var Je = p[ue];
Je.parentNode && this.shouldPruneElement(Je, Je.originalElement, H) && (L === Je && ((L = Je.nextElementSibling) || (L = Je.parentElement)), Je.remove())
}
for (var Qe = j.length, ue = 0; Qe > ue; ++ue)
j[ue].remove();
for (var $e = t.querySelectorAll(".float"), ue = 0; ue < $e.length; ++ue) {
var Ze = !1,
et = $e[ue];
if (!Ze) {
var tt = et.querySelectorAll("a, span.converted-image-anchor"),
nt = et.querySelectorAll("span.converted-anchor");
Ze = et.parentNode && nt.length > tt.length
}
if (!Ze) {
var it = et.querySelectorAll("embed, object").length,
rt = et.originalElement.querySelectorAll("embed, object").length;
!it && rt && (Ze = !0)
}
if (!Ze) {
for (var at = et.originalElement.getElementsByTagName("img"), lt = at.length, ot = 0, st = 0; lt > st && (M && isElementVisible(at[st]) && ot++, !(ot > 1)); ++st)
;
if (1 === ot) {
var ct = et.getElementsByTagName("img").length;
ct || (Ze = !0)
}
}
if (!Ze) {
const mt = "img, video, embed, iframe, object, svg";
/\S/.test(et.innerText) || et.matches(mt) || et.querySelector(mt) || (Ze = !0)
}
Ze && (L === et && ((L = et.nextElementSibling) || (L = et.parentElement)), elementIsProtected(et) || et.remove())
}
for (var ht = t.querySelectorAll("br"), dt = ht.length, ue = dt - 1; ue >= 0; --ue) {
var ut = ht[ue];
ut.originalElement && "block" === getComputedStyle(ut.originalElement.parentElement).display && (m(ut, "nextSibling") || m(ut, "previousSibling")) && ut.remove()
}
if (i && !removeWhitespace(t.innerText).length && n !== CleaningType.LeadingFigure)
return null;
if (L) {
var gt = document.createElement("div"),
ft = L.originalElement.getBoundingClientRect(),
pt = ft.height > 0 ? 100 * ft.top / ft.height : 0;
gt.style.position = "relative", gt.style.top = Math.round(-pt) + "%", gt.setAttribute("id", "safari-reader-element-marker"), L.insertBefore(gt, L.firstChild)
}
for (var vt = {}, tt = t.querySelectorAll("a"), Et = tt.length, ue = 0; Et > ue; ++ue) {
var Nt = tt[ue],
St = Nt.style.fontWeight;
vt[St] || (vt[St] = []), vt[St].push(Nt)
}
for (var St in vt) {
var yt = vt[St],
Tt = yt.length;
if (Tt === Et)
for (var ue = 0; Tt > ue; ++ue) {
var Nt = yt[ue];
Nt.style.fontWeight = null, "" === Nt.getAttribute("style") && (Nt.style = null)
}
}
for (var At = t.querySelectorAll(".protected"), bt = At.length, ue = 0; bt > ue; ++ue) {
var Je = At[ue];
Je.classList.remove("protected"), Je.classList.length || Je.removeAttribute("class")
}
for (var Ct = t.querySelectorAll("p.auxiliary"), xt = Ct.length, ue = 0; xt > ue; ++ue) {
for (var Dt = Ct[ue], It = [Dt], Rt = Dt.nextElementSibling; Rt && "P" === Rt.tagName && Rt.classList.contains("auxiliary");)
It.push(Rt), Rt = Rt.nextElementSibling;
var Lt = It.length;
if (Lt > 1) {
for (var st = 0; Lt > st; ++st) {
var Mt = It[st];
Mt.classList.remove("auxiliary"), Mt.style.width = null, cleanStyleAndClassList(Mt)
}
ue += Lt - 1
}
}
for (var Bt = G.length, ue = 0; Bt > ue; ++ue) {
var Ft = G[ue],
Ot = Ft.parentElementBeforePruning,
Pt = null,
_t = null;
if (Ot)
var Pt = depthOfElementWithinElement(Ot, t),
_t = selectorForElement(Ot);
var wt = Ot ? Ot.closest("ul") : null;
if (wt)
wt.remove();
else {
const qt = 40;
Ot && cachedElementBoundingRect(Ot.originalElement).height < qt && (!_ || _.selector !== _t || _.depth !== Pt) ? Ot.remove() : Ft.remove()
}
}
return t
},
adoptableSimpleTweetFromTwitterIframe: function(e) {
var t = function(e) {
var t = this.contentDocument.createElement("div"),
n = this.contentDocument.createTextNode(e);
return t.appendChild(n), t.innerHTML
}.bind(this),
n = e.originalElement.contentDocument.documentElement,
i = n.querySelector("[data-tweet-id].expanded");
if (!i)
return null;
var r = this.contentDocument.createElement("div");
r.classList.add("tweet-wrapper");
var a = this.contentDocument.createElement("blockquote");
a.classList.add("simple-tweet"), r.appendChild(a);
var l = i.getAttribute("data-tweet-id");
r.setAttribute("data-reader-tweet-id", l);
var o = i.querySelector(".dateline"),
s = i.querySelector('[data-scribe="element:screen_name"]'),
c = i.querySelector('[data-scribe="element:name"]'),
m = i.querySelector(".e-entry-title");
if (!(o && s && c && m))
return r;
var h = "&mdash; " + t(c.innerText) + " (" + t(s.innerText) + ")",
d = this.contentDocument.createElement("p");
d.innerHTML = m.innerHTML, a.appendChild(d), a.insertAdjacentHTML("beforeend", h);
var u = this.contentDocument.createElement("span");
u.innerHTML = o.innerHTML, a.appendChild(u);
for (var g = a.querySelectorAll("img.twitter-emoji"), f = g.length, p = 0; f > p; ++p) {
var v = g[p],
E = v.getAttribute("alt");
if (E && E.length > 0) {
var N = this.contentDocument.createElement("span");
N.innerText = E, v.parentNode.replaceChild(N, v)
}
}
for (var S = a.getElementsByTagName("*"), y = S.length, p = 0; y > p; ++p) {
var T = S[p];
"SCRIPT" === T.tagName ? T.remove() : sanitizeElementByRemovingAttributes(T)
}
return r
},
leadingImageNode: function() {
const e = 250,
t = .5,
n = .9,
i = 3;
if (!this.article || !this.article.element)
return null;
for (var r = this.article.element, a = 0; i > a && r.parentNode; ++a) {
r = r.parentNode;
var l = r.getElementsByTagName("img")[0];
if (l && isElementVisible(l)) {
var o = cachedElementBoundingRect(l),
s = o.width >= window.innerWidth * n;
if (!s && o.height < e)
continue;
if (o.width < this._articleWidth * t)
continue;
var c = this.article.element.compareDocumentPosition(l);
if (!(c & Node.DOCUMENT_POSITION_PRECEDING) || c & Node.DOCUMENT_POSITION_CONTAINED_BY)
continue;
if (c = this.extraArticle ? this.extraArticle.element.compareDocumentPosition(l) : null, c && (!(c & Node.DOCUMENT_POSITION_PRECEDING) || c & Node.DOCUMENT_POSITION_CONTAINED_BY))
continue;
return l
}
}
return null
},
pageImageURLFromMetadata: function() {
var e = this.contentDocument,
t = e.querySelector("meta[property='og:image']");
return t || (t = e.querySelector("meta[property='twitter:image']")), t || (t = e.querySelector("meta[property='twitter:image:src']")), t && t.content ? t.content : null
},
mainImageNode: function() {
var e = this.leadingImageNode();
if (e)
return e;
if (this.article && this.article.element)
for (var t = this.article.element.querySelectorAll("img"), n = t.length, i = 0; n > i; ++i) {
var r = t[i],
a = r._cachedElementBoundingRect;
if (a || (a = r.getBoundingClientRect()), a.width >= MainImageMinimumWidthAndHeight && a.height >= MainImageMinimumWidthAndHeight)
return r
}
return null
},
schemaDotOrgMetadataObject: function() {
if (this._schemaDotOrgMetadataObject)
return this._schemaDotOrgMetadataObject;
var e = this.contentDocument.querySelectorAll("script[type='application/ld+json']"),
t = e.length;
try {
for (var n = 0; t > n; ++n) {
var i = e[n],
r = JSON.parse(i.textContent),
a = r["@context"];
if ("https://schema.org" === a || "http://schema.org" === a)
return this._schemaDotOrgMetadataObject = r, r
}
return null
} catch (l) {
return null
}
},
articleTitle: function() {
function e(e, t) {
var n = e ? t.indexOf(e) : -1;
return -1 !== n && (0 === n || n + e.length === t.length)
}
function t(e, t) {
return e.host === t.host && e.pathname === t.pathname && e.hash === t.hash
}
if (this.articleNode()) {
if (this._articleTitle)
return this._articleTitle;
const n = 500,
i = 20,
r = 8,
a = 1.1,
l = 1.25,
o = /header|title|headline|instapaper_title/i,
s = 1.5,
c = 1.8,
m = 1.5,
h = .6,
d = 3,
u = 1.5,
g = .8,
f = 9,
p = 1.5,
v = /byline|author/i;
var E = function(e, t) {
var n = this.contentFromUniqueMetadataSelector(e, t);
if (n) {
var i = this.articleTitleAndSiteNameFromTitleString(n);
i && (n = i.articleTitle)
}
return n
}.bind(this),
N = function() {
for (var e = this.articleNode(); e; e = e.parentElement)
if (elementIndicatesItIsASchemaDotOrgArticleContainer(e))
return e;
return null
}.bind(this)(),
S = N ? this.contentFromUniqueMetadataSelector(N, "meta[itemprop=headline]") : "",
y = N ? this.contentFromUniqueMetadataSelector(N, "meta[itemprop=alternativeHeadline]") : "",
T = this.contentDocument,
A = T.title,
b = E(T, "head meta[property='og:title']"),
C = this.contentFromUniqueMetadataSelector(T, "head meta[property='og:site_name']"),
x = E(T, "head meta[name='twitter:title']"),
D = E(T, "meta[name='sailthru.headline']"),
I = this.schemaDotOrgMetadataObject(),
R = I ? I.headline : null,
L = cachedElementBoundingRect(this.articleNode());
this.extraArticleNode() && this.extraArticle.isPrepended && (L = cachedElementBoundingRect(this.extraArticleNode()));
var M = L.left + L.width / 2,
B = L.top,
F = B;
if (this._articleWidth = L.width, this.leadingImage = this.leadingImageNode(), this.leadingImage) {
var O = cachedElementBoundingRect(this.leadingImage);
F = (O.top + B) / 2
}
var P = "h1, h2, h3, h4, h5, .headline, .article_title, .post-title, #hn-headline, .inside-head, .instapaper_title",
_ = this.article.element.tagName;
"DL" !== _ && "DD" !== _ || (P += ", dt");
var w = this.contentDocument.querySelectorAll(P);
w = Array.prototype.slice.call(w, 0);
const q = 2;
for (var k = T.location, W = this.article.element, U = 0; q > U; ++U)
W.parentElement && (W = W.parentElement);
for (var H = W.getElementsByTagName("a"), U = 0, V = H.length; V > U; ++U) {
var z = H[U];
if (z.offsetTop > this.articleNode().offsetTop + i)
break;
if (t(z, k) && "#" !== z.getAttribute("href")) {
w.push(z);
break
}
}
for (var G, j = w.map(trimmedInnerTextIgnoringTextTransform), Y = w.length, X = 0, K = [], J = [], Q = [], $ = [], Z = [], ee = [], te = [], U = 0; Y > U; ++U) {
var ne = w[U],
ie = j[U],
re = stringSimilarity(A, ie);
if (b) {
var ae = stringSimilarity(b, ie);
re += ae, ae > StringSimilarityToDeclareStringsNearlyIdentical && J.push(ne)
}
if (x) {
var le = stringSimilarity(x, ie);
re += le, le > StringSimilarityToDeclareStringsNearlyIdentical && Q.push(ne)
}
if (S) {
var oe = stringSimilarity(S, ie);
re += oe, oe > StringSimilarityToDeclareStringsNearlyIdentical && $.push(ne)
}
if (y) {
var se = stringSimilarity(y, ie);
re += se, se > StringSimilarityToDeclareStringsNearlyIdentical && Z.push(ne)
}
if (D) {
var ce = stringSimilarity(D, ie);
re += ce, ce > StringSimilarityToDeclareStringsNearlyIdentical && ee.push(ne)
}
if (R) {
var me = stringSimilarity(R, ie);
re += me, me > StringSimilarityToDeclareStringsNearlyIdentical && te.push(ne)
}
re === X ? K.push(ne) : re > X && (X = re, K = [ne])
}
if (1 === J.length ? (G = J[0], G.headerText = trimmedInnerTextIgnoringTextTransform(G)) : 1 === Q.length ? (G = Q[0], G.headerText = trimmedInnerTextIgnoringTextTransform(G)) : 1 === $.length ? (G = $[0], G.headerText = trimmedInnerTextIgnoringTextTransform(G)) : 1 === ee.length ? (G = ee[0], G.headerText = trimmedInnerTextIgnoringTextTransform(G)) : 1 === te.length && (G = te[0], G.headerText = trimmedInnerTextIgnoringTextTransform(G)), !G)
for (var U = 0; Y > U; ++U) {
var ne = w[U];
if (isElementVisible(ne)) {
var he = cachedElementBoundingRect(ne),
de = he.left + he.width / 2,
ue = he.top + he.height / 2,
ge = de - M,
fe = ue - F,
pe = -1 !== J.indexOf(ne),
ve = -1 !== Q.indexOf(ne),
Ee = ne.classList.contains("instapaper_title"),
Ne = /\bheadline\b/.test(ne.getAttribute("itemprop")),
Se = -1 !== $.indexOf(ne),
ye = -1 !== Z.indexOf(ne),
Te = -1 !== ee.indexOf(ne),
Ae = pe || ve || Ee || Ne || Se || ye || Te,
be = Math.sqrt(ge * ge + fe * fe),
Ce = Ae ? n : Math.max(n - be, 0),
ie = j[U],
xe = ne.getAttribute("property");
if (xe) {
var De = /dc.title/i.exec(xe);
if (De && De[0]) {
var Ie = this.contentDocument.querySelectorAll('*[property~="' + De[0] + '"]');
if (1 === Ie.length) {
G = ne, G.headerText = ie;
break
}
}
}
if (!v.test(ne.className)) {
if (!Ae) {
if (be > n)
continue;
if (de < L.left || de > L.right)
continue
}
if (A && stringsAreNearlyIdentical(ie, A))
Ce *= d;
else if (e(ie, A))
Ce *= u;
else if (ie.length < r)
continue;
if (ie !== C || !b) {
var Re = !1,
Le = nearestAncestorElementWithTagName(ne, "A");
if (Le || (Le = ne.querySelector("a")), Le) {
if ("author" === Le.getAttribute("rel"))
continue;
var Me = Le.host === k.host,
Be = Le.pathname === k.pathname;
if (Me && Be)
Ce *= m;
else {
if (Me && nearestAncestorElementWithTagName(ne, "LI"))
continue;
Ce *= h, Re = !0
}
}
var Fe = fontSizeFromComputedStyle(getComputedStyle(ne));
Re || (Ce *= Fe / BaseFontSize), Ce *= 1 + TitleCandidateDepthScoreMultiplier * elementDepth(ne);
var Oe = parseInt(this.contentTextStyle().fontSize);
parseInt(Fe) > Oe * a && (Ce *= l), (o.test(ne.className) || o.test(ne.getAttribute("id"))) && (Ce *= s);
var Pe = ne.parentElement;
Pe && (o.test(Pe.className) || o.test(Pe.getAttribute("id"))) && (Ce *= s), -1 !== K.indexOf(ne) && (Ce *= c);
for (var _e = this.article.element, we = ne; we && we !== _e; we = we.parentElement)
if (SidebarRegex.test(we.className)) {
Ce *= g;
break
}
(!G || Ce > G.headerScore) && (G = ne, G.headerScore = Ce, G.headerText = ie)
}
}
}
}
if (G && domDistance(G, this.articleNode(), 10) > f && parseInt(getComputedStyle(G).fontSize) < p * Oe && (G = null), G) {
this._articleTitleElement = G;
var qe = G.headerText.trim();
b && e(b, qe) ? this._articleTitle = b : A && e(A, qe) ? this._articleTitle = A : this._articleTitle = qe
}
return this._articleTitle || (b && e(b, A) ? this._articleTitle = b : this._articleTitle = A), this._articleTitle
}
},
contentFromUniqueMetadataSelector: function(e, t) {
var n = e.querySelectorAll(t);
if (1 !== n.length)
return null;
var i = n[0];
return i && 2 === i.attributes.length ? i.content : null
},
articleSubhead: function() {
function e(e) {
return elementIsAHeader(e) ? parseInt(/H(\d)?/.exec(e.tagName)[1]) : NaN
}
const t = /author|kicker/i,
n = /sub(head|title)|description|dec?k/i;
if (this._articleSubhead)
return this._articleSubhead;
var i = this.articleNode();
if (i) {
var r = this._articleTitleElement;
if (r) {
var a,
l = e(r),
o = cachedElementBoundingRect(r),
s = this.contentDocument.querySelector("meta[property='og:description']");
if (s)
a = s.content;
else {
var c = this.contentDocument.querySelector("meta[name=description]");
c && (a = c.content)
}
for (var m = [nextNonFloatingVisibleElementSibling(r), nextLeafElementForElement(r)], h = m.length, d = 0; h > d; ++d) {
var u = m[d];
if (u && u !== i) {
var g = u.className;
if (!t.test(g)) {
var f = !1;
if (elementIsAHeader(u))
if (isNaN(l))
f = !0;
else {
var p = e(u);
p - 1 === l && (f = !0)
}
if (!f && n.test(g) && (f = !0), !f && /\bdescription\b/.test(u.getAttribute("itemprop")) && (f = !0), !f && a && a === u.innerText && (f = !0), f || "summary" !== u.getAttribute("itemprop") || (f = !0), f) {
var v;
if ("META" === u.tagName) {
var E = u.getAttribute("content");
v = E ? E.trim() : "";
var N = u.nextElementSibling;
if (!N || trimmedInnerTextIgnoringTextTransform(N) !== v)
continue;
u = N
} else {
if (cachedElementBoundingRect(u).top < (o.bottom + o.top) / 2)
continue;
v = trimmedInnerTextIgnoringTextTransform(u).trim()
}
if (v.length) {
this._articleSubheadElement = u, this._articleSubhead = v;
break
}
}
}
}
}
return this._articleSubhead
}
}
},
adoptableMetadataBlock: function() {
function e(e) {
function t(e, i) {
if (e.nodeType === Node.TEXT_NODE)
return void (i === n.Left ? e.textContent = e.textContent.trimLeft() : i === n.Right ? e.textContent = e.textContent.trimRight() : e.textContent = e.textContent.trim());
if (e.nodeType === Node.ELEMENT_NODE) {
var r = e.childNodes,
a = r.length;
if (0 !== a) {
if (1 === a)
return void t(r[0], i);
i !== n.Right && t(r[0], n.Left), i !== n.Left && t(r[a - 1], n.Right)
}
}
}
const n = {
Left: 1,
Right: 2,
Both: 3
};
t(e)
}
this.updateArticleBylineAndDateElementsIfNecessary();
var t = this.articleBylineElement(),
n = this.articleDateElement();
if (!t && !n)
return null;
if (t && n) {
var i = t.compareDocumentPosition(n);
i & Node.DOCUMENT_POSITION_CONTAINS && (t = null), i & Node.DOCUMENT_POSITION_CONTAINED_BY && (n = null), t === n && (n = null)
}
var r,
a = this.contentDocument.createElement("div"),
l = !1,
o = !1;
if (t) {
var r = this.cleanArticleNode(t, t.cloneNode(!0), CleaningType.MetadataContent, !1);
e(r), r.innerText.trim() && (l = !0, r.classList.add("byline"))
}
if (n) {
var s = this.cleanArticleNode(n, n.cloneNode(!0), CleaningType.MetadataContent, !1);
e(s), s.innerText.trim() && (o = !0, s.classList.add("date"))
}
if (l && a.appendChild(r), l && o) {
var c = document.createElement("span");
c.classList.add("delimiter"), a.appendChild(c)
}
return o && a.appendChild(s), a
},
articleBylineElement: function() {
return this._articleBylineElement
},
findArticleBylineElement: function() {
var e = this.findArticleBylineElementWithoutRejection();
return e && ("FOOTER" === e.tagName || e.closest("figure")) ? null : e
},
findArticleBylineElementWithoutRejection: function() {
function e(e) {
for (var t = new Set, n = new Set, i = e.length, o = 0; i - 1 > o; ++o) {
var s = e[o],
c = e[o + 1];
if (isElementVisible(s) && isElementVisible(c)) {
var m = s.parentElement;
m === c.parentElement && (m.contains(l) || (n.add(s.parentElement), t.add(s), t.add(c)))
}
}
var h = new Set(e);
n.forEach(function(e) {
h.add(e)
}), t.forEach(function(e) {
h["delete"](e)
}), e = [], h.forEach(function(t) {
e.push(t)
});
var d,
u = null;
i = e.length;
for (var o = 0; i > o; ++o) {
var s = e[o];
if (isElementVisible(s)) {
var g = cachedElementBoundingRect(s),
f = g.left + g.width / 2,
p = g.top + g.height / 2,
v = r - f,
E = a - p,
N = Math.sqrt(v * v + E * E);
(!u || d > N) && (u = s, d = N)
}
}
return u
}
const t = "[itemprop='author'], a[rel='author']",
n = ".byline, .article-byline, .entry-meta, .author-name, .byline-dateline, [itemprop='author'], a[rel='author']";
var i,
r,
a,
l = this._articleSubheadElement || this._articleTitleElement;
if (l)
var i = l ? cachedElementBoundingRect(l) : null,
r = i.left + i.width / 2,
a = i.top + i.height / 2;
var o = this.contentFromUniqueMetadataSelector(this.contentDocument, "head meta[name=author]");
if (o || (o = this.contentFromUniqueMetadataSelector(this.contentDocument, "head meta[property=author]")), !o) {
var s = this.schemaDotOrgMetadataObject();
if (s) {
var c = s.author;
c && "object" == typeof c && (o = c.name)
}
}
var m = this.article.element,
h = m.querySelectorAll(n);
if (1 === h.length)
return h[0];
var d = l ? l.nextElementSibling : null;
if (d) {
if (d.matches(n) || d.innerText === o || (d = d.querySelector(n)), d) {
var u = d.querySelector("li");
if (u) {
var g = d.querySelector(n);
g && (d = g)
}
}
if (d)
return d
}
for (var f = this.contentDocument.getElementsByTagName("a"), p = 0, v = f.length; v > p; ++p) {
var E = f[p];
if (trimmedInnerTextIgnoringTextTransform(E) === o)
return E
}
var N = m.closest("article");
if (l && N) {
var S = N.querySelectorAll(t),
y = e(S);
if (y)
return y;
if (S = N.querySelectorAll(n), y = e(S))
return y
}
return null
},
articleDateElement: function() {
return this._articleDateElement
},
findArticleDateElement: function() {
function e(e) {
for (var t = e; t && t !== r; t = t.parentElement)
if (elementIsCommentBlock(t))
return !0;
return !1
}
function t(t) {
for (var n, i = null, r = t.length, a = 0; r > a; ++a) {
var l = t[a];
if (isElementVisible(l) && !e(l)) {
var c = cachedElementBoundingRect(l),
m = c.left + c.width / 2,
h = c.top + c.height / 2,
d = o - m,
u = s - h,
g = Math.sqrt(d * d + u * u);
(!i || n > g) && (i = l, n = g)
}
}
return i
}
const n = "time, .dateline, .entry-date";
var i = this._articleSubheadElement || this._articleTitleElement,
r = this.article.element,
a = i ? i.nextElementSibling : null;
if (a && (c = a.querySelectorAll(n), 1 === c.length && (a = c[0])), !a || a.matches(n) || a.querySelector(n) || (a = null), a && a.contains(r) && (a = null), a)
return a;
var l,
o,
s;
if (i)
var l = i ? cachedElementBoundingRect(i) : null,
o = l.left + l.width / 2,
s = l.top + l.height / 2;
var c = r.querySelectorAll(n);
if (c.length)
return t(c);
if (r = r.closest("article")) {
var c = r.querySelectorAll(n);
if (c.length)
return t(c)
}
return null
},
articleDateElementWithBylineElementHint: function(e) {
function t(e) {
return /date/.test(e.className) || /\bdatePublished\b/.test(e.getAttribute("itemprop"))
}
var n = e.nextElementSibling;
if (n && t(n))
return n;
var i = nextLeafElementForElement(e);
return i && t(i) ? i : null
},
updateArticleBylineAndDateElementsIfNecessary: function() {
this._didArticleBylineAndDateElementDetection || (this.updateArticleBylineAndDateElements(), this._didArticleBylineAndDateElementDetection = !0)
},
updateArticleBylineAndDateElements: function() {
var e = this.findArticleBylineElement(),
t = this.findArticleDateElement();
!t && e && (t = this.articleDateElementWithBylineElementHint(e)), this._articleDateElement = t, this._articleBylineElement = e
},
articleIsLTR: function() {
if (!this._articleIsLTR) {
var e = getComputedStyle(this.article.element);
this._articleIsLTR = e ? "ltr" === e.direction : !0
}
return this._articleIsLTR
},
findSuggestedCandidate: function() {
var e = this.suggestedRouteToArticle;
if (!e || !e.length)
return null;
var t,
n;
for (n = e.length - 1; n >= 0 && (!e[n].id || !(t = this.contentDocument.getElementById(e[n].id))); --n)
;
for (n++, t || (t = this.contentDocument); n < e.length;) {
for (var i = e[n], r = t.nodeType === Node.DOCUMENT_NODE ? t.documentElement : t.firstElementChild, a = 1; r && a < i.index; r = r.nextElementSibling)
this.shouldIgnoreInRouteComputation(r) || a++;
if (!r)
return null;
if (r.tagName !== i.tagName)
return null;
if (i.className && r.className !== i.className)
return null;
t = r, n++
}
return isElementVisible(t) ? new CandidateElement(t, this.contentDocument) : null
},
findArticleBySearchingAllElements: function(e) {
var t = this.findSuggestedCandidate(),
n = this.findCandidateElements();
if (!n || !n.length)
return t;
if (t && t.basicScore() >= ReaderMinimumScore)
return t;
for (var i = this.highestScoringCandidateFromCandidates(n), r = i.element; r !== this.contentDocument; r = r.parentNode)
if ("BLOCKQUOTE" === r.tagName) {
for (var a = r.parentNode, l = n.length, o = 0; l > o; ++o) {
var s = n[o];
if (s.element === a) {
i = s;
break
}
}
break
}
if (t && i.finalScore() < ReaderMinimumScore)
return t;
if (!e) {
if (i.shouldDisqualifyDueToScoreDensity())
return null;
if (i.shouldDisqualifyDueToHorizontalRuleDensity())
return null;
if (i.shouldDisqualifyDueToHeaderDensity())
return null;
if (i.shouldDisqualifyDueToSimilarElements(n))
return null
}
return i
},
findExtraArticle: function() {
if (!this.article)
return null;
for (var e = 0, t = this.article.element; 3 > e && t; ++e, t = t.parentNode) {
var n = this.findExtraArticleCandidateElements(t);
if (n && n.length)
for (var i, r = this.sortCandidateElementsInDescendingScoreOrder(n), a = 0; a < r.length && (i = r[a], i && i.basicScore()); a++)
if (!i.shouldDisqualifyDueToScoreDensity() && !i.shouldDisqualifyDueToHorizontalRuleDensity() && !(i.shouldDisqualifyDueToHeaderDensity() || cachedElementBoundingRect(i.element).height < PrependedArticleCandidateMinimumHeight && cachedElementBoundingRect(this.article.element).width !== cachedElementBoundingRect(i.element).width)) {
var l = contentTextStyleForNode(this.contentDocument, i.element);
if (l && l.fontFamily === this.contentTextStyle().fontFamily && l.fontSize === this.contentTextStyle().fontSize && i)
return i
}
}
return null
},
highestScoringCandidateFromCandidates: function(e) {
for (var t = 0, n = null, i = e.length, r = 0; i > r; ++r) {
var a = e[r],
l = a.basicScore();
l >= t && (t = l, n = a)
}
return n
},
sortCandidateElementsInDescendingScoreOrder: function(e) {
function t(e, t) {
return e.basicScore() !== t.basicScore() ? t.basicScore() - e.basicScore() : t.depth() - e.depth()
}
return e.sort(t)
},
findCandidateElements: function() {
const e = 1e3;
for (var t = Date.now() + e, n = this.contentDocument.getElementsByTagName("*"), i = n.length, r = [], a = 0; i > a; ++a) {
var l = n[a];
if (!CandidateTagNamesToIgnore[l.tagName]) {
var o = CandidateElement.candidateIfElementIsViable(l, this.contentDocument);
if (o && r.push(o), Date.now() > t) {
r = [];
break
}
}
}
for (var s = r.length, a = 0; s > a; ++a)
r[a].element.candidateElement = r[a];
for (var a = 0; s > a; ++a) {
var c = r[a];
if ("BLOCKQUOTE" === c.element.tagName) {
var m = c.element.parentElement.candidateElement;
m && m.addTextNodesFromCandidateElement(c)
}
}
for (var a = 0; s > a; ++a)
r[a].element.candidateElement = null;
return r
},
findExtraArticleCandidateElements: function(e) {
if (!this.article)
return [];
e || (e = this.article.element);
for (var t = "preceding-sibling::*/descendant-or-self::*", n = this.contentDocument.evaluate(t, e, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null), i = n.snapshotLength, r = [], a = 0; i > a; ++a) {
var l = n.snapshotItem(a);
if (!CandidateTagNamesToIgnore[l.tagName]) {
var o = CandidateElement.extraArticleCandidateIfElementIsViable(l, this.article, this.contentDocument, !0);
o && r.push(o)
}
}
t = "following-sibling::*/descendant-or-self::*", n = this.contentDocument.evaluate(t, e, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null), i = n.snapshotLength;
for (var a = 0; i > a; ++a) {
var l = n.snapshotItem(a);
if (!CandidateTagNamesToIgnore[l.tagName]) {
var o = CandidateElement.extraArticleCandidateIfElementIsViable(l, this.article, this.contentDocument, !1);
o && r.push(o)
}
}
return r
},
isGeneratedBy: function(e) {
var t = this.contentDocument.head ? this.contentDocument.head.querySelector("meta[name=generator]") : null;
if (!t)
return !1;
var n = t.content;
return n ? e.test(n) : !1
},
isMediaWikiPage: function() {
return this.isGeneratedBy(/^MediaWiki /)
},
isWordPressSite: function() {
return this.isGeneratedBy(/^WordPress/)
},
nextPageURLString: function() {
if (!this.article)
return null;
if (this.isMediaWikiPage())
return null;
var e,
t = 0,
n = this.article.element;
n.parentNode && "inline" === getComputedStyle(n).display && (n = n.parentNode);
for (var i = n, r = cachedElementBoundingRect(n).bottom + LinkMaxVerticalDistanceFromArticle; isElementNode(i) && cachedElementBoundingRect(i).bottom <= r;)
i = i.parentNode;
i === n || i !== this.contentDocument && !isElementNode(i) || (n = i);
var a = this.contentDocument.evaluate(LinkCandidateXPathQuery, n, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null),
l = a.snapshotLength;
if (this.pageNumber <= 2 && !this.prefixWithDateForNextPageURL) {
var o = this.contentDocument.location.pathname,
s = o.match(LinkDateRegex);
s && (s = s[0], this.prefixWithDateForNextPageURL = o.substring(0, o.indexOf(s) + s.length))
}
for (var c = 0; l > c; ++c) {
var m = a.snapshotItem(c),
h = this.scoreNextPageLinkCandidate(m);
h > t && (e = m, t = h)
}
return e ? e.href : null
},
scoreNextPageLinkCandidate: function(e) {
function t(e, t, n, i) {
t.substring(0, e.length) === e && (t = t.substring(e.length), e = "");
var r = t.lastInteger();
if (isNaN(r))
return !1;
var a = e ? e.lastInteger() : NaN;
return (isNaN(a) || a >= MaximumExactIntegralValue) && (a = i), r === a ? n.lastInteger() === a + 1 : r === a + 1
}
function n(e) {
for (var t = {}, n = e.substring(1).split("&"), i = n.length, r = 0; i > r; ++r) {
var a = n[r],
l = a.indexOf("=");
-1 === l ? t[a] = null : t[a.substring(0, l)] = a.substring(l + 1)
}
return t
}
var i = this.contentDocument.location;
if (e.host !== i.host)
return 0;
if (e.pathname === i.pathname && e.search === i.search)
return 0;
if (-1 !== e.toString().indexOf("#"))
return 0;
if (anchorLinksToAttachment(e) || anchorLinksToTagOrCategoryPage(e))
return 0;
if (!isElementVisible(e))
return 0;
var r = cachedElementBoundingRect(e),
a = this.articleBoundingRect(),
l = Math.max(0, Math.max(a.top - (r.top + r.height), r.top - (a.top + a.height)));
if (r.top < a.top)
return 0;
if (l > LinkMaxVerticalDistanceFromArticle)
return 0;
var o = Math.max(0, Math.max(a.left - (r.left + r.width), r.left - (a.left + a.width)));
if (o > 0)
return 0;
var s = i.pathname,
c = e.pathname;
if (this.prefixWithDateForNextPageURL) {
if (-1 === e.pathname.indexOf(this.prefixWithDateForNextPageURL))
return 0;
s = s.substring(this.prefixWithDateForNextPageURL.length), c = c.substring(this.prefixWithDateForNextPageURL.length)
}
var m = c.substring(1).split("/");
m[m.length - 1] || m.pop();
var h = m.length,
d = s.substring(1).split("/"),
u = !1;
d[d.length - 1] || (u = !0, d.pop());
var g = d.length;
if (g > h)
return 0;
for (var f = 0, p = 0, v = e.textContent, E = 0; h > E; ++E) {
var N = m[E],
S = g > E ? d[E] : "";
if (S !== N) {
if (g - 2 > E)
return 0;
if (N.length >= S.length) {
for (var y = 0; N[N.length - 1 - y] === S[S.length - 1 - y];)
y++;
y && (N = N.substring(0, N.length - y), S = S.substring(0, S.length - y));
var T = N.indexOf(S);
-1 !== T && (N = N.substring(T))
}
t(S, N, v, this.pageNumber) ? p = Math.pow(LinkNextOrdinalValueBase, E - h + 1) : f++
}
if (f > 1)
return 0
}
var A = !1;
if (e.search) {
linkParameters = n(e.search), referenceParameters = n(i.search);
for (var b in linkParameters) {
var C = linkParameters[b],
x = b in referenceParameters ? referenceParameters[b] : null;
if (x !== C)
if (null === x && (x = ""), null === C && (C = ""), C.length < x.length)
f++;
else if (t(x, C, v, this.pageNumber)) {
if (LinkURLSearchParameterKeyMatchRegex.test(b)) {
if (s.toLowerCase() !== c.toLowerCase())
return 0;
if (this.isWordPressSite() && u)
return 0;
A = !0
}
if (LinkURLBadSearchParameterKeyMatchRegex.test(b)) {
f++;
continue
}
p = Math.max(p, 1 / LinkNextOrdinalValueBase)
} else
f++
}
}
if (!p)
return 0;
if ((LinkURLPageSlashNumberMatchRegex.test(e.href) || LinkURLSlashDigitEndMatchRegex.test(e.href)) && (A = !0), !A && h === g && stringSimilarity(s, c) < LinkMinimumURLSimilarityRatio)
return 0;
if (LinkURLArchiveSlashDigitEndMatchRegex.test(e))
return 0;
var D = LinkMatchWeight * (Math.pow(LinkMismatchValueBase, -f) + p) + LinkVerticalDistanceFromArticleWeight * l / LinkMaxVerticalDistanceFromArticle;
A && (D += LinkURLSemanticMatchBonus), "LI" === e.parentNode.tagName && (D += LinkListItemBonus);
var v = e.innerText;
return LinkNextMatchRegEx.test(v) && (D += LinkNextMatchBonus), LinkPageMatchRegEx.test(v) && (D += LinkPageMatchBonus), LinkContinueMatchRegEx.test(v) && (D += LinkContinueMatchBonus), D
},
elementContainsEnoughTextOfSameStyle: function(e, t, n) {
const i = 110;
for (var r = "BODY" === e.tagName, a = r ? 2 : 3, l = getVisibleNonWhitespaceTextNodes(e, a, i, r, t), o = n / scoreMultiplierForElementTagNameAndAttributes(e) / languageScoreMultiplierForTextNodes(l), s = {}, c = l.length, m = 0; c > m; ++m) {
var h = l[m],
d = h.length,
u = h.parentElement,
g = window.getComputedStyle(u),
f = g.fontFamily + "|" + g.fontSize,
p = Math.pow(d, TextNodeLengthPower);
if (s[f]) {
if ((s[f] += p) > o)
break
} else
s[f] = p
}
for (var f in s)
if (s[f] > o)
return !0;
return !1
},
openGraphMetadataClaimsPageTypeIsArticle: function() {
if (!this._openGraphMetadataClaimsPageTypeIsArticle) {
var e = this.contentDocument.querySelector("head meta[property='og:type']");
this._openGraphMetadataClaimsPageTypeIsArticle = e && "article" === e.content
}
return this._openGraphMetadataClaimsPageTypeIsArticle
},
pointsToUseForHitTesting: function() {
const e = window.innerWidth,
t = e / 4,
n = e / 2,
i = 128,
r = 320;
var a = [[n, 800], [n, 600], [t, 800], [n, 400], [n - i, 1100], [r, 700], [3 * t, 800], [e - r, 700]];
return this.openGraphMetadataClaimsPageTypeIsArticle() && a.push([n - i, 1400]), a
},
findArticleByVisualExamination: function() {
for (var e = new Set, t = this.pointsToUseForHitTesting(), n = t.length, i = AppleDotComAndSubdomainsRegex.test(this.contentDocument.location.hostname.toLowerCase()) ? 7200 : 1800, r = 0; n > r; r++)
for (var a = t[r][0], l = t[r][1], o = elementAtPoint(a, l), s = o; s && !e.has(s); s = s.parentElement) {
if (VeryPositiveClassNameRegEx.test(s.className))
return new CandidateElement(s, this.contentDocument);
if (!CandidateTagNamesToIgnore[s.tagName]) {
var c = s.offsetWidth,
m = s.offsetHeight;
if (!c && !m) {
var h = cachedElementBoundingRect(s);
c = h.width, m = h.height
}
if (!(c < CandidateMinimumWidth || m < CandidateMinimumHeight || c * m < CandidateMinimumArea)) {
var d = this.elementContainsEnoughTextOfSameStyle(s, e, i);
if (e.add(s), d && !(CandidateElement.candidateElementAdjustedHeight(s) < CandidateMinimumHeight)) {
var u = new CandidateElement(s, this.contentDocument);
if (u.shouldDisqualifyDueToSimilarElements())
return null;
if (u.shouldDisqualifyDueToHorizontalRuleDensity())
return null;
if (u.shouldDisqualifyDueToHeaderDensity())
return null;
if (!u.shouldDisqualifyForDeepLinking())
return u
}
}
}
}
return null
},
findArticleFromMetadata: function(e) {
var t = document.querySelectorAll(SchemaDotOrgArticleContainerSelector);
if (1 === t.length) {
if (e === FindArticleMode.ExistenceOfElement)
return !0;
var n = t[0];
if (n.matches("article, *[itemprop=articleBody]"))
return new CandidateElement(n, this.contentDocument);
var i = n.querySelectorAll("article, *[itemprop=articleBody]"),
r = elementWithLargestAreaFromElements(i);
return r ? new CandidateElement(r, this.contentDocument) : new CandidateElement(n, this.contentDocument)
}
if (this.openGraphMetadataClaimsPageTypeIsArticle()) {
var a = this.contentDocument.querySelectorAll("main article"),
l = elementWithLargestAreaFromElements(a);
if (l)
return e === FindArticleMode.ExistenceOfElement ? !0 : new CandidateElement(l, this.contentDocument);
var o = this.contentDocument.querySelectorAll("article");
if (1 === o.length)
return e === FindArticleMode.ExistenceOfElement ? !0 : new CandidateElement(o[0], this.contentDocument)
}
return null
},
articleTextContent: function() {
return this._articleTextContent || this.adoptableArticle(), this._articleTextContent
},
pageDescription: function() {
for (var e = this.contentDocument.querySelectorAll("head meta[name]"), t = e.length, n = 0; t > n; ++n) {
var i = e[n];
if ("description" === i.getAttribute("name").toLowerCase()) {
var r = i.getAttribute("content");
if (r)
return r.trim()
}
}
return null
},
articleTitleAndSiteNameFromTitleString: function(e) {
const t = [" - ", " \u2013 ", " \u2014 ", ": ", " | ", " \xbb "],
n = t.length,
i = .6;
for (var r, a, l = this.contentDocument.location.host, o = l.replace(/^(www|m)\./, ""), s = o.replace(/\.(com|info|net|org|edu)$/, "").toLowerCase(), c = 0; n > c; ++c) {
var m = e.split(t[c]);
if (2 === m.length) {
var h = m[0].trim(),
d = m[1].trim(),
u = h.toLowerCase(),
g = d.toLowerCase(),
f = Math.max(stringSimilarity(u, o), stringSimilarity(u, s)),
p = Math.max(stringSimilarity(g, o), stringSimilarity(g, s)),
v = Math.max(f, p);
(!a || v > a) && (a = v, r = f > p ? {
siteName: h,
articleTitle: d
} : {
siteName: d,
articleTitle: h
})
}
}
return r && a >= i ? r : null
},
pageMetadata: function(e, t) {
var n,
i = this.pageDescription(),
r = !1;
this.adoptableArticle() ? (n = this.articleTitle(), i = i || this.articleTextContent(), r = !0) : (n = this.contentDocument.title, this.contentDocument.body && (i = i || this.contentDocument.body.innerText));
var a = "",
l = this.pageImageURLFromMetadata();
if (l)
a = l;
else {
var o = this.mainImageNode();
o && (a = o.src)
}
n || (n = userVisibleURLString(this.contentDocument.location.href)), n = n.trim(), e && (n = n.substring(0, e));
var s = this.contentFromUniqueMetadataSelector(this.contentDocument, "head meta[property='og:site_name']");
if (!s) {
var c = this.articleTitleAndSiteNameFromTitleString(this.contentDocument.title);
c && c.articleTitle === n && (s = c.siteName)
}
return s || (s = ""), i = i ? i.trim() : "", t && (i = i.substring(0, t)), i = i.replace(/[\s]+/g, " "), {
title: n,
previewText: i,
siteName: s,
mainImageURL: a,
isReaderAvailable: r
}
},
readingListItemInformation: function() {
const e = 220,
t = 220;
return this.pageMetadata(e, t)
}
};
var ReaderArticleFinderJS = new ReaderArticleFinder(document);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment