diff --git a/src/content_scripts/content_script.css b/src/content_scripts/content_script.css index 2a2be549..187ddb0f 100644 --- a/src/content_scripts/content_script.css +++ b/src/content_scripts/content_script.css @@ -46,7 +46,6 @@ display: flex; align-items: center; justify-content: center; - min-width: 150px; text-align: center; color: white; background: #b31b1b; diff --git a/src/content_scripts/content_script.js b/src/content_scripts/content_script.js index 0834c262..c5d98dd7 100644 --- a/src/content_scripts/content_script.js +++ b/src/content_scripts/content_script.js @@ -78,9 +78,7 @@ $.extend($.easing, { }, }); -var timeout = null; -var prevent = false; -var pdfTitleIters = 0; +var PDF_TITLE_ITERS = 0; /** * Centralizes HTML svg codes @@ -160,6 +158,34 @@ const svg = (name) => { } }; +const injectNotifCSS = () => { + let el = document.createElement("style"); + el.type = "text/css"; + el.innerText = ` + .pm-notif-loader { + width: 24px; + height: 24px; + border: 2px solid #FFF; + border-bottom-color: transparent; + border-radius: 50%; + display: inline-block; + box-sizing: border-box; + animation: rotation 1s linear infinite; + } + + @keyframes rotation { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } + } + `; + document.head.appendChild(el); + return el; +}; + const makePaperMemoryHTMLDiv = (paper) => { return paper.venue ? /*html*/ ` @@ -238,7 +264,7 @@ const handleDefaultAction = async () => { default: warn("Unknown action:", action); } - text && feedback(text); + text && feedback({ text }); }; /** Whether or not to ignore the current paper based on its `is` object @@ -366,94 +392,136 @@ const contentScriptMain = async ({ const paper = global.state.papers[id]; const maxWait = 60 * 1000; while (1) { - const waitTime = Math.min(maxWait, 250 * 2 ** pdfTitleIters); + const waitTime = Math.min(maxWait, 250 * 2 ** PDF_TITLE_ITERS); await sleep(waitTime); document.title = ""; document.title = paper.title; - pdfTitleIters++; + PDF_TITLE_ITERS++; } }; makeTitle(id); } }; +const makeNotif = () => { + if (global.notif.element) return; + const notif = /*html*/ `
`; + document.body.insertAdjacentHTML("beforeend", notif); + global.notif.element = $("#feedback-notif"); + style("feedback-notif", "padding", "0px"); +}; + +const hideNotif = () => + new Promise(async (resolve) => { + const end = ({ dontWait = false } = {}) => { + global.notif.prevent = false; + global.notif.isLoading = false; + setTimeout(resolve, dontWait ? 0 : 150); + }; + + if (!global.notif.element) { + warn("[PM][hideNotif] Notif element not found"); + end({ dontWait: true }); + return; + } + + global.notif.element.animate( + { right: "-200px", opacity: "0" }, + global.notif.hideSpeed, + "easeInOutBack", + end + ); + // sometimes animate does not call the callback + setTimeout(end, global.notif.hideSpeed + 50); + }); + +const setNotifContent = (text) => { + if (!global.notif.element) { + warn("[PM][setNotifContent] Notif element not found"); + return; + } + global.notif.element.html(text); +}; + +const showNotif = () => + new Promise((resolve) => { + if (!global.notif.element) { + console.warn("[PM][showNotif] Notif element not found"); + makeNotif(); + } + global.notif.element.animate( + { + right: "64px", + opacity: "1", + }, + global.notif.showSpeed, + "easeInOutBack", + resolve + ); + }); + /** * Slides a div in then out, bottom right, with some text to give the user * a feedback on some action performed * @param {string} text the text to display in the slider div * @returns {void} */ -const feedback = (text, paper = null) => { +const feedback = async ({ + text, + paper = null, + displayDuration = global.notif.displayDuration, + loading = false, +}) => { if (document.readyState === "loading") { - setTimeout(() => feedback(text, paper), 250); + setTimeout(() => feedback({ text, paper, displayDuration, loading }), 250); + return; + } + makeNotif(); + if (global.notif.prevent && !global.notif.isLoading) { + setTimeout(() => feedback({ text, paper, displayDuration, loading }), 100); return; } - const notifTime = 3000; try { - clearTimeout(timeout); - findEl({ element: "feedback-notif" }).remove(); - prevent = true; + clearTimeout(global.notif.timeout); + await hideNotif(); + global.notif.prevent = true; } catch (error) {} + let content = ""; + global.notif.isLoading = false; + if (paper) { - text = /*html*/ `
+ content = /*html*/ `
${text}
${svg("notif-cancel")}
`; + } else if (loading) { + global.notif.isLoading = true; + content = /*html*/ `
`; } else { - text = /*html*/ `
-
${text}
+ content = /*html*/ `
+
${text}
`; } - document.body.insertAdjacentHTML( - "beforeend", - /*html*/ `
${text}
` - ); - style("feedback-notif", "padding", "0px"); - $("#feedback-notif").animate( - { - right: "64px", - opacity: "1", - }, - 400, - "easeInOutBack" - ); - timeout = setTimeout(() => { - $("#feedback-notif").animate( - { right: "-200px", opacity: "0" }, - 400, - "easeInOutBack", - () => { - !prevent && $("#feedback-notif").remove(); - prevent = false; + + setNotifContent(content); + await showNotif(); + global.notif.timeout = setTimeout(hideNotif, displayDuration); + + paper && + addListener("notif-cancel", "click", async () => { + clearTimeout(global.notif.timeout); + await deletePaperInStorage(paper.id, global.state.papers); + if (!global.state.deleted) { + global.state.deleted = {}; } - ); - }, notifTime); - addListener("notif-cancel", "click", async () => { - clearTimeout(timeout); - await deletePaperInStorage(paper.id, global.state.papers); - if (!global.state.deleted) { - global.state.deleted = {}; - } - global.state.deleted[paper.id] = true; - setTimeout(() => { - delete global.state.deleted[paper.id]; - }, 30 * 1000); - timeout = setTimeout(() => { - $("#feedback-notif").animate( - { right: "-200px", opacity: "0" }, - 400, - "easeInOutBack", - () => { - !prevent && $("#feedback-notif").remove(); - prevent = false; - } - ); - }, notifTime); - setHTML("notif-text", "
Removed from memory
"); - }); + global.state.deleted[paper.id] = true; + setTimeout(() => delete global.state.deleted[paper.id], 30 * 1000); + global.notif.timeout = setTimeout(hideNotif, displayDuration); + setHTML("notif-text", "
Removed from memory
"); + }); }; /** @@ -694,7 +762,7 @@ const arxiv = async (checks) => { }); }); copyTextToClipboard(findEl({ element: "pm-bibtex-textarea" }).innerText); - feedback("Bibtex Citation Copied!"); + feedback({ text: "Bibtex Citation Copied!" }); }); addListener(querySelector("#markdown-header .copy-feedback"), "click", (e) => { $("#markdown-header .copy-feedback").fadeOut(200, () => { @@ -709,7 +777,7 @@ const arxiv = async (checks) => { copyTextToClipboard( findEl({ element: "markdown-link" }).innerText.replaceAll("\n", "") ); - feedback("Markdown Link Copied!"); + feedback({ text: "Markdown Link Copied!" }); }); } }; @@ -843,6 +911,7 @@ const tryArxivDisplay = async ({ // Promise resolved when the DOM is loaded const domReadyPromise = new Promise((resolve) => { document.addEventListener("DOMContentLoaded", () => { + injectNotifCSS(); resolve(); }); }); @@ -861,4 +930,5 @@ const tryArxivDisplay = async ({ }, 1000); } } + await hideNotif(); })(); diff --git a/src/shared/js/utils/config.js b/src/shared/js/utils/config.js index dff2f8ab..f1fac5ff 100644 --- a/src/shared/js/utils/config.js +++ b/src/shared/js/utils/config.js @@ -518,6 +518,16 @@ global.englishStopWords = new Set([ global.journalAbbreviations = null; +global.notif = { + timeout: null, + prevent: false, + showSpeed: 400, + displayDuration: 3000, + hideSpeed: 400, + element: null, + isLoading: false, +}; + // ---------------------------------------------------- // ----- TESTS: modules for node.js environment ----- // ---------------------------------------------------- diff --git a/src/shared/js/utils/functions.js b/src/shared/js/utils/functions.js index 19484888..b130fa80 100644 --- a/src/shared/js/utils/functions.js +++ b/src/shared/js/utils/functions.js @@ -8,10 +8,6 @@ const logTrace = typeof LOGTRACE !== "undefined" && LOGTRACE; * @returns {void} */ const log = (...args) => { - if (logTrace) { - const stack = new Error().stack; - args.push("\n\nLog trace:\n" + stack.split("\n").slice(2).join("\n")); - } let messageConfig = "%c%s "; let isInfo = false; @@ -35,6 +31,17 @@ const log = (...args) => { isDebug = true; args = args.slice(1); } + + if ( + (isError && logTrace >= 1) || + (isWarn && logTrace >= 2) || + (isInfo && logTrace >= 3) || + (isDebug && logTrace >= 4) || + logTrace >= 5 + ) { + const stack = new Error().stack; + args.push("\n\nLog trace:\n" + stack.split("\n").slice(2).join("\n")); + } // https://stackoverflow.com/questions/55643825/how-to-apply-colors-to-console-log-when-using-multiple-arguments args.forEach((argument) => { const type = typeof argument; @@ -984,7 +991,7 @@ const urlToWebsiteId = (url) => { * @param {number} time The time after which to resolve the promise * @returns {Promise} The wrapped promise */ -const silentPromiseTimeout = (prom, time = 5000) => { +const silentPromiseTimeout = (prom, time = 2000) => { // https://advancedweb.hu/how-to-add-timeout-to-a-promise-in-javascript/ let timer; return Promise.race([ diff --git a/src/shared/js/utils/logTrace.js b/src/shared/js/utils/logTrace.js index a811fa24..0abcf09e 100644 --- a/src/shared/js/utils/logTrace.js +++ b/src/shared/js/utils/logTrace.js @@ -1,5 +1,12 @@ // use in the log() function util -var LOGTRACE = false; +// 0 => no trace +// 1 => trace errors +// 2 => trace warnings +// 3 => trace info +// 4 => trace debug +// 5 => trace all +var LOGTRACE = 0; + if (typeof module !== "undefined" && module.exports != null) { var dummyModule = module; dummyModule.exports = { diff --git a/src/shared/js/utils/paper.js b/src/shared/js/utils/paper.js index 50c4da60..f9aea0a2 100644 --- a/src/shared/js/utils/paper.js +++ b/src/shared/js/utils/paper.js @@ -534,6 +534,7 @@ const addOrUpdatePaper = async ({ global.state.papers = (await getStorage("papers")) ?? {}; const id = await parseIdFromUrl(url, tab); const paperExists = global.state.papers.hasOwnProperty(id); + prefs && prefs.checkFeedback && feedback({ loading: true }); if ( id && @@ -620,7 +621,7 @@ const addOrUpdatePaper = async ({ if (!paper.codeLink || !paper.venue) { try { - const pwcMatch = await tryPWCMatch(paper); + const pwcMatch = await silentPromiseTimeout(tryPWCMatch(paper)); const pwcCodeLink = !paper.codeLink && pwcMatch?.codeLink; const pwcNote = pwcMatch?.note; @@ -690,11 +691,14 @@ const addOrUpdatePaper = async ({ "
(+ repo from PapersWithCode)
"; } - prefs && prefs.checkFeedback && store && feedback(notifText, paper); + prefs && + prefs.checkFeedback && + store && + feedback({ text: notifText, paper }); } else { // existing paper but new code repo notifText = "Found a code repository on PapersWithCode!"; - prefs && prefs.checkFeedback && store && feedback(notifText); + prefs && prefs.checkFeedback && store && feedback({ text: notifText }); } } else { store && logOk("Updated '" + paper.title + "' in your Memory"); diff --git a/src/shared/js/utils/parsers.js b/src/shared/js/utils/parsers.js index 0182b6cc..96879018 100644 --- a/src/shared/js/utils/parsers.js +++ b/src/shared/js/utils/parsers.js @@ -1550,6 +1550,10 @@ const findCellPii = async (url) => { const isPdfExtended = url.toLowerCase().includes("pdfextended"); let pii; if (isPdf || isPdfExtended) { + while (!global.state.cellJournalData) { + console.log("Waiting for cell journal data..."); + await sleep(5); + } const cellData = global.state.cellJournalData; pii = isPdf ? new URL(url).searchParams.get("pii") : url.split("/").last(); const issn = pii.match(/\d{4}-\d{3}[0-9X]/g)[0]; @@ -1877,7 +1881,7 @@ const tryPreprintMatch = async (paper, tryPwc = false) => { if (tryPwc) { const name = "PapersWithCode"; if (!matches.hasOwnProperty(name)) { - matches[name] = await matchPromises[name]; + matches[name] = await silentPromiseTimeout(matchPromises[name]); } if (matches[name].codeLink && !paper.codeLink) { code = matches[name].codeLink; diff --git a/src/shared/min/jquery.min.js b/src/shared/min/jquery.min.js index e002ec83..798cc8bf 100644 --- a/src/shared/min/jquery.min.js +++ b/src/shared/min/jquery.min.js @@ -1,3 +1,2 @@ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";function n(e,t,n){var r,i,o=(n=n||fe).createElement("script");if(o.text=e,t)for(r in pe)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function r(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?re[ie.call(e)]||"object":typeof e}function i(e){var t=!!e&&"length"in e&&e.length,n=r(e);return!le(e)&&!ce(e)&&("array"===n||0===t||"number"==typeof t&&0w.cacheLength&&delete t[e.shift()],t[n+" "]=r}}function r(e){return e[I]=!0,e}function i(e){var t=q.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=n.length;r--;)w.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function l(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&Ee(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function c(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function f(e){return e&&void 0!==e.getElementsByTagName&&e}function p(){}function d(e){for(var t=0,n=e.length,r="";t+~]|"+te+")"+te+"*"),le=new RegExp(te+"|>"),ce=new RegExp(ie),fe=new RegExp("^"+ne+"$"),pe={ID:new RegExp("^#("+ne+")"),CLASS:new RegExp("^\\.("+ne+")"),TAG:new RegExp("^("+ne+"|[*])"),ATTR:new RegExp("^"+re),PSEUDO:new RegExp("^"+ie),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+te+"*(even|odd|(([+-]|)(\\d*)n|)"+te+"*(?:([+-]|)"+te+"*(\\d+)|))"+te+"*\\)|)","i"),bool:new RegExp("^(?:"+ee+")$","i"),needsContext:new RegExp("^"+te+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+te+"*((?:-\\d)?\\d*)"+te+"*\\)|)(?=[^-]|$)","i")},de=/HTML$/i,he=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,ve=/^[^{]+\{\s*\[native \w/,ye=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,me=/[+~]/,xe=new RegExp("\\\\[\\da-fA-F]{1,6}"+te+"?|\\\\([^\\r\\n\\f])","g"),be=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},we=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,Te=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},Ce=function(){D()},Ee=h(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{J.apply(G=K.call(W.childNodes),W.childNodes),G[W.childNodes.length].nodeType}catch(x){J={apply:G.length?function(e,t){Q.apply(e,K.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}for(x in b=t.support={},C=t.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!de.test(t||n&&n.nodeName||"HTML")},D=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:W;return r!=q&&9===r.nodeType&&r.documentElement&&(L=(q=r).documentElement,H=!C(q),W!=q&&(n=q.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Ce,!1):n.attachEvent&&n.attachEvent("onunload",Ce)),b.scope=i(function(e){return L.appendChild(e).appendChild(q.createElement("div")),void 0!==e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),b.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),b.getElementsByTagName=i(function(e){return e.appendChild(q.createComment("")),!e.getElementsByTagName("*").length}),b.getElementsByClassName=ve.test(q.getElementsByClassName),b.getById=i(function(e){return L.appendChild(e).id=I,!q.getElementsByName||!q.getElementsByName(I).length}),b.getById?(w.filter.ID=function(e){var t=e.replace(xe,be);return function(e){return e.getAttribute("id")===t}},w.find.ID=function(e,t){if(void 0!==t.getElementById&&H){var n=t.getElementById(e);return n?[n]:[]}}):(w.filter.ID=function(e){var t=e.replace(xe,be);return function(e){var n=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},w.find.ID=function(e,t){if(void 0!==t.getElementById&&H){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];for(i=t.getElementsByName(e),r=0;o=i[r++];)if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),w.find.TAG=b.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):b.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},w.find.CLASS=b.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&H)return t.getElementsByClassName(e)},P=[],O=[],(b.qsa=ve.test(q.querySelectorAll))&&(i(function(e){var t;L.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&O.push("[*^$]="+te+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||O.push("\\["+te+"*(?:value|"+ee+")"),e.querySelectorAll("[id~="+I+"-]").length||O.push("~="),(t=q.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||O.push("\\["+te+"*name"+te+"*="+te+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||O.push(":checked"),e.querySelectorAll("a#"+I+"+*").length||O.push(".#.+[+~]"),e.querySelectorAll("\\\f"),O.push("[\\r\\n\\f]")}),i(function(e){e.innerHTML="";var t=q.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&O.push("name"+te+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&O.push(":enabled",":disabled"),L.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&O.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),O.push(",.*:")})),(b.matchesSelector=ve.test(R=L.matches||L.webkitMatchesSelector||L.mozMatchesSelector||L.oMatchesSelector||L.msMatchesSelector))&&i(function(e){b.disconnectedMatch=R.call(e,"*"),R.call(e,"[s!='']:x"),P.push("!=",ie)}),O=O.length&&new RegExp(O.join("|")),P=P.length&&new RegExp(P.join("|")),t=ve.test(L.compareDocumentPosition),M=t||ve.test(L.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},X=t?function(e,t){if(e===t)return j=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!b.sortDetached&&t.compareDocumentPosition(e)===n?e==q||e.ownerDocument==W&&M(W,e)?-1:t==q||t.ownerDocument==W&&M(W,t)?1:N?Z(N,e)-Z(N,t):0:4&n?-1:1)}:function(e,t){if(e===t)return j=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,s=[e],u=[t];if(!i||!o)return e==q?-1:t==q?1:i?-1:o?1:N?Z(N,e)-Z(N,t):0;if(i===o)return a(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;s[r]===u[r];)r++;return r?a(s[r],u[r]):s[r]==W?-1:u[r]==W?1:0}),q},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if(D(e),b.matchesSelector&&H&&!U[n+" "]&&(!P||!P.test(n))&&(!O||!O.test(n)))try{var r=R.call(e,n);if(r||b.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){U(n,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(xe,be),e[3]=(e[3]||e[4]||e[5]||"").replace(xe,be),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return pe.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&ce.test(n)&&(t=E(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(xe,be).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=$[e+" "];return t||(t=new RegExp("(^|"+te+")"+e+"("+te+"|$)"))&&$(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;he.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?he.find.matchesSelector(r,e)?[r]:[]:he.find.matches(e,he.grep(t,function(e){return 1===e.nodeType}))},he.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(he(e).filter(function(){for(t=0;t)[^>]*|#([\w-]+))$/;(he.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||be,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:we.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof he?t[0]:t,he.merge(this,he.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:fe,!0)),xe.test(r[1])&&he.isPlainObject(t))for(r in t)le(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=fe.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):le(e)?void 0!==n.ready?n.ready(e):e(he):he.makeArray(e,this)}).prototype=he.fn,be=he(fe);var Te=/^(?:parents|prev(?:Until|All))/,Ce={children:!0,contents:!0,next:!0,prev:!0};he.fn.extend({has:function(e){var t=he(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ve=/^$|^module$|\/(?:java|ecma)script/i;_e=fe.createDocumentFragment().appendChild(fe.createElement("div")),(ze=fe.createElement("input")).setAttribute("type","radio"),ze.setAttribute("checked","checked"),ze.setAttribute("name","t"),_e.appendChild(ze),ue.checkClone=_e.cloneNode(!0).cloneNode(!0).lastChild.checked,_e.innerHTML="",ue.noCloneChecked=!!_e.cloneNode(!0).lastChild.defaultValue,_e.innerHTML="",ue.option=!!_e.lastChild;var Ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};Ge.tbody=Ge.tfoot=Ge.colgroup=Ge.caption=Ge.thead,Ge.th=Ge.td,ue.option||(Ge.optgroup=Ge.option=[1,""]);var Ye=/<|&#?\w+;/,Qe=/^([^.]*)(?:\.(.+)|)/;he.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=qe.get(e);if(De(e))for(n.handler&&(n=(o=n).handler,i=o.selector),i&&he.find.matchesSelector(Ie,i),n.guid||(n.guid=he.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(t){return void 0!==he&&he.event.triggered!==t.type?he.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(Ee)||[""]).length;l--;)d=g=(s=Qe.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=he.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=he.event.special[d]||{},c=he.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&he.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),he.event.global[d]=!0)},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=qe.hasData(e)&&qe.get(e);if(v&&(u=v.events)){for(l=(t=(t||"").match(Ee)||[""]).length;l--;)if(d=g=(s=Qe.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){for(f=he.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;o--;)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||he.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)he.event.remove(e,d+t[l],n,r,!0);he.isEmptyObject(u)&&qe.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=he.event.fix(e),l=(qe.get(this,"events")||Object.create(null))[u.type]||[],c=he.event.special[u.type]||{};for(s[0]=u,t=1;t\s*$/g;he.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=We(e);if(!(ue.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||he.isXMLDoc(e)))for(a=m(c),r=0,i=(o=m(e)).length;r").attr(e.scriptAttrs||{}).prop({charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&i("error"===e.type?404:200,e.type)}),fe.head.appendChild(t[0])},abort:function(){n&&n()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;he.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||he.expando+"_"+St.guid++;return this[e]=!0,e}}),he.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,a,s=!1!==t.jsonp&&(Ut.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(t.data)&&"data");if(s||"jsonp"===t.dataTypes[0])return i=t.jsonpCallback=le(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(Ut,"$1"+i):!1!==t.jsonp&&(t.url+=(kt.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return a||he.error(i+" was not called"),a[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){a=arguments},r.always(function(){void 0===o?he(e).removeProp(i):e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,zt.push(i)),a&&le(o)&&o(a[0]),a=o=void 0}),"script"}),ue.createHTMLDocument=((_t=fe.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),he.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(ue.createHTMLDocument?((r=(t=fe.implementation.createHTMLDocument("")).createElement("base")).href=fe.location.href,t.head.appendChild(r)):t=fe),o=!n&&[],(i=xe.exec(e))?[t.createElement(i[1])]:(i=b([e],t,o),o&&o.length&&he(o).remove(),he.merge([],i.childNodes)));var r,i,o},he.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(he.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},he.expr.pseudos.animated=function(e){return he.grep(he.timers,function(t){return e===t.elem}).length},he.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=he.css(e,"position"),c=he(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=he.css(e,"top"),u=he.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),le(t)&&(t=t.call(e,n,he.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},he.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){he.offset.setOffset(this,e,t)});var t,n,r=this[0];return r?r.getClientRects().length?(t=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:t.top+n.pageYOffset,left:t.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===he.css(r,"position"))t=r.getBoundingClientRect();else{for(t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===he.css(e,"position");)e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=he(e).offset()).top+=he.css(e,"borderTopWidth",!0),i.left+=he.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-he.css(r,"marginTop",!0),left:t.left-i.left-he.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===he.css(e,"position");)e=e.offsetParent;return e||Ie})}}),he.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n="pageYOffset"===t;he.fn[e]=function(r){return Ae(this,function(e,r,i){var o;if(ce(e)?o=e:9===e.nodeType&&(o=e.defaultView),void 0===i)return o?o[t]:e[r];o?o.scrollTo(n?o.pageXOffset:i,n?i:o.pageYOffset):e[r]=i},e,r,arguments.length)}}),he.each(["top","left"],function(e,t){he.cssHooks[t]=H(ue.pixelPosition,function(e,n){if(n)return n=L(e,t),et.test(n)?he(e).position()[t]+"px":n})}),he.each({Height:"height",Width:"width"},function(e,t){he.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){he.fn[r]=function(i,o){var a=arguments.length&&(n||"boolean"!=typeof i),s=n||(!0===i||!0===o?"margin":"border");return Ae(this,function(t,n,i){var o;return ce(t)?0===r.indexOf("outer")?t["inner"+e]:t.document.documentElement["client"+e]:9===t.nodeType?(o=t.documentElement,Math.max(t.body["scroll"+e],o["scroll"+e],t.body["offset"+e],o["offset"+e],o["client"+e])):void 0===i?he.css(t,n,s):he.style(t,n,i,s)},t,a?i:void 0,a)}})}),he.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){he.fn[t]=function(e){return this.on(t,e)}}),he.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),he.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,t){he.fn[t]=function(e,n){return 0+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0{let t=0,a=0,r=!0;for(var i of e.slice(1,-1))if("{"===i&&t++,"}"===i&&a++,a>t){r=!1;break}return r?e.slice(1,-1):e},bibtexToObject=e=>{var t,a,r=new BibtexParser,e=(e=e.replaceAll(/,\s?(\w+)=(\w+)(\s?,?)/gi,", $1={$2}$3"),r.setInput(e),r.bibtex(),r.getEntries()[0]),i={...e.entryTags,entryType:e.entryType,citationKey:e.citationKey};for([t,a]of Object.entries(i))a.startsWith("{")&&a.endsWith("}")&&(i[t]=safeRemoveSurroundingBraces(a)),t===t.toUpperCase()&&(i[t.toLowerCase()]=i[t],delete i[t]);return i},bibtexToString=t=>{let a=`@${(t={...t=(t="string"==typeof t?bibtexToObject(t):t).hasOwnProperty("entryTags")?{...t.entryTags,entryType:t.entryType,citationKey:t.citationKey}:t}).entryType.toLowerCase()}{${t.citationKey}, +`,global.englishStopWords=new Set(["i","me","my","myself","we","our","ours","ourselves","you","your","yours","yourself","yourselves","he","him","his","himself","she","her","hers","herself","it","its","itself","they","them","their","theirs","themselves","what","which","who","whom","this","that","these","those","am","is","are","was","were","be","been","being","have","has","had","having","do","does","did","doing","a","an","the","and","but","if","or","because","as","until","while","of","at","by","for","with","about","against","between","into","through","during","before","after","above","below","to","from","up","down","in","out","on","off","over","under","again","further","then","once","here","there","when","where","why","how","all","any","both","each","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","s","t","can","will","just","don","should","now"]),global.journalAbbreviations=null,global.notif={timeout:null,prevent:!1,showSpeed:400,displayDuration:3e3,hideSpeed:400,element:null,isLoading:!1},"undefined"!=typeof module&&null!=module.exports&&((dummyModule=module).exports={state:global.state,descendingSortKeys:global.descendingSortKeys,svgActionsHoverTitles:global.svgActionsHoverTitles,select2Options:global.select2Options,prefsCheckNames:global.prefsCheckNames,prefsCheckDefaultFalse:global.prefsCheckDefaultFalse,prefsStorageKeys:global.prefsStorageKeys,sourceExtras:global.sourceExtras,preprintSources:global.preprintSources,knownPaperPages:global.knownPaperPages,overrideORConfs:global.overrideORConfs,overridePMLRConfs:global.overridePMLRConfs,overrideDBLPVenues:global.overrideDBLPVenues,consolHeaderStyle:global.consolHeaderStyle,storeReadme:global.storeReadme,englishStopWords:global.englishStopWords,journalAbbreviations:global.journalAbbreviations});let safeRemoveSurroundingBraces=e=>{let t=0,a=0,r=!0;for(var i of e.slice(1,-1))if("{"===i&&t++,"}"===i&&a++,a>t){r=!1;break}return r?e.slice(1,-1):e},bibtexToObject=e=>{var t,a,r=new BibtexParser,e=(e=e.replaceAll(/,\s?(\w+)=(\w+)(\s?,?)/gi,", $1={$2}$3"),r.setInput(e),r.bibtex(),r.getEntries()[0]),i={...e.entryTags,entryType:e.entryType,citationKey:e.citationKey};for([t,a]of Object.entries(i))a.startsWith("{")&&a.endsWith("}")&&(i[t]=safeRemoveSurroundingBraces(a)),t===t.toUpperCase()&&(i[t.toLowerCase()]=i[t],delete i[t]);return i},bibtexToString=t=>{let a=`@${(t={...t=(t="string"==typeof t?bibtexToObject(t):t).hasOwnProperty("entryTags")?{...t.entryTags,entryType:t.entryType,citationKey:t.citationKey}:t}).entryType.toLowerCase()}{${t.citationKey}, `;delete t.entryType,delete t.citationKey;var r,i,o=Math.max(...Object.keys(t).map(e=>e.length));for(r in t)if(t.hasOwnProperty(r)&&t[r]){let e=t[r].replaceAll(/\s+/g," ").trim();0<(e=e.startsWith("{")&&e.endsWith("}")?safeRemoveSurroundingBraces(e):e).length&&(i=r+" ".repeat(o-r.length),a+=` ${i} = {${e}}, -`)}return(a.slice(0,-2)+"\n}").replaceAll("\t"," ").replaceAll("--","-")},extractBibtexValue=(e,t)=>{e=bibtexToObject(e);return e.hasOwnProperty(t)?e[t]:""},extractAuthor=e=>extractBibtexValue(e,"author").replaceAll("{","").replaceAll("}","").replaceAll("\\","").split(" and ").map(e=>e.split(", ").reverse().join(" ")).join(" and "),logTrace=("undefined"!=typeof module&&null!=module.exports&&((dummyModule=module).exports={BibtexParser:BibtexParser,safeRemoveSurroundingBraces:safeRemoveSurroundingBraces,bibtexToObject:bibtexToObject,bibtexToString:bibtexToString,extractBibtexValue:extractBibtexValue,extractAuthor:extractAuthor}),"undefined"!=typeof LOGTRACE&&LOGTRACE),log=(...e)=>{var t;logTrace&&(t=(new Error).stack,e.push("\n\nLog trace:\n"+t.split("\n").slice(2).join("\n")));let a="%c%s ",r=!1,i=!1,o=!1,n=!1,s=!1;"[info]"===e[0]?(r=!0,e=e.slice(1)):"[warn]"===e[0]?(i=!0,e=e.slice(1)):"[error]"===e[0]?(o=!0,e=e.slice(1)):"[ok]"===e[0]?(s=!0,e=e.slice(1)):"[debug]"===e[0]&&(n=!0,e=e.slice(1)),e.forEach(e=>{switch(typeof e){case"bigint":case"number":a+="%d ";break;case"string":a+="%s ";break;default:a+="%o "}}),console.log(a,"color: "+(r?"#8BB4F7; font-weight:bold;":i?"#f3bd1e; font-weight:bold;":o?"#FF4F54; font-weight:bold;":s?"#23F62B; font-weight:bold;":n?"#BA357E; font-weight:bold;":"tan"),"[PM]",...e)},info=(...e)=>log("[info]",...e),warn=(...e)=>log("[warn]",...e),debug=(...e)=>log("[debug]",...e),logOk=(...e)=>log("[ok]",...e),logError=(...e)=>log("[error]",...e),consoleHeader=e=>console.groupCollapsed("%c"+e,global.consolHeaderStyle),getDisplayId=e=>{var t=e;return(e=e.split("_")[0].split(".")[0]).startsWith("OR-")||(e=e.split("-").slice(0,2).join("-")),global.state.papers.hasOwnProperty(t)&&("nature"===(t=global.state.papers[t]).source&&(t.note.match(/^Published\ @.+\(\d+\)$/)&&(e+="-"+t.note.split("@")[1].split("(")[0].trim().split(" ").map(e=>e[0].toUpperCase()).join("")),e.includes(t.year+"")||(e+="-"+t.year)),"acs"!==t.source||e.includes(t.year+"")||(e+="-"+t.year),"iop"!==t.source||e.includes(t.year+"")||(e+="-"+t.year)),e},isObject=e=>"object"==typeof e&&!Array.isArray(e)&&null!==e,isPdfUrl=e=>e.endsWith(".pdf")||e.endsWith("/pdf")||e.includes("openreview.net/pdf")||e.match(/\/e?pdf\//g)||e.includes("ieee.org/stamp/stamp.jsp?tp=&arnumber=")||e.includes("articlepdf");function delay(t,a){let r=0;return function(...e){clearTimeout(r),r=setTimeout(t.bind(this,...e),a||0)}}let cleanPapers=e=>{e={...e};return delete e.__dataVersion,e},firstNonStopLowercase=e=>{var e=e.toLowerCase().split(" ").map(miniHash),t=e.filter(e=>!global.englishStopWords.has(e));return(0(void 0===t&&(t=""),e.toLowerCase().replace(/\W/g,t)),fallbackCopyTextToClipboard=e=>{var t=document.createElement("textarea");t.value=e,t.style.top="0",t.style.left="0",t.style.position="fixed",document.body.appendChild(t),t.focus(),t.select();try{var a=document.execCommand("copy")?"successful":"unsuccessful";log("Fallback: Copying text command was "+a)}catch(e){console.error("Fallback: Oops, unable to copy",e)}document.body.removeChild(t)},copyTextToClipboard=e=>{navigator.clipboard?navigator.clipboard.writeText(e).then(()=>{log("Async: Copying to clipboard was successful!")},e=>{console.error("Async: Could not copy text: ",e)}):fallbackCopyTextToClipboard(e)};async function pasteRich(t,a){var e,r;"undefined"!=typeof ClipboardItem?(e=new Blob([t],{type:"text/html"}),r=new Blob([a],{type:"text/plain"}),e=new ClipboardItem({"text/html":e,"text/plain":r}),await navigator.clipboard.write([e])):(r=e=>{e.clipboardData.setData("text/html",t),e.clipboardData.setData("text/plain",a),e.preventDefault()},document.addEventListener("copy",r),document.execCommand("copy"),document.removeEventListener("copy",r))}let copyHyperLinkToClipboard=(e,t)=>{pasteRich(`${t}`,t+" "+e)},parseUrl=e=>{var t=document.createElement("a");return t.href=e,t},downloadTextFile=(e,t,a)=>{var r=document.createElement("a");"text/plain"===a?(e=e.replace(/\\n/g,"%0D%0A").replace(/"/g,""),r.download=t,r.href="data:text/plain,"+e):(e=new Blob([e],{type:a}),r.href=URL.createObjectURL(e),r.download=t),r.click()},dummyEvent=e=>({target:{closest:()=>({id:"memory-container--"+e})}}),eventId=e=>e.target.closest(".memory-container")?.id?.split("--")[1];async function downloadURI(e,a){a=a.replace(/[^\w\s]/gi,"");var e=await fetch(e).then(e=>e.blob()),t=new FileReader;t.readAsDataURL(e),t.onload=e=>{var e=e.target.result,t=document.createElement("a");t.download=a,t.href=e,document.body.appendChild(t),t.click(),document.body.removeChild(t)}}let downloadFile=(e,t)=>{var a;window.ActiveXObject?(window.ActiveXObject,document.execCommand&&((a=window.open(e,"_blank")).document.close(),a.document.execCommand("SaveAs",!0,t||e),a.close())):((a=document.createElement("a")).href=e,a.target="_blank",a.download=t,navigator.userAgent.toLowerCase().match(/(ipad|iphone|safari)/)&&navigator.userAgent.search("Chrome")<0?document.location=a.href:(e=new MouseEvent("click",{view:window,bubbles:!0,cancelable:!1}),a.dispatchEvent(e),(window.URL||window.webkitURL).revokeObjectURL(a.href)))},hashCode=e=>e.split("").reduce((e,t)=>(e=(e<<5)-e+t.charCodeAt(0))&e,0),parseCVFUrl=e=>{var t=e.replace("https://openaccess.thecvf.com/content","").slice(1).split("/")[0].split("_");let a,r;r=1===t.length?(a=t[0].slice(0,-4),t[0].slice(-4)):(a=t[0].toUpperCase(),t[1]);t=e.split("/").last().split(".")[0],e=(hashCode(t)+"").replace("-","").slice(0,8),t=`${a}-${r}_`+e;return{conf:a,year:r,id:t}},cleanBiorxivURL=e=>e=(e=e.replace(".full.pdf","")).match(/\d$/)?e:e.split(".").slice(0,-1).join("."),textareaFocusEnd=e=>{setTimeout(()=>{e.selectionStart=e.selectionEnd=1e4},0)},tablerSvg=(e,t,a)=>{switch(t=(t=void 0===t?"":t)&&`id="${t}"`,a=(a=(a=void 0===a?[]:a).filter(e=>e))&&`class="${a.join(" ")}"`,e){case"adjustments":return` +`)}return(a.slice(0,-2)+"\n}").replaceAll("\t"," ").replaceAll("--","-")},extractBibtexValue=(e,t)=>{e=bibtexToObject(e);return e.hasOwnProperty(t)?e[t]:""},extractAuthor=e=>extractBibtexValue(e,"author").replaceAll("{","").replaceAll("}","").replaceAll("\\","").split(" and ").map(e=>e.split(", ").reverse().join(" ")).join(" and "),logTrace=("undefined"!=typeof module&&null!=module.exports&&((dummyModule=module).exports={BibtexParser:BibtexParser,safeRemoveSurroundingBraces:safeRemoveSurroundingBraces,bibtexToObject:bibtexToObject,bibtexToString:bibtexToString,extractBibtexValue:extractBibtexValue,extractAuthor:extractAuthor}),"undefined"!=typeof LOGTRACE&&LOGTRACE),log=(...e)=>{let t="%c%s ",a=!1,r=!1,i=!1,o=!1,n=!1;var s;"[info]"===e[0]?(a=!0,e=e.slice(1)):"[warn]"===e[0]?(r=!0,e=e.slice(1)):"[error]"===e[0]?(i=!0,e=e.slice(1)):"[ok]"===e[0]?(n=!0,e=e.slice(1)):"[debug]"===e[0]&&(o=!0,e=e.slice(1)),(i&&1<=logTrace||r&&2<=logTrace||a&&3<=logTrace||o&&4<=logTrace||5<=logTrace)&&(s=(new Error).stack,e.push("\n\nLog trace:\n"+s.split("\n").slice(2).join("\n"))),e.forEach(e=>{switch(typeof e){case"bigint":case"number":t+="%d ";break;case"string":t+="%s ";break;default:t+="%o "}}),console.log(t,"color: "+(a?"#8BB4F7; font-weight:bold;":r?"#f3bd1e; font-weight:bold;":i?"#FF4F54; font-weight:bold;":n?"#23F62B; font-weight:bold;":o?"#BA357E; font-weight:bold;":"tan"),"[PM]",...e)},info=(...e)=>log("[info]",...e),warn=(...e)=>log("[warn]",...e),debug=(...e)=>log("[debug]",...e),logOk=(...e)=>log("[ok]",...e),logError=(...e)=>log("[error]",...e),consoleHeader=e=>console.groupCollapsed("%c"+e,global.consolHeaderStyle),getDisplayId=e=>{var t=e;return(e=e.split("_")[0].split(".")[0]).startsWith("OR-")||(e=e.split("-").slice(0,2).join("-")),global.state.papers.hasOwnProperty(t)&&("nature"===(t=global.state.papers[t]).source&&(t.note.match(/^Published\ @.+\(\d+\)$/)&&(e+="-"+t.note.split("@")[1].split("(")[0].trim().split(" ").map(e=>e[0].toUpperCase()).join("")),e.includes(t.year+"")||(e+="-"+t.year)),"acs"!==t.source||e.includes(t.year+"")||(e+="-"+t.year),"iop"!==t.source||e.includes(t.year+"")||(e+="-"+t.year)),e},isObject=e=>"object"==typeof e&&!Array.isArray(e)&&null!==e,isPdfUrl=e=>e.endsWith(".pdf")||e.endsWith("/pdf")||e.includes("openreview.net/pdf")||e.match(/\/e?pdf\//g)||e.includes("ieee.org/stamp/stamp.jsp?tp=&arnumber=")||e.includes("articlepdf");function delay(t,a){let r=0;return function(...e){clearTimeout(r),r=setTimeout(t.bind(this,...e),a||0)}}let cleanPapers=e=>{e={...e};return delete e.__dataVersion,e},firstNonStopLowercase=e=>{var e=e.toLowerCase().split(" ").map(miniHash),t=e.filter(e=>!global.englishStopWords.has(e));return(0(void 0===t&&(t=""),e.toLowerCase().replace(/\W/g,t)),fallbackCopyTextToClipboard=e=>{var t=document.createElement("textarea");t.value=e,t.style.top="0",t.style.left="0",t.style.position="fixed",document.body.appendChild(t),t.focus(),t.select();try{var a=document.execCommand("copy")?"successful":"unsuccessful";log("Fallback: Copying text command was "+a)}catch(e){console.error("Fallback: Oops, unable to copy",e)}document.body.removeChild(t)},copyTextToClipboard=e=>{navigator.clipboard?navigator.clipboard.writeText(e).then(()=>{log("Async: Copying to clipboard was successful!")},e=>{console.error("Async: Could not copy text: ",e)}):fallbackCopyTextToClipboard(e)};async function pasteRich(t,a){var e,r;"undefined"!=typeof ClipboardItem?(e=new Blob([t],{type:"text/html"}),r=new Blob([a],{type:"text/plain"}),e=new ClipboardItem({"text/html":e,"text/plain":r}),await navigator.clipboard.write([e])):(r=e=>{e.clipboardData.setData("text/html",t),e.clipboardData.setData("text/plain",a),e.preventDefault()},document.addEventListener("copy",r),document.execCommand("copy"),document.removeEventListener("copy",r))}let copyHyperLinkToClipboard=(e,t)=>{pasteRich(`${t}`,t+" "+e)},parseUrl=e=>{var t=document.createElement("a");return t.href=e,t},downloadTextFile=(e,t,a)=>{var r=document.createElement("a");"text/plain"===a?(e=e.replace(/\\n/g,"%0D%0A").replace(/"/g,""),r.download=t,r.href="data:text/plain,"+e):(e=new Blob([e],{type:a}),r.href=URL.createObjectURL(e),r.download=t),r.click()},dummyEvent=e=>({target:{closest:()=>({id:"memory-container--"+e})}}),eventId=e=>e.target.closest(".memory-container")?.id?.split("--")[1];async function downloadURI(e,a){a=a.replace(/[^\w\s]/gi,"");var e=await fetch(e).then(e=>e.blob()),t=new FileReader;t.readAsDataURL(e),t.onload=e=>{var e=e.target.result,t=document.createElement("a");t.download=a,t.href=e,document.body.appendChild(t),t.click(),document.body.removeChild(t)}}let downloadFile=(e,t)=>{var a;window.ActiveXObject?(window.ActiveXObject,document.execCommand&&((a=window.open(e,"_blank")).document.close(),a.document.execCommand("SaveAs",!0,t||e),a.close())):((a=document.createElement("a")).href=e,a.target="_blank",a.download=t,navigator.userAgent.toLowerCase().match(/(ipad|iphone|safari)/)&&navigator.userAgent.search("Chrome")<0?document.location=a.href:(e=new MouseEvent("click",{view:window,bubbles:!0,cancelable:!1}),a.dispatchEvent(e),(window.URL||window.webkitURL).revokeObjectURL(a.href)))},hashCode=e=>e.split("").reduce((e,t)=>(e=(e<<5)-e+t.charCodeAt(0))&e,0),parseCVFUrl=e=>{var t=e.replace("https://openaccess.thecvf.com/content","").slice(1).split("/")[0].split("_");let a,r;r=1===t.length?(a=t[0].slice(0,-4),t[0].slice(-4)):(a=t[0].toUpperCase(),t[1]);t=e.split("/").last().split(".")[0],e=(hashCode(t)+"").replace("-","").slice(0,8),t=`${a}-${r}_`+e;return{conf:a,year:r,id:t}},cleanBiorxivURL=e=>e=(e=e.replace(".full.pdf","")).match(/\d$/)?e:e.split(".").slice(0,-1).join("."),textareaFocusEnd=e=>{setTimeout(()=>{e.selectionStart=e.selectionEnd=1e4},0)},tablerSvg=(e,t,a)=>{switch(t=(t=void 0===t?"":t)&&`id="${t}"`,a=(a=(a=void 0===a?[]:a).filter(e=>e))&&`class="${a.join(" ")}"`,e){case"adjustments":return` @@ -134,14 +134,14 @@ - `;default:return""}},stringifyError=e=>{let t=chrome.runtime.id;return e.stack.split("\n").map(e=>e.split(" ").map(e=>e.split(t).last()).join(" ")).join("
")},arraysIdentical=(e,t)=>{var a=e.length;if(a!=t.length)return!1;for(;a--;)if(e[a]!==t[a])return!1;return!0},parseTags=e=>{e=Array.from(e.selectedOptions,e=>e.value.trim()).filter(e=>e);return e.sort(),e},getPaperEdits=(e,t)=>{let a,r,i,o;return o=t?(a=val("popup-form-note-textarea--"+e),i=val(document.getElementById("popup-form-note--"+e).querySelector(".form-code-input")),r=parseTags(findEl({element:"popup-item-tags--"+e})),findEl({element:"checkFavorite--"+e}).checked):(a=val(findEl({paperId:e,memoryItemClass:"form-note-textarea"})),i=val(findEl({paperId:e,memoryItemClass:"form-code-input"})),r=parseTags(findEl({paperId:e,memoryItemClass:"memory-item-tags"})),hasClass("memory-container--"+e,"favorite")),{note:a,tags:r,codeLink:i,favorite:o}},setFormChangeListener=(e,t)=>{let a,r,i,o;t?(a="#popup-item-tags--"+e.replace(".","\\."),i="popup-form-codeLink--"+e,r="popup-form-note-textarea--"+e,o="checkFavorite--"+e,$(a).on("change",delay(monitorPaperEdits(e,t),300)),addListener(i,"keyup",delay(monitorPaperEdits(e,t),300)),addListener(r,"keyup",delay(monitorPaperEdits(e,t),300)),addListener(o,"change",delay(monitorPaperEdits(e,t),300))):(a=".memory-item-tags",i=".form-code-input",r=".form-note-textarea",addEventToClass(i,"keyup",delay(monitorPaperEdits(void 0,t),300)),addEventToClass(r,"keyup",delay(monitorPaperEdits(void 0,t),300)))},monitorPaperEdits=(l,p)=>e=>{let t;t=void 0===l?eventId(e):l;var a=getPaperEdits(t,p),r=global.state.papers[t];let i=!1;for(var o in a){var n=r[o],s=(o,a[o]);"tags"===o?arraysIdentical(n,s)||(i=!0):n!==s&&(i=!0)}i&&(console.log("Updating meta data for",t),(p?handlePopupSaveEdits:handleMemorySaveEdits)(t))},cutAuthors=(e,t,a)=>{void 0===t&&(t=140),void 0===a&&(a=", ");let r="";var i,o,n=e.split(" and "),s=n[n.length-1];for([i,o]of n.entries()){if(!(5+r.length+a.length+o.length+s.length... "+s;break}o.includes(",")&&(o=o.split(",").map(e=>e.trim()).reverse().join(" ")),r?r+=", "+o:r=o}return r},sendMessageToBackground=e=>new Promise(t=>{chrome.runtime.sendMessage(e,e=>{t(e)})}),getStoredFiles=()=>new Promise(t=>{chrome.downloads.search({filenameRegex:"(PaperMemoryStore/)?.*.pdf"},e=>t(e.filter(e=>e.exists&&"complete"===e.state&&!e.filename.toLowerCase().includes("readme.txt"))))}),noParamUrl=e=>e.split("?")[0].split("#")[0],urlToWebsiteId=e=>{var t;return e.split("/").last().includes("#")&&(t=e.split("#").length-1,e=e.split("#").slice(0,t).join("#")),miniHash(e.replace("https://","").replace("http://","").replace("www.",""))},silentPromiseTimeout=(e,a=5e3)=>{let r;return Promise.race([e,new Promise((e,t)=>r=setTimeout(e,a))]).finally(()=>clearTimeout(r))},shouldWarn=async(e,t=()=>{})=>t(!1),spaceCamelCase=e=>e.replace(/([A-Z](?=[a-z]+)|[A-Z]+(?![a-z]))/g," $1").trim(),toSingleSpace=e=>e.replace(/\s\s+/g," "),dedent=e=>(""+e).replace(/(\n)\s+/g,"$1"),arxivIdFromPaperID=e=>e.split("-").last().replace("_","/"),cleanStr=e=>e.replace(/[^a-zA-Z0-9 ]/g,""),arxivIdFromURL=e=>e.includes("scirate.com/arxiv/")?e.split("scirate.com/arxiv/")[1].match(/\d+\.\d+/)[0]:e.match(/alphaxiv\.org\/(abs|pdf)\//)?e.split("alphaxiv.org/")[1].match(/\d+\.\d+/)[0]:e.includes("ar5iv.labs.arxiv.org/html/")?e.split("ar5iv.labs.arxiv.org/html/")[1].match(/\d+\.\d+/)[0]:e.includes("huggingface.co/papers/")?e.split("huggingface.co/papers/")[1].match(/\d+\.\d+/)[0]:noParamUrl(e).replace("/abs/","/pdf/").split("/pdf/")[1].replace(".pdf","").split("v")[0].replace("/","_"),getBrowserName=async()=>{let e=navigator.appName;var t=navigator.userAgent;return-1!=(verOffset=t.indexOf("OPR"))?e="Opera":navigator.brave&&await navigator.brave.isBrave()?e="Brave":-1!=(verOffset=t.indexOf("Edg"))?e="Microsoft Edge":-1!=(verOffset=t.indexOf("MSIE"))?e="Microsoft Internet Explorer":-1!=(verOffset=t.indexOf("Chrome"))?e="Chrome":-1!=(verOffset=t.indexOf("Safari"))?e="Safari":-1!=(verOffset=t.indexOf("Firefox"))&&(e="Firefox"),e};function getRandomToken(){for(var e=new Uint8Array(32),t=(crypto.getRandomValues(e),""),a=0;a{var t=await getStorage("syncPAT");if(!t&&(warn("No PAT found. Aborting and disabling sync."),await setStorage("syncState",!1),e))throw new Error("No PAT found.");return t},getIdentifier=async()=>{var e=await getBrowserName();let t=await getStorage("syncId");return t||(t=e+"-"+(t=getRandomToken()),info("No syncId found. Creating new one: ",t),await setStorage("syncId",t)),t},getGist=async r=>{let i=(r=r??{}).pat;var o=r.store??!0,r=r.patError??!0;try{i=i||await getPat(r);let t=await getStorage("syncTest")?"TestsPaperMemorySync":"DO_NO_EDIT__PaperMemorySyncV2.json",a="Automated PaperMemory sync Gist. Do not edit manually.",e=(await octokitRequest.defaults({headers:{authorization:"token "+i,"X-GitHub-Api-Version":"2022-11-28"}})("GET /gists")).data?.find(e=>e.description===a&&e.files[t]);if(!e){info("No Gist found. Creating new one...");var n=await getStorage("papers");if(!(e=await createGistWithFile({filename:t,pat:i,description:a,content:n})))return{ok:!1,payload:"wrongPAT"}}file=e.files[t];var s=e.id;return o&&await setStorage("syncPAT",i),{ok:!0,payload:{file:file,pat:i,gistId:s}}}catch(e){return console.log(e),warn("Because of the error ^ syncing is now disabled."),setStorage("syncState",!1),{ok:!1,payload:"wrongPAT",error:e}}},createGistWithFile=async({file:e,pat:t,content:a,description:r="Automated PaperMemory sync Gist. Do not edit manually."})=>{if(void 0===e)throw new Error("No file provided.");return"string"!=typeof a&&(a=JSON.stringify(a,null,"")),"string"==typeof e&&(e={filename:e}),t=t||await getPat(),(await octokitRequest.defaults({headers:{authorization:"token "+t,"X-GitHub-Api-Version":"2022-11-28"}})("POST /gists",{description:r,files:{[e.filename]:{content:a}},public:!1})).data},getDataForGistFile=async({file:t,pat:e,gistId:a})=>{"string"==typeof t&&(t={filename:t}),e=e||await getPat();var r,e=octokitRequest.defaults({headers:{authorization:"token "+e,"X-GitHub-Api-Version":"2022-11-28"}});let i;return i=a?(await e("GET /gists/"+a)).data:(await e("GET /gists")).data?.find(e=>e.files[t.filename]),(t=i.files[t.filename]).filename.endsWith(".json")?({data:a,status:r}=await fetchJSON(t.raw_url),a):fetchText(t.raw_url)},updateGistFile=async({file:e,content:t,gistId:a,pat:r})=>(r=r||await getPat(),"string"!=typeof t&&(t=JSON.stringify(t,null,"")),"string"==typeof e&&(e={filename:e}),octokitRequest.defaults({headers:{authorization:"token "+r,"X-GitHub-Api-Version":"2022-11-28"}})("PATCH /gists/"+a,{files:{[e.filename]:{content:t}}})),pushToRemote=async()=>sendMessageToBackground({type:"writeSync"}),pullFromRemote=async(e,t)=>{var a=Date.now(),r=await sendMessageToBackground({type:"pullSync"});return consoleHeader("PaperMemory Pull "+String.fromCodePoint("0x1F504")),log("Remote Papers pulled: ",r),r&&(await initState({isContentScript:t,papers:r??e,print:!1}),t=(Date.now()-a)/1e3,info(`Successfully pulled from Github (${t}s).`),await setStorage("papers",global.state.papers)),console.groupEnd(),r},shouldSync=async()=>!!await getStorage("syncState"),initSyncAndState=async({papers:e=null,isContentScript:t=!1,forceInit:a=!1,stateIsReady:r=()=>{},remoteIsReady:i=()=>{}}={})=>{global.state.dataVersion&&!a||await initState({papers:e,isContentScript:t}),r(),await shouldSync()&&(t||startSyncLoader(),await pullFromRemote(e,t)?t||(a=global.state.sortedPapers.length,setPlaceholder("memory-search",`Search ${a} entries...`),global.state.memoryIsOpen||window.location.href.includes("options.html")||await makeMemoryHTML(),successSyncLoader()):t||errorSyncLoader()),i()},startSyncLoader=async()=>{showId("sync-popup-feedback"),hideId("sync-popup-error"),hideId("sync-popup-synced"),showId("sync-popup-syncing","flex")},successSyncLoader=async()=>{showId("sync-popup-feedback"),hideId("sync-popup-syncing"),hideId("sync-popup-error"),showId("sync-popup-synced"),setTimeout(()=>{hideId("sync-popup-feedback")},2e3)},errorSyncLoader=async()=>{showId("sync-popup-feedback"),hideId("sync-popup-syncing"),hideId("sync-popup-synced"),showId("sync-popup-error"),setTimeout(()=>{hideId("sync-popup-feedback")},2e3)},deleteGist=async({gistId:e,pat:t})=>(t=t||await getPat(),octokitRequest.defaults({headers:{authorization:"token "+t,"X-GitHub-Api-Version":"2022-11-28"}})("DELETE /gists/"+e)),sleep=async t=>new Promise(e=>setTimeout(e,t)),measureCacheTime=async({maxTime:a=1e5})=>{var r=`PaperMemory-cache-test-${Math.random().toString(36).substring(7)}.json`,i={test:"test",data:{counter:0}},o=await createGistWithFile({file:r,content:i,description:"PaperMemory cache test. You *can* delete this."}),n=(console.log("Test gist: ",o),o.id);try{var s=o.files[r],l=(i.data.counter++,await updateGistFile({file:s,content:i,gistId:n})),p=(console.log("updateResp: ",l),Date.now());let e,t=0;for(;;){var c=await getDataForGistFile({file:s,gistId:n});if(console.log(""),console.log("data: ",c),e=(Date.now()-p)/1e3,console.log("Time: ",e,"at iteration: ",t),1===c.data.counter)break;if(await sleep(500),e>a)break;t++}e>a?warn("Cache time too long: > maxTime=",a,"ms"):info(`Cache time: ${e}s`)}catch(e){console.log(e)}finally{info("Deleting test gist..."),await deleteGist({gistId:n})}},migrateData=("undefined"!=typeof module&&null!=module.exports&&((dummyModule=module).exports={getPat:getPat,getIdentifier:getIdentifier,getGist:getGist,createGistWithFile:createGistWithFile,getDataForGistFile:getDataForGistFile,updateGistFile:updateGistFile,pushToRemote:pushToRemote,pullFromRemote:pullFromRemote,shouldSync:shouldSync,initSyncAndState:initSyncAndState,startSyncLoader:startSyncLoader,successSyncLoader:successSyncLoader,errorSyncLoader:errorSyncLoader,deleteGist:deleteGist,sleep:sleep,measureCacheTime:measureCacheTime}),async(a,r,e=!0)=>{if(void 0===a)return chrome.storage.local.set({papers:{__dataVersion:r}}),{papers:{__dataVersion:r},success:!0};var i,o,n,s,l,p,c,d,u=a.__dataVersion||-1,h=[];let f={...a};try{if(1e4<=u)return log("No migration needed"),{papers:a,success:!0};e&&backupData({...a}),delete a.__dataVersion;let t={};for(var m in a){if(t[m]=[],u<5&&(a[m].hasOwnProperty("bibtex")||(a[m].bibtex="",t[m].push("(m5) bibtex default")),a[m].pdfLink.endsWith(".pdf")||(a[m].pdfLink=a[m].pdfLink+".pdf",t[m].push("(m5) pdfLink to .pdf")),a[m].codeLink||(a[m].codeLink="",t[m].push("(m5) codeLink default")),a[m].source||(a[m].id.includes("NeurIPS")?(a[m].source="neurips",t[m].push("(m5) NeurIPS to neurips")):(a[m].source="arxiv",t[m].push("(m5) source default is arxiv")))),u<208&&("arxiv"!==a[m].source&&a[m].md.includes("https://arxiv.com/abs/")&&(a[m].md=`[${a[m].title}](${a[m].pdfLink})`,t[m].push("(m208) md from title and pdfLink")),"arxiv"!==a[m].source&&a[m].pdfLink.includes("arxiv.org/pdf/")&&(a[m].source="arxiv",t[m].push("(m208) set arxiv source from pdfLink")),m.match(/^\d/))&&"arxiv"===a[m].source&&(i="Arxiv-"+m,o={...a[m],id:i},a[i]=o,h.push(m),t[m].push("(m208) new arxiv id to Arxiv-")),u<209&&(a[m].hasOwnProperty("favorite")||(a[m].favorite=!1,a[m].favoriteDate="",t[m].push("(m209) favorite defaults"))),u<210&&("arxiv"===a[m].source&&(n=a[m].pdfLink.match(/v\d+\.pdf/gi))&&0{delete a[e],log("Deleting "+e)}),(f={...a}).__dataVersion=r,info("Migration summary:"),Object.keys(t).forEach(e=>{0{log("Migrated papers:"),log(f),log("Data version is now "+r)}),{papers:f,success:!0}}catch(e){return log(`Error migrating data from version ${u} to ${r}: `),log(e),{papers:f,success:!1,error:e}}}),logStorage=t=>{chrome.storage.local.get(t,e=>{log(e[t])})},getStorage=async a=>new Promise((t,e)=>{chrome.storage.local.get(a,e=>{t("string"==typeof a?e[a]:e)})}),setStorage=async(a,r,i=()=>{})=>new Promise((e,t)=>{chrome.storage.local.set({[a]:r},()=>{i(),e(!0)})}),deletePaperInStorage=async(e,t)=>{let a=!1;(t=t||(await getStorage("papers")??{})).hasOwnProperty(e)&&(updateDuplicatedUrls(null,e,!0),a=(a=delete global.state.titleHashToIds[miniHash(t[e].title)])&&delete t[e],delete global.state.papers[e]),a?(await setStorage("papers",t),global.state.papersList=Object.values(cleanPapers(global.state.papers)),sortMemory(),log("Successfully deleted paper",e)):log("Error: no deletion")},getTheme=async()=>await getStorage("checkDarkMode")?"dark":"light",backupData=async a=>{chrome.storage.local.get("papersBackup",({papersBackup:e})=>{var t;void 0===e&&(e={});for(t of Object.keys(e).map(e=>parseInt(e)).sort((e,t)=>e{log("Backed up data with version: "+a.__dataVersion)})})};function dateDiffInDays(e,t){e=Date.UTC(e.getFullYear(),e.getMonth(),e.getDate()),t=Date.UTC(t.getFullYear(),t.getMonth(),t.getDate());return Math.floor((t-e)/864e5)}let weeklyBackup=async()=>{var e=await getStorage("weeklyBackups")??{},t=new Date,a=Object.keys(e).map(e=>new Date(e)).sort((e,t)=>e.getTime()-t.getTime());if(0{let e=!1,t;var a,r=await getStorage("prefs")??{},i=((e=0===Object.keys(r).length?!0:e)&&(t=await getStorage(global.prefsStorageKeys)??{}),{});for(a of global.prefsCheckNames)i[a]=(t??r).hasOwnProperty(a)?(t??r)[a]:!(0<=global.prefsCheckDefaultFalse.indexOf(a));return i.checkOfficialRepos&&(setStorage("pwcPrefs",{official:!0}),delete i.checkOfficialRepos,setStorage("prefs",i)),e&&setStorage("prefs",i),i},getDefaultKeyboardAction=async()=>{var e=await getStorage("defaultKeyboardAction");return e||(await setStorage("defaultKeyboardAction","o"),"o")},setDefaultKeyboardAction=async e=>setStorage("defaultKeyboardAction",e),getManifestDataVersion=()=>chrome.runtime.getManifest().version.split(".").map((e,t)=>parseInt(e)*10**(4-2*t)).reduce((e,t)=>e+t),versionToSemantic=e=>(e=(e-=1e4*(major=parseInt(e/1e4,10)))-100*(minor=parseInt(e/100,10)),`${major}.${minor}.`+e),validatePaper=(t,e=!0)=>{var a,r,i,o={addDate:{type:"string",desc:"the paper's date of addition to the Memory",default:e=>(new Date).toJSON(),validation:e=>{try{new Date(e)}catch(e){return`Invalid addDate (could not parse as date: ${e})`}}},author:{type:"string",desc:"` and `-separated authors `${firstName} ${lastName}`",validation:e=>{if(!e)throw Error(`No author: ${e} for paper ${t.id}: + `;default:return""}},stringifyError=e=>{let t=chrome.runtime.id;return e.stack.split("\n").map(e=>e.split(" ").map(e=>e.split(t).last()).join(" ")).join("
")},arraysIdentical=(e,t)=>{var a=e.length;if(a!=t.length)return!1;for(;a--;)if(e[a]!==t[a])return!1;return!0},parseTags=e=>{e=Array.from(e.selectedOptions,e=>e.value.trim()).filter(e=>e);return e.sort(),e},getPaperEdits=(e,t)=>{let a,r,i,o;return o=t?(a=val("popup-form-note-textarea--"+e),i=val(document.getElementById("popup-form-note--"+e).querySelector(".form-code-input")),r=parseTags(findEl({element:"popup-item-tags--"+e})),findEl({element:"checkFavorite--"+e}).checked):(a=val(findEl({paperId:e,memoryItemClass:"form-note-textarea"})),i=val(findEl({paperId:e,memoryItemClass:"form-code-input"})),r=parseTags(findEl({paperId:e,memoryItemClass:"memory-item-tags"})),hasClass("memory-container--"+e,"favorite")),{note:a,tags:r,codeLink:i,favorite:o}},setFormChangeListener=(e,t)=>{let a,r,i,o;t?(a="#popup-item-tags--"+e.replace(".","\\."),i="popup-form-codeLink--"+e,r="popup-form-note-textarea--"+e,o="checkFavorite--"+e,$(a).on("change",delay(monitorPaperEdits(e,t),300)),addListener(i,"keyup",delay(monitorPaperEdits(e,t),300)),addListener(r,"keyup",delay(monitorPaperEdits(e,t),300)),addListener(o,"change",delay(monitorPaperEdits(e,t),300))):(a=".memory-item-tags",i=".form-code-input",r=".form-note-textarea",addEventToClass(i,"keyup",delay(monitorPaperEdits(void 0,t),300)),addEventToClass(r,"keyup",delay(monitorPaperEdits(void 0,t),300)))},monitorPaperEdits=(l,p)=>e=>{let t;t=void 0===l?eventId(e):l;var a=getPaperEdits(t,p),r=global.state.papers[t];let i=!1;for(var o in a){var n=r[o],s=(o,a[o]);"tags"===o?arraysIdentical(n,s)||(i=!0):n!==s&&(i=!0)}i&&(console.log("Updating meta data for",t),(p?handlePopupSaveEdits:handleMemorySaveEdits)(t))},cutAuthors=(e,t,a)=>{void 0===t&&(t=140),void 0===a&&(a=", ");let r="";var i,o,n=e.split(" and "),s=n[n.length-1];for([i,o]of n.entries()){if(!(5+r.length+a.length+o.length+s.length... "+s;break}o.includes(",")&&(o=o.split(",").map(e=>e.trim()).reverse().join(" ")),r?r+=", "+o:r=o}return r},sendMessageToBackground=e=>new Promise(t=>{chrome.runtime.sendMessage(e,e=>{t(e)})}),getStoredFiles=()=>new Promise(t=>{chrome.downloads.search({filenameRegex:"(PaperMemoryStore/)?.*.pdf"},e=>t(e.filter(e=>e.exists&&"complete"===e.state&&!e.filename.toLowerCase().includes("readme.txt"))))}),noParamUrl=e=>e.split("?")[0].split("#")[0],urlToWebsiteId=e=>{var t;return e.split("/").last().includes("#")&&(t=e.split("#").length-1,e=e.split("#").slice(0,t).join("#")),miniHash(e.replace("https://","").replace("http://","").replace("www.",""))},silentPromiseTimeout=(e,a=2e3)=>{let r;return Promise.race([e,new Promise((e,t)=>r=setTimeout(e,a))]).finally(()=>clearTimeout(r))},shouldWarn=async(e,t=()=>{})=>t(!1),spaceCamelCase=e=>e.replace(/([A-Z](?=[a-z]+)|[A-Z]+(?![a-z]))/g," $1").trim(),toSingleSpace=e=>e.replace(/\s\s+/g," "),dedent=e=>(""+e).replace(/(\n)\s+/g,"$1"),arxivIdFromPaperID=e=>e.split("-").last().replace("_","/"),cleanStr=e=>e.replace(/[^a-zA-Z0-9 ]/g,""),arxivIdFromURL=e=>e.includes("scirate.com/arxiv/")?e.split("scirate.com/arxiv/")[1].match(/\d+\.\d+/)[0]:e.match(/alphaxiv\.org\/(abs|pdf)\//)?e.split("alphaxiv.org/")[1].match(/\d+\.\d+/)[0]:e.includes("ar5iv.labs.arxiv.org/html/")?e.split("ar5iv.labs.arxiv.org/html/")[1].match(/\d+\.\d+/)[0]:e.includes("huggingface.co/papers/")?e.split("huggingface.co/papers/")[1].match(/\d+\.\d+/)[0]:noParamUrl(e).replace("/abs/","/pdf/").split("/pdf/")[1].replace(".pdf","").split("v")[0].replace("/","_"),getBrowserName=async()=>{let e=navigator.appName;var t=navigator.userAgent;return-1!=(verOffset=t.indexOf("OPR"))?e="Opera":navigator.brave&&await navigator.brave.isBrave()?e="Brave":-1!=(verOffset=t.indexOf("Edg"))?e="Microsoft Edge":-1!=(verOffset=t.indexOf("MSIE"))?e="Microsoft Internet Explorer":-1!=(verOffset=t.indexOf("Chrome"))?e="Chrome":-1!=(verOffset=t.indexOf("Safari"))?e="Safari":-1!=(verOffset=t.indexOf("Firefox"))&&(e="Firefox"),e};function getRandomToken(){for(var e=new Uint8Array(32),t=(crypto.getRandomValues(e),""),a=0;a{var t=await getStorage("syncPAT");if(!t&&(warn("No PAT found. Aborting and disabling sync."),await setStorage("syncState",!1),e))throw new Error("No PAT found.");return t},getIdentifier=async()=>{var e=await getBrowserName();let t=await getStorage("syncId");return t||(t=e+"-"+(t=getRandomToken()),info("No syncId found. Creating new one: ",t),await setStorage("syncId",t)),t},getGist=async r=>{let i=(r=r??{}).pat;var o=r.store??!0,r=r.patError??!0;try{i=i||await getPat(r);let t=await getStorage("syncTest")?"TestsPaperMemorySync":"DO_NO_EDIT__PaperMemorySyncV2.json",a="Automated PaperMemory sync Gist. Do not edit manually.",e=(await octokitRequest.defaults({headers:{authorization:"token "+i,"X-GitHub-Api-Version":"2022-11-28"}})("GET /gists")).data?.find(e=>e.description===a&&e.files[t]);if(!e){info("No Gist found. Creating new one...");var n=await getStorage("papers");if(!(e=await createGistWithFile({filename:t,pat:i,description:a,content:n})))return{ok:!1,payload:"wrongPAT"}}file=e.files[t];var s=e.id;return o&&await setStorage("syncPAT",i),{ok:!0,payload:{file:file,pat:i,gistId:s}}}catch(e){return console.log(e),warn("Because of the error ^ syncing is now disabled."),setStorage("syncState",!1),{ok:!1,payload:"wrongPAT",error:e}}},createGistWithFile=async({file:e,pat:t,content:a,description:r="Automated PaperMemory sync Gist. Do not edit manually."})=>{if(void 0===e)throw new Error("No file provided.");return"string"!=typeof a&&(a=JSON.stringify(a,null,"")),"string"==typeof e&&(e={filename:e}),t=t||await getPat(),(await octokitRequest.defaults({headers:{authorization:"token "+t,"X-GitHub-Api-Version":"2022-11-28"}})("POST /gists",{description:r,files:{[e.filename]:{content:a}},public:!1})).data},getDataForGistFile=async({file:t,pat:e,gistId:a})=>{"string"==typeof t&&(t={filename:t}),e=e||await getPat();var r,e=octokitRequest.defaults({headers:{authorization:"token "+e,"X-GitHub-Api-Version":"2022-11-28"}});let i;return i=a?(await e("GET /gists/"+a)).data:(await e("GET /gists")).data?.find(e=>e.files[t.filename]),(t=i.files[t.filename]).filename.endsWith(".json")?({data:a,status:r}=await fetchJSON(t.raw_url),a):fetchText(t.raw_url)},updateGistFile=async({file:e,content:t,gistId:a,pat:r})=>(r=r||await getPat(),"string"!=typeof t&&(t=JSON.stringify(t,null,"")),"string"==typeof e&&(e={filename:e}),octokitRequest.defaults({headers:{authorization:"token "+r,"X-GitHub-Api-Version":"2022-11-28"}})("PATCH /gists/"+a,{files:{[e.filename]:{content:t}}})),pushToRemote=async()=>sendMessageToBackground({type:"writeSync"}),pullFromRemote=async(e,t)=>{var a=Date.now(),r=await sendMessageToBackground({type:"pullSync"});return consoleHeader("PaperMemory Pull "+String.fromCodePoint("0x1F504")),log("Remote Papers pulled: ",r),r&&(await initState({isContentScript:t,papers:r??e,print:!1}),t=(Date.now()-a)/1e3,info(`Successfully pulled from Github (${t}s).`),await setStorage("papers",global.state.papers)),console.groupEnd(),r},shouldSync=async()=>!!await getStorage("syncState"),initSyncAndState=async({papers:e=null,isContentScript:t=!1,forceInit:a=!1,stateIsReady:r=()=>{},remoteIsReady:i=()=>{}}={})=>{global.state.dataVersion&&!a||await initState({papers:e,isContentScript:t}),r(),await shouldSync()&&(t||startSyncLoader(),await pullFromRemote(e,t)?t||(a=global.state.sortedPapers.length,setPlaceholder("memory-search",`Search ${a} entries...`),global.state.memoryIsOpen||window.location.href.includes("options.html")||await makeMemoryHTML(),successSyncLoader()):t||errorSyncLoader()),i()},startSyncLoader=async()=>{showId("sync-popup-feedback"),hideId("sync-popup-error"),hideId("sync-popup-synced"),showId("sync-popup-syncing","flex")},successSyncLoader=async()=>{showId("sync-popup-feedback"),hideId("sync-popup-syncing"),hideId("sync-popup-error"),showId("sync-popup-synced"),setTimeout(()=>{hideId("sync-popup-feedback")},2e3)},errorSyncLoader=async()=>{showId("sync-popup-feedback"),hideId("sync-popup-syncing"),hideId("sync-popup-synced"),showId("sync-popup-error"),setTimeout(()=>{hideId("sync-popup-feedback")},2e3)},deleteGist=async({gistId:e,pat:t})=>(t=t||await getPat(),octokitRequest.defaults({headers:{authorization:"token "+t,"X-GitHub-Api-Version":"2022-11-28"}})("DELETE /gists/"+e)),sleep=async t=>new Promise(e=>setTimeout(e,t)),measureCacheTime=async({maxTime:a=1e5})=>{var r=`PaperMemory-cache-test-${Math.random().toString(36).substring(7)}.json`,i={test:"test",data:{counter:0}},o=await createGistWithFile({file:r,content:i,description:"PaperMemory cache test. You *can* delete this."}),n=(console.log("Test gist: ",o),o.id);try{var s=o.files[r],l=(i.data.counter++,await updateGistFile({file:s,content:i,gistId:n})),p=(console.log("updateResp: ",l),Date.now());let e,t=0;for(;;){var c=await getDataForGistFile({file:s,gistId:n});if(console.log(""),console.log("data: ",c),e=(Date.now()-p)/1e3,console.log("Time: ",e,"at iteration: ",t),1===c.data.counter)break;if(await sleep(500),e>a)break;t++}e>a?warn("Cache time too long: > maxTime=",a,"ms"):info(`Cache time: ${e}s`)}catch(e){console.log(e)}finally{info("Deleting test gist..."),await deleteGist({gistId:n})}},migrateData=("undefined"!=typeof module&&null!=module.exports&&((dummyModule=module).exports={getPat:getPat,getIdentifier:getIdentifier,getGist:getGist,createGistWithFile:createGistWithFile,getDataForGistFile:getDataForGistFile,updateGistFile:updateGistFile,pushToRemote:pushToRemote,pullFromRemote:pullFromRemote,shouldSync:shouldSync,initSyncAndState:initSyncAndState,startSyncLoader:startSyncLoader,successSyncLoader:successSyncLoader,errorSyncLoader:errorSyncLoader,deleteGist:deleteGist,sleep:sleep,measureCacheTime:measureCacheTime}),async(a,r,e=!0)=>{if(void 0===a)return chrome.storage.local.set({papers:{__dataVersion:r}}),{papers:{__dataVersion:r},success:!0};var i,o,n,s,l,p,c,d,u=a.__dataVersion||-1,h=[];let f={...a};try{if(1e4<=u)return log("No migration needed"),{papers:a,success:!0};e&&backupData({...a}),delete a.__dataVersion;let t={};for(var m in a){if(t[m]=[],u<5&&(a[m].hasOwnProperty("bibtex")||(a[m].bibtex="",t[m].push("(m5) bibtex default")),a[m].pdfLink.endsWith(".pdf")||(a[m].pdfLink=a[m].pdfLink+".pdf",t[m].push("(m5) pdfLink to .pdf")),a[m].codeLink||(a[m].codeLink="",t[m].push("(m5) codeLink default")),a[m].source||(a[m].id.includes("NeurIPS")?(a[m].source="neurips",t[m].push("(m5) NeurIPS to neurips")):(a[m].source="arxiv",t[m].push("(m5) source default is arxiv")))),u<208&&("arxiv"!==a[m].source&&a[m].md.includes("https://arxiv.com/abs/")&&(a[m].md=`[${a[m].title}](${a[m].pdfLink})`,t[m].push("(m208) md from title and pdfLink")),"arxiv"!==a[m].source&&a[m].pdfLink.includes("arxiv.org/pdf/")&&(a[m].source="arxiv",t[m].push("(m208) set arxiv source from pdfLink")),m.match(/^\d/))&&"arxiv"===a[m].source&&(i="Arxiv-"+m,o={...a[m],id:i},a[i]=o,h.push(m),t[m].push("(m208) new arxiv id to Arxiv-")),u<209&&(a[m].hasOwnProperty("favorite")||(a[m].favorite=!1,a[m].favoriteDate="",t[m].push("(m209) favorite defaults"))),u<210&&("arxiv"===a[m].source&&(n=a[m].pdfLink.match(/v\d+\.pdf/gi))&&0{delete a[e],log("Deleting "+e)}),(f={...a}).__dataVersion=r,info("Migration summary:"),Object.keys(t).forEach(e=>{0{log("Migrated papers:"),log(f),log("Data version is now "+r)}),{papers:f,success:!0}}catch(e){return log(`Error migrating data from version ${u} to ${r}: `),log(e),{papers:f,success:!1,error:e}}}),logStorage=t=>{chrome.storage.local.get(t,e=>{log(e[t])})},getStorage=async a=>new Promise((t,e)=>{chrome.storage.local.get(a,e=>{t("string"==typeof a?e[a]:e)})}),setStorage=async(a,r,i=()=>{})=>new Promise((e,t)=>{chrome.storage.local.set({[a]:r},()=>{i(),e(!0)})}),deletePaperInStorage=async(e,t)=>{let a=!1;(t=t||(await getStorage("papers")??{})).hasOwnProperty(e)&&(updateDuplicatedUrls(null,e,!0),a=(a=delete global.state.titleHashToIds[miniHash(t[e].title)])&&delete t[e],delete global.state.papers[e]),a?(await setStorage("papers",t),global.state.papersList=Object.values(cleanPapers(global.state.papers)),sortMemory(),log("Successfully deleted paper",e)):log("Error: no deletion")},getTheme=async()=>await getStorage("checkDarkMode")?"dark":"light",backupData=async a=>{chrome.storage.local.get("papersBackup",({papersBackup:e})=>{var t;void 0===e&&(e={});for(t of Object.keys(e).map(e=>parseInt(e)).sort((e,t)=>e{log("Backed up data with version: "+a.__dataVersion)})})};function dateDiffInDays(e,t){e=Date.UTC(e.getFullYear(),e.getMonth(),e.getDate()),t=Date.UTC(t.getFullYear(),t.getMonth(),t.getDate());return Math.floor((t-e)/864e5)}let weeklyBackup=async()=>{var e=await getStorage("weeklyBackups")??{},t=new Date,a=Object.keys(e).map(e=>new Date(e)).sort((e,t)=>e.getTime()-t.getTime());if(0{let e=!1,t;var a,r=await getStorage("prefs")??{},i=((e=0===Object.keys(r).length?!0:e)&&(t=await getStorage(global.prefsStorageKeys)??{}),{});for(a of global.prefsCheckNames)i[a]=(t??r).hasOwnProperty(a)?(t??r)[a]:!(0<=global.prefsCheckDefaultFalse.indexOf(a));return i.checkOfficialRepos&&(setStorage("pwcPrefs",{official:!0}),delete i.checkOfficialRepos,setStorage("prefs",i)),e&&setStorage("prefs",i),i},getDefaultKeyboardAction=async()=>{var e=await getStorage("defaultKeyboardAction");return e||(await setStorage("defaultKeyboardAction","o"),"o")},setDefaultKeyboardAction=async e=>setStorage("defaultKeyboardAction",e),getManifestDataVersion=()=>chrome.runtime.getManifest().version.split(".").map((e,t)=>parseInt(e)*10**(4-2*t)).reduce((e,t)=>e+t),versionToSemantic=e=>(e=(e-=1e4*(major=parseInt(e/1e4,10)))-100*(minor=parseInt(e/100,10)),`${major}.${minor}.`+e),validatePaper=(t,e=!0)=>{var a,r,i,o={addDate:{type:"string",desc:"the paper's date of addition to the Memory",default:e=>(new Date).toJSON(),validation:e=>{try{new Date(e)}catch(e){return`Invalid addDate (could not parse as date: ${e})`}}},author:{type:"string",desc:"` and `-separated authors `${firstName} ${lastName}`",validation:e=>{if(!e)throw Error(`No author: ${e} for paper ${t.id}: ${JSON.stringify(t,null,2)} Fix the json file and try again. `)}},bibtex:{type:"string",desc:"BibTex citation with new lines (`\n`)",validation:t=>{try{bibtexToObject(t)}catch(e){return`Invalid BibTex: ${e} : `+t}}},code:{type:"object",desc:"the paper's code object as returned by the PapersWithCode API",default:e=>({})},codeLink:{type:"string",desc:"the paper's code link",default:e=>"",validation:t=>{try{parseUrl(t)}catch(e){return`Invalid codeLink (${t}): `+e}}},count:{type:"number",desc:"the paper's number of visits",default:e=>1,validation:e=>{if(e<0)return`Invalid count (${e}): must be >= 0`}},doi:{type:"string",desc:"the paper's doi",default:e=>bibtexToObject(e.bibtex).doi??""},extras:{type:"object",desc:"extra information about the paper which may be required per source",optional:!0},favorite:{type:"boolean",desc:"user wants to star the paper",default:e=>!1},favoriteDate:{type:"string",desc:"date the paper was added as a favorite",default:e=>""},id:{type:"string",desc:"Unique PaperMemory ID"},key:{type:"string",desc:"BibTex citation key",default:e=>"defaultKey_"+e.id},lastOpenDate:{type:"string",desc:"When the paper was last opened",default:e=>(new Date).toJSON()},md:{type:"string",desc:"markdown-formatted string `[${title}](${pdfLink})`",default:e=>`[${e.title}](${e.pdfLink})`},note:{type:"string",desc:"the user's note for this paper",default:e=>""},pdfLink:{type:"string",desc:"the link to the paper's pdf"},source:{type:"string",desc:"the paper's source i.e. where it was added to the memory from",validation:e=>{if(Object.keys(global.knownPaperPages).indexOf(e)<0)return"Unknown source "+e}},tags:{type:"array[string]",desc:"the user's tags for this paper",default:e=>[]},title:{type:"string",desc:"the paper's title",validation:e=>{if(!e)throw Error(`No title: ${e} for paper ${t.id}: ${JSON.stringify(t,null,2)} Fix the json file and try again. -`)}},venue:{type:"string",desc:"the paper's publication venue",default:e=>""},year:{type:"string",desc:"year of publication",validation:e=>{if(!/^\d{4}$/.test(e))return`Invalid year (${e}): must be 4 digits exactly`}}},n={};for(a in o)if(n[a]||(n[a]=[]),t.hasOwnProperty(a)){var s,l=o[a].type,p=typeof t[a];l.includes("array")||"object"===l?l.includes("array")?Array.isArray(t[a])?(c=l.split("[")[1].replace("]",""),0{let t=!0,a="",r="",i;try{e.__dataVersion||(e.__dataVersion=1);var o,n,s=await migrateData(e,getManifestDataVersion(),!1);if(!s.success)return r="Could not migrate the data before storing it",s.error&&(r+=":
"+stringifyError(s.error)),{success:!1,message:r};for(o in i=s.papers)o.startsWith("__")||(paperWarnings=validatePaper(i[o]).warnings)&&0"+Object.entries(paperWarnings).map((e,t)=>`
${e}
`+t.join("
")).join("
"));a&&(n=await getStorage("papers")??{},setStorage("uploadBackup",n)),t=!1}catch(e){log("prepareOverwriteData error",e),r='
/!\\ OverwriteMemoryError:

'+stringifyError(e),t=!0}return{success:!t,message:r,warning:a,papersToWrite:i}},makeVenue=async e=>{let t="";switch((t=e.note&&e.note.match(/(accepted|published)\ @\ .+\(?\d{4}\)?/i)?e.note.split("@")[1].trim().replace(/\(?\d{4}\)?/,"").split("--")[0].trim():t)&&"neurips"===t.toLowerCase()&&(t="NeurIPS"),e.source){case"arxiv":break;case"neurips":t="NeurIPS";break;case"cvf":t=t||(await makeCVFPaper(e.pdfLink)).venue;break;case"openreview":t=t||(await makeOpenReviewPaper(e.pdfLink)).venue;break;case"biorxiv":break;case"pmlr":t=e.conf?.split(/\d{4}/)[0]??"";break;case"acl":t=e.conf??"";break;case"pnas":t="PNAS";break;case"nature":t=t||e.venue;break;case"iop":case"acs":t=e.venue}return t},makeTitleHashToIdList=e=>{var t,a,r={};for([t,a]of Object.entries(cleanPapers(e))){var i=miniHash(a.title);r.hasOwnProperty(i)||(r[i]=[]),r[i].push(t)}return r},isPaper=("undefined"!=typeof module&&null!=module.exports&&((dummyModule=module).exports={migrateData:migrateData,logStorage:logStorage,getStorage:getStorage,setStorage:setStorage,deletePaperInStorage:deletePaperInStorage,getTheme:getTheme,backupData:backupData,weeklyBackup:weeklyBackup,getPrefs:getPrefs,getManifestDataVersion:getManifestDataVersion,versionToSemantic:versionToSemantic,validatePaper:validatePaper,prepareOverwriteData:prepareOverwriteData,makeVenue:makeVenue,makeTitleHashToIdList:makeTitleHashToIdList}),async(e,t=!1)=>{var a={};if(e){for(var r in global.knownPaperPages){var i,o=global.knownPaperPages[r].patterns;a[r]=!1;for(i of o)if("string"==typeof i?e.includes(i)&&(a[r]=!0):"function"==typeof i&&(a[r]=i(e)),a[r])break}a.localFile=isKnownLocalFile(e),a.stored=!t&&(await findLocalFile(e)??!1),a.parsedWebsite=global.state.papers["Website_"+urlToWebsiteId(e)]??!1}return a}),isSourceURL=async(e,t)=>Object.values(await isPaper(e,t)).some(e=>e),paperToAbs=e=>{let t,a,r;var i=e.pdfLink;let o,n="";switch(e.source){case"arxiv":n=i.replace("/pdf/","/abs/").replace(".pdf","");break;case"neurips":n=i.replace("/file/","/hash/").replace("-Paper.pdf","-Abstract.html");break;case"cvf":n=i.replace("/papers/","/html/").replace(".pdf",".html");break;case"openreview":n=i.replace("/pdf?","/forum?");break;case"biorxiv":n=i.replace(".full.pdf","");break;case"pmlr":n=i.split("/").slice(0,-1).join("/")+".html";break;case"acl":n=i.replace(".pdf","");break;case"pnas":n=i.replace(".full.pdf","").replace("/doi/pdf/","/doi/full/");break;case"nature":n=i.replace(".pdf","");break;case"acs":n=i.replace("pubs.acs.org/doi/pdf/","pubs.acs.org/doi/").split("?")[0];break;case"iop":n=i.split("#")[0].replace(/\/pdf$/,"");break;case"jmlr":n=i.split("/").slice(0,-1).join("/").replace("/papers/volume","/papers/v")+".html";break;case"pmc":var s=i.match(/PMC\d+/)[0];n=i.split(s)[0]+s;break;case"ijcai":var s=i.replace(".pdf","").split("/").last().match(/[1-9]\d*/),l=i.match(/proceedings\/\d+/gi)[0].split("/")[1];n=`https://www.ijcai.org/proceedings/${l}/`+s;break;case"acm":n=i.replace("/doi/pdf/","/doi/");break;case"ieee":n="https://ieeexplore.ieee.org/document/"+e.key;break;case"springer":n=e.extra.url;break;case"aps":[t,a]=parseUrl(i).pathname.split("/").slice(1,3),n=i.replace(`/${t}/${a}/`,`/${t}/abstract/`);break;case"wiley":n=i.replace(/\/doi\/e?pdf\//g,"/doi/abs/");break;case"sciencedirect":o=i.split("/pii/")[1].split("/")[0].split("#")[0].split("?")[0],n="https://www.sciencedirect.com/science/article/pii/"+o;break;case"science":(r=i.split("/doi/")[1]).startsWith("10.")||(r=r.split("/").slice(1).join("/")),n="https://science.org/doi/full/"+r;break;case"frontiers":n=i.replace(/\/pdf$/,"/full");break;case"ihep":n="https://inspirehep.net/literature/"+e.id.split("-")[1];break;case"plos":n=i.replace("/article/file?","/article?").split("&")[0];break;case"rsc":n=i.replace("/articlepdf/","/articlelanding/");break;case"website":n=e.pdfLink;break;case"mdpi":n=e.pdfLink.split("/pdf")[0];break;case"oup":n="https://doi.org/"+e.doi;break;case"hal":n=i.split("/file/")[0].split("/document")[0];break;case"chemrxiv":n="https://chemrxiv.org/engage/chemrxiv/article-details/"+i.split("/item/")[1].split("/")[0];break;case"cell":const t=e.id.split("_")[0].split("fulltext")[0];o=new URL(i).searchParams.get("pii"),n=`https://www.cell.com/${t}/fulltext/`+o;break;default:n="https://xkcd.com/1969/"}return n.replace("http://","https://")},paperToPDF=e=>{let t=e.pdfLink;switch(e.source){case"arxiv":t=t.replace("arxiv.org/abs/","arxiv.org/pdf/").replace(/\.pdf$/,"").replace(/v\d+$/gi,""),t+=".pdf";break;case"neurips":t=t.replace("/hash/","/file/").replace("-Abstract.html","-Paper.pdf");break;case"cvf":t=t.replace("/html/","/papers/").replace(".html",".pdf");break;case"openreview":t=t.replace("/forum?","/pdf?");break;case"biorxiv":t=cleanBiorxivURL(t)+".full.pdf";break;case"pmlr":case"acl":case"pnas":break;case"nature":t.endsWith(".pdf")||(t+=".pdf");break;case"iop":t.endsWith("/pdf")||(t+="/pdf");break;case"acs":case"jmlr":case"pmc":case"ijcai":case"acm":case"ieee":case"springer":case"aps":case"wiley":case"sciencedirect":case"science":case"frontiers":case"ihep":case"plos":case"rsc":case"mdpi":case"oup":case"hal":case"chemrxiv":case"website":case"cell":break;default:t="https://xkcd.com/1969/"}return t.replace("http://","https://")},findLocalFile=async t=>{if("string"==typeof t){let e;try{e=await parseIdFromUrl(t)}catch(e){return new Promise(e=>e(null))}if(!global.state.papers.hasOwnProperty(e))return new Promise(e=>e(null));paper=global.state.papers[e]}else paper=t;t=await getStoredFiles(),t=await matchPapersToFiles({[paper.id]:paper},t),t=Object.values(t);return 1===t.length?t[0]:null},matchPapersToFiles=async(e,t)=>{var a,r=Object.fromEntries(Object.values(e).map(e=>[e.id,miniHash(e.title)])),i=(t=t.filter(e=>e.exists&&"complete"===e.state&&!e.filename.toLowerCase().includes("readme.txt")),Object.fromEntries(t.map(e=>[e.id,miniHash(e.filename)]))),o={};for(a of t){let t;try{(t=await parseIdFromUrl(a.finalUrl))&&e.hasOwnProperty(t)&&(o[t]=a)}catch(e){t=null}if(!t){let t=i[a.id];var n=Object.entries(r).find(([,e])=>t.includes(e));n&&(o[n[0]]=a)}}return o},matchAllFilesToPapers=()=>new Promise((t,e)=>{chrome.downloads.search({filenameRegex:"PaperMemoryStore/.*"},async e=>{e=await matchPapersToFiles(cleanPapers(global.state.papers),e);t(e)})}),mergePapers=(e={newPaper:{},oldPaper:{}})=>{let{oldPaper:t,newPaper:a,...r}=e;var i,o,n={...t},e={overwrites:["lastOpenDate"],incrementCount:!1,syncMerge:!1,...r};for(i in a)(!t.hasOwnProperty(i)||a[i]&&!t[i])&&(n[i]=a[i]);e.incrementCount&&1===n.count&&(n.count+=1),e.syncMerge&&(n.count=t.count+a.count,n.note=t.note??"",a.note&&a.note!==t.note&&(n.note+="\n\n--[Sync Merge]--\n",n.note+=a.note),n.tags=[...t.tags,...a.tags],n.lastOpenDate=a.lastOpenDate,a.lastOpenDate>t.lastOpenDate&&(n.lastOpenDate=a.lastOpenDate),n.addDate=a.addDate,a.addDate>t.addDate)&&(n.addDate=a.addDate);for(o of e.overwrites)a.hasOwnProperty(o)&&(n[o]=a[o]);return n},updatePaperVisits=e=>(e.count+=1,e.lastOpenDate=(new Date).toJSON(),log("Updating paper to:",e),e),addOrUpdatePaper=async({url:a,is:r,prefs:i,tab:e,store:o=!0,contentScriptCallbacks:n={update:()=>{},preprints:()=>{}}})=>{let s=Date.now(),l,p,c={};consoleHeader("PaperMemory Parsing "+String.fromCodePoint("0x1F4DD")),global.state.papers=await getStorage("papers")??{};var t=await parseIdFromUrl(a,e),d=global.state.papers.hasOwnProperty(t);if(t&&d&&"anonymous"!==global.state.papers[t].author.toLowerCase())l=updatePaperVisits(global.state.papers[t]),p=!1;else{let t=await makePaper(r,a,e);if(!t)return;global.state.titleHashToIds=makeTitleHashToIdList(global.state.papers);d=findFuzzyPaperMatch(global.state.titleHashToIds,t);if(d&&o){let e=global.state.papers[d];log("New paper",t,"already exists as",e),addPaperToTitleHashToId(t),e.venue?(r=["lastOpenDate"],"anonymous"===e.author.toLowerCase()&&(r.push("author"),r.push("year"),r.push("venue"),r.push("bibtex"),r.push("note")),console.log("overwrites: ",r),e=mergePapers({newPaper:t,overwrites:r,oldPaper:e,incrementCount:!1}),updateDuplicatedUrls(a,d)):t.venue?(updateDuplicatedUrls(paperToAbs(e),t.id),updateDuplicatedUrls(paperToPDF(e),t.id),await deletePaperInStorage(e.id,global.state.papers),e=mergePapers({newPaper:t,oldPaper:e,incrementCount:!1,overwrites:["lastOpenDate","venue","bibtex","id","key","pdfLink","source","year","author"]})):"anonymous"===e.author.toLowerCase()&&(e=mergePapers({newPaper:t,oldPaper:e,incrementCount:!0,overwrites:["lastOpenDate","author","year","venue","bibtex","note"]})),t=updatePaperVisits(e),p=!1}else p=!0;l=t}if(!l.codeLink||!l.venue)try{var u=await tryPWCMatch(l),h=!l.codeLink&&u?.codeLink,f=u?.note,m=u?.bibtex,g=!l.venue&&u?.venue;(c={codeLink:h,note:f,venue:g,bibtex:m}).codeLink&&(l.codeLink=c.codeLink,u.hasOwnProperty("note")&&delete u.note,l.code=u)}catch(e){log("Error trying to discover a code repository:"),log(e)}return global.state.papers=await getStorage("papers")??{},p&&global.state.papers.hasOwnProperty(l.id)&&(warn("Paper has been created by another page: merging papers."),l=mergePapers({newPaper:global.state.papers[l.id],oldPaper:l,incrementCount:!0}),p=!1),o&&!global.state.deleted[l.id]&&(global.state.papers[l.id]=l),chrome.storage.local.set({papers:global.state.papers},async()=>{n.update(l),pushToRemote();let e;if(p||c.codeLink?p?(o?logOk("Added '"+l.title+"' to your Memory!"):warn("Discovered '"+l.title+"' but did not store it (`store` is false)."),log("paper: ",l),e="Added to your Memory",c.codeLink&&(e+="
(+ repo from PapersWithCode)
"),i&&i.checkFeedback&&o&&feedback(e,l)):(e="Found a code repository on PapersWithCode!",i&&i.checkFeedback&&o&&feedback(e)):o&&logOk("Updated '"+l.title+"' in your Memory"),!l.note||!l.venue||"anonymous"===l.author.toLowerCase()){var t,a,r=await tryPreprintMatch(l);for(t of["note","venue","bibtex","doi"])l[t]&&"bibtex"!==t||(a=r[t]??c[t])&&(log(`Updating preprint ${t} to`,a),l[t]=a),"bibtex"===t&&r[t]&&(a=bibtexToObject(r[t])).year!==l.year&&(l.year=a.year);global.state.papers=await getStorage("papers")??{},p&&global.state.papers.hasOwnProperty(l.id)&&1chrome.storage.local.set({papers:global.state.papers},e))}n.preprints(l),pushToRemote(),info(`Done processing paper (${(Date.now()-s)/1e3}s).`),console.groupEnd()}),{paper:l,id:t}},findPaperForProperty=(e,t,a,r="id")=>e.find(e=>e.source===t&&e[r].includes(a))?.id,parseIdFromUrl=async(t,e=null)=>{if(e)return urlToWebsiteId(t);let a;e=miniHash(t),e=global.state.urlHashToId[e];if(e)return e;var e=await isPaper(t,!0),r=Object.values(cleanPapers(global.state.papers));if(e.arxiv){var i=arxivIdFromURL(t),i=(a="Arxiv-"+i,Object.values(global.state.titleHashToIds).find(e=>e.includes(a)));i&&(a=i.find(e=>!e.startsWith("Arxiv-"))??a)}else if(e.neurips){var i=t.split("/paper/")[1].split("/")[0],o=t.split("/").last().split("-")[0].slice(0,8);a=`NeurIPS-${i}_`+o}else if(e.cvf)a=parseCVFUrl(t).id;else if(e.openreview){i=t.match(/id=\w+/)[0].replace("id=","");a=findPaperForProperty(r,"openreview",i)}else if(e.biorxiv){let e=(t=cleanBiorxivURL(t)).split("/").last();e.match(/v\d+$/)&&(e=e.split("v")[0]),a="Biorxiv-"+e;var o=Object.values(global.state.titleHashToIds).find(e=>e.includes(a));o&&(a=o.find(e=>!e.startsWith("Biorxiv-"))??a)}else if(e.pmlr){i=t.split("/").last().split(".")[0],o="20"+i.match(/\d+/)[0];a=`PMLR-${o}-`+i}else if(e.acl){o=(t=(t=t.replace(".pdf","")).endsWith("/")?t.slice(0,-1):t).split("/").last();a=findPaperForProperty(r,"acl",o)}else if(e.pnas){i=((t=t.replace(".full.pdf","")).endsWith("/")?t.split("/").slice(-2):t.split("/").slice(-1))[0];a=findPaperForProperty(r,"pnas",i)}else if(e.nature){o=(t=t.replace(".pdf","").split("#")[0]).split("/").last();a=findPaperForProperty(r,"nature",o)}else if(e.acs){t=noParamUrl(t).replace("pubs.acs.org/doi/pdf/","/doi/").replace("pubs.acs.org/doi/abs/","/doi/");let e=miniHash(t.split("/doi/")[1]);a="ACS_"+e}else if(e.iop){t=noParamUrl(t).replace(/\/pdf$/,"");let e=miniHash(t.split("/article/")[1].split("/meta")[0]);a="IOPscience_"+e}else if(e.jmlr){i=(t=(t=t.endsWith(".pdf")?t.split("/").slice(0,-1).join("/"):t).replace(".html","")).split("/").last(),o="20"+i.match(/\d+/)[0];a=`JMLR-${o}_`+i}else if(e.pmc){o=t.match(/PMC\d+/g)[0].replace("PMC","");a=findPaperForProperty(r,"pmc",o)}else if(e.ijcai){i=t.endsWith(".pdf")?t.replace(".pdf","").split("/").last().match(/[1-9]\d*/):t.split("/").last(),o=t.match(/proceedings\/\d+/gi)[0].split("/")[1];a=`IJCAI-${o}_`+i}else if(e.acm){let e=t.replace(/\/doi\/?(pdf|abs|full)?\//,"/doi/").split("/doi/")[1];a=findPaperForProperty(r,"acm",miniHash(e))}else if(e.ieee){o=(t.includes("ieee.org/document/")?t.split("ieee.org/document/"):t.includes("ieee.org/abstract/document/")?t.split("ieee.org/abstract/document/"):t.split("arnumber="))[1].match(/\d+/)[0];a=findPaperForProperty(r,"ieee",o)}else if(e.springer){let e=global.sourceExtras.springer.types.filter(e=>t.includes(`/${e}/`))[0];if(!e){if(!t.includes("/content/pdf/"))throw new Error("Could not find Springer type for "+t);e="content/pdf"}i=noParamUrl(t).split(`/${e}/`)[1].replace(".pdf","");a=findPaperForProperty(r,"springer",miniHash(i))}else if(e.aps){var[o,i]=parseUrl(t.split("#")[0]).pathname.split("/").slice(1,3);let e=t.split(`/${o}/${i}/`).last();a=findPaperForProperty(r,"aps",miniHash(e))}else if(e.wiley){let e=t.split("?")[0].split("#")[0].split("/").slice(-2).join("/");a=findPaperForProperty(r,"wiley",miniHash(e))}else if(e.sciencedirect){o=t.split("/pii/")[1].split("/")[0].split("#")[0].split("?")[0];a=findPaperForProperty(r,"sciencedirect",miniHash(o))}else if(e.science)(doi=noParamUrl(t).split("/doi/")[1]).startsWith("10.")||(doi=doi.split("/").slice(1).join("/")),a=findPaperForProperty(r,"science",miniHash(doi));else if(e.frontiers)doi=noParamUrl(t).split("/articles/")[1].split("/").slice(0,-1).join("/"),a=findPaperForProperty(r,"frontiers",miniHash(doi));else if(e.ihep)a=t.includes("/literature/")?(i=noParamUrl(t).match(/\/literature\/(\d+)/)[1],findPaperForProperty(r,"ihep",i)):(o=noParamUrl(t).split("/files/")[1].split("/")[0],findPaperForProperty(r,"ihep",o,"pdfLink"));else if(e.plos){let e=t.split("?id=").last().split("&")[0];a=findPaperForProperty(r,"plos",miniHash(e))}else if(e.rsc){i=noParamUrl(t).replace("/unauth","").split("/").last();a=findPaperForProperty(r,"rsc",miniHash(i))}else if(e.mdpi){o=noParamUrl(t.split("mdpi.com/")[1].split("/pdf")[0].split("/reprints")[0].split("/notes")[0]);a=findPaperForProperty(r,"mdpi",miniHash(o))}else if(e.oup){t=noParamUrl(t).split("https://academic.oup.com/").last();i=(t=isPdfUrl(t)?t.split("/").slice(0,-1).join("/"):t).split("/").slice(2).join("");a=findPaperForProperty(r,"oup",miniHash(i))}else if(e.hal){o=(t=noParamUrl(t).replace(/(hal\.science\/\w+-\d+)(v\d+)?((\/document|\/file\/.+\.pdf))?/,"$1")).split("/").last();a=findPaperForProperty(r,"hal",miniHash(o))}else if(e.chemrxiv)chemRxivId=chemRxivId=isPdfUrl(t)?t.split("/item/")[1].split("/")[0]:noParamUrl(t).split("/").last(),a=findPaperForProperty(r,"chemrxiv",miniHash(chemRxivId));else if(e.cell)t=(await findCellPii(t)).url,a=findPaperForProperty(r,"cell",miniHash(t.split("cell.com/")[1]));else if(e.localFile)a=e.localFile;else{if(!e.parsedWebsite)throw new Error("`parseIdFromUrl` failed, unknown paper url. Is: "+JSON.stringify(e));a=e.parsedWebsite.id}return a},isKnownLocalFile=e=>{if(!e.startsWith("file://"))return!1;if(!e.endsWith(".pdf"))return!1;let t=decodeURIComponent(e).replace("file://","");var a=Object.entries(global.state.files).filter(([,e])=>e.filename===t);if(0({title:miniHash(e.title),id:e.id})).filter(e=>r.includes(e.title));return 0!==a.length&&a[0].id},makeMdLink=(e,t={})=>{var a=(t.checkPreferPdf?paperToPDF:paperToAbs)(e);let r="",i=(!t.checkMdYearVenue||(r=(r=e.note.match(/(.+)\s*@\s*([\w\s]+\(?\d{4}\)?)/i))&&r[2]?.replace(/\s+/g," ").replace(/[\(\)]/g,""))||(r="",e.venue&&(r+=e.venue+" "),r+=e.year),e.title);return`[${i=r?`${i} (${r.replace(/\s+/g," ")})`:i}](${a})`},duration=("undefined"!=typeof module&&null!=module.exports&&((dummyModule=module).exports={isPaper:isPaper,isSourceURL:isSourceURL,paperToAbs:paperToAbs,paperToPDF:paperToPDF,findLocalFile:findLocalFile,matchPapersToFiles:matchPapersToFiles,matchAllFilesToPapers:matchAllFilesToPapers,mergePapers:mergePapers,updatePaperVisits:updatePaperVisits,addOrUpdatePaper:addOrUpdatePaper,findPaperForProperty:findPaperForProperty,parseIdFromUrl:parseIdFromUrl,isKnownLocalFile:isKnownLocalFile,makeMdLink:makeMdLink}),e=>(Date.now()-e[0])/1e3),initState=async({papers:e,isContentScript:t,print:a=!0}={})=>{var r=[],i=(r.unshift(Date.now()),a&&consoleHeader("PaperMemory Init "+String.fromCodePoint("0x2705")),e||(e=await getStorage("papers")??{},a&&log("Time to retrieve stored papers (s): "+duration(r))),r.unshift(Date.now()),global.state.dataVersion=getManifestDataVersion(),a&&log("Time to parse data version (s): "+duration(r)),r.unshift(Date.now()),weeklyBackup(),a&&log("Time to backup papers (weekly) (s): "+duration(r)),r.unshift(Date.now()),await migrateData(e,global.state.dataVersion));a&&log("Time to migrate data (s): "+duration(r)),r.unshift(Date.now()),e=i.papers,global.state.papers=e,global.state.prefs=await getPrefs(),a&&log("Time to retrieve user preferences (s): "+duration(r)),r.unshift(Date.now()),global.state.ignoreSources=await getStorage("ignoreSources")??{},a&&log("Time to retrieve sources to ignore (s): "+duration(r)),r.unshift(Date.now()),global.state.urlHashToId=await getStorage("urlHashToId")??{},a&&log("Time to retrieve sources to urlHashToId (s): "+duration(r)),r.unshift(Date.now()),global.state.titleHashToIds=makeTitleHashToIdList(e),a&&log("Time to hash titles (s): "+duration(r)),r.unshift(Date.now()),t||(global.state.files=await matchAllFilesToPapers(),a&&log("Time to match all local files (s): "+duration(r)),r.unshift(Date.now()),global.state.papersList=Object.values(cleanPapers(e)),global.state.sortKey="lastOpenDate",global.state.papersReady=!0,sortMemory(),a&&log("Time to sort memory (s): "+duration(r)),r.unshift(Date.now()),makeTags(),a&&log("Time to make tags (s): "+duration(r)),r.unshift(Date.now())),info("State init duration (s): "+(Date.now()-r.last())/1e3),a&&console.groupEnd(),(async()=>{var e=chrome.runtime.getURL("src/data/cell.json"),e=await fetch(e).then(e=>e.json());global.state.cellJournalData=e})()},sortMemory=()=>{global.state.sortedPapers=Object.values(cleanPapers(global.state.papers)),global.state.sortedPapers.sort(orderPapers(0<=global.descendingSortKeys.indexOf(global.state.sortKey))),global.state.papersList.sort(orderPapers(0<=global.descendingSortKeys.indexOf(global.state.sortKey)))},orderPapers=i=>(e,t)=>{let a=e[global.state.sortKey],r=t[global.state.sortKey];return void 0===a&&(a=""),void 0===r&&(r=""),"string"==typeof a&&(a=a.toLowerCase(),r=r.toLowerCase()),i?a>r?-1:1:a>r?1:-1},makeTags=()=>{var e,t=new Set;for(e of global.state.sortedPapers)for(var a of e.tags)t.add(a);global.state.paperTags=[...t],global.state.paperTags.sort()},getExamplePaper=async e=>{var t=await getStorage("papers")??{},a=Object.keys(t).filter(e=>-1===e.indexOf("__")).reverse();let r=t[a[e=void 0===e?getRandomInt(a.length):e]];return r=void 0===r?{title:"Dummy title",author:"Cool Author and Great Author and Complicated Name Àuthor",year:2021,id:"NoneXiv-214324",bibtex:"@Nonesense{}",tags:["t1","t2"],note:"Thispaperdoesnotexist.com"}:r},stateTitleFunction=e=>{let t=e;return"string"==typeof e&&void 0===(t=global.state.papers[e])?(log("Error in stateTitleFunction: unknown id",e),"Unknown ID"):global.state.titleFunction(t).replaceAll("\n"," ").replace(/\s\s+/g," ")},updateDuplicatedUrls=(t,a,e=!1)=>{if(e){let e;if((e=t?[miniHash(t)]:Object.keys(global.state.urlHashToId).filter(e=>global.state.urlHashToId[e]===a))&&e.length){for(var r of e)warn("Removing duplicated url",t,"for",a),delete global.state.urlHashToId[r];setStorage("urlHashToId",global.state.urlHashToId)}}else global.state.urlHashToId[miniHash(t)]=a,setStorage("urlHashToId",global.state.urlHashToId)},addPaperToTitleHashToId=e=>{var t=e.id,e=miniHash(e.title);global.state.titleHashToIds.hasOwnProperty(e)||(global.state.titleHashToIds[e]=[]),global.state.titleHashToIds[e].includes(t)||global.state.titleHashToIds[e].push(t)},readJournalAbbreviations=async()=>{var e,t;global.journalAbbreviations||(e=chrome.runtime.getURL("src/data/iso4-journals.json"),e=await fetch(e).then(e=>e.json()),t=chrome.runtime.getURL("src/data/journal-abbreviations.json"),t=await fetch(t).then(e=>e.json()),global.journalAbbreviations=Object.fromEntries([...Object.entries(e),...Object.entries(t)].map(([e,t])=>[miniHash(e),t])))},downloadPaperPdf=async e=>{if(!global.state.papersReady)throw new Error("[PM] State is not ready (downloadPaperPdf)");let t=stateTitleFunction(e);t=(t=t.replaceAll(":"," ")).replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,\/:;<=>?@\[\]^`{|}~]/g," ").replace(/\s+/g," "),global.state.prefs.checkStore&&(t="PaperMemoryStore/"+t,0===(await getStoredFiles()).length)&&chrome.downloads.download({url:URL.createObjectURL(new Blob([global.storeReadme])),filename:"PaperMemoryStore/IMPORTANT_README.txt",saveAs:!1}),(t=t.endsWith("pdf")?t.slice(0,-3)+".pdf":t).endsWith(".pdf")||(t+=".pdf"),log("Downloading paper",e,"to",t),chrome.downloads.download({url:paperToPDF(e),filename:t})},decodeHtml=("undefined"!=typeof module&&null!=module.exports&&((dummyModule=module).exports={duration:duration,initState:initState,sortMemory:sortMemory,orderPapers:orderPapers,makeTags:makeTags,getExamplePaper:getExamplePaper,stateTitleFunction:stateTitleFunction,updateDuplicatedUrls:updateDuplicatedUrls,addPaperToTitleHashToId:addPaperToTitleHashToId,readJournalAbbreviations:readJournalAbbreviations,downloadPaperPdf:downloadPaperPdf}),e=>{var t=document.createElement("textarea");return t.innerHTML=e,t.value}),flipAuthor=e=>e.split(", ").reverse().join(" "),flipAndAuthors=e=>e.split(" and ").map(flipAuthor).join(" and "),fetchArxivXML=async e=>{e=e.replace("Arxiv-","").replace("_","/");return fetch("https://export.arxiv.org/api/query?"+new URLSearchParams({id_list:e}))},fetchCvfHTML=async e=>{let t,a;var r;return t=e.endsWith(".pdf")?e.replace("/papers_backup/","/papers/").replace("/papers/","/html/").replace(".pdf",".html"):e,!(a=await fetch(t).then(e=>e.ok?e.text():""))&&t.includes("thecvf.com/content_")&&({conf:e,year:r}=parseCVFUrl(e),t=t.replace(`/content_${e}_${r}/`,`/content_${e.toLowerCase()}_${r}/`),a=await fetch(t).then(e=>e.ok?e.text():"")),a},getOpenReviewNoteJSON=e=>sendMessageToBackground({type:"OpenReviewNoteJSON",url:e}),getOpenReviewForumJSON=e=>sendMessageToBackground({type:"OpenReviewForumJSON",url:e}),fetchDom=async e=>{e=await fetch(e).then(e=>e.ok?e.text():"");return(new DOMParser).parseFromString(e.replaceAll("\n",""),"text/html")},fetchText=async e=>{try{var t=await fetch(e);return(t.ok?await t.text():"").trim()}catch(e){return logError("fetchText error:",e),""}},fetchJSON=async e=>{try{var t=await fetch(e),a=t.status;return{data:t.ok?await t.json():null,status:a}}catch(e){return logError("fetchJSON error:",e),{}}},fetchBibtex=async({url:e,doi:t})=>{let a;if(e&&t)throw new Error("fetchBibtex: both url and doi provided");if(t)a=await fetchText(`https://citation.doi.org/format?doi=${t}&style=bibtex&lang=en-US`);else{if(!e)throw new Error("fetchBibtex: no url or doi provided");a=await fetchText(e)}t=bibtexToObject(a);return delete t.abstract,a=bibtexToString(t),t.bibtex=a,t.key=t.citationKey,t.journal&&(t.venue=t.journal,t.note=`Published in ${t.journal} (${t.year})`),t},extractCrossrefData=e=>{if(e.status&&"ok"===e.status)if("work"!==e["message-type"])error("Unknown `message-type` from CrossRef",e);else{var t=e.message,a=(log("Crossref data.message: ",t),t.author.map(e=>e.given+" "+e.family).join(" and ")),r=t.issued?t.issued["date-parts"][0][0]+"":t.published?t.published["date-parts"][0][0]+"":null;if(r){var i,o,n,s=t.title[0];if(s)return i=t["container-title"][0]??"Springer",n=[miniHash(t.author[0].family),r.slice(2),firstNonStopLowercase(s)].join(""),o=t.DOI,n={entryType:"book"===t.type?"book":"book-chapter"===t.type?"InBook":t.type.includes("article")?"Article":"InProceedings",citationKey:n,publisher:t.publisher,author:a,title:s,year:r,doi:o},t.page&&(n.pages=t.page),t.volume&&(n.volume=t.volume),t.type.includes("journal")&&(n.journal=i),t.link&&0"application/pdf"===e["content-type"]))&&(n.pdf=a.URL),s=t.link.find(e=>"text/html"===e["content-type"])??t.link[0])&&(n.url=s.URL),r=bibtexToString(n),{...n,bibtex:r,venue:i};error("Cannot find title in CrossRef data",t)}else error("Cannot find year in CrossRef data",t)}else error("Cannot parse CrossRef response",e)},fetchCrossRefDataForDoi=async e=>{var{data:e,status:t}=await fetchJSON(`https://api.crossref.org/works/${e}?mailto=schmidtv%40mila.quebec`);return{data:extractCrossrefData(e),status:t}},fetchSemanticScholarDataForDoi=async e=>{var t,e=(await fetchJSON(`https://api.semanticscholar.org/graph/v1/paper/${e}?fields=venue,year,authors,title`)).data;let a;return e&&(a={},e.venue&&(a.venue=e.venue),e.year&&(a.year=e.year),e.authors&&(a.author=e.authors.map(e=>e.name).join(" and ")),e.title&&(a.title=e.title),e=""+miniHash(e.authors[0].name)+firstNonStopLowercase(a.title),t=bibtexToString({entryType:"article",citationKey:e,...a}),a.bibtex=t,a.key=e),a},getDCPatterns=e=>{let t=e.slice(3);var e=["dc.","DC:","DC.","dc:"].map(e=>e+t.toLowerCase()),a=["dc.","DC:","DC.","dc:"].map(e=>e+t.capitalize());return[...e,...a]},getMetaContent=({selector:a,dom:t,all:e=!1,pure:r=!1})=>{let i="";for(let[t,e]of Object.entries(a))/dc\W/.test(e.toLowerCase())?i+=getDCPatterns(e).map(e=>`meta[${t}='${e}']`).join(","):i+=`meta[${t}='${e}']`;if(e){let e=queryAll(i,t).map(e=>e.getAttribute("content")??"");return r?e:e.map(spaceCamelCase).map(toSingleSpace)}let o=t.querySelector(i)?.getAttribute("content")??"";return r?o:toSingleSpace(spaceCamelCase(o))},extractDataFromDCMetaTags=e=>{var t,a,r,i,o,n,s=getMetaContent({selector:{name:"dc.Creator"},dom:e,all:!0}).join(" and ")||getMetaContent({selector:{name:"citation_author"},dom:e,all:!0}).join(" and ");return s?(t=(getMetaContent({selector:{name:"dc.Date"},dom:e})||getMetaContent({selector:{name:"citation_publication_date"},dom:e})).split("-")[0].split("/")[0],a=getMetaContent({selector:{name:"dc.Publisher"},dom:e}).replaceAll("\n"," ")||getMetaContent({selector:{property:"og:site_name"},dom:e,pure:!0}),r=getMetaContent({selector:{name:"dc.Title"},dom:e})||getMetaContent({selector:{name:"citation_title"},dom:e}),i=getMetaContent({selector:{name:"citation_journal_title"},dom:e}),o=getMetaContent({selector:{name:"citation_pdf_url"},dom:e,pure:!0}),e=getMetaContent({selector:{scheme:"doi"},dom:e})||getMetaContent({selector:{name:"citation_doi"},dom:e}),n=(""+s.split(" and ")[0].split(" ").find((e,t)=>1<=t&&1{var e=arxivIdFromURL(e),t=await(await fetchArxivXML(e)).text(),t=(new DOMParser).parseFromString(t.replaceAll("\n",""),"text/xml"),a=queryAll("author name",t).map(e=>e.innerHTML),r=a.join(" and "),i=[...t.getElementsByTagName("link")].map(e=>e.getAttribute("href")).filter(e=>e.includes("arxiv.org/pdf/"))[0].replace(/v\d+(\.pdf)?$/gi,".pdf"),o=(o=t.querySelector("entry title"))?.textContent||o?.innerText||"",t=t.querySelector("entry published").innerHTML.slice(0,4),a=a[0].split(" ").last().toLowerCase()+t+firstNonStopLowercase(o),n="Arxiv-"+e.replace("/","_"),s="";return{author:r,bibtex:s+`@article{${a}, +`)}},venue:{type:"string",desc:"the paper's publication venue",default:e=>""},year:{type:"string",desc:"year of publication",validation:e=>{if(!/^\d{4}$/.test(e))return`Invalid year (${e}): must be 4 digits exactly`}}},n={};for(a in o)if(n[a]||(n[a]=[]),t.hasOwnProperty(a)){var s,l=o[a].type,p=typeof t[a];l.includes("array")||"object"===l?l.includes("array")?Array.isArray(t[a])?(c=l.split("[")[1].replace("]",""),0{let t=!0,a="",r="",i;try{e.__dataVersion||(e.__dataVersion=1);var o,n,s=await migrateData(e,getManifestDataVersion(),!1);if(!s.success)return r="Could not migrate the data before storing it",s.error&&(r+=":
"+stringifyError(s.error)),{success:!1,message:r};for(o in i=s.papers)o.startsWith("__")||(paperWarnings=validatePaper(i[o]).warnings)&&0"+Object.entries(paperWarnings).map((e,t)=>`
${e}
`+t.join("
")).join("
"));a&&(n=await getStorage("papers")??{},setStorage("uploadBackup",n)),t=!1}catch(e){log("prepareOverwriteData error",e),r='
/!\\ OverwriteMemoryError:

'+stringifyError(e),t=!0}return{success:!t,message:r,warning:a,papersToWrite:i}},makeVenue=async e=>{let t="";switch((t=e.note&&e.note.match(/(accepted|published)\ @\ .+\(?\d{4}\)?/i)?e.note.split("@")[1].trim().replace(/\(?\d{4}\)?/,"").split("--")[0].trim():t)&&"neurips"===t.toLowerCase()&&(t="NeurIPS"),e.source){case"arxiv":break;case"neurips":t="NeurIPS";break;case"cvf":t=t||(await makeCVFPaper(e.pdfLink)).venue;break;case"openreview":t=t||(await makeOpenReviewPaper(e.pdfLink)).venue;break;case"biorxiv":break;case"pmlr":t=e.conf?.split(/\d{4}/)[0]??"";break;case"acl":t=e.conf??"";break;case"pnas":t="PNAS";break;case"nature":t=t||e.venue;break;case"iop":case"acs":t=e.venue}return t},makeTitleHashToIdList=e=>{var t,a,r={};for([t,a]of Object.entries(cleanPapers(e))){var i=miniHash(a.title);r.hasOwnProperty(i)||(r[i]=[]),r[i].push(t)}return r},isPaper=("undefined"!=typeof module&&null!=module.exports&&((dummyModule=module).exports={migrateData:migrateData,logStorage:logStorage,getStorage:getStorage,setStorage:setStorage,deletePaperInStorage:deletePaperInStorage,getTheme:getTheme,backupData:backupData,weeklyBackup:weeklyBackup,getPrefs:getPrefs,getManifestDataVersion:getManifestDataVersion,versionToSemantic:versionToSemantic,validatePaper:validatePaper,prepareOverwriteData:prepareOverwriteData,makeVenue:makeVenue,makeTitleHashToIdList:makeTitleHashToIdList}),async(e,t=!1)=>{var a={};if(e){for(var r in global.knownPaperPages){var i,o=global.knownPaperPages[r].patterns;a[r]=!1;for(i of o)if("string"==typeof i?e.includes(i)&&(a[r]=!0):"function"==typeof i&&(a[r]=i(e)),a[r])break}a.localFile=isKnownLocalFile(e),a.stored=!t&&(await findLocalFile(e)??!1),a.parsedWebsite=global.state.papers["Website_"+urlToWebsiteId(e)]??!1}return a}),isSourceURL=async(e,t)=>Object.values(await isPaper(e,t)).some(e=>e),paperToAbs=e=>{let t,a,r;var i=e.pdfLink;let o,n="";switch(e.source){case"arxiv":n=i.replace("/pdf/","/abs/").replace(".pdf","");break;case"neurips":n=i.replace("/file/","/hash/").replace("-Paper.pdf","-Abstract.html");break;case"cvf":n=i.replace("/papers/","/html/").replace(".pdf",".html");break;case"openreview":n=i.replace("/pdf?","/forum?");break;case"biorxiv":n=i.replace(".full.pdf","");break;case"pmlr":n=i.split("/").slice(0,-1).join("/")+".html";break;case"acl":n=i.replace(".pdf","");break;case"pnas":n=i.replace(".full.pdf","").replace("/doi/pdf/","/doi/full/");break;case"nature":n=i.replace(".pdf","");break;case"acs":n=i.replace("pubs.acs.org/doi/pdf/","pubs.acs.org/doi/").split("?")[0];break;case"iop":n=i.split("#")[0].replace(/\/pdf$/,"");break;case"jmlr":n=i.split("/").slice(0,-1).join("/").replace("/papers/volume","/papers/v")+".html";break;case"pmc":var s=i.match(/PMC\d+/)[0];n=i.split(s)[0]+s;break;case"ijcai":var s=i.replace(".pdf","").split("/").last().match(/[1-9]\d*/),l=i.match(/proceedings\/\d+/gi)[0].split("/")[1];n=`https://www.ijcai.org/proceedings/${l}/`+s;break;case"acm":n=i.replace("/doi/pdf/","/doi/");break;case"ieee":n="https://ieeexplore.ieee.org/document/"+e.key;break;case"springer":n=e.extra.url;break;case"aps":[t,a]=parseUrl(i).pathname.split("/").slice(1,3),n=i.replace(`/${t}/${a}/`,`/${t}/abstract/`);break;case"wiley":n=i.replace(/\/doi\/e?pdf\//g,"/doi/abs/");break;case"sciencedirect":o=i.split("/pii/")[1].split("/")[0].split("#")[0].split("?")[0],n="https://www.sciencedirect.com/science/article/pii/"+o;break;case"science":(r=i.split("/doi/")[1]).startsWith("10.")||(r=r.split("/").slice(1).join("/")),n="https://science.org/doi/full/"+r;break;case"frontiers":n=i.replace(/\/pdf$/,"/full");break;case"ihep":n="https://inspirehep.net/literature/"+e.id.split("-")[1];break;case"plos":n=i.replace("/article/file?","/article?").split("&")[0];break;case"rsc":n=i.replace("/articlepdf/","/articlelanding/");break;case"website":n=e.pdfLink;break;case"mdpi":n=e.pdfLink.split("/pdf")[0];break;case"oup":n="https://doi.org/"+e.doi;break;case"hal":n=i.split("/file/")[0].split("/document")[0];break;case"chemrxiv":n="https://chemrxiv.org/engage/chemrxiv/article-details/"+i.split("/item/")[1].split("/")[0];break;case"cell":const t=e.id.split("_")[0].split("fulltext")[0];o=new URL(i).searchParams.get("pii"),n=`https://www.cell.com/${t}/fulltext/`+o;break;default:n="https://xkcd.com/1969/"}return n.replace("http://","https://")},paperToPDF=e=>{let t=e.pdfLink;switch(e.source){case"arxiv":t=t.replace("arxiv.org/abs/","arxiv.org/pdf/").replace(/\.pdf$/,"").replace(/v\d+$/gi,""),t+=".pdf";break;case"neurips":t=t.replace("/hash/","/file/").replace("-Abstract.html","-Paper.pdf");break;case"cvf":t=t.replace("/html/","/papers/").replace(".html",".pdf");break;case"openreview":t=t.replace("/forum?","/pdf?");break;case"biorxiv":t=cleanBiorxivURL(t)+".full.pdf";break;case"pmlr":case"acl":case"pnas":break;case"nature":t.endsWith(".pdf")||(t+=".pdf");break;case"iop":t.endsWith("/pdf")||(t+="/pdf");break;case"acs":case"jmlr":case"pmc":case"ijcai":case"acm":case"ieee":case"springer":case"aps":case"wiley":case"sciencedirect":case"science":case"frontiers":case"ihep":case"plos":case"rsc":case"mdpi":case"oup":case"hal":case"chemrxiv":case"website":case"cell":break;default:t="https://xkcd.com/1969/"}return t.replace("http://","https://")},findLocalFile=async t=>{if("string"==typeof t){let e;try{e=await parseIdFromUrl(t)}catch(e){return new Promise(e=>e(null))}if(!global.state.papers.hasOwnProperty(e))return new Promise(e=>e(null));paper=global.state.papers[e]}else paper=t;t=await getStoredFiles(),t=await matchPapersToFiles({[paper.id]:paper},t),t=Object.values(t);return 1===t.length?t[0]:null},matchPapersToFiles=async(e,t)=>{var a,r=Object.fromEntries(Object.values(e).map(e=>[e.id,miniHash(e.title)])),i=(t=t.filter(e=>e.exists&&"complete"===e.state&&!e.filename.toLowerCase().includes("readme.txt")),Object.fromEntries(t.map(e=>[e.id,miniHash(e.filename)]))),o={};for(a of t){let t;try{(t=await parseIdFromUrl(a.finalUrl))&&e.hasOwnProperty(t)&&(o[t]=a)}catch(e){t=null}if(!t){let t=i[a.id];var n=Object.entries(r).find(([,e])=>t.includes(e));n&&(o[n[0]]=a)}}return o},matchAllFilesToPapers=()=>new Promise((t,e)=>{chrome.downloads.search({filenameRegex:"PaperMemoryStore/.*"},async e=>{e=await matchPapersToFiles(cleanPapers(global.state.papers),e);t(e)})}),mergePapers=(e={newPaper:{},oldPaper:{}})=>{let{oldPaper:t,newPaper:a,...r}=e;var i,o,n={...t},e={overwrites:["lastOpenDate"],incrementCount:!1,syncMerge:!1,...r};for(i in a)(!t.hasOwnProperty(i)||a[i]&&!t[i])&&(n[i]=a[i]);e.incrementCount&&1===n.count&&(n.count+=1),e.syncMerge&&(n.count=t.count+a.count,n.note=t.note??"",a.note&&a.note!==t.note&&(n.note+="\n\n--[Sync Merge]--\n",n.note+=a.note),n.tags=[...t.tags,...a.tags],n.lastOpenDate=a.lastOpenDate,a.lastOpenDate>t.lastOpenDate&&(n.lastOpenDate=a.lastOpenDate),n.addDate=a.addDate,a.addDate>t.addDate)&&(n.addDate=a.addDate);for(o of e.overwrites)a.hasOwnProperty(o)&&(n[o]=a[o]);return n},updatePaperVisits=e=>(e.count+=1,e.lastOpenDate=(new Date).toJSON(),log("Updating paper to:",e),e),addOrUpdatePaper=async({url:a,is:r,prefs:i,tab:e,store:o=!0,contentScriptCallbacks:n={update:()=>{},preprints:()=>{}}})=>{let s=Date.now(),l,p,c={};consoleHeader("PaperMemory Parsing "+String.fromCodePoint("0x1F4DD")),global.state.papers=await getStorage("papers")??{};var t=await parseIdFromUrl(a,e),d=global.state.papers.hasOwnProperty(t);if(i&&i.checkFeedback&&feedback({loading:!0}),t&&d&&"anonymous"!==global.state.papers[t].author.toLowerCase())l=updatePaperVisits(global.state.papers[t]),p=!1;else{let t=await makePaper(r,a,e);if(!t)return;global.state.titleHashToIds=makeTitleHashToIdList(global.state.papers);d=findFuzzyPaperMatch(global.state.titleHashToIds,t);if(d&&o){let e=global.state.papers[d];log("New paper",t,"already exists as",e),addPaperToTitleHashToId(t),e.venue?(r=["lastOpenDate"],"anonymous"===e.author.toLowerCase()&&(r.push("author"),r.push("year"),r.push("venue"),r.push("bibtex"),r.push("note")),console.log("overwrites: ",r),e=mergePapers({newPaper:t,overwrites:r,oldPaper:e,incrementCount:!1}),updateDuplicatedUrls(a,d)):t.venue?(updateDuplicatedUrls(paperToAbs(e),t.id),updateDuplicatedUrls(paperToPDF(e),t.id),await deletePaperInStorage(e.id,global.state.papers),e=mergePapers({newPaper:t,oldPaper:e,incrementCount:!1,overwrites:["lastOpenDate","venue","bibtex","id","key","pdfLink","source","year","author"]})):"anonymous"===e.author.toLowerCase()&&(e=mergePapers({newPaper:t,oldPaper:e,incrementCount:!0,overwrites:["lastOpenDate","author","year","venue","bibtex","note"]})),t=updatePaperVisits(e),p=!1}else p=!0;l=t}if(!l.codeLink||!l.venue)try{var u=await silentPromiseTimeout(tryPWCMatch(l)),h=!l.codeLink&&u?.codeLink,f=u?.note,m=u?.bibtex,g=!l.venue&&u?.venue;(c={codeLink:h,note:f,venue:g,bibtex:m}).codeLink&&(l.codeLink=c.codeLink,u.hasOwnProperty("note")&&delete u.note,l.code=u)}catch(e){log("Error trying to discover a code repository:"),log(e)}return global.state.papers=await getStorage("papers")??{},p&&global.state.papers.hasOwnProperty(l.id)&&(warn("Paper has been created by another page: merging papers."),l=mergePapers({newPaper:global.state.papers[l.id],oldPaper:l,incrementCount:!0}),p=!1),o&&!global.state.deleted[l.id]&&(global.state.papers[l.id]=l),chrome.storage.local.set({papers:global.state.papers},async()=>{n.update(l),pushToRemote();let e;if(p||c.codeLink?p?(o?logOk("Added '"+l.title+"' to your Memory!"):warn("Discovered '"+l.title+"' but did not store it (`store` is false)."),log("paper: ",l),e="Added to your Memory",c.codeLink&&(e+="
(+ repo from PapersWithCode)
"),i&&i.checkFeedback&&o&&feedback({text:e,paper:l})):(e="Found a code repository on PapersWithCode!",i&&i.checkFeedback&&o&&feedback({text:e})):o&&logOk("Updated '"+l.title+"' in your Memory"),!l.note||!l.venue||"anonymous"===l.author.toLowerCase()){var t,a,r=await tryPreprintMatch(l);for(t of["note","venue","bibtex","doi"])l[t]&&"bibtex"!==t||(a=r[t]??c[t])&&(log(`Updating preprint ${t} to`,a),l[t]=a),"bibtex"===t&&r[t]&&(a=bibtexToObject(r[t])).year!==l.year&&(l.year=a.year);global.state.papers=await getStorage("papers")??{},p&&global.state.papers.hasOwnProperty(l.id)&&1chrome.storage.local.set({papers:global.state.papers},e))}n.preprints(l),pushToRemote(),info(`Done processing paper (${(Date.now()-s)/1e3}s).`),console.groupEnd()}),{paper:l,id:t}},findPaperForProperty=(e,t,a,r="id")=>e.find(e=>e.source===t&&e[r].includes(a))?.id,parseIdFromUrl=async(t,e=null)=>{if(e)return urlToWebsiteId(t);let a;e=miniHash(t),e=global.state.urlHashToId[e];if(e)return e;var e=await isPaper(t,!0),r=Object.values(cleanPapers(global.state.papers));if(e.arxiv){var i=arxivIdFromURL(t),i=(a="Arxiv-"+i,Object.values(global.state.titleHashToIds).find(e=>e.includes(a)));i&&(a=i.find(e=>!e.startsWith("Arxiv-"))??a)}else if(e.neurips){var i=t.split("/paper/")[1].split("/")[0],o=t.split("/").last().split("-")[0].slice(0,8);a=`NeurIPS-${i}_`+o}else if(e.cvf)a=parseCVFUrl(t).id;else if(e.openreview){i=t.match(/id=\w+/)[0].replace("id=","");a=findPaperForProperty(r,"openreview",i)}else if(e.biorxiv){let e=(t=cleanBiorxivURL(t)).split("/").last();e.match(/v\d+$/)&&(e=e.split("v")[0]),a="Biorxiv-"+e;var o=Object.values(global.state.titleHashToIds).find(e=>e.includes(a));o&&(a=o.find(e=>!e.startsWith("Biorxiv-"))??a)}else if(e.pmlr){i=t.split("/").last().split(".")[0],o="20"+i.match(/\d+/)[0];a=`PMLR-${o}-`+i}else if(e.acl){o=(t=(t=t.replace(".pdf","")).endsWith("/")?t.slice(0,-1):t).split("/").last();a=findPaperForProperty(r,"acl",o)}else if(e.pnas){i=((t=t.replace(".full.pdf","")).endsWith("/")?t.split("/").slice(-2):t.split("/").slice(-1))[0];a=findPaperForProperty(r,"pnas",i)}else if(e.nature){o=(t=t.replace(".pdf","").split("#")[0]).split("/").last();a=findPaperForProperty(r,"nature",o)}else if(e.acs){t=noParamUrl(t).replace("pubs.acs.org/doi/pdf/","/doi/").replace("pubs.acs.org/doi/abs/","/doi/");let e=miniHash(t.split("/doi/")[1]);a="ACS_"+e}else if(e.iop){t=noParamUrl(t).replace(/\/pdf$/,"");let e=miniHash(t.split("/article/")[1].split("/meta")[0]);a="IOPscience_"+e}else if(e.jmlr){i=(t=(t=t.endsWith(".pdf")?t.split("/").slice(0,-1).join("/"):t).replace(".html","")).split("/").last(),o="20"+i.match(/\d+/)[0];a=`JMLR-${o}_`+i}else if(e.pmc){o=t.match(/PMC\d+/g)[0].replace("PMC","");a=findPaperForProperty(r,"pmc",o)}else if(e.ijcai){i=t.endsWith(".pdf")?t.replace(".pdf","").split("/").last().match(/[1-9]\d*/):t.split("/").last(),o=t.match(/proceedings\/\d+/gi)[0].split("/")[1];a=`IJCAI-${o}_`+i}else if(e.acm){let e=t.replace(/\/doi\/?(pdf|abs|full)?\//,"/doi/").split("/doi/")[1];a=findPaperForProperty(r,"acm",miniHash(e))}else if(e.ieee){o=(t.includes("ieee.org/document/")?t.split("ieee.org/document/"):t.includes("ieee.org/abstract/document/")?t.split("ieee.org/abstract/document/"):t.split("arnumber="))[1].match(/\d+/)[0];a=findPaperForProperty(r,"ieee",o)}else if(e.springer){let e=global.sourceExtras.springer.types.filter(e=>t.includes(`/${e}/`))[0];if(!e){if(!t.includes("/content/pdf/"))throw new Error("Could not find Springer type for "+t);e="content/pdf"}i=noParamUrl(t).split(`/${e}/`)[1].replace(".pdf","");a=findPaperForProperty(r,"springer",miniHash(i))}else if(e.aps){var[o,i]=parseUrl(t.split("#")[0]).pathname.split("/").slice(1,3);let e=t.split(`/${o}/${i}/`).last();a=findPaperForProperty(r,"aps",miniHash(e))}else if(e.wiley){let e=t.split("?")[0].split("#")[0].split("/").slice(-2).join("/");a=findPaperForProperty(r,"wiley",miniHash(e))}else if(e.sciencedirect){o=t.split("/pii/")[1].split("/")[0].split("#")[0].split("?")[0];a=findPaperForProperty(r,"sciencedirect",miniHash(o))}else if(e.science)(doi=noParamUrl(t).split("/doi/")[1]).startsWith("10.")||(doi=doi.split("/").slice(1).join("/")),a=findPaperForProperty(r,"science",miniHash(doi));else if(e.frontiers)doi=noParamUrl(t).split("/articles/")[1].split("/").slice(0,-1).join("/"),a=findPaperForProperty(r,"frontiers",miniHash(doi));else if(e.ihep)a=t.includes("/literature/")?(i=noParamUrl(t).match(/\/literature\/(\d+)/)[1],findPaperForProperty(r,"ihep",i)):(o=noParamUrl(t).split("/files/")[1].split("/")[0],findPaperForProperty(r,"ihep",o,"pdfLink"));else if(e.plos){let e=t.split("?id=").last().split("&")[0];a=findPaperForProperty(r,"plos",miniHash(e))}else if(e.rsc){i=noParamUrl(t).replace("/unauth","").split("/").last();a=findPaperForProperty(r,"rsc",miniHash(i))}else if(e.mdpi){o=noParamUrl(t.split("mdpi.com/")[1].split("/pdf")[0].split("/reprints")[0].split("/notes")[0]);a=findPaperForProperty(r,"mdpi",miniHash(o))}else if(e.oup){t=noParamUrl(t).split("https://academic.oup.com/").last();i=(t=isPdfUrl(t)?t.split("/").slice(0,-1).join("/"):t).split("/").slice(2).join("");a=findPaperForProperty(r,"oup",miniHash(i))}else if(e.hal){o=(t=noParamUrl(t).replace(/(hal\.science\/\w+-\d+)(v\d+)?((\/document|\/file\/.+\.pdf))?/,"$1")).split("/").last();a=findPaperForProperty(r,"hal",miniHash(o))}else if(e.chemrxiv)chemRxivId=chemRxivId=isPdfUrl(t)?t.split("/item/")[1].split("/")[0]:noParamUrl(t).split("/").last(),a=findPaperForProperty(r,"chemrxiv",miniHash(chemRxivId));else if(e.cell)t=(await findCellPii(t)).url,a=findPaperForProperty(r,"cell",miniHash(t.split("cell.com/")[1]));else if(e.localFile)a=e.localFile;else{if(!e.parsedWebsite)throw new Error("`parseIdFromUrl` failed, unknown paper url. Is: "+JSON.stringify(e));a=e.parsedWebsite.id}return a},isKnownLocalFile=e=>{if(!e.startsWith("file://"))return!1;if(!e.endsWith(".pdf"))return!1;let t=decodeURIComponent(e).replace("file://","");var a=Object.entries(global.state.files).filter(([,e])=>e.filename===t);if(0({title:miniHash(e.title),id:e.id})).filter(e=>r.includes(e.title));return 0!==a.length&&a[0].id},makeMdLink=(e,t={})=>{var a=(t.checkPreferPdf?paperToPDF:paperToAbs)(e);let r="",i=(!t.checkMdYearVenue||(r=(r=e.note.match(/(.+)\s*@\s*([\w\s]+\(?\d{4}\)?)/i))&&r[2]?.replace(/\s+/g," ").replace(/[\(\)]/g,""))||(r="",e.venue&&(r+=e.venue+" "),r+=e.year),e.title);return`[${i=r?`${i} (${r.replace(/\s+/g," ")})`:i}](${a})`},duration=("undefined"!=typeof module&&null!=module.exports&&((dummyModule=module).exports={isPaper:isPaper,isSourceURL:isSourceURL,paperToAbs:paperToAbs,paperToPDF:paperToPDF,findLocalFile:findLocalFile,matchPapersToFiles:matchPapersToFiles,matchAllFilesToPapers:matchAllFilesToPapers,mergePapers:mergePapers,updatePaperVisits:updatePaperVisits,addOrUpdatePaper:addOrUpdatePaper,findPaperForProperty:findPaperForProperty,parseIdFromUrl:parseIdFromUrl,isKnownLocalFile:isKnownLocalFile,makeMdLink:makeMdLink}),e=>(Date.now()-e[0])/1e3),initState=async({papers:e,isContentScript:t,print:a=!0}={})=>{var r=[],i=(r.unshift(Date.now()),a&&consoleHeader("PaperMemory Init "+String.fromCodePoint("0x2705")),e||(e=await getStorage("papers")??{},a&&log("Time to retrieve stored papers (s): "+duration(r))),r.unshift(Date.now()),global.state.dataVersion=getManifestDataVersion(),a&&log("Time to parse data version (s): "+duration(r)),r.unshift(Date.now()),weeklyBackup(),a&&log("Time to backup papers (weekly) (s): "+duration(r)),r.unshift(Date.now()),await migrateData(e,global.state.dataVersion));a&&log("Time to migrate data (s): "+duration(r)),r.unshift(Date.now()),e=i.papers,global.state.papers=e,global.state.prefs=await getPrefs(),a&&log("Time to retrieve user preferences (s): "+duration(r)),r.unshift(Date.now()),global.state.ignoreSources=await getStorage("ignoreSources")??{},a&&log("Time to retrieve sources to ignore (s): "+duration(r)),r.unshift(Date.now()),global.state.urlHashToId=await getStorage("urlHashToId")??{},a&&log("Time to retrieve sources to urlHashToId (s): "+duration(r)),r.unshift(Date.now()),global.state.titleHashToIds=makeTitleHashToIdList(e),a&&log("Time to hash titles (s): "+duration(r)),r.unshift(Date.now()),t||(global.state.files=await matchAllFilesToPapers(),a&&log("Time to match all local files (s): "+duration(r)),r.unshift(Date.now()),global.state.papersList=Object.values(cleanPapers(e)),global.state.sortKey="lastOpenDate",global.state.papersReady=!0,sortMemory(),a&&log("Time to sort memory (s): "+duration(r)),r.unshift(Date.now()),makeTags(),a&&log("Time to make tags (s): "+duration(r)),r.unshift(Date.now())),info("State init duration (s): "+(Date.now()-r.last())/1e3),a&&console.groupEnd(),(async()=>{var e=chrome.runtime.getURL("src/data/cell.json"),e=await fetch(e).then(e=>e.json());global.state.cellJournalData=e})()},sortMemory=()=>{global.state.sortedPapers=Object.values(cleanPapers(global.state.papers)),global.state.sortedPapers.sort(orderPapers(0<=global.descendingSortKeys.indexOf(global.state.sortKey))),global.state.papersList.sort(orderPapers(0<=global.descendingSortKeys.indexOf(global.state.sortKey)))},orderPapers=i=>(e,t)=>{let a=e[global.state.sortKey],r=t[global.state.sortKey];return void 0===a&&(a=""),void 0===r&&(r=""),"string"==typeof a&&(a=a.toLowerCase(),r=r.toLowerCase()),i?a>r?-1:1:a>r?1:-1},makeTags=()=>{var e,t=new Set;for(e of global.state.sortedPapers)for(var a of e.tags)t.add(a);global.state.paperTags=[...t],global.state.paperTags.sort()},getExamplePaper=async e=>{var t=await getStorage("papers")??{},a=Object.keys(t).filter(e=>-1===e.indexOf("__")).reverse();let r=t[a[e=void 0===e?getRandomInt(a.length):e]];return r=void 0===r?{title:"Dummy title",author:"Cool Author and Great Author and Complicated Name Àuthor",year:2021,id:"NoneXiv-214324",bibtex:"@Nonesense{}",tags:["t1","t2"],note:"Thispaperdoesnotexist.com"}:r},stateTitleFunction=e=>{let t=e;return"string"==typeof e&&void 0===(t=global.state.papers[e])?(log("Error in stateTitleFunction: unknown id",e),"Unknown ID"):global.state.titleFunction(t).replaceAll("\n"," ").replace(/\s\s+/g," ")},updateDuplicatedUrls=(t,a,e=!1)=>{if(e){let e;if((e=t?[miniHash(t)]:Object.keys(global.state.urlHashToId).filter(e=>global.state.urlHashToId[e]===a))&&e.length){for(var r of e)warn("Removing duplicated url",t,"for",a),delete global.state.urlHashToId[r];setStorage("urlHashToId",global.state.urlHashToId)}}else global.state.urlHashToId[miniHash(t)]=a,setStorage("urlHashToId",global.state.urlHashToId)},addPaperToTitleHashToId=e=>{var t=e.id,e=miniHash(e.title);global.state.titleHashToIds.hasOwnProperty(e)||(global.state.titleHashToIds[e]=[]),global.state.titleHashToIds[e].includes(t)||global.state.titleHashToIds[e].push(t)},readJournalAbbreviations=async()=>{var e,t;global.journalAbbreviations||(e=chrome.runtime.getURL("src/data/iso4-journals.json"),e=await fetch(e).then(e=>e.json()),t=chrome.runtime.getURL("src/data/journal-abbreviations.json"),t=await fetch(t).then(e=>e.json()),global.journalAbbreviations=Object.fromEntries([...Object.entries(e),...Object.entries(t)].map(([e,t])=>[miniHash(e),t])))},downloadPaperPdf=async e=>{if(!global.state.papersReady)throw new Error("[PM] State is not ready (downloadPaperPdf)");let t=stateTitleFunction(e);t=(t=t.replaceAll(":"," ")).replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,\/:;<=>?@\[\]^`{|}~]/g," ").replace(/\s+/g," "),global.state.prefs.checkStore&&(t="PaperMemoryStore/"+t,0===(await getStoredFiles()).length)&&chrome.downloads.download({url:URL.createObjectURL(new Blob([global.storeReadme])),filename:"PaperMemoryStore/IMPORTANT_README.txt",saveAs:!1}),(t=t.endsWith("pdf")?t.slice(0,-3)+".pdf":t).endsWith(".pdf")||(t+=".pdf"),log("Downloading paper",e,"to",t),chrome.downloads.download({url:paperToPDF(e),filename:t})},decodeHtml=("undefined"!=typeof module&&null!=module.exports&&((dummyModule=module).exports={duration:duration,initState:initState,sortMemory:sortMemory,orderPapers:orderPapers,makeTags:makeTags,getExamplePaper:getExamplePaper,stateTitleFunction:stateTitleFunction,updateDuplicatedUrls:updateDuplicatedUrls,addPaperToTitleHashToId:addPaperToTitleHashToId,readJournalAbbreviations:readJournalAbbreviations,downloadPaperPdf:downloadPaperPdf}),e=>{var t=document.createElement("textarea");return t.innerHTML=e,t.value}),flipAuthor=e=>e.split(", ").reverse().join(" "),flipAndAuthors=e=>e.split(" and ").map(flipAuthor).join(" and "),fetchArxivXML=async e=>{e=e.replace("Arxiv-","").replace("_","/");return fetch("https://export.arxiv.org/api/query?"+new URLSearchParams({id_list:e}))},fetchCvfHTML=async e=>{let t,a;var r;return t=e.endsWith(".pdf")?e.replace("/papers_backup/","/papers/").replace("/papers/","/html/").replace(".pdf",".html"):e,!(a=await fetch(t).then(e=>e.ok?e.text():""))&&t.includes("thecvf.com/content_")&&({conf:e,year:r}=parseCVFUrl(e),t=t.replace(`/content_${e}_${r}/`,`/content_${e.toLowerCase()}_${r}/`),a=await fetch(t).then(e=>e.ok?e.text():"")),a},getOpenReviewNoteJSON=e=>sendMessageToBackground({type:"OpenReviewNoteJSON",url:e}),getOpenReviewForumJSON=e=>sendMessageToBackground({type:"OpenReviewForumJSON",url:e}),fetchDom=async e=>{e=await fetch(e).then(e=>e.ok?e.text():"");return(new DOMParser).parseFromString(e.replaceAll("\n",""),"text/html")},fetchText=async e=>{try{var t=await fetch(e);return(t.ok?await t.text():"").trim()}catch(e){return logError("fetchText error:",e),""}},fetchJSON=async e=>{try{var t=await fetch(e),a=t.status;return{data:t.ok?await t.json():null,status:a}}catch(e){return logError("fetchJSON error:",e),{}}},fetchBibtex=async({url:e,doi:t})=>{let a;if(e&&t)throw new Error("fetchBibtex: both url and doi provided");if(t)a=await fetchText(`https://citation.doi.org/format?doi=${t}&style=bibtex&lang=en-US`);else{if(!e)throw new Error("fetchBibtex: no url or doi provided");a=await fetchText(e)}t=bibtexToObject(a);return delete t.abstract,a=bibtexToString(t),t.bibtex=a,t.key=t.citationKey,t.journal&&(t.venue=t.journal,t.note=`Published in ${t.journal} (${t.year})`),t},extractCrossrefData=e=>{if(e.status&&"ok"===e.status)if("work"!==e["message-type"])error("Unknown `message-type` from CrossRef",e);else{var t=e.message,a=(log("Crossref data.message: ",t),t.author.map(e=>e.given+" "+e.family).join(" and ")),r=t.issued?t.issued["date-parts"][0][0]+"":t.published?t.published["date-parts"][0][0]+"":null;if(r){var i,o,n,s=t.title[0];if(s)return i=t["container-title"][0]??"Springer",n=[miniHash(t.author[0].family),r.slice(2),firstNonStopLowercase(s)].join(""),o=t.DOI,n={entryType:"book"===t.type?"book":"book-chapter"===t.type?"InBook":t.type.includes("article")?"Article":"InProceedings",citationKey:n,publisher:t.publisher,author:a,title:s,year:r,doi:o},t.page&&(n.pages=t.page),t.volume&&(n.volume=t.volume),t.type.includes("journal")&&(n.journal=i),t.link&&0"application/pdf"===e["content-type"]))&&(n.pdf=a.URL),s=t.link.find(e=>"text/html"===e["content-type"])??t.link[0])&&(n.url=s.URL),r=bibtexToString(n),{...n,bibtex:r,venue:i};error("Cannot find title in CrossRef data",t)}else error("Cannot find year in CrossRef data",t)}else error("Cannot parse CrossRef response",e)},fetchCrossRefDataForDoi=async e=>{var{data:e,status:t}=await fetchJSON(`https://api.crossref.org/works/${e}?mailto=schmidtv%40mila.quebec`);return{data:extractCrossrefData(e),status:t}},fetchSemanticScholarDataForDoi=async e=>{var t,e=(await fetchJSON(`https://api.semanticscholar.org/graph/v1/paper/${e}?fields=venue,year,authors,title`)).data;let a;return e&&(a={},e.venue&&(a.venue=e.venue),e.year&&(a.year=e.year),e.authors&&(a.author=e.authors.map(e=>e.name).join(" and ")),e.title&&(a.title=e.title),e=""+miniHash(e.authors[0].name)+firstNonStopLowercase(a.title),t=bibtexToString({entryType:"article",citationKey:e,...a}),a.bibtex=t,a.key=e),a},getDCPatterns=e=>{let t=e.slice(3);var e=["dc.","DC:","DC.","dc:"].map(e=>e+t.toLowerCase()),a=["dc.","DC:","DC.","dc:"].map(e=>e+t.capitalize());return[...e,...a]},getMetaContent=({selector:a,dom:t,all:e=!1,pure:r=!1})=>{let i="";for(let[t,e]of Object.entries(a))/dc\W/.test(e.toLowerCase())?i+=getDCPatterns(e).map(e=>`meta[${t}='${e}']`).join(","):i+=`meta[${t}='${e}']`;if(e){let e=queryAll(i,t).map(e=>e.getAttribute("content")??"");return r?e:e.map(spaceCamelCase).map(toSingleSpace)}let o=t.querySelector(i)?.getAttribute("content")??"";return r?o:toSingleSpace(spaceCamelCase(o))},extractDataFromDCMetaTags=e=>{var t,a,r,i,o,n,s=getMetaContent({selector:{name:"dc.Creator"},dom:e,all:!0}).join(" and ")||getMetaContent({selector:{name:"citation_author"},dom:e,all:!0}).join(" and ");return s?(t=(getMetaContent({selector:{name:"dc.Date"},dom:e})||getMetaContent({selector:{name:"citation_publication_date"},dom:e})).split("-")[0].split("/")[0],a=getMetaContent({selector:{name:"dc.Publisher"},dom:e}).replaceAll("\n"," ")||getMetaContent({selector:{property:"og:site_name"},dom:e,pure:!0}),r=getMetaContent({selector:{name:"dc.Title"},dom:e})||getMetaContent({selector:{name:"citation_title"},dom:e}),i=getMetaContent({selector:{name:"citation_journal_title"},dom:e}),o=getMetaContent({selector:{name:"citation_pdf_url"},dom:e,pure:!0}),e=getMetaContent({selector:{scheme:"doi"},dom:e})||getMetaContent({selector:{name:"citation_doi"},dom:e}),n=(""+s.split(" and ")[0].split(" ").find((e,t)=>1<=t&&1{var e=arxivIdFromURL(e),t=await(await fetchArxivXML(e)).text(),t=(new DOMParser).parseFromString(t.replaceAll("\n",""),"text/xml"),a=queryAll("author name",t).map(e=>e.innerHTML),r=a.join(" and "),i=[...t.getElementsByTagName("link")].map(e=>e.getAttribute("href")).filter(e=>e.includes("arxiv.org/pdf/"))[0].replace(/v\d+(\.pdf)?$/gi,".pdf"),o=(o=t.querySelector("entry title"))?.textContent||o?.innerText||"",t=t.querySelector("entry published").innerHTML.slice(0,4),a=a[0].split(" ").last().toLowerCase()+t+firstNonStopLowercase(o),n="Arxiv-"+e.replace("/","_"),s="";return{author:r,bibtex:s+`@article{${a}, `+` title={${o} }, `+` author={${r} }, `+` year={${t}}, @@ -180,4 +180,4 @@ Fix the json file and try again. year = {${i}}, url = {${t}}, note = {Accessed ${(new Date).toISOString().split("T")[0]}} - }`;return{author:r,bibtex:bibtexToString(bibtexToObject(t)),id:o,key:e,note:n,pdfLink:s,title:a,venue:"",year:i}},makeMDPIPaper=async e=>{(e=(e=(e=noParamUrl(e)).split("/").last().startsWith("pdf")?e.split("/").slice(0,-1).join("/"):e).endsWith("/notes")?e.replace("/notes",""):e).endsWith("/reprints")&&(e=e.replace("/reprints",""));var t=await fetchDom(e),{author:t,year:a,title:r,venue:i,key:o,doi:n,bibtex:s,note:l,pdfLink:p}=extractDataFromDCMetaTags(t);return{author:t,bibtex:s,id:`MDPI-${a}_`+miniHash(e.split("mdpi.com/")[1]),key:o,note:l,pdfLink:p,title:r,venue:i,year:a,doi:n}},makeOUPPaper=async e=>{var t=(e=noParamUrl(e)).split("/").last(),t=await fetchText(`https://academic.oup.com/Citation/Download?resourceId=${t}&resourceType=3&citationFormat=2`),a=bibtexToObject(t),{title:a,year:r,author:i,journal:o,doi:n,citationKey:s,eprint:l}=(delete a.abstract,t=bibtexToString(a),a),i=flipAndAuthors(i),p=`Published @ ${o} (${r})`,c=e.split("https://academic.oup.com/")[1].split("/").slice(2).join("");return{author:i,bibtex:t,id:`OUP-${r}_`+miniHash(c),key:s,note:p,pdfLink:l?.replaceAll("\\","")??e,title:a,venue:o,year:r,doi:n}},makerHALPaper=async e=>{var t=(e=noParamUrl(e).replace(/(hal\.science\/\w+-\d+)(v\d+)?(\/document)?/,"$1")).split("/").last(),a=`https://hal.science/${t}/bibtex`,a=await fetchText(a),r=bibtexToObject(a),{title:i,year:o,journal:n,author:s,doi:l,pdf:p}=r,c=n?`Published @ ${n} (${o})`:"",r=r.citationKey;return{author:flipAndAuthors(s),bibtex:bibtexToString(a),id:`HAL-${o}_`+miniHash(t),key:r,note:c,pdfLink:p??e,title:i,venue:n,year:o,doi:l}},makeChemRxivPaper=async e=>{let t,a=e;isPdfUrl(e)?(t=e.split("/item/")[1].split("/")[0],a="https://chemrxiv.org/engage/chemrxiv/article-details/"+t):t=noParamUrl(e).split("/").last();var e=await fetchDom(a),{author:e,year:r,title:i,venue:o,key:n,doi:s,bibtex:l,pdfLink:p,note:c}=extractDataFromDCMetaTags(e);return{author:e,bibtex:l,id:`ChemRxiv-${r}_`+miniHash(t),key:n,note:c,pdfLink:p,title:i,venue:o,year:r,doi:s}},findCellPii=async e=>{var t=e.toLowerCase().includes("showpdf"),i=e.toLowerCase().includes("pdfextended");let o;if(t||i){i=global.state.cellJournalData;let a=(o=t?new URL(e).searchParams.get("pii"):e.split("/").last()).match(/\d{4}-\d{3}[0-9X]/g)[0],r;Object.entries(i).forEach(([e,t])=>{t.issn.includes(a)&&(r=e)});i=r.split(" ").map(e=>e.toLowerCase()).join("-");e=(e=t?noParamUrl(e).split("/showPdf")[0]+(`/${i}/fulltext/`+o):noParamUrl(e).split("/pdfExtended")[0]+("/fulltext/"+o)).replace("/action/","/")}else o=noParamUrl(e).split("/").last();return{pii:o,url:e}},makeCellPaper=async e=>{({pii:t,url:e}=await findCellPii(e));var t="https://www.cell.com/action/showPdf?pii="+t,a=(await fetchDom(e)).head.querySelector('meta[name="citation_doi"]').getAttribute("content"),{author:r,year:i,title:o,venue:n,bibtex:s,note:l,citationKey:p}=await fetchBibtex({doi:a});return{author:r,bibtex:s,id:`Cell-${i}_`+miniHash(e.split("cell.com/")[1]),key:p,note:l,pdfLink:t,title:o,venue:n,year:i,doi:a}},tryPWCMatch=async e=>{let t;var a={type:"papersWithCode",pwcPrefs:await getStorage("pwcPrefs")??{},paper:e},{url:a,note:r,venue:i,pubYear:o}=await sendMessageToBackground(a)??{};return a&&!e.codeLink?log("[PapersWithCode] Discovered a code repository:",a):log("[PapersWithCode] No code repository found"),i&&!e.venue?(log("[PapersWithCode] Found a publication venue:",i),e=bibtexToObject(e.bibtex),t=bibtexToString({...e,year:o,journal:i})):log("[PapersWithCode] No publication found"),{codeLink:a,note:r,venue:i,bibtex:t}},tryCrossRef=async(e,t)=>{if(t)return sendMessageToBackground({type:"try-cross-ref",paper:e});try{var a="https://api.crossref.org/works?rows=1&mailto=schmidtv%40mila.quebec&select=event%2Ctitle&query.title="+encodeURI(e.title),r=await fetch(a).then(e=>e.json());if("ok"!==r.status)return log(`[Crossref] ${a} returned `+r.message.status),{};if(0===r.message.items.length)return{};if(r.message.items[0].title[0]?.toLowerCase().replaceAll("\n"," ").replaceAll(/\s\s+/g," ")!==e.title.toLowerCase().replaceAll("\n"," ").replaceAll(/\s\s+/g," "))return{};if(!r.message.items[0].event||!r.message.items[0].event.name)return{};info("Found a CrossRef match");var i=r.message.items[0].event.name.trim();return{venue:i,note:`Accepted @ ${i} -- [crossref.org]`}}catch(e){return logError("[Crossref]",e),{}}},tryDBLP=async(e,t)=>{if(t)return sendMessageToBackground({type:"try-dblp",paper:e});try{var a=encodeURI(e.title),r=await fetch(`https://dblp.org/search/publ/api?q=${a}&format=json`);if(429===r.status)return{status:429};var i,o,n,s,l,p=await r.json();if(p.result&&p.result.hits&&p.result.hits.hit&&p.result.hits.hit.length)for(i of p.result.hits.hit.sort((e,t)=>parseInt(e.info.year,10)-parseInt(t.info.year,10)))if(decodeHtml(i.info.title?.toLowerCase().replaceAll("\n"," ").replaceAll(".","").replaceAll(/\s\s+/g," "))===e.title.toLowerCase().replaceAll("\n"," ").replaceAll(".","").replaceAll(/\s\s+/g," ")&&"CoRR"!==i.info.venue)return info("Found a DBLP match"),o=await fetchText(i.info.url+".bib"),n=miniHash(i.info.venue),await readJournalAbbreviations(),s=(global.journalAbbreviations[n]??i.info.venue).trim(),l=i.info.year,i.info.url,{venue:s,note:`Accepted @ ${s} ${l} -- [dblp.org]`,bibtex:o};return{}}catch(e){return logError("[DBLP]",e),{}}},trySemanticScholar=async(t,e)=>{if(e)return sendMessageToBackground({type:"try-semantic-scholar",paper:t});try{var{data:a,status:r}=await fetchJSON(`https://api.semanticscholar.org/graph/v1/paper/search?query=${encodeURI(t.title)}&fields=title,venue,year,authors,externalIds,url&limit=5`);if(a&&a.data&&0e.name).join(" and "),l=i.externalIds.DOI,p=bibtexToString({entryType:"article",citationKey:miniHash(i.authors[0].name.split(" ").last())+o+firstNonStopLowercase(t.title),title:t.title,author:s,journal:e,year:o,doi:l,bibSource:"Semantic Scholar "+i.url});return{venue:e,note:n,bibtex:p,status:r}}return{status:r}}catch(e){logError("[SemanticScholar]",e)}return{status:404}},tryGoogleScholar=async e=>{e=await sendMessageToBackground({type:"google-scholar",paper:e});return e.note&&info("Found a Google Scholar match",e.note),e},tryUnpaywall=async(t,e)=>{if(e)return sendMessageToBackground({type:"try-unpaywall",paper:t});var e=`https://api.unpaywall.org/v2/search?query=${encodeURI(t.title)}&is_oa=true&email=papermemory+${parseInt(1e3*Math.random())}@gmail.com`,{data:e,status:a}=await fetchJSON(e);if(e&&200===a){var r,e=e.results?.find(e=>miniHash(e.response.title)===miniHash(t.title));if(e&&e.journal_name)return{venue:r=e.journal_name,note:`Accepted @ ${r} (${e.year}) -- [unpaywall.org]`,doi:e.doi}}return{status:a}},tryPreprintMatch=async(e,t=!1)=>{let a,r,i,o,n;var s,l,p={},c=["GoogleScholar","SemanticScholar","CrossRef","DBLP","Unpaywall"],d=[silentPromiseTimeout(tryGoogleScholar(e)),silentPromiseTimeout(trySemanticScholar(e,!0)),silentPromiseTimeout(tryCrossRef(e)),silentPromiseTimeout(tryDBLP(e)),silentPromiseTimeout(tryUnpaywall(e))];t&&(d.push(silentPromiseTimeout(tryPWCMatch(e))),c.push("PapersWithCode"));for([s,l]of Object.entries(c)){if(p[l]=await d[s],{note:a,venue:r,bibtex:i,doi:n}=p[l]??{},a)break;log(`[${l}] No publication found`)}return t&&(p.hasOwnProperty(c="PapersWithCode")||(p[c]=await d[c]),p[c].codeLink)&&!e.codeLink&&(o=p[c].codeLink),{note:a,venue:r,bibtex:i,code:o,doi:n}},initPaper=async e=>{for(var t in e.note||(e.note=""),e.md=`[${e.title}](${e.pdfLink})`,e.tags=[],e.codeLink=e.codeLink??"",e.favorite=!1,e.favoriteDate="",e.addDate=(new Date).toJSON(),e.lastOpenDate=e.addDate,e.count=1,e.code={},e.doi=e.doi??bibtexToObject(e.bibtex).doi??"",e)e.hasOwnProperty(t)&&"string"==typeof e[t]&&(e[t]=e[t].trim());return e=await autoTagPaper(e),validatePaper(e),e},autoTagPaper=async a=>{try{var e,r,i=await getStorage("autoTags");if(i&&i.length){let t=new Set;for(var o of i)o.tags?.length&&(o.title||o.author)&&(e=!o.title||new RegExp(o.title,"i").test(a.title),r=!o.author||new RegExp(o.author,"i").test(a.author),e)&&r&&o.tags.forEach(e=>t.add(e));a.tags=[...t].sort(),a.tags.length&&log("Automatically adding tags:",a.tags)}return a}catch(e){return log("Error auto-tagging:",e),log("Paper:",a),a}},makePaper=async(e,t,a=!1)=>{let r;var i=performance.now();if(info("Making paper..."),a)(r=await makeWebsitePaper(a))&&(r.source="website");else if(e.arxiv)(r=await makeArxivPaper(t))&&(r.source="arxiv");else if(e.neurips)(r=await makeNeuripsPaper(t))&&(r.source="neurips");else if(e.cvf)(r=await makeCVFPaper(t))&&(r.source="cvf");else if(e.openreview)(r=await makeOpenReviewPaper(t))&&(r.source="openreview");else if(e.biorxiv)(r=await makeBioRxivPaper(t))&&(r.source="biorxiv");else if(e.pmlr)(r=await makePMLRPaper(t))&&(r.source="pmlr");else if(e.acl)(r=await makeACLPaper(t))&&(r.source="acl");else if(e.pnas)(r=await makePNASPaper(t))&&(r.source="pnas");else if(e.nature)(r=await makeNaturePaper(t))&&(r.source="nature");else if(e.acs)(r=await makeACSPaper(t))&&(r.source="acs");else if(e.iop)(r=await makeIOPPaper(t))&&(r.source="iop");else if(e.jmlr)(r=await makeJMLRPaper(t))&&(r.source="jmlr");else if(e.pmc)(r=await makePMCPaper(t))&&(r.source="pmc");else if(e.ijcai)(r=await makeIJCAIPaper(t))&&(r.source="ijcai");else if(e.acm)(r=await makeACMPaper(t))&&(r.source="acm");else if(e.ieee)(r=await makeIEEEPaper(t))&&(r.source="ieee");else if(e.springer)(r=await makeSpringerPaper(t))&&(r.source="springer");else if(e.aps)(r=await makeAPSPaper(t))&&(r.source="aps");else if(e.wiley)(r=await makeWileyPaper(t))&&(r.source="wiley");else if(e.sciencedirect)(r=await makeScienceDirectPaper(t))&&(r.source="sciencedirect");else if(e.science)(r=await makeSciencePaper(t))&&(r.source="science");else if(e.frontiers)(r=await makeFrontiersPaper(t))&&(r.source="frontiers");else if(e.ihep)(r=await makeIHEPPaper(t))&&(r.source="ihep");else if(e.plos)(r=await makePLOSPaper(t))&&(r.source="plos");else if(e.rsc)(r=await makeRSCPaper(t))&&(r.source="rsc");else if(e.mdpi)(r=await makeMDPIPaper(t))&&(r.source="mdpi");else if(e.oup)(r=await makeOUPPaper(t))&&(r.source="oup");else if(e.hal)(r=await makerHALPaper(t))&&(r.source="hal");else if(e.chemrxiv)(r=await makeChemRxivPaper(t))&&(r.source="chemrxiv");else{if(!e.cell)throw console.error({is:e,url:t}),new Error("Could not parse paper (in `makePaper`). Unknown paper source, see above.");(r=await makeCellPaper(t))&&(r.source="cell")}if(void 0!==r)return a=(performance.now()-i)/1e3,info(`Paper parsed in ${a.toFixed(2)}s`),initPaper(r)},findFuzzyPaperMatch=(e,t)=>{t=miniHash(t.title);return e.hasOwnProperty(t)?(e=e[t]).find(t=>!global.preprintSources.some(e=>t.toLowerCase().startsWith(e)))||e[0]:null};"undefined"!=typeof module&&null!=module.exports&&((dummyModule=module).exports={decodeHtml:decodeHtml,flipAuthor:flipAuthor,flipAndAuthors:flipAndAuthors,fetchArxivXML:fetchArxivXML,fetchCvfHTML:fetchCvfHTML,getOpenReviewNoteJSON:getOpenReviewNoteJSON,getOpenReviewForumJSON:getOpenReviewForumJSON,fetchDom:fetchDom,fetchText:fetchText,fetchJSON:fetchJSON,fetchBibtex:fetchBibtex,extractCrossrefData:extractCrossrefData,fetchCrossRefDataForDoi:fetchCrossRefDataForDoi,fetchSemanticScholarDataForDoi:fetchSemanticScholarDataForDoi,getMetaContent:getMetaContent,extractDataFromDCMetaTags:extractDataFromDCMetaTags,makeArxivPaper:makeArxivPaper,makeNeuripsPaper:makeNeuripsPaper,makeCVFPaper:makeCVFPaper,makeOpenReviewBibTex:makeOpenReviewBibTex,extractAPIv2ContentValue:extractAPIv2ContentValue,makeOpenReviewPaper:makeOpenReviewPaper,makeBioRxivPaper:makeBioRxivPaper,makePMLRPaper:makePMLRPaper,findACLValue:findACLValue,makeACLPaper:makeACLPaper,makePNASPaper:makePNASPaper,makeNaturePaper:makeNaturePaper,makeACSPaper:makeACSPaper,makeIOPPaper:makeIOPPaper,makeJMLRPaper:makeJMLRPaper,makePMCPaper:makePMCPaper,makePubMedPaper:makePubMedPaper,makeIJCAIPaper:makeIJCAIPaper,makeACMPaper:makeACMPaper,makeIEEEPaper:makeIEEEPaper,makeSpringerPaper:makeSpringerPaper,makeAPSPaper:makeAPSPaper,makeWileyPaper:makeWileyPaper,makeScienceDirectPaper:makeScienceDirectPaper,makeSciencePaper:makeSciencePaper,makeFrontiersPaper:makeFrontiersPaper,makeIHEPPaper:makeIHEPPaper,makePLOSPaper:makePLOSPaper,makeRSCPaper:makeRSCPaper,makeWebsitePaper:makeWebsitePaper,makeMDPIPaper:makeMDPIPaper,makeOUPPaper:makeOUPPaper,makerHALPaper:makerHALPaper,tryPWCMatch:tryPWCMatch,tryCrossRef:tryCrossRef,tryDBLP:tryDBLP,trySemanticScholar:trySemanticScholar,tryGoogleScholar:tryGoogleScholar,tryUnpaywall:tryUnpaywall,tryPreprintMatch:tryPreprintMatch,initPaper:initPaper,autoTagPaper:autoTagPaper,makePaper:makePaper,findFuzzyPaperMatch:findFuzzyPaperMatch}); \ No newline at end of file + }`;return{author:r,bibtex:bibtexToString(bibtexToObject(t)),id:o,key:e,note:n,pdfLink:s,title:a,venue:"",year:i}},makeMDPIPaper=async e=>{(e=(e=(e=noParamUrl(e)).split("/").last().startsWith("pdf")?e.split("/").slice(0,-1).join("/"):e).endsWith("/notes")?e.replace("/notes",""):e).endsWith("/reprints")&&(e=e.replace("/reprints",""));var t=await fetchDom(e),{author:t,year:a,title:r,venue:i,key:o,doi:n,bibtex:s,note:l,pdfLink:p}=extractDataFromDCMetaTags(t);return{author:t,bibtex:s,id:`MDPI-${a}_`+miniHash(e.split("mdpi.com/")[1]),key:o,note:l,pdfLink:p,title:r,venue:i,year:a,doi:n}},makeOUPPaper=async e=>{var t=(e=noParamUrl(e)).split("/").last(),t=await fetchText(`https://academic.oup.com/Citation/Download?resourceId=${t}&resourceType=3&citationFormat=2`),a=bibtexToObject(t),{title:a,year:r,author:i,journal:o,doi:n,citationKey:s,eprint:l}=(delete a.abstract,t=bibtexToString(a),a),i=flipAndAuthors(i),p=`Published @ ${o} (${r})`,c=e.split("https://academic.oup.com/")[1].split("/").slice(2).join("");return{author:i,bibtex:t,id:`OUP-${r}_`+miniHash(c),key:s,note:p,pdfLink:l?.replaceAll("\\","")??e,title:a,venue:o,year:r,doi:n}},makerHALPaper=async e=>{var t=(e=noParamUrl(e).replace(/(hal\.science\/\w+-\d+)(v\d+)?(\/document)?/,"$1")).split("/").last(),a=`https://hal.science/${t}/bibtex`,a=await fetchText(a),r=bibtexToObject(a),{title:i,year:o,journal:n,author:s,doi:l,pdf:p}=r,c=n?`Published @ ${n} (${o})`:"",r=r.citationKey;return{author:flipAndAuthors(s),bibtex:bibtexToString(a),id:`HAL-${o}_`+miniHash(t),key:r,note:c,pdfLink:p??e,title:i,venue:n,year:o,doi:l}},makeChemRxivPaper=async e=>{let t,a=e;isPdfUrl(e)?(t=e.split("/item/")[1].split("/")[0],a="https://chemrxiv.org/engage/chemrxiv/article-details/"+t):t=noParamUrl(e).split("/").last();var e=await fetchDom(a),{author:e,year:r,title:i,venue:o,key:n,doi:s,bibtex:l,pdfLink:p,note:c}=extractDataFromDCMetaTags(e);return{author:e,bibtex:l,id:`ChemRxiv-${r}_`+miniHash(t),key:n,note:c,pdfLink:p,title:i,venue:o,year:r,doi:s}},findCellPii=async e=>{var t=e.toLowerCase().includes("showpdf"),i=e.toLowerCase().includes("pdfextended");let o;if(t||i){for(;!global.state.cellJournalData;)console.log("Waiting for cell journal data..."),await sleep(5);i=global.state.cellJournalData;let a=(o=t?new URL(e).searchParams.get("pii"):e.split("/").last()).match(/\d{4}-\d{3}[0-9X]/g)[0],r;Object.entries(i).forEach(([e,t])=>{t.issn.includes(a)&&(r=e)});i=r.split(" ").map(e=>e.toLowerCase()).join("-");e=(e=t?noParamUrl(e).split("/showPdf")[0]+(`/${i}/fulltext/`+o):noParamUrl(e).split("/pdfExtended")[0]+("/fulltext/"+o)).replace("/action/","/")}else o=noParamUrl(e).split("/").last();return{pii:o,url:e}},makeCellPaper=async e=>{({pii:t,url:e}=await findCellPii(e));var t="https://www.cell.com/action/showPdf?pii="+t,a=(await fetchDom(e)).head.querySelector('meta[name="citation_doi"]').getAttribute("content"),{author:r,year:i,title:o,venue:n,bibtex:s,note:l,citationKey:p}=await fetchBibtex({doi:a});return{author:r,bibtex:s,id:`Cell-${i}_`+miniHash(e.split("cell.com/")[1]),key:p,note:l,pdfLink:t,title:o,venue:n,year:i,doi:a}},tryPWCMatch=async e=>{let t;var a={type:"papersWithCode",pwcPrefs:await getStorage("pwcPrefs")??{},paper:e},{url:a,note:r,venue:i,pubYear:o}=await sendMessageToBackground(a)??{};return a&&!e.codeLink?log("[PapersWithCode] Discovered a code repository:",a):log("[PapersWithCode] No code repository found"),i&&!e.venue?(log("[PapersWithCode] Found a publication venue:",i),e=bibtexToObject(e.bibtex),t=bibtexToString({...e,year:o,journal:i})):log("[PapersWithCode] No publication found"),{codeLink:a,note:r,venue:i,bibtex:t}},tryCrossRef=async(e,t)=>{if(t)return sendMessageToBackground({type:"try-cross-ref",paper:e});try{var a="https://api.crossref.org/works?rows=1&mailto=schmidtv%40mila.quebec&select=event%2Ctitle&query.title="+encodeURI(e.title),r=await fetch(a).then(e=>e.json());if("ok"!==r.status)return log(`[Crossref] ${a} returned `+r.message.status),{};if(0===r.message.items.length)return{};if(r.message.items[0].title[0]?.toLowerCase().replaceAll("\n"," ").replaceAll(/\s\s+/g," ")!==e.title.toLowerCase().replaceAll("\n"," ").replaceAll(/\s\s+/g," "))return{};if(!r.message.items[0].event||!r.message.items[0].event.name)return{};info("Found a CrossRef match");var i=r.message.items[0].event.name.trim();return{venue:i,note:`Accepted @ ${i} -- [crossref.org]`}}catch(e){return logError("[Crossref]",e),{}}},tryDBLP=async(e,t)=>{if(t)return sendMessageToBackground({type:"try-dblp",paper:e});try{var a=encodeURI(e.title),r=await fetch(`https://dblp.org/search/publ/api?q=${a}&format=json`);if(429===r.status)return{status:429};var i,o,n,s,l,p=await r.json();if(p.result&&p.result.hits&&p.result.hits.hit&&p.result.hits.hit.length)for(i of p.result.hits.hit.sort((e,t)=>parseInt(e.info.year,10)-parseInt(t.info.year,10)))if(decodeHtml(i.info.title?.toLowerCase().replaceAll("\n"," ").replaceAll(".","").replaceAll(/\s\s+/g," "))===e.title.toLowerCase().replaceAll("\n"," ").replaceAll(".","").replaceAll(/\s\s+/g," ")&&"CoRR"!==i.info.venue)return info("Found a DBLP match"),o=await fetchText(i.info.url+".bib"),n=miniHash(i.info.venue),await readJournalAbbreviations(),s=(global.journalAbbreviations[n]??i.info.venue).trim(),l=i.info.year,i.info.url,{venue:s,note:`Accepted @ ${s} ${l} -- [dblp.org]`,bibtex:o};return{}}catch(e){return logError("[DBLP]",e),{}}},trySemanticScholar=async(t,e)=>{if(e)return sendMessageToBackground({type:"try-semantic-scholar",paper:t});try{var{data:a,status:r}=await fetchJSON(`https://api.semanticscholar.org/graph/v1/paper/search?query=${encodeURI(t.title)}&fields=title,venue,year,authors,externalIds,url&limit=5`);if(a&&a.data&&0e.name).join(" and "),l=i.externalIds.DOI,p=bibtexToString({entryType:"article",citationKey:miniHash(i.authors[0].name.split(" ").last())+o+firstNonStopLowercase(t.title),title:t.title,author:s,journal:e,year:o,doi:l,bibSource:"Semantic Scholar "+i.url});return{venue:e,note:n,bibtex:p,status:r}}return{status:r}}catch(e){logError("[SemanticScholar]",e)}return{status:404}},tryGoogleScholar=async e=>{e=await sendMessageToBackground({type:"google-scholar",paper:e});return e.note&&info("Found a Google Scholar match",e.note),e},tryUnpaywall=async(t,e)=>{if(e)return sendMessageToBackground({type:"try-unpaywall",paper:t});var e=`https://api.unpaywall.org/v2/search?query=${encodeURI(t.title)}&is_oa=true&email=papermemory+${parseInt(1e3*Math.random())}@gmail.com`,{data:e,status:a}=await fetchJSON(e);if(e&&200===a){var r,e=e.results?.find(e=>miniHash(e.response.title)===miniHash(t.title));if(e&&e.journal_name)return{venue:r=e.journal_name,note:`Accepted @ ${r} (${e.year}) -- [unpaywall.org]`,doi:e.doi}}return{status:a}},tryPreprintMatch=async(e,t=!1)=>{let a,r,i,o,n;var s,l,p={},c=["GoogleScholar","SemanticScholar","CrossRef","DBLP","Unpaywall"],d=[silentPromiseTimeout(tryGoogleScholar(e)),silentPromiseTimeout(trySemanticScholar(e,!0)),silentPromiseTimeout(tryCrossRef(e)),silentPromiseTimeout(tryDBLP(e)),silentPromiseTimeout(tryUnpaywall(e))];t&&(d.push(silentPromiseTimeout(tryPWCMatch(e))),c.push("PapersWithCode"));for([s,l]of Object.entries(c)){if(p[l]=await d[s],{note:a,venue:r,bibtex:i,doi:n}=p[l]??{},a)break;log(`[${l}] No publication found`)}return t&&(p.hasOwnProperty(c="PapersWithCode")||(p[c]=await silentPromiseTimeout(d[c])),p[c].codeLink)&&!e.codeLink&&(o=p[c].codeLink),{note:a,venue:r,bibtex:i,code:o,doi:n}},initPaper=async e=>{for(var t in e.note||(e.note=""),e.md=`[${e.title}](${e.pdfLink})`,e.tags=[],e.codeLink=e.codeLink??"",e.favorite=!1,e.favoriteDate="",e.addDate=(new Date).toJSON(),e.lastOpenDate=e.addDate,e.count=1,e.code={},e.doi=e.doi??bibtexToObject(e.bibtex).doi??"",e)e.hasOwnProperty(t)&&"string"==typeof e[t]&&(e[t]=e[t].trim());return e=await autoTagPaper(e),validatePaper(e),e},autoTagPaper=async a=>{try{var e,r,i=await getStorage("autoTags");if(i&&i.length){let t=new Set;for(var o of i)o.tags?.length&&(o.title||o.author)&&(e=!o.title||new RegExp(o.title,"i").test(a.title),r=!o.author||new RegExp(o.author,"i").test(a.author),e)&&r&&o.tags.forEach(e=>t.add(e));a.tags=[...t].sort(),a.tags.length&&log("Automatically adding tags:",a.tags)}return a}catch(e){return log("Error auto-tagging:",e),log("Paper:",a),a}},makePaper=async(e,t,a=!1)=>{let r;var i=performance.now();if(info("Making paper..."),a)(r=await makeWebsitePaper(a))&&(r.source="website");else if(e.arxiv)(r=await makeArxivPaper(t))&&(r.source="arxiv");else if(e.neurips)(r=await makeNeuripsPaper(t))&&(r.source="neurips");else if(e.cvf)(r=await makeCVFPaper(t))&&(r.source="cvf");else if(e.openreview)(r=await makeOpenReviewPaper(t))&&(r.source="openreview");else if(e.biorxiv)(r=await makeBioRxivPaper(t))&&(r.source="biorxiv");else if(e.pmlr)(r=await makePMLRPaper(t))&&(r.source="pmlr");else if(e.acl)(r=await makeACLPaper(t))&&(r.source="acl");else if(e.pnas)(r=await makePNASPaper(t))&&(r.source="pnas");else if(e.nature)(r=await makeNaturePaper(t))&&(r.source="nature");else if(e.acs)(r=await makeACSPaper(t))&&(r.source="acs");else if(e.iop)(r=await makeIOPPaper(t))&&(r.source="iop");else if(e.jmlr)(r=await makeJMLRPaper(t))&&(r.source="jmlr");else if(e.pmc)(r=await makePMCPaper(t))&&(r.source="pmc");else if(e.ijcai)(r=await makeIJCAIPaper(t))&&(r.source="ijcai");else if(e.acm)(r=await makeACMPaper(t))&&(r.source="acm");else if(e.ieee)(r=await makeIEEEPaper(t))&&(r.source="ieee");else if(e.springer)(r=await makeSpringerPaper(t))&&(r.source="springer");else if(e.aps)(r=await makeAPSPaper(t))&&(r.source="aps");else if(e.wiley)(r=await makeWileyPaper(t))&&(r.source="wiley");else if(e.sciencedirect)(r=await makeScienceDirectPaper(t))&&(r.source="sciencedirect");else if(e.science)(r=await makeSciencePaper(t))&&(r.source="science");else if(e.frontiers)(r=await makeFrontiersPaper(t))&&(r.source="frontiers");else if(e.ihep)(r=await makeIHEPPaper(t))&&(r.source="ihep");else if(e.plos)(r=await makePLOSPaper(t))&&(r.source="plos");else if(e.rsc)(r=await makeRSCPaper(t))&&(r.source="rsc");else if(e.mdpi)(r=await makeMDPIPaper(t))&&(r.source="mdpi");else if(e.oup)(r=await makeOUPPaper(t))&&(r.source="oup");else if(e.hal)(r=await makerHALPaper(t))&&(r.source="hal");else if(e.chemrxiv)(r=await makeChemRxivPaper(t))&&(r.source="chemrxiv");else{if(!e.cell)throw console.error({is:e,url:t}),new Error("Could not parse paper (in `makePaper`). Unknown paper source, see above.");(r=await makeCellPaper(t))&&(r.source="cell")}if(void 0!==r)return a=(performance.now()-i)/1e3,info(`Paper parsed in ${a.toFixed(2)}s`),initPaper(r)},findFuzzyPaperMatch=(e,t)=>{t=miniHash(t.title);return e.hasOwnProperty(t)?(e=e[t]).find(t=>!global.preprintSources.some(e=>t.toLowerCase().startsWith(e)))||e[0]:null};"undefined"!=typeof module&&null!=module.exports&&((dummyModule=module).exports={decodeHtml:decodeHtml,flipAuthor:flipAuthor,flipAndAuthors:flipAndAuthors,fetchArxivXML:fetchArxivXML,fetchCvfHTML:fetchCvfHTML,getOpenReviewNoteJSON:getOpenReviewNoteJSON,getOpenReviewForumJSON:getOpenReviewForumJSON,fetchDom:fetchDom,fetchText:fetchText,fetchJSON:fetchJSON,fetchBibtex:fetchBibtex,extractCrossrefData:extractCrossrefData,fetchCrossRefDataForDoi:fetchCrossRefDataForDoi,fetchSemanticScholarDataForDoi:fetchSemanticScholarDataForDoi,getMetaContent:getMetaContent,extractDataFromDCMetaTags:extractDataFromDCMetaTags,makeArxivPaper:makeArxivPaper,makeNeuripsPaper:makeNeuripsPaper,makeCVFPaper:makeCVFPaper,makeOpenReviewBibTex:makeOpenReviewBibTex,extractAPIv2ContentValue:extractAPIv2ContentValue,makeOpenReviewPaper:makeOpenReviewPaper,makeBioRxivPaper:makeBioRxivPaper,makePMLRPaper:makePMLRPaper,findACLValue:findACLValue,makeACLPaper:makeACLPaper,makePNASPaper:makePNASPaper,makeNaturePaper:makeNaturePaper,makeACSPaper:makeACSPaper,makeIOPPaper:makeIOPPaper,makeJMLRPaper:makeJMLRPaper,makePMCPaper:makePMCPaper,makePubMedPaper:makePubMedPaper,makeIJCAIPaper:makeIJCAIPaper,makeACMPaper:makeACMPaper,makeIEEEPaper:makeIEEEPaper,makeSpringerPaper:makeSpringerPaper,makeAPSPaper:makeAPSPaper,makeWileyPaper:makeWileyPaper,makeScienceDirectPaper:makeScienceDirectPaper,makeSciencePaper:makeSciencePaper,makeFrontiersPaper:makeFrontiersPaper,makeIHEPPaper:makeIHEPPaper,makePLOSPaper:makePLOSPaper,makeRSCPaper:makeRSCPaper,makeWebsitePaper:makeWebsitePaper,makeMDPIPaper:makeMDPIPaper,makeOUPPaper:makeOUPPaper,makerHALPaper:makerHALPaper,tryPWCMatch:tryPWCMatch,tryCrossRef:tryCrossRef,tryDBLP:tryDBLP,trySemanticScholar:trySemanticScholar,tryGoogleScholar:tryGoogleScholar,tryUnpaywall:tryUnpaywall,tryPreprintMatch:tryPreprintMatch,initPaper:initPaper,autoTagPaper:autoTagPaper,makePaper:makePaper,findFuzzyPaperMatch:findFuzzyPaperMatch}); \ No newline at end of file