From 053572e6233655b65f78a0dbcff39451d23cd6e6 Mon Sep 17 00:00:00 2001 From: vict0rsch Date: Wed, 15 Jun 2022 16:46:54 +0200 Subject: [PATCH 1/5] Add `frontiers` paper source --- src/shared/js/utils/config.js | 1 + src/shared/js/utils/functions.js | 1 + src/shared/js/utils/paper.js | 10 ++++++++++ src/shared/js/utils/parsers.js | 29 +++++++++++++++++++++++++++++ 4 files changed, 41 insertions(+) diff --git a/src/shared/js/utils/config.js b/src/shared/js/utils/config.js index 1be960ea..87a9e482 100644 --- a/src/shared/js/utils/config.js +++ b/src/shared/js/utils/config.js @@ -138,6 +138,7 @@ global.knownPaperPages = { arxiv: ["arxiv.org/abs/", "arxiv.org/pdf/", "scirate.com/arxiv/"], biorxiv: ["biorxiv.org/content"], cvf: ["openaccess.thecvf.com/content"], + frontiers: ["frontiersin.org/articles"], ijcai: [(url) => /ijcai\.org\/proceedings\/\d{4}\/\d+/gi.test(url)], ieee: [ "ieeexplore.ieee.org/document/", diff --git a/src/shared/js/utils/functions.js b/src/shared/js/utils/functions.js index 434f774b..14b9d304 100644 --- a/src/shared/js/utils/functions.js +++ b/src/shared/js/utils/functions.js @@ -112,6 +112,7 @@ const isObject = (obj) => const isPdfUrl = (url) => { return ( url.endsWith(".pdf") || + url.endsWith("/pdf") || url.includes("openreview.net/pdf") || url.match(/\/e?pdf\//g) || url.includes("ieee.org/stamp/stamp.jsp?tp=&arnumber=") diff --git a/src/shared/js/utils/paper.js b/src/shared/js/utils/paper.js index c5a3d949..31fd5776 100644 --- a/src/shared/js/utils/paper.js +++ b/src/shared/js/utils/paper.js @@ -152,6 +152,10 @@ const paperToAbs = (paper) => { abs = `https://science.org/doi/full/${doi}`; break; + case "frontiers": + abs = pdf.replace(/\/pdf$/, "/full"); + break; + default: abs = "https://xkcd.com/1969/"; break; @@ -246,6 +250,9 @@ const paperToPDF = (paper) => { case "science": break; + case "frontiers": + break; + default: pdf = "https://xkcd.com/1969/"; break; @@ -760,6 +767,9 @@ const parseIdFromUrl = async (url) => { doi = doi.split("/").slice(1).join("/"); } idForUrl = findPaperId(papers, "science", miniHash(doi)); + } else if (is.frontiers) { + doi = noParamUrl(url).split("/articles/")[1].split("/").slice(0, -1).join("/"); + idForUrl = findPaperId(papers, "frontiers", miniHash(doi)); } else if (is.localFile) { idForUrl = is.localFile; } else { diff --git a/src/shared/js/utils/parsers.js b/src/shared/js/utils/parsers.js index c49d88e8..4f339fa8 100644 --- a/src/shared/js/utils/parsers.js +++ b/src/shared/js/utils/parsers.js @@ -1205,6 +1205,30 @@ const makeSciencePaper = async (url) => { return { author, bibtex, id, key, note, pdfLink, title, venue, year }; }; +const makeFrontiersPaper = async (url) => { + url = url.replace(/\/pdf$/, "/full"); + const doi = noParamUrl(url).split("/articles/")[1].split("/full")[0]; + const bib = await fetchText(`https://www.frontiersin.org/articles/${doi}/bibTex`); + const data = Object.fromEntries( + Object.entries(bibtexToObject(bib)).map(([k, v]) => [ + k === "citationKey" || k === "entryType" ? k : k.toLowerCase(), + v, + ]) + ); + data.author = flipAndAuthors(data.author); + delete data.abstract; + const { author, journal, year, title, citationKey } = data; + const bibtex = bibtexToString(data); + + const venue = journal; + const note = `Published @ ${venue} (${year})`; + const id = `Frontiers-${year}_${miniHash(doi)}`; + const key = citationKey; + const pdfLink = url.replace(/\/full$/, "/pdf"); + + return { author, bibtex, id, key, note, pdfLink, title, venue, year }; +}; + // ------------------------------- // ----- PREPRINT MATCHING ----- // ------------------------------- @@ -1605,6 +1629,11 @@ const makePaper = async (is, url) => { if (paper) { paper.source = "science"; } + } else if (is.frontiers) { + paper = await makeFrontiersPaper(url); + if (paper) { + paper.source = "frontiers"; + } } else { throw new Error("Unknown paper source: " + JSON.stringify({ is, url })); } From b90783422b11242376ece110e773831f563053a3 Mon Sep 17 00:00:00 2001 From: vict0rsch Date: Wed, 15 Jun 2022 16:47:05 +0200 Subject: [PATCH 2/5] remove log --- src/content_scripts/content_script.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/content_scripts/content_script.js b/src/content_scripts/content_script.js index 3f7e7367..b17d148c 100644 --- a/src/content_scripts/content_script.js +++ b/src/content_scripts/content_script.js @@ -749,7 +749,6 @@ const arxiv = async (checks) => { const results = await Promise.all([paperPromise, domReadyPromise]); paper = results[0]; - console.log("paper: ", paper); if (paper) { // a paper was parsed From 2a16d6659be25916072412898b042f130bd58671 Mon Sep 17 00:00:00 2001 From: vict0rsch Date: Wed, 15 Jun 2022 16:47:08 +0200 Subject: [PATCH 3/5] build --- src/shared/min/utils.min.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/shared/min/utils.min.js b/src/shared/min/utils.min.js index cd00d02a..89335669 100644 --- a/src/shared/min/utils.min.js +++ b/src/shared/min/utils.min.js @@ -1,4 +1,4 @@ -const findEl=(e,t)=>void 0===t?"string"==typeof e?document.getElementById(e):e:findEl("memory-container--"+e).querySelector("."+t),fadeOut=(e,t=250,a=()=>{})=>{(e=findEl(e)).style.transition=t+"ms",e.style.opacity=0,setTimeout(()=>{e.style.display="none",a()},t)},fadeIn=(e,t="block",a=250,r=()=>{})=>{(e=findEl(e)).style.opacity=0,"none"===e.style.display&&(e.style.display=t),setTimeout(()=>{e.style.transition=a+"ms",e.style.opacity=1,setTimeout(()=>{r()},a)},0)},val=(e,t)=>{if(e instanceof HTMLInputElement&&"checkbox"===e.type){if(void 0===t)return e.checked;e.checked=t}if("string"==typeof e&&(e=findEl(e)),void 0===t)return e?e.value:"";e&&(e.value=t)},showId=(e,t="block")=>{let a=findEl(e);a&&(a.style.display=t)},hideId=e=>{(el=findEl(e))&&(el.style.display="none")},setTextId=(e,t)=>{let a=findEl(e);a&&(a.innerText=t)},setHTML=(e,t)=>{(e="string"==typeof e?findEl(e):e)&&(e.innerHTML=t)},dispatch=(e,t)=>{if("string"==typeof e&&(e=findEl(e)),"string"==typeof t){if("focus"===t)return void e.focus();if("blur"===t)return void e.blur();t=new Event(t)}e&&e.dispatchEvent(t)},hasClass=(e,t)=>{let a;if(a="string"==typeof e?findEl(e):e)return a.classList.contains(t)},addClass=(e,t)=>{let a;(a="string"==typeof e?findEl(e):e)&&a.classList.add(t)},removeClass=(e,t)=>{let a;(a="string"==typeof e?findEl(e):e)&&a.classList.remove(t)},addListener=(e,t,a)=>{(e="string"==typeof e?findEl(e):e)&&e.addEventListener(t,a)},setPlaceholder=(e,t)=>{(e="string"==typeof e?findEl(e):e)&&void 0!==e.placeholder&&(e.placeholder=t)},style=(e,t,a)=>{if(e="string"==typeof e?findEl(e):e){if(void 0===a)return e.style[t];e.style[t]=a}},disable=(e,t=!0)=>{(e="string"==typeof e?findEl(e):e)&&(e.disabled=t)},slideUp=(e,t=250,a=()=>{})=>{(e="string"==typeof e?findEl(e):e)&&(e.style.transitionProperty="height, margin, padding",e.style.transitionDuration=t+"ms",e.style.height=e.offsetHeight+"px",e.offsetHeight,e.style.overflow="hidden",e.style.height=0,e.style.paddingTop=0,e.style.paddingBottom=0,e.style.marginTop=0,e.style.marginBottom=0,window.setTimeout(()=>{e.style.display="none",e.style.removeProperty("height"),e.style.removeProperty("padding-top"),e.style.removeProperty("padding-bottom"),e.style.removeProperty("margin-top"),e.style.removeProperty("margin-bottom"),e.style.removeProperty("overflow"),e.style.removeProperty("transition-duration"),e.style.removeProperty("transition-property"),e.style.removeProperty("box-sizing"),a()},t))},slideDown=(t,a=500,r=()=>{})=>{if(t="string"==typeof t?findEl(t):t){t.style.removeProperty("display");let e=window.getComputedStyle(t).display;"none"===e&&(e="block"),t.style.display=e;var i=t.offsetHeight;t.style.overflow="hidden",t.style.height=0,t.style.paddingTop=0,t.style.paddingBottom=0,t.style.marginTop=0,t.style.marginBottom=0,t.offsetHeight,t.style.transitionProperty="height, margin, padding",t.style.transitionDuration=a+"ms",t.style.height=i+"px",t.style.removeProperty("padding-top"),t.style.removeProperty("padding-bottom"),t.style.removeProperty("margin-top"),t.style.removeProperty("margin-bottom"),window.setTimeout(()=>{t.style.removeProperty("height"),t.style.removeProperty("overflow"),t.style.removeProperty("transition-duration"),t.style.removeProperty("transition-property"),r()},a)}},slideToggle=(e,t=500,a=()=>{})=>("none"===window.getComputedStyle(e).display?slideDown:slideUp)(e,t,a);var dummyModule;"undefined"!=typeof module&&null!=module.exports&&(dummyModule=module,dummyModule.exports={findEl:findEl,fadeOut:fadeOut,fadeIn:fadeIn,val:val,showId:showId,hideId:hideId,setTextId:setTextId,setHTML:setHTML,dispatch:dispatch,hasClass:hasClass,addClass:addClass,removeClass:removeClass,addListener:addListener,setPlaceholder:setPlaceholder,style:style,disable:disable,slideUp:slideUp,slideDown:slideDown,slideToggle:slideToggle});const createElementFromHTML=e=>{var t=document.createElement("div");return t.innerHTML=e.trim(),t.firstChild};Object.defineProperty(Array.prototype,"last",{value:function(e=0){return this.reverse()[e]}}),Object.defineProperty(String.prototype,"capitalize",{value:function(e=!1){return e?this.split(" ").map(e=>e.capitalize()).join(" "):this.charAt(0).toUpperCase()+this.slice(1)}});var global={},dummyModule,dummyModule,dummyModule,dummyModule,dummyModule,dummyModule,dummyModule;function _min(e,t,a,r,i){return eBoolean(e.match(/journals\.aps\.org\/\w+\/(abstract|pdf)\//g))],acs:["pubs.acs.org/doi/"],arxiv:["arxiv.org/abs/","arxiv.org/pdf/","scirate.com/arxiv/"],biorxiv:["biorxiv.org/content"],cvf:["openaccess.thecvf.com/content"],ijcai:[e=>/ijcai\.org\/proceedings\/\d{4}\/\d+/gi.test(e)],ieee:["ieeexplore.ieee.org/document/","ieeexplore.ieee.org/abstract/document/","ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber="],iop:["iopscience.iop.org/article/"],jmlr:[e=>e.includes("jmlr.org/papers/v")&&!e.endsWith("/")],nature:["nature.com/articles/"],neurips:["neurips.cc/paper/","nips.cc/paper/"],openreview:["openreview.net/forum","openreview.net/pdf"],pmc:["ncbi.nlm.nih.gov/pmc/articles/PMC"],pmlr:["proceedings.mlr.press/"],pnas:["pnas.org/content/","pnas.org/doi/"],science:[e=>Boolean(e.match(/science\.org\/doi\/?(abs|full|pdf|epdf)?\//g))],sciencedirect:["sciencedirect.com/science/article/pii/","sciencedirect.com/science/article/abs/pii/","reader.elsevier.com/reader/sd/pii/"],springer:[...global.sourceExtras.springer.types.map(e=>`link.springer.com/${e}/`),"link.springer.com/content/pdf/"],wiley:[e=>Boolean(e.match(/onlinelibrary\.wiley\.com\/doi\/(abs|full|pdf|epdf)\//g))]},global.sourcesNames={acl:"Association for Computational Linguistics (ACL)",acm:"Association for Computing Machinery (ACM)",acs:"American Chemical Society (ACS)",aps:"American Physical Society",arxiv:"ArXiv",biorxiv:"BioRxiv",cvf:"Computer Vision Foundation (CVF)",ijcai:"International Joint Conferences on Artificial Intelligence (IJCAI)",iop:"Institute Of Physics (IOP)",jmlr:"Journal of Machine Learning Research (JMLR)",nature:"Nature",neurips:"NeurIPS",openreview:"OpenReview",pmc:"PubMed Central",pmlr:"Proceedings of Machine Learning Research (PMLR)",pnas:"Proceedings of the National Academy of Sciences (PNAS)",science:"Science",sciencedirect:"ScienceDirect",springer:"Springer",wiley:"Wiley"},global.overrideORConfs={"robot-learning":"CoRL",ijcai:"IJCAI"},global.overridePMLRConfs={"Conference on Learning Theory":"CoLT","International Conference on Machine Learning":"ICML","Conference on Uncertainty in Artificial Intelligence":"UAI","Conference on Robot Learning":"CoRL","International Conference on Artificial Intelligence and Statistics":"AISTATS","International Conference on Algorithmic Learning Theory":"ALT"},global.overrideDBLPVenues={"J. Mach. Learn. Res.":"JMLR"},global.consolHeaderStyle="font-family:system-ui;font-size:1.2rem;font-weight:lighter;display:inline-block;border:2px solid #A41716;border-radius: 8px;padding: 16px; margin: 20px;",global.fuzzyTitleMatchMinDist=4,global.defaultTitleFunctionCode=`(paper) => { +const findEl=(e,t)=>void 0===t?"string"==typeof e?document.getElementById(e):e:findEl("memory-container--"+e).querySelector("."+t),fadeOut=(e,t=250,a=()=>{})=>{(e=findEl(e)).style.transition=t+"ms",e.style.opacity=0,setTimeout(()=>{e.style.display="none",a()},t)},fadeIn=(e,t="block",a=250,r=()=>{})=>{(e=findEl(e)).style.opacity=0,"none"===e.style.display&&(e.style.display=t),setTimeout(()=>{e.style.transition=a+"ms",e.style.opacity=1,setTimeout(()=>{r()},a)},0)},val=(e,t)=>{if(e instanceof HTMLInputElement&&"checkbox"===e.type){if(void 0===t)return e.checked;e.checked=t}if("string"==typeof e&&(e=findEl(e)),void 0===t)return e?e.value:"";e&&(e.value=t)},showId=(e,t="block")=>{let a=findEl(e);a&&(a.style.display=t)},hideId=e=>{(el=findEl(e))&&(el.style.display="none")},setTextId=(e,t)=>{let a=findEl(e);a&&(a.innerText=t)},setHTML=(e,t)=>{(e="string"==typeof e?findEl(e):e)&&(e.innerHTML=t)},dispatch=(e,t)=>{if("string"==typeof e&&(e=findEl(e)),"string"==typeof t){if("focus"===t)return void e.focus();if("blur"===t)return void e.blur();t=new Event(t)}e&&e.dispatchEvent(t)},hasClass=(e,t)=>{let a;if(a="string"==typeof e?findEl(e):e)return a.classList.contains(t)},addClass=(e,t)=>{let a;(a="string"==typeof e?findEl(e):e)&&a.classList.add(t)},removeClass=(e,t)=>{let a;(a="string"==typeof e?findEl(e):e)&&a.classList.remove(t)},addListener=(e,t,a)=>{(e="string"==typeof e?findEl(e):e)&&e.addEventListener(t,a)},setPlaceholder=(e,t)=>{(e="string"==typeof e?findEl(e):e)&&void 0!==e.placeholder&&(e.placeholder=t)},style=(e,t,a)=>{if(e="string"==typeof e?findEl(e):e){if(void 0===a)return e.style[t];e.style[t]=a}},disable=(e,t=!0)=>{(e="string"==typeof e?findEl(e):e)&&(e.disabled=t)},slideUp=(e,t=250,a=()=>{})=>{(e="string"==typeof e?findEl(e):e)&&(e.style.transitionProperty="height, margin, padding",e.style.transitionDuration=t+"ms",e.style.height=e.offsetHeight+"px",e.offsetHeight,e.style.overflow="hidden",e.style.height=0,e.style.paddingTop=0,e.style.paddingBottom=0,e.style.marginTop=0,e.style.marginBottom=0,window.setTimeout(()=>{e.style.display="none",e.style.removeProperty("height"),e.style.removeProperty("padding-top"),e.style.removeProperty("padding-bottom"),e.style.removeProperty("margin-top"),e.style.removeProperty("margin-bottom"),e.style.removeProperty("overflow"),e.style.removeProperty("transition-duration"),e.style.removeProperty("transition-property"),e.style.removeProperty("box-sizing"),a()},t))},slideDown=(t,a=500,r=()=>{})=>{if(t="string"==typeof t?findEl(t):t){t.style.removeProperty("display");let e=window.getComputedStyle(t).display;"none"===e&&(e="block"),t.style.display=e;var i=t.offsetHeight;t.style.overflow="hidden",t.style.height=0,t.style.paddingTop=0,t.style.paddingBottom=0,t.style.marginTop=0,t.style.marginBottom=0,t.offsetHeight,t.style.transitionProperty="height, margin, padding",t.style.transitionDuration=a+"ms",t.style.height=i+"px",t.style.removeProperty("padding-top"),t.style.removeProperty("padding-bottom"),t.style.removeProperty("margin-top"),t.style.removeProperty("margin-bottom"),window.setTimeout(()=>{t.style.removeProperty("height"),t.style.removeProperty("overflow"),t.style.removeProperty("transition-duration"),t.style.removeProperty("transition-property"),r()},a)}},slideToggle=(e,t=500,a=()=>{})=>("none"===window.getComputedStyle(e).display?slideDown:slideUp)(e,t,a);var dummyModule;"undefined"!=typeof module&&null!=module.exports&&(dummyModule=module,dummyModule.exports={findEl:findEl,fadeOut:fadeOut,fadeIn:fadeIn,val:val,showId:showId,hideId:hideId,setTextId:setTextId,setHTML:setHTML,dispatch:dispatch,hasClass:hasClass,addClass:addClass,removeClass:removeClass,addListener:addListener,setPlaceholder:setPlaceholder,style:style,disable:disable,slideUp:slideUp,slideDown:slideDown,slideToggle:slideToggle});const createElementFromHTML=e=>{var t=document.createElement("div");return t.innerHTML=e.trim(),t.firstChild};Object.defineProperty(Array.prototype,"last",{value:function(e=0){return this.reverse()[e]}}),Object.defineProperty(String.prototype,"capitalize",{value:function(e=!1){return e?this.split(" ").map(e=>e.capitalize()).join(" "):this.charAt(0).toUpperCase()+this.slice(1)}});var global={},dummyModule,dummyModule,dummyModule,dummyModule,dummyModule,dummyModule,dummyModule;function _min(e,t,a,r,i){return eBoolean(e.match(/journals\.aps\.org\/\w+\/(abstract|pdf)\//g))],acs:["pubs.acs.org/doi/"],arxiv:["arxiv.org/abs/","arxiv.org/pdf/","scirate.com/arxiv/"],biorxiv:["biorxiv.org/content"],cvf:["openaccess.thecvf.com/content"],frontiers:["frontiersin.org/articles"],ijcai:[e=>/ijcai\.org\/proceedings\/\d{4}\/\d+/gi.test(e)],ieee:["ieeexplore.ieee.org/document/","ieeexplore.ieee.org/abstract/document/","ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber="],iop:["iopscience.iop.org/article/"],jmlr:[e=>e.includes("jmlr.org/papers/v")&&!e.endsWith("/")],nature:["nature.com/articles/"],neurips:["neurips.cc/paper/","nips.cc/paper/"],openreview:["openreview.net/forum","openreview.net/pdf"],pmc:["ncbi.nlm.nih.gov/pmc/articles/PMC"],pmlr:["proceedings.mlr.press/"],pnas:["pnas.org/content/","pnas.org/doi/"],science:[e=>Boolean(e.match(/science\.org\/doi\/?(abs|full|pdf|epdf)?\//g))],sciencedirect:["sciencedirect.com/science/article/pii/","sciencedirect.com/science/article/abs/pii/","reader.elsevier.com/reader/sd/pii/"],springer:[...global.sourceExtras.springer.types.map(e=>`link.springer.com/${e}/`),"link.springer.com/content/pdf/"],wiley:[e=>Boolean(e.match(/onlinelibrary\.wiley\.com\/doi\/(abs|full|pdf|epdf)\//g))]},global.sourcesNames={acl:"Association for Computational Linguistics (ACL)",acm:"Association for Computing Machinery (ACM)",acs:"American Chemical Society (ACS)",aps:"American Physical Society",arxiv:"ArXiv",biorxiv:"BioRxiv",cvf:"Computer Vision Foundation (CVF)",ijcai:"International Joint Conferences on Artificial Intelligence (IJCAI)",iop:"Institute Of Physics (IOP)",jmlr:"Journal of Machine Learning Research (JMLR)",nature:"Nature",neurips:"NeurIPS",openreview:"OpenReview",pmc:"PubMed Central",pmlr:"Proceedings of Machine Learning Research (PMLR)",pnas:"Proceedings of the National Academy of Sciences (PNAS)",science:"Science",sciencedirect:"ScienceDirect",springer:"Springer",wiley:"Wiley"},global.overrideORConfs={"robot-learning":"CoRL",ijcai:"IJCAI"},global.overridePMLRConfs={"Conference on Learning Theory":"CoLT","International Conference on Machine Learning":"ICML","Conference on Uncertainty in Artificial Intelligence":"UAI","Conference on Robot Learning":"CoRL","International Conference on Artificial Intelligence and Statistics":"AISTATS","International Conference on Algorithmic Learning Theory":"ALT"},global.overrideDBLPVenues={"J. Mach. Learn. Res.":"JMLR"},global.consolHeaderStyle="font-family:system-ui;font-size:1.2rem;font-weight:lighter;display:inline-block;border:2px solid #A41716;border-radius: 8px;padding: 16px; margin: 20px;",global.fuzzyTitleMatchMinDist=4,global.defaultTitleFunctionCode=`(paper) => { const title = paper.title.replaceAll("\\n", ''); const id = paper.id; let name = \`\${title} - \${id}\`; @@ -10,7 +10,7 @@ const findEl=(e,t)=>void 0===t?"string"==typeof e?document.getElementById(e):e:f /!\\ If you change the default title function in the Advanced Options and do not include a paper's title in the file name, PaperMemory may not be able to open the file and will instead open the pdf url. /!\\ Unfortunately, PaperMemory cannot detect papers that have not been *downloaded there* so putting papers in this folder will not make them discoverable by the \`browser.downloads\` API PaperMemory uses.`,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,"undefined"!=typeof module&&null!=module.exports&&(dummyModule=module,dummyModule.exports={state:global.state,descendingSortKeys:global.descendingSortKeys,select2Options:global.select2Options,prefsCheckNames:global.prefsCheckNames,prefsCheckDefaultFalse:global.prefsCheckDefaultFalse,prefsStorageKeys:global.prefsStorageKeys,sourceExtras:global.sourceExtras,preprintSources:global.preprintSources,knownPaperPages:global.knownPaperPages,sourcesNames:global.sourcesNames,overrideORConfs:global.overrideORConfs,overridePMLRConfs:global.overridePMLRConfs,overrideDBLPVenues:global.overrideDBLPVenues,fuzzyTitleMatchMinDist:global.fuzzyTitleMatchMinDist,defaultTitleFunctionCode:global.defaultTitleFunctionCode,storeReadme:global.storeReadme,englishStopWords:global.englishStopWords,journalAbbreviations:global.journalAbbreviations,consolHeaderStyle:global.consolHeaderStyle});const levenshtein=(e,t)=>{if(e===t)return 0;e.length>t.length&&(a=e,e=t,t=a);for(var a,r=e.length,i=t.length;0this.pos&&"@"!=this.input[this.pos];)this.pos++;return"@"==this.input[this.pos]},this.skipWhitespace=function(e){for(;this.isWhitespace(this.input[this.pos]);)this.pos++;if("%"==this.input[this.pos]&&1==e){for(;"\n"!=this.input[this.pos];)this.pos++;this.skipWhitespace(e)}},this.value_braces=function(){for(var e,t=0,a=(this.match("{",!1),this.pos),r=!1;;){if(!r)if("}"==this.input[this.pos]){if(!(0=this.input.length-1)throw TypeError("Unterminated value: value_braces");r="\\"==this.input[this.pos]&&0==r,this.pos++}},this.value_comment=function(){for(var e="",t=0;!this.tryMatch("}",!1)||0!=t;){if(e+=this.input[this.pos],"{"==this.input[this.pos]&&t++,"}"==this.input[this.pos]&&t--,this.pos>=this.input.length-1)throw TypeError("Unterminated value: value_comment",+this.input.substring(start));this.pos++}return e},this.value_quotes=function(){this.match('"',!1);for(var e,t=this.pos,a=!1;;){if(!a){if('"'==this.input[this.pos])return e=this.pos,this.match('"',!1),this.input.substring(t,e);if(this.pos>=this.input.length-1)throw TypeError("Unterminated value: value_quotes",this.input.substring(t))}a="\\"==this.input[this.pos]&&0==a,this.pos++}},this.single_value=function(){var e=this.pos;if(this.tryMatch("{"))return this.value_braces();if(this.tryMatch('"'))return this.value_quotes();var t=this.key();if(t.match("^[0-9]+$"))return t;if(0<=this.months.indexOf(t.toLowerCase()))return t.toLowerCase();throw"Value expected: single_value"+this.input.substring(e)+" for key: "+t},this.value=function(){var e=[];for(e.push(this.single_value());this.tryMatch("#");)this.match("#"),e.push(this.single_value());return e.join("")},this.key=function(e){for(var t=this.pos;;){if(this.pos>=this.input.length)throw TypeError("Runaway key: key");if(0<=this.notKey.indexOf(this.input[this.pos]))return e&&","!=this.input[this.pos]?(this.pos=t,null):this.input.substring(t,this.pos);this.pos++}},this.key_equals_value=function(){var e,t=this.key();if(this.tryMatch("="))return this.match("="),e=this.value(),[t=t.trim(),e];throw TypeError("Value expected, equals sign missing: key_equals_value",this.input.substring(this.pos))},this.key_value_list=function(){var e=this.key_equals_value();for(this.currentEntry.entryTags={},this.currentEntry.entryTags[e[0]]=e[1];this.tryMatch(",")&&(this.match(","),!this.tryMatch("}"));)e=this.key_equals_value(),this.currentEntry.entryTags[e[0]]=e[1]},this.entry_body=function(e){this.currentEntry={},this.currentEntry.citationKey=this.key(!0),this.currentEntry.entryType=e.substring(1),null!=this.currentEntry.citationKey&&this.match(","),this.key_value_list(),this.entries.push(this.currentEntry)},this.directive=function(){return this.match("@"),"@"+this.key()},this.preamble=function(){this.currentEntry={},this.currentEntry.entryType="PREAMBLE",this.currentEntry.entry=this.value_comment(),this.entries.push(this.currentEntry)},this.comment=function(){this.currentEntry={},this.currentEntry.entryType="COMMENT",this.currentEntry.entry=this.value_comment(),this.entries.push(this.currentEntry)},this.entry=function(e){this.entry_body(e)},this.alernativeCitationKey=function(){this.entries.forEach(function(e){!e.citationKey&&e.entryTags&&(e.citationKey="",e.entryTags.author&&(e.citationKey+=e.entryTags.author.split(",")[0]+=", "),e.citationKey+=e.entryTags.year)})},this.bibtex=function(){for(;this.matchAt();){var e=this.directive();this.match("{"),"@STRING"==e.toUpperCase()?this.string():"@PREAMBLE"==e.toUpperCase()?this.preamble():"@COMMENT"==e.toUpperCase()?this.comment():this.entry(e),this.match("}")}this.alernativeCitationKey()}}const bibtexToObject=e=>{var t=new BibtexParser,e=(t.setInput(e),t.bibtex(),t.getEntries()[0]);return{...e.entryTags,entryType:e.entryType,citationKey:e.citationKey}},bibtexToString=e=>{let t=`@${(e={...e="string"==typeof e?bibtexToObject(e):e}).entryType.toLowerCase()}{${e.citationKey}, `;delete e.entryType,delete e.citationKey;var a,r=Math.max(...Object.keys(e).map(e=>e.length));for(const i in e)e.hasOwnProperty(i)&&e[i]&&(a=e[i].replaceAll(/\s+/g," ").trim(),bkey=i+" ".repeat(r-i.length),t+=` ${bkey} = {${a}}, -`);return(t.slice(0,-2)+"\n}").replaceAll("\t"," ").replaceAll("--","-")},extractBibtexValue=(e,t)=>{const a=bibtexToObject(e);return a.hasOwnProperty(t)?a[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,dummyModule.exports={bibtexToObject:bibtexToObject,bibtexToString:bibtexToString,extractBibtexValue:extractBibtexValue,extractAuthor:extractAuthor}),"undefined"!=typeof LOGTRACE&&LOGTRACE),log=(...e)=>{if(logTrace){const n=(new Error).stack;e.push("\n\nLog trace:\n"+n.split("\n").slice(2).join("\n"))}let t="%c%s ",a=!1,r=!1,i=!1,o=!1,s=!1;"[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]?(s=!0,e=e.slice(1)):"[debug]"===e[0]&&(o=!0,e=e.slice(1)),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;":s?"#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),getDisplayId=e=>{var t=e;if((e=e.split("_")[0].split(".")[0]).startsWith("OR-")||(e=e.split("-").slice(0,2).join("-")),global.state.papers.hasOwnProperty(t)){const a=global.state.papers[t];if("nature"===a.source){if(a.note.match(/^Published\ @.+\(\d+\)$/)){const r=a.note.split("@")[1].split("(")[0].trim();e+="-"+r.split(" ").map(e=>e[0].toUpperCase()).join("")}e+="-"+a.year}"acs"===a.source&&(e+="-"+a.year),"iop"===a.source&&(e+="-"+a.year)}return e},isObject=e=>"object"==typeof e&&!Array.isArray(e)&&null!==e,isPdfUrl=e=>e.endsWith(".pdf")||e.includes("openreview.net/pdf")||e.match(/\/e?pdf\//g)||e.includes("ieee.org/stamp/stamp.jsp?tp=&arnumber="),delay=(t,a)=>{let r=0;return(...e)=>{clearTimeout(r),r=setTimeout(t.bind(this,...e),a||0)}},cleanPapers=e=>{let t={...e};return delete t.__dataVersion,t},firstNonStopLowercase=e=>{let t=e.toLowerCase(),a=t.split(" ").map(miniHash);e=a.filter(e=>!global.englishStopWords.has(e));return(0e.toLowerCase().replace(/\W/g,""),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)},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()},eventId=e=>e.target.closest(".memory-container").id.split("--")[1],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",e=e.substring(e.lastIndexOf("/")+1),a.download=t||e,navigator.userAgent.toLowerCase().match(/(ipad|iphone|safari)/)&&navigator.userAgent.search("Chrome")<0?document.location=a.href:(t=new MouseEvent("click",{view:window,bubbles:!0,cancelable:!1}),a.dispatchEvent(t),(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=>{const 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]);e=e.split("/").last().split(".")[0],e=(hashCode(e)+"").replace("-","").slice(0,8),e=`${a}-${r}_`+e;return{conf:a,year:r,id:e}},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``;case"circle-x":return``;case"star":return``;case"writing":return``;case"file-symlink":return``;case"link":return``;case"clipboard-list":return``;case"archive":return``;case"external-link":return``;case"file-download":return``;case"cirlce-x":return``;case"settings":return``;case"messages":return``;case"vocabulary":return``;case"database-export":return``;case"eyeglass":return``;case"markdown":return``;case"math-function":return``;default:return""}},stringifyError=e=>{const 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=>{let t=Array.from(e.selectedOptions,e=>e.value.trim()).filter(e=>e);return t.sort(),t},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("popup-item-tags--"+e)),findEl("checkFavorite--"+e).checked):(a=val(findEl(e,"form-note-textarea")),i=val(findEl(e,"form-code-input")),r=parseTags(findEl(e,"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=(p,c)=>e=>{let t;t=void 0===p?eventId(e):p;var a=getPaperEdits(t,c),r=global.state.papers[t];let i=!1,o={};for(const l in a){var s=r[l],n=(o[l]=s,a[l]);"tags"===l?arraysIdentical(s,n)||(i=!0):s!==n&&(i=!0)}i&&(console.log("Updating meta data for",t),(c?handlePopupSaveEdits:handleMemorySaveEdits)(t))},cutAuthors=(e,t,a)=>{void 0===t&&(t=140),void 0===a&&(a=", ");let r="";var e=e.split(" and "),i=e[e.length-1];for(const o of e){if(!(5+r.length+a.length+o.length+i.lengthnew Promise(t=>{chrome.runtime.sendMessage(e,e=>{t(e)})}),getStoredFiles=()=>new Promise(t=>{chrome.downloads.search({filenameRegex:"PaperMemoryStore/.*"},e=>t(e.filter(e=>e.exists&&"complete"===e.state&&!e.filename.toLowerCase().includes("readme.txt"))))}),noParamUrl=e=>e.split("?")[0].split("#")[0],silentPromiseTimeout=(e,a=5e3)=>{let r;return Promise.race([e,new Promise((e,t)=>r=setTimeout(e,a))]).finally(()=>clearTimeout(r))},migrateData=("undefined"!=typeof module&&null!=module.exports&&(dummyModule=module,dummyModule.exports={log:log,info:info,logError:logError,logOk:logOk,debug:debug,warn:warn,getDisplayId:getDisplayId,isObject:isObject,isPdfUrl:isPdfUrl,delay:delay,cleanPapers:cleanPapers,firstNonStopLowercase:firstNonStopLowercase,fallbackCopyTextToClipboard:fallbackCopyTextToClipboard,copyTextToClipboard:copyTextToClipboard,parseUrl:parseUrl,downloadTextFile:downloadTextFile,eventId:eventId,downloadFile:downloadFile,hashCode:hashCode,parseCVFUrl:parseCVFUrl,cleanBiorxivURL:cleanBiorxivURL,textareaFocusEnd:textareaFocusEnd,tablerSvg:tablerSvg,stringifyError:stringifyError,arraysIdentical:arraysIdentical,parseTags:parseTags,getPaperEdits:getPaperEdits,setFormChangeListener:setFormChangeListener,monitorPaperEdits:monitorPaperEdits,cutAuthors:cutAuthors,sendMessageToBackground:sendMessageToBackground,getStoredFiles:getStoredFiles,miniHash:miniHash,noParamUrl:noParamUrl,silentPromiseTimeout:silentPromiseTimeout}),async(a,t,e=!0)=>{if(void 0===a)return chrome.storage.local.set({papers:{__dataVersion:t}}),{papers:{__dataVersion:t},success:!0};var r,i,o,s=a.__dataVersion||-1,n=[];let l={...a};try{if(502<=s)return{papers:a,success:!0};e&&backupData({...a}),delete a.__dataVersion;for(const p in a)s<5&&(info("Applying migration 5"),a[p].hasOwnProperty("bibtex")||(a[p].bibtex="",log("Migrating bibtex for "+p)),a[p].pdfLink.endsWith(".pdf")||(a[p].pdfLink=a[p].pdfLink+".pdf"),a[p].codeLink||(a[p].codeLink=""),a[p].source||(a[p].id.includes("NeurIPS")?a[p].source="neurips":a[p].source="arxiv")),s<208&&(info("Applying migration 0.2.8"),"arxiv"!==a[p].source&&a[p].md.includes("https://arxiv.com/abs/")&&(a[p].md=`[${a[p].title}](${a[p].pdfLink})`),"arxiv"!==a[p].source&&a[p].pdfLink.includes("arxiv.org/pdf/")&&(a[p].source="arxiv"),p.match(/^\d/)&&"arxiv"===a[p].source&&(r="Arxiv-"+p,i={...a[p],id:r},a[r]=i,n.push(p))),s<209&&(info("Applying migration 0.2.9"),a[p].hasOwnProperty("favorite")||(a[p].favorite=!1,a[p].favoriteDate="")),s<210&&(info("Applying migration 0.2.10"),"arxiv"===a[p].source&&(o=a[p].pdfLink.match(/v\d+\.pdf/gi))&&0{delete a[e],log("Deleting "+e)}),(l={...a}).__dataVersion=t,e&&chrome.storage.local.set({papers:l},()=>{log("Migrated papers:"),log(l),log("Data version is now "+t)}),{papers:l,success:!0}}catch(e){return log(`Error migrating data from version ${s} to ${t}:`),log(e),{papers:l,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]),a?(setStorage("papers",t),log("Successfully deleted paper",e)):log("Error: no deletion")},getTheme=async()=>{return await getStorage("checkDarkMode")?"dark":"light"},backupData=async a=>{chrome.storage.local.get("papersBackup",({papersBackup:e})=>{void 0===e&&(e={});for(const 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)}const weeklyBackup=async()=>{var e=await getStorage("weeklyBackups")??{};const 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;const a=await getStorage("prefs")??{};(e=0===Object.keys(a).length?!0:e)&&(t=await getStorage(global.prefsStorageKeys)??{});let r={};for(const i of global.prefsCheckNames)r[i]=(t??a).hasOwnProperty(i)?(t??a)[i]:!(0<=global.prefsCheckDefaultFalse.indexOf(i));return r.checkOfficialRepos&&(setStorage("pwcPrefs",{official:!0}),delete r.checkOfficialRepos,setStorage("prefs",r)),e&&setStorage("prefs",r),r},getManifestDataVersion=()=>{const e=chrome.runtime.getManifest();return e.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=(e,t=!0)=>{const a={addDate:{type:"string",desc:"the paper's date of addition to the Memory",default:e=>(new Date).toJSON()},author:{type:"string",desc:"` and `-separated authors `${firstName} ${lastName}`"},bibtex:{type:"string",desc:"BibTex citation with new lines (`\n`)"},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=>""},count:{type:"number",desc:"the paper's number of visits",default:e=>1},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"},tags:{type:"array[string]",desc:"the user's tags for this paper",default:e=>[]},venue:{type:"string",desc:"the paper's publication venue",default:e=>""},year:{type:"string",desc:"year of publication"}};let r=[];for(const l in a)if(e.hasOwnProperty(l)){const p=a[l].type;var i,o=typeof e[l];p.includes("array")||"object"===p?p.includes("array")?Array.isArray(e[l])?(s=p.split("[")[1].replace("]",""),0{let t=!0,a="",r="",i;try{e.__dataVersion||(e.__dataVersion=1);var o,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(const n in i=s.papers)n.startsWith("__")||(paperWarnings=validatePaper(i[n]).warnings)&&0"+paperWarnings.join("
"));a&&(o=await getStorage("papers")??{},setStorage("uploadBackup",o)),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},isPaper=("undefined"!=typeof module&&null!=module.exports&&(dummyModule=module,dummyModule.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}),async(e,t=!1)=>{let a={};if(!e)return a;for(const i in global.knownPaperPages){var r=global.knownPaperPages[i];a[i]=!1;for(const o of r)"string"==typeof o?e.includes(o)&&(a[i]=!0):"function"==typeof o&&(a[i]=o(e))}return a.localFile=isKnownLocalFile(e),a.stored=!t&&await findLocalFile(e),a}),isSourceURL=async(e,t)=>Object.values(await isPaper(e,t)).some(e=>e),paperToAbs=e=>{let t,a,r;const i=e.pdfLink;let o="";switch(e.source){case"arxiv":o="https://arxiv.org/abs/"+e.id.split("-")[1];break;case"neurips":o=i.replace("/file/","/hash/").replace("-Paper.pdf","-Abstract.html");break;case"cvf":o=i.replace("/papers/","/html/").replace(".pdf",".html");break;case"openreview":o=i.replace("/pdf?","/forum?");break;case"biorxiv":o=i.replace(".full.pdf","");break;case"pmlr":o=i.split("/").slice(0,-1).join("/")+".html";break;case"acl":o=i.replace(".pdf","");break;case"pnas":o=i.replace(".full.pdf","").replace("/doi/pdf/","/doi/full/");break;case"nature":o=i.replace(".pdf","");break;case"acs":o=i.replace("pubs.acs.org/doi/pdf/","pubs.acs.org/doi/").split("?")[0];break;case"iop":o=i.split("#")[0].replace(/\/pdf$/,"");break;case"jmlr":o=i.split("/").slice(0,-1).join("/").replace("/papers/volume","/papers/v")+".html";break;case"pmc":var s=i.match(/PMC\d+/)[0];o=i.split(s)[0]+s;break;case"ijcai":var s=i.replace(".pdf","").split("/").last().match(/[1-9]\d*/),n=i.match(/proceedings\/\d+/gi)[0].split("/")[1];o=`https://www.ijcai.org/proceedings/${n}/`+s;break;case"acm":o=i.replace("/doi/pdf/","/doi/");break;case"ieee":o="https://ieeexplore.ieee.org/document/"+e.key;break;case"springer":o=e.extra.url;break;case"aps":[t,a]=parseUrl(i).pathname.split("/").slice(1,3),o=i.replace(`/${t}/${a}/`,`/${t}/abstract/`);break;case"wiley":o=i.replace(/\/doi\/e?pdf\//g,"/doi/abs/");break;case"sciencedirect":n=i.split("/pii/")[1].split("/")[0].split("#")[0].split("?")[0];o="https://www.sciencedirect.com/science/article/pii/"+n;break;case"science":(r=i.split("/doi/")[1]).startsWith("10.")||(r=r.split("/").slice(1).join("/")),o="https://science.org/doi/full/"+r;break;default:o="https://xkcd.com/1969/"}return o.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":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=Object.fromEntries(Object.values(e).map(e=>[e.id,miniHash(e.title)])),r=(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)])));let i={};for(const s of t){let t;try{(t=await parseIdFromUrl(s.finalUrl))&&e.hasOwnProperty(t)&&(i[t]=s)}catch(e){t=null}if(!t){const n=r[s.id];var o=Object.entries(a).find(([,e])=>n.includes(e));o&&(i[o[0]]=s)}}return i},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:{}})=>{const{oldPaper:t,newPaper:a,...r}=e;let i={...t};e={overwrites:["lastOpenDate"],incrementCount:!1,...r};for(const o in a)(!t.hasOwnProperty(o)||a[o]&&!t[o])&&(i[o]=a[o]);e.incrementCount&&1===i.count&&(i.count+=1);for(const s of e.overwrites)a.hasOwnProperty(s)&&(i[s]=a[s]);return i},updatePaperVisits=e=>(e.count+=1,e.lastOpenDate=(new Date).toJSON(),log("Updating paper to:",e),e),addOrUpdatePaper=async(t,e,i,o=!0,s={update:()=>{},preprints:()=>{}})=>{const n=Date.now();let l,p,c={};console.group("%cPaperMemory parsing 📕",global.consolHeaderStyle),global.state.papers=await getStorage("papers")??{};var a=await parseIdFromUrl(t),r=global.state.papers.hasOwnProperty(a);if(a&&r)l=updatePaperVisits(global.state.papers[a]),p=!1;else{if(!(l=await makePaper(e,t)))return;r=findFuzzyPaperMatch(global.state.titleHashToIds,l);if(r&&o){let e=global.state.papers[r];log("New paper",l,"already exists as",e),addPaperToTitleHashToId(l),!l.venue&&e.venue||l.venue&&e.venue?(e=mergePapers({newPaper:l,oldPaper:e,incrementCount:!1,overwrites:["lastOpenDate"]}),updateDuplicatedUrls(t,r)):!e.venue&&l.venue&&(await updateDuplicatedUrls(paperToAbs(e),l.id),await updateDuplicatedUrls(paperToPDF(e),l.id),await deletePaperInStorage(e.id,global.state.papers),e=mergePapers({newPaper:l,oldPaper:e,incrementCount:!1,overwrites:["lastOpenDate","venue","bibtex","id","key","pdfLink","source","year"]})),l=updatePaperVisits(e),p=!1}else p=!0}if(!l.codeLink||!l.venue)try{const m=await tryPWCMatch(l);var d=!l.codeLink&&m?.url,u=m?.note,h=m?.bibtex,f=!l.venue&&m?.venue;(c={codeLink:d,note:u,venue:f,bibtex:h}).codeLink&&(l.codeLink=c.codeLink,m.hasOwnProperty("note")&&delete m.note,l.code=m)}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.papers[l.id]=l),chrome.storage.local.set({papers:global.state.papers},async()=>{s.update(l);let e;if(p||c.codeLink?p?(o?logOk("Added '"+l.title+"' to your Memory!"):warn("Discovered '"+l.title+"' but did not store it."),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){var t,a=await tryPreprintMatch(l);for(const r of["note","venue","bibtex"])l[r]&&"bibtex"!==r||(t=a[r]??c[r])&&(log(`Updating preprint ${r} to`,t),l[r]=t);global.state.papers=await getStorage("papers")??{},p&&global.state.papers.hasOwnProperty(l.id)&&1e.find(e=>e.source===t&&e.id.includes(a))?.id,parseIdFromUrl=async t=>{let a;var 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=t.match(/\d{4}\.\d{4,5}/g)[0];a="Arxiv-"+i;const s=Object.values(global.state.titleHashToIds).find(e=>e.includes(a));s&&(a=s.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=findPaperId(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;const n=Object.values(global.state.titleHashToIds).find(e=>e.includes(a));n&&(a=n.find(e=>!e.startsWith("Biorxiv-"))??a)}else if(e.pmlr){const l=t.split("/").last().split(".")[0];o="20"+l.match(/\d+/)[0];a=`PMLR-${o}-`+l}else if(e.acl){i=(t=(t=t.replace(".pdf","")).endsWith("/")?t.slice(0,-1):t).split("/").last();a=findPaperId(r,"acl",i)}else if(e.pnas){o=((t=t.replace(".full.pdf","")).endsWith("/")?t.split("/").slice(-2):t.split("/").slice(-1))[0];a=findPaperId(r,"pnas",o)}else if(e.nature){i=(t=t.replace(".pdf","").split("#")[0]).split("/").last();a=findPaperId(r,"nature",i)}else if(e.acs){t=noParamUrl(t).replace("pubs.acs.org/doi/pdf/","/doi/").replace("pubs.acs.org/doi/abs/","/doi/");const doi=miniHash(t.split("/doi/")[1]);a="ACS_"+doi}else if(e.iop){t=noParamUrl(t).replace(/\/pdf$/,"");const doi=miniHash(t.split("/article/")[1]);a="IOPscience_"+doi}else if(e.jmlr){const p=(t=(t=t.endsWith(".pdf")?t.split("/").slice(0,-1).join("/"):t).replace(".html","")).split("/").last();o="20"+p.match(/\d+/)[0];a=`JMLR-${o}_`+p}else if(e.pmc){i=t.match(/PMC\d+/g)[0].replace("PMC","");a=findPaperId(r,"pmc",i)}else if(e.ijcai){o=t.endsWith(".pdf")?t.replace(".pdf","").split("/").last().match(/[1-9]\d*/):t.split("/").last(),i=t.match(/proceedings\/\d+/gi)[0].split("/")[1];a=`IJCAI-${i}_`+o}else if(e.acm){const doi=t.replace(/\/doi\/?(pdf|abs|full)?\//,"/doi/").split("/doi/")[1];a=findPaperId(r,"acm",miniHash(doi))}else if(e.ieee){i=(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=findPaperId(r,"ieee",i)}else if(e.springer){const c=global.sourceExtras.springer.types;let e=c.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"}o=t.split(`/${e}/`)[1].split("?")[0].replace(".pdf","");a=findPaperId(r,"springer",miniHash(o))}else if(e.aps){var[i,o]=parseUrl(t.split("#")[0]).pathname.split("/").slice(1,3);const doi=t.split(`/${i}/${o}/`).last();a=findPaperId(r,"aps",miniHash(doi))}else if(e.wiley){const doi=t.split("?")[0].split("#")[0].split("/").slice(-2).join("/");a=findPaperId(r,"wiley",miniHash(doi))}else if(e.sciencedirect){i=t.split("/pii/")[1].split("/")[0].split("#")[0].split("?")[0];a=findPaperId(r,"sciencedirect",miniHash(i))}else if(e.science)(doi=noParamUrl(t).split("/doi/")[1]).startsWith("10.")||(doi=doi.split("/").slice(1).join("/")),a=findPaperId(r,"science",miniHash(doi));else{if(!e.localFile)throw new Error("unknown paper url");a=e.localFile}return a},isKnownLocalFile=e=>{if(!e.startsWith("file://"))return!1;if(!e.endsWith(".pdf"))return!1;const 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})`},initState=("undefined"!=typeof module&&null!=module.exports&&(dummyModule=module,dummyModule.exports={isPaper:isPaper,isSourceURL:isSourceURL,paperToAbs:paperToAbs,paperToPDF:paperToPDF,findLocalFile:findLocalFile,matchPapersToFiles:matchPapersToFiles,matchAllFilesToPapers:matchAllFilesToPapers,mergePapers:mergePapers,addOrUpdatePaper:addOrUpdatePaper,parseIdFromUrl:parseIdFromUrl,isKnownLocalFile:isKnownLocalFile,makeMdLink:makeMdLink,updatePaperVisits:updatePaperVisits}),async(e,t)=>{const a=[];a.unshift(Date.now()),console.groupCollapsed("%cPaperMemory Init ✅",global.consolHeaderStyle),void 0===e&&(e=await getStorage("papers")??{},log("Time to retrieve stored papers (s): "+(Date.now()-a[0])/1e3)),a.unshift(Date.now()),global.state.dataVersion=getManifestDataVersion(),log("Time to parse data version (s): "+(Date.now()-a[0])/1e3),a.unshift(Date.now()),global.state.titleFunction=(await getTitleFunction()).titleFunction,log("Time to make title function (s): "+(Date.now()-a[0])/1e3),a.unshift(Date.now()),weeklyBackup(),log("Time to backup papers (weekly) (s): "+(Date.now()-a[0])/1e3),a.unshift(Date.now());var r,i,o=await migrateData(e,global.state.dataVersion);log("Time to migrate data (s): "+(Date.now()-a[0])/1e3),a.unshift(Date.now()),e=o.papers,global.state.papers=e,global.state.prefs=await getPrefs(),log("Time to retrieve user preferences (s): "+(Date.now()-a[0])/1e3),a.unshift(Date.now()),global.state.ignoreSources=await getStorage("ignoreSources")??{},log("Time to retrieve sources to ignore (s): "+(Date.now()-a[0])/1e3),a.unshift(Date.now()),global.state.urlHashToId=await getStorage("urlHashToId")??{},log("Time to retrieve sources to urlHashToId (s): "+(Date.now()-a[0])/1e3),a.unshift(Date.now()),global.state.titleHashToIds={};for([r,i]of Object.entries(cleanPapers(e))){var s=miniHash(i.title);global.state.titleHashToIds.hasOwnProperty(s)||(global.state.titleHashToIds[s]=[]),global.state.titleHashToIds[s].push(r)}log("Time to hash titles (s): "+(Date.now()-a[0])/1e3),a.unshift(Date.now()),t||(global.state.files=await matchAllFilesToPapers(),log("Time to match all local files (s): "+(Date.now()-a[0])/1e3),a.unshift(Date.now()),global.state.papersList=Object.values(cleanPapers(e)),global.state.sortKey="lastOpenDate",global.state.papersReady=!0,sortMemory(),log("Time to sort memory (s): "+(Date.now()-a[0])/1e3),a.unshift(Date.now()),makeTags(),log("Time to make tags (s): "+(Date.now()-a[0])/1e3),a.unshift(Date.now())),info("State init duration (s): "+(Date.now()-a.last())/1e3),console.groupEnd()}),sortMemory=()=>{global.state.sortedPapers=Object.values(cleanPapers(global.state.papers)),global.state.sortedPapers.sort(orderPapers),global.state.papersList.sort(orderPapers)},orderPapers=(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()),0<=global.descendingSortKeys.indexOf(global.state.sortKey)?a>r?-1:1:a>r?1:-1},makeTags=()=>{let e=new Set;for(const t of global.state.sortedPapers)for(const a of t.tags)e.add(a);global.state.paperTags=Array.from(e),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},getTitleFunction=async(code=null)=>{let titleFunction;code=code||await getStorage("titleFunctionCode"),void 0===code&&(code=global.defaultTitleFunctionCode);let errorMessage;try{titleFunction=eval(code)}catch(error){errorMessage="Error parsing the title function: "+error,log("Error parsing the title function. Function string then error:"),log(code),log(error),titleFunction=eval(global.defaultTitleFunctionCode),code=global.defaultTitleFunctionCode}try{const examplePaper=await getExamplePaper(0),result=titleFunction(examplePaper);if("string"!=typeof result)throw new Error(`Result ${result} is not a string`)}catch(error){errorMessage="Error executing the title function: "+error,log("Error testing the user's title function. Function string then error:"),log(code),log(error),titleFunction=eval(global.defaultTitleFunctionCode),code=global.defaultTitleFunctionCode}return{titleFunction:titleFunction,code:code.trim(),errorMessage:errorMessage}},stateTitleFunction=paperOrId=>{let paper=paperOrId;if("string"==typeof paperOrId&&(paper=global.state.papers[paperOrId],void 0===paper))return log("Error in stateTitleFunction: unknown id",paperOrId),"Unknown ID";let name;try{name=global.state.titleFunction(paper)}catch(error){log("Error in stateTitleFunction:",error),name=eval(global.defaultTitleFunctionCode)(paper)}return name.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(const 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,dummyModule.exports={initState:initState,getExamplePaper:getExamplePaper,getTitleFunction:getTitleFunction,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-","");return fetch("https://export.arxiv.org/api/query?"+new URLSearchParams({id_list:e}))},fetchCvfHTML=async e=>{let t,a;if(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_")){const{conf:r,year:i}=parseCVFUrl(e);t=t.replace(`/content_${r}_${i}/`,`/content_${r.toLowerCase()}_${i}/`),a=await fetch(t).then(e=>e.ok?e.text():"")}return a},fetchOpenReviewNoteJSON=async e=>{e=e.match(/id=([\w-])+/)[0].replace("id=","");return fetch("https://api.openreview.net/notes?id="+e).then(e=>e.json())},fetchOpenReviewForumJSON=async e=>{e=e.match(/id=([\w-])+/)[0].replace("id=","");return fetch("https://api.openreview.net/notes?forum="+e).then(e=>e.json())},fetchDom=async e=>{const t=await fetch(e).then(e=>e.ok?e.text():"");return(new DOMParser).parseFromString(t.replaceAll("\n",""),"text/html")},fetchText=async e=>{try{const t=await fetch(e),a=t.ok?await t.text():"";return a.trim()}catch(e){return console.log("fetchText error:",e),""}},fetchJSON=async e=>{try{const t=await fetch(e);return t.ok?await t.json():null}catch(e){return console.log("fetchJSON error:",e),null}},extractCrossrefData=e=>{if(e.status&&"ok"===e.status)if("work"!==e["message-type"])error("Unknown `message-type` from CrossRef",e);else{const s=e.message;log("Crossref data.message: ",s);var t=s.author.map(e=>e.given+" "+e.family).join(" and ");const n=s.issued?s.issued["date-parts"][0][0]+"":s.published?s.published["date-parts"][0][0]+"":null;if(n){var a=s.title[0];if(a){var r=s["container-title"][0]??"Springer",i=[miniHash(s.author[0].family),n.slice(2),firstNonStopLowercase(a)].join(""),o=s.DOI;let e={entryType:"book"===s.type?"book":"book-chapter"===s.type?"InBook":s.type.includes("article")?"Article":"InProceedings",citationKey:i,publisher:s.publisher,author:t,title:a,year:n,doi:o};s.page&&(e.pages=s.page),s.volume&&(e.volume=s.volume),s.type.includes("journal")&&(e.journal=r),s.link&&0"application/pdf"===e["content-type"]))&&(e.pdf=i.URL),(t=s.link.find(e=>"text/html"===e["content-type"])??s.link[0])&&(e.url=t.URL));a=bibtexToString(e);return{...e,bibtex:a,venue:r}}error("Cannot find title in CrossRef data",s)}else error("Cannot find year in CrossRef data",s)}else error("Cannot parse CrossRef response",e)},fetchCrossRefDataForDoi=async e=>{e=await fetchJSON(`https://api.crossref.org/works/${e}?mailto=schmidtv%40mila.quebec`);return extractCrossrefData(e)},fetchSemanticsScholarDataForDoi=async e=>{const t=await fetchJSON(`https://api.semanticscholar.org/graph/v1/paper/${e}?fields=venue,year,authors,title`);let a;var r;return t&&(a={},t.venue&&(a.venue=t.venue),t.year&&(a.year=t.year),t.authors&&(a.author=t.authors.map(e=>e.name).join(" and ")),t.title&&(a.title=t.title),e=""+miniHash(t.authors[0].name)+firstNonStopLowercase(a.title),r=bibtexToString({entryType:"article",citationKey:e,...a}),a.bibtex=r,a.key=e),a},getMetaContent=(e,t,a=!1)=>{e="meta"+Object.entries(e).map(([e,t])=>`[${e}='${t}']`).join("");return a?Array.from(t.querySelectorAll(e)).map(e=>e.getAttribute("content")??""):t.querySelector(e)?.getAttribute("content")??""},extractDataFromDCMetaTags=e=>{const t=getMetaContent({name:"dc.Creator"},e,!0).map(e=>e.replace(/([a-z])([A-Z])/g,"$1 $2")).join(" and ");if(!t)return null;var a=getMetaContent({name:"dc.Date"},e).split("-")[0],r=getMetaContent({name:"dc.Publisher"},e).replaceAll("\n"," "),i=getMetaContent({name:"dc.Title"},e),o=getMetaContent({name:"citation_journal_title"},e),s=(""+t.split(" and ")[1].split(" ")[0]+a+firstNonStopLowercase(i)).toLowerCase(),e=getMetaContent({name:"dc.Date",scheme:"doi"},e),n=bibtexToString({citationKey:s,entryType:"article",title:i,author:t,year:a,doi:e,publisher:r,journal:o});return{author:t,year:a,publisher:r,title:i,venue:o,key:s,doi:e,bibtex:n,note:`Published @ ${o} (${a})`}},makeArxivPaper=async e=>{e=e.match(/\/(\d{4}\.\d{4,5})/)[1];const t=await fetchArxivXML(e),a=await t.text();var r=(new DOMParser).parseFromString(a.replaceAll("\n",""),"text/xml");const i=Array.from(r.querySelectorAll("author name")).map(e=>e.innerHTML);var o=i.join(" and "),s=Array.from(r.getElementsByTagName("link")).map(e=>e.getAttribute("href")).filter(e=>e.includes("arxiv.org/pdf/"))[0].replace(/v\d+\.pdf$/gi,".pdf"),n=r.querySelector("entry title").innerHTML,r=r.querySelector("entry published").innerHTML.slice(0,4),l=i[0].split(" ").last().toLowerCase()+r+firstNonStopLowercase(n),e="Arxiv-"+e,p="";return{author:o,bibtex:p+`@article{${l}, +`);return(t.slice(0,-2)+"\n}").replaceAll("\t"," ").replaceAll("--","-")},extractBibtexValue=(e,t)=>{const a=bibtexToObject(e);return a.hasOwnProperty(t)?a[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,dummyModule.exports={bibtexToObject:bibtexToObject,bibtexToString:bibtexToString,extractBibtexValue:extractBibtexValue,extractAuthor:extractAuthor}),"undefined"!=typeof LOGTRACE&&LOGTRACE),log=(...e)=>{if(logTrace){const n=(new Error).stack;e.push("\n\nLog trace:\n"+n.split("\n").slice(2).join("\n"))}let t="%c%s ",a=!1,r=!1,i=!1,o=!1,s=!1;"[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]?(s=!0,e=e.slice(1)):"[debug]"===e[0]&&(o=!0,e=e.slice(1)),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;":s?"#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),getDisplayId=e=>{var t=e;if((e=e.split("_")[0].split(".")[0]).startsWith("OR-")||(e=e.split("-").slice(0,2).join("-")),global.state.papers.hasOwnProperty(t)){const a=global.state.papers[t];if("nature"===a.source){if(a.note.match(/^Published\ @.+\(\d+\)$/)){const r=a.note.split("@")[1].split("(")[0].trim();e+="-"+r.split(" ").map(e=>e[0].toUpperCase()).join("")}e+="-"+a.year}"acs"===a.source&&(e+="-"+a.year),"iop"===a.source&&(e+="-"+a.year)}return 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="),delay=(t,a)=>{let r=0;return(...e)=>{clearTimeout(r),r=setTimeout(t.bind(this,...e),a||0)}},cleanPapers=e=>{let t={...e};return delete t.__dataVersion,t},firstNonStopLowercase=e=>{let t=e.toLowerCase(),a=t.split(" ").map(miniHash);e=a.filter(e=>!global.englishStopWords.has(e));return(0e.toLowerCase().replace(/\W/g,""),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)},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()},eventId=e=>e.target.closest(".memory-container").id.split("--")[1],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",e=e.substring(e.lastIndexOf("/")+1),a.download=t||e,navigator.userAgent.toLowerCase().match(/(ipad|iphone|safari)/)&&navigator.userAgent.search("Chrome")<0?document.location=a.href:(t=new MouseEvent("click",{view:window,bubbles:!0,cancelable:!1}),a.dispatchEvent(t),(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=>{const 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]);e=e.split("/").last().split(".")[0],e=(hashCode(e)+"").replace("-","").slice(0,8),e=`${a}-${r}_`+e;return{conf:a,year:r,id:e}},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``;case"circle-x":return``;case"star":return``;case"writing":return``;case"file-symlink":return``;case"link":return``;case"clipboard-list":return``;case"archive":return``;case"external-link":return``;case"file-download":return``;case"cirlce-x":return``;case"settings":return``;case"messages":return``;case"vocabulary":return``;case"database-export":return``;case"eyeglass":return``;case"markdown":return``;case"math-function":return``;default:return""}},stringifyError=e=>{const 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=>{let t=Array.from(e.selectedOptions,e=>e.value.trim()).filter(e=>e);return t.sort(),t},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("popup-item-tags--"+e)),findEl("checkFavorite--"+e).checked):(a=val(findEl(e,"form-note-textarea")),i=val(findEl(e,"form-code-input")),r=parseTags(findEl(e,"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=(p,c)=>e=>{let t;t=void 0===p?eventId(e):p;var a=getPaperEdits(t,c),r=global.state.papers[t];let i=!1,o={};for(const l in a){var s=r[l],n=(o[l]=s,a[l]);"tags"===l?arraysIdentical(s,n)||(i=!0):s!==n&&(i=!0)}i&&(console.log("Updating meta data for",t),(c?handlePopupSaveEdits:handleMemorySaveEdits)(t))},cutAuthors=(e,t,a)=>{void 0===t&&(t=140),void 0===a&&(a=", ");let r="";var e=e.split(" and "),i=e[e.length-1];for(const o of e){if(!(5+r.length+a.length+o.length+i.lengthnew Promise(t=>{chrome.runtime.sendMessage(e,e=>{t(e)})}),getStoredFiles=()=>new Promise(t=>{chrome.downloads.search({filenameRegex:"PaperMemoryStore/.*"},e=>t(e.filter(e=>e.exists&&"complete"===e.state&&!e.filename.toLowerCase().includes("readme.txt"))))}),noParamUrl=e=>e.split("?")[0].split("#")[0],silentPromiseTimeout=(e,a=5e3)=>{let r;return Promise.race([e,new Promise((e,t)=>r=setTimeout(e,a))]).finally(()=>clearTimeout(r))},migrateData=("undefined"!=typeof module&&null!=module.exports&&(dummyModule=module,dummyModule.exports={log:log,info:info,logError:logError,logOk:logOk,debug:debug,warn:warn,getDisplayId:getDisplayId,isObject:isObject,isPdfUrl:isPdfUrl,delay:delay,cleanPapers:cleanPapers,firstNonStopLowercase:firstNonStopLowercase,fallbackCopyTextToClipboard:fallbackCopyTextToClipboard,copyTextToClipboard:copyTextToClipboard,parseUrl:parseUrl,downloadTextFile:downloadTextFile,eventId:eventId,downloadFile:downloadFile,hashCode:hashCode,parseCVFUrl:parseCVFUrl,cleanBiorxivURL:cleanBiorxivURL,textareaFocusEnd:textareaFocusEnd,tablerSvg:tablerSvg,stringifyError:stringifyError,arraysIdentical:arraysIdentical,parseTags:parseTags,getPaperEdits:getPaperEdits,setFormChangeListener:setFormChangeListener,monitorPaperEdits:monitorPaperEdits,cutAuthors:cutAuthors,sendMessageToBackground:sendMessageToBackground,getStoredFiles:getStoredFiles,miniHash:miniHash,noParamUrl:noParamUrl,silentPromiseTimeout:silentPromiseTimeout}),async(a,t,e=!0)=>{if(void 0===a)return chrome.storage.local.set({papers:{__dataVersion:t}}),{papers:{__dataVersion:t},success:!0};var r,i,o,s=a.__dataVersion||-1,n=[];let l={...a};try{if(502<=s)return{papers:a,success:!0};e&&backupData({...a}),delete a.__dataVersion;for(const p in a)s<5&&(info("Applying migration 5"),a[p].hasOwnProperty("bibtex")||(a[p].bibtex="",log("Migrating bibtex for "+p)),a[p].pdfLink.endsWith(".pdf")||(a[p].pdfLink=a[p].pdfLink+".pdf"),a[p].codeLink||(a[p].codeLink=""),a[p].source||(a[p].id.includes("NeurIPS")?a[p].source="neurips":a[p].source="arxiv")),s<208&&(info("Applying migration 0.2.8"),"arxiv"!==a[p].source&&a[p].md.includes("https://arxiv.com/abs/")&&(a[p].md=`[${a[p].title}](${a[p].pdfLink})`),"arxiv"!==a[p].source&&a[p].pdfLink.includes("arxiv.org/pdf/")&&(a[p].source="arxiv"),p.match(/^\d/)&&"arxiv"===a[p].source&&(r="Arxiv-"+p,i={...a[p],id:r},a[r]=i,n.push(p))),s<209&&(info("Applying migration 0.2.9"),a[p].hasOwnProperty("favorite")||(a[p].favorite=!1,a[p].favoriteDate="")),s<210&&(info("Applying migration 0.2.10"),"arxiv"===a[p].source&&(o=a[p].pdfLink.match(/v\d+\.pdf/gi))&&0{delete a[e],log("Deleting "+e)}),(l={...a}).__dataVersion=t,e&&chrome.storage.local.set({papers:l},()=>{log("Migrated papers:"),log(l),log("Data version is now "+t)}),{papers:l,success:!0}}catch(e){return log(`Error migrating data from version ${s} to ${t}:`),log(e),{papers:l,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]),a?(setStorage("papers",t),log("Successfully deleted paper",e)):log("Error: no deletion")},getTheme=async()=>{return await getStorage("checkDarkMode")?"dark":"light"},backupData=async a=>{chrome.storage.local.get("papersBackup",({papersBackup:e})=>{void 0===e&&(e={});for(const 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)}const weeklyBackup=async()=>{var e=await getStorage("weeklyBackups")??{};const 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;const a=await getStorage("prefs")??{};(e=0===Object.keys(a).length?!0:e)&&(t=await getStorage(global.prefsStorageKeys)??{});let r={};for(const i of global.prefsCheckNames)r[i]=(t??a).hasOwnProperty(i)?(t??a)[i]:!(0<=global.prefsCheckDefaultFalse.indexOf(i));return r.checkOfficialRepos&&(setStorage("pwcPrefs",{official:!0}),delete r.checkOfficialRepos,setStorage("prefs",r)),e&&setStorage("prefs",r),r},getManifestDataVersion=()=>{const e=chrome.runtime.getManifest();return e.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=(e,t=!0)=>{const a={addDate:{type:"string",desc:"the paper's date of addition to the Memory",default:e=>(new Date).toJSON()},author:{type:"string",desc:"` and `-separated authors `${firstName} ${lastName}`"},bibtex:{type:"string",desc:"BibTex citation with new lines (`\n`)"},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=>""},count:{type:"number",desc:"the paper's number of visits",default:e=>1},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"},tags:{type:"array[string]",desc:"the user's tags for this paper",default:e=>[]},venue:{type:"string",desc:"the paper's publication venue",default:e=>""},year:{type:"string",desc:"year of publication"}};let r=[];for(const l in a)if(e.hasOwnProperty(l)){const p=a[l].type;var i,o=typeof e[l];p.includes("array")||"object"===p?p.includes("array")?Array.isArray(e[l])?(s=p.split("[")[1].replace("]",""),0{let t=!0,a="",r="",i;try{e.__dataVersion||(e.__dataVersion=1);var o,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(const n in i=s.papers)n.startsWith("__")||(paperWarnings=validatePaper(i[n]).warnings)&&0"+paperWarnings.join("
"));a&&(o=await getStorage("papers")??{},setStorage("uploadBackup",o)),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},isPaper=("undefined"!=typeof module&&null!=module.exports&&(dummyModule=module,dummyModule.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}),async(e,t=!1)=>{let a={};if(!e)return a;for(const i in global.knownPaperPages){var r=global.knownPaperPages[i];a[i]=!1;for(const o of r)"string"==typeof o?e.includes(o)&&(a[i]=!0):"function"==typeof o&&(a[i]=o(e))}return a.localFile=isKnownLocalFile(e),a.stored=!t&&await findLocalFile(e),a}),isSourceURL=async(e,t)=>Object.values(await isPaper(e,t)).some(e=>e),paperToAbs=e=>{let t,a,r;const i=e.pdfLink;let o="";switch(e.source){case"arxiv":o="https://arxiv.org/abs/"+e.id.split("-")[1];break;case"neurips":o=i.replace("/file/","/hash/").replace("-Paper.pdf","-Abstract.html");break;case"cvf":o=i.replace("/papers/","/html/").replace(".pdf",".html");break;case"openreview":o=i.replace("/pdf?","/forum?");break;case"biorxiv":o=i.replace(".full.pdf","");break;case"pmlr":o=i.split("/").slice(0,-1).join("/")+".html";break;case"acl":o=i.replace(".pdf","");break;case"pnas":o=i.replace(".full.pdf","").replace("/doi/pdf/","/doi/full/");break;case"nature":o=i.replace(".pdf","");break;case"acs":o=i.replace("pubs.acs.org/doi/pdf/","pubs.acs.org/doi/").split("?")[0];break;case"iop":o=i.split("#")[0].replace(/\/pdf$/,"");break;case"jmlr":o=i.split("/").slice(0,-1).join("/").replace("/papers/volume","/papers/v")+".html";break;case"pmc":var s=i.match(/PMC\d+/)[0];o=i.split(s)[0]+s;break;case"ijcai":var s=i.replace(".pdf","").split("/").last().match(/[1-9]\d*/),n=i.match(/proceedings\/\d+/gi)[0].split("/")[1];o=`https://www.ijcai.org/proceedings/${n}/`+s;break;case"acm":o=i.replace("/doi/pdf/","/doi/");break;case"ieee":o="https://ieeexplore.ieee.org/document/"+e.key;break;case"springer":o=e.extra.url;break;case"aps":[t,a]=parseUrl(i).pathname.split("/").slice(1,3),o=i.replace(`/${t}/${a}/`,`/${t}/abstract/`);break;case"wiley":o=i.replace(/\/doi\/e?pdf\//g,"/doi/abs/");break;case"sciencedirect":n=i.split("/pii/")[1].split("/")[0].split("#")[0].split("?")[0];o="https://www.sciencedirect.com/science/article/pii/"+n;break;case"science":(r=i.split("/doi/")[1]).startsWith("10.")||(r=r.split("/").slice(1).join("/")),o="https://science.org/doi/full/"+r;break;case"frontiers":o=i.replace(/\/pdf$/,"/full");break;default:o="https://xkcd.com/1969/"}return o.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":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=Object.fromEntries(Object.values(e).map(e=>[e.id,miniHash(e.title)])),r=(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)])));let i={};for(const s of t){let t;try{(t=await parseIdFromUrl(s.finalUrl))&&e.hasOwnProperty(t)&&(i[t]=s)}catch(e){t=null}if(!t){const n=r[s.id];var o=Object.entries(a).find(([,e])=>n.includes(e));o&&(i[o[0]]=s)}}return i},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:{}})=>{const{oldPaper:t,newPaper:a,...r}=e;let i={...t};e={overwrites:["lastOpenDate"],incrementCount:!1,...r};for(const o in a)(!t.hasOwnProperty(o)||a[o]&&!t[o])&&(i[o]=a[o]);e.incrementCount&&1===i.count&&(i.count+=1);for(const s of e.overwrites)a.hasOwnProperty(s)&&(i[s]=a[s]);return i},updatePaperVisits=e=>(e.count+=1,e.lastOpenDate=(new Date).toJSON(),log("Updating paper to:",e),e),addOrUpdatePaper=async(t,e,i,o=!0,s={update:()=>{},preprints:()=>{}})=>{const n=Date.now();let l,p,c={};console.group("%cPaperMemory parsing 📕",global.consolHeaderStyle),global.state.papers=await getStorage("papers")??{};var a=await parseIdFromUrl(t),r=global.state.papers.hasOwnProperty(a);if(a&&r)l=updatePaperVisits(global.state.papers[a]),p=!1;else{if(!(l=await makePaper(e,t)))return;r=findFuzzyPaperMatch(global.state.titleHashToIds,l);if(r&&o){let e=global.state.papers[r];log("New paper",l,"already exists as",e),addPaperToTitleHashToId(l),!l.venue&&e.venue||l.venue&&e.venue?(e=mergePapers({newPaper:l,oldPaper:e,incrementCount:!1,overwrites:["lastOpenDate"]}),updateDuplicatedUrls(t,r)):!e.venue&&l.venue&&(await updateDuplicatedUrls(paperToAbs(e),l.id),await updateDuplicatedUrls(paperToPDF(e),l.id),await deletePaperInStorage(e.id,global.state.papers),e=mergePapers({newPaper:l,oldPaper:e,incrementCount:!1,overwrites:["lastOpenDate","venue","bibtex","id","key","pdfLink","source","year"]})),l=updatePaperVisits(e),p=!1}else p=!0}if(!l.codeLink||!l.venue)try{const m=await tryPWCMatch(l);var d=!l.codeLink&&m?.url,u=m?.note,h=m?.bibtex,f=!l.venue&&m?.venue;(c={codeLink:d,note:u,venue:f,bibtex:h}).codeLink&&(l.codeLink=c.codeLink,m.hasOwnProperty("note")&&delete m.note,l.code=m)}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.papers[l.id]=l),chrome.storage.local.set({papers:global.state.papers},async()=>{s.update(l);let e;if(p||c.codeLink?p?(o?logOk("Added '"+l.title+"' to your Memory!"):warn("Discovered '"+l.title+"' but did not store it."),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){var t,a=await tryPreprintMatch(l);for(const r of["note","venue","bibtex"])l[r]&&"bibtex"!==r||(t=a[r]??c[r])&&(log(`Updating preprint ${r} to`,t),l[r]=t);global.state.papers=await getStorage("papers")??{},p&&global.state.papers.hasOwnProperty(l.id)&&1e.find(e=>e.source===t&&e.id.includes(a))?.id,parseIdFromUrl=async t=>{let a;var 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=t.match(/\d{4}\.\d{4,5}/g)[0];a="Arxiv-"+i;const s=Object.values(global.state.titleHashToIds).find(e=>e.includes(a));s&&(a=s.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=findPaperId(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;const n=Object.values(global.state.titleHashToIds).find(e=>e.includes(a));n&&(a=n.find(e=>!e.startsWith("Biorxiv-"))??a)}else if(e.pmlr){const l=t.split("/").last().split(".")[0];o="20"+l.match(/\d+/)[0];a=`PMLR-${o}-`+l}else if(e.acl){i=(t=(t=t.replace(".pdf","")).endsWith("/")?t.slice(0,-1):t).split("/").last();a=findPaperId(r,"acl",i)}else if(e.pnas){o=((t=t.replace(".full.pdf","")).endsWith("/")?t.split("/").slice(-2):t.split("/").slice(-1))[0];a=findPaperId(r,"pnas",o)}else if(e.nature){i=(t=t.replace(".pdf","").split("#")[0]).split("/").last();a=findPaperId(r,"nature",i)}else if(e.acs){t=noParamUrl(t).replace("pubs.acs.org/doi/pdf/","/doi/").replace("pubs.acs.org/doi/abs/","/doi/");const doi=miniHash(t.split("/doi/")[1]);a="ACS_"+doi}else if(e.iop){t=noParamUrl(t).replace(/\/pdf$/,"");const doi=miniHash(t.split("/article/")[1]);a="IOPscience_"+doi}else if(e.jmlr){const p=(t=(t=t.endsWith(".pdf")?t.split("/").slice(0,-1).join("/"):t).replace(".html","")).split("/").last();o="20"+p.match(/\d+/)[0];a=`JMLR-${o}_`+p}else if(e.pmc){i=t.match(/PMC\d+/g)[0].replace("PMC","");a=findPaperId(r,"pmc",i)}else if(e.ijcai){o=t.endsWith(".pdf")?t.replace(".pdf","").split("/").last().match(/[1-9]\d*/):t.split("/").last(),i=t.match(/proceedings\/\d+/gi)[0].split("/")[1];a=`IJCAI-${i}_`+o}else if(e.acm){const doi=t.replace(/\/doi\/?(pdf|abs|full)?\//,"/doi/").split("/doi/")[1];a=findPaperId(r,"acm",miniHash(doi))}else if(e.ieee){i=(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=findPaperId(r,"ieee",i)}else if(e.springer){const c=global.sourceExtras.springer.types;let e=c.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"}o=t.split(`/${e}/`)[1].split("?")[0].replace(".pdf","");a=findPaperId(r,"springer",miniHash(o))}else if(e.aps){var[i,o]=parseUrl(t.split("#")[0]).pathname.split("/").slice(1,3);const doi=t.split(`/${i}/${o}/`).last();a=findPaperId(r,"aps",miniHash(doi))}else if(e.wiley){const doi=t.split("?")[0].split("#")[0].split("/").slice(-2).join("/");a=findPaperId(r,"wiley",miniHash(doi))}else if(e.sciencedirect){i=t.split("/pii/")[1].split("/")[0].split("#")[0].split("?")[0];a=findPaperId(r,"sciencedirect",miniHash(i))}else if(e.science)(doi=noParamUrl(t).split("/doi/")[1]).startsWith("10.")||(doi=doi.split("/").slice(1).join("/")),a=findPaperId(r,"science",miniHash(doi));else if(e.frontiers)doi=noParamUrl(t).split("/articles/")[1].split("/").slice(0,-1).join("/"),a=findPaperId(r,"frontiers",miniHash(doi));else{if(!e.localFile)throw new Error("unknown paper url");a=e.localFile}return a},isKnownLocalFile=e=>{if(!e.startsWith("file://"))return!1;if(!e.endsWith(".pdf"))return!1;const 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})`},initState=("undefined"!=typeof module&&null!=module.exports&&(dummyModule=module,dummyModule.exports={isPaper:isPaper,isSourceURL:isSourceURL,paperToAbs:paperToAbs,paperToPDF:paperToPDF,findLocalFile:findLocalFile,matchPapersToFiles:matchPapersToFiles,matchAllFilesToPapers:matchAllFilesToPapers,mergePapers:mergePapers,addOrUpdatePaper:addOrUpdatePaper,parseIdFromUrl:parseIdFromUrl,isKnownLocalFile:isKnownLocalFile,makeMdLink:makeMdLink,updatePaperVisits:updatePaperVisits}),async(e,t)=>{const a=[];a.unshift(Date.now()),console.groupCollapsed("%cPaperMemory Init ✅",global.consolHeaderStyle),void 0===e&&(e=await getStorage("papers")??{},log("Time to retrieve stored papers (s): "+(Date.now()-a[0])/1e3)),a.unshift(Date.now()),global.state.dataVersion=getManifestDataVersion(),log("Time to parse data version (s): "+(Date.now()-a[0])/1e3),a.unshift(Date.now()),global.state.titleFunction=(await getTitleFunction()).titleFunction,log("Time to make title function (s): "+(Date.now()-a[0])/1e3),a.unshift(Date.now()),weeklyBackup(),log("Time to backup papers (weekly) (s): "+(Date.now()-a[0])/1e3),a.unshift(Date.now());var r,i,o=await migrateData(e,global.state.dataVersion);log("Time to migrate data (s): "+(Date.now()-a[0])/1e3),a.unshift(Date.now()),e=o.papers,global.state.papers=e,global.state.prefs=await getPrefs(),log("Time to retrieve user preferences (s): "+(Date.now()-a[0])/1e3),a.unshift(Date.now()),global.state.ignoreSources=await getStorage("ignoreSources")??{},log("Time to retrieve sources to ignore (s): "+(Date.now()-a[0])/1e3),a.unshift(Date.now()),global.state.urlHashToId=await getStorage("urlHashToId")??{},log("Time to retrieve sources to urlHashToId (s): "+(Date.now()-a[0])/1e3),a.unshift(Date.now()),global.state.titleHashToIds={};for([r,i]of Object.entries(cleanPapers(e))){var s=miniHash(i.title);global.state.titleHashToIds.hasOwnProperty(s)||(global.state.titleHashToIds[s]=[]),global.state.titleHashToIds[s].push(r)}log("Time to hash titles (s): "+(Date.now()-a[0])/1e3),a.unshift(Date.now()),t||(global.state.files=await matchAllFilesToPapers(),log("Time to match all local files (s): "+(Date.now()-a[0])/1e3),a.unshift(Date.now()),global.state.papersList=Object.values(cleanPapers(e)),global.state.sortKey="lastOpenDate",global.state.papersReady=!0,sortMemory(),log("Time to sort memory (s): "+(Date.now()-a[0])/1e3),a.unshift(Date.now()),makeTags(),log("Time to make tags (s): "+(Date.now()-a[0])/1e3),a.unshift(Date.now())),info("State init duration (s): "+(Date.now()-a.last())/1e3),console.groupEnd()}),sortMemory=()=>{global.state.sortedPapers=Object.values(cleanPapers(global.state.papers)),global.state.sortedPapers.sort(orderPapers),global.state.papersList.sort(orderPapers)},orderPapers=(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()),0<=global.descendingSortKeys.indexOf(global.state.sortKey)?a>r?-1:1:a>r?1:-1},makeTags=()=>{let e=new Set;for(const t of global.state.sortedPapers)for(const a of t.tags)e.add(a);global.state.paperTags=Array.from(e),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},getTitleFunction=async(code=null)=>{let titleFunction;code=code||await getStorage("titleFunctionCode"),void 0===code&&(code=global.defaultTitleFunctionCode);let errorMessage;try{titleFunction=eval(code)}catch(error){errorMessage="Error parsing the title function: "+error,log("Error parsing the title function. Function string then error:"),log(code),log(error),titleFunction=eval(global.defaultTitleFunctionCode),code=global.defaultTitleFunctionCode}try{const examplePaper=await getExamplePaper(0),result=titleFunction(examplePaper);if("string"!=typeof result)throw new Error(`Result ${result} is not a string`)}catch(error){errorMessage="Error executing the title function: "+error,log("Error testing the user's title function. Function string then error:"),log(code),log(error),titleFunction=eval(global.defaultTitleFunctionCode),code=global.defaultTitleFunctionCode}return{titleFunction:titleFunction,code:code.trim(),errorMessage:errorMessage}},stateTitleFunction=paperOrId=>{let paper=paperOrId;if("string"==typeof paperOrId&&(paper=global.state.papers[paperOrId],void 0===paper))return log("Error in stateTitleFunction: unknown id",paperOrId),"Unknown ID";let name;try{name=global.state.titleFunction(paper)}catch(error){log("Error in stateTitleFunction:",error),name=eval(global.defaultTitleFunctionCode)(paper)}return name.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(const 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,dummyModule.exports={initState:initState,getExamplePaper:getExamplePaper,getTitleFunction:getTitleFunction,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-","");return fetch("https://export.arxiv.org/api/query?"+new URLSearchParams({id_list:e}))},fetchCvfHTML=async e=>{let t,a;if(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_")){const{conf:r,year:i}=parseCVFUrl(e);t=t.replace(`/content_${r}_${i}/`,`/content_${r.toLowerCase()}_${i}/`),a=await fetch(t).then(e=>e.ok?e.text():"")}return a},fetchOpenReviewNoteJSON=async e=>{e=e.match(/id=([\w-])+/)[0].replace("id=","");return fetch("https://api.openreview.net/notes?id="+e).then(e=>e.json())},fetchOpenReviewForumJSON=async e=>{e=e.match(/id=([\w-])+/)[0].replace("id=","");return fetch("https://api.openreview.net/notes?forum="+e).then(e=>e.json())},fetchDom=async e=>{const t=await fetch(e).then(e=>e.ok?e.text():"");return(new DOMParser).parseFromString(t.replaceAll("\n",""),"text/html")},fetchText=async e=>{try{const t=await fetch(e),a=t.ok?await t.text():"";return a.trim()}catch(e){return console.log("fetchText error:",e),""}},fetchJSON=async e=>{try{const t=await fetch(e);return t.ok?await t.json():null}catch(e){return console.log("fetchJSON error:",e),null}},extractCrossrefData=e=>{if(e.status&&"ok"===e.status)if("work"!==e["message-type"])error("Unknown `message-type` from CrossRef",e);else{const s=e.message;log("Crossref data.message: ",s);var t=s.author.map(e=>e.given+" "+e.family).join(" and ");const n=s.issued?s.issued["date-parts"][0][0]+"":s.published?s.published["date-parts"][0][0]+"":null;if(n){var a=s.title[0];if(a){var r=s["container-title"][0]??"Springer",i=[miniHash(s.author[0].family),n.slice(2),firstNonStopLowercase(a)].join(""),o=s.DOI;let e={entryType:"book"===s.type?"book":"book-chapter"===s.type?"InBook":s.type.includes("article")?"Article":"InProceedings",citationKey:i,publisher:s.publisher,author:t,title:a,year:n,doi:o};s.page&&(e.pages=s.page),s.volume&&(e.volume=s.volume),s.type.includes("journal")&&(e.journal=r),s.link&&0"application/pdf"===e["content-type"]))&&(e.pdf=i.URL),(t=s.link.find(e=>"text/html"===e["content-type"])??s.link[0])&&(e.url=t.URL));a=bibtexToString(e);return{...e,bibtex:a,venue:r}}error("Cannot find title in CrossRef data",s)}else error("Cannot find year in CrossRef data",s)}else error("Cannot parse CrossRef response",e)},fetchCrossRefDataForDoi=async e=>{e=await fetchJSON(`https://api.crossref.org/works/${e}?mailto=schmidtv%40mila.quebec`);return extractCrossrefData(e)},fetchSemanticsScholarDataForDoi=async e=>{const t=await fetchJSON(`https://api.semanticscholar.org/graph/v1/paper/${e}?fields=venue,year,authors,title`);let a;var r;return t&&(a={},t.venue&&(a.venue=t.venue),t.year&&(a.year=t.year),t.authors&&(a.author=t.authors.map(e=>e.name).join(" and ")),t.title&&(a.title=t.title),e=""+miniHash(t.authors[0].name)+firstNonStopLowercase(a.title),r=bibtexToString({entryType:"article",citationKey:e,...a}),a.bibtex=r,a.key=e),a},getMetaContent=(e,t,a=!1)=>{e="meta"+Object.entries(e).map(([e,t])=>`[${e}='${t}']`).join("");return a?Array.from(t.querySelectorAll(e)).map(e=>e.getAttribute("content")??""):t.querySelector(e)?.getAttribute("content")??""},extractDataFromDCMetaTags=e=>{const t=getMetaContent({name:"dc.Creator"},e,!0).map(e=>e.replace(/([a-z])([A-Z])/g,"$1 $2")).join(" and ");if(!t)return null;var a=getMetaContent({name:"dc.Date"},e).split("-")[0],r=getMetaContent({name:"dc.Publisher"},e).replaceAll("\n"," "),i=getMetaContent({name:"dc.Title"},e),o=getMetaContent({name:"citation_journal_title"},e),s=(""+t.split(" and ")[1].split(" ")[0]+a+firstNonStopLowercase(i)).toLowerCase(),e=getMetaContent({name:"dc.Date",scheme:"doi"},e),n=bibtexToString({citationKey:s,entryType:"article",title:i,author:t,year:a,doi:e,publisher:r,journal:o});return{author:t,year:a,publisher:r,title:i,venue:o,key:s,doi:e,bibtex:n,note:`Published @ ${o} (${a})`}},makeArxivPaper=async e=>{e=e.match(/\/(\d{4}\.\d{4,5})/)[1];const t=await fetchArxivXML(e),a=await t.text();var r=(new DOMParser).parseFromString(a.replaceAll("\n",""),"text/xml");const i=Array.from(r.querySelectorAll("author name")).map(e=>e.innerHTML);var o=i.join(" and "),s=Array.from(r.getElementsByTagName("link")).map(e=>e.getAttribute("href")).filter(e=>e.includes("arxiv.org/pdf/"))[0].replace(/v\d+\.pdf$/gi,".pdf"),n=r.querySelector("entry title").innerHTML,r=r.querySelector("entry published").innerHTML.slice(0,4),l=i[0].split(" ").last().toLowerCase()+r+firstNonStopLowercase(n),e="Arxiv-"+e,p="";return{author:o,bibtex:p+`@article{${l}, `+`title={${n} }, `+`author={${o} }, `+`year={${r}}, @@ -28,4 +28,4 @@ const findEl=(e,t)=>void 0===t?"string"==typeof e?document.getElementById(e):e:f `+`author={${r}}, `+`year={${i}}, `+`url={${t}}, -`+"}"},makeOpenReviewPaper=async e=>{var t=await fetchOpenReviewNoteJSON(e),a=await fetchOpenReviewForumJSON(e),t=t.notes[0],a=a.notes,r=t.content.title,i=t.content.authors.join(" and "),o=bibtexToString(t.content._bibtex||makeOpenReviewBibTex(t,e)),s=bibtexToObject(o),n=s.citationKey,s=s.year;let l;l=t.pdf?"https://openreview.net/pdf?id="+t.id:(t.html||e).replace("/forum?id=","/pdf?id=");const p=t.invitation.split("/");let c=p[0].split(".")[0],d=p.slice(1).join("/").split("-")[0].replaceAll("/"," ").replace(" Conference",""),u=c,h=!1;global.overrideORConfs.hasOwnProperty(c)&&(u=global.overrideORConfs[c],h=!0),h&&(d=d.replace(u,""),c=u);e=(c+" "+d).replace(/ \d\d\d\d/g,"").replace(/\s\s+/g," "),t=`OR-${c}-${s}_`+t.id;let f,m,g,y="";return(f=a.filter(e=>e&&e.content&&-1<["Final Decision","Paper Decision","Acceptance Decision"].indexOf(e.content.title)))&&00===t?e+"ed":e).join(" "),g=m+` @ ${e} (${s})`,m.toLowerCase().indexOf("rejected")<0&&(y=e)),{author:i,bibtex:o,id:t,key:n,note:g="Anonymous"===i?`Under review @ ${e} (${s}) (${(new Date).toLocaleDateString()})`:g,pdfLink:l,title:r,venue:y,year:s}},makeBioRxivPaper=async e=>{var t=e.replace(".full.pdf",""),a="https://api.biorxiv.org//details/biorxiv/"+e.split("/").slice(-2).join("/").replace(".full.pdf","").split("v")[0];const r=await fetch(a).then(e=>e.json());if("ok"!==r.messages[0].status)throw new Error(a+" returned "+r.messages[0].status);const i=r.collection.last(),o=await fetchText(t),s=(new DOMParser).parseFromString(o.replaceAll("\n",""),"text/html");a=s.querySelector(".bibtext a").getAttribute("href");const n=bibtexToString(await(await fetch(a)).text());var t=extractAuthor(n),a=await parseIdFromUrl(e),l=n.split("\n")[0].split("{")[1].replace(",","").trim(),e=cleanBiorxivURL(e)+".full.pdf",p=i.title,c=i.date.split("-")[0];return{author:t,bibtex:n,id:a,key:l,note:"",pdfLink:e,title:p,venue:"",year:c}},makePMLRPaper=async e=>{var t=e.split("/").last().split(".")[0],a=await parseIdFromUrl(e);const r=e.includes(".html")?e:e.split("/").slice(0,-2).join("/")+`/${t}.html`;e=r.replace(".html","")+`/${t}.pdf`;const i=await fetchDom(r);i.getElementById("button-bibtex1").getAttribute("onclick").match(/https.+\.bib/)[0];const o=i.getElementById("bibtex").innerText.replaceAll("\t"," ").replaceAll(/\s\s+/g," ");let s=o;for(const u of o.match(/,\ ?\w+ ?= ?{/g))s=s.replace(u,u.replace(", ",",\n ").replace(" = ","="));s.endsWith("}}")&&(s=s.slice(0,-2)+"}\n}"),s=bibtexToString(s);var n=extractAuthor(s),l=i.getElementsByTagName("h1")[0].innerText,p=extractBibtexValue(s,"year");let c=extractBibtexValue(s,"booktitle").replaceAll("Proceedings of the",""),d=c;note=`Accepted @ ${d} (${p})`;for(const h in global.overridePMLRConfs)if(c.includes(h)){d=global.overridePMLRConfs[h],c=d+" "+p,note="Accepted @ "+c;break}return{author:n,bibtex:s,id:a,key:t,note:note,pdfLink:e,title:l,venue:d,year:p}},findACLValue=(e,t)=>{return Array.from(e.querySelectorAll("dt")).filter(e=>e.innerText.includes(t))[0].nextElementSibling.innerText},makeACLPaper=async e=>{e=e.replace(".pdf","");const t=await fetchDom(e);e=t.getElementById("citeBibtexContent");if(e){var a=t.getElementById("title").innerText,e=bibtexToString(e.innerText);const l=bibtexToObject(e);var r=l.year,i=l.author.replace(/\s+/g," ").split(" and ").map(e=>e.split(",").map(e=>e.trim()).reverse().join(" ")).join(" and "),o=l.citationKey,s=findACLValue(t,"Venue"),n=findACLValue(t,"PDF");return{author:i,bibtex:e,id:`ACL-${s}-${r}_`+findACLValue(t,"Anthology ID"),key:o,note:`Accepted @ ${s} (${r})`,pdfLink:n,title:a,venue:s,year:r}}},makePNASPaper=async e=>{e=e.replace(".full.pdf","").replace(/\/doi\/e?pdf\//,"/doi/abs/");const t=await fetchDom(e);var a=t.getElementsByTagName("h1")[0].innerText,r=Array.from(t.querySelectorAll(".authors span[property='author'] a:not([property='email']):not(.orcid-id)")).filter(e=>!e.getAttribute("href").includes("mailto:")).map(e=>e.innerText).join(" and "),i=t.querySelector("span[property='datePublished']").innerText.match(/\d{4}/g)[0],o=`PNAS-${i}_`+(e.endsWith("/")?e.split("/").slice(-2):e.split("/").slice(-1))[0];const s=e.includes("/doi/pdf/")||e.includes("/doi/epdf/")?e.replace("/doi/epdf/","/doi/pdf/"):e.replace("/doi/abs/","/doi/pdf/").replace("/doi/full/","/doi/pdf/");var e=Array.from(t.querySelector(".core-container").getElementsByTagName("a")).map(e=>e.getAttribute("href")).filter(e=>e?.includes("https://doi.org"))[0].split("/").slice(-2).join("/"),n="doi:"+e;return{author:r,bibtex:bibtexToString(`@article{${n}, author={${r}}, title={${a}}, journal = {Proceedings of the National Academy of Sciences}, year={${i}}, doi={${e}}, eprint={${s}}, URL={${s.replace("/doi/pdf/","/doi/abs/")}} }`),id:o,key:n,note:`Published @ PNAS (${i})`,pdfLink:s,title:a,venue:"PNAS",year:i}},makeNaturePaper=async e=>{var t=(e=e.replace(".pdf","").split("#")[0])+".pdf",a=e.split("/").last();const r=await fetchDom(e);e=r.querySelector("h1.c-article-title").innerText;const i=Array.from(r.querySelectorAll("ul.c-article-author-list li")).map(e=>e.innerText.replace(/(\ ?,)|&|…|\d/g,"").split(/orcid/i)[0].trim()).filter(e=>0e.innerText).filter(e=>e.includes("https://doi.org"))[0];var l=""+i.split(" ")[1]+o+firstNonStopLowercase(e);let p={citationKey:l,entryType:"article",author:i,title:e,journal:s,year:o};n&&(p.doi=n,p.url="https://doi.org/"+n);var c=bibtexToString(p);return{author:i,bibtex:c,id:a,key:l,note:`Published @ ${s} (${o})`,pdfLink:t,title:e,venue:s,year:o}},makeACSPaper=async e=>{const t=(e=e.replace("pubs.acs.org/doi/pdf/","pubs.acs.org/doi/").split("?")[0]).replace("/abs/","/").split("/doi/")[1];console.log("doi: ",t);e=`https://pubs.acs.org/action/downloadCitation?doi=${t}&include=cit&format=bibtex&direct=true`,e=await fetchText(e);const a=bibtexToObject(e);var r=a.author.replaceAll("\n","").trim(),i=a.title.trim(),o=a.year.trim(),s=a.citationKey.trim(),n="https://pubs.acs.org/doi/pdf/"+t,l=`Published @ ${a.journal} (${a.year})`;return{author:r,bibtex:e,id:"ACS_"+t.replaceAll(".","").replaceAll("/",""),key:s,note:l,pdfLink:n,title:i,venue:a.journal,year:o}},makeIOPPaper=async e=>{(e=e.split("#")[0]).endsWith("/pdf")&&(e=e.slice(0,-4));const t=await fetchDom(e);var a=Array.from(t.querySelectorAll(".btn-multi-block a")).filter(e=>"BibTeX"===e.innerText).map(e=>e.getAttribute("href"))[0],a="https://"+parseUrl(e).host+a,a=await fetchText(a);const r=bibtexToObject(a);var i=r.author.replaceAll("\n","").trim(),o=r.title.trim(),s=r.year.trim(),n=r.citationKey.trim(),l=e+"/pdf",p=r.journal,c=`Published @ ${p} (${s})`;const d=e.split("/article/").last();return{author:i,bibtex:a,id:"IOPscience_"+d.replaceAll(".","").replaceAll("/",""),key:n,note:c,pdfLink:l,title:o,venue:p,year:s}},makeJMLRPaper=async e=>{var t=(e=(e=(e=e.includes("/papers/volume")?e.replace("/papers/volume","/papers/v"):e).endsWith(".pdf")?e.split("/").slice(0,-1).join("/"):e).replace(".html","")).split("/").last(),a=e+".bib",a=await fetchText(a);const{author:r,year:i,title:o,citationKey:s}=bibtexToObject(a);return{author:r,bibtex:a,id:`JMLR-${i}_`+t,key:s.trim(),note:`Published @ JMLR (${i})`,pdfLink:e.replace("/papers/v","/papers/volume")+`/${t}.pdf`,title:o,venue:"JMLR",year:i}},makePMCPaper=async e=>{var t=e.match(/PMC\d+/)[0].replace("PMC",""),a=e.split("PMC"+t)[0]+"PMC"+t;const r=await(await fetch(`https://api.ncbi.nlm.nih.gov/lit/ctxp/v1/pmc/?format=csl&id=${t}&download=true`)).json();var i=(r["epub-date"]||r.issued)["date-parts"][0][0],o=r.author.map(e=>e.given+" "+e.family).join(" and "),s=r["container-title"].split(" ").map(e=>e.capitalize()).join(" "),n=r.title,t=`PMC-${i}_`+t,l=""+r.author[0].family+i+firstNonStopLowercase(n),p=bibtexToString({entryType:"article",citationKey:l,journal:s,issn:r.ISSN,volume:r.volume,page:r.page,doi:r.DOI,PMID:r.PMID,PMCID:r.PMCID,publisher:r.publisher,author:o,title:n});let c;if(isPdfUrl(e))c=e;else{const h=r.DOI.split("/")[1].split("-");var e=h[0].match(/\d+/)[0],d=h[1].replace(h[1].match(/^0*/)[0],""),u=h[2].replace(h[2].match(/^0*/)[0],"");c=a+`/pdf/${e}_${d}_Article_${u}.pdf`}return{author:o,bibtex:p,id:t,key:l,note:`Published @ ${s} (${i})`,pdfLink:c,title:n,venue:s,year:i}},makePubMedPaper=async e=>{const t=await fetchDom(e.split("?")[0]),a=Array.from(t.getElementsByTagName("meta")).filter(e=>e.getAttribute("name")?.includes("citation_")),r=Object.fromEntries(a.map(e=>[e.getAttribute("name").replace("citation_",""),e.getAttribute("content")])),i=document.querySelector("div.authors-list").innerText.replace(/\d/gi,"").split(",").map(e=>e.trim()).join(" and ");var e=r.title,o=r.journal_title,s=r.date.split("/")[2],n=`PubMed-${s}_`+r.pmid,l=""+i.split(" and ")[0].split(" ").last()+s+firstNonStopLowercase(r.title),p={entryType:"article",citationKey:l,publisher:r.publisher,doi:r.doi,issn:r.issn,journal:o,year:s,author:i},p=bibtexToString(p),c=`Accepted @ ${journal} (${s})`;return{author:i,bibtex:p,id:n,key:l,note:c,pdfLink:"",title:e,venue:o,year:s}},makeIJCAIPaper=async e=>{const t=e.endsWith(".pdf")?e.replace(".pdf","").split("/").last().match(/[1-9]\d*/)[0]:e.split("/").last();e=e.match(/proceedings\/\d+/gi)[0].split("/")[1];const a=(await fetchText(`https://www.ijcai.org/proceedings/${e}/bibtex/`+t)).replace(/}\n/gi,"},\n");var r=bibtexToObject(a.split("\n").filter(e=>!/note\s+=/gi.test(e)).join("\n")),i=r.citationKey,o=r.title,r=flipAndAuthors(r.author),s=`IJCAI-${e}_`+t,n=`Accepted @ IJCAI (${e})`,l=t.padStart(4,0);return{author:r,bibtex:a,id:s,key:i,note:n,pdfLink:`https://www.ijcai.org/proceedings/${e}/${l}.pdf`,title:o,venue:"IJCAI",year:e}},makeACMPaper=async e=>{let t;t=isPdfUrl(e)?e:e.replace(/\/doi\/?(abs|full)?\//,"/doi/pdf/");const a=await fetchDom(e.replace("/doi/pdf/","/doi/"));let r,i,o,s,n,l,p,c;var d=extractDataFromDCMetaTags(a);if(d)({author:r,year:i,title:o,venue:s,key:n,doi:l,bibtex:p,note:c}=d);else{o=a.querySelector(".citation__title").innerText,r=Array.from(a.querySelectorAll("ul[ariaa-label='authors'] li.loa__item .loa__author-name")).map(e=>e.innerText.replace(",","").trim()).join(" and ");const u=a.querySelector(".issue-item__detail a").innerText;s=u.split("'")[0].trim(),i="20"+u.split("'")[1].split(":")[0].trim(),l=t.split("/doi/pdf/")[1],c=`Accepted @ ${s} (${i})`,n=l,p=bibtexToString({entryType:"article",citationKey:l,journal:s,author:r,title:o,year:i,publisher:"Association for Computing Machinery",address:"New York, NY, USA",url:e.replace("/doi/pdf/","/doi/")})}d=`ACM-${i}_`+miniHash(l);return{author:r,bibtex:p,id:d,key:n,note:c,pdfLink:t,title:o,venue:s,year:i}},makeIEEEPaper=async e=>{isPdfUrl(e)&&(e=`https://ieeexplore.ieee.org/document/${e.split("/stamp/stamp.jsp?tp=&arnumber=")[1].match(/\d+/)[0]}/`,console.log("url: ",e));const t=await fetchDom(e),a=JSON.parse(Array.from(t.getElementsByTagName("script")).filter(e=>e.innerHTML?.includes("metadata="))[0].innerHTML.split("metadata=")[1].split(/};\s*/)[0]+"}");var r=a.title,i=a.authors.map(e=>e.name).join(" and "),o=a.publicationYear,e=""+parseUrl(e).origin+a.pdfUrl,s=a.publicationTitle,n=a.articleId;return{author:i,bibtex:bibtexToString({entryType:"article",citationKey:n,journal:s,volume:a.volume,pages:a.startPage+"-"+a.endPage,doi:a.doi,title:r,year:o,author:i}),id:`IEEE-${o}_`+n,key:n,note:`Accepted @ ${s} (${o})`,pdfLink:e,title:r,venue:s,year:o}},makeSpringerPaper=async t=>{const e=[...global.sourceExtras.springer.types,"content/pdf"];var a=e.find(e=>t.includes(`/${e}/`));if(!a)throw new Error(`Could not find Springer type for ${t} (known: ${e.join(", ")})`);var r=t.split(`/${a}/`)[1].split("?")[0].replace(".pdf",""),i=await fetchCrossRefDataForDoi(r);if(!i)throw new Error("Aborting Springer paper parsing, see error above");var{author:o,bibtex:s,citationKey:n,year:l,title:p,venue:c}=i;return{author:o,bibtex:s,id:`Springer-${l}_`+miniHash(r),key:n,note:`Published @ ${c} (${l})`,pdfLink:i.pdf??("content/pdf"===a?t:t.replace(`/${a}/`,"/content/pdf/")+".pdf"),title:p,venue:c,year:l,extra:{url:"https://doi.org/"+r}}},makeAPSPaper=async e=>{e=e.split("#")[0];var[t,a]=parseUrl(e).pathname.split("/").slice(1,3),r=e.split(`/${t}/${a}/`).last(),i=e.replace(`/${t}/${a}/`,`/${t}/export/`),i=await fetchText(i+"?type=bibtex&download=true"),o=bibtexToObject(i),e=e.replace(`/${t}/${a}/`,`/${t}/pdf/`),a=`APS-${o.year}_`+miniHash(r),t=o.journal??o.publisher,r=(await readJournalAbbreviations(),global.journalAbbreviations[miniHash(t)]??t),t=`Published @ ${r} (${o.year})`;return{author:flipAndAuthors(o.author),bibtex:i,id:a,key:o.citationKey,note:t,pdfLink:e,title:o.title,venue:r,year:o.year}},makeWileyPaper=async e=>{const t=e.replace(/\/doi\/(abs|epdf|full)\//g,"/doi/pdf/");e=t.replace("/doi/pdf/","/doi/abs/");const a=await fetchDom(e);var e=Array.from(a.querySelectorAll("meta[name=citation_author]")).map(e=>e.getAttribute("content")).join(" and "),r=a.querySelector("meta[name=citation_journal_title]").getAttribute("content"),i=a.querySelector("meta[name=citation_title]").getAttribute("content"),o=a.querySelector("meta[name=citation_publisher]").getAttribute("content"),s=a.querySelector("meta[name=citation_publication_date]")?.getAttribute("content")?.split("/")[0]??a.querySelector("meta[name=citation_online_date]")?.getAttribute("content")?.split("/")[0],n=a.querySelector("meta[name=citation_doi]").getAttribute("content"),l=`Published @ ${r} (${s})`,p=`Wiley-${s}_`+miniHash(n);return{author:e,bibtex:bibtexToString({citationKey:n,entryType:"article",title:i,author:e,year:s,doi:n,publisher:o,journal:r}),id:p,key:n,note:l,pdfLink:t,title:i,venue:r,year:s}},makeScienceDirectPaper=async e=>{var e=e.split("/pii/")[1].split("/")[0].split("#")[0].split("?")[0],t=await fetchText(`https://www.sciencedirect.com/sdfe/arp/cite?pii=${e}&format=text%2Fx-bibtex&withabstract=false`),{author:a,journal:r,year:i,title:o,citationKey:s}=bibtexToObject(t),n=`Published @ ${r} (${i})`;return{author:a,bibtex:t,id:`ScienceDirect-${i}_`+miniHash(e),key:s,note:n,pdfLink:"https://reader.elsevier.com/reader/sd/pii/"+e,title:o,venue:r??"Science Direct",year:i}},makeSciencePaper=async e=>{let t,a,r,i,o,s,n,l,p,c,d;s="https://science.org/doi/pdf/"+(c=(c=noParamUrl(e).split("/doi/")[1]).startsWith("10.")?c:c.split("/").slice(1).join("/")),d="https://science.org/doi/full/"+c;var e=await fetchCrossRefDataForDoi(c);return e?({author:t,bibtex:a,title:n,venue:l,year:p}=e,i=e.citationKey,o=`Published @ ${l} (${p})`):(e=await fetchDom(d),{author:t,year:p,publisher,title:n,venue:l,key:i,bibtex:a,note:o}=extractDataFromDCMetaTags(e)),r=`Science-${p}_`+miniHash(c),{author:t,bibtex:a,id:r,key:i,note:o,pdfLink:s,title:n,venue:l,year:p}},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=>{try{var t="https://api.crossref.org/works?rows=1&mailto=schmidtv%40mila.quebec&select=event%2Ctitle&query.title="+encodeURI(e.title);const r=await fetch(t).then(e=>e.json());if("ok"!==r.status)return log(`[Crossref] ${t} returned `+r.message.status),{note:null};if(0===r.message.items.length)return{note:null};if(r.message.items[0].title[0].toLowerCase().replaceAll("\n"," ").replaceAll(/\s\s+/g," ")!==e.title.toLowerCase().replaceAll("\n"," ").replaceAll(/\s\s+/g," "))return{note:null};if(!r.message.items[0].event||!r.message.items[0].event.name)return{note:null};info("Found a CrossRef match");var a=r.message.items[0].event.name.trim();return{venue:a,note:`Accepted @ ${a} -- [crossref.org]`}}catch(e){return logError("[Crossref]",e),{note:null}}},tryDBLP=async e=>{try{var t,a,r,i,o=encodeURI(e.title);const s=await fetch(`https://dblp.org/search/publ/api?q=${o}&format=json`).then(e=>e.json());if(!(s.result&&s.result.hits&&s.result.hits.hit&&s.result.hits.hit.length))return{note:null};for(const n of s.result.hits.hit.sort((e,t)=>parseInt(e.info.year,10)-parseInt(t.info.year,10)))if(decodeHtml(n.info.title.toLowerCase().replaceAll("\n"," ").replaceAll(".","").replaceAll(/\s\s+/g," "))===e.title.toLowerCase().replaceAll("\n"," ").replaceAll(".","").replaceAll(/\s\s+/g," ")&&"CoRR"!==n.info.venue)return info("Found a DBLP match"),t=await fetchText(n.info.url+".bib"),a=miniHash(n.info.venue),await readJournalAbbreviations(),r=(global.journalAbbreviations[a]??n.info.venue).trim(),i=n.info.year,n.info.url,{venue:r,note:`Accepted @ ${r} ${i} -- [dblp.org]`,bibtex:t};return{note:null}}catch(e){return logError("[DBLP]",e),{note:null}}},trySemanticScholar=async a=>{try{var e=await fetchJSON(`https://api.semanticscholar.org/graph/v1/paper/search?query=${encodeURI(a.title)}&fields=title,venue,year,authors,externalIds,url&limit=50`);if(e&&e.data&&0e.name).join(" and "));let t=n.externalIds.DOI;t=t&&t.replaceAll("_","\\{_}");var s=bibtexToString({entryType:"article",citationKey:miniHash(n.authors[0].name.split(" ").last())+r+firstNonStopLowercase(a.title),title:a.title,author:o,journal:e,year:r,doi:t,bibSource:"Semantic Scholar "+n.url});return{venue:e,note:i,bibtex:s}}}catch(e){logError("[SemanticScholar]",e)}},tryPreprintMatch=async(e,t=!1)=>{let a,r,i,o,s={},n=["DBLP","SemanticScholar","CrossRef"],l=[silentPromiseTimeout(tryDBLP(e)),silentPromiseTimeout(trySemanticScholar(e)),silentPromiseTimeout(tryCrossRef(e))];t&&(l.push(silentPromiseTimeout(tryPWCMatch(e))),n.push("PapersWithCode"));for(var[p,c]of Object.entries(n)){if(s[c]=await l[p],{note:a,venue:r,bibtex:i}=s[c]??{},a)break;log(`[${c}] No publication found`)}return t&&(t="PapersWithCode",s.hasOwnProperty(t)||(s[t]=await l[t]),s[t].codeLink&&!e.codeLink&&(o=s[t].codeLink)),{note:a,venue:r,bibtex:i,code:o}},initPaper=async e=>{e.note||(e.note=""),e.md=`[${e.title}](${e.pdfLink})`,e.tags=[],e.codeLink="",e.favorite=!1,e.favoriteDate="",e.addDate=(new Date).toJSON(),e.lastOpenDate=e.addDate,e.count=1,e.code={};for(const t in 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)return a;let t=new Set;for(const 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)));return a.tags=Array.from(t).sort(),a.tags.length&&log("Automatically adding tags:",a.tags),a}catch(e){return log("Error auto-tagging:",e),log("Paper:",a),a}},makePaper=async(e,t)=>{let a;if(e.arxiv)(a=await makeArxivPaper(t)).source="arxiv";else if(e.neurips)(a=await makeNeuripsPaper(t)).source="neurips";else if(e.cvf)(a=await makeCVFPaper(t)).source="cvf";else if(e.openreview)(a=await makeOpenReviewPaper(t)).source="openreview";else if(e.biorxiv)(a=await makeBioRxivPaper(t)).source="biorxiv";else if(e.pmlr)(a=await makePMLRPaper(t)).source="pmlr";else if(e.acl)(a=await makeACLPaper(t))&&(a.source="acl");else if(e.pnas)(a=await makePNASPaper(t))&&(a.source="pnas");else if(e.nature)(a=await makeNaturePaper(t))&&(a.source="nature");else if(e.acs)(a=await makeACSPaper(t))&&(a.source="acs");else if(e.iop)(a=await makeIOPPaper(t))&&(a.source="iop");else if(e.jmlr)(a=await makeJMLRPaper(t))&&(a.source="jmlr");else if(e.pmc)(a=await makePMCPaper(t))&&(a.source="pmc");else if(e.ijcai)(a=await makeIJCAIPaper(t))&&(a.source="ijcai");else if(e.acm)(a=await makeACMPaper(t))&&(a.source="acm");else if(e.ieee)(a=await makeIEEEPaper(t))&&(a.source="ieee");else if(e.springer)(a=await makeSpringerPaper(t))&&(a.source="springer");else if(e.aps)(a=await makeAPSPaper(t))&&(a.source="aps");else if(e.wiley)(a=await makeWileyPaper(t))&&(a.source="wiley");else if(e.sciencedirect)(a=await makeScienceDirectPaper(t))&&(a.source="sciencedirect");else{if(!e.science)throw new Error("Unknown paper source: "+JSON.stringify({is:e,url:t}));(a=await makeSciencePaper(t))&&(a.source="science")}if(void 0!==a)return initPaper(a)},findFuzzyPaperMatch=(e,t)=>{t=miniHash(t.title);if(e.hasOwnProperty(t)){const a=e[t];e=a.find(t=>!global.preprintSources.some(e=>t.toLowerCase().startsWith(e)));return e?e:a[0]}return null};"undefined"!=typeof module&&null!=module.exports&&(dummyModule=module,dummyModule.exports={decodeHtml:decodeHtml,flipAuthor:flipAuthor,flipAndAuthors:flipAndAuthors,fetchArxivXML:fetchArxivXML,fetchCvfHTML:fetchCvfHTML,fetchOpenReviewNoteJSON:fetchOpenReviewNoteJSON,fetchOpenReviewForumJSON:fetchOpenReviewForumJSON,fetchDom:fetchDom,fetchText:fetchText,makeArxivPaper:makeArxivPaper,makeNeuripsPaper:makeNeuripsPaper,makeCVFPaper:makeCVFPaper,makeOpenReviewBibTex:makeOpenReviewBibTex,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,tryCrossRef:tryCrossRef,tryDBLP:tryDBLP,tryPreprintMatch:tryPreprintMatch,tryPWCMatch:tryPWCMatch,initPaper:initPaper,autoTagPaper:autoTagPaper,makePaper:makePaper,findFuzzyPaperMatch:findFuzzyPaperMatch,fetchCrossRefDataForDoi:fetchCrossRefDataForDoi,fetchSemanticsScholarDataForDoi:fetchSemanticsScholarDataForDoi}); \ No newline at end of file +`+"}"},makeOpenReviewPaper=async e=>{var t=await fetchOpenReviewNoteJSON(e),a=await fetchOpenReviewForumJSON(e),t=t.notes[0],a=a.notes,r=t.content.title,i=t.content.authors.join(" and "),o=bibtexToString(t.content._bibtex||makeOpenReviewBibTex(t,e)),s=bibtexToObject(o),n=s.citationKey,s=s.year;let l;l=t.pdf?"https://openreview.net/pdf?id="+t.id:(t.html||e).replace("/forum?id=","/pdf?id=");const p=t.invitation.split("/");let c=p[0].split(".")[0],d=p.slice(1).join("/").split("-")[0].replaceAll("/"," ").replace(" Conference",""),u=c,h=!1;global.overrideORConfs.hasOwnProperty(c)&&(u=global.overrideORConfs[c],h=!0),h&&(d=d.replace(u,""),c=u);e=(c+" "+d).replace(/ \d\d\d\d/g,"").replace(/\s\s+/g," "),t=`OR-${c}-${s}_`+t.id;let f,m,g,y="";return(f=a.filter(e=>e&&e.content&&-1<["Final Decision","Paper Decision","Acceptance Decision"].indexOf(e.content.title)))&&00===t?e+"ed":e).join(" "),g=m+` @ ${e} (${s})`,m.toLowerCase().indexOf("rejected")<0&&(y=e)),{author:i,bibtex:o,id:t,key:n,note:g="Anonymous"===i?`Under review @ ${e} (${s}) (${(new Date).toLocaleDateString()})`:g,pdfLink:l,title:r,venue:y,year:s}},makeBioRxivPaper=async e=>{var t=e.replace(".full.pdf",""),a="https://api.biorxiv.org//details/biorxiv/"+e.split("/").slice(-2).join("/").replace(".full.pdf","").split("v")[0];const r=await fetch(a).then(e=>e.json());if("ok"!==r.messages[0].status)throw new Error(a+" returned "+r.messages[0].status);const i=r.collection.last(),o=await fetchText(t),s=(new DOMParser).parseFromString(o.replaceAll("\n",""),"text/html");a=s.querySelector(".bibtext a").getAttribute("href");const n=bibtexToString(await(await fetch(a)).text());var t=extractAuthor(n),a=await parseIdFromUrl(e),l=n.split("\n")[0].split("{")[1].replace(",","").trim(),e=cleanBiorxivURL(e)+".full.pdf",p=i.title,c=i.date.split("-")[0];return{author:t,bibtex:n,id:a,key:l,note:"",pdfLink:e,title:p,venue:"",year:c}},makePMLRPaper=async e=>{var t=e.split("/").last().split(".")[0],a=await parseIdFromUrl(e);const r=e.includes(".html")?e:e.split("/").slice(0,-2).join("/")+`/${t}.html`;e=r.replace(".html","")+`/${t}.pdf`;const i=await fetchDom(r);i.getElementById("button-bibtex1").getAttribute("onclick").match(/https.+\.bib/)[0];const o=i.getElementById("bibtex").innerText.replaceAll("\t"," ").replaceAll(/\s\s+/g," ");let s=o;for(const u of o.match(/,\ ?\w+ ?= ?{/g))s=s.replace(u,u.replace(", ",",\n ").replace(" = ","="));s.endsWith("}}")&&(s=s.slice(0,-2)+"}\n}"),s=bibtexToString(s);var n=extractAuthor(s),l=i.getElementsByTagName("h1")[0].innerText,p=extractBibtexValue(s,"year");let c=extractBibtexValue(s,"booktitle").replaceAll("Proceedings of the",""),d=c;note=`Accepted @ ${d} (${p})`;for(const h in global.overridePMLRConfs)if(c.includes(h)){d=global.overridePMLRConfs[h],c=d+" "+p,note="Accepted @ "+c;break}return{author:n,bibtex:s,id:a,key:t,note:note,pdfLink:e,title:l,venue:d,year:p}},findACLValue=(e,t)=>{return Array.from(e.querySelectorAll("dt")).filter(e=>e.innerText.includes(t))[0].nextElementSibling.innerText},makeACLPaper=async e=>{e=e.replace(".pdf","");const t=await fetchDom(e);e=t.getElementById("citeBibtexContent");if(e){var a=t.getElementById("title").innerText,e=bibtexToString(e.innerText);const l=bibtexToObject(e);var r=l.year,i=l.author.replace(/\s+/g," ").split(" and ").map(e=>e.split(",").map(e=>e.trim()).reverse().join(" ")).join(" and "),o=l.citationKey,s=findACLValue(t,"Venue"),n=findACLValue(t,"PDF");return{author:i,bibtex:e,id:`ACL-${s}-${r}_`+findACLValue(t,"Anthology ID"),key:o,note:`Accepted @ ${s} (${r})`,pdfLink:n,title:a,venue:s,year:r}}},makePNASPaper=async e=>{e=e.replace(".full.pdf","").replace(/\/doi\/e?pdf\//,"/doi/abs/");const t=await fetchDom(e);var a=t.getElementsByTagName("h1")[0].innerText,r=Array.from(t.querySelectorAll(".authors span[property='author'] a:not([property='email']):not(.orcid-id)")).filter(e=>!e.getAttribute("href").includes("mailto:")).map(e=>e.innerText).join(" and "),i=t.querySelector("span[property='datePublished']").innerText.match(/\d{4}/g)[0],o=`PNAS-${i}_`+(e.endsWith("/")?e.split("/").slice(-2):e.split("/").slice(-1))[0];const s=e.includes("/doi/pdf/")||e.includes("/doi/epdf/")?e.replace("/doi/epdf/","/doi/pdf/"):e.replace("/doi/abs/","/doi/pdf/").replace("/doi/full/","/doi/pdf/");var e=Array.from(t.querySelector(".core-container").getElementsByTagName("a")).map(e=>e.getAttribute("href")).filter(e=>e?.includes("https://doi.org"))[0].split("/").slice(-2).join("/"),n="doi:"+e;return{author:r,bibtex:bibtexToString(`@article{${n}, author={${r}}, title={${a}}, journal = {Proceedings of the National Academy of Sciences}, year={${i}}, doi={${e}}, eprint={${s}}, URL={${s.replace("/doi/pdf/","/doi/abs/")}} }`),id:o,key:n,note:`Published @ PNAS (${i})`,pdfLink:s,title:a,venue:"PNAS",year:i}},makeNaturePaper=async e=>{var t=(e=e.replace(".pdf","").split("#")[0])+".pdf",a=e.split("/").last();const r=await fetchDom(e);e=r.querySelector("h1.c-article-title").innerText;const i=Array.from(r.querySelectorAll("ul.c-article-author-list li")).map(e=>e.innerText.replace(/(\ ?,)|&|…|\d/g,"").split(/orcid/i)[0].trim()).filter(e=>0e.innerText).filter(e=>e.includes("https://doi.org"))[0];var l=""+i.split(" ")[1]+o+firstNonStopLowercase(e);let p={citationKey:l,entryType:"article",author:i,title:e,journal:s,year:o};n&&(p.doi=n,p.url="https://doi.org/"+n);var c=bibtexToString(p);return{author:i,bibtex:c,id:a,key:l,note:`Published @ ${s} (${o})`,pdfLink:t,title:e,venue:s,year:o}},makeACSPaper=async e=>{const t=(e=e.replace("pubs.acs.org/doi/pdf/","pubs.acs.org/doi/").split("?")[0]).replace("/abs/","/").split("/doi/")[1];console.log("doi: ",t);e=`https://pubs.acs.org/action/downloadCitation?doi=${t}&include=cit&format=bibtex&direct=true`,e=await fetchText(e);const a=bibtexToObject(e);var r=a.author.replaceAll("\n","").trim(),i=a.title.trim(),o=a.year.trim(),s=a.citationKey.trim(),n="https://pubs.acs.org/doi/pdf/"+t,l=`Published @ ${a.journal} (${a.year})`;return{author:r,bibtex:e,id:"ACS_"+t.replaceAll(".","").replaceAll("/",""),key:s,note:l,pdfLink:n,title:i,venue:a.journal,year:o}},makeIOPPaper=async e=>{(e=e.split("#")[0]).endsWith("/pdf")&&(e=e.slice(0,-4));const t=await fetchDom(e);var a=Array.from(t.querySelectorAll(".btn-multi-block a")).filter(e=>"BibTeX"===e.innerText).map(e=>e.getAttribute("href"))[0],a="https://"+parseUrl(e).host+a,a=await fetchText(a);const r=bibtexToObject(a);var i=r.author.replaceAll("\n","").trim(),o=r.title.trim(),s=r.year.trim(),n=r.citationKey.trim(),l=e+"/pdf",p=r.journal,c=`Published @ ${p} (${s})`;const d=e.split("/article/").last();return{author:i,bibtex:a,id:"IOPscience_"+d.replaceAll(".","").replaceAll("/",""),key:n,note:c,pdfLink:l,title:o,venue:p,year:s}},makeJMLRPaper=async e=>{var t=(e=(e=(e=e.includes("/papers/volume")?e.replace("/papers/volume","/papers/v"):e).endsWith(".pdf")?e.split("/").slice(0,-1).join("/"):e).replace(".html","")).split("/").last(),a=e+".bib",a=await fetchText(a);const{author:r,year:i,title:o,citationKey:s}=bibtexToObject(a);return{author:r,bibtex:a,id:`JMLR-${i}_`+t,key:s.trim(),note:`Published @ JMLR (${i})`,pdfLink:e.replace("/papers/v","/papers/volume")+`/${t}.pdf`,title:o,venue:"JMLR",year:i}},makePMCPaper=async e=>{var t=e.match(/PMC\d+/)[0].replace("PMC",""),a=e.split("PMC"+t)[0]+"PMC"+t;const r=await(await fetch(`https://api.ncbi.nlm.nih.gov/lit/ctxp/v1/pmc/?format=csl&id=${t}&download=true`)).json();var i=(r["epub-date"]||r.issued)["date-parts"][0][0],o=r.author.map(e=>e.given+" "+e.family).join(" and "),s=r["container-title"].split(" ").map(e=>e.capitalize()).join(" "),n=r.title,t=`PMC-${i}_`+t,l=""+r.author[0].family+i+firstNonStopLowercase(n),p=bibtexToString({entryType:"article",citationKey:l,journal:s,issn:r.ISSN,volume:r.volume,page:r.page,doi:r.DOI,PMID:r.PMID,PMCID:r.PMCID,publisher:r.publisher,author:o,title:n});let c;if(isPdfUrl(e))c=e;else{const h=r.DOI.split("/")[1].split("-");var e=h[0].match(/\d+/)[0],d=h[1].replace(h[1].match(/^0*/)[0],""),u=h[2].replace(h[2].match(/^0*/)[0],"");c=a+`/pdf/${e}_${d}_Article_${u}.pdf`}return{author:o,bibtex:p,id:t,key:l,note:`Published @ ${s} (${i})`,pdfLink:c,title:n,venue:s,year:i}},makePubMedPaper=async e=>{const t=await fetchDom(e.split("?")[0]),a=Array.from(t.getElementsByTagName("meta")).filter(e=>e.getAttribute("name")?.includes("citation_")),r=Object.fromEntries(a.map(e=>[e.getAttribute("name").replace("citation_",""),e.getAttribute("content")])),i=document.querySelector("div.authors-list").innerText.replace(/\d/gi,"").split(",").map(e=>e.trim()).join(" and ");var e=r.title,o=r.journal_title,s=r.date.split("/")[2],n=`PubMed-${s}_`+r.pmid,l=""+i.split(" and ")[0].split(" ").last()+s+firstNonStopLowercase(r.title),p={entryType:"article",citationKey:l,publisher:r.publisher,doi:r.doi,issn:r.issn,journal:o,year:s,author:i},p=bibtexToString(p),c=`Accepted @ ${journal} (${s})`;return{author:i,bibtex:p,id:n,key:l,note:c,pdfLink:"",title:e,venue:o,year:s}},makeIJCAIPaper=async e=>{const t=e.endsWith(".pdf")?e.replace(".pdf","").split("/").last().match(/[1-9]\d*/)[0]:e.split("/").last();e=e.match(/proceedings\/\d+/gi)[0].split("/")[1];const a=(await fetchText(`https://www.ijcai.org/proceedings/${e}/bibtex/`+t)).replace(/}\n/gi,"},\n");var r=bibtexToObject(a.split("\n").filter(e=>!/note\s+=/gi.test(e)).join("\n")),i=r.citationKey,o=r.title,r=flipAndAuthors(r.author),s=`IJCAI-${e}_`+t,n=`Accepted @ IJCAI (${e})`,l=t.padStart(4,0);return{author:r,bibtex:a,id:s,key:i,note:n,pdfLink:`https://www.ijcai.org/proceedings/${e}/${l}.pdf`,title:o,venue:"IJCAI",year:e}},makeACMPaper=async e=>{let t;t=isPdfUrl(e)?e:e.replace(/\/doi\/?(abs|full)?\//,"/doi/pdf/");const a=await fetchDom(e.replace("/doi/pdf/","/doi/"));let r,i,o,s,n,l,p,c;var d=extractDataFromDCMetaTags(a);if(d)({author:r,year:i,title:o,venue:s,key:n,doi:l,bibtex:p,note:c}=d);else{o=a.querySelector(".citation__title").innerText,r=Array.from(a.querySelectorAll("ul[ariaa-label='authors'] li.loa__item .loa__author-name")).map(e=>e.innerText.replace(",","").trim()).join(" and ");const u=a.querySelector(".issue-item__detail a").innerText;s=u.split("'")[0].trim(),i="20"+u.split("'")[1].split(":")[0].trim(),l=t.split("/doi/pdf/")[1],c=`Accepted @ ${s} (${i})`,n=l,p=bibtexToString({entryType:"article",citationKey:l,journal:s,author:r,title:o,year:i,publisher:"Association for Computing Machinery",address:"New York, NY, USA",url:e.replace("/doi/pdf/","/doi/")})}d=`ACM-${i}_`+miniHash(l);return{author:r,bibtex:p,id:d,key:n,note:c,pdfLink:t,title:o,venue:s,year:i}},makeIEEEPaper=async e=>{isPdfUrl(e)&&(e=`https://ieeexplore.ieee.org/document/${e.split("/stamp/stamp.jsp?tp=&arnumber=")[1].match(/\d+/)[0]}/`,console.log("url: ",e));const t=await fetchDom(e),a=JSON.parse(Array.from(t.getElementsByTagName("script")).filter(e=>e.innerHTML?.includes("metadata="))[0].innerHTML.split("metadata=")[1].split(/};\s*/)[0]+"}");var r=a.title,i=a.authors.map(e=>e.name).join(" and "),o=a.publicationYear,e=""+parseUrl(e).origin+a.pdfUrl,s=a.publicationTitle,n=a.articleId;return{author:i,bibtex:bibtexToString({entryType:"article",citationKey:n,journal:s,volume:a.volume,pages:a.startPage+"-"+a.endPage,doi:a.doi,title:r,year:o,author:i}),id:`IEEE-${o}_`+n,key:n,note:`Accepted @ ${s} (${o})`,pdfLink:e,title:r,venue:s,year:o}},makeSpringerPaper=async t=>{const e=[...global.sourceExtras.springer.types,"content/pdf"];var a=e.find(e=>t.includes(`/${e}/`));if(!a)throw new Error(`Could not find Springer type for ${t} (known: ${e.join(", ")})`);var r=t.split(`/${a}/`)[1].split("?")[0].replace(".pdf",""),i=await fetchCrossRefDataForDoi(r);if(!i)throw new Error("Aborting Springer paper parsing, see error above");var{author:o,bibtex:s,citationKey:n,year:l,title:p,venue:c}=i;return{author:o,bibtex:s,id:`Springer-${l}_`+miniHash(r),key:n,note:`Published @ ${c} (${l})`,pdfLink:i.pdf??("content/pdf"===a?t:t.replace(`/${a}/`,"/content/pdf/")+".pdf"),title:p,venue:c,year:l,extra:{url:"https://doi.org/"+r}}},makeAPSPaper=async e=>{e=e.split("#")[0];var[t,a]=parseUrl(e).pathname.split("/").slice(1,3),r=e.split(`/${t}/${a}/`).last(),i=e.replace(`/${t}/${a}/`,`/${t}/export/`),i=await fetchText(i+"?type=bibtex&download=true"),o=bibtexToObject(i),e=e.replace(`/${t}/${a}/`,`/${t}/pdf/`),a=`APS-${o.year}_`+miniHash(r),t=o.journal??o.publisher,r=(await readJournalAbbreviations(),global.journalAbbreviations[miniHash(t)]??t),t=`Published @ ${r} (${o.year})`;return{author:flipAndAuthors(o.author),bibtex:i,id:a,key:o.citationKey,note:t,pdfLink:e,title:o.title,venue:r,year:o.year}},makeWileyPaper=async e=>{const t=e.replace(/\/doi\/(abs|epdf|full)\//g,"/doi/pdf/");e=t.replace("/doi/pdf/","/doi/abs/");const a=await fetchDom(e);var e=Array.from(a.querySelectorAll("meta[name=citation_author]")).map(e=>e.getAttribute("content")).join(" and "),r=a.querySelector("meta[name=citation_journal_title]").getAttribute("content"),i=a.querySelector("meta[name=citation_title]").getAttribute("content"),o=a.querySelector("meta[name=citation_publisher]").getAttribute("content"),s=a.querySelector("meta[name=citation_publication_date]")?.getAttribute("content")?.split("/")[0]??a.querySelector("meta[name=citation_online_date]")?.getAttribute("content")?.split("/")[0],n=a.querySelector("meta[name=citation_doi]").getAttribute("content"),l=`Published @ ${r} (${s})`,p=`Wiley-${s}_`+miniHash(n);return{author:e,bibtex:bibtexToString({citationKey:n,entryType:"article",title:i,author:e,year:s,doi:n,publisher:o,journal:r}),id:p,key:n,note:l,pdfLink:t,title:i,venue:r,year:s}},makeScienceDirectPaper=async e=>{var e=e.split("/pii/")[1].split("/")[0].split("#")[0].split("?")[0],t=await fetchText(`https://www.sciencedirect.com/sdfe/arp/cite?pii=${e}&format=text%2Fx-bibtex&withabstract=false`),{author:a,journal:r,year:i,title:o,citationKey:s}=bibtexToObject(t),n=`Published @ ${r} (${i})`;return{author:a,bibtex:t,id:`ScienceDirect-${i}_`+miniHash(e),key:s,note:n,pdfLink:"https://reader.elsevier.com/reader/sd/pii/"+e,title:o,venue:r??"Science Direct",year:i}},makeSciencePaper=async e=>{let t,a,r,i,o,s,n,l,p,c,d;s="https://science.org/doi/pdf/"+(c=(c=noParamUrl(e).split("/doi/")[1]).startsWith("10.")?c:c.split("/").slice(1).join("/")),d="https://science.org/doi/full/"+c;var e=await fetchCrossRefDataForDoi(c);return e?({author:t,bibtex:a,title:n,venue:l,year:p}=e,i=e.citationKey,o=`Published @ ${l} (${p})`):(e=await fetchDom(d),{author:t,year:p,publisher,title:n,venue:l,key:i,bibtex:a,note:o}=extractDataFromDCMetaTags(e)),r=`Science-${p}_`+miniHash(c),{author:t,bibtex:a,id:r,key:i,note:o,pdfLink:s,title:n,venue:l,year:p}},makeFrontiersPaper=async e=>{e=e.replace(/\/pdf$/,"/full");var t=noParamUrl(e).split("/articles/")[1].split("/full")[0],a=await fetchText(`https://www.frontiersin.org/articles/${t}/bibTex`);const r=Object.fromEntries(Object.entries(bibtexToObject(a)).map(([e,t])=>["citationKey"===e||"entryType"===e?e:e.toLowerCase(),t]));r.author=flipAndAuthors(r.author),delete r.abstract;var{author:a,journal:i,year:o,title:s,citationKey:n}=r,l=`Published @ ${i} (${o})`;return{author:a,bibtex:bibtexToString(r),id:`Frontiers-${o}_`+miniHash(t),key:n,note:l,pdfLink:e.replace(/\/full$/,"/pdf"),title:s,venue:i,year:o}},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=>{try{var t="https://api.crossref.org/works?rows=1&mailto=schmidtv%40mila.quebec&select=event%2Ctitle&query.title="+encodeURI(e.title);const r=await fetch(t).then(e=>e.json());if("ok"!==r.status)return log(`[Crossref] ${t} returned `+r.message.status),{note:null};if(0===r.message.items.length)return{note:null};if(r.message.items[0].title[0].toLowerCase().replaceAll("\n"," ").replaceAll(/\s\s+/g," ")!==e.title.toLowerCase().replaceAll("\n"," ").replaceAll(/\s\s+/g," "))return{note:null};if(!r.message.items[0].event||!r.message.items[0].event.name)return{note:null};info("Found a CrossRef match");var a=r.message.items[0].event.name.trim();return{venue:a,note:`Accepted @ ${a} -- [crossref.org]`}}catch(e){return logError("[Crossref]",e),{note:null}}},tryDBLP=async e=>{try{var t,a,r,i,o=encodeURI(e.title);const s=await fetch(`https://dblp.org/search/publ/api?q=${o}&format=json`).then(e=>e.json());if(!(s.result&&s.result.hits&&s.result.hits.hit&&s.result.hits.hit.length))return{note:null};for(const n of s.result.hits.hit.sort((e,t)=>parseInt(e.info.year,10)-parseInt(t.info.year,10)))if(decodeHtml(n.info.title.toLowerCase().replaceAll("\n"," ").replaceAll(".","").replaceAll(/\s\s+/g," "))===e.title.toLowerCase().replaceAll("\n"," ").replaceAll(".","").replaceAll(/\s\s+/g," ")&&"CoRR"!==n.info.venue)return info("Found a DBLP match"),t=await fetchText(n.info.url+".bib"),a=miniHash(n.info.venue),await readJournalAbbreviations(),r=(global.journalAbbreviations[a]??n.info.venue).trim(),i=n.info.year,n.info.url,{venue:r,note:`Accepted @ ${r} ${i} -- [dblp.org]`,bibtex:t};return{note:null}}catch(e){return logError("[DBLP]",e),{note:null}}},trySemanticScholar=async a=>{try{var e=await fetchJSON(`https://api.semanticscholar.org/graph/v1/paper/search?query=${encodeURI(a.title)}&fields=title,venue,year,authors,externalIds,url&limit=50`);if(e&&e.data&&0e.name).join(" and "));let t=n.externalIds.DOI;t=t&&t.replaceAll("_","\\{_}");var s=bibtexToString({entryType:"article",citationKey:miniHash(n.authors[0].name.split(" ").last())+r+firstNonStopLowercase(a.title),title:a.title,author:o,journal:e,year:r,doi:t,bibSource:"Semantic Scholar "+n.url});return{venue:e,note:i,bibtex:s}}}catch(e){logError("[SemanticScholar]",e)}},tryPreprintMatch=async(e,t=!1)=>{let a,r,i,o,s={},n=["DBLP","SemanticScholar","CrossRef"],l=[silentPromiseTimeout(tryDBLP(e)),silentPromiseTimeout(trySemanticScholar(e)),silentPromiseTimeout(tryCrossRef(e))];t&&(l.push(silentPromiseTimeout(tryPWCMatch(e))),n.push("PapersWithCode"));for(var[p,c]of Object.entries(n)){if(s[c]=await l[p],{note:a,venue:r,bibtex:i}=s[c]??{},a)break;log(`[${c}] No publication found`)}return t&&(t="PapersWithCode",s.hasOwnProperty(t)||(s[t]=await l[t]),s[t].codeLink&&!e.codeLink&&(o=s[t].codeLink)),{note:a,venue:r,bibtex:i,code:o}},initPaper=async e=>{e.note||(e.note=""),e.md=`[${e.title}](${e.pdfLink})`,e.tags=[],e.codeLink="",e.favorite=!1,e.favoriteDate="",e.addDate=(new Date).toJSON(),e.lastOpenDate=e.addDate,e.count=1,e.code={};for(const t in 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)return a;let t=new Set;for(const 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)));return a.tags=Array.from(t).sort(),a.tags.length&&log("Automatically adding tags:",a.tags),a}catch(e){return log("Error auto-tagging:",e),log("Paper:",a),a}},makePaper=async(e,t)=>{let a;if(e.arxiv)(a=await makeArxivPaper(t)).source="arxiv";else if(e.neurips)(a=await makeNeuripsPaper(t)).source="neurips";else if(e.cvf)(a=await makeCVFPaper(t)).source="cvf";else if(e.openreview)(a=await makeOpenReviewPaper(t)).source="openreview";else if(e.biorxiv)(a=await makeBioRxivPaper(t)).source="biorxiv";else if(e.pmlr)(a=await makePMLRPaper(t)).source="pmlr";else if(e.acl)(a=await makeACLPaper(t))&&(a.source="acl");else if(e.pnas)(a=await makePNASPaper(t))&&(a.source="pnas");else if(e.nature)(a=await makeNaturePaper(t))&&(a.source="nature");else if(e.acs)(a=await makeACSPaper(t))&&(a.source="acs");else if(e.iop)(a=await makeIOPPaper(t))&&(a.source="iop");else if(e.jmlr)(a=await makeJMLRPaper(t))&&(a.source="jmlr");else if(e.pmc)(a=await makePMCPaper(t))&&(a.source="pmc");else if(e.ijcai)(a=await makeIJCAIPaper(t))&&(a.source="ijcai");else if(e.acm)(a=await makeACMPaper(t))&&(a.source="acm");else if(e.ieee)(a=await makeIEEEPaper(t))&&(a.source="ieee");else if(e.springer)(a=await makeSpringerPaper(t))&&(a.source="springer");else if(e.aps)(a=await makeAPSPaper(t))&&(a.source="aps");else if(e.wiley)(a=await makeWileyPaper(t))&&(a.source="wiley");else if(e.sciencedirect)(a=await makeScienceDirectPaper(t))&&(a.source="sciencedirect");else if(e.science)(a=await makeSciencePaper(t))&&(a.source="science");else{if(!e.frontiers)throw new Error("Unknown paper source: "+JSON.stringify({is:e,url:t}));(a=await makeFrontiersPaper(t))&&(a.source="frontiers")}if(void 0!==a)return initPaper(a)},findFuzzyPaperMatch=(e,t)=>{t=miniHash(t.title);if(e.hasOwnProperty(t)){const a=e[t];e=a.find(t=>!global.preprintSources.some(e=>t.toLowerCase().startsWith(e)));return e?e:a[0]}return null};"undefined"!=typeof module&&null!=module.exports&&(dummyModule=module,dummyModule.exports={decodeHtml:decodeHtml,flipAuthor:flipAuthor,flipAndAuthors:flipAndAuthors,fetchArxivXML:fetchArxivXML,fetchCvfHTML:fetchCvfHTML,fetchOpenReviewNoteJSON:fetchOpenReviewNoteJSON,fetchOpenReviewForumJSON:fetchOpenReviewForumJSON,fetchDom:fetchDom,fetchText:fetchText,makeArxivPaper:makeArxivPaper,makeNeuripsPaper:makeNeuripsPaper,makeCVFPaper:makeCVFPaper,makeOpenReviewBibTex:makeOpenReviewBibTex,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,tryCrossRef:tryCrossRef,tryDBLP:tryDBLP,tryPreprintMatch:tryPreprintMatch,tryPWCMatch:tryPWCMatch,initPaper:initPaper,autoTagPaper:autoTagPaper,makePaper:makePaper,findFuzzyPaperMatch:findFuzzyPaperMatch,fetchCrossRefDataForDoi:fetchCrossRefDataForDoi,fetchSemanticsScholarDataForDoi:fetchSemanticsScholarDataForDoi}); \ No newline at end of file From 7fcd10b78af8243bffc71b2e35aaf4c23f033280 Mon Sep 17 00:00:00 2001 From: vict0rsch Date: Thu, 16 Jun 2022 10:03:59 +0200 Subject: [PATCH 4/5] bump version --- manifest.json | 2 +- src/popup/min/popup.min.html | 2 +- src/popup/popup.html | 9 ++++++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index 538aaa64..c699d674 100755 --- a/manifest.json +++ b/manifest.json @@ -1,6 +1,6 @@ { "name": "Paper Memory", - "version": "0.5.6", + "version": "0.5.7", "manifest_version": 2, "description": "Automatically record papers and their codes from Arxiv, OpenReview & more! Organize your library with tags, links and quick notes.", "homepage_url": "https://github.com/vict0rsch/PaperMemory", diff --git a/src/popup/min/popup.min.html b/src/popup/min/popup.min.html index 0b7cd4a7..6203ad45 100755 --- a/src/popup/min/popup.min.html +++ b/src/popup/min/popup.min.html @@ -1,2 +1,2 @@
\ No newline at end of file + @import url("https://fonts.googleapis.com/css2?family=Fira+Code:wght@300;400;500;600;700&display=swap");
\ No newline at end of file diff --git a/src/popup/popup.html b/src/popup/popup.html index 51be2338..cfddc26d 100755 --- a/src/popup/popup.html +++ b/src/popup/popup.html @@ -429,7 +429,14 @@

Search

What's new

  • Current: 0.5.6 + href="https://github.com/vict0rsch/PaperMemory/releases/tag/0.5.7">0.5.7 + (2022-06-13) +
      +
    • [new source] Add FrontiersIn paper source
    • +
    • [dev] Improve preprint/publication matching
    • +
    +
  • +
  • 0.5.6 (2022-06-13)
    • [feature] Add paper code to arxiv.org's rightmost column
    • From 632eca741da249a9a4cf30ee6dfedf2aa1fdb68a Mon Sep 17 00:00:00 2001 From: vict0rsch Date: Thu, 16 Jun 2022 10:28:10 +0200 Subject: [PATCH 5/5] add `frontiers` tests --- test/data/urls.json | 7 +++++++ test/test-storage.js | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/test/data/urls.json b/test/data/urls.json index fb4e96e0..0c0b0204 100644 --- a/test/data/urls.json +++ b/test/data/urls.json @@ -47,6 +47,13 @@ "venue": "cvpr" } ], + "frontiers": [ + "https://www.frontiersin.org/articles/10.3389/fpace.2022.892330/full", + "https://www.frontiersin.org/articles/10.3389/fpace.2022.892330/pdf", + { + "noPdf": true + } + ], "ijcai": [ "https://www.ijcai.org/proceedings/2020/1", "https://www.ijcai.org/proceedings/2020/0001.pdf", diff --git a/test/test-storage.js b/test/test-storage.js index 42da62d8..18c86537 100644 --- a/test/test-storage.js +++ b/test/test-storage.js @@ -100,6 +100,12 @@ describe("Test paper detection and storage", function () { `prevents automated browsing` ); delete urls[source]; + } else if (targets.length === 3 && targets[2].noPdf) { + console.log( + `\n>>> Skipping test for ${source} because its ` + + `pdf page does not exist` + ); + delete urls[source]; } }