diff --git a/CHANGELOG.md b/CHANGELOG.md index a43249535..72ce0c163 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,8 +3,18 @@ 4chan XT uses a different user script namespace than 4chan X, so to migrate you need to export settings from 4chan X, and import them in XT. -### Not released yet - +### 2.19.0 (2024-12-22) + +- Removed the css for the header for widths above 1300px, because it was preventing long custom navigation lists from + wrapping. [#120](https://github.com/TuxedoTako/4chan-xt/issues/120) I don't know what the purpose was of the different + style, the commit where that was added isn't really descriptive: c396db49b9d8fe1becad2fd9c8b29e88ead7b587? So let me + know if I broke something. +- Limit subject input to 100 characters. [#128](https://github.com/TuxedoTako/4chan-xt/issues/128) +- Added ws and nsw classes for work safe and not work safe boards. + [#129](https://github.com/TuxedoTako/4chan-xt/issues/129) +- Using shift click to hide a post no longer selects half the page. + [#131](https://github.com/TuxedoTako/4chan-xt/issues/131) +- The file select dialog for the settings import will only show json files. - Upstream came back, so I had to port those new features. - Fix for unwanted sorting of catalog under certain settings. [ccd0#3212](https://github.com/ccd0/4chan-x/issues/3212), 7dfba22042d01fde1e762af68e92109d80d0164d diff --git a/README.md b/README.md index 649728851..b3361d9ef 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ New features include: - Hiding all posts from a poster ID in a thread - A manifest v3 version for chromium browsers dropping support for v2 - A button to un-randomize a filename in the quick reply +- Showing the reason a post was filtered in the stub The 4chan XT project is a migration of 4chan X from coffeescript to TypeScript/JavaScript. It is named XT both as a continuation of eXTended, and a T for TypeScript. The goals of this project is to first get a working bundle from js/ts @@ -70,36 +71,6 @@ The simplest build is as easy as `npm install` `npm run build`, but there are so - @violentmonkey/types was chosen over @types/greasemonkey because @types/greasemonkey only declares the GM object, and not GM\_ functions -## commits since this was forked - - -Click to expand - -- [x] 944b04210c119aedf8da1a8bcabaca9b80312118 Update archive list. - - [x] 59ee8c57792d0f82491756a077e25f506fd62994 Desuarchive removes /gif/ - - [x] 402679e33a06dfbe0dc39ceba5c24fed761b6a19 desuarchive removes /wsg/ files - - [x] 86071184aa39b3585f06c1a4e2921c411ad8cf10 archived.moe adds /pw/ search, tokyochronos has hosting issues - - [x] 8a6392b1cf721ddfae6d8f4e3ec2566f15755370 add Eientei - - [x] 451a06f54b878ce433b0775858affefc71927fc7 alice.al domain change -- [x] 2a8bf2adb0737ce7bb1e21f6b959e4c6e1de1bc7 Disable Javascript Whitelist on captcha iframe. #3292 -- [x] e9c1529da7844a42a1b40458c2c77b77e23ca537 Make QR post more like original form post. #3330 -- [x] d16062a8fac5c092c34310c7704ac3980494b6ef Merge remote-tracking branch '4chenz/master' - - [x] 8795b1c56dbdfb52a32ddb3ea80b549f0048dc7b Add Google Lens image search url -- [x] f3f03f5e79fb5f26c0fd4406b2ab6796851ea471 Replace Google image search link with Google Lens. - - [x] c68a8afbdf30e3cbb35f0834b364f20600151adf Switch Google image search back to old version, thanks to https://boards.4channel.org/g/thread/91737566#p91789527 -- [x] aef984da1a6af4d0003b51e7f03bce252ac71dff Remove empty space from ads if they don't load. https://kissu.moe/b/res/7155#11052 -- [x] 19268975ea2d49a753624315b0928f27496aac02 Update Randomize Filename to match current 4chan format. https://boards.4channel.org/g/thread/91737566#p91784238 -- [x] 2a47dfd8ba724b17f5bc5f9214bea8ce8b469398 Catch errors due to "Restricted" selection. #2905 -- [x] 27957c25af5d182adc38f1e67a098ab338631ccd Release 4chan X v1.14.22.2. -- [x] eb25d6e797a1673fd7cddb257fce04055383ec9b Update chrome-webstore-upload. -- [x] 14e67e9a958633e37b4e4a6293cfa3a921c1eab0 Release 4chan X v1.14.22.3. -- [x] 7295b21b73eb13ec53fdc61767ada341c2e13144 Avoid breaking sauce settings of people with links to original Google Images and Google Lens, provided they didn't already update to v1.14.22.3. -- [x] 71873cd7b22a565c2a41fa24f63f7504152683eb Recognize JPEG files with .jfif extensions as images for purposes of Image Hover etc.; also recognize .avif and .jxl files as images. -- [x] ea2462ecc47327c6f0c31348d95fd2b1b6447cb3 Release 4chan X v1.14.22.4. -- [x] e31438f9a9907078508912fd4c4d44bf21ac773c Fix youtube /live embeds - - - --- # Original readme: diff --git a/builds/4chan-XT.meta.js b/builds/4chan-XT.meta.js index 22c4b8fd7..11b13624b 100644 --- a/builds/4chan-XT.meta.js +++ b/builds/4chan-XT.meta.js @@ -1,6 +1,6 @@ // ==UserScript== // @name 4chan XT -// @version 2.18.0 +// @version 2.19.0 // @minGMVer 1.14 // @minFFVer 74 // @namespace 4chan-XT diff --git a/builds/4chan-XT.min.meta.js b/builds/4chan-XT.min.meta.js index 3f63d0b87..4754f57be 100644 --- a/builds/4chan-XT.min.meta.js +++ b/builds/4chan-XT.min.meta.js @@ -1,6 +1,6 @@ // ==UserScript== // @name 4chan XT -// @version 2.18.0 +// @version 2.19.0 // @minGMVer 1.14 // @minFFVer 74 // @namespace 4chan-XT diff --git a/builds/4chan-XT.min.user.js b/builds/4chan-XT.min.user.js index 33fb7a7a2..8e4510f94 100644 --- a/builds/4chan-XT.min.user.js +++ b/builds/4chan-XT.min.user.js @@ -1,6 +1,6 @@ // ==UserScript== // @name 4chan XT -// @version 2.18.0 +// @version 2.19.0 // @minGMVer 1.14 // @minFFVer 74 // @namespace 4chan-XT @@ -163,7 +163,7 @@ * * Icons used to identify various websites are property of the respective websites. */ -!function(){"use strict";var e="2.18.0",t="2024-11-20T18:50:00Z",o={name:"4chan XT",path:"4chan-XT",fork:"TuxedoTako",page:"https://github.com/TuxedoTako/4chan-xt",downloads:"https://github.com/TuxedoTako/4chan-xt/releases",oldVersions:"https://raw.githubusercontent.com/ccd0/4chan-x/",faq:"https://github.com/TuxedoTako/4chan-xt/wiki/Frequently-Asked-Questions",upstreamFaq:"https://github.com/ccd0/4chan-x/wiki/Frequently-Asked-Questions",captchaFAQ:"https://github.com/ccd0/4chan-x/wiki/Captcha-FAQ",cssGuide:"https://github.com/ccd0/4chan-x/wiki/Styling-Guide",license:"https://github.com/TuxedoTako/4chan-xt/blob/project-XT/LICENSE",changelog:"https://github.com/TuxedoTako/4chan-xt/blob/project-XT/CHANGELOG.md",issues:"https://github.com/TuxedoTako/4chan-xt/issues",newIssue:"https://github.com/TuxedoTako/4chan-xt/issues",newIssueMaxLength:8181,alternatives:"https://www.4chan-x.net/4chan_alternatives.html",appid:"lacclbnghgdicfifcamcmcnilckjamag",appidGecko:"4chan-x@4chan-x.net", +!function(){"use strict";var e="2.19.0",t="2024-12-22T16:50:00Z",o={name:"4chan XT",path:"4chan-XT",fork:"TuxedoTako",page:"https://github.com/TuxedoTako/4chan-xt",downloads:"https://github.com/TuxedoTako/4chan-xt/releases",oldVersions:"https://raw.githubusercontent.com/ccd0/4chan-x/",faq:"https://github.com/TuxedoTako/4chan-xt/wiki/Frequently-Asked-Questions",upstreamFaq:"https://github.com/ccd0/4chan-x/wiki/Frequently-Asked-Questions",captchaFAQ:"https://github.com/ccd0/4chan-x/wiki/Captcha-FAQ",cssGuide:"https://github.com/ccd0/4chan-x/wiki/Styling-Guide",license:"https://github.com/TuxedoTako/4chan-xt/blob/project-XT/LICENSE",changelog:"https://github.com/TuxedoTako/4chan-xt/blob/project-XT/CHANGELOG.md",issues:"https://github.com/TuxedoTako/4chan-xt/issues",newIssue:"https://github.com/TuxedoTako/4chan-xt/issues",newIssueMaxLength:8181,alternatives:"https://www.4chan-x.net/4chan_alternatives.html",appid:"lacclbnghgdicfifcamcmcnilckjamag",appidGecko:"4chan-x@4chan-x.net", recaptchaKey:"6Ldp2bsSAAAAAAJ5uyx_lx34lJeEpTLVkP5k04qc",min:{chrome:"90",firefox:"74",greasemonkey:"1.14"}};const a=Object.create(null),i={VERSION:e,VERSION_DATE:new Date(t),NAMESPACE:o.name,sites:Object.create(null),boards:Object.create(null)},n=function(){const e={"&":"&","'":"'",'"':""","<":"<",">":">"},t=/[&"'<>]/g,o=function(t){return e[t]},a=function(e){return e.toString().replace(t,o)};return a.cat=function(e){let t="";for(let o=0;o>\\d(?:(?!>>\\d)[^])*){20}/\n# Filter posts like T H I S / H / I / S:\n#/^>?\\s?\\w\\s?(\\w)\\s?(\\w)\\s?(\\w).*$[\\s>]+\\1[\\s>]+\\2[\\s>]+\\3/im",flag:"",filename:"",dimensions:"# Highlight potential wallpapers:\n#/1920x1080/;op:yes;highlight;top:no;boards:w,wg",filesize:"",MD5:""}, sauces:'# Known filename formats:\nhttps://www.pixiv.net/member_illust.php?mode=medium&illust_id=%$1;regexp:/^(\\d+)_p\\d+/\njavascript:void(open("https://www.deviantart.com/"+%$1.replace(/_/g,"-")+"/art/"+parseInt(%$2,36)));regexp:/^\\w+_by_(\\w+)[_-]d([\\da-z]{6})\\b/\nhttps://imgur.com/%$1;regexp:/^(?![a-zA-Z][a-z]{6})(?![A-Z]{7})(?!\\d{7})([\\da-zA-Z]{7})(?: \\(\\d+\\))?\\.\\w+$/\nhttps://flickr.com/photo.gne?id=%$1;regexp:/^(\\d+)_[\\da-f]{10}(?:_\\w)*\\b/\nhttps://www.facebook.com/photo.php?fbid=%$1;regexp:/^\\d+_(\\d+)_\\d+_[no]\\b/\n\n# Reverse image search:\nhttps://www.google.com/searchbyimage?sbisrc=4chanx&image_url=%IMG&safe=off\nhttps://yandex.com/images/search?rpt=imageview&url=%IMG\n#//tineye.com/search?url=%IMG\n#//www.bing.com/images/search?q=imgurl:%IMG&view=detailv2&iss=sbi#enterInsights\n#https://lens.google.com/uploadbyurl?url=%IMG;text:lens\n\n# Specialized reverse image search:\n//iqdb.org/?url=%IMG\nhttps://trace.moe/?auto&url=%IMG;text:wait\n#//3d.iqdb.org/?url=%IMG\n#//saucenao.com/search.php?url=%IMG\n\n# "View Same" in archives:\nhttp://eye.swfchan.com/search/?q=%name;types:swf\n#https://desuarchive.org/_/search/image/%sMD5/\n#https://archive.4plebs.org/_/search/image/%sMD5/\n#https://boards.fireden.net/_/search/image/%sMD5/\n#https://foolz.fireden.net/_/search/image/%sMD5/\n\n# Other tools:\n#http://exif.regex.info/exif.cgi?imgurl=%URL\n#//imgops.com/start?url=%URL;types:gif,jpg,png\n#//www.gif-explode.com/%URL;types:gif', FappeT:{werk:!1},"Custom CSS":!0,Index:{"Index Mode":"paged","Previous Index Mode":"paged","Index Size":"small","Show Replies":[!0,'Show replies in the index, and also in the catalog if "Catalog hover expand" is checked.'],"Catalog Hover Expand":[!1,"Expand the comment and show more details when you hover over a thread in the catalog."],"Catalog Hover Toggle":[!0,'Turn "Catalog hover expand" on and off by clicking in the catalog.'],"Pin Watched Threads":[!1,"Move watched threads to the start of the index."],"Anchor Hidden Threads":[!0,"Move hidden threads to the end of the index."],"Refreshed Navigation":[!1,"Refresh index when navigating through pages."]},Header:{"Fixed Header":!0,"Header auto-hide":!1,"Header auto-hide on scroll":!1,"Bottom Header":!1,"Centered links":!1,"Header catalog links":!1,"Bottom Board List":!0,"Shortcut Icons":!0,"Custom Board Navigation":!0},archives:{archiveLists:"https://4chenz.github.io/archives.json/archives.json",lastarchivecheck:0,archiveAutoUpdate:!0 -},externalCatalogURLs:"//catalog.neet.tv/%board/;boards:4chan.org:3,a,adv,an,asp,biz,c,cgl,ck,cm,co,diy,f,fa,fit,g,gd,his,i,int,jp,k,lgbt,lit,m,mlp,mu,n,news,o,out,p,po,pol,s4s,sci,sp,tg,toy,trv,tv,v,vg,vip,vp,vr,w,wg,wsg,wsr,x",boardnav:`[ toggle-all ]\n[current-index-text:"Index"\ncurrent-catalog-text:"Catalog"\ncurrent-expired-text:"Expired"\ncurrent-archive-text:"Archive"]\n[external-text:"FAQ","${o.faq}"]`,QR:{"QR.personas":'#options:"sage";boards:jp;always',sjisPreview:!1},jsWhitelist:"http://s.4cdn.org\nhttps://s.4cdn.org\nhttp://www.google.com\nhttps://www.google.com\nhttps://www.gstatic.com\nhttp://cdn.mathjax.org\nhttps://cdn.mathjax.org\nhttps://cdnjs.cloudflare.com\nhttps://hcaptcha.com\nhttps://*.hcaptcha.com\n'self'\n'unsafe-inline'\n'unsafe-eval'",captchaLanguage:"",time:"%m/%d/%y(%a)%H:%M:%S",timeLocale:"",RelativeTime:"Hover",backlink:">>%id",pastedname:"file",fileInfo:"%l %d (%p%s, %r%g)",favicon:"ferongr", +},externalCatalogURLs:"//catalog.neet.tv/%board/;boards:4chan.org:3,a,adv,an,asp,biz,c,cgl,ck,cm,co,diy,f,fa,fit,g,gd,his,i,int,jp,k,lgbt,lit,m,mlp,mu,n,news,o,out,p,po,pol,s4s,sci,sp,tg,toy,trv,tv,v,vg,vip,vp,vr,w,wg,wsg,wsr,x",boardnav:`[ toggle-all ]\n[current-index-text:"Index"\ncurrent-catalog-text:"Catalog"\ncurrent-expired-text:"Expired"\ncurrent-archive-text:"Archive"]\n[external-text:"FAQ","${o.faq}"]`,QR:{"QR.personas":'#options:"sage";boards:jp;always',sjisPreview:!1},jsWhitelist:"",captchaLanguage:"",time:"%m/%d/%y(%a)%H:%M:%S",timeLocale:"",RelativeTime:"Hover",backlink:">>%id",pastedname:"file",fileInfo:"%l %d (%p%s, %r%g)",favicon:"ferongr", usercss:"div.boardTitle{font-weight:400 !important}:root.yotsuba div.boardTitle{font-family:sans-serif !important;text-shadow:1px 1px 1px rgba(100,0,0,0.6)}:root.yotsuba-b div.boardTitle{font-family:sans-serif !important;text-shadow:1px 1px 1px rgba(105,10,15,0.6)}:root.photon div.boardTitle{font-family:sans-serif !important;text-shadow:1px 1px 1px rgba(0,74,153,0.6)}:root.tomorrow div.boardTitle{font-family:sans-serif !important;text-shadow:1px 1px 1px rgba(167,170,168,0.6)}",hotkeys:{"Toggle board list":["Ctrl+b","Toggle the full board list."],"Toggle header":["Shift+h","Toggle the auto-hide option of the header."],"Open empty QR":["q","Open QR without post number inserted."],"Open QR":["Shift+q","Open QR with post number inserted."],"Open settings":["Alt+o","Open Settings."],Close:["Esc","Close dialogs or notifications."],"Spoiler tags":["Ctrl+s","Insert spoiler tags."],"Code tags":["Alt+c","Insert code tags."],"Eqn tags":["Alt+e","Insert eqn tags."], "Math tags":["Alt+m","Insert math tags."],"SJIS tags":["Alt+a","Insert SJIS tags."],"Toggle sage":["Alt+s","Toggle sage in options field."],"Toggle Cooldown":["Alt+Comma","Toggle custom cooldown timer."],"Post from URL":["Alt+l","Post from URL."],"Add new post":["Alt+n","Add new post to the QR dump list."],"Submit QR":["Ctrl+Enter","Submit post."],Watch:["w","Watch thread."],Update:["r","Update the thread / refresh the index."],"Update thread watcher":["Shift+r","Manually refresh thread watcher."],"Toggle thread watcher":["t","Toggle visibility of thread watcher."],"Toggle threading":["Shift+t","Toggle threading."],"Mark thread read":["Ctrl+0",'Mark thread read from index (requires "Unread Line in Index").'],"Expand image":["Shift+e","Expand selected image."],"Expand images":["e","Expand all images."],"Open Gallery":["g","Opens the gallery."],"Next Gallery Image":["Right","Go to the next image in gallery mode."], "Previous Gallery Image":["Left","Go to the previous image in gallery mode."],"Advance Gallery":["Enter","Go to next image or, if Autoplay is off, play video."],Pause:["p","Pause/play videos in the gallery."],Slideshow:["Ctrl+Right","Toggle the gallery slideshow mode."],"Rotate image clockwise":["Shift+Right","Rotate image clockwise in gallery."],"Rotate image anticlockwise":["Shift+Left","Rotate image anticlockwise in gallery."],"Download Gallery Image":["Shift+j","Download current image in gallery."],fappeTyme:["f","Toggle Fappe Tyme."],werkTyme:["Shift+w","Toggle Werk Tyme."],"Front page":["1","Jump to front page."],"Open front page":["Shift+1","Open front page in a new tab."],"Next page":["Ctrl+Right","Jump to the next page."],"Previous page":["Ctrl+Left","Jump to the previous page."],"Paged mode":["Alt+1","Open the index in paged mode."],"Infinite scrolling mode":["Alt+2","Open the index in infinite scrolling mode."], @@ -199,7 +199,7 @@ window.MathJax?window.MathJax.Hub.Queue(["Typeset",window.MathJax.Hub,e.target]) window.grecaptcha.reset(document.querySelector("#qr .captcha-container").dataset.widgetID)},setupTCaptcha:({boardID:e,threadID:t,autoLoad:o})=>{const{TCaptcha:a}=window;a.init(document.querySelector("#qr .captcha-container"),e,+t),a.setErrorCb((e=>window.dispatchEvent(new CustomEvent("CreateNotification",{detail:{type:"warning",content:""+e}})))),"1"===o&&a.load(e,t)},destroyTCaptcha:()=>{window.TCaptcha.destroy()},TCaptchaClearChallenge:()=>{window.TCaptcha.clearChallenge()},setupQR:()=>{window.FCX.oekakiCB=()=>window.Tegaki.flatten().toBlob((function(e){const t=`oekaki-${Date.now()}`;window.FCX.oekakiLatest=t,document.dispatchEvent(new CustomEvent("QRSetFile",{bubbles:!0,detail:{file:e,name:window.FCX.oekakiName,source:t}}))})),window.Tegaki&&(document.querySelector("#qr .oekaki").hidden=!1)},qrTegakiDraw:()=>{const{Tegaki:e,FCX:t}=window;e.bg&&e.destroy(),t.oekakiName="tegaki.png",e.open({onDone:t.oekakiCB,onCancel(){e.bgColor="#ffffff"}, width:+document.querySelector("#qr [name=oekaki-width]").value,height:+document.querySelector("#qr [name=oekaki-height]").value,bgColor:document.querySelector("#qr [name=oekaki-bg]").checked?document.querySelector("#qr [name=oekaki-bgcolor]").value:"transparent"})},qrTegakiLoad:()=>{const{Tegaki:e,FCX:t}=window,o=document.getElementById("qr-filename").value.replace(/\.\w+$/,"")+".png",{source:a}=document.getElementById("file-n-submit").dataset,i=e=>document.dispatchEvent(new CustomEvent("CreateNotification",{bubbles:!0,detail:{type:"warning",content:e,lifetime:20}}));var n=function(a){a&&this.removeEventListener("QRMetadata",n,!1);const s=document.getElementById("selected");if(!s?.dataset.type)return i("No file to edit.");if(!/^(image|video)\//.test(s.dataset.type))return i("Not an image.");if(!s.dataset.height)return i("Metadata not available.");if("loading"===s.dataset.height)return void s.addEventListener("QRMetadata",n,!1);e.bg&&e.destroy(),t.oekakiName=o,e.open({onDone:t.oekakiCB, onCancel(){e.bgColor="#ffffff"},width:+s.dataset.width,height:+s.dataset.height,bgColor:"transparent"});const r=document.createElement("canvas");r.width=r.naturalWidth=+s.dataset.width,r.height=r.naturalHeight=+s.dataset.height,r.hidden=!0,document.body.appendChild(r),r.addEventListener("QRImageDrawn",(function(){this.remove(),e.onOpenImageLoaded.call(this)}),!1),r.dispatchEvent(new CustomEvent("QRDrawFile",{bubbles:!0}))};e.bg&&e.onDoneCb===t.oekakiCB&&a===t.oekakiLatest?(t.oekakiName=o,e.resume()):n()},testNativeExtension:(e={})=>(window.Parser?.postMenuIcon&&(e.enabled="true"),e)},x=(e,t=document.body)=>t.querySelector(e);x.id=e=>s.getElementById(e),x.ready=function(e){if("loading"===s.readyState){var t=function(){return x.off(s,"DOMContentLoaded",t),e()};return x.on(s,"DOMContentLoaded",t)}x.queueTask(e)},x.formData=function(e){if(e instanceof HTMLFormElement)return new FormData(e);const t=new FormData;for(var o in e){var a=e[o] -;a&&("object"==typeof a&&"newName"in a?t.append(o,a,a.newName):t.append(o,a))}return t},x.extend=function(e,t){for(var o in t){var a=t[o];e[o]=a}},x.hasOwn=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),x.getOwn=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0},x.ajax=function(){let e;return e=window.wrappedJSObject&&!XMLHttpRequest.wrappedJSObject?XPCNativeWrapper(window.wrappedJSObject.XMLHttpRequest):XMLHttpRequest,function(t,a={}){null==a.responseType&&(a.responseType="json"),a.type||(a.type=a.form?"post":"get"),t=t.replace(/^((?:https?:)?\/\/(?:\w+\.)?(?:4chan|4channel|4cdn)\.org)\/adv\//,"$1//adv/");const{onloadend:i,timeout:n,responseType:s,withCredentials:r,type:d,onprogress:c,form:h,headers:u}=a,p=new e;try{p.open(d,t,!0);const e=u||{};for(var g in e){var f=e[g];p.setRequestHeader(g,f)}x.extend(p,{onloadend:i,timeout:n,responseType:s,withCredentials:r}),x.extend(p.upload,{onprogress:c}),x.on(p,"error",(function(){ +;a&&("object"==typeof a&&"newName"in a?t.append(o,a,a.newName):t.append(o,a))}return t},x.extend=function(e,t){for(var o in t){var a=t[o];e[o]=a}},x.hasOwn=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),x.getOwn=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0},x.ajax=function(){let e=XMLHttpRequest;if(window.wrappedJSObject&&!XMLHttpRequest.wrappedJSObject)try{e=XPCNativeWrapper(window.wrappedJSObject.XMLHttpRequest)}catch(e){}return function(t,a={}){null==a.responseType&&(a.responseType="json"),a.type||(a.type=a.form?"post":"get"),t=t.replace(/^((?:https?:)?\/\/(?:\w+\.)?(?:4chan|4channel|4cdn)\.org)\/adv\//,"$1//adv/");const{onloadend:i,timeout:n,responseType:s,withCredentials:r,type:d,onprogress:c,form:h,headers:u}=a,p=new e;try{p.open(d,t,!0);const e=u||{};for(var g in e){var f=e[g];p.setRequestHeader(g,f)}x.extend(p,{onloadend:i,timeout:n,responseType:s,withCredentials:r}),x.extend(p.upload,{onprogress:c}),x.on(p,"error",(function(){ p.status||l.warn(`${o.name} failed to load: ${t}`)})),p.send(h)}catch(e){if(2153644038!==e.result)throw e;p.onloadend=i,x.queueTask(x.event,"error",null,p),x.queueTask(x.event,"loadend",null,p)}return p}}(),x.lastModified=p(),x.whenModified=function(e,t,o,a={}){let i;const{timeout:n,ajax:s}=a,r=p();null!=(i=x.lastModified[t]?.[e])&&(r["If-Modified-Since"]=i);return(s||x.ajax)(e,{onloadend(){return(x.lastModified[t]||(x.lastModified[t]=p()))[e]=this.getResponseHeader("Last-Modified"),o.call(this)},timeout:n,headers:r})},function(){const e=p();x.cache=function(t,o,a={}){let i;const{ajax:n}=a;if(i=e[t])return i.callbacks?i.callbacks.push(o):x.queueTask((()=>o.call(i,{isCached:!0}))),i;return i=(n||x.ajax)(t,{onloadend:function(){for(o of(this.status||delete e[t],this.callbacks))(e=>{x.queueTask((()=>e.call(this,{isCached:!1})))})(o);return delete this.callbacks}}),i.callbacks=[o],e[t]=i},x.cleanCache=function(t){for(var o in e)t(o)&&delete e[o]}}(),x.cb={checked(){ if(x.hasOwn(a,this.name))return x.set(this.name,this.checked),a[this.name]=this.checked},value(){if(x.hasOwn(a,this.name))return x.set(this.name,this.value.trim()),a[this.name]=this.value}},x.asap=function(e,t){return e()?t():setTimeout(x.asap,25,e,t)},x.onExists=function(e,t,o){let a;if(a=x(t,e))return o(a);var i=new MutationObserver((function(){if(a=x(t,e))return i.disconnect(),o(a)}));return i.observe(e,{childList:!0,subtree:!0})},x.addStyle=function(e,t,o="head"){const a=x.el("style",{textContent:e});return null!=t&&(a.id=t),x.onExists(r,o,(()=>x.add(s.head,a))),a},x.addCSP=function(e){const t=x.el("meta",{httpEquiv:"Content-Security-Policy",content:e});if(s.head)return x.add(s.head,t),x.rm(t);{const e=x.add(r||s,x.el("head"));return x.add(e,t),x.rm(e)}},x.x=function(e,t){return t||(t=s.body),s.evaluate(e,t,null,8,null).singleNodeValue},x.X=function(e,t){return t||(t=s.body),s.evaluate(e,t,null,7,null)},x.addClass=function(e,...t){e.classList.add(...t)},x.rmClass=function(e,...t){ e.classList.remove(...t)},x.toggleClass=(e,t)=>e.classList.toggle(t),x.hasClass=(e,t)=>e.classList.contains(t),x.rm=e=>e?.remove(),x.rmAll=e=>e.textContent=null,x.tn=e=>s.createTextNode(e),x.frag=()=>s.createDocumentFragment(),x.nodes=function(e){if(!(e instanceof Array))return e;const t=x.frag();for(var o of e)t.appendChild(o);return t},x.add=(e,t)=>e.appendChild(x.nodes(t)),x.prepend=(e,t)=>e.insertBefore(x.nodes(t),e.firstChild),x.after=(e,t)=>e.parentNode.insertBefore(x.nodes(t),e.nextSibling),x.before=(e,t)=>e.parentNode.insertBefore(x.nodes(t),e),x.replace=(e,t)=>e.parentNode.replaceChild(x.nodes(t),e),x.el=function(e,t,o){const a=s.createElement(e);return t&&x.extend(a,t),o&&x.extend(a,o),a},x.on=function(e,t,o){for(var a of t.split(" "))e.addEventListener(a,o,!1)},x.off=function(e,t,o){for(var a of t.split(" "))e.removeEventListener(a,o,!1)},x.one=function(e,t,o){var a=function(i){return x.off(e,t,a),o.call(this,i)};return x.on(e,t,a)},x.event=function(e,t,o=s){ @@ -212,9 +212,9 @@ x.hasStorage||(x.cantSync=!0)):x.hasStorage?(x.oldValue=p(),x.setValue=function( ;(a=x.syncing[o])&&t.push(a(p.json(JSON.stringify(i)),o))}return t})())),x.sync=(e,t)=>x.syncing[e]=t,x.forceSync=function(){},x.delete=function(e,t){let o;e instanceof Array||(e=[e]),Promise.all(e.map((e=>GM.deleteValue(i.NAMESPACE+e)))).then((function(){const a=p();for(o of e)a[o]=void 0;x.syncChannel.postMessage(a),t?.()}))},x.get=x.oneItemSugar((function(e,t){const o=Object.keys(e);return Promise.all(o.map((e=>GM.getValue(i.NAMESPACE+e)))).then((function(a){for(let t=0;t{const t=[];for(var o in e){var a=e[o];t.push(GM.setValue(i.NAMESPACE+o,JSON.stringify(a)))}return t})()).then((function(){return x.syncChannel.postMessage(e),t?.()}))})),x.clear=e=>GM.listValues().then((t=>x.delete(t.map((e=>e.replace(i.NAMESPACE,""))),e))).catch((()=>x.delete(Object.keys(a).concat(["previousversion","QR Size","QR.persona"]),e))));var w={url(e,t,...o){ let a,n;return(n=i.sites[t.siteID])&&(a=x.getOwn(n.urls,e))?a(t,...o):void 0},threadExcerpt(e){const{OP:t}=e,o=`/${decodeURIComponent(e.board.ID)}/ - `+(t.info.subject?.trim()||t.commentDisplay().replace(/\n+/g," // ")||t.file?.name||`No.${t}`);return o.length>73?`${o.slice(0,70)}...`:o},threadFromRoot(e){if(null==e)return null;const{board:t}=e.dataset;return i.threads.get(`${t?encodeURIComponent(t):i.BOARD.ID}.${e.id.match(/\d*$/)[0]}`)},threadFromNode:e=>w.threadFromRoot(x.x(`ancestor-or-self::${i.SITE.xpath.thread}`,e)),postFromRoot(e){if(null==e)return null;const t=i.posts.get(e.dataset.fullID),o=e.dataset.clone;return o?t.clones[+o]:t},postFromNode:e=>w.postFromRoot(x.x(`ancestor-or-self::${i.SITE.xpath.postContainer}[1]`,e)),postDataFromLink(e){let t,o,a;if(e.dataset.postID)({boardID:t,threadID:a,postID:o}=e.dataset),a||(a=0);else{const n=e.href.match(i.SITE.regexp.quotelink);[t,a,o]=n.slice(1),o||(o=a)}return{boardID:t,threadID:+a,postID:+o}},allQuotelinksLinkingTo(e){ const t=[],{posts:o}=i,{fullID:n}=e,s=function(e,o){for(var a of(t.push(...e.nodes[o]||[]),e.clones))t.push(...a.nodes[o]||[])};if(o.forEach((function(e){if(e.quotes.includes(n))return s(e,"quotelinks")})),a["Quote Backlinks"])for(var r of e.quotes){var l;(l=o.get(r))&&s(l,"backlinks")}return t.filter((function(t){const{boardID:o,postID:a}=w.postDataFromLink(t);return o===e.board.ID&&a===e.ID}))}};const y=Symbol("isEscaped"),k=new Set(["area","base","br","col","embed","hr","img","input","link","meta","source","track","wbr"]),I=Symbol("hFragment");function C(e,t,...o){let a=e===I?"":`<${e}`;if(t)for(const[e,o]of Object.entries(t))(o||0===o)&&(a+=` ${e}`,!0!==o&&(a+=`="${n(o.toString())}"`));e!==I&&(a+=">");const i=e!==I&&k.has(e);if(i){if(o.length)throw new TypeError(`${e} is a void html element and can't have child elements`)}else for(const e of o)null!=e&&""!==e&&(e instanceof Object&&"innerHTML"in e&&e[y]?a+=e.innerHTML:a+=n(e.toString()));return i||e===I||(a+=`${e}>`),{ -innerHTML:a,[y]:!0}}const D=" | ",E=C("div",{id:"fourchanx-settings",class:"dialog"},C("nav",null,C("div",{class:"sections-list"}),C("p",{class:"imp-exp-result warning"}),C("div",{class:"credits"},C("a",{class:"export"},"Export"),D,C("a",{class:"import"},"Import"),D,C("a",{class:"reset"},"Reset Settings"),D,C("input",{type:"file",hidden:!0}),C("a",{href:o.page,target:"_blank"},o.name),D,C("a",{href:o.changelog,target:"_blank"},i.VERSION),D,C("a",{href:o.issues,target:"_blank"},"Issues"),D,C("a",{href:"javascript:;",class:"close",title:"Close"},"✕"))),C("div",{class:"section-container"},C("section",null)));const S=(e,t=s.body)=>Array.from(t.querySelectorAll(e));var T={init(){if((this.useFaster=/\S/.test(a.fourchanImageHost))&&"yotsuba"===i.SITE.software&&["index","thread"].includes(i.VIEW))return c.Post.push({name:"Image Host Rewriting",cb:this.node})},suggestions:["i.4cdn.org","is2.4chan.org"],host:()=>a.fourchanImageHost.trim()||"i.4cdn.org",flashHost:()=>"i.4cdn.org", -thumbHost:()=>"i.4cdn.org",test:e=>"i.4cdn.org"===e||T.regex.test(e),regex:/^is\d*\.4chan(?:nel)?\.org$/,node(){if(this.isClone)return;const e=T.host();return this.file&&T.test(this.file.url.split("/")[2])&&!/\.swf$/.test(this.file.url)&&(this.file.link.hostname=e,this.file.thumbLink&&(this.file.thumbLink.hostname=e),this.file.url=this.file.link.href),T.fixLinks(S("a",this.nodes.comment))},fixLinks(e){for(var t of e)if(T.test(t.hostname)&&!/\.swf$/.test(t.pathname)){var o=T.host();t.hostname!==o&&(t.hostname=o)}}};const R={ -boards:'.dialog{border:1px solid;display:block;background-color:inherit}.dialog:not(#qr):not(#thread-watcher):not(#header-bar){box-shadow:0 1px 2px rgba(0, 0, 0, .15)}#qr,#thread-watcher{box-shadow:-1px 2px 2px rgba(0, 0, 0, 0.25)}.field{background-color:#FFF;border:1px solid #CCC;box-sizing:border-box;color:#333;font:13px sans-serif;outline:none;transition:color .25s, border-color .25s}.field::placeholder{color:#AAA;opacity:1}.field:hover{border-color:#999}.field:hover, .field:focus, .field.focus{color:#000}.field[disabled]{background-color:#F2F2F2;color:#888}.move{cursor:move;overflow:hidden}label{cursor:pointer}a[href="javascript:;"]{text-decoration:none}.warning{color:red}:root.sw-yotsuba #boardNavDesktop, :root.sw-yotsuba #boardNavMobile{display:none !important}:root.hide-bottom-board-list $site$boardListBottom{display:none}body.hasDropDownNav{margin-top:5px}:root:not(.keyboard-focus) a{outline:none}.painted{border-radius:3px;padding:0px 2px}[hidden]{display:none !important}:root.sw-yotsuba .opContainer, :root.sw-yotsuba .op{display:block;overflow:visible}:root.sw-yotsuba .reply>.file>.fileText{margin:0 20px}:root.sw-yotsuba #arc-list span.quote{color:#789922}:root.sw-yotsuba .fileText a{unicode-bidi:isolate}:root.sw-yotsuba #g-recaptcha{min-height:78px;height:auto}:root.sw-yotsuba:not(.js-enabled) #postForm{display:table}:root.sw-yotsuba #captchaContainerAlt td:nth-child(2){display:table-cell !important}:root.sw-yotsuba canvas#tegaki-canvas{background:none}:root.sw-yotsuba>body>div:last-of-type{transition:none !important}:root.sw-yotsuba>body>div[style*=" top: -10000px;"]{visibility:hidden !important}:root.sw-yotsuba .post>.file{word-break:break-word}:root.sw-yotsuba:not(.ua-webkit):not(.ua-blink) .fileText{word-wrap:break-word;max-width:calc(100vw - 90px)}:root.sw-yotsuba>body.is_catalog .thread>a>img{display:inline-block}:root.sw-yotsuba .nwsb{display:inline}:root.sw-yotsuba .fileText{max-width:auto;white-space:normal}:root.sw-yotsuba .ad-cnt>*, :root.sw-yotsuba .adg-rects>*, :root.sw-yotsuba .bsa-cnt{height:auto !important}:root.sw-yotsuba:not(.ads-loaded) hr.abovePostForm,:root.sw-yotsuba:not(.ads-loaded) .adg-rects>hr,:root.sw-yotsuba #adg-ol+hr,:root.sw-yotsuba .danbo-slot:empty{display:none}:root.sw-yotsuba .adg-rects{margin:0;font-size:0}:root.sw-yotsuba div.center[style]{display:none !important}#menu>.hide-thread-link{width:auto;height:auto;overflow:visible;background-image:none}#menu label.entry{display:block}#fourchanx-settings label{display:inline}.intro a[href="javascript:;"],#menu a{margin:0}.gal-buttons.gal-buttons a{font-size:inherit}:root.sw-tinyboard.fixed.top-header:not(.autohide) .boardlist,:root.sw-tinyboard.fixed.top-header:not(.autohide) .bar.top{position:static}:root.sw-tinyboard.fixed.top-header:not(.autohide) div.pages.top{top:auto;bottom:0}:root.sw-tinyboard.fixed.top-header.autohide .boardlist,:root.sw-tinyboard.fixed.top-header.autohide .bar.top{z-index:3}:root[data-host="fufufu.moe"].fixed.top-header:not(.autohide) div.pages.top{top:26px;bottom:auto}:root[data-host="merorin.com"].fixed.top-header:not(.autohide) span.settings{top:26px}:root[data-host="fufufu.moe"]:not(.fixed) #header-bar{margin-top:38px}:root[data-host="lainchan.org"]:not(.fixed) #header-bar{margin-top:17px}:root[data-host="smuglo.li"]:not(.fixed) #header-bar{margin-top:8px}audio.controls-added{display:block;margin:auto;white-space:normal}:root.anti-autoplay div.embed{position:static;width:auto;height:auto;text-align:center}:root.anti-autoplay .autoplay-removed{visibility:visible !important;min-width:640px;min-height:360px}#overlay,#qp, #ihover,#navlinks, .fixed #header-bar,:root.float #updater,:root.float #thread-stats,#qr,#export-dialog{position:fixed}#overlay{z-index:999}#qp, #ihover{z-index:60}#menu, .gal-buttons{z-index:50}#updater, #thread-stats{z-index:40}:root.fixed #header-bar, #notifications{z-index:35}#a-gallery{z-index:30}#navlinks{z-index:25}#qr{z-index:20}#embedding{z-index:11}#export-dialog{z-index:1001}:root.fixed-watcher #thread-watcher{z-index:10}:root.fixed:not(.gallery-open) #header-bar:not(:hover){z-index:8}#thread-watcher{z-index:5}.fixed.top-header body{padding-top:2em}.fixed.bottom-header body{padding-bottom:2em}.fixed #header-bar{right:0;left:0;padding:3px 4px 4px;font-size:12px}.fixed.top-header #header-bar{top:0}.fixed.bottom-header #header-bar{bottom:0}#header-bar{border-width:0;transition:all .1s .05s ease-in-out}:root.fixed #header-bar{box-shadow:-5px 1px 10px rgba(0, 0, 0, 0.20)}:root.centered-links #shortcuts{width:300px;text-align:right;justify-content:right}:root.centered-links #header-bar{text-align:center}#custom-board-list{font-size:13px;vertical-align:middle}#full-board-list{vertical-align:middle}:root.centered-links #custom-board-list{position:relative;left:150px}.fixed.top-header #header-bar{border-bottom-width:1px}.fixed.bottom-header #header-bar{box-shadow:0 -1px 2px rgba(0, 0, 0, .15);border-top-width:1px}.fixed.bottom-header #header-bar .menu-button i{border-top:none;border-bottom:6px solid}.fixed #header-bar.autohide:not(:hover){box-shadow:none;transition:all .8s .6s cubic-bezier(.55, .055, .675, .19)}.fixed.top-header #header-bar.autohide:not(:hover){margin-bottom:-1em;transform:translateY(-100%)}.fixed.bottom-header #header-bar.autohide:not(:hover){transform:translateY(100%)}#scroll-marker{left:0;right:0;height:10px;position:absolute}#header-bar:not(.autohide) #scroll-marker{pointer-events:none}#header-bar #scroll-marker{display:none}.fixed #header-bar #scroll-marker{display:block}.fixed.top-header #header-bar #scroll-marker{top:100%}.fixed.bottom-header #header-bar #scroll-marker{bottom:100%}#board-list a, #shortcuts a:not(.entry){text-decoration:none;padding:1px}#shortcuts:empty{display:none}.dead-thread,.disabled:not(.replies-quoting-you){opacity:.45}#shortcuts{float:right;display:flex}:root.autohiding-scrollbar #shortcuts{margin-right:12px}.shortcut{margin-left:3px;vertical-align:middle}:root.shortcut-icons .native-settings{font-size:0;color:transparent;display:inline-block;vertical-align:top;height:12px;width:14px;background:url(\'//s.4cdn.org/image/favicon.ico\') 0px -1px no-repeat}#navbotright,#navtopright{display:none}#toggleMsgBtn{display:none !important}.current,:root.sw-yotsuba div#boardNavDesktopFoot a.current{font-weight:bold}:root.shortcut-icons #header-bar .icon-shortcut{font-size:0}:root.shortcut-icons #header-bar .icon-shortcut a::before{content:var(--icon);font-size:16px;line-height:12px}@media (min-width: 1300px){:root.sw-yotsuba.fixed:not(.centered-links) #header-bar{white-space:nowrap;display:flex;align-items:center}:root.sw-yotsuba.fixed:not(.centered-links) #board-list{flex:auto}:root.sw-yotsuba.fixed:not(.centered-links) #full-board-list{display:flex}:root.sw-yotsuba.fixed:not(.centered-links) .hide-board-list-container{flex:none;margin-right:5px}:root.sw-yotsuba.fixed:not(.centered-links) #full-board-list>.boardList{flex:auto;display:flex;width:0px; }:root.sw-yotsuba.fixed:not(.centered-links) #full-board-list>.boardList>a,:root.sw-yotsuba.fixed:not(.centered-links) #full-board-list>.boardList>span:not(.space):not(.spacer){flex:none;padding:.17em;margin:-.17em -.32em}:root.sw-yotsuba.fixed:not(.centered-links) #full-board-list>.boardList>span{pointer-events:none}:root.sw-yotsuba.fixed:not(.centered-links) #full-board-list>.boardList>span.space{flex:0 .63 .63em}:root.sw-yotsuba.fixed:not(.centered-links) #full-board-list>.boardList>span.spacer{flex:0 .38 .38em}:root.sw-yotsuba.fixed:not(.centered-links) #shortcuts{float:initial;flex:none;display:flex;align-items:center}}.brackets-wrap::before{content:"["}.brackets-wrap::after{content:"]"}#notifications{position:fixed;top:0;height:0;text-align:center;right:0;left:0;visibility:visible}#notifications:empty{display:none}:root.fixed.top-header:not(.gallery-open) #header-bar #notifications,:root.fixed.top-header #header-bar.autohide #notifications{position:absolute;top:100%}.notification{color:#FFF;font-weight:700;text-shadow:0 1px 2px rgba(0, 0, 0, .5);box-shadow:0 1px 2px rgba(0, 0, 0, .15);border-radius:2px;margin:1px auto;width:550px;max-width:100%;position:relative;transition:all .25s ease-in-out}.notification.error{background-color:hsla(0, 100%, 38%, .9)}.notification.warning{background-color:hsla(36, 100%, 38%, .9)}.notification.info{background-color:hsla(200, 100%, 38%, .9)}.notification.success{background-color:hsla(104, 100%, 38%, .9)}.notification a{color:white}.notification>.close{font-size:11px;padding:7px;top:0px;right:5px;position:absolute}.message{box-sizing:border-box;padding:6px 20px;max-height:200px;width:100%;overflow:auto;white-space:pre-line}.message a{text-decoration:underline}:root.tainted .report-error{display:none}:root.fourchan-x body{box-sizing:border-box}#overlay{background-color:rgba(0, 0, 0, .5);display:flex;top:0;left:0;height:100%;width:100%}#fourchanx-settings{box-sizing:border-box;box-shadow:0 0 15px rgba(0, 0, 0, .15);height:600px;max-height:100%;width:900px;max-width:100%;margin:auto;padding:5px;display:flex;flex-direction:column}#fourchanx-settings>nav{padding:2px 2px 8px;display:flex}#fourchanx-settings>nav a{text-decoration:underline}#fourchanx-settings>nav a.close{text-decoration:none;padding:0 2px;margin:0}.section-container{flex:1;position:relative;overflow:auto;padding-right:5px;overscroll-behavior:contain}.sections-list{flex:1}.export, .import, .reset{cursor:pointer;text-decoration:none !important}.tab-selected{font-weight:700}.section-sauce ul,.section-advanced ul{list-style:none;margin:0}.section-sauce ul{padding:8px}.section-advanced ul{padding:0px}.section-sauce li,.section-advanced li{padding-left:4px}.section-main ul{margin:0;padding:0 0 0 16px}.section-main li{white-space:pre-line;list-style:disc}.section-main li:not(:first-of-type){margin-top:4px}.section-main label{text-decoration:underline}div[data-checked="false"]>.suboption-list{display:none}.suboption-list{position:relative}.suboption-list::before{content:"";display:inline-block;position:absolute;left:.7em;width:0;height:100%;border-left:1px solid}.suboption-list>div{position:relative;padding-left:1.4em}.suboption-list>div::before{content:"";display:inline-block;position:absolute;left:.7em;width:.7em;height:.6em;border-left:1px solid;border-bottom:1px solid}#fourchanx-settings .section-main p{margin:.5em 0 0}.section-filter ul{padding:0}.section-filter li{margin:10px 40px;list-style:disc}.section-filter textarea{height:500px}.section-main a, .section-filter a, .section-advanced a{text-decoration:underline}#sauce-doc-expand:not(:checked)~#sauce-doc{max-height:130px;overflow:auto}#sauce-doc>label{float:right;margin:0 5px}#sauce-doc-expand+.riceCheck{display:none}.section-sauce textarea{height:430px}.section-advanced .field.wide{width:100%}.section-advanced textarea{height:150px}.section-advanced textarea[name="archiveLists"],.section-advanced textarea[name="externalCatalogURLs"],.section-advanced textarea[name="knownBanners"]{height:75px}.section-advanced .archive-cell{min-width:160px;text-align:center}.section-advanced #archive-board-select{position:absolute}.section-advanced .note{font-size:0.8em;font-style:italic;margin-left:10px}.section-advanced .note code{font-style:normal;font-size:11px}.favicon-preview>img{vertical-align:middle}.favicon-preview>img:nth-of-type(3n+1){margin-left:4px}.section-keybinds .field{font-family:monospace}#fourchanx-settings fieldset{border:1px solid;border-radius:3px;padding:0.35em 0.625em 0.75em;margin:0px 2px}#fourchanx-settings legend{font-weight:700;color:inherit}#fourchanx-settings textarea{font-family:monospace;width:100%;resize:vertical}#fourchanx-settings code{color:#000;background-color:#FFF;padding:0 2px}#fourchanx-settings th{text-align:center;font-weight:bold}#fourchanx-settings p{margin:1em 0px}#fourchanx-settings table{margin:auto}:root.index-loading .navLinks:not(.json-index),:root.index-loading .board:not(.json-index),:root.index-loading .pagelist:not(.json-index),:root.infinite-mode .pagelist,:root.all-pages-mode .pagelist,:root.catalog-mode .pagelist,:root:not(.catalog-mode) .indexlink,:root.catalog-mode .cataloglink,:root:not(.catalog-mode) #hidden-label,:root:not(.catalog-mode) #index-size{display:none}#index-search{padding-right:1.5em;width:100px;transition:color .25s, border-color .25s, width .25s}#index-search:focus,#index-search[data-searching]{width:200px}#index-search-clear{color:gray;display:inline-block;position:relative;left:-1em;width:0}#index-search::-webkit-search-cancel-button{display:none}#index-search:not([data-searching])+#index-search-clear{display:none}#index-options{float:right}#lastlong-options{display:inline-block;vertical-align:middle;height:28px;margin:-14px 0}#lastlong-options>input{padding:0;border:0 !important;text-align:center;background:transparent;display:block;font-size:12px;height:12px;width:30px;margin:1px 0}.summary{text-decoration:none}:root.catalog-mode .board{text-align:center}.catalog-thread{display:inline-block;box-sizing:border-box;border:1px solid transparent;word-wrap:break-word;vertical-align:top;position:relative}.catalog-thread.catalog-thread{margin:2px}.catalog-small>.catalog-thread{width:165px;height:320px}.catalog-large>.catalog-thread{width:270px;height:410px}:root.catalog-hover-expand .catalog-thread:hover{z-index:1}.catalog-container{position:absolute;top:-4px;left:0;right:0;bottom:0}.catalog-container:not(:hover),:root:not(.catalog-hover-expand) .catalog-container{overflow:hidden}.catalog-post{position:absolute;top:4px;left:0;right:0;border:1px solid transparent;padding-top:20px}:root:not(.catalog-hover-expand) .catalog-post{left:0 !important;right:0 !important}.catalog-post.catalog-post{margin:-21px -1px -1px;overflow:visible}.catalog-thread.noFile>*>.catalog-post{margin-top:-7px;padding-top:6px}:root.catalog-hover-expand .catalog-container:hover>.catalog-post{margin-left:-61px;margin-right:-61px}:root.catalog-hover-expand .catalog-container:hover>*>:not(.catalog-replies){padding-left:2px;padding-right:2px}.catalog-link{display:block;position:relative}.catalog-thumb{border-radius:2px;box-shadow:0 0 5px rgba(0, 0, 0, .25);vertical-align:top}.catalog-thumb.spoiler-file{width:100px;height:100px}.catalog-thumb.deleted-file{width:127px;height:13px;padding:20px 11px}.catalog-thumb.no-file{width:77px;height:13px;padding:20px 36px}.catalog-icons>img,.catalog-stats>.menu-button{width:1em;height:1em;margin:0;vertical-align:text-top;padding-left:2px}.catalog-stats>.menu-button>svg.icon{height:10px}.catalog-stats{font-size:10px;font-weight:700;padding-top:2px}.catalog-stats>[title]{cursor:help}.catalog-post>.postMessage{margin:0;padding-bottom:.3em}.catalog-container:not(:hover)>*>.file,.catalog-container:not(:hover)>*>.postInfo>:not(.subject),.catalog-container:not(:hover)>*>.catalog-replies,.catalog-container:not(:hover) .extra-linebreak,.catalog-container:not(:hover) .abbr,:root:not(.catalog-hover-expand) .catalog-container>*>.file,:root:not(.catalog-hover-expand) .catalog-container>*>.postInfo>:not(.subject),:root:not(.catalog-hover-expand) .catalog-container>*>.catalog-replies,:root:not(.catalog-hover-expand) .catalog-container .extra-linebreak,:root:not(.catalog-hover-expand) .catalog-container .abbr,.catalog-thread>.catalog-container>:not(.catalog-post),.preview-summary,.catalog-post>.file>:not(.fileText),.catalog-post>*>.fileText>:not(:first-child),.catalog-post>.postInfo>:not(.subject):not(.nameBlock):not(.dateTime),.catalog-post>.postInfo>.nameBlock>.contact-links,.catalog-post>*>*>.posteruid,.catalog-post>*>*>.postJumper,:root.bottom-backlinks .catalog-post>.container,.post:not(.catalog-post)>.catalog-link,.post:not(.catalog-post)>.catalog-stats,.post:not(.catalog-post)>.catalog-replies{display:none}.catalog-post>.file{position:absolute;left:0;right:0;top:0;min-height:20px;background-color:inherit}.catalog-post>*>.fileText{position:relative;padding:2px;background-color:inherit}.catalog-small .catalog-post>* .fileText{font-size:10px}.catalog-post>*>.fileText:not(:hover){white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.catalog-post>*>.fileText:hover{z-index:1}.catalog-post>.postInfo.postInfo{width:auto}.catalog-post>*>.subject{display:block}.catalog-post>*>.dateTime{display:inline-block;font-style:italic}:root.catalog-hover-expand .catalog-container:hover>*>*>.nameBlock,:root.catalog-hover-expand .catalog-container:hover>*>*>.dateTime,:root.catalog-hover-expand .catalog-container:hover>*>.postMessage:not(:empty){padding-top:.3em}.catalog-post .extra-linebreak{content:\'\'; display:block;margin-top:.3em}.catalog-reply{text-align:left;white-space:nowrap;border-top:1px solid transparent;display:flex;flex-direction:row;align-items:stretch}.catalog-reply>*{padding:3px;overflow:hidden;flex:none}.catalog-reply>span{font-style:italic;font-weight:bold}.catalog-reply-excerpt{flex:1 1 auto}.catalog-post .prettyprinted{max-width:100%;box-sizing:border-box}.catalog-post .MathJax_Display{text-align:center !important}.catalog-container:not(:hover) .exif,:root:not(.catalog-hover-expand) .catalog-container .exif{display:none !important}.catalog-post>*>.exif{border-collapse:collapse}:root.catalog-hover-expand .catalog-container:hover .exif[style*="display: block;"]{display:inline-block !important}.catalog-post>*>.exif,.catalog-post>*>.exif>tbody{background-color:inherit}.catalog-post>*>.exif,.catalog-post>*>.exif td{min-width:0}.catalog-post>*>.exif td{padding-top:1px}:root.hats-enabled .catalog-thread::after{content:\'\';pointer-events:none;position:absolute;background-size:contain}:root.hats-enabled .catalog-small>.catalog-thread::after{left:-8px;top:-59px;width:96px;height:96px}:root.hats-enabled:not(.werkTyme) .catalog-small>.catalog-thread:not(.noFile)::after{left:calc(67px - .3px * var(--tn-w))}:root.hats-enabled .catalog-large>.catalog-thread::after{left:-15px;top:-98px;width:160px;height:160px}:root.hats-enabled:not(.werkTyme) .catalog-large>.catalog-thread:not(.noFile)::after{left:calc(110px - .5px * var(--tn-w))}textarea.copy-text-element{height:0;width:0;position:absolute;top:-10000px}:root.hide-announcement $site$psa{display:none}.hide-announcement-button{opacity:0.4;float:left}.unread-line{margin:0}.unread-line+br{display:none}.unread-mark-read{float:right;clear:both;width:100%;text-align:right}:not(.unread-thread)>.unread-mark-read{display:none}#updater{background:none;border:none;box-shadow:none}#updater>.move{position:absolute;top:-5px;bottom:-5px;left:-5px;right:-5px;z-index:-1}#updater>div:last-child{text-align:center}#updater input[type="number"]{width:4em}:root.float #updater{padding:0px 3px}:root:not(.float).shortcut-icons #updater{display:inline-block;min-width:12pt;text-align:right}.new{color:limegreen}#update-status:not(.empty)+#update-timer:not(.empty):not(.loading){margin-left:5px}#update-timer{cursor:pointer}#thread-watcher{position:absolute}#thread-watcher{padding-bottom:3px;padding-left:3px;white-space:nowrap;min-width:146px}#watched-threads{overflow-x:hidden;overflow-y:auto}#thread-watcher .refresh{padding:0px 3px}:root.fixed-watcher #thread-watcher{position:fixed}:root.fixed-watcher #watched-threads{max-height:calc(100vh - 75px)}:root:not(.fixed-watcher) #watched-threads:not(:hover){max-height:210px;overflow-y:hidden}#thread-watcher>.move{padding-top:3px}#watched-threads>div{padding-left:3px;padding-right:3px}#watched-threads .watcher-link{max-width:250px;display:inline-flex;flex-direction:row}#watched-threads .watcher-page,#watched-threads .watcher-unread{flex:0 0 auto;margin-right:2px}#watched-threads .watcher-title{overflow:hidden;text-overflow:ellipsis;flex:0 1 auto}#watched-threads .watcher-title:not(:first-child){margin-left:2px}.replies-quoting-you>a, #watcher-link.replies-quoting-you, .last-page>a>.watcher-page{color:#F00}#thread-watcher a{text-decoration:none}#thread-watcher .move>.close{position:absolute;right:0px;top:0px;padding:0px 4px}.watch-thread-link{width:18px;height:18px;background:none;border:none;padding:2px;opacity:0.2;filter:none;cursor:pointer;color:var(--xt-watcher, #000)}.watch-thread-link.watched{opacity:1}:root.oneechan .watch-thread-link>svg{display:none}#thread-stats{background:none;border:none;box-shadow:none}:root.float #thread-stats>.move>:not(#page-count){pointer-events:none}:root.float #thread-stats{padding:0px 3px}#page-count{cursor:pointer}.hashlink::before{content:\' \';visibility:hidden}.inline+.hashlink{display:none !important}:root.resurrect-quotes .deadlink{text-decoration:none !important}.catalog-post .qmark-ct{display:none}.backlink.deadlink:not(.forwardlink),.quotelink.deadlink:not(.forwardlink){text-decoration:underline !important}:root:not(.catalog-mode) .inlined{opacity:.5}#qp input, .forwarded{display:none}.quotelink.forwardlink,.backlink.forwardlink{text-decoration:none;border-bottom:1px dashed}.filtered{text-decoration:underline line-through}:root.hide-backlinks .backlink.filtered,:root.hide-backlinks .backlink.filtered+.hashlink.filtered{display:none}.postNum+.container::before{content:" "}:root.bottom-backlinks .container{display:block;clear:both;margin:0 4px}:root.bottom-backlinks .backlink{font-size:90%}.inline{border:1px solid;display:table;margin:2px 0}.container~.inline{margin-left:20px}:root.catalog-mode .inline{display:none}.inline .post{border:0 !important;background-color:transparent !important;display:table !important;margin:0 !important;padding:1px 2px !important}#qp>.opContainer::after{content:\'\';clear:both;display:table}#qp .post{border:none;margin:0;padding:2px 2px 5px}#qp img{max-height:80vh;max-width:50vw}#qp .preview-summary{display:block}.threadContainer{margin-left:20px;border-left:1px solid rgba(128,128,128,.3)}.threadOP{clear:both}.expanded-image>.post>.file>.fileThumb{display:flex;flex-direction:column}.fileText-original,.fnswitch:hover>.fntrunc,.fnswitch:not(:hover)>.fnfull,.expanded-image>.post>.file>.fileThumb>video[data-md5],.expanded-image>.post>.file>.fileThumb>img[data-md5]{display:none}.full-image[data-file-i-d]{display:none;cursor:pointer}.expanded-image>.post>.file>.fileThumb>.full-image{display:inline}.expanded-image>.post>.file>.fileThumb>audio{height:30px;width:100%;min-width:300px}.expanded-image{clear:left}.expanding{opacity:.5}:root.fit-height .full-image{max-height:100vh}:root.fit-height.fixed .full-image{max-height:calc(100vh - 35px)}:root.fit-width .full-image{max-width:100%}:root.ua-gecko.fit-width .full-image{width:100%}.fileThumb>.warning{clear:both}#ihover{pointer-events:none;max-height:calc(100vh - 25px);max-width:100vw}.webm-title>a::before{content:"title";text-decoration:underline}.webm-title.loading>a::after{content:"..."}.webm-title.error>a:hover::before,.webm-title.error>a:focus::before{content:"error";text-decoration:none}.webm-title>span{cursor:text}.webm-title.not-found>span::before{content:"not found"}.webm-title:not(:hover):not(:focus)>span,.webm-title:hover>span+a,.webm-title:focus>span+a{display:none}input[name="Default Volume"]{width:4em;height:1ex;vertical-align:middle;margin:0px}:root.fappeTyme $site$replyOriginal.noFile,:root.fappeTyme $site$replyOriginal.noFile+br{display:none}:root.werkTyme $site$thumbLink,:root.werkTyme $site$file$thumb,:root.werkTyme .catalog-thumb:not(.deleted-file):not(.no-file),:root:not(.werkTyme) .werkTyme-filename{display:none}.werkTyme-filename{font-weight:bold;font-size:110%}:root.werkTyme .catalog-link{box-shadow:0 0 5px rgba(0, 0, 0, .25);padding:8px;text-align:center}:root.werkTyme .catalog-thumb{box-shadow:none;padding:0;vertical-align:middle}.indicator{background:rgba(255,0,0,0.8);font-weight:bold;display:inline-block;min-width:9px;padding:0px 2px;margin:0 1px;text-align:center;color:white;border-radius:2px;cursor:pointer}:root:not(.fappeTyme) #shortcut-fappe,:root:not(.werkTyme) #shortcut-werk{display:none !important}#navlinks{font-size:16px;top:25px;right:10px}:root.catalog-mode #navlinks{display:none}:root.highlight-own .yourPost$site$highlightable$op::after,:root.highlight-you .quotesYou$site$highlightable$op::after,.filter-highlight$site$highlightable$op::after{content:"";display:block;clear:both}:root.reveal-spoilers $site$spoiler,:root.reveal-spoilers $site$spoiler>a{color:white !important}:root.reveal-spoilers .removed-spoiler::before{content:"[spoiler]"}:root.reveal-spoilers .removed-spoiler::after{content:"[/spoiler]"}.hide-thread-button,.hide-reply-button{float:left;margin-right:4px;padding:2px}$site$infoRoot a.hide-reply-button{margin-right:6px;padding:0}.replacedSideArrows{float:left}.hide-thread-button:not(:hover),.hide-reply-button:not(:hover){opacity:0.4}.threadContainer .hide-reply-button{margin-left:2px !important;position:relative;left:1px}.hide-thread-button{margin-top:-1px;width:11px}.stub~:not(.threadDivider){display:none !important}.stub input{display:inline-block}.stub .stub-icon,.stub-subject{margin-right:1ch}.stub-replies{margin-left:1ch}.stub-reasons::before{ content: \' (\'; }.stub-reasons::after{ content: \')\'; }.stub-reason:not(:last-of-type)::after{ content: \' & \'; }$site$thread[hidden]+hr{display:none}:root.reply-hide $site$sideArrows{display:none}:root.sw-yotsuba.thread-hide .party-hat{left:19px}:root.anonymize $site$info$name,:root.sw-yotsuba.anonymize .post-author:not([class*=capcode]){font-size:0}:root.anonymize $site$info$tripcode,:root.sw-yotsuba.anonymize .n-pu{display:none}:root.anonymize $site$info$name::before,:root.sw-yotsuba.anonymize .post-author:not([class*=capcode])::before{content:"Anonymous";font-size:10pt}:root.sw-yotsuba.anonymize .flashListing .name::before,:root.sw-yotsuba.anonymize .post-last>.post-author:not([class*=capcode])::before{font-size:9pt}:root.hide-original-post-form #togglePostFormLink,#qr.autohide:not(.focus):not(:hover):not(:active)>form,:root.thread-view #qr:not(.show-new-thread-option) select[data-name="thread"],#file-n-submit:not(.has-file) #qr-filerm{display:none}:root.hide-original-post-form #postForm{display:none !important}#qr select,#qr-filename-container>a,.remove{cursor:pointer}#qr{position:fixed;padding:1px;border:1px solid transparent;min-width:300px;border-radius:3px 3px 0 0}#qr>form{max-height:calc(100vh - 75px);overflow-y:auto;overflow-x:hidden}#qrtab{border-radius:3px 3px 0 0}#qrtab{margin-bottom:1px}#qr .close{float:right;padding:0 3px}.qr-link-container{text-align:center;margin:16px 0}.qr-link-container-bottom{width:200px;position:absolute;left:-100px;margin-left:50%;text-align:center}.qr-link{border-radius:3px;padding:6px 10px 5px;font-weight:bold;vertical-align:middle;border-style:solid;border-width:1px;font-size:10pt}.qr-link-container+#togglePostFormLink{font-size:10pt;font-weight:normal;margin:-8px 0 3.5px}.persona{width:100%;display:flex;flex-direction:row}.persona .field{flex:1;width:0}#qr.forced-anon input[data-name="name"]:not(.force-show),#qr.forced-anon input[data-name="sub"]:not(.force-show),#qr.reply-to-thread input[data-name="sub"]:not(.force-show),body:not(.board_f) #qr select[name="filetag"],#qr.reply-to-thread select[name="filetag"],#qr:not(.has-sjis) #sjis-toggle,#qr:not(.has-math) #tex-preview-button,#qr.tex-preview .textarea>:not(#tex-preview),#qr:not(.tex-preview) #tex-preview{display:none}.persona button{flex:0 0 23px;align-self:stretch;border:1px solid #BBB;padding:0;background:linear-gradient(to bottom, #F8F8F8, #DCDCDC) no-repeat;color:#000}#qr.sjis-preview #sjis-toggle, #qr.tex-preview #tex-preview-button{background:#DCDCDC}#sjis-toggle, #qr.sjis-preview textarea.field{font-family:"IPAMonaPGothic","Mona","MS PGothic",monospace;font-size:16px;line-height:17px}#tex-preview-button{font-size:10px}#tex-preview{white-space:pre-line}#qr textarea.field{height:14.8em;min-height:9em}#qr.has-captcha textarea.field{height:9em}input.field.tripped:not(:hover):not(:focus){color:transparent !important;text-shadow:none !important}#qr textarea{min-width:300px;resize:both}.field{box-sizing:border-box;margin:0px;padding:2px 4px 3px}#qr label input[type="checkbox"]{position:relative;top:2px}#qr .captcha-root{position:relative}#qr .captcha-container>div{margin:auto;width:304px}:root.ua-blink #qr .captcha-container>div,:root.ua-edge #qr .captcha-container>div{overflow:hidden}:root.ua-blink #qr .captcha-container>div>div:first-of-type,:root.ua-edge #qr .captcha-container>div>div:first-of-type{overflow-y:scroll;overflow-x:hidden;padding-right:30px;height:99%;width:100%}#qr .captcha-counter{display:block;width:100%;text-align:center;pointer-events:none}#qr.captcha-open .captcha-counter{position:absolute;bottom:3px}#qr .captcha-counter>a{pointer-events:auto;display:inline-block; }#qr:not(.captcha-open) .captcha-counter>a{display:block;width:100%}#qr.captcha-v2 #qr-captcha-iframe{width:302px;height:423px;border:0;display:block;margin:auto}.goog-bubble-content{max-width:100vw;max-height:100vh;overflow:auto}.goog-bubble-content iframe{position:static !important}#overlay.media-preview{display:flex;overflow:auto;align-items:center}#overlay.media-preview video, #overlay.media-preview img{margin:auto}#overlay.media-preview video{max-height:100%;max-width:100%}#file-n-submit, #qr .oekaki{display:flex;align-items:stretch;margin-top:1px}#file-n-submit>input, #qr-draw-button{background:linear-gradient(to bottom, #F8F8F8, #DCDCDC) no-repeat;border:1px solid #BBB;border-radius:2px;height:100%}#qr-file-button, #qr-draw-button{width:15%}#file-n-submit input[type="submit"]{width:25%}#qr-filename-container{flex:1 1 auto;width:0;display:flex;align-items:center;position:relative;padding:1px}input#qr-filename{border:none !important;background:none !important;outline:none}#qr-filename,.has-file #qr-no-file{display:none}#qr-no-file,.has-file #qr-filename{flex:1 1 auto;width:0px; display:inline-block;padding:0;padding-left:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#qr-no-file{color:#AAA}#qr .oekaki.has-file{height:25px}#qr .oekaki.has-file{display:none}#qr .oekaki>label{flex:1 1 auto;width:0;display:flex;align-items:center;height:100%}#qr .oekaki>label>span{margin:0 3px}#qr .oekaki>label>input{flex:1 1 auto;width:0;height:100%}#qr .oekaki-bg{position:relative;display:inline-block;height:100%;width:10%;margin-left:3px}#qr .oekaki-bg>*{position:absolute;top:0;left:0;margin:0}#qr .oekaki-bg>:not([name="oekaki-bgcolor"]){z-index:1}#qr [name="oekaki-bgcolor"]{height:100%;width:100%;border:none;padding:0}#qr [name="oekaki-bg"]:not(:checked)~[name="oekaki-bgcolor"]{visibility:hidden}#qr input[type="file"]{visibility:hidden;position:absolute}#qr-filename-container>label, #qr-filename-container>a{flex:none;margin:0;margin-right:3px}#qr:not(.has-spoiler) #qr-spoiler-label,#file-n-submit:not(.has-file) #qr-spoiler-label,#file-n-submit:not(.has-file) #qr-randomize,#file-n-submit:not(.has-image) #qr-jpg,#file-n-submit:not(.has-image):not(.has-video) #qr-view,#file-n-submit:not(.has-file) #qr-restore-name,.has-file #paste-area,.has-file #url-button,#file-n-submit:not(.custom-cooldown) #custom-cooldown-button{display:none}#qr-filename-container>label{position:relative}#qr-filename-container input[type="checkbox"]{margin:0}.checkbox-letter{font-size:13px;font-weight:bold}#qr-filename-container label:not(:hover)>input[type="checkbox"]:not(:focus):not(:checked),#qr-filename-container label:not(:hover)>input[type="checkbox"]:not(:focus):not(:checked)~:not(.checkbox-letter),#qr-filename-container label:hover>.checkbox-letter,input[type="checkbox"]:focus~.checkbox-letter,input[type="checkbox"]:checked~.checkbox-letter{position:absolute;opacity:0;pointer-events:none}.checkbox-letter, #paste-area, #url-button, #custom-cooldown-button, #dump-button, #split-post{opacity:0.6}#paste-area{font-size:0}#paste-area:focus{opacity:1}#custom-cooldown-button.disabled{opacity:0.27}#qr select{background:white;border:1px solid #CCC}#qr select[data-name="thread"]{float:right}#qr>form>select{margin-top:1px}.dump #dump-list-container{display:block}#dump-list-container{display:none;position:relative;overflow-y:hidden;margin-top:1px}#dump-list{overflow-x:auto;overflow-y:auto;white-space:nowrap;width:248px;max-height:248px;min-height:90px;max-width:100%;min-width:100%;display:flex;flex-wrap:wrap}#dump-list:hover{overflow-x:auto}.qr-preview{box-sizing:border-box;counter-increment:thumbnails;cursor:move;display:inline-block;height:90px;width:90px;padding:2px;opacity:.5;overflow:hidden;position:relative;text-shadow:0 0 2px #000;transition:opacity .25s ease-in-out, transform .25s ease-in-out;vertical-align:top;background-size:cover;flex:none}.qr-preview:hover,.qr-preview:focus{opacity:.9}.qr-preview::before{content:counter(thumbnails);color:#fff;position:absolute;top:3px;right:3px;text-shadow:0 0 3px #000, 0 0 8px #000}.qr-preview#selected{opacity:1}.qr-preview.drag{box-shadow:0 0 10px rgba(0,0,0,.5);transform:scale(.8)}.qr-preview.over{border-color:#fff;transform:scale(1.1);opacity:0.9;z-index:10}.qr-preview>span{color:#fff}.remove{background:none;color:#e00;padding:1px}a:only-of-type>.remove{display:none}.remove:hover::after{content:" Remove"}.qr-preview:not(.has-file) label,#qr:not(.has-spoiler) .qr-preview-spoiler{display:none}.qr-preview>label{background:rgba(0,0,0,.5);color:#fff;right:0;bottom:0;left:0;position:absolute;text-align:center}.qr-preview>label>input{margin:0}#add-post{cursor:pointer;font-size:2em;position:absolute;bottom:20px;right:10px;transform:translateY(-50%)}.textarea{position:relative;display:flex}#char-count{color:#000;background:hsla(0, 0%, 100%, .5);font-size:8pt;position:absolute;bottom:1px;right:1px;pointer-events:none}#char-count.warning{color:red}#file-n-submit{display:flex;flex-direction:column}#file-n-submit .row{display:flex;flex-direction:row}#file-n-submit .row.space{justify-content:space-between}#file-n-submit a{display:flex;flex-direction:column;justify-content:center;padding:1px 3px 0 3px}.menu-button{display:inline-block;position:relative;cursor:pointer}#header-bar .menu-button i{border-top:6px solid;border-right:4px solid transparent;border-left:4px solid transparent;display:inline-block;margin:2px;vertical-align:middle}.postInfo>.menu-button{margin:0 5px}#menu{position:fixed;outline:none;font-weight:normal}#menu, .submenu{border-radius:3px;padding-top:1px;padding-bottom:3px}.entry{cursor:pointer;display:block;outline:none;padding:2px 10px;position:relative;text-decoration:none;white-space:nowrap;min-width:70px;text-align:left;text-shadow:none;font-size:10pt}.left>.entry.has-submenu{padding-right:17px !important}.entry input[type="checkbox"],.entry input[type="radio"]{margin:0px;position:relative;top:2px}.entry input[type="number"]{width:4.5em}.entry.has-shortcut-text{display:flex;justify-content:space-between;align-items:center}.entry .shortcut-text{opacity:0.5;font-size:70%;margin-left:5px}.has-submenu::after{content:"";border-left:.5em solid;border-top:.3em solid transparent;border-bottom:.3em solid transparent;display:inline-block;margin:.3em;position:absolute;right:3px}.left .has-submenu::after{border-left:0;border-right:.5em solid}.submenu{display:none;position:absolute;left:100%;top:-1px;margin-left:0px;margin-top:-2px}.focused>.submenu{display:block}.imp-exp-result{position:absolute;text-align:center;margin:auto;right:0px;left:0px;width:200px}.boardTitle, .boardSubtitle{white-space:pre-line}.boardTitle[contenteditable="true"],.boardSubtitle[contenteditable="true"]{cursor:text !important}.embedder:not(.embedded)>span{display:none}#embedding{padding:1px 4px 1px 4px;position:fixed}#embedding.empty{display:none}#embedding>div:first-child{display:flex}#embedding .move{flex:1}#embedding .jump{margin:-1px 4px;text-decoration:none}#a-gallery{position:fixed;top:0;bottom:0;left:0;right:0;display:flex;flex-direction:row;background:rgba(0,0,0,0.7)}.gal-viewport{display:flex;align-items:stretch;flex-direction:row;flex:1 1 auto;overflow:hidden}.gal-thumbnails{flex:0 0 150px;overflow-y:auto;display:flex;flex-direction:column;align-items:stretch;text-align:center;background:rgba(0,0,0,.5);border-left:1px solid #222}.gal-hide-thumbnails .gal-thumbnails{display:none}.gal-thumb img,.gal-thumb video{max-width:125px;max-height:125px;height:auto;width:auto}.gal-thumb{flex:0 0 auto;padding:3px;line-height:0;transition:background .2s linear}.gal-highlight{background:rgba(0, 190, 255,.8)}.gal-prev{border-right:1px solid #222}.gal-next{border-left:1px solid #222}.gal-prev,.gal-next{flex:0 0 20px;position:relative;cursor:pointer;opacity:0.7;background-color:rgba(0, 0, 0, 0.3)}.gal-prev:hover,.gal-next:hover{opacity:1}.gal-prev::after,.gal-next::after{position:absolute;top:48.6%;transform:translateY(-50%);display:inline-block;border-top:11px solid transparent;border-bottom:11px solid transparent;content:""}.gal-prev::after{border-right:12px solid #fff;right:5px}.gal-next::after{border-left:12px solid #fff;right:3px}.gal-image{flex:1 0 auto;display:flex;align-items:flex-start;justify-content:space-around;overflow:hidden;width:1%}:root:not(.gal-fit-height):not(.gal-pdf) .gal-image{overflow-y:scroll !important}:root:not(.gal-fit-width):not(.gal-pdf) .gal-image{overflow-x:scroll !important}.gal-image a{display:flex;align-items:flex-start;margin:auto;line-height:0;max-width:100%}:root.gal-pdf .gal-image a{width:100%;height:100%}.gal-image img,.gal-image video{flex:none}.gal-fit-width .gal-image img,.gal-fit-width .gal-image video{max-width:100%}.gal-fit-height .gal-image img,.gal-fit-height .gal-image video{max-height:calc(100vh - 25px)}.gal-image iframe{width:100%;height:100%}.gal-buttons{font-size:2em;margin-right:3px;padding-left:7px;padding-right:7px;top:5px}:root.gal-pdf .gal-buttons{top:40px;background:rgba(0,0,0,0.6) !important;border-radius:3px}.gal-buttons a{color:#ffffff;text-shadow:0px 0px 1px #000000}.gal-buttons i{display:inline-block;margin:2px;position:relative}.gal-start i{border-left:10px solid;border-top:6px solid transparent;border-bottom:6px solid transparent;bottom:1px}.gal-stop i{border:5px solid;bottom:2px}.gal-buttons.gal-playing>.gal-start,.gal-buttons:not(.gal-playing)>.gal-stop{display:none}.gal-buttons .menu-button i{border-top:10px solid;border-right:6px solid transparent;border-left:6px solid transparent;bottom:2px;vertical-align:baseline}.gal-labels{position:fixed;bottom:6px;display:flex;flex-direction:column;align-items:flex-end}:root:not(.show-sauce) .gal-sauce{display:none}.gal-name,.gal-count,.gal-sauce{background:rgba(0,0,0,0.6) !important;border-radius:3px;padding:1px 5px 2px 5px;margin-top:3px;color:#ffffff !important;text-decoration:none !important}.gal-sauce a{color:#ffffff !important}.gal-name:hover,.gal-buttons a:hover,.gal-sauce a:hover{color:rgb(95, 95, 101) !important}:root.gal-pdf .gal-buttons a:hover{color:rgb(204, 204, 204) !important}.gal-buttons,.gal-labels{position:fixed;right:195px}.gal-hide-thumbnails .gal-buttons,.gal-hide-thumbnails .gal-labels{right:44px}:root:not(.gal-fit-width):not(.gal-pdf) .gal-labels{bottom:23px !important}:root.gal-fit-height:not(.gal-pdf):not(.gal-hide-thumbnails) .gal-buttons,:root.gal-fit-height:not(.gal-pdf):not(.gal-hide-thumbnails) .gal-labels{right:178px !important}:root.gal-hide-thumbnails.gal-fit-height:not(.gal-pdf) .gal-buttons,:root.gal-hide-thumbnails.gal-fit-height:not(.gal-pdf) .gal-labels{right:28px !important}:root.gallery-open.fixed #header-bar:not(.autohide){visibility:hidden}.contact-links{margin-left:2px}.move-note>a{text-decoration:underline}.invisible{font-size:0}.postJumper>.prev,.postJumper>.next{font-size:120%}.fcx-announcement{text-align:center}.fcx-announcement a{text-decoration:underline}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.spin>.icon{animation:spin 2s infinite linear}div.post{overflow:auto;scroll-margin-top:30px}.file svg.icon{height:12px}.dialog{background-color:var(--xt-background);border-color:var(--xt-border)}.field:focus,.field.focus{border-color:var(--xt-border-field-focus)}:root:not(.oneechan).highlight-you .quotesYou$site$highlightable$reply{border-left:3px solid var(--xt-border-highlight) !important}:root:not(.oneechan).highlight-own .yourPost$site$highlightable$reply{border-left:3px dashed var(--xt-border-highlight) !important}#header-bar.dialog{background-color:var(--xt-header-dialog-bg)}:root:not(.fixed) #header-bar, #notifications{font-size:var(--xt-notification-size, 9pt)}#header-bar, #notifications{color:var(--xt-header-dialog-fg)}#board-list a, #shortcuts a{color:var(--xt-header-link, unset)}#fourchanx-settings fieldset, .section-main div::before{border-color:var(--xt-border)}.suboption-list>div:last-of-type{background-color:var(--xt-background)}:root.catalog-hover-expand .catalog-container:hover>.post{background-color:var(--xt-background)}:root.werkTyme .catalog-thread:not(:hover),:root.werkTyme:not(.catalog-hover-expand) .catalog-thread,:root.catalog-hover-expand .catalog-container:hover>.post,:root.catalog-hover-expand .catalog-container:hover .catalog-reply{border-color:var(--xt-border)}.backlink.deadlink{color:var(--xt-dead-link) !important}.inline{border-color:var(--xt-border);background-color:var(--xt-inline, rgba(255, 255, 255, .14))}.indicator{color:var(--xt-background)}#dump-list::-webkit-scrollbar-thumb{background-color:var(--xt-background);border-color:var(--xt-border)}.qr-preview{background-color:var(--xt-qr-preview-bg, rgba(0, 0, 0, .15))}.qr-link{border-color:var(--xt-qr-link-border);background:var(--xt-qr-bg)}.qr-link:hover{background:var(--xt-link-hover-bg, var(--xt-background))}#menu{color:var(--xt-menu-fg, var(--xt-header-link))}.entry{font-size:var(--xt-entry-size, 10pt)}.focused.entry{background:var(--xt-entry-focus-bg)}.unread-mark-read{background-color:var(--xt-unread)}.replies-quoting-you>a, #watcher-link.replies-quoting-you, .last-page>a>.watcher-page{color:var(--xt-watcher-quoting-you, #F00) !important}.qphl{outline:2px solid var(--xt-qphl, rgba(216, 94, 49, .8))}:root.highlight-you .quotesYou$site$highlightable$op,:root.highlight-you .quotesYou$site$highlightable$reply{border-left:3px solid var(--xt-border-highlight)}:root.highlight-own .yourPost$site$highlightable$op,:root.highlight-own .yourPost$site$highlightable$reply{border-left:3px dashed var(--xt-border-highlight) }.filter-highlight$site$highlightable$op,.filter-highlight$site$highlightable$reply{box-shadow:inset 5px 0 var(--xt-filter-highlight, rgba(221, 0, 0, .5))}:root.highlight-own .yourPost>$site$sideArrows,:root.highlight-you .quotesYou>$site$sideArrows,.filter-highlight>$site$sideArrows{color:var(--xt-highlight-side-arrow, rgba(221, 0, 0, .8))}:root:not(.werkTyme) .catalog-thread.filter-highlight .catalog-thumb,:root.werkTyme .catalog-thread.filter-highlight:not(:hover),:root.werkTyme:not(.catalog-hover-expand) .catalog-thread.filter-highlight,:root.werkTyme.catalog-hover-expand .catalog-thread.filter-highlight>.catalog-container:hover>.catalog-post,:root.catalog $site$catalog$thread.filter-highlight$site$highlightable$catalog{box-shadow:0 0 3px 3px var(--xt-highlight-shadow, rgba(255, 0, 0, .5))}:root:not(.werkTyme) .catalog-thread.watched .catalog-thumb,:root:root.werkTyme .catalog-thread.watched:not(:hover),:root:root.werkTyme:not(.catalog-hover-expand) .catalog-thread.watched,:root.werkTyme.catalog-hover-expand .catalog-thread.watched>.catalog-container:hover>.catalog-post{border:2px solid var(--xt-watched-border, rgba(255, 0, 0, .75))}.unread-line{border-color:var(--xt-unread-line, rgb(255,0,0))}:root.tomorrow,:root.spooky{color-scheme:dark}:root.tomorrow #file-n-submit>input,:root.tomorrow #qr-draw-buton,:root.spooky #file-n-submit>input,:root.spooky #qr-draw-buton{background-image:none}:root.tomorrow .field,:root.spooly .field{background-color:unset;color:unset;border-color:unset}:root.yotsuba{--xt-background:#F0E0D6;--xt-border:#D9BFB7;--xt-border-field-focus:#EA8;--xt-border-highlight:rgba(221, 0, 0, .8);--xt-header-dialog-bg:rgba(240,224,214,0.98);--xt-header-dialog-fg:#B86;--xt-header-link:#800000;--xt-dead-link:#00E;--xt-qr-link-border:rgb(225, 209, 199) rgb(225, 209, 199) rgb(210, 194, 184);--xt-qr-bg:linear-gradient(#FFEFE5, #F0E0D6) repeat scroll 0% 0% transparent;--xt-entry-focus-bg:rgba(255, 255, 255, .33);--xt-unread:rgba(240, 224, 214, 0.5);--xt-watcher:#800000;--xt-fxt-fg:#800000}:root.yotsuba-b{--xt-background:#D6DAF0;--xt-link-hover-bg:#D9DDF3;--xt-border:#B7C5D9;--xt-border-field-focus:#98E;--xt-border-highlight:rgba(221, 0, 0, .8);--xt-header-dialog-bg:rgba(214,218,240,0.98);--xt-header-dialog-fg:#89A;--xt-header-link:#34345C;--xt-dead-link:#34345C;--xt-qr-link-border:rgb(199, 203, 225) rgb(199, 203, 225) rgb(184, 188, 210);--xt-qr-bg:linear-gradient(#E5E9FF, #D6DAF0) repeat scroll 0% 0% transparent;--xt-menu-fg:#000;--xt-entry-focus-bg:rgba(255, 255, 255, .33);--xt-unread:rgba(214, 218, 240, 0.5)}:root.futaba{--xt-background:#F0E0D6;--xt-border:#D9BFB7;--xt-border-field-focus:#EA8;--xt-border-highlight:rgba(240, 224, 214, 0.98);--xt-notification-size:11pt;--xt-header-dialog-fg:#B86;--xt-dead-link:#00E;--xt-header-dialog-bg:rgba(240,224,214,0.98);--xt-header-link:#800000;--xt-qr-link-border:rgb(225, 209, 199) rgb(225, 209, 199) rgb(210, 194, 184);--xt-qr-bg:linear-gradient(#FFEFE5, #F0E0D6) repeat scroll 0% 0% transparent;--xt-entry-size:12pt;--xt-entry-focus-bg:rgba(255, 255, 255, .33);--xt-unread:rgba(240, 224, 214, 0.5);--xt-watcher:#800000;--xt-fxt-fg:#800000}:root.futaba.anonymize $site$info$name::before{font-size:12pt}:root.burichan{--xt-background:#D6DAF0;--xt-border:#B7C5D9;--xt-border-field-focus:#98E;--xt-border-highlight:3px dashed rgba(221, 0, 0, .8);--xt-header-dialog-bg:rgba(214, 218, 240, 0.98);--xt-notification-size:11pt;--xt-header-dialog-fg:#89A;--xt-header-link:#34345C;--xt-dead-link:#34345C;--xt-qr-link-border:rgb(199, 203, 225) rgb(199, 203, 225) rgb(184, 188, 210);--xt-qr-bg:linear-gradient(#E5E9FF, #D6DAF0) repeat scroll 0% 0% transparent;--xt-menu-fg:#000;--xt-entry-size:12pt;--xt-entry-focus-bg:rgba(255, 255, 255, .33);--xt-link-hover-bg:#D9DDF3;--xt-unread:rgba(214, 218, 240, 0.5)}:root.burichan.anonymize $site$info$name::before{font-size:12pt}:root.tomorrow{--xt-background:#282A2E;--xt-border:#111;--xt-border-field-focus:rgb(129, 162, 190);--xt-border-highlight:rgba(145, 182, 214, .8);--xt-header-dialog-bg:rgba(40,42,46,0.9);--xt-header-dialog-fg:#C5C8C6;--xt-header-link:#81A2BE;--xt-dead-link:#81A2BE;--xt-inline:rgba(0, 0, 0, .14);--xt-qr-preview-bg:rgba(255, 255, 255, .15);--xt-qr-link-border:rgb(25, 27, 31) rgb(25, 27, 31) rgb(10, 12, 16);--xt-qr-bg:linear-gradient(#37393D, #282A2E) repeat scroll 0% 0% transparent;--xt-menu-fg:#C5C8C6;--xt-entry-focus-bg:rgba(0, 0, 0, .33);--xt-unread:rgba(40, 42, 46, 0.5);--xt-watcher:#c5c8c6;--xt-unread-line:rgb(197, 200, 198);--xt-filter-highlight:rgba(145, 182, 214, .5);--xt-highlight-shadow:rgba(64, 192, 255, .7);--xt-watched-border:rgb(64, 192, 255);--xt-qphl:rgba(145, 182, 214, .8);--xt-highlight-side-arrow:rgb(155, 185, 210);--xt-fxt-fg:#c5c8c6}:root.tomorrow #arc-list span.quote{color:#B5BD68}:root.tomorrow #header-bar a, :root.tomorrow #notifications a{color:#81A2BE}:root.tomorrow.shortcut-icons .native-settings{background-image:url(\'//s.4cdn.org/image/favicon-ws.ico\')}:root.tomorrow #qr .field{background-color:rgb(26, 27, 29);color:rgb(197,200,198);border-color:rgb(40, 41, 42)}:root.tomorrow #qr .field:focus,:root.tomorrow #qr .field.focus{border-color:var(--xt-border-field-focus) !important;background-color:rgb(30,32,36)}:root.tomorrow .persona button{background:linear-gradient(to bottom, #2E3035, #222427) no-repeat;color:rgb(197,200,198);border-color:rgb(40, 41, 42);outline:none}:root.tomorrow .persona button::-moz-focus-inner{border:none}:root.tomorrow .persona button:focus{border-color:rgb(129, 162, 190)}:root.tomorrow #qr.sjis-preview #sjis-toggle,:root.tomorrow #qr.tex-preview #tex-preview-button{background:rgb(26, 27, 29)}:root.tomorrow #qr select,:root.tomorrow #file-n-submit>input,:root.tomorrow #qr-draw-button{border-color:rgb(40, 41, 42);background:unset}:root.tomorrow #qr select>option{background-color:var(--xt-background)}:root.tomorrow #qr-filename{color:rgb(197,200,198)}:root.photon{--xt-background:#DDD;--xt-border:#CCC;--xt-border-field-focus:#EA8;--xt-border-highlight:rgba(221, 0, 0, .8);--xt-header-dialog-bg:rgba(221, 221, 221, 0.98);--xt-header-dialog-fg:#333;--xt-dead-link:#F60;--xt-qr-link-border:rgb(206, 206, 206) rgb(206, 206, 206) rgb(191, 191, 191);--xt-qr-bg:linear-gradient(#ECECEC, #DDD) repeat scroll 0% 0% transparent;--xt-menu-fg:#333;--xt-entry-focus-bg:rgba(255, 255, 255, .33);--xt-unread:rgba(221, 221, 221, 0.5);--xt-watcher-quoting-you:#00F;--xt-watcher:#333;--xt-fxt-fg:#333}:root.photon #arc-list tr:nth-of-type(odd) span.quote{color:#C0E17A}:root.spooky{--xt-background:#171526;--xt-link-hover-bg:#1A1829;--xt-border:#707070;--xt-border-field-focus:#98E;--xt-border-highlight:rgba(145, 182, 214, .8);--xt-header-dialog-bg:rgba(23, 21, 38, 0.98);--xt-header-dialog-fg:#C49756;--xt-header-link:#FE9600;--xt-dead-link:#FE9600;--xt-qr-link-border:rgb(8, 6, 23) rgb(8, 6, 23) rgb(0, 0, 8);--xt-qr-bg:linear-gradient(#262435, #171526) repeat scroll 0% 0% transparent;--xt-entry-focus-bg:rgba(255, 255, 255, .33);--xt-unread:rgba(23, 21, 38, 0.5);--xt-watcher:#fe9600;--xt-unread-line:rgb(197, 200, 198);--xt-filter-highlight:rgba(145, 182, 214, .5);--xt-qphl:rgba(145, 182, 214, .8);--xt-highlight-side-arrow:rgb(155, 185, 210);--xt-fxt-fg:#f0f8ffd1}:root.spooky #arc-list span.quote{color:#634C2C}:root.spooky.shortcut-icons .native-settings{background-image:url(\'//s.4cdn.org/image/favicon-ws.ico\')}:root.spooky #qr .field{background-color:rgb(26, 27, 29);color:rgb(197,200,198);border-color:rgb(40, 41, 42)}:root.spooky #qr .field:focus,:root.spooky #qr .field.focus{border-color:rgb(254, 150, 0) !important;background-color:rgb(30,32,36)}:root.spooky .persona button{background:linear-gradient(to bottom, #2E3035, #222427) no-repeat;color:rgb(197,200,198);border-color:rgb(40, 41, 42);outline:none}:root.spooky .persona button::-moz-focus-inner{border:none}:root.spooky .persona button:focus{border-color:rgb(254, 150, 0)}:root.spooky #qr.sjis-preview #sjis-toggle,:root.spooky #qr.tex-preview #tex-preview-button{background:rgb(26, 27, 29)}:root.spooky #qr select,:root.spooky #file-n-submit>input,:root.spooky #qr-draw-button{border-color:rgb(40, 41, 42);background:unset}:root.spooky #qr-filename{color:rgb(197,200,198)}:root.spooky .unread-line{visibility:visible;opacity:1}svg.icon{height:14px;position:static;width:auto}:root.shortcut-icons #shortcuts .shortcut{padding-top:0;padding-bottom:0;display:flex;height:14px;min-width:16px}:root.shortcut-icons #shortcuts .icon--alt-text,:root:not(.shortcut-icons) .shortcut svg{display:none}:root.shortcut-icons .shortcut.brackets-wrap::before,:root.shortcut-icons .shortcut.brackets-wrap::after{display:none}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}:root{--xt-fxt-bg:var(--xt-background);--xt-fxt-border:var(--xt-border)}.fxt-card{color:var(--xt-fxt-fg, #000);background-color:var(--xt-fxt-bg, #000);padding:16px;border:1px solid var(--xt-fxt-border);border-radius:12px;width:400px;display:flex;flex-direction:column;gap:8px;white-space:pre-line;word-break:break-word}.fxt-meta{display:flex;flex-direction:row;gap:8px}.fxt-meta_profile{display:flex;flex-direction:row;gap:8px}.fxt-meta_profile img{height:48px;width:48px;aspect-ratio:1;border-radius:100%;overflow:hidden}.fxt-meta_author{display:flex;flex-direction:column}.fxt-meta_author_username{font-weight:bold}.fxt-stats_meta{padding-top:8px;display:flex;flex-direction:row;justify-content:space-evenly;gap:8px}.fxt-stats_meta span{display:inline-flex;align-items:center;gap:4px}.fxt-poll{display:flex;flex-direction:column;gap:4px}.fxt-choice{position:relative;display:flex;align-items:center;justify-content:space-between;font-size:75%;height:24px}.fxt-choice.highlight{font-weight:bold}.fxt-choice_label{margin-left:6px;z-index:1}.fxt-choice_percentage{margin-right:6px;z-index:1}.fxt-choice .bar{position:absolute;top:0;left:0;height:24px;border-radius:4px;background-color:currentColor;opacity:.3;z-index:0}.fxt-total-votes{font-size:75%;opacity:.5}.fxt-media{width:100%;height:100%;border-radius:4px;overflow:hidden}.fxt-media :is(img, video){display:block;max-width:100%;height:100%;object-fit:contain;object-position:center}.fxt-media_container{display:grid;gap:0;grid-template-columns:1fr}.fxt-media_container.fxt-media-multiple{gap:4px;grid-template-columns:1fr 1fr}.fxt-quote{border:1px solid var(--xt-fxt-border);border-radius:12px;overflow:hidden}.fxt-quote .fxt-meta_profile img{height:24px;width:24px}.fxt-quote .fxt-meta{display:flex;flex-direction:row;align-items:center;gap:8px;padding:4px}'+(B=[{ +innerHTML:a,[y]:!0}}const D=" | ",E=C("div",{id:"fourchanx-settings",class:"dialog"},C("nav",null,C("div",{class:"sections-list"}),C("p",{class:"imp-exp-result warning"}),C("div",{class:"credits"},C("a",{class:"export"},"Export"),D,C("a",{class:"import"},"Import"),D,C("a",{class:"reset"},"Reset Settings"),D,C("input",{type:"file",hidden:!0,accept:".json,application/json"}),C("a",{href:o.page,target:"_blank"},o.name),D,C("a",{href:o.changelog,target:"_blank"},i.VERSION),D,C("a",{href:o.issues,target:"_blank"},"Issues"),D,C("a",{href:"javascript:;",class:"close",title:"Close"},"✕"))),C("div",{class:"section-container"},C("section",null)));const S=(e,t=s.body)=>Array.from(t.querySelectorAll(e));var T={init(){if((this.useFaster=/\S/.test(a.fourchanImageHost))&&"yotsuba"===i.SITE.software&&["index","thread"].includes(i.VIEW))return c.Post.push({name:"Image Host Rewriting",cb:this.node})},suggestions:["i.4cdn.org","is2.4chan.org"],host:()=>a.fourchanImageHost.trim()||"i.4cdn.org", +flashHost:()=>"i.4cdn.org",thumbHost:()=>"i.4cdn.org",test:e=>"i.4cdn.org"===e||T.regex.test(e),regex:/^is\d*\.4chan(?:nel)?\.org$/,node(){if(this.isClone)return;const e=T.host();return this.file&&T.test(this.file.url.split("/")[2])&&!/\.swf$/.test(this.file.url)&&(this.file.link.hostname=e,this.file.thumbLink&&(this.file.thumbLink.hostname=e),this.file.url=this.file.link.href),T.fixLinks(S("a",this.nodes.comment))},fixLinks(e){for(var t of e)if(T.test(t.hostname)&&!/\.swf$/.test(t.pathname)){var o=T.host();t.hostname!==o&&(t.hostname=o)}}};const R={ +boards:'.dialog{border:1px solid;display:block;background-color:inherit}.dialog:not(#qr):not(#thread-watcher):not(#header-bar){box-shadow:0 1px 2px rgba(0, 0, 0, .15)}#qr,#thread-watcher{box-shadow:-1px 2px 2px rgba(0, 0, 0, 0.25)}.field{background-color:#FFF;border:1px solid #CCC;box-sizing:border-box;color:#333;font:13px sans-serif;outline:none;transition:color .25s, border-color .25s}.field::placeholder{color:#AAA;opacity:1}.field:hover{border-color:#999}.field:hover, .field:focus, .field.focus{color:#000}.field[disabled]{background-color:#F2F2F2;color:#888}.move{cursor:move;overflow:hidden}label{cursor:pointer}a[href="javascript:;"]{text-decoration:none}.warning{color:red}:root.sw-yotsuba #boardNavDesktop, :root.sw-yotsuba #boardNavMobile{display:none !important}:root.hide-bottom-board-list $site$boardListBottom{display:none}body.hasDropDownNav{margin-top:5px}:root:not(.keyboard-focus) a{outline:none}.painted{border-radius:3px;padding:0px 2px}[hidden]{display:none !important}:root.sw-yotsuba .opContainer, :root.sw-yotsuba .op{display:block;overflow:visible}:root.sw-yotsuba .reply>.file>.fileText{margin:0 20px}:root.sw-yotsuba #arc-list span.quote{color:#789922}:root.sw-yotsuba .fileText a{unicode-bidi:isolate}:root.sw-yotsuba #g-recaptcha{min-height:78px;height:auto}:root.sw-yotsuba:not(.js-enabled) #postForm{display:table}:root.sw-yotsuba #captchaContainerAlt td:nth-child(2){display:table-cell !important}:root.sw-yotsuba canvas#tegaki-canvas{background:none}:root.sw-yotsuba>body>div:last-of-type{transition:none !important}:root.sw-yotsuba>body>div[style*=" top: -10000px;"]{visibility:hidden !important}:root.sw-yotsuba .post>.file{word-break:break-word}:root.sw-yotsuba:not(.ua-webkit):not(.ua-blink) .fileText{word-wrap:break-word;max-width:calc(100vw - 90px)}:root.sw-yotsuba>body.is_catalog .thread>a>img{display:inline-block}:root.sw-yotsuba .nwsb{display:inline}:root.sw-yotsuba .fileText{max-width:auto;white-space:normal}:root.sw-yotsuba .ad-cnt>*, :root.sw-yotsuba .adg-rects>*, :root.sw-yotsuba .bsa-cnt{height:auto !important}:root.sw-yotsuba:not(.ads-loaded) hr.abovePostForm,:root.sw-yotsuba:not(.ads-loaded) .adg-rects>hr,:root.sw-yotsuba #adg-ol+hr,:root.sw-yotsuba .danbo-slot:empty{display:none}:root.sw-yotsuba .adg-rects{margin:0;font-size:0}:root.sw-yotsuba div.center[style]{display:none !important}#menu>.hide-thread-link{width:auto;height:auto;overflow:visible;background-image:none}#menu label.entry{display:block}#fourchanx-settings label{display:inline}.intro a[href="javascript:;"],#menu a{margin:0}.gal-buttons.gal-buttons a{font-size:inherit}:root.sw-tinyboard.fixed.top-header:not(.autohide) .boardlist,:root.sw-tinyboard.fixed.top-header:not(.autohide) .bar.top{position:static}:root.sw-tinyboard.fixed.top-header:not(.autohide) div.pages.top{top:auto;bottom:0}:root.sw-tinyboard.fixed.top-header.autohide .boardlist,:root.sw-tinyboard.fixed.top-header.autohide .bar.top{z-index:3}:root[data-host="fufufu.moe"].fixed.top-header:not(.autohide) div.pages.top{top:26px;bottom:auto}:root[data-host="merorin.com"].fixed.top-header:not(.autohide) span.settings{top:26px}:root[data-host="fufufu.moe"]:not(.fixed) #header-bar{margin-top:38px}:root[data-host="lainchan.org"]:not(.fixed) #header-bar{margin-top:17px}:root[data-host="smuglo.li"]:not(.fixed) #header-bar{margin-top:8px}audio.controls-added{display:block;margin:auto;white-space:normal}:root.anti-autoplay div.embed{position:static;width:auto;height:auto;text-align:center}:root.anti-autoplay .autoplay-removed{visibility:visible !important;min-width:640px;min-height:360px}#overlay,#qp, #ihover,#navlinks, .fixed #header-bar,:root.float #updater,:root.float #thread-stats,#qr,#export-dialog{position:fixed}#overlay{z-index:999}#qp, #ihover{z-index:60}#menu, .gal-buttons{z-index:50}#updater, #thread-stats{z-index:40}:root.fixed #header-bar, #notifications{z-index:35}#a-gallery{z-index:30}#navlinks{z-index:25}#qr{z-index:20}#embedding{z-index:11}#export-dialog{z-index:1001}:root.fixed-watcher #thread-watcher{z-index:10}:root.fixed:not(.gallery-open) #header-bar:not(:hover){z-index:8}#thread-watcher{z-index:5}.fixed.top-header body{padding-top:2em}.fixed.bottom-header body{padding-bottom:2em}.fixed #header-bar{right:0;left:0;padding:3px 4px 4px;font-size:12px}.fixed.top-header #header-bar{top:0}.fixed.bottom-header #header-bar{bottom:0}#header-bar{border-width:0;transition:all .1s .05s ease-in-out}:root.fixed #header-bar{box-shadow:-5px 1px 10px rgba(0, 0, 0, 0.20)}:root.centered-links #shortcuts{width:300px;text-align:right;justify-content:right}:root.centered-links #header-bar{text-align:center}#custom-board-list{font-size:13px;vertical-align:middle}#full-board-list{vertical-align:middle}:root.centered-links #custom-board-list{position:relative;left:150px}.fixed.top-header #header-bar{border-bottom-width:1px}.fixed.bottom-header #header-bar{box-shadow:0 -1px 2px rgba(0, 0, 0, .15);border-top-width:1px}.fixed.bottom-header #header-bar .menu-button i{border-top:none;border-bottom:6px solid}.fixed #header-bar.autohide:not(:hover){box-shadow:none;transition:all .8s .6s cubic-bezier(.55, .055, .675, .19)}.fixed.top-header #header-bar.autohide:not(:hover){margin-bottom:-1em;transform:translateY(-100%)}.fixed.bottom-header #header-bar.autohide:not(:hover){transform:translateY(100%)}#scroll-marker{left:0;right:0;height:10px;position:absolute}#header-bar:not(.autohide) #scroll-marker{pointer-events:none}#header-bar #scroll-marker{display:none}.fixed #header-bar #scroll-marker{display:block}.fixed.top-header #header-bar #scroll-marker{top:100%}.fixed.bottom-header #header-bar #scroll-marker{bottom:100%}#board-list a, #shortcuts a:not(.entry){text-decoration:none;padding:1px}#shortcuts:empty{display:none}.dead-thread,.disabled:not(.replies-quoting-you){opacity:.45}#shortcuts{float:right;display:flex}:root.autohiding-scrollbar #shortcuts{margin-right:12px}.shortcut{margin-left:3px;vertical-align:middle}:root.shortcut-icons .native-settings{font-size:0;color:transparent;display:inline-block;vertical-align:top;height:12px;width:14px;background:url(\'//s.4cdn.org/image/favicon.ico\') 0px -1px no-repeat}#navbotright,#navtopright{display:none}#toggleMsgBtn{display:none !important}.current,:root.sw-yotsuba div#boardNavDesktopFoot a.current{font-weight:bold}:root.shortcut-icons #header-bar .icon-shortcut{font-size:0}:root.shortcut-icons #header-bar .icon-shortcut a::before{content:var(--icon);font-size:16px;line-height:12px}.brackets-wrap::before{content:"["}.brackets-wrap::after{content:"]"}#notifications{position:fixed;top:0;height:0;text-align:center;right:0;left:0;visibility:visible}#notifications:empty{display:none}:root.fixed.top-header:not(.gallery-open) #header-bar #notifications,:root.fixed.top-header #header-bar.autohide #notifications{position:absolute;top:100%}.notification{color:#FFF;font-weight:700;text-shadow:0 1px 2px rgba(0, 0, 0, .5);box-shadow:0 1px 2px rgba(0, 0, 0, .15);border-radius:2px;margin:1px auto;width:550px;max-width:100%;position:relative;transition:all .25s ease-in-out}.notification.error{background-color:hsla(0, 100%, 38%, .9)}.notification.warning{background-color:hsla(36, 100%, 38%, .9)}.notification.info{background-color:hsla(200, 100%, 38%, .9)}.notification.success{background-color:hsla(104, 100%, 38%, .9)}.notification a{color:white}.notification>.close{font-size:11px;padding:7px;top:0px;right:5px;position:absolute}.message{box-sizing:border-box;padding:6px 20px;max-height:200px;width:100%;overflow:auto;white-space:pre-line}.message a{text-decoration:underline}:root.tainted .report-error{display:none}:root.fourchan-x body{box-sizing:border-box}#overlay{background-color:rgba(0, 0, 0, .5);display:flex;top:0;left:0;height:100%;width:100%}#fourchanx-settings{box-sizing:border-box;box-shadow:0 0 15px rgba(0, 0, 0, .15);height:600px;max-height:100%;width:900px;max-width:100%;margin:auto;padding:5px;display:flex;flex-direction:column}#fourchanx-settings>nav{padding:2px 2px 8px;display:flex}#fourchanx-settings>nav a{text-decoration:underline}#fourchanx-settings>nav a.close{text-decoration:none;padding:0 2px;margin:0}.section-container{flex:1;position:relative;overflow:auto;padding-right:5px;overscroll-behavior:contain}.sections-list{flex:1}.export, .import, .reset{cursor:pointer;text-decoration:none !important}.tab-selected{font-weight:700}.section-sauce ul,.section-advanced ul{list-style:none;margin:0}.section-sauce ul{padding:8px}.section-advanced ul{padding:0px}.section-sauce li,.section-advanced li{padding-left:4px}.section-main ul{margin:0;padding:0 0 0 16px}.section-main li{white-space:pre-line;list-style:disc}.section-main li:not(:first-of-type){margin-top:4px}.section-main label{text-decoration:underline}div[data-checked="false"]>.suboption-list{display:none}.suboption-list{position:relative}.suboption-list::before{content:"";display:inline-block;position:absolute;left:.7em;width:0;height:100%;border-left:1px solid}.suboption-list>div{position:relative;padding-left:1.4em}.suboption-list>div::before{content:"";display:inline-block;position:absolute;left:.7em;width:.7em;height:.6em;border-left:1px solid;border-bottom:1px solid}#fourchanx-settings .section-main p{margin:.5em 0 0}.section-filter ul{padding:0}.section-filter li{margin:10px 40px;list-style:disc}.section-filter textarea{height:500px}.section-main a, .section-filter a, .section-advanced a{text-decoration:underline}#sauce-doc-expand:not(:checked)~#sauce-doc{max-height:130px;overflow:auto}#sauce-doc>label{float:right;margin:0 5px}#sauce-doc-expand+.riceCheck{display:none}.section-sauce textarea{height:430px}.section-advanced .field.wide{width:100%}.section-advanced textarea{height:150px}.section-advanced textarea[name="archiveLists"],.section-advanced textarea[name="externalCatalogURLs"],.section-advanced textarea[name="knownBanners"]{height:75px}.section-advanced .archive-cell{min-width:160px;text-align:center}.section-advanced #archive-board-select{position:absolute}.section-advanced .note{font-size:0.8em;font-style:italic;margin-left:10px}.section-advanced .note code{font-style:normal;font-size:11px}.favicon-preview>img{vertical-align:middle}.favicon-preview>img:nth-of-type(3n+1){margin-left:4px}.section-keybinds .field{font-family:monospace}#fourchanx-settings fieldset{border:1px solid;border-radius:3px;padding:0.35em 0.625em 0.75em;margin:0px 2px}#fourchanx-settings legend{font-weight:700;color:inherit}#fourchanx-settings textarea{font-family:monospace;width:100%;resize:vertical}#fourchanx-settings code{color:#000;background-color:#FFF;padding:0 2px}#fourchanx-settings th{text-align:center;font-weight:bold}#fourchanx-settings p{margin:1em 0px}#fourchanx-settings table{margin:auto}:root.index-loading .navLinks:not(.json-index),:root.index-loading .board:not(.json-index),:root.index-loading .pagelist:not(.json-index),:root.infinite-mode .pagelist,:root.all-pages-mode .pagelist,:root.catalog-mode .pagelist,:root:not(.catalog-mode) .indexlink,:root.catalog-mode .cataloglink,:root:not(.catalog-mode) #hidden-label,:root:not(.catalog-mode) #index-size{display:none}#index-search{padding-right:1.5em;width:100px;transition:color .25s, border-color .25s, width .25s}#index-search:focus,#index-search[data-searching]{width:200px}#index-search-clear{color:gray;display:inline-block;position:relative;left:-1em;width:0}#index-search::-webkit-search-cancel-button{display:none}#index-search:not([data-searching])+#index-search-clear{display:none}#index-options{float:right}#lastlong-options{display:inline-block;vertical-align:middle;height:28px;margin:-14px 0}#lastlong-options>input{padding:0;border:0 !important;text-align:center;background:transparent;display:block;font-size:12px;height:12px;width:30px;margin:1px 0}.summary{text-decoration:none}:root.catalog-mode .board{text-align:center}.catalog-thread{display:inline-block;box-sizing:border-box;border:1px solid transparent;word-wrap:break-word;vertical-align:top;position:relative}.catalog-thread.catalog-thread{margin:2px}.catalog-small>.catalog-thread{width:165px;height:320px}.catalog-large>.catalog-thread{width:270px;height:410px}:root.catalog-hover-expand .catalog-thread:hover{z-index:1}.catalog-container{position:absolute;top:-4px;left:0;right:0;bottom:0}.catalog-container:not(:hover),:root:not(.catalog-hover-expand) .catalog-container{overflow:hidden}.catalog-post{position:absolute;top:4px;left:0;right:0;border:1px solid transparent;padding-top:20px}:root:not(.catalog-hover-expand) .catalog-post{left:0 !important;right:0 !important}.catalog-post.catalog-post{margin:-21px -1px -1px;overflow:visible}.catalog-thread.noFile>*>.catalog-post{margin-top:-7px;padding-top:6px}:root.catalog-hover-expand .catalog-container:hover>.catalog-post{margin-left:-61px;margin-right:-61px}:root.catalog-hover-expand .catalog-container:hover>*>:not(.catalog-replies){padding-left:2px;padding-right:2px}.catalog-link{display:block;position:relative}.catalog-thumb{border-radius:2px;box-shadow:0 0 5px rgba(0, 0, 0, .25);vertical-align:top}.catalog-thumb.spoiler-file{width:100px;height:100px}.catalog-thumb.deleted-file{width:127px;height:13px;padding:20px 11px}.catalog-thumb.no-file{width:77px;height:13px;padding:20px 36px}.catalog-icons>img,.catalog-stats>.menu-button{width:1em;height:1em;margin:0;vertical-align:text-top;padding-left:2px}.catalog-stats>.menu-button>svg.icon{height:10px}.catalog-stats{font-size:10px;font-weight:700;padding-top:2px}.catalog-stats>[title]{cursor:help}.catalog-post>.postMessage{margin:0;padding-bottom:.3em}.catalog-container:not(:hover)>*>.file,.catalog-container:not(:hover)>*>.postInfo>:not(.subject),.catalog-container:not(:hover)>*>.catalog-replies,.catalog-container:not(:hover) .extra-linebreak,.catalog-container:not(:hover) .abbr,:root:not(.catalog-hover-expand) .catalog-container>*>.file,:root:not(.catalog-hover-expand) .catalog-container>*>.postInfo>:not(.subject),:root:not(.catalog-hover-expand) .catalog-container>*>.catalog-replies,:root:not(.catalog-hover-expand) .catalog-container .extra-linebreak,:root:not(.catalog-hover-expand) .catalog-container .abbr,.catalog-thread>.catalog-container>:not(.catalog-post),.preview-summary,.catalog-post>.file>:not(.fileText),.catalog-post>*>.fileText>:not(:first-child),.catalog-post>.postInfo>:not(.subject):not(.nameBlock):not(.dateTime),.catalog-post>.postInfo>.nameBlock>.contact-links,.catalog-post>*>*>.posteruid,.catalog-post>*>*>.postJumper,:root.bottom-backlinks .catalog-post>.container,.post:not(.catalog-post)>.catalog-link,.post:not(.catalog-post)>.catalog-stats,.post:not(.catalog-post)>.catalog-replies{display:none}.catalog-post>.file{position:absolute;left:0;right:0;top:0;min-height:20px;background-color:inherit}.catalog-post>*>.fileText{position:relative;padding:2px;background-color:inherit}.catalog-small .catalog-post>* .fileText{font-size:10px}.catalog-post>*>.fileText:not(:hover){white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.catalog-post>*>.fileText:hover{z-index:1}.catalog-post>.postInfo.postInfo{width:auto}.catalog-post>*>.subject{display:block}.catalog-post>*>.dateTime{display:inline-block;font-style:italic}:root.catalog-hover-expand .catalog-container:hover>*>*>.nameBlock,:root.catalog-hover-expand .catalog-container:hover>*>*>.dateTime,:root.catalog-hover-expand .catalog-container:hover>*>.postMessage:not(:empty){padding-top:.3em}.catalog-post .extra-linebreak{content:\'\'; display:block;margin-top:.3em}.catalog-reply{text-align:left;white-space:nowrap;border-top:1px solid transparent;display:flex;flex-direction:row;align-items:stretch}.catalog-reply>*{padding:3px;overflow:hidden;flex:none}.catalog-reply>span{font-style:italic;font-weight:bold}.catalog-reply-excerpt{flex:1 1 auto}.catalog-post .prettyprinted{max-width:100%;box-sizing:border-box}.catalog-post .MathJax_Display{text-align:center !important}.catalog-container:not(:hover) .exif,:root:not(.catalog-hover-expand) .catalog-container .exif{display:none !important}.catalog-post>*>.exif{border-collapse:collapse}:root.catalog-hover-expand .catalog-container:hover .exif[style*="display: block;"]{display:inline-block !important}.catalog-post>*>.exif,.catalog-post>*>.exif>tbody{background-color:inherit}.catalog-post>*>.exif,.catalog-post>*>.exif td{min-width:0}.catalog-post>*>.exif td{padding-top:1px}:root.hats-enabled .catalog-thread::after{content:\'\';pointer-events:none;position:absolute;background-size:contain}:root.hats-enabled .catalog-small>.catalog-thread::after{left:-8px;top:-59px;width:96px;height:96px}:root.hats-enabled:not(.werkTyme) .catalog-small>.catalog-thread:not(.noFile)::after{left:calc(67px - .3px * var(--tn-w))}:root.hats-enabled .catalog-large>.catalog-thread::after{left:-15px;top:-98px;width:160px;height:160px}:root.hats-enabled:not(.werkTyme) .catalog-large>.catalog-thread:not(.noFile)::after{left:calc(110px - .5px * var(--tn-w))}textarea.copy-text-element{height:0;width:0;position:absolute;top:-10000px}:root.hide-announcement $site$psa{display:none}.hide-announcement-button{opacity:0.4;float:left}.unread-line{margin:0}.unread-line+br{display:none}.unread-mark-read{float:right;clear:both;width:100%;text-align:right}:not(.unread-thread)>.unread-mark-read{display:none}#updater{background:none;border:none;box-shadow:none}#updater>.move{position:absolute;top:-5px;bottom:-5px;left:-5px;right:-5px;z-index:-1}#updater>div:last-child{text-align:center}#updater input[type="number"]{width:4em}:root.float #updater{padding:0px 3px}:root:not(.float).shortcut-icons #updater{display:inline-block;min-width:12pt;text-align:right}.new{color:limegreen}#update-status:not(.empty)+#update-timer:not(.empty):not(.loading){margin-left:5px}#update-timer{cursor:pointer}#thread-watcher{position:absolute}#thread-watcher{padding-bottom:3px;padding-left:3px;white-space:nowrap;min-width:146px}#watched-threads{overflow-x:hidden;overflow-y:auto}#thread-watcher .refresh{padding:0px 3px}:root.fixed-watcher #thread-watcher{position:fixed}:root.fixed-watcher #watched-threads{max-height:calc(100vh - 75px)}:root:not(.fixed-watcher) #watched-threads:not(:hover){max-height:210px;overflow-y:hidden}#thread-watcher>.move{padding-top:3px}#watched-threads>div{padding-left:3px;padding-right:3px}#watched-threads .watcher-link{max-width:250px;display:inline-flex;flex-direction:row}#watched-threads .watcher-page,#watched-threads .watcher-unread{flex:0 0 auto;margin-right:2px}#watched-threads .watcher-title{overflow:hidden;text-overflow:ellipsis;flex:0 1 auto}#watched-threads .watcher-title:not(:first-child){margin-left:2px}.replies-quoting-you>a, #watcher-link.replies-quoting-you, .last-page>a>.watcher-page{color:#F00}#thread-watcher a{text-decoration:none}#thread-watcher .move>.close{position:absolute;right:0px;top:0px;padding:0px 4px}.watch-thread-link{width:18px;height:18px;background:none;border:none;padding:2px;opacity:0.2;filter:none;cursor:pointer;color:var(--xt-watcher, #000)}.watch-thread-link.watched{opacity:1}:root.oneechan .watch-thread-link>svg{display:none}#thread-stats{background:none;border:none;box-shadow:none}:root.float #thread-stats>.move>:not(#page-count){pointer-events:none}:root.float #thread-stats{padding:0px 3px}#page-count{cursor:pointer}.hashlink::before{content:\' \';visibility:hidden}.inline+.hashlink{display:none !important}:root.resurrect-quotes .deadlink{text-decoration:none !important}.catalog-post .qmark-ct{display:none}.backlink.deadlink:not(.forwardlink),.quotelink.deadlink:not(.forwardlink){text-decoration:underline !important}:root:not(.catalog-mode) .inlined{opacity:.5}#qp input, .forwarded{display:none}.quotelink.forwardlink,.backlink.forwardlink{text-decoration:none;border-bottom:1px dashed}.filtered{text-decoration:underline line-through}:root.hide-backlinks .backlink.filtered,:root.hide-backlinks .backlink.filtered+.hashlink.filtered{display:none}.postNum+.container::before{content:" "}:root.bottom-backlinks .container{display:block;clear:both;margin:0 4px}:root.bottom-backlinks .backlink{font-size:90%}.inline{border:1px solid;display:table;margin:2px 0}.container~.inline{margin-left:20px}:root.catalog-mode .inline{display:none}.inline .post{border:0 !important;background-color:transparent !important;display:table !important;margin:0 !important;padding:1px 2px !important}#qp>.opContainer::after{content:\'\';clear:both;display:table}#qp .post{border:none;margin:0;padding:2px 2px 5px}#qp img{max-height:80vh;max-width:50vw}#qp .preview-summary{display:block}.threadContainer{margin-left:20px;border-left:1px solid rgba(128,128,128,.3)}.threadOP{clear:both}.expanded-image>.post>.file>.fileThumb{display:flex;flex-direction:column}.fileText-original,.fnswitch:hover>.fntrunc,.fnswitch:not(:hover)>.fnfull,.expanded-image>.post>.file>.fileThumb>video[data-md5],.expanded-image>.post>.file>.fileThumb>img[data-md5]{display:none}.full-image[data-file-i-d]{display:none;cursor:pointer}.expanded-image>.post>.file>.fileThumb>.full-image{display:inline}.expanded-image>.post>.file>.fileThumb>audio{height:30px;width:100%;min-width:300px}.expanded-image{clear:left}.expanding{opacity:.5}:root.fit-height .full-image{max-height:100vh}:root.fit-height.fixed .full-image{max-height:calc(100vh - 35px)}:root.fit-width .full-image{max-width:100%}:root.ua-gecko.fit-width .full-image{width:100%}.fileThumb>.warning{clear:both}#ihover{pointer-events:none;max-height:calc(100vh - 25px);max-width:100vw}.webm-title>a::before{content:"title";text-decoration:underline}.webm-title.loading>a::after{content:"..."}.webm-title.error>a:hover::before,.webm-title.error>a:focus::before{content:"error";text-decoration:none}.webm-title>span{cursor:text}.webm-title.not-found>span::before{content:"not found"}.webm-title:not(:hover):not(:focus)>span,.webm-title:hover>span+a,.webm-title:focus>span+a{display:none}input[name="Default Volume"]{width:4em;height:1ex;vertical-align:middle;margin:0px}:root.fappeTyme $site$replyOriginal.noFile,:root.fappeTyme $site$replyOriginal.noFile+br{display:none}:root.werkTyme $site$thumbLink,:root.werkTyme $site$file$thumb,:root.werkTyme .catalog-thumb:not(.deleted-file):not(.no-file),:root:not(.werkTyme) .werkTyme-filename{display:none}.werkTyme-filename{font-weight:bold;font-size:110%}:root.werkTyme .catalog-link{box-shadow:0 0 5px rgba(0, 0, 0, .25);padding:8px;text-align:center}:root.werkTyme .catalog-thumb{box-shadow:none;padding:0;vertical-align:middle}.indicator{background:rgba(255,0,0,0.8);font-weight:bold;display:inline-block;min-width:9px;padding:0px 2px;margin:0 1px;text-align:center;color:white;border-radius:2px;cursor:pointer}:root:not(.fappeTyme) #shortcut-fappe,:root:not(.werkTyme) #shortcut-werk{display:none !important}#navlinks{font-size:16px;top:25px;right:10px}:root.catalog-mode #navlinks{display:none}:root.highlight-own .yourPost$site$highlightable$op::after,:root.highlight-you .quotesYou$site$highlightable$op::after,.filter-highlight$site$highlightable$op::after{content:"";display:block;clear:both}:root.reveal-spoilers $site$spoiler,:root.reveal-spoilers $site$spoiler>a{color:white !important}:root.reveal-spoilers .removed-spoiler::before{content:"[spoiler]"}:root.reveal-spoilers .removed-spoiler::after{content:"[/spoiler]"}.hide-thread-button,.hide-reply-button{float:left;margin-right:4px;padding:2px}$site$infoRoot a.hide-reply-button{margin-right:6px;padding:0}.replacedSideArrows{float:left}.hide-thread-button:not(:hover),.hide-reply-button:not(:hover){opacity:0.4}.threadContainer .hide-reply-button{margin-left:2px !important;position:relative;left:1px}.hide-thread-button{margin-top:-1px;width:11px}.stub~:not(.threadDivider){display:none !important}.stub input{display:inline-block}.stub .stub-icon,.stub-subject{margin-right:1ch}.stub-replies{margin-left:1ch}.stub-reasons::before{ content: \' (\'; }.stub-reasons::after{ content: \')\'; }.stub-reason:not(:last-of-type)::after{ content: \' & \'; }$site$thread[hidden]+hr{display:none}:root.reply-hide $site$sideArrows{display:none}:root.sw-yotsuba.thread-hide .party-hat{left:19px}:root.anonymize $site$info$name,:root.sw-yotsuba.anonymize .post-author:not([class*=capcode]){font-size:0}:root.anonymize $site$info$tripcode,:root.sw-yotsuba.anonymize .n-pu{display:none}:root.anonymize $site$info$name::before,:root.sw-yotsuba.anonymize .post-author:not([class*=capcode])::before{content:"Anonymous";font-size:10pt}:root.sw-yotsuba.anonymize .flashListing .name::before,:root.sw-yotsuba.anonymize .post-last>.post-author:not([class*=capcode])::before{font-size:9pt}:root.hide-original-post-form #togglePostFormLink,#qr.autohide:not(.focus):not(:hover):not(:active)>form,:root.thread-view #qr:not(.show-new-thread-option) select[data-name="thread"],#file-n-submit:not(.has-file) #qr-filerm{display:none}:root.hide-original-post-form #postForm{display:none !important}#qr select,#qr-filename-container>a,.remove{cursor:pointer}#qr{position:fixed;padding:1px;border:1px solid transparent;min-width:300px;border-radius:3px 3px 0 0}#qr>form{max-height:calc(100vh - 75px);overflow-y:auto;overflow-x:hidden}#qrtab{border-radius:3px 3px 0 0}#qrtab{margin-bottom:1px}#qr .close{float:right;padding:0 3px}.qr-link-container{text-align:center;margin:16px 0}.qr-link-container-bottom{width:200px;position:absolute;left:-100px;margin-left:50%;text-align:center}.qr-link{border-radius:3px;padding:6px 10px 5px;font-weight:bold;vertical-align:middle;border-style:solid;border-width:1px;font-size:10pt}.qr-link-container+#togglePostFormLink{font-size:10pt;font-weight:normal;margin:-8px 0 3.5px}.persona{width:100%;display:flex;flex-direction:row}.persona .field{flex:1;width:0}#qr.forced-anon input[data-name="name"]:not(.force-show),#qr.forced-anon input[data-name="sub"]:not(.force-show),#qr.reply-to-thread input[data-name="sub"]:not(.force-show),body:not(.board_f) #qr select[name="filetag"],#qr.reply-to-thread select[name="filetag"],#qr:not(.has-sjis) #sjis-toggle,#qr:not(.has-math) #tex-preview-button,#qr.tex-preview .textarea>:not(#tex-preview),#qr:not(.tex-preview) #tex-preview{display:none}.persona button{flex:0 0 23px;align-self:stretch;border:1px solid #BBB;padding:0;background:linear-gradient(to bottom, #F8F8F8, #DCDCDC) no-repeat;color:#000}#qr.sjis-preview #sjis-toggle, #qr.tex-preview #tex-preview-button{background:#DCDCDC}#sjis-toggle, #qr.sjis-preview textarea.field{font-family:"IPAMonaPGothic","Mona","MS PGothic",monospace;font-size:16px;line-height:17px}#tex-preview-button{font-size:10px}#tex-preview{white-space:pre-line}#qr textarea.field{height:14.8em;min-height:9em}#qr.has-captcha textarea.field{height:9em}input.field.tripped:not(:hover):not(:focus){color:transparent !important;text-shadow:none !important}#qr textarea{min-width:300px;resize:both}.field{box-sizing:border-box;margin:0px;padding:2px 4px 3px}#qr label input[type="checkbox"]{position:relative;top:2px}#qr .captcha-root{position:relative}#qr .captcha-container>div{margin:auto;width:304px}:root.ua-blink #qr .captcha-container>div,:root.ua-edge #qr .captcha-container>div{overflow:hidden}:root.ua-blink #qr .captcha-container>div>div:first-of-type,:root.ua-edge #qr .captcha-container>div>div:first-of-type{overflow-y:scroll;overflow-x:hidden;padding-right:30px;height:99%;width:100%}#qr .captcha-counter{display:block;width:100%;text-align:center;pointer-events:none}#qr.captcha-open .captcha-counter{position:absolute;bottom:3px}#qr .captcha-counter>a{pointer-events:auto;display:inline-block; }#qr:not(.captcha-open) .captcha-counter>a{display:block;width:100%}#qr.captcha-v2 #qr-captcha-iframe{width:302px;height:423px;border:0;display:block;margin:auto}.goog-bubble-content{max-width:100vw;max-height:100vh;overflow:auto}.goog-bubble-content iframe{position:static !important}#overlay.media-preview{display:flex;overflow:auto;align-items:center}#overlay.media-preview video, #overlay.media-preview img{margin:auto}#overlay.media-preview video{max-height:100%;max-width:100%}#file-n-submit, #qr .oekaki{display:flex;align-items:stretch;margin-top:1px}#file-n-submit>input, #qr-draw-button{background:linear-gradient(to bottom, #F8F8F8, #DCDCDC) no-repeat;border:1px solid #BBB;border-radius:2px;height:100%}#qr-file-button, #qr-draw-button{width:15%}#file-n-submit input[type="submit"]{width:25%}#qr-filename-container{flex:1 1 auto;width:0;display:flex;align-items:center;position:relative;padding:1px}input#qr-filename{border:none !important;background:none !important;outline:none}#qr-filename,.has-file #qr-no-file{display:none}#qr-no-file,.has-file #qr-filename{flex:1 1 auto;width:0px; display:inline-block;padding:0;padding-left:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#qr-no-file{color:#AAA}#qr .oekaki.has-file{height:25px}#qr .oekaki.has-file{display:none}#qr .oekaki>label{flex:1 1 auto;width:0;display:flex;align-items:center;height:100%}#qr .oekaki>label>span{margin:0 3px}#qr .oekaki>label>input{flex:1 1 auto;width:0;height:100%}#qr .oekaki-bg{position:relative;display:inline-block;height:100%;width:10%;margin-left:3px}#qr .oekaki-bg>*{position:absolute;top:0;left:0;margin:0}#qr .oekaki-bg>:not([name="oekaki-bgcolor"]){z-index:1}#qr [name="oekaki-bgcolor"]{height:100%;width:100%;border:none;padding:0}#qr [name="oekaki-bg"]:not(:checked)~[name="oekaki-bgcolor"]{visibility:hidden}#qr input[type="file"]{visibility:hidden;position:absolute}#qr-filename-container>label, #qr-filename-container>a{flex:none;margin:0;margin-right:3px}#qr:not(.has-spoiler) #qr-spoiler-label,#file-n-submit:not(.has-file) #qr-spoiler-label,#file-n-submit:not(.has-file) #qr-randomize,#file-n-submit:not(.has-image) #qr-jpg,#file-n-submit:not(.has-image):not(.has-video) #qr-view,#file-n-submit:not(.has-file) #qr-restore-name,.has-file #paste-area,.has-file #url-button,#file-n-submit:not(.custom-cooldown) #custom-cooldown-button{display:none}#qr-filename-container>label{position:relative}#qr-filename-container input[type="checkbox"]{margin:0}.checkbox-letter{font-size:13px;font-weight:bold}#qr-filename-container label:not(:hover)>input[type="checkbox"]:not(:focus):not(:checked),#qr-filename-container label:not(:hover)>input[type="checkbox"]:not(:focus):not(:checked)~:not(.checkbox-letter),#qr-filename-container label:hover>.checkbox-letter,input[type="checkbox"]:focus~.checkbox-letter,input[type="checkbox"]:checked~.checkbox-letter{position:absolute;opacity:0;pointer-events:none}.checkbox-letter, #paste-area, #url-button, #custom-cooldown-button, #dump-button, #split-post{opacity:0.6}#paste-area{font-size:0}#paste-area:focus{opacity:1}#custom-cooldown-button.disabled{opacity:0.27}#qr select{background:white;border:1px solid #CCC}#qr select[data-name="thread"]{float:right}#qr>form>select{margin-top:1px}.dump #dump-list-container{display:block}#dump-list-container{display:none;position:relative;overflow-y:hidden;margin-top:1px}#dump-list{overflow-x:auto;overflow-y:auto;white-space:nowrap;width:248px;max-height:248px;min-height:90px;max-width:100%;min-width:100%;display:flex;flex-wrap:wrap}#dump-list:hover{overflow-x:auto}.qr-preview{box-sizing:border-box;counter-increment:thumbnails;cursor:move;display:inline-block;height:90px;width:90px;padding:2px;opacity:.5;overflow:hidden;position:relative;text-shadow:0 0 2px #000;transition:opacity .25s ease-in-out, transform .25s ease-in-out;vertical-align:top;background-size:cover;flex:none}.qr-preview:hover,.qr-preview:focus{opacity:.9}.qr-preview::before{content:counter(thumbnails);color:#fff;position:absolute;top:3px;right:3px;text-shadow:0 0 3px #000, 0 0 8px #000}.qr-preview#selected{opacity:1}.qr-preview.drag{box-shadow:0 0 10px rgba(0,0,0,.5);transform:scale(.8)}.qr-preview.over{border-color:#fff;transform:scale(1.1);opacity:0.9;z-index:10}.qr-preview>span{color:#fff}.remove{background:none;color:#e00;padding:1px}a:only-of-type>.remove{display:none}.remove:hover::after{content:" Remove"}.qr-preview:not(.has-file) label,#qr:not(.has-spoiler) .qr-preview-spoiler{display:none}.qr-preview>label{background:rgba(0,0,0,.5);color:#fff;right:0;bottom:0;left:0;position:absolute;text-align:center}.qr-preview>label>input{margin:0}#add-post{cursor:pointer;font-size:2em;position:absolute;bottom:20px;right:10px;transform:translateY(-50%)}.textarea{position:relative;display:flex}#char-count{color:#000;background:hsla(0, 0%, 100%, .5);font-size:8pt;position:absolute;bottom:1px;right:1px;pointer-events:none}#char-count.warning{color:red}#file-n-submit{display:flex;flex-direction:column}#file-n-submit .row{display:flex;flex-direction:row}#file-n-submit .row.space{justify-content:space-between}#file-n-submit a{display:flex;flex-direction:column;justify-content:center;padding:1px 3px 0 3px}.menu-button{display:inline-block;position:relative;cursor:pointer}#header-bar .menu-button i{border-top:6px solid;border-right:4px solid transparent;border-left:4px solid transparent;display:inline-block;margin:2px;vertical-align:middle}.postInfo>.menu-button{margin:0 5px}#menu{position:fixed;outline:none;font-weight:normal}#menu, .submenu{border-radius:3px;padding-top:1px;padding-bottom:3px}.entry{cursor:pointer;display:block;outline:none;padding:2px 10px;position:relative;text-decoration:none;white-space:nowrap;min-width:70px;text-align:left;text-shadow:none;font-size:10pt}.left>.entry.has-submenu{padding-right:17px !important}.entry input[type="checkbox"],.entry input[type="radio"]{margin:0px;position:relative;top:2px}.entry input[type="number"]{width:4.5em}.entry.has-shortcut-text{display:flex;justify-content:space-between;align-items:center}.entry .shortcut-text{opacity:0.5;font-size:70%;margin-left:5px}.has-submenu::after{content:"";border-left:.5em solid;border-top:.3em solid transparent;border-bottom:.3em solid transparent;display:inline-block;margin:.3em;position:absolute;right:3px}.left .has-submenu::after{border-left:0;border-right:.5em solid}.submenu{display:none;position:absolute;left:100%;top:-1px;margin-left:0px;margin-top:-2px}.focused>.submenu{display:block}.imp-exp-result{position:absolute;text-align:center;margin:auto;right:0px;left:0px;width:200px}.boardTitle, .boardSubtitle{white-space:pre-line}.boardTitle[contenteditable="true"],.boardSubtitle[contenteditable="true"]{cursor:text !important}.embedder:not(.embedded)>span{display:none}#embedding{padding:1px 4px 1px 4px;position:fixed}#embedding.empty{display:none}#embedding>div:first-child{display:flex}#embedding .move{flex:1}#embedding .jump{margin:-1px 4px;text-decoration:none}#a-gallery{position:fixed;top:0;bottom:0;left:0;right:0;display:flex;flex-direction:row;background:rgba(0,0,0,0.7)}.gal-viewport{display:flex;align-items:stretch;flex-direction:row;flex:1 1 auto;overflow:hidden}.gal-thumbnails{flex:0 0 150px;overflow-y:auto;display:flex;flex-direction:column;align-items:stretch;text-align:center;background:rgba(0,0,0,.5);border-left:1px solid #222}.gal-hide-thumbnails .gal-thumbnails{display:none}.gal-thumb img,.gal-thumb video{max-width:125px;max-height:125px;height:auto;width:auto}.gal-thumb{flex:0 0 auto;padding:3px;line-height:0;transition:background .2s linear}.gal-highlight{background:rgba(0, 190, 255,.8)}.gal-prev{border-right:1px solid #222}.gal-next{border-left:1px solid #222}.gal-prev,.gal-next{flex:0 0 20px;position:relative;cursor:pointer;opacity:0.7;background-color:rgba(0, 0, 0, 0.3)}.gal-prev:hover,.gal-next:hover{opacity:1}.gal-prev::after,.gal-next::after{position:absolute;top:48.6%;transform:translateY(-50%);display:inline-block;border-top:11px solid transparent;border-bottom:11px solid transparent;content:""}.gal-prev::after{border-right:12px solid #fff;right:5px}.gal-next::after{border-left:12px solid #fff;right:3px}.gal-image{flex:1 0 auto;display:flex;align-items:flex-start;justify-content:space-around;overflow:hidden;width:1%}:root:not(.gal-fit-height):not(.gal-pdf) .gal-image{overflow-y:scroll !important}:root:not(.gal-fit-width):not(.gal-pdf) .gal-image{overflow-x:scroll !important}.gal-image a{display:flex;align-items:flex-start;margin:auto;line-height:0;max-width:100%}:root.gal-pdf .gal-image a{width:100%;height:100%}.gal-image img,.gal-image video{flex:none}.gal-fit-width .gal-image img,.gal-fit-width .gal-image video{max-width:100%}.gal-fit-height .gal-image img,.gal-fit-height .gal-image video{max-height:calc(100vh - 25px)}.gal-image iframe{width:100%;height:100%}.gal-buttons{font-size:2em;margin-right:3px;padding-left:7px;padding-right:7px;top:5px}:root.gal-pdf .gal-buttons{top:40px;background:rgba(0,0,0,0.6) !important;border-radius:3px}.gal-buttons a{color:#ffffff;text-shadow:0px 0px 1px #000000}.gal-buttons i{display:inline-block;margin:2px;position:relative}.gal-start i{border-left:10px solid;border-top:6px solid transparent;border-bottom:6px solid transparent;bottom:1px}.gal-stop i{border:5px solid;bottom:2px}.gal-buttons.gal-playing>.gal-start,.gal-buttons:not(.gal-playing)>.gal-stop{display:none}.gal-buttons .menu-button i{border-top:10px solid;border-right:6px solid transparent;border-left:6px solid transparent;bottom:2px;vertical-align:baseline}.gal-labels{position:fixed;bottom:6px;display:flex;flex-direction:column;align-items:flex-end}:root:not(.show-sauce) .gal-sauce{display:none}.gal-name,.gal-count,.gal-sauce{background:rgba(0,0,0,0.6) !important;border-radius:3px;padding:1px 5px 2px 5px;margin-top:3px;color:#ffffff !important;text-decoration:none !important}.gal-sauce a{color:#ffffff !important}.gal-name:hover,.gal-buttons a:hover,.gal-sauce a:hover{color:rgb(95, 95, 101) !important}:root.gal-pdf .gal-buttons a:hover{color:rgb(204, 204, 204) !important}.gal-buttons,.gal-labels{position:fixed;right:195px}.gal-hide-thumbnails .gal-buttons,.gal-hide-thumbnails .gal-labels{right:44px}:root:not(.gal-fit-width):not(.gal-pdf) .gal-labels{bottom:23px !important}:root.gal-fit-height:not(.gal-pdf):not(.gal-hide-thumbnails) .gal-buttons,:root.gal-fit-height:not(.gal-pdf):not(.gal-hide-thumbnails) .gal-labels{right:178px !important}:root.gal-hide-thumbnails.gal-fit-height:not(.gal-pdf) .gal-buttons,:root.gal-hide-thumbnails.gal-fit-height:not(.gal-pdf) .gal-labels{right:28px !important}:root.gallery-open.fixed #header-bar:not(.autohide){visibility:hidden}.contact-links{margin-left:2px}.move-note>a{text-decoration:underline}.invisible{font-size:0}.postJumper>.prev,.postJumper>.next{font-size:120%}.fcx-announcement{text-align:center}.fcx-announcement a{text-decoration:underline}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.spin>.icon{animation:spin 2s infinite linear}div.post{overflow:auto;scroll-margin-top:30px}.file svg.icon{height:12px}.dialog{background-color:var(--xt-background);border-color:var(--xt-border)}.field:focus,.field.focus{border-color:var(--xt-border-field-focus)}:root:not(.oneechan).highlight-you .quotesYou$site$highlightable$reply{border-left:3px solid var(--xt-border-highlight) !important}:root:not(.oneechan).highlight-own .yourPost$site$highlightable$reply{border-left:3px dashed var(--xt-border-highlight) !important}#header-bar.dialog{background-color:var(--xt-header-dialog-bg)}:root:not(.fixed) #header-bar, #notifications{font-size:var(--xt-notification-size, 9pt)}#header-bar, #notifications{color:var(--xt-header-dialog-fg)}#board-list a, #shortcuts a{color:var(--xt-header-link, unset)}#fourchanx-settings fieldset, .section-main div::before{border-color:var(--xt-border)}.suboption-list>div:last-of-type{background-color:var(--xt-background)}:root.catalog-hover-expand .catalog-container:hover>.post{background-color:var(--xt-background)}:root.werkTyme .catalog-thread:not(:hover),:root.werkTyme:not(.catalog-hover-expand) .catalog-thread,:root.catalog-hover-expand .catalog-container:hover>.post,:root.catalog-hover-expand .catalog-container:hover .catalog-reply{border-color:var(--xt-border)}.backlink.deadlink{color:var(--xt-dead-link) !important}.inline{border-color:var(--xt-border);background-color:var(--xt-inline, rgba(255, 255, 255, .14))}.indicator{color:var(--xt-background)}#dump-list::-webkit-scrollbar-thumb{background-color:var(--xt-background);border-color:var(--xt-border)}.qr-preview{background-color:var(--xt-qr-preview-bg, rgba(0, 0, 0, .15))}.qr-link{border-color:var(--xt-qr-link-border);background:var(--xt-qr-bg)}.qr-link:hover{background:var(--xt-link-hover-bg, var(--xt-background))}#menu{color:var(--xt-menu-fg, var(--xt-header-link))}.entry{font-size:var(--xt-entry-size, 10pt)}.focused.entry{background:var(--xt-entry-focus-bg)}.unread-mark-read{background-color:var(--xt-unread)}.replies-quoting-you>a, #watcher-link.replies-quoting-you, .last-page>a>.watcher-page{color:var(--xt-watcher-quoting-you, #F00) !important}.qphl{outline:2px solid var(--xt-qphl, rgba(216, 94, 49, .8))}:root.highlight-you .quotesYou$site$highlightable$op,:root.highlight-you .quotesYou$site$highlightable$reply{border-left:3px solid var(--xt-border-highlight)}:root.highlight-own .yourPost$site$highlightable$op,:root.highlight-own .yourPost$site$highlightable$reply{border-left:3px dashed var(--xt-border-highlight) }.filter-highlight$site$highlightable$op,.filter-highlight$site$highlightable$reply{box-shadow:inset 5px 0 var(--xt-filter-highlight, rgba(221, 0, 0, .5))}:root.highlight-own .yourPost>$site$sideArrows,:root.highlight-you .quotesYou>$site$sideArrows,.filter-highlight>$site$sideArrows{color:var(--xt-highlight-side-arrow, rgba(221, 0, 0, .8))}:root:not(.werkTyme) .catalog-thread.filter-highlight .catalog-thumb,:root.werkTyme .catalog-thread.filter-highlight:not(:hover),:root.werkTyme:not(.catalog-hover-expand) .catalog-thread.filter-highlight,:root.werkTyme.catalog-hover-expand .catalog-thread.filter-highlight>.catalog-container:hover>.catalog-post,:root.catalog $site$catalog$thread.filter-highlight$site$highlightable$catalog{box-shadow:0 0 3px 3px var(--xt-highlight-shadow, rgba(255, 0, 0, .5))}:root:not(.werkTyme) .catalog-thread.watched .catalog-thumb,:root:root.werkTyme .catalog-thread.watched:not(:hover),:root:root.werkTyme:not(.catalog-hover-expand) .catalog-thread.watched,:root.werkTyme.catalog-hover-expand .catalog-thread.watched>.catalog-container:hover>.catalog-post{border:2px solid var(--xt-watched-border, rgba(255, 0, 0, .75))}.unread-line{border-color:var(--xt-unread-line, rgb(255,0,0))}:root.tomorrow,:root.spooky{color-scheme:dark}:root.tomorrow #file-n-submit>input,:root.tomorrow #qr-draw-buton,:root.spooky #file-n-submit>input,:root.spooky #qr-draw-buton{background-image:none}:root.tomorrow .field,:root.spooly .field{background-color:unset;color:unset;border-color:unset}:root.yotsuba{--xt-background:#F0E0D6;--xt-border:#D9BFB7;--xt-border-field-focus:#EA8;--xt-border-highlight:rgba(221, 0, 0, .8);--xt-header-dialog-bg:rgba(240,224,214,0.98);--xt-header-dialog-fg:#B86;--xt-header-link:#800000;--xt-dead-link:#00E;--xt-qr-link-border:rgb(225, 209, 199) rgb(225, 209, 199) rgb(210, 194, 184);--xt-qr-bg:linear-gradient(#FFEFE5, #F0E0D6) repeat scroll 0% 0% transparent;--xt-entry-focus-bg:rgba(255, 255, 255, .33);--xt-unread:rgba(240, 224, 214, 0.5);--xt-watcher:#800000;--xt-fxt-fg:#800000}:root.yotsuba-b{--xt-background:#D6DAF0;--xt-link-hover-bg:#D9DDF3;--xt-border:#B7C5D9;--xt-border-field-focus:#98E;--xt-border-highlight:rgba(221, 0, 0, .8);--xt-header-dialog-bg:rgba(214,218,240,0.98);--xt-header-dialog-fg:#89A;--xt-header-link:#34345C;--xt-dead-link:#34345C;--xt-qr-link-border:rgb(199, 203, 225) rgb(199, 203, 225) rgb(184, 188, 210);--xt-qr-bg:linear-gradient(#E5E9FF, #D6DAF0) repeat scroll 0% 0% transparent;--xt-menu-fg:#000;--xt-entry-focus-bg:rgba(255, 255, 255, .33);--xt-unread:rgba(214, 218, 240, 0.5)}:root.futaba{--xt-background:#F0E0D6;--xt-border:#D9BFB7;--xt-border-field-focus:#EA8;--xt-border-highlight:rgba(240, 224, 214, 0.98);--xt-notification-size:11pt;--xt-header-dialog-fg:#B86;--xt-dead-link:#00E;--xt-header-dialog-bg:rgba(240,224,214,0.98);--xt-header-link:#800000;--xt-qr-link-border:rgb(225, 209, 199) rgb(225, 209, 199) rgb(210, 194, 184);--xt-qr-bg:linear-gradient(#FFEFE5, #F0E0D6) repeat scroll 0% 0% transparent;--xt-entry-size:12pt;--xt-entry-focus-bg:rgba(255, 255, 255, .33);--xt-unread:rgba(240, 224, 214, 0.5);--xt-watcher:#800000;--xt-fxt-fg:#800000}:root.futaba.anonymize $site$info$name::before{font-size:12pt}:root.burichan{--xt-background:#D6DAF0;--xt-border:#B7C5D9;--xt-border-field-focus:#98E;--xt-border-highlight:3px dashed rgba(221, 0, 0, .8);--xt-header-dialog-bg:rgba(214, 218, 240, 0.98);--xt-notification-size:11pt;--xt-header-dialog-fg:#89A;--xt-header-link:#34345C;--xt-dead-link:#34345C;--xt-qr-link-border:rgb(199, 203, 225) rgb(199, 203, 225) rgb(184, 188, 210);--xt-qr-bg:linear-gradient(#E5E9FF, #D6DAF0) repeat scroll 0% 0% transparent;--xt-menu-fg:#000;--xt-entry-size:12pt;--xt-entry-focus-bg:rgba(255, 255, 255, .33);--xt-link-hover-bg:#D9DDF3;--xt-unread:rgba(214, 218, 240, 0.5)}:root.burichan.anonymize $site$info$name::before{font-size:12pt}:root.tomorrow{--xt-background:#282A2E;--xt-border:#111;--xt-border-field-focus:rgb(129, 162, 190);--xt-border-highlight:rgba(145, 182, 214, .8);--xt-header-dialog-bg:rgba(40,42,46,0.9);--xt-header-dialog-fg:#C5C8C6;--xt-header-link:#81A2BE;--xt-dead-link:#81A2BE;--xt-inline:rgba(0, 0, 0, .14);--xt-qr-preview-bg:rgba(255, 255, 255, .15);--xt-qr-link-border:rgb(25, 27, 31) rgb(25, 27, 31) rgb(10, 12, 16);--xt-qr-bg:linear-gradient(#37393D, #282A2E) repeat scroll 0% 0% transparent;--xt-menu-fg:#C5C8C6;--xt-entry-focus-bg:rgba(0, 0, 0, .33);--xt-unread:rgba(40, 42, 46, 0.5);--xt-watcher:#c5c8c6;--xt-unread-line:rgb(197, 200, 198);--xt-filter-highlight:rgba(145, 182, 214, .5);--xt-highlight-shadow:rgba(64, 192, 255, .7);--xt-watched-border:rgb(64, 192, 255);--xt-qphl:rgba(145, 182, 214, .8);--xt-highlight-side-arrow:rgb(155, 185, 210);--xt-fxt-fg:#c5c8c6}:root.tomorrow #arc-list span.quote{color:#B5BD68}:root.tomorrow #header-bar a, :root.tomorrow #notifications a{color:#81A2BE}:root.tomorrow.shortcut-icons .native-settings{background-image:url(\'//s.4cdn.org/image/favicon-ws.ico\')}:root.tomorrow #qr .field{background-color:rgb(26, 27, 29);color:rgb(197,200,198);border-color:rgb(40, 41, 42)}:root.tomorrow #qr .field:focus,:root.tomorrow #qr .field.focus{border-color:var(--xt-border-field-focus) !important;background-color:rgb(30,32,36)}:root.tomorrow .persona button{background:linear-gradient(to bottom, #2E3035, #222427) no-repeat;color:rgb(197,200,198);border-color:rgb(40, 41, 42);outline:none}:root.tomorrow .persona button::-moz-focus-inner{border:none}:root.tomorrow .persona button:focus{border-color:rgb(129, 162, 190)}:root.tomorrow #qr.sjis-preview #sjis-toggle,:root.tomorrow #qr.tex-preview #tex-preview-button{background:rgb(26, 27, 29)}:root.tomorrow #qr select,:root.tomorrow #file-n-submit>input,:root.tomorrow #qr-draw-button{border-color:rgb(40, 41, 42);background:unset}:root.tomorrow #qr select>option{background-color:var(--xt-background)}:root.tomorrow #qr-filename{color:rgb(197,200,198)}:root.photon{--xt-background:#DDD;--xt-border:#CCC;--xt-border-field-focus:#EA8;--xt-border-highlight:rgba(221, 0, 0, .8);--xt-header-dialog-bg:rgba(221, 221, 221, 0.98);--xt-header-dialog-fg:#333;--xt-dead-link:#F60;--xt-qr-link-border:rgb(206, 206, 206) rgb(206, 206, 206) rgb(191, 191, 191);--xt-qr-bg:linear-gradient(#ECECEC, #DDD) repeat scroll 0% 0% transparent;--xt-menu-fg:#333;--xt-entry-focus-bg:rgba(255, 255, 255, .33);--xt-unread:rgba(221, 221, 221, 0.5);--xt-watcher-quoting-you:#00F;--xt-watcher:#333;--xt-fxt-fg:#333}:root.photon #arc-list tr:nth-of-type(odd) span.quote{color:#C0E17A}:root.spooky{--xt-background:#171526;--xt-link-hover-bg:#1A1829;--xt-border:#707070;--xt-border-field-focus:#98E;--xt-border-highlight:rgba(145, 182, 214, .8);--xt-header-dialog-bg:rgba(23, 21, 38, 0.98);--xt-header-dialog-fg:#C49756;--xt-header-link:#FE9600;--xt-dead-link:#FE9600;--xt-qr-link-border:rgb(8, 6, 23) rgb(8, 6, 23) rgb(0, 0, 8);--xt-qr-bg:linear-gradient(#262435, #171526) repeat scroll 0% 0% transparent;--xt-entry-focus-bg:rgba(255, 255, 255, .33);--xt-unread:rgba(23, 21, 38, 0.5);--xt-watcher:#fe9600;--xt-unread-line:rgb(197, 200, 198);--xt-filter-highlight:rgba(145, 182, 214, .5);--xt-qphl:rgba(145, 182, 214, .8);--xt-highlight-side-arrow:rgb(155, 185, 210);--xt-fxt-fg:#f0f8ffd1}:root.spooky #arc-list span.quote{color:#634C2C}:root.spooky.shortcut-icons .native-settings{background-image:url(\'//s.4cdn.org/image/favicon-ws.ico\')}:root.spooky #qr .field{background-color:rgb(26, 27, 29);color:rgb(197,200,198);border-color:rgb(40, 41, 42)}:root.spooky #qr .field:focus,:root.spooky #qr .field.focus{border-color:rgb(254, 150, 0) !important;background-color:rgb(30,32,36)}:root.spooky .persona button{background:linear-gradient(to bottom, #2E3035, #222427) no-repeat;color:rgb(197,200,198);border-color:rgb(40, 41, 42);outline:none}:root.spooky .persona button::-moz-focus-inner{border:none}:root.spooky .persona button:focus{border-color:rgb(254, 150, 0)}:root.spooky #qr.sjis-preview #sjis-toggle,:root.spooky #qr.tex-preview #tex-preview-button{background:rgb(26, 27, 29)}:root.spooky #qr select,:root.spooky #file-n-submit>input,:root.spooky #qr-draw-button{border-color:rgb(40, 41, 42);background:unset}:root.spooky #qr-filename{color:rgb(197,200,198)}:root.spooky .unread-line{visibility:visible;opacity:1}svg.icon{height:14px;position:static;width:auto}:root.shortcut-icons #shortcuts .shortcut{padding-top:0;padding-bottom:0;display:flex;height:14px;min-width:16px}:root.shortcut-icons #shortcuts .icon--alt-text,:root:not(.shortcut-icons) .shortcut svg{display:none}:root.shortcut-icons .shortcut.brackets-wrap::before,:root.shortcut-icons .shortcut.brackets-wrap::after{display:none}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}:root{--xt-fxt-bg:var(--xt-background);--xt-fxt-border:var(--xt-border)}.fxt-card{color:var(--xt-fxt-fg, #000);background-color:var(--xt-fxt-bg, #000);padding:16px;border:1px solid var(--xt-fxt-border);border-radius:12px;width:400px;display:flex;flex-direction:column;gap:8px;white-space:pre-line;word-break:break-word}.fxt-meta{display:flex;flex-direction:row;gap:8px}.fxt-meta_profile{display:flex;flex-direction:row;gap:8px}.fxt-meta_profile img{height:48px;width:48px;aspect-ratio:1;border-radius:100%;overflow:hidden}.fxt-meta_author{display:flex;flex-direction:column}.fxt-meta_author_username{font-weight:bold}.fxt-stats_meta{padding-top:8px;display:flex;flex-direction:row;justify-content:space-evenly;gap:8px}.fxt-stats_meta span{display:inline-flex;align-items:center;gap:4px}.fxt-poll{display:flex;flex-direction:column;gap:4px}.fxt-choice{position:relative;display:flex;align-items:center;justify-content:space-between;font-size:75%;height:24px}.fxt-choice.highlight{font-weight:bold}.fxt-choice_label{margin-left:6px;z-index:1}.fxt-choice_percentage{margin-right:6px;z-index:1}.fxt-choice .bar{position:absolute;top:0;left:0;height:24px;border-radius:4px;background-color:currentColor;opacity:.3;z-index:0}.fxt-total-votes{font-size:75%;opacity:.5}.fxt-media{width:100%;height:100%;border-radius:4px;overflow:hidden}.fxt-media :is(img, video){display:block;max-width:100%;height:100%;object-fit:contain;object-position:center}.fxt-media_container{display:grid;gap:0;grid-template-columns:1fr}.fxt-media_container.fxt-media-multiple{gap:4px;grid-template-columns:1fr 1fr}.fxt-quote{border:1px solid var(--xt-fxt-border);border-radius:12px;overflow:hidden}.fxt-quote .fxt-meta_profile img{height:24px;width:24px}.fxt-quote .fxt-meta{display:flex;flex-direction:row;align-items:center;gap:8px;padding:4px}'+(B=[{ name:"audio",data:"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAMBQTFRFAAAAAEmSADyHADN6CEOPKmWmADiKNV6lZoO5E2asU3u8B02hXYTAFXK8BEakS3i7MGS0E1mwZYzHSHjCYIrLIGDICFPDHXrIFWnBEGDDdZzWB1G2UYHMH4DPBU60EYrSSX7PGofXfajkeaPgQHzVSoHSDmHLF3vRjLbtea3sa6rsXJ3oSaHrYZXhW5blIKzwPZrqVozbKp7sRonfHpjoJ4vhRHrQLn/eNXnaJ33fNnHMJGvUFG3ZI2THBlPGAU2+9r1cgwAAACh0Uk5TAAcRGSIrO0RQUF9qdnl5hISEiaSoqqqxssnPz9DY2ery+vv7/P39/p/dKS0AAACXSURBVHjaXdDZEoIwDAXQVMuiIFrcd1FQWSqiouD6/38ltVNkel+SnMnkIfAPwrrZBB5Ft3uzlZs9Bnyuewml9HzLnwISP4hSZz4clxujVkNBAETAVeVNpy9BW8BdhpcMbw6oPPphoE027g80u8s21HUQ5gzMvX9gYGXH+EIK8MLotMUAeLpbElTAIo0dC1hqwIth4MoTvt45DOQxQMWhAAAAAElFTkSuQmCC"},{name:"bitchute", data:"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAMBQTFRFAAAAgICAzDMzzDMz0i0tzjEx0i0t0S4u0C8v1Csr1Ssr1Csr1Csr0ykp1Ckp0yws1Soq1Soq0i0t1Soq1Csr1Csr1Ckp1ikp1Skp1ikp1ikp1ikp1ygo1ygo1ygo1igo1ygo1ygo1ygo2Ccn2Ccn+enp9+Pj9t7e9NHR9MzM8bu78LS076ys65ub65WV6YqK6ImJ54KC5XR05G5u4V9f4FRU3UhI3UVF3UFB3Dw82jU12S8v2Soq2Ccn2CYm2CQklRbHSwAAACV0Uk5TAAIFChEaIicxO0JNWWNqb3R4iZmboaettLzF1t3j6evt8/f7/Ut/7/wAAAC+SURBVHjaTcfRVoJAFIXhPaGZJqQVGIgWDFYWUZnkqOw57/9Wji4Xy++/OGfDUddBGMdh0FM46Yymmo6ejjtwulHBs2LSBbxHXgg9DDOKtZZ0RyT3EZNmv91Z7uttbWyCZzGfdbkWWS/Kt7LJkMvva7VYiZj3748vq5HK3/JnuRJrqk31L3OEbHYuko2LE/RntK6z+QDqLmMrHynAe2r3y9gDcJOSLEg9iwYKQD+hTh+Gvn/bu8LRfRIF7m0dAEgnJl0bT2c0AAAAAElFTkSuQmCC"},{name:"clyp", data:"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAAXNSR0IArs4c6QAAAC1QTFRF////8vn9zOX2v9/0s9jxptLvmsztjcXrgL/pdLjmZ7LkWqviTaXgQZ7dNJjb3UEC1wAAAFpJREFUeNpjeAcFDMiMV+egjKd5EMbzBs06MOOQgpIOiPFGSUFJ9dw7hjfKQIaS6DuGV0IgBhNQ6gaQodIHZLxrUlDSegdiPE5QswMz3l3WewdhvNgHYmDYDgDke1tpAZA/swAAAABJRU5ErkJggg=="},{name:"dailymotion",data:"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAAXNSR0IArs4c6QAAAMxJREFUeNqFkdENhSAMRRu/bUz4dBMGYA1GYQs/+XQFB3AFV3AO+q634SU+TR4NxdjT20IFa7hciFqnc25zm06tIQoj3Q1axbqpzU1NKyOOjLtasuyGsBAZd/EFFuHDNltoOKkDq6x9ZWT8XhkugBd8u0qIyFeKLtQoVuAzUSJV0DPlBFkbcxNObKZNp3iYKsQKEOgAzdT4AgJLpg7QO8AS3uZh61uJ3mQh8NJkiF4gscn1eU3pGtjQeDxUf2oi8vPUt2FxRPdhMfp33B/2Tf349B8MPAAAAABJRU5ErkJggg=="},{name:"gfycat", @@ -321,47 +321,47 @@ Pt.callbackNodes("Post",n),x.after(o,s),x.event("PostsInserted",null,o.parentNod ;if(!t||t.nodes.root!==e.target)return;const o=!!be.hr[t.fullID]?.parentNode;return be.update(t),a["Scroll to Last Read Post"]&&"PostsInserted"===e.type&&!o&&be.hr[t.fullID]?.parentNode?Ye.scrollToIfNeeded(be.hr[t.fullID],!0):void 0},sync:()=>i.threads.forEach((function(e){const t=be.db.get({boardID:e.board.ID,threadID:e.ID})||0;if(t!==be.lastReadPost[e.fullID]&&(be.lastReadPost[e.fullID]=t,e.nodes.root?.parentNode))return be.update(e)})),update(e){let t;const o=be.lastReadPost[e.fullID];let a=0,n=0,s=null;e.posts.forEach((function(t){if(t.isReply&&e.nodes.root.contains(t.nodes.root)){if(a++,t.ID<=o)return n++;if((!s||t.IDo:e.OP.ID>o;e.nodes.root.classList.toggle("unread-thread",l) ;let d=be.markReadLink[e.fullID];return d||(d=be.markReadLink[e.fullID]=x.el("a",{className:"unread-mark-read brackets-wrap",href:"javascript:;",textContent:"Mark Read"}),x.on(d,"click",be.markRead)),(t=x(i.SITE.selectors.threadDivider,e.nodes.root))?x.before(t,d):x.add(e.nodes.root,d)},markRead(){const e=w.threadFromNode(this);return be.lastReadPost[e.fullID]=e.lastPost,be.db.set({boardID:e.board.ID,threadID:e.ID,val:e.lastPost}),x.rm(be.hr[e.fullID]),e.nodes.root.classList.remove("unread-thread"),ve.update(i.SITE.ID,e.board.ID,e.ID,{last:e.lastPost,unread:0,quotingYou:0})}},ve={init(){let e;if(this.enabled=a["Thread Watcher"]){switch(this.shortcut=e=x.el("a",{id:"watcher-link",title:"Thread Watcher",href:"javascript:;"}),M.set(this.shortcut,"eye","Watcher"),this.db=new q("watchedThreads",this.refresh,!0),this.dbLM=new q("watcherLastModified",null,!0),this.dialog=X.dialog("thread-watcher",{ innerHTML:' Thread Watcher × '}),this.status=x("#watcher-status",this.dialog),this.list=this.dialog.lastElementChild,this.refreshButton=x(".refresh",this.dialog),this.menuButton=x(".menu-button",this.dialog),this.closeButton=x(".move > .close",this.dialog),this.unreaddb=fe.db||be.db||new q("lastReadPosts"),this.unreadEnabled=a["Remember Last Read Post"],M.set(this.refreshButton,"refresh"),M.set(this.menuButton,"caretDown"),x.on(s,"QRPostSuccessful",this.cb.post),x.on(e,"click",this.toggleWatcher),x.on(this.refreshButton,"click",this.buttonFetchAll),x.on(this.closeButton,"click",this.toggleWatcher),this.menu.addHeaderMenuEntry(),x.onExists(r,"body",this.addDialog),i.VIEW){case"index":x.on(s,"IndexUpdate",this.cb.onIndexUpdate) -;break;case"thread":x.on(s,"ThreadUpdate",this.cb.onThreadRefresh)}if(a["Fixed Thread Watcher"]&&x.addClass(r,"fixed-watcher"),a["Persistent Thread Watcher"]||(x.addClass(ve.shortcut,"disabled"),this.dialog.hidden=!0),Ye.addShortcut("watcher",e,510),ve.initLastModified(),ve.fetchAuto(),x.on(window,"visibilitychange focus",(()=>x.queueTask(ve.fetchAuto))),a.Menu&&Ie.enabled&&se.menu.addEntry({el:x.el("a",{href:"javascript:;",className:"has-shortcut-text"},{innerHTML:'Alt+click'}),order:6,open({thread:e}){return"catalog"===a["Index Mode"]&&(this.el.firstElementChild.textContent=ve.isWatched(e)?"Unwatch":"Watch",this.cb&&x.off(this.el,"click",this.cb),this.cb=function(){return x.event("CloseMenu"),ve.toggle(e)},x.on(this.el,"click",this.cb),!0)}}),["index","thread"].includes(i.VIEW))return c.Post.push({name:"Thread Watcher",cb:this.node}),c.CatalogThread.push({name:"Thread Watcher",cb:this.catalogNode})}},isWatched:e=>!!ve.db?.get({ -boardID:e.board.ID,threadID:e.ID}),isWatchedRaw:(e,t)=>!!ve.db?.get({boardID:e,threadID:t}),setToggler:(e,t)=>(e.classList.toggle("watched",t),e.title=(t?"Unwatch":"Watch")+" Thread"),node(){let e;if(this.isReply)return;this.isClone?e=x(".watch-thread-link",this.nodes.info):(e=x.el("button",{type:"button",className:"watch-thread-link"}),M.set(e,"heart"),x.before(x("input",this.nodes.info),e));const t=i.SITE.ID,o=this.board.ID,a=this.thread.ID,n=ve.db.get({siteID:t,boardID:o,threadID:a});return ve.setToggler(e,!!n),x.on(e,"click",ve.cb.toggle),n&&null==n.excerpt?x.queueTask((()=>ve.update(t,o,a,{excerpt:w.threadExcerpt(this.thread)}))):void 0},catalogNode(){return ve.isWatched(this.thread)&&x.addClass(this.nodes.root,"watched"),x.on(this.nodes.root,"mousedown click",(e=>{if(0===e.button&&e.altKey)return"click"===e.type&&ve.toggle(this.thread),e.preventDefault()}))},addDialog(){if(Pt.isThisPageLegit())return ve.build(),x.prepend(s.body,ve.dialog)}, -toggleWatcher:()=>(x.toggleClass(ve.shortcut,"disabled"),ve.dialog.hidden=!ve.dialog.hidden),cb:{openAll(){if(!x.hasClass(this,"disabled")){for(var e of S("a.watcher-link",ve.list))x.open(e.href);x.event("CloseMenu")}},openUnread(){if(!x.hasClass(this,"disabled")){for(var e of S(".replies-unread > a.watcher-link",ve.list))x.open(e.href);x.event("CloseMenu")}},openDeads(){if(!x.hasClass(this,"disabled")){for(var e of S(".dead-thread.replies-unread > a.watcher-link",ve.list))x.open(e.href);x.event("CloseMenu")}},pruneDeads(){if(!x.hasClass(this,"disabled")){for(var{siteID:e,boardID:t,threadID:o,data:a}of ve.getAll())a.isDead&&ve.db.delete({siteID:e,boardID:t,threadID:o});ve.refresh(),x.event("CloseMenu")}},pruneReadDeads(){if(!x.hasClass(this,"disabled")){for(var{siteID:e,boardID:t,threadID:o,data:a}of ve.getAll())a.isDead&&!a.unread&&ve.db.delete({siteID:e,boardID:t,threadID:o});ve.refresh(),x.event("CloseMenu")}},dismiss(){ -for(var{siteID:e,boardID:t,threadID:o,data:a}of ve.getAll())a.quotingYou&&ve.update(e,t,o,{dismiss:a.quotingYou||0});x.event("CloseMenu")},toggle(){const{thread:e}=w.postFromNode(this);ve.toggle(e)},rm(){const{siteID:e}=this.parentNode.dataset,[t,o]=this.parentNode.dataset.fullID.split(".");ve.rm(e,t,+o)},post(e){const{boardID:t,threadID:o,postID:n}=e.detail,s=he.delay();n===o?a["Auto Watch"]&&ve.addRaw(t,o,{},s):a["Auto Watch Reply"]&&ve.add(i.threads.get(t+"."+o)||new j(o,i.boards[t]||new ce(t)),s)},onIndexUpdate(e){const{db:t}=ve,o=i.SITE.ID,n=i.BOARD.ID;let s=0;for(var r in t.data[o].boards[n]){var l=t.data[o].boards[n][r];if(!l?.isDead&&!e.detail.threads.includes(`${n}.${r}`)){if(!e.detail.threads.some((e=>+e.split(".")[1]>r)))continue;a["Auto Prune"]||!l||"object"!=typeof l?(t.delete({boardID:n,threadID:r}),s++):ve.fetchStatus({siteID:o,boardID:n,threadID:r,data:l})}}if(s)return ve.refresh()},onThreadRefresh(e){const t=i.threads.get(e.detail.threadID) -;if(e.detail[404]&&ve.isWatched(t))return ve.add(t)}},requests:[],fetched:0,fetch(e,{siteID:t,force:o},a,n){0===ve.requests.length&&(ve.status.textContent="...",x.addClass(ve.refreshButton,"spin"));const s=t===i.SITE.ID?x.ajax:Fe.ajax;o&&delete x.lastModified.ThreadWatcher?.[e];const r=x.whenModified(e,"ThreadWatcher",(function(){if(!this.finished)return this.finished=!0,ve.fetched++,ve.fetched===ve.requests.length?ve.clearRequests():ve.status.textContent=`${Math.round(ve.fetched/ve.requests.length*100)}%`,n.apply(this,a)}),{timeout:f,ajax:s});return ve.requests.push(r)},clearRequests:()=>(ve.requests=[],ve.fetched=0,ve.status.textContent="",x.rmClass(ve.refreshButton,"spin")),abort(){for(var e of(delete ve.syncing,ve.requests))e.finished||(e.finished=!0,e.abort());return ve.clearRequests()},initLastModified(){const e=x.lastModified.ThreadWatcher||(x.lastModified.ThreadWatcher=p());for(var t in ve.dbLM.data){var o=ve.dbLM.data[t];for(var a in o.boards){var i=o.boards[a];if(ve.db.get({ -siteID:t,boardID:a}))for(var n in i){var s=i[n];e[n]=s}else ve.dbLM.delete({siteID:t,boardID:a})}}},fetchAuto(){let e;if(clearTimeout(ve.timeout),!a["Auto Update Thread Watcher"])return;const{db:t}=ve,o=a["Show Page"]||ve.unreadEnabled&&a["Show Unread Count"]?3e5:2*m,i=Date.now();return(i-o>=(e=t.data.lastChecked||0)||e>i)&&!s.hidden&&s.hasFocus()&&ve.fetchAllStatus(o),ve.timeout=setTimeout(ve.fetchAuto,o)},buttonFetchAll:()=>ve.syncing||ve.requests.length?ve.abort():ve.fetchAllStatus(),fetchAllStatus(e=0){ve.status.textContent="...",x.addClass(ve.refreshButton,"spin"),ve.syncing=!0;const t=[ve.db,ve.unreaddb,pe.db].filter((e=>e));let o=0;return t.map((a=>a.forceSync((function(){if(++o===t.length){let t;if(!ve.syncing)return;if(delete ve.syncing,0>(t=Date.now()-(ve.db.data.lastChecked||0))||t>=e){let e;const{db:t}=ve,o=Date.now(),i=!(o-2*m<(e=t.data.lastChecked2||0)&&e<=o),n=ve.getAll(!0);for(var a of n)ve.fetchBoard(a,i);t.setLastChecked(),i&&t.setLastChecked("lastChecked2")} -if(ve.fetched===ve.requests.length)return ve.clearRequests()}}))))},fetchBoard(e,t){if(!e.some((e=>!e.data.isDead)))return;let o=!1;for(var n of e){var{data:s}=n;s.isDead||-1===s.last||(a["Show Page"]&&null==s.page&&(o=!0),null==s.modified&&(o=n.force=!0))}const{siteID:r,boardID:l}=e[0],d=i.sites[r];if(!d)return;const c=t&&d.threadModTimeIgnoresSage?"catalogJSON":"threadsListJSON",h=d.urls[c]?.({siteID:r,boardID:l});return h?ve.fetch(h,{siteID:r,force:o},[e,h],ve.parseBoard):void 0},parseBoard(e,t){let o,n;if(200!==this.status)return;const{siteID:s,boardID:r}=e[0],l=this.getResponseHeader("Last-Modified");ve.dbLM.extend({siteID:s,boardID:r,val:x.item(t,l)});const d=p();let c=0,h=0,u=null;try{c=this.response[0]?.threads.length||0;for(let e=0;e=h-c;ve.update(s,r,f,{page:o,lastPage:w})}ve.unreadEnabled&&a["Show Unread Count"]&&(v!==m.modified||null!=A&&A!==m.replies)&&((n.newData||(n.newData={})).modified=v,ve.fetchStatus(n))}else ve.fetchStatus(n)}},fetchStatus(e){const{siteID:t,boardID:o,threadID:a,data:n,force:s}=e,r=i.sites[t]?.urls.threadJSON?.({siteID:t,boardID:o,threadID:a});if(r&&(!n.isDead||s)&&-1!==n.last)return ve.fetch(r,{siteID:t,force:s},[e],ve.parseStatus)},parseStatus(e,t){let o,n,{siteID:s,boardID:r,threadID:l,data:d,newData:c,force:h}=e;const u=i.sites[s];if(200===this.status&&this.response){let e;n=this.response.posts[this.response.posts.length-1].no;const i=this.response.posts.length-1;if(o=e=!(!this.response.posts[0].archived&&!t),o&&a["Auto Prune"])return void ve.rm(s,r,l);if(n===d.last&&o===d.isDead&&e===d.isArchived)return;const h=ve.unreaddb.get({siteID:s, -boardID:r,threadID:l,defaultValue:0});let b=d.unread||0,v=d.quotingYou||0;const A=!!pe.db?.get({siteID:s,boardID:r,threadID:l,postID:l});for(var p of this.response.posts)if(!(p.no<=(d.last||0)||p.no<=h||pe.db?.get({siteID:s,boardID:r,threadID:l,postID:p.no}))){var g=!1;if(!a["Require OP Quote Link"]&&A)g=!0;else if(pe.db&&p.com){var f,m=u.regexp.quotelinkHTML;for(m.lastIndex=0;f=m.exec(p.com);)if(pe.db.get({siteID:s,boardID:f[1]?encodeURIComponent(f[1]):r,threadID:f[2]||l,postID:f[3]||f[2]||l})){g=!0;break}}(!b||!v&&g)&&Je.isHidden(u.Build.parseJSON(p,{siteID:s,boardID:r}))||(b++,g&&(v=p.no))}return c||(c={}),x.extend(c,{last:n,replies:i,isDead:o,isArchived:e,unread:b,quotingYou:v}),ve.update(s,r,l,c)}if(404===this.status){const o=i.sites[s]?.urls.archivedThreadJSON?.({siteID:s,boardID:r,threadID:l});return!t&&o?ve.fetch(o,{siteID:s,force:h},[e,!0],ve.parseStatus):u.mayLackJSON&&null==d.last?ve.update(s,r,l,{last:-1}):ve.update(s,r,l,{isDead:!0})}},getAll(e){const t=[] -;for(var o in ve.db.data){var n=ve.db.data[o];for(var s in n.boards){var r,l=n.boards[s];if(!a["Current Board"]||o===i.SITE.ID&&s===i.BOARD.ID)for(var d in e&&t.push(r=[]),l){var c=l[d];c&&"object"==typeof c&&(e?r:t).push({siteID:o,boardID:s,threadID:d,data:c})}}}return t},makeLine(e,t,o,n){let s;const r=x.el("a",{textContent:"✕",href:"javascript:;"});x.on(r,"click",ve.cb.rm);let{excerpt:l,isArchived:d}=n;l||(l=`/${t}/ - No.${o}`),a["Show Site Prefix"]&&(l=ve.prefixes[e]+l);const c=x.el("a",{href:i.sites[e]?.urls.thread({siteID:e,boardID:t,threadID:o},d)||"",title:l,className:"watcher-link"});if(a["Show Page"]&&null!=n.page&&(s=x.el("span",{textContent:`[${n.page}]`,className:"watcher-page"}),x.add(c,s)),ve.unreadEnabled&&a["Show Unread Count"]&&null!=n.unread){const e=x.el("span",{textContent:`(${n.unread})`,className:"watcher-unread"});x.add(c,e)}const h=x.el("span",{textContent:l,className:"watcher-title"});x.add(c,h);const u=x.el("div"),p=`${t}.${o}`;return u.dataset.fullID=p, -u.dataset.siteID=e,"thread"===i.VIEW&&p===`${i.BOARD}.${i.THREADID}`&&x.addClass(u,"current"),n.isDead&&x.addClass(u,"dead-thread"),a["Show Page"]&&(n.lastPage&&x.addClass(u,"last-page"),null!=n.page&&(u.dataset.page=n.page)),ve.unreadEnabled&&a["Show Unread Count"]&&(0===n.unread&&x.addClass(u,"replies-read"),n.unread&&x.addClass(u,"replies-unread"),(n.quotingYou||0)>(n.dismiss||0)&&x.addClass(u,"replies-quoting-you")),x.add(u,[r,x.tn(" "),c]),u},setPrefixes(e){const t=p();for(var{siteID:o}of e)if(!(o in t)){for(var a=0,i="",n=Object.keys(t);n.length>0;){a++,i=o.slice(0,a);var s=[];for(var r of n)r.slice(0,a)===i?s.push(r):t[r].length [data-site-i-d='${e}'][data-full-i-d='${t}.${o}']`,ve.dialog)){const a=ve.makeLine(e,t,o,n);return x.replace(r,a),ve.refreshIcon()}return ve.refresh()}},set404(e,t,o){let i;return(i=ve.db?.get({boardID:e,threadID:t}))?a["Auto Prune"]?(ve.db.delete({boardID:e,threadID:t}),o()):i.isDead&&null==i.isArchived&&null==i.page&&null==i.lastPage&&null==i.unread&&null==i.quotingYou?o():ve.db.extend({boardID:e,threadID:t,val:{isDead:!0,isArchived:void 0,page:void 0,lastPage:void 0,unread:void 0,quotingYou:void 0}},o):o()},toggle(e){const t=i.SITE.ID,o=e.board.ID,a=e.ID;return ve.db.get({boardID:o,threadID:a})?ve.rm(t,o,a):ve.add(e)},add(e,t){const o={},n=i.SITE.ID,s=e.board.ID,r=e.ID;if(e.isDead){if(a["Auto Prune"]&&ve.db.get({boardID:s,threadID:r}))return void ve.rm(n,s,r,t);o.isDead=!0}return e.OP&&(o.excerpt=w.threadExcerpt(e)),ve.addRaw(s,r,o,t)},addRaw(e,t,o,n){const s=ve.db.get({boardID:e,threadID:t,defaultValue:p()});delete s.last,delete s.modified,x.extend(s,o), -ve.db.set({boardID:e,threadID:t,val:s},n),ve.refresh();const r={siteID:i.SITE.ID,boardID:e,threadID:t,data:o,force:!0};return a["Show Page"]&&!o.isDead?ve.fetchBoard([r]):ve.unreadEnabled&&a["Show Unread Count"]?ve.fetchStatus(r):void 0},rm:(e,t,o,a)=>(ve.db.delete({siteID:e,boardID:t,threadID:o},a),ve.refresh()),menu:{init(){if(!a["Thread Watcher"])return;const e=this.menu=new X.Menu("thread watcher");return x.on(x(".menu-button",ve.dialog),"click",(function(t){return e.toggle(t,this,ve)})),this.addMenuEntries()},addHeaderMenuEntry(){if("thread"!==i.VIEW)return;const e=x.el("a",{href:"javascript:;"});return Ye.menu.addEntry({el:e,order:60,open(){const[t,o,a]=ve.db.get({boardID:i.BOARD.ID,threadID:i.THREADID})?["unwatch-thread","watch-thread","Unwatch thread"]:["watch-thread","unwatch-thread","Watch thread"];return x.addClass(e,t),x.rmClass(e,o),e.textContent=a,!0}}),x.on(e,"click",(()=>ve.toggle(i.threads.get(`${i.BOARD}.${i.THREADID}`))))},addMenuEntries(){const e=[];e.push({ -text:"Open all threads",cb:ve.cb.openAll,open(){return this.el.classList.toggle("disabled",!ve.list.firstElementChild),!0}}),e.push({text:"Open unread threads",cb:ve.cb.openUnread,open(){return this.el.classList.toggle("disabled",!x(".replies-unread",ve.list)),!0}});const t=function(){return this.el.classList.toggle("disabled",!x(".dead-thread",ve.list)),!0};for(var{text:o,title:a,cb:i,open:n}of(e.push({text:"Open unread dead threads",cb:ve.cb.openDeads,open:t}),e.push({text:"Prune all dead threads",cb:ve.cb.pruneDeads,open:t}),e.push({text:"Prune read dead threads",cb:ve.cb.pruneReadDeads,open:t}),e.push({text:"Dismiss posts quoting you",title:"Unhighlight the thread watcher icon and threads until there are new replies quoting you.",cb:ve.cb.dismiss,open(){return this.el.classList.toggle("disabled",!x.hasClass(ve.shortcut,"replies-quoting-you")),!0}}),e)){var s={el:x.el("a",{textContent:o,href:"javascript:;"})};a&&(s.el.title=a),x.on(s.el,"click",i),s.open=n.bind(s), -this.menu.addEntry(s)}for(var r in h.threadWatcher){var l=h.threadWatcher[r];this.addCheckbox(r,l[1])}},addCheckbox(e,t){const o={type:"thread watcher",el:X.checkbox(e,e.replace(" Thread Watcher",""))};o.el.title=t;const a=o.el.firstElementChild;return"Show Unread Count"!==e||ve.unreadEnabled||(a.disabled=!0,x.addClass(o.el,"disabled"),o.el.title+="\n[Remember Last Read Post is disabled.]"),x.on(a,"change",x.cb.checked),["Current Board","Show Page","Show Unread Count","Show Site Prefix"].includes(e)&&x.on(a,"change",ve.refresh),["Show Page","Show Unread Count","Auto Update Thread Watcher"].includes(e)&&x.on(a,"change",ve.fetchAuto),this.menu.addEntry(o)}}};var Ae={init(){if("thread"!==i.VIEW||!a["Reply Pruning"])return;this.container=x.frag(),this.summary=x.el("span",{hidden:!0,className:"summary"}),this.summary.style.cursor="pointer",x.on(this.summary,"click",(()=>(this.inputs.enabled.checked=!this.inputs.enabled.checked,x.event("change",null,this.inputs.enabled)))) -;const e=X.checkbox("Prune Replies","Show Last",a["Prune All Threads"]),t=x.el("span",{title:"Maximum number of replies to show."},{innerHTML:' '});return x.prepend(t,e),this.inputs={enabled:e.firstElementChild,replies:t.lastElementChild},this.setEnabled.call(this.inputs.enabled),x.on(this.inputs.enabled,"change",this.setEnabled),x.on(this.inputs.replies,"change",x.cb.value),Ye.menu.addEntry({el:t,order:190}),c.Thread.push({name:"Reply Pruning",cb:this.node})},position:0,hidden:0,hiddenFiles:0,total:0,totalFiles:0,setEnabled(){const e=xe.input;return this.checked&&e?.checked&&(e.checked=!1,x.event("change",null,e)),Ae.active=this.checked},showIfHidden(e){if(Ae.container&&x(`#${e}`,Ae.container))return Ae.inputs.enabled.checked=!1,x.event("change",null,Ae.inputs.enabled)},node(){let e;return Ae.thread=this,this.isSticky&&(Ae.active=Ae.inputs.enabled.checked=!0, -xe.input&&(a["Thread Quotes"]=xe.input.checked=!1)),this.posts.forEach((function(e){if(e.isReply&&(Ae.total++,e.file))return Ae.totalFiles++})),Ae.active&&/^#p\d+$/.test(location.hash)&&1<=(e=this.posts.keys.indexOf(location.hash.slice(2)))&&e<1+Math.max(Ae.total-+a["Max Replies"],0)&&(Ae.active=Ae.inputs.enabled.checked=!1),x.after(this.OP.nodes.root,Ae.summary),x.on(Ae.inputs.enabled,"change",Ae.update),x.on(Ae.inputs.replies,"change",Ae.update),x.on(s,"ThreadUpdate",Ae.updateCount),x.on(s,"ThreadUpdate",Ae.update),Ae.update()},updateCount(e){if(!e.detail[404])for(var t of e.detail.newPosts)Ae.total++,i.posts.get(t).file&&Ae.totalFiles++},update(){let e,t,o;const n=Ae.hidden,r=Ae.active?Math.max(Ae.total-+a["Max Replies"],0):0,l=s.body.clientHeight-window.scrollY,{posts:d}=Ae.thread;if(Ae.hiddenr){const e=x.frag();for(;Ae.hidden>r&&Ae.position>0;)if(o=d.get(d.keys[--Ae.position]),o.isReply&&!o.isFetchedQuote){for(;(t=Ae.container.lastChild)&&t!==o.nodes.root;)x.prepend(e,t);x.prepend(e,o.nodes.root),Ae.hidden--,o.file&&Ae.hiddenFiles--}x.after(Ae.summary,e),x.event("PostsInserted",null,Ae.summary.parentNode)}if(Ae.summary.textContent=Ae.active?i.SITE.Build.summaryText("+",Ae.hidden,Ae.hiddenFiles):i.SITE.Build.summaryText("-",Ae.total,Ae.totalFiles),Ae.summary.hidden=Ae.total<=+a["Max Replies"],n!==r&&(e=Ye.getTopOf(x(".board")))<0)return window.scrollBy(0,Math.max(s.body.clientHeight-l,window.scrollY+e)-window.scrollY)}},xe={init(){a["Quote Threading"]&&"thread"===i.VIEW&&(this.controls=x.el("label",{innerHTML:' Threading'}),this.threadNewLink=x.el("span",{className:"brackets-wrap threadnewlink",hidden:!0}), -x.extend(this.threadNewLink,{innerHTML:'Thread New Posts'}),this.input=x("input",this.controls),this.input.checked=a["Thread Quotes"],x.on(this.input,"change",this.setEnabled),x.on(this.input,"change",this.rethread),x.on(this.threadNewLink.firstElementChild,"click",this.rethread),x.on(s,"4chanXInitFinished",(()=>{this.ready=!0})),Ye.menu.addEntry(this.entry={el:this.controls,order:99}),c.Thread.push({name:"Quote Threading",cb:this.setThread}),c.Post.push({name:"Quote Threading",cb:this.node}))},parent:p(),children:p(),inserted:p(),toggleThreading(){this.setThreadingState(!a["Thread Quotes"])},setThreadingState(e){this.input.checked=e,this.setEnabled.call(this.input),this.rethread.call(this.input)},setEnabled(){if(this.checked){x.set("Prune All Threads",!1);const e=Ae.inputs?.enabled;e?.checked&&(e.checked=!1,x.event("change",null,e))}x.cb.checked.call(this)},setThread(){xe.thread=this, -x.asap((()=>!a["Thread Updater"]||x(".navLinksBot > .updatelink")),(function(){let e;(e=x(".navLinksBot"))&&x.add(e,[x.tn(" "),xe.threadNewLink])}))},node(){let e;if(this.isFetchedQuote||this.isClone||!this.isReply)return;const t=new Set;let o=null;for(var a of this.quotes)(e=i.posts.get(a))&&!e.isFetchedQuote&&e.isReply&&e.IDo.ID)&&(o=e));if(!o)return;let n=o;for(;n=xe.parent[n.fullID];)t.delete(n.ID);1===t.size&&(xe.parent[this.fullID]=o)},descendants(e){let t,o=[e];if(t=xe.children[e.fullID])for(var a of t)o=o.concat(xe.descendants(a));return o},insert(e){let t,o;if(!a["Thread Quotes"]||!(t=xe.parent[e.fullID])||xe.inserted[e.fullID])return!1;const i=xe.descendants(e);if(!fe.posts.has(t.ID)&&function(){for(var e of i)if(fe.posts.has(e.ID))return!0}())return xe.threadNewLink.hidden=!1,!1;const{order:n}=fe,s=xe.children[t.fullID]||(xe.children[t.fullID]=[]),r=t.nodes.threadContainer||x.el("div",{className:"threadContainer"}),l=[e.nodes.root] -;e.nodes.threadContainer&&l.push(e.nodes.threadContainer);let d=s.length;for(let t=s.length-1;t>=0;t--){s[t].ID>=e.ID&&d--}if(d!==s.length){const t=s[d];for(o of i)n.before(n[t.ID],n[o.ID]);s.splice(d,0,e),x.before(t.nodes.root,l)}else{let a,d=t;for(;(a=xe.children[d.fullID])&&a.length;)d=a[a.length-1];for(let e=i.length-1;e>=0;e--)o=i[e],n.after(n[d.ID],n[o.ID]);s.push(e),x.add(r,l)}return xe.inserted[e.fullID]=!0,t.nodes.threadContainer||(t.nodes.threadContainer=r,x.addClass(t.nodes.root,"threadOP"),x.after(t.nodes.root,r)),!0},rethread(){if(!xe.ready)return;const{thread:e}=xe,{posts:t}=e;if(xe.threadNewLink.hidden=!0,a["Thread Quotes"])t.forEach(xe.insert);else{const o=[];fe.order=new ge,xe.inserted=p(),t.forEach((function(e){e.isFetchedQuote||(fe.order.push(e),e.isReply&&o.push(e.nodes.root),xe.children[e.fullID]&&(delete xe.children[e.fullID],x.rmClass(e.nodes.root,"threadOP"),x.rm(e.nodes.threadContainer),delete e.nodes.threadContainer))})),x.add(e.nodes.root,o)} -fe.position=fe.order.first,fe.updatePosition(),fe.setLine(!0),fe.read(),fe.update()}};const we={restore(){const e=Xe.to("threadJSON",{boardID:i.boardID,threadID:i.threadID});if(!e)return void new Ke("warning","No archive found",3);(e.startsWith("https://")||a["Exempt Archives from Encryption"])&&Fe.ajax(e,{onloadend(){if(this.status<200||this.status>=400){const t=n(new URL(e).origin);return new Ke("error",x.el("div",{innerHTML:`There was an error while fetching from the archive. See the console for details.Some archive check the browser first before checking content, you might need to open the archive first to get past the browser check: ${t}If that doesn't work, try a different archive under Settings > Advanced > Archives > Thread fetching.`})),void console.error(this)}let t=0;const o=this.response[i.threadID.toString()].posts;for(const[e,a]of Object.entries(o))we.insert(a)[1]&&++t;let a -;a=0===t?"No removed posts found":1===t?"1 post restored":`${t} posts restored`,new Ke("info",a,3)}})},init(){if("thread"!==i.VIEW)return;const e=x.el("a",{href:"javascript:;",textContent:"Restore from archive"});x.on(e,"click",(()=>{we.restore(),Ye.menu.close()})),Ye.menu.addEntry({el:e,order:10})},insert(e){const t=`${e.board.shortname}.${e.num}`;if(i.posts.keys.includes(t))return[void 0,!1];let o=!1;const s=(e=>{let t=(e.comment||"").split(/(\n|\[\/?(?:b|spoiler|code|moot|banned|fortune(?: color="#\w+")?|i|red|green|blue)\])/);t=t.map(((e,t)=>{if(t%2==1){var o=ye.archiveTags[e.replace(/\ .*\]/,"]")];return"function"==typeof o?o(e):o}var a=">"===e[0];return e=e.replace(/(\[\/?[a-z]+):lit(\])/g,"$1$2").split(/(>>(?:>\/[a-z\d]+\/)?\d+)/g).map(((e,t)=>t%2?`${n(e)}`:n(e))).join(""),{innerHTML:a?`${e}`:e}})),t={innerHTML:n.cat(t),[y]:!0};const o={ID:e.num,threadID:e.thread_num,boardID:e.board.shortname,isReply:e.num!==e.thread_num, -fileDeleted:!1,info:{subject:e.title,email:e.email,name:e.name||"",tripcode:e.trip,capcode:(()=>{switch(e.capcode){case"M":return"Mod";case"A":return"Admin";case"D":return"Developer";case"V":return"Verified";case"F":return"Founder";case"G":return"Manager"}})(),uniqueID:e.poster_hash,flagCode:e.poster_country,flagCodeTroll:e.troll_country_code,flag:e.poster_country_name||e.troll_country_name,dateUTC:e.timestamp,dateText:e.fourchan_date,commentHTML:t},file:null,extra:null};if(o.info.capcode&&delete o.info.uniqueID,e.media&&+e.media.banned)o.fileDeleted=!0;else if(e.media?.media_filename){let{thumb_link:t}=e.media;"/"===t?.[0]&&(t=url.split("/",3).join("/")+t),Xe.securityCheck(t)||(t="");let a=Xe.to("file",{boardID:o.boardID,filename:e.media.media_orig});Xe.securityCheck(a)||(a=""),o.file={name:e.media.media_filename, -url:a||("f"===o.boardID?`${location.protocol}//${T.flashHost()}/${o.boardID}/${encodeURIComponent(n(e.media.media_filename))}`:`${location.protocol}//${T.host()}/${o.boardID}/${e.media.media_orig}`),height:e.media.media_h,width:e.media.media_w,MD5:e.media.media_hash,size:x.bytesToString(e.media.media_size),thumbURL:t||`${location.protocol}//${T.thumbHost()}/${o.boardID}/${e.media.preview_orig}`,theight:e.media.preview_h,twidth:e.media.preview_w,isSpoiler:"1"===e.media.spoiler},/\.pdf$/.test(o.file.url)||(o.file.dimensions=`${o.file.width}x${o.file.height}`),"f"===o.boardID&&e.media.exif&&(o.file.tag=JSON.parse(e.media.exif).Tag)}o.extra=p();const a=i.boards[o.boardID]||new ce(o.boardID),s=i.threads.get(`${o.boardID}.${o.threadID}`)||new j(o.threadID,a),r=new ae(i.SITE.Build.post(o),s,a);return r.resurrect(),r.markAsFromArchive(),r.file&&(r.file.thumbURL=o.file.thumbURL),Pt.callbackNodes("Post",[r]),r})(e);if(s.resurrect(),s.markAsFromArchive(), -s.threadID===i.threadID&&"thread"===i.VIEW){const e=i.posts.insert(t,s,(e=>+e.split(".")[1]t===e));const t=this;return void x.cache(e,(function(){return t.fetchedPost(this,!1)}))}if(this.archivedPost())return;return x.addClass(this.root,"warning"),void(this.root.textContent=`Post No.${this.postID} was not found.`)}const s=i.boards[this.boardID]||new ce(this.boardID),r=i.threads.get(`${this.boardID}.${this.threadID}`)||new j(this.threadID,s);return o=new ae(i.SITE.Build.postFromObject(o,this.boardID),r,s,{isFetchedQuote:!0}),Pt.callbackNodes("Post",[o]),this.insert(o)}archivedPost(){let e -;if(!a["Resurrect Quotes"])return!1;if(!(e=Xe.to("post",{boardID:this.boardID,postID:this.postID})))return!1;const t=Xe.data.post[this.boardID],o=/^https:\/\//.test(e)||"http:"===location.protocol;if(o||a["Exempt Archives from Encryption"]){const a=this;return Fe.cache(e,(function(){if(!o&&this.response?.media){const{media:e}=this.response;for(var i in e)/_link$/.test(i)&&(x.getOwn(e,i)?.match(/^http:\/\//)||delete e[i])}return a.parseArchivedPost(this.response,e,t)})),!0}return!1}parseArchivedPost(e,t,o){let a;if(!(a=i.posts.get(`${this.boardID}.${this.postID}`)))return null==e?(x.addClass(this.root,"warning"),void(this.root.textContent=`Error fetching Post No.${this.postID} from ${o.name}.`)):e.error?(x.addClass(this.root,"warning"),void(this.root.textContent=e.error)):this.insert(we.insert(e)[0]);this.insert(a)}}ye.archiveTags={"\n":{innerHTML:""},"[b]":{innerHTML:""},"[/b]":{innerHTML:""},"[spoiler]":{innerHTML:""},"[/spoiler]":{innerHTML:""},"[code]":{ -innerHTML:''},"[/code]":{innerHTML:""},"[moot]":{innerHTML:''},"[/moot]":{innerHTML:""},"[banned]":{innerHTML:''},"[/banned]":{innerHTML:""},"[fortune]":e=>({innerHTML:''}),"[/fortune]":{innerHTML:""},"[i]":{innerHTML:''},"[/i]":{innerHTML:""},"[red]":{innerHTML:''},"[/red]":{innerHTML:""},"[green]":{innerHTML:''},"[/green]":{innerHTML:""},"[blue]":{innerHTML:''},"[/blue]":{innerHTML:""}};var ke={init(){if(a["Quote Previewing"]&&("archive"===i.VIEW&&x.on(s,"mouseover",(function(e){if("A"===e.target.nodeName&&x.hasClass(e.target,"quotelink"))return ke.mouseover.call(e.target,e)})), -["index","thread"].includes(i.VIEW)))return a["Comment Expansion"]&&ue.callbacks.push(this.node),c.Post.push({name:"Quote Previewing",cb:this.node})},node(){for(var e of this.nodes.quotelinks.concat([...this.nodes.backlinks],this.nodes.archivelinks))x.on(e,"mouseover",ke.mouseover)},mouseover(e){let t;if(x.hasClass(this,"inlined")&&!x.hasClass(r,"catalog-mode")||!s.contains(this))return;const{boardID:o,threadID:n,postID:l}=w.postDataFromLink(this),d=x.el("div",{id:"qp",className:"dialog"});if(x.add(Ye.hover,d),new ye(o,n,l,d,w.postFromNode(this)),X.hover({root:this,el:d,latestEvent:e,endEvents:"mouseout click",cb:ke.mouseout}),a["Quote Highlighting"]&&(t=i.posts.get(`${o}.${l}`))){const e=[t].concat(t.clones);for(var c of(e.pop(),e))x.addClass(c.nodes.post,"qphl")}},mouseout(){let e;if(!(e=this.el.firstElementChild))return;x.event("PostsRemoved",null,Ye.hover);let t=w.postFromRoot(e).origin;if(t.rmClone(e.dataset.clone), -a["Quote Highlighting"])for(t of[t].concat(t.clones))x.rmClass(t.nodes.post,"qphl")}},Ie={showHiddenThreads:!1,changed:{},enabledOn:({siteID:e,boardID:t})=>a["JSON Index"]&&"yotsuba"===i.sites[e].software&&"f"!==t,init(){let e,t,o;if("index"!==i.VIEW)return;if(x.one(s,"4chanXInitFinished",this.cb.initFinished),x.on(s,"PostsInserted",this.cb.postsInserted),!this.enabledOn(i.BOARD))return;this.enabled=!0,c.Post.push({name:"Index Page Numbers",cb:this.node}),c.CatalogThread.push({name:"Catalog Features",cb:this.catalogNode}),this.search=history.state?.searched||"",history.state?.mode&&(a["Index Mode"]=history.state?.mode),this.currentSort=history.state?.sort,this.currentSort||(this.currentSort="object"==typeof a["Index Sort"]?a["Index Sort"][i.BOARD.ID]||"bump":a["Index Sort"]),this.currentPage=this.getCurrentPage(),this.processHash(),x.addClass(r,"index-loading",`${a["Index Mode"].replace(/\ /g,"-")}-mode`),x.on(window,"popstate",this.cb.popstate),x.on(s,"scroll",this.scroll), -x.on(s,"SortIndex",this.cb.resort),this.button=x.el("a",{title:"Refresh",href:"javascript:;"}),M.set(this.button,"refresh","Refresh"),x.on(this.button,"click",(()=>Ie.update())),Ye.addShortcut("index-refresh",this.button,590);const n=[];for(o in this.inputs=t=p(),h.Index){var l=h.Index[o];if(l instanceof Array){var d=X.checkbox(o,`${o[0]}${o.slice(1).toLowerCase()}`);d.title=l[1],n.push({el:d}),e=d.firstChild,x.on(e,"change",x.cb.checked),t[o]=e}}x.on(t["Show Replies"],"change",this.cb.replies),x.on(t["Catalog Hover Expand"],"change",this.cb.hover),x.on(t["Pin Watched Threads"],"change",this.cb.resort),x.on(t["Anchor Hidden Threads"],"change",this.cb.resort);const u=function(o){if(e=x.getOwn(t,o.target.name))return e.checked=o.target.checked,x.event("change",null,e)};x.on(s,"OpenSettings",(()=>x.on(x.id("fourchanx-settings"),"change",u)));const g=X.checkbox("Per-Board Sort Type","Per-board sort type","object"==typeof a["Index Sort"]) -;for(var f of(g.title="Set the sorting order of each board independently.",x.on(g.firstChild,"change",this.cb.perBoardSort),n.splice(3,0,{el:g}),Ye.menu.addEntry({el:x.el("span",{textContent:"Index Navigation"}),order:100,subEntries:n}),this.navLinks=x.el("div",{className:"navLinks json-index"}),x.extend(this.navLinks,{ +;break;case"thread":x.on(s,"ThreadUpdate",this.cb.onThreadRefresh)}if(a["Fixed Thread Watcher"]&&x.addClass(r,"fixed-watcher"),a["Persistent Thread Watcher"]||(x.addClass(ve.shortcut,"disabled"),this.dialog.hidden=!0),Ye.addShortcut("watcher",e,510),ve.initLastModified(),ve.fetchAuto(),x.on(window,"visibilitychange focus",(()=>x.queueTask(ve.fetchAuto))),a.Menu&&Ie.enabled&&se.menu.addEntry({el:x.el("a",{href:"javascript:;",className:"has-shortcut-text"},{innerHTML:'Alt+click'}),order:6,open({thread:e}){return"catalog"===a["Index Mode"]&&(this.el.firstElementChild.textContent=ve.isWatched(e)?"Unwatch":"Watch",this.cb&&x.off(this.el,"click",this.cb),this.cb=function(){return x.event("CloseMenu"),ve.toggle(e,!0)},x.on(this.el,"click",this.cb),!0)}}),["index","thread"].includes(i.VIEW))return c.Post.push({name:"Thread Watcher",cb:this.node}),c.CatalogThread.push({name:"Thread Watcher",cb:this.catalogNode})}},isWatched:e=>!!ve.db?.get({ +boardID:e.board.ID,threadID:e.ID}),isWatchedRaw:(e,t)=>!!ve.db?.get({boardID:e,threadID:t}),setToggler:(e,t)=>(e.classList.toggle("watched",t),e.title=(t?"Unwatch":"Watch")+" Thread"),node(){let e;if(this.isReply)return;this.isClone?e=x(".watch-thread-link",this.nodes.info):(e=x.el("button",{type:"button",className:"watch-thread-link"}),M.set(e,"heart"),x.before(x("input",this.nodes.info),e));const t=i.SITE.ID,o=this.board.ID,a=this.thread.ID,n=ve.db.get({siteID:t,boardID:o,threadID:a});return ve.setToggler(e,!!n),x.on(e,"click",ve.cb.toggle),n&&null==n.excerpt?x.queueTask((()=>ve.update(t,o,a,{excerpt:w.threadExcerpt(this.thread)}))):void 0},catalogNode(){return ve.isWatched(this.thread)&&x.addClass(this.nodes.root,"watched"),x.on(this.nodes.root,"mousedown click",(e=>{if(0===e.button&&e.altKey)return"click"===e.type&&ve.toggle(this.thread,!0),e.preventDefault()}))},addDialog(){if(Pt.isThisPageLegit())return ve.build(),x.prepend(s.body,ve.dialog)}, +toggleWatcher:()=>(x.toggleClass(ve.shortcut,"disabled"),ve.dialog.hidden=!ve.dialog.hidden),cb:{openAll(){if(!x.hasClass(this,"disabled")){for(var e of S("a.watcher-link",ve.list))x.open(e.href);x.event("CloseMenu")}},openUnread(){if(!x.hasClass(this,"disabled")){for(var e of S(".replies-unread > a.watcher-link",ve.list))x.open(e.href);x.event("CloseMenu")}},openDeads(){if(!x.hasClass(this,"disabled")){for(var e of S(".dead-thread.replies-unread > a.watcher-link",ve.list))x.open(e.href);x.event("CloseMenu")}},clear(){if(!confirm("Delete ALL threads from watcher?"))return;const e=ve.getAll();for(let t=0,o=e.length;t+e.split(".")[1]>r)))continue +;a["Auto Prune"]||!l||"object"!=typeof l?(t.delete({boardID:n,threadID:r}),s++):ve.fetchStatus({siteID:o,boardID:n,threadID:r,data:l})}}if(s)return ve.refresh()},onThreadRefresh(e){const t=i.threads.get(e.detail.threadID);if(e.detail[404]&&ve.isWatched(t))return ve.add(t)}},requests:[],fetched:0,fetch(e,{siteID:t,force:o},a,n){0===ve.requests.length&&(ve.status.textContent="...",x.addClass(ve.refreshButton,"spin"));const s=t===i.SITE.ID?x.ajax:Fe.ajax;o&&delete x.lastModified.ThreadWatcher?.[e];const r=x.whenModified(e,"ThreadWatcher",(function(){if(!this.finished)return this.finished=!0,ve.fetched++,ve.fetched===ve.requests.length?ve.clearRequests():ve.status.textContent=`${Math.round(ve.fetched/ve.requests.length*100)}%`,n.apply(this,a)}),{timeout:f,ajax:s});return ve.requests.push(r)},clearRequests:()=>(ve.requests=[],ve.fetched=0,ve.status.textContent="",x.rmClass(ve.refreshButton,"spin")),abort(){for(var e of(delete ve.syncing,ve.requests))e.finished||(e.finished=!0,e.abort()) +;return ve.clearRequests()},initLastModified(){const e=x.lastModified.ThreadWatcher||(x.lastModified.ThreadWatcher=p());for(var t in ve.dbLM.data){var o=ve.dbLM.data[t];for(var a in o.boards){var i=o.boards[a];if(ve.db.get({siteID:t,boardID:a}))for(var n in i){var s=i[n];e[n]=s}else ve.dbLM.delete({siteID:t,boardID:a})}}},fetchAuto(){let e;if(clearTimeout(ve.timeout),!a["Auto Update Thread Watcher"])return;const{db:t}=ve,o=a["Show Page"]||ve.unreadEnabled&&a["Show Unread Count"]?3e5:2*m,i=Date.now();return(i-o>=(e=t.data.lastChecked||0)||e>i)&&!s.hidden&&s.hasFocus()&&ve.fetchAllStatus(o),ve.timeout=setTimeout(ve.fetchAuto,o)},buttonFetchAll:()=>ve.syncing||ve.requests.length?ve.abort():ve.fetchAllStatus(),fetchAllStatus(e=0){ve.status.textContent="...",x.addClass(ve.refreshButton,"spin"),ve.syncing=!0;const t=[ve.db,ve.unreaddb,pe.db].filter((e=>e));let o=0;return t.map((a=>a.forceSync((function(){if(++o===t.length){let t;if(!ve.syncing)return;if(delete ve.syncing, +0>(t=Date.now()-(ve.db.data.lastChecked||0))||t>=e){let e;const{db:t}=ve,o=Date.now(),i=!(o-2*m<(e=t.data.lastChecked2||0)&&e<=o),n=ve.getAll(!0);for(var a of n)ve.fetchBoard(a,i);t.setLastChecked(),i&&t.setLastChecked("lastChecked2")}if(ve.fetched===ve.requests.length)return ve.clearRequests()}}))))},fetchBoard(e,t){if(!e.some((e=>!e.data.isDead)))return;let o=!1;for(var n of e){var{data:s}=n;s.isDead||-1===s.last||(a["Show Page"]&&null==s.page&&(o=!0),null==s.modified&&(o=n.force=!0))}const{siteID:r,boardID:l}=e[0],d=i.sites[r];if(!d)return;const c=t&&d.threadModTimeIgnoresSage?"catalogJSON":"threadsListJSON",h=d.urls[c]?.({siteID:r,boardID:l});return h?ve.fetch(h,{siteID:r,force:o},[e,h],ve.parseBoard):void 0},parseBoard(e,t){let o,n;if(200!==this.status)return;const{siteID:s,boardID:r}=e[0],l=this.getResponseHeader("Last-Modified");ve.dbLM.extend({siteID:s,boardID:r,val:x.item(t,l)});const d=p();let c=0,h=0,u=null;try{c=this.response[0]?.threads.length||0 +;for(let e=0;e=h-c;ve.update(s,r,f,{page:o,lastPage:w})}ve.unreadEnabled&&a["Show Unread Count"]&&(v!==m.modified||null!=A&&A!==m.replies)&&((n.newData||(n.newData={})).modified=v,ve.fetchStatus(n))}else ve.fetchStatus(n)}},fetchStatus(e){const{siteID:t,boardID:o,threadID:a,data:n,force:s}=e,r=i.sites[t]?.urls.threadJSON?.({siteID:t,boardID:o,threadID:a});if(r&&(!n.isDead||s)&&-1!==n.last)return ve.fetch(r,{siteID:t,force:s},[e],ve.parseStatus)},parseStatus(e,t){let o,n,{siteID:s,boardID:r,threadID:l,data:d,newData:c,force:h}=e;const u=i.sites[s];if(200===this.status&&this.response){let e +;n=this.response.posts[this.response.posts.length-1].no;const i=this.response.posts.length-1;if(o=e=!(!this.response.posts[0].archived&&!t),o&&a["Auto Prune"])return void ve.rm(s,r,l);if(n===d.last&&o===d.isDead&&e===d.isArchived)return;const h=ve.unreaddb.get({siteID:s,boardID:r,threadID:l,defaultValue:0});let b=d.unread||0,v=d.quotingYou||0;const A=!!pe.db?.get({siteID:s,boardID:r,threadID:l,postID:l});for(var p of this.response.posts)if(!(p.no<=(d.last||0)||p.no<=h||pe.db?.get({siteID:s,boardID:r,threadID:l,postID:p.no}))){var g=!1;if(!a["Require OP Quote Link"]&&A)g=!0;else if(pe.db&&p.com){var f,m=u.regexp.quotelinkHTML;for(m.lastIndex=0;f=m.exec(p.com);)if(pe.db.get({siteID:s,boardID:f[1]?encodeURIComponent(f[1]):r,threadID:f[2]||l,postID:f[3]||f[2]||l})){g=!0;break}}(!b||!v&&g)&&Je.isHidden(u.Build.parseJSON(p,{siteID:s,boardID:r}))||(b++,g&&(v=p.no))}return c||(c={}),x.extend(c,{last:n,replies:i,isDead:o,isArchived:e,unread:b,quotingYou:v}),ve.update(s,r,l,c)} +if(404===this.status){const o=i.sites[s]?.urls.archivedThreadJSON?.({siteID:s,boardID:r,threadID:l});return!t&&o?ve.fetch(o,{siteID:s,force:h},[e,!0],ve.parseStatus):u.mayLackJSON&&null==d.last?ve.update(s,r,l,{last:-1}):ve.update(s,r,l,{isDead:!0})}},getAll(e){const t=[];for(var o in ve.db.data){var n=ve.db.data[o];for(var s in n.boards){var r,l=n.boards[s];if(!a["Current Board"]||o===i.SITE.ID&&s===i.BOARD.ID)for(var d in e&&t.push(r=[]),l){var c=l[d];c&&"object"==typeof c&&(e?r:t).push({siteID:o,boardID:s,threadID:d,data:c})}}}return t},makeLine(e,t,o,n){let s;const r=x.el("a",{textContent:"✕",href:"javascript:;"});x.on(r,"click",ve.cb.rm);let{excerpt:l,isArchived:d}=n;l||(l=`/${t}/ - No.${o}`),a["Show Site Prefix"]&&(l=ve.prefixes[e]+l);const c=x.el("a",{href:i.sites[e]?.urls.thread({siteID:e,boardID:t,threadID:o},d)||"",title:l,className:"watcher-link"});if(a["Show Page"]&&null!=n.page&&(s=x.el("span",{textContent:`[${n.page}]`,className:"watcher-page"}),x.add(c,s)), +ve.unreadEnabled&&a["Show Unread Count"]&&null!=n.unread){const e=x.el("span",{textContent:`(${n.unread})`,className:"watcher-unread"});x.add(c,e)}const h=x.el("span",{textContent:l,className:"watcher-title"});x.add(c,h);const u=x.el("div"),p=`${t}.${o}`;return u.dataset.fullID=p,u.dataset.siteID=e,"thread"===i.VIEW&&p===`${i.BOARD}.${i.THREADID}`&&x.addClass(u,"current"),n.isDead&&x.addClass(u,"dead-thread"),a["Show Page"]&&(n.lastPage&&x.addClass(u,"last-page"),null!=n.page&&(u.dataset.page=n.page)),ve.unreadEnabled&&a["Show Unread Count"]&&(0===n.unread&&x.addClass(u,"replies-read"),n.unread&&x.addClass(u,"replies-unread"),(n.quotingYou||0)>(n.dismiss||0)&&x.addClass(u,"replies-quoting-you")),x.add(u,[r,x.tn(" "),c]),u},setPrefixes(e){const t=p();for(var{siteID:o}of e)if(!(o in t)){for(var a=0,i="",n=Object.keys(t);n.length>0;){a++,i=o.slice(0,a);var s=[];for(var r of n)r.slice(0,a)===i?s.push(r):t[r].length [data-site-i-d='${e}'][data-full-i-d='${t}.${o}']`,ve.dialog)){const a=ve.makeLine(e,t,o,n);return x.replace(r,a),ve.refreshIcon()}return ve.refresh()}},set404(e,t,o){let i;return(i=ve.db?.get({boardID:e,threadID:t}))?a["Auto Prune"]?(ve.db.delete({boardID:e,threadID:t}),o()):i.isDead&&null==i.isArchived&&null==i.page&&null==i.lastPage&&null==i.unread&&null==i.quotingYou?o():ve.db.extend({boardID:e,threadID:t,val:{isDead:!0,isArchived:void 0,page:void 0,lastPage:void 0,unread:void 0,quotingYou:void 0}},o):o()},toggle(e,t){const o=i.SITE.ID,a=e.board.ID,n=e.ID;return ve.db.get({boardID:a,threadID:n})?ve.rm(o,a,n,void 0,t):ve.add(e,void 0,t)},add(e,t,o){const n={},s=i.SITE.ID,r=e.board.ID,l=e.ID +;if(e.isDead){if(a["Auto Prune"]&&ve.db.get({boardID:r,threadID:l}))return void ve.rm(s,r,l,t);n.isDead=!0}return e.OP&&(n.excerpt=w.threadExcerpt(e)),ve.addRaw(r,l,n,t,o)},addRaw(e,t,o,n,s){const r=ve.db.get({boardID:e,threadID:t,defaultValue:p()});delete r.last,delete r.modified,x.extend(r,o),ve.db.set({boardID:e,threadID:t,val:r},n),ve.refresh(s);const l={siteID:i.SITE.ID,boardID:e,threadID:t,data:o,force:!0};return a["Show Page"]&&!o.isDead?ve.fetchBoard([l]):ve.unreadEnabled&&a["Show Unread Count"]?ve.fetchStatus(l):void 0},rm:(e,t,o,a,i)=>(ve.db.delete({siteID:e,boardID:t,threadID:o},a),ve.refresh(i)),menu:{init(){if(!a["Thread Watcher"])return;const e=this.menu=new X.Menu("thread watcher");return x.on(x(".menu-button",ve.dialog),"click",(function(t){return e.toggle(t,this,ve)})),this.addMenuEntries()},addHeaderMenuEntry(){if("thread"!==i.VIEW)return;const e=x.el("a",{href:"javascript:;"});return Ye.menu.addEntry({el:e,order:60,open(){const[t,o,a]=ve.db.get({boardID:i.BOARD.ID, +threadID:i.THREADID})?["unwatch-thread","watch-thread","Unwatch thread"]:["watch-thread","unwatch-thread","Watch thread"];return x.addClass(e,t),x.rmClass(e,o),e.textContent=a,!0}}),x.on(e,"click",(()=>ve.toggle(i.threads.get(`${i.BOARD}.${i.THREADID}`),!0)))},addMenuEntries(){const e=function(){return this.el.classList.toggle("disabled",!x(".dead-thread",ve.list)),!0},t=[{text:"Open all threads",cb:ve.cb.openAll,open(){return this.el.classList.toggle("disabled",!ve.list.firstElementChild),!0}},{text:"Clear all threads",cb:ve.cb.clear,open(){return this.el.classList.toggle("disabled",!ve.list.firstElementChild),!0}},{text:"Open unread threads",cb:ve.cb.openUnread,open(){return this.el.classList.toggle("disabled",!x(".replies-unread",ve.list)),!0}},{text:"Open unread dead threads",cb:ve.cb.openDeads,open:e},{text:"Prune all dead threads",cb:ve.cb.pruneDeads,open:e},{text:"Prune read dead threads",cb:ve.cb.pruneReadDeads,open:e},{text:"Dismiss posts quoting you", +title:"Unhighlight the thread watcher icon and threads until there are new replies quoting you.",cb:ve.cb.dismiss,open(){return this.el.classList.toggle("disabled",!x.hasClass(ve.shortcut,"replies-quoting-you")),!0}}];for(var{text:o,title:a,cb:i,open:n}of t){var s={el:x.el("a",{textContent:o,href:"javascript:;"})};a&&(s.el.title=a),x.on(s.el,"click",i),s.open=n.bind(s),this.menu.addEntry(s)}for(var r in h.threadWatcher){var l=h.threadWatcher[r];this.addCheckbox(r,l[1])}},addCheckbox(e,t){const o={type:"thread watcher",el:X.checkbox(e,e.replace(" Thread Watcher",""))};o.el.title=t;const a=o.el.firstElementChild;return"Show Unread Count"!==e||ve.unreadEnabled||(a.disabled=!0,x.addClass(o.el,"disabled"),o.el.title+="\n[Remember Last Read Post is disabled.]"),x.on(a,"change",x.cb.checked),["Current Board","Show Page","Show Unread Count","Show Site Prefix"].includes(e)&&x.on(a,"change",(()=>ve.refresh())), +["Show Page","Show Unread Count","Auto Update Thread Watcher"].includes(e)&&x.on(a,"change",ve.fetchAuto),this.menu.addEntry(o)}}};var Ae={init(){if("thread"!==i.VIEW||!a["Reply Pruning"])return;this.container=x.frag(),this.summary=x.el("span",{hidden:!0,className:"summary"}),this.summary.style.cursor="pointer",x.on(this.summary,"click",(()=>(this.inputs.enabled.checked=!this.inputs.enabled.checked,x.event("change",null,this.inputs.enabled))));const e=X.checkbox("Prune Replies","Show Last",a["Prune All Threads"]),t=x.el("span",{title:"Maximum number of replies to show."},{innerHTML:' '});return x.prepend(t,e),this.inputs={enabled:e.firstElementChild,replies:t.lastElementChild},this.setEnabled.call(this.inputs.enabled),x.on(this.inputs.enabled,"change",this.setEnabled),x.on(this.inputs.replies,"change",x.cb.value),Ye.menu.addEntry({el:t,order:190}),c.Thread.push({name:"Reply Pruning", +cb:this.node})},position:0,hidden:0,hiddenFiles:0,total:0,totalFiles:0,setEnabled(){const e=xe.input;return this.checked&&e?.checked&&(e.checked=!1,x.event("change",null,e)),Ae.active=this.checked},showIfHidden(e){if(Ae.container&&x(`#${e}`,Ae.container))return Ae.inputs.enabled.checked=!1,x.event("change",null,Ae.inputs.enabled)},node(){let e;return Ae.thread=this,this.isSticky&&(Ae.active=Ae.inputs.enabled.checked=!0,xe.input&&(a["Thread Quotes"]=xe.input.checked=!1)),this.posts.forEach((function(e){if(e.isReply&&(Ae.total++,e.file))return Ae.totalFiles++})),Ae.active&&/^#p\d+$/.test(location.hash)&&1<=(e=this.posts.keys.indexOf(location.hash.slice(2)))&&e<1+Math.max(Ae.total-+a["Max Replies"],0)&&(Ae.active=Ae.inputs.enabled.checked=!1),x.after(this.OP.nodes.root,Ae.summary),x.on(Ae.inputs.enabled,"change",Ae.update),x.on(Ae.inputs.replies,"change",Ae.update),x.on(s,"ThreadUpdate",Ae.updateCount),x.on(s,"ThreadUpdate",Ae.update),Ae.update()},updateCount(e){ +if(!e.detail[404])for(var t of e.detail.newPosts)Ae.total++,i.posts.get(t).file&&Ae.totalFiles++},update(){let e,t,o;const n=Ae.hidden,r=Ae.active?Math.max(Ae.total-+a["Max Replies"],0):0,l=s.body.clientHeight-window.scrollY,{posts:d}=Ae.thread;if(Ae.hiddenr){const e=x.frag();for(;Ae.hidden>r&&Ae.position>0;)if(o=d.get(d.keys[--Ae.position]),o.isReply&&!o.isFetchedQuote){for(;(t=Ae.container.lastChild)&&t!==o.nodes.root;)x.prepend(e,t);x.prepend(e,o.nodes.root),Ae.hidden--,o.file&&Ae.hiddenFiles--}x.after(Ae.summary,e),x.event("PostsInserted",null,Ae.summary.parentNode)}if(Ae.summary.textContent=Ae.active?i.SITE.Build.summaryText("+",Ae.hidden,Ae.hiddenFiles):i.SITE.Build.summaryText("-",Ae.total,Ae.totalFiles), +Ae.summary.hidden=Ae.total<=+a["Max Replies"],n!==r&&(e=Ye.getTopOf(x(".board")))<0)return window.scrollBy(0,Math.max(s.body.clientHeight-l,window.scrollY+e)-window.scrollY)}},xe={init(){a["Quote Threading"]&&"thread"===i.VIEW&&(this.controls=x.el("label",{innerHTML:' Threading'}),this.threadNewLink=x.el("span",{className:"brackets-wrap threadnewlink",hidden:!0}),x.extend(this.threadNewLink,{innerHTML:'Thread New Posts'}),this.input=x("input",this.controls),this.input.checked=a["Thread Quotes"],x.on(this.input,"change",this.setEnabled),x.on(this.input,"change",this.rethread),x.on(this.threadNewLink.firstElementChild,"click",this.rethread),x.on(s,"4chanXInitFinished",(()=>{this.ready=!0})),Ye.menu.addEntry(this.entry={el:this.controls,order:99}),c.Thread.push({name:"Quote Threading",cb:this.setThread}),c.Post.push({name:"Quote Threading",cb:this.node}))},parent:p(),children:p(),inserted:p(), +toggleThreading(){this.setThreadingState(!a["Thread Quotes"])},setThreadingState(e){this.input.checked=e,this.setEnabled.call(this.input),this.rethread.call(this.input)},setEnabled(){if(this.checked){x.set("Prune All Threads",!1);const e=Ae.inputs?.enabled;e?.checked&&(e.checked=!1,x.event("change",null,e))}x.cb.checked.call(this)},setThread(){xe.thread=this,x.asap((()=>!a["Thread Updater"]||x(".navLinksBot > .updatelink")),(function(){let e;(e=x(".navLinksBot"))&&x.add(e,[x.tn(" "),xe.threadNewLink])}))},node(){let e;if(this.isFetchedQuote||this.isClone||!this.isReply)return;const t=new Set;let o=null;for(var a of this.quotes)(e=i.posts.get(a))&&!e.isFetchedQuote&&e.isReply&&e.IDo.ID)&&(o=e));if(!o)return;let n=o;for(;n=xe.parent[n.fullID];)t.delete(n.ID);1===t.size&&(xe.parent[this.fullID]=o)},descendants(e){let t,o=[e];if(t=xe.children[e.fullID])for(var a of t)o=o.concat(xe.descendants(a));return o},insert(e){let t,o +;if(!a["Thread Quotes"]||!(t=xe.parent[e.fullID])||xe.inserted[e.fullID])return!1;const i=xe.descendants(e);if(!fe.posts.has(t.ID)&&function(){for(var e of i)if(fe.posts.has(e.ID))return!0}())return xe.threadNewLink.hidden=!1,!1;const{order:n}=fe,s=xe.children[t.fullID]||(xe.children[t.fullID]=[]),r=t.nodes.threadContainer||x.el("div",{className:"threadContainer"}),l=[e.nodes.root];e.nodes.threadContainer&&l.push(e.nodes.threadContainer);let d=s.length;for(let t=s.length-1;t>=0;t--){s[t].ID>=e.ID&&d--}if(d!==s.length){const t=s[d];for(o of i)n.before(n[t.ID],n[o.ID]);s.splice(d,0,e),x.before(t.nodes.root,l)}else{let a,d=t;for(;(a=xe.children[d.fullID])&&a.length;)d=a[a.length-1];for(let e=i.length-1;e>=0;e--)o=i[e],n.after(n[d.ID],n[o.ID]);s.push(e),x.add(r,l)}return xe.inserted[e.fullID]=!0,t.nodes.threadContainer||(t.nodes.threadContainer=r,x.addClass(t.nodes.root,"threadOP"),x.after(t.nodes.root,r)),!0},rethread(){if(!xe.ready)return;const{thread:e}=xe,{posts:t}=e +;if(xe.threadNewLink.hidden=!0,a["Thread Quotes"])t.forEach(xe.insert);else{const o=[];fe.order=new ge,xe.inserted=p(),t.forEach((function(e){e.isFetchedQuote||(fe.order.push(e),e.isReply&&o.push(e.nodes.root),xe.children[e.fullID]&&(delete xe.children[e.fullID],x.rmClass(e.nodes.root,"threadOP"),x.rm(e.nodes.threadContainer),delete e.nodes.threadContainer))})),x.add(e.nodes.root,o)}fe.position=fe.order.first,fe.updatePosition(),fe.setLine(!0),fe.read(),fe.update()}};const we={restore(){const e=Xe.to("threadJSON",{boardID:i.boardID,threadID:i.threadID});if(!e)return void new Ke("warning","No archive found",3);(e.startsWith("https://")||a["Exempt Archives from Encryption"])&&Fe.ajax(e,{onloadend(){if(this.status<200||this.status>=400){const t=n(new URL(e).origin);return new Ke("error",x.el("div",{ +innerHTML:`There was an error while fetching from the archive. See the console for details.Some archive check the browser first before checking content, you might need to open the archive first to get past the browser check: ${t}If that doesn't work, try a different archive under Settings > Advanced > Archives > Thread fetching.`})),void console.error(this)}let t=0;const o=this.response[i.threadID.toString()].posts;for(const[e,a]of Object.entries(o))we.insert(a)[1]&&++t;let a;a=0===t?"No removed posts found":1===t?"1 post restored":`${t} posts restored`,new Ke("info",a,3)}})},init(){if("thread"!==i.VIEW)return;const e=x.el("a",{href:"javascript:;",textContent:"Restore from archive"});x.on(e,"click",(()=>{we.restore(),Ye.menu.close()})),Ye.menu.addEntry({el:e,order:10})},insert(e){const t=`${e.board.shortname}.${e.num}`;if(i.posts.keys.includes(t))return[void 0,!1];let o=!1;const s=(e=>{ +let t=(e.comment||"").split(/(\n|\[\/?(?:b|spoiler|code|moot|banned|fortune(?: color="#\w+")?|i|red|green|blue)\])/);t=t.map(((e,t)=>{if(t%2==1){var o=ye.archiveTags[e.replace(/\ .*\]/,"]")];return"function"==typeof o?o(e):o}var a=">"===e[0];return e=e.replace(/(\[\/?[a-z]+):lit(\])/g,"$1$2").split(/(>>(?:>\/[a-z\d]+\/)?\d+)/g).map(((e,t)=>t%2?`${n(e)}`:n(e))).join(""),{innerHTML:a?`${e}`:e}})),t={innerHTML:n.cat(t),[y]:!0};const o={ID:e.num,threadID:e.thread_num,boardID:e.board.shortname,isReply:e.num!==e.thread_num,fileDeleted:!1,info:{subject:e.title,email:e.email,name:e.name||"",tripcode:e.trip,capcode:(()=>{switch(e.capcode){case"M":return"Mod";case"A":return"Admin";case"D":return"Developer";case"V":return"Verified";case"F":return"Founder";case"G":return"Manager"}})(),uniqueID:e.poster_hash,flagCode:e.poster_country,flagCodeTroll:e.troll_country_code,flag:e.poster_country_name||e.troll_country_name,dateUTC:e.timestamp, +dateText:e.fourchan_date,commentHTML:t},file:null,extra:null};if(o.info.capcode&&delete o.info.uniqueID,e.media&&+e.media.banned)o.fileDeleted=!0;else if(e.media?.media_filename){let{thumb_link:t}=e.media;"/"===t?.[0]&&(t=url.split("/",3).join("/")+t),Xe.securityCheck(t)||(t="");let a=Xe.to("file",{boardID:o.boardID,filename:e.media.media_orig});Xe.securityCheck(a)||(a=""),o.file={name:e.media.media_filename,url:a||("f"===o.boardID?`${location.protocol}//${T.flashHost()}/${o.boardID}/${encodeURIComponent(n(e.media.media_filename))}`:`${location.protocol}//${T.host()}/${o.boardID}/${e.media.media_orig}`),height:e.media.media_h,width:e.media.media_w,MD5:e.media.media_hash,size:x.bytesToString(e.media.media_size),thumbURL:t||`${location.protocol}//${T.thumbHost()}/${o.boardID}/${e.media.preview_orig}`,theight:e.media.preview_h,twidth:e.media.preview_w,isSpoiler:"1"===e.media.spoiler},/\.pdf$/.test(o.file.url)||(o.file.dimensions=`${o.file.width}x${o.file.height}`), +"f"===o.boardID&&e.media.exif&&(o.file.tag=JSON.parse(e.media.exif).Tag)}o.extra=p();const a=i.boards[o.boardID]||new ce(o.boardID),s=i.threads.get(`${o.boardID}.${o.threadID}`)||new j(o.threadID,a),r=new ae(i.SITE.Build.post(o),s,a);return r.resurrect(),r.markAsFromArchive(),r.file&&(r.file.thumbURL=o.file.thumbURL),Pt.callbackNodes("Post",[r]),r})(e);if(s.resurrect(),s.markAsFromArchive(),s.threadID===i.threadID&&"thread"===i.VIEW){const e=i.posts.insert(t,s,(e=>+e.split(".")[1]t===e));const t=this +;return void x.cache(e,(function(){return t.fetchedPost(this,!1)}))}if(this.archivedPost())return;return x.addClass(this.root,"warning"),void(this.root.textContent=`Post No.${this.postID} was not found.`)}const s=i.boards[this.boardID]||new ce(this.boardID),r=i.threads.get(`${this.boardID}.${this.threadID}`)||new j(this.threadID,s);return o=new ae(i.SITE.Build.postFromObject(o,this.boardID),r,s,{isFetchedQuote:!0}),Pt.callbackNodes("Post",[o]),this.insert(o)}archivedPost(){let e;if(!a["Resurrect Quotes"])return!1;if(!(e=Xe.to("post",{boardID:this.boardID,postID:this.postID})))return!1;const t=Xe.data.post[this.boardID],o=/^https:\/\//.test(e)||"http:"===location.protocol;if(o||a["Exempt Archives from Encryption"]){const a=this;return Fe.cache(e,(function(){if(!o&&this.response?.media){const{media:e}=this.response;for(var i in e)/_link$/.test(i)&&(x.getOwn(e,i)?.match(/^http:\/\//)||delete e[i])}return a.parseArchivedPost(this.response,e,t)})),!0}return!1}parseArchivedPost(e,t,o){let a +;if(!(a=i.posts.get(`${this.boardID}.${this.postID}`)))return null==e?(x.addClass(this.root,"warning"),void(this.root.textContent=`Error fetching Post No.${this.postID} from ${o.name}.`)):e.error?(x.addClass(this.root,"warning"),void(this.root.textContent=e.error)):this.insert(we.insert(e)[0]);this.insert(a)}}ye.archiveTags={"\n":{innerHTML:""},"[b]":{innerHTML:""},"[/b]":{innerHTML:""},"[spoiler]":{innerHTML:""},"[/spoiler]":{innerHTML:""},"[code]":{innerHTML:''},"[/code]":{innerHTML:""},"[moot]":{innerHTML:''},"[/moot]":{innerHTML:""},"[banned]":{innerHTML:''},"[/banned]":{innerHTML:""},"[fortune]":e=>({innerHTML:''}),"[/fortune]":{innerHTML:""},"[i]":{innerHTML:''},"[/i]":{ +innerHTML:""},"[red]":{innerHTML:''},"[/red]":{innerHTML:""},"[green]":{innerHTML:''},"[/green]":{innerHTML:""},"[blue]":{innerHTML:''},"[/blue]":{innerHTML:""}};var ke={init(){if(a["Quote Previewing"]&&("archive"===i.VIEW&&x.on(s,"mouseover",(function(e){if("A"===e.target.nodeName&&x.hasClass(e.target,"quotelink"))return ke.mouseover.call(e.target,e)})),["index","thread"].includes(i.VIEW)))return a["Comment Expansion"]&&ue.callbacks.push(this.node),c.Post.push({name:"Quote Previewing",cb:this.node})},node(){for(var e of this.nodes.quotelinks.concat([...this.nodes.backlinks],this.nodes.archivelinks))x.on(e,"mouseover",ke.mouseover)},mouseover(e){let t;if(x.hasClass(this,"inlined")&&!x.hasClass(r,"catalog-mode")||!s.contains(this))return;const{boardID:o,threadID:n,postID:l}=w.postDataFromLink(this),d=x.el("div",{id:"qp",className:"dialog"});if(x.add(Ye.hover,d),new ye(o,n,l,d,w.postFromNode(this)), +X.hover({root:this,el:d,latestEvent:e,endEvents:"mouseout click",cb:ke.mouseout}),a["Quote Highlighting"]&&(t=i.posts.get(`${o}.${l}`))){const e=[t].concat(t.clones);for(var c of(e.pop(),e))x.addClass(c.nodes.post,"qphl")}},mouseout(){let e;if(!(e=this.el.firstElementChild))return;x.event("PostsRemoved",null,Ye.hover);let t=w.postFromRoot(e).origin;if(t.rmClone(e.dataset.clone),a["Quote Highlighting"])for(t of[t].concat(t.clones))x.rmClass(t.nodes.post,"qphl")}},Ie={showHiddenThreads:!1,changed:{},enabledOn:({siteID:e,boardID:t})=>a["JSON Index"]&&"yotsuba"===i.sites[e].software&&"f"!==t,init(){let e,t,o;if("index"!==i.VIEW)return;if(x.one(s,"4chanXInitFinished",this.cb.initFinished),x.on(s,"PostsInserted",this.cb.postsInserted),!this.enabledOn(i.BOARD))return;this.enabled=!0,c.Post.push({name:"Index Page Numbers",cb:this.node}),c.CatalogThread.push({name:"Catalog Features",cb:this.catalogNode}),this.search=history.state?.searched||"", +history.state?.mode&&(a["Index Mode"]=history.state?.mode),this.currentSort=history.state?.sort,this.currentSort||(this.currentSort="object"==typeof a["Index Sort"]?a["Index Sort"][i.BOARD.ID]||"bump":a["Index Sort"]),this.currentPage=this.getCurrentPage(),this.processHash(),x.addClass(r,"index-loading",`${a["Index Mode"].replace(/\ /g,"-")}-mode`),x.on(window,"popstate",this.cb.popstate),x.on(s,"scroll",this.scroll),x.on(s,"SortIndex",this.cb.resort),this.button=x.el("a",{title:"Refresh",href:"javascript:;"}),M.set(this.button,"refresh","Refresh"),x.on(this.button,"click",(()=>Ie.update())),Ye.addShortcut("index-refresh",this.button,590);const n=[];for(o in this.inputs=t=p(),h.Index){var l=h.Index[o];if(l instanceof Array){var d=X.checkbox(o,`${o[0]}${o.slice(1).toLowerCase()}`);d.title=l[1],n.push({el:d}),e=d.firstChild,x.on(e,"change",x.cb.checked),t[o]=e}}x.on(t["Show Replies"],"change",this.cb.replies),x.on(t["Catalog Hover Expand"],"change",this.cb.hover), +x.on(t["Pin Watched Threads"],"change",this.cb.resort),x.on(t["Anchor Hidden Threads"],"change",this.cb.resort);const u=function(o){if(e=x.getOwn(t,o.target.name))return e.checked=o.target.checked,x.event("change",null,e)};x.on(s,"OpenSettings",(()=>x.on(x.id("fourchanx-settings"),"change",u)));const g=X.checkbox("Per-Board Sort Type","Per-board sort type","object"==typeof a["Index Sort"]);for(var f of(g.title="Set the sorting order of each board independently.",x.on(g.firstChild,"change",this.cb.perBoardSort),n.splice(3,0,{el:g}),Ye.menu.addEntry({el:x.el("span",{textContent:"Index Navigation"}),order:100,subEntries:n}),this.navLinks=x.el("div",{className:"navLinks json-index"}),x.extend(this.navLinks,{ innerHTML:'Index Catalog Archive Bottom ... × — [Show] Index Sort Bump order Last reply Last long reply Creation date Reply count File count Posts per minute Image Size Small Large Index Mode Paged Infinite scrolling All threads Catalog ' }),x(".cataloglink a",this.navLinks).href=_e.catalog(),ne.isArchived(i.BOARD.ID)||(x(".archlistlink",this.navLinks).hidden=!0),x.on(x("#index-last-refresh a",this.navLinks),"click",this.cb.refreshFront),this.searchInput=x("#index-search",this.navLinks),this.setupSearch(),x.on(this.searchInput,"input",this.onSearchInput),x.on(x("#index-search-clear",this.navLinks),"click",this.clearSearch),this.hideLabel=x("#hidden-label",this.navLinks),x.on(x("#hidden-toggle a",this.navLinks),"click",this.cb.toggleHiddenThreads),this.selectRev=x("#index-rev",this.navLinks),this.selectMode=x("#index-mode",this.navLinks),this.selectSort=x("#index-sort",this.navLinks),this.selectSize=x("#index-size",this.navLinks),x.on(this.selectRev,"change",this.cb.sort),x.on(this.selectMode,"change",this.cb.mode),x.on(this.selectSort,"change",this.cb.sort),x.on(this.selectSize,"change",x.cb.value),x.on(this.selectSize,"change",this.cb.size),[this.selectMode,this.selectSize]))f.value=a[f.name] ;this.selectRev.checked=/-rev$/.test(Ie.currentSort),this.selectSort.value=Ie.currentSort.replace(/-rev$/,""),this.lastLongOptions=x("#lastlong-options",this.navLinks),this.lastLongInputs=S("input",this.lastLongOptions),this.lastLongThresholds=[0,0],this.lastLongOptions.hidden="lastlong"!==this.selectSort.value;for(let t=0;t Previous Next Catalog '}),x(".cataloglink a",this.pagelist).href=_e.catalog(),x.on(this.pagelist,"click",this.cb.pageNav),this.update(!0),x.onExists(r,"title + *",(()=>s.title=s.title.replace(/\ -\ Page\ \d+/,""))),x.onExists(r,".board > .thread > .postContainer, .board + *",(function(){let e;i.SITE.Build.hat=x(".board > .thread > img:first-child"),i.SITE.Build.hat&&(i.BOARD.threads.forEach((function(e){if(e.nodes.root)return x.prepend(e.nodes.root,i.SITE.Build.hat.cloneNode(!1))})),x.addClass(r,"hats-enabled"),x.addStyle(`.catalog-thread::after {background-image: url(${i.SITE.Build.hat.src});}`));const t=x(".board");x.replace(t,Ie.root),Ie.loaded&&x.event("PostsInserted",null,Ie.root);try{s.implementation.createDocument(null,null,null).appendChild(t)}catch(e){} for(e of S(".navLinks"))x.rm(e);x.rm(x.id("ctrl-top"));const o=x.id("delform").previousElementSibling;x.before(o,x.el("hr")),x.before(o,Ie.navLinks);const a=x("#index-last-refresh time",Ie.navLinks);if(a.dataset.utc)return de.update(a)})),Pt.ready((function(){let e;return(e=x(".pagelist"))&&x.replace(e,Ie.pagelist),x.rmClass(r,"index-loading")}))},scroll(){if(Ie.req||!Ie.liveThreadData||"infinite"!==a["Index Mode"]||window.scrollY<=r.scrollHeight-(300+window.innerHeight))return;null==Ie.pageNum&&(Ie.pageNum=Ie.currentPage);const e=++Ie.pageNum;if(e>Ie.pagesNum)return Ie.endNotice();const t=Ie.threadsOnPage(e);return Ie.buildStructure(t)},endNotice:function(){let e=!1;const t=()=>e=!1;return function(){if(!e)return e=!0,new Ke("info","Last page reached.",2),setTimeout(t,3e3)}}(),menu:{init(){if("index"===i.VIEW&&a.Menu&&a["Thread Hiding Link"]&&Ie.enabledOn(i.BOARD))return se.menu.addEntry({el:x.el("a",{href:"javascript:;",className:"has-shortcut-text"},{ -innerHTML:'Shift+click'}),order:20,open({thread:e}){return"catalog"===a["Index Mode"]&&(this.el.firstElementChild.textContent=e.isHidden?"Unhide":"Hide",this.cb&&x.off(this.el,"click",this.cb),this.cb=function(){return x.event("CloseMenu"),Ie.toggleHide(e)},x.on(this.el,"click",this.cb),!0)}})}},node(){if(!this.isReply&&!this.isClone&&null!=Ie.threadPosition[this.ID])return this.thread.setPage(Math.floor(Ie.threadPosition[this.ID]/Ie.threadsNumPerPage)+1)},catalogNode(){return x.on(this.nodes.root,"mousedown click",(e=>{0===e.button&&e.shiftKey&&"click"===e.type&&(e.preventDefault(),a["MD5 Quick Filter in the Catalog"]&&e.target.classList.contains("catalog-thumb")?Je.quickFilterMD5.call(this.thread.OP):Ie.toggleHide(this.thread))}))},toggleHide(e){if(Ie.showHiddenThreads){if(Ce.show(e),!Ce.db.get({boardID:e.board.ID,threadID:e.ID}))return}else Ce.hide(e);return Ce.saveHiddenState(e)},cycleSortType(){let e +innerHTML:'Shift+click'}),order:20,open({thread:e}){return"catalog"===a["Index Mode"]&&(this.el.firstElementChild.textContent=e.isHidden?"Unhide":"Hide",this.cb&&x.off(this.el,"click",this.cb),this.cb=function(){return x.event("CloseMenu"),Ie.toggleHide(e)},x.on(this.el,"click",this.cb),!0)}})}},node(){if(!this.isReply&&!this.isClone&&null!=Ie.threadPosition[this.ID])return this.thread.setPage(Math.floor(Ie.threadPosition[this.ID]/Ie.threadsNumPerPage)+1)},catalogNode(){return x.on(this.nodes.root,"click",(e=>{0===e.button&&e.shiftKey&&(e.preventDefault(),getSelection().removeAllRanges(),a["MD5 Quick Filter in the Catalog"]&&e.target.classList.contains("catalog-thumb")?Je.quickFilterMD5.call(this.thread.OP):Ie.toggleHide(this.thread))}))},toggleHide(e){if(Ie.showHiddenThreads){if(Ce.show(e),!Ce.db.get({boardID:e.board.ID,threadID:e.ID}))return}else Ce.hide(e);return Ce.saveHiddenState(e)},cycleSortType(){let e ;const t=Ie.selectSort.options.filter((e=>!e.disabled));for(e=0;e(Ie.initFinishedFired=!0,x.queueTask((()=>Ie.cb.postsInserted()))),postsInserted(){if(!Ie.initFinishedFired)return;let e=0;return i.posts.forEach((function(t){if(!t.isFetchedQuote&&!t.indexRefreshSeen&&r.contains(t.nodes.root))return t.indexRefreshSeen=!0,e++})),e?x.event("IndexRefresh"):void 0},toggleHiddenThreads:()=>(x("#hidden-toggle a",Ie.navLinks).textContent=(Ie.showHiddenThreads=!Ie.showHiddenThreads)?"Hide":"Show",Ie.sort(),Ie.buildIndex()),mode(){return Ie.pushState({mode:this.value}),Ie.pageLoad(!1)},sort(){const e=Ie.selectRev.checked?Ie.selectSort.value+"-rev":Ie.selectSort.value;return Ie.pushState({sort:e}),Ie.pageLoad(!1)},resort(e){if(Ie.changed.order=!0,!e?.detail?.deferred)return Ie.pageLoad(!1)},perBoardSort(){a["Index Sort"]=this.checked?p():"",Ie.saveSort() ;for(let e=0;e<2;e++)a[`Last Long Reply Thresholds ${e}`]=this.checked?p():"",Ie.saveLastLongThresholds(e)},lastLongThresholds(){const e=[...this.parentNode.children].indexOf(this),t=+this.value;if(Number.isFinite(t))return Ie.lastLongThresholds[e]=t,Ie.saveLastLongThresholds(e),Ie.changed.order=!0,Ie.pageLoad(!1);this.value=Ie.lastLongThresholds[e]},size(e){if("catalog"!==a["Index Mode"]?(x.rmClass(Ie.root,"catalog-small"),x.rmClass(Ie.root,"catalog-large")):"small"===a["Index Size"]?(x.addClass(Ie.root,"catalog-small"),x.rmClass(Ie.root,"catalog-large")):(x.addClass(Ie.root,"catalog-large"),x.rmClass(Ie.root,"catalog-small")),e)return Ie.buildIndex()},replies:()=>Ie.buildIndex(),hover:()=>r.classList.toggle("catalog-hover-expand",a["Catalog Hover Expand"]),hoverToggle(e){if(a["Catalog Hover Toggle"]&&x.hasClass(r,"catalog-mode")&&!x.modifiedClick(e)&&!x.x("ancestor-or-self::a",e.target)){let t;const o=Ie.inputs["Catalog Hover Expand"];if(o.checked=!o.checked,x.event("change",null,o), t=w.threadFromNode(e.target))return Ie.cb.catalogReplies.call(t),Ie.cb.hoverAdjust.call(t.OP.nodes)}},popstate(e){if(e?.state){const{searched:t,mode:o,sort:a}=e.state,i=Ie.getCurrentPage();return Ie.setState({search:t,mode:o,sort:a,page:i}),Ie.pageLoad(!1)}{const e=Ie.processHash();return a["Refreshed Navigation"]&&e?Ie.update():Ie.pageLoad()}},pageNav(e){let t;if(!x.modifiedClick(e)){switch(e.target.nodeName){case"BUTTON":e.target.blur(),t=e.target.parentNode;break;case"A":t=e.target;break;default:return}if("Catalog"!==t.textContent)return e.preventDefault(),Ie.userPageNav(+t.pathname.split(/\/+/)[2]||1)}},refreshFront:()=>(Ie.pushState({page:1}),Ie.update()),catalogReplies(){if(a["Show Replies"]&&x.hasClass(r,"catalog-hover-expand")&&!this.catalogView.nodes.replies)return Ie.buildCatalogReplies(this)},hoverAdjust(){let e;if(!x.hasClass(r,"catalog-hover-expand"))return;const t=this.post.getBoundingClientRect();if(e=x.minmax(0,-t.left,r.clientWidth-t.right)){const{style:t}=this.post @@ -463,7 +463,7 @@ texPreviewShow:()=>x.hasClass(Me.nodes.el,"tex-preview")?Me.texPreviewHide():(x. innerHTML:'Could not open file. [More info]'}),Me.error(e)},setFile(e){const{file:t,name:o,source:a}=e.detail;return null!=o&&(t.name=o),null!=a&&(t.source=a),Me.open(),Me.handleFiles([t])},drag(e){const t="dragstart"===e.type?x.off:x.on;return t(s,"dragover",Me.dragOver),t(s,"drop",Me.dropFile)},dragOver:e=>(e.preventDefault(),e.dataTransfer.dropEffect="copy"),dropFile(e){if(e.dataTransfer.files.length)return e.preventDefault(),Me.open(),Me.handleFiles(e.dataTransfer.files)},paste(e){if(!e.clipboardData.items)return;let t=null,o=-1;for(var i of e.clipboardData.items){var n;if("file"===i.kind&&(n=i.getAsFile())){var s=2*+(n.size<=Me.max_size)+ +("image/png"===n.type);s>o&&(t=n,o=s)}}if(t){const{type:e}=t,o=new Blob([t],{type:e});o.name=`${a.pastedname}.${x.getOwn(Me.extensionFromType,e)||"jpg"}`,Me.open(),Me.handleFiles([o])}},pasteFF(){const{pasteArea:e}=Me.nodes;if(!e.childNodes.length)return;const t=S("img",e) ;for(var o of(x.rmAll(e),t)){var i,{src:n}=o;if(i=n.match(/data:(image\/(\w+));base64,(.+)/)){var s=atob(i[3]),r=new Uint8Array(s.length);for(let e=0;e Quick Reply ✕ New thread ∀ TEX + Width: Height: No selected file S ✎︎ C V R U ✕ 🔗︎ 📋︎ 🕒︎ ✂️ ➕︎ Hentai Porn Japanese Anime Game Loop Other ' +innerHTML:' Quick Reply ✕ New thread ∀ TEX + Width: Height: No selected file S ✎︎ C V R U ✕ 🔗︎ 📋︎ 🕒︎ ✂️ ➕︎ Hentai Porn Japanese Anime Game Loop Other ' })};const r=(t,a)=>o[t]=x(a,e);r("move",".move"),r("autohide","#autohide"),r("close",".close"),r("thread","select"),r("form","form"),r("sjisToggle","#sjis-toggle"),r("texButton","#tex-preview-button"),r("name","[data-name=name]"),r("email","[data-name=email]"),r("sub","[data-name=sub]"),r("com","[data-name=com]"),r("charCount","#char-count"),r("texPreview","#tex-preview"),r("dumpList","#dump-list"),r("addPost","#add-post"),r("oekaki",".oekaki"),r("drawButton","#qr-draw-button"),r("randomizeButton","#qr-randomize"),r("compress","#qr-jpg"),r("view","#qr-view"),r("restoreNameButton","#qr-restore-name"),r("fileSubmit","#file-n-submit"),r("fileButton","#qr-file-button"),r("noFile","#qr-no-file"),r("filename","#qr-filename"),r("spoiler","#qr-file-spoiler"),r("oekakiButton","#qr-oekaki-button"),r("fileRM","#qr-filerm"),r("urlButton","#url-button"),r("pasteArea","#paste-area"),r("customCooldown","#custom-cooldown-button"),r("dumpButton","#dump-button"),r("status","[type=submit]"), r("flashTag","[name=filetag]"),r("fileInput","[type=file]"),r("splitPost","#split-post");const{config:l}=i.BOARD,{classList:d}=Me.nodes.el;d.toggle("forced-anon",Me.forcedAnon),d.toggle("has-spoiler",Me.spoiler),d.toggle("has-sjis",!!l.sjis_tags),d.toggle("has-math",!!l.math_tags),d.toggle("sjis-preview",!!l.sjis_tags&&a.sjisPreview),d.toggle("show-new-thread-option",a["Show New Thread Option in Threads"]),parseInt(a.customCooldown,10)>0&&(x.addClass(Me.nodes.fileSubmit,"custom-cooldown"),x.get("customCooldownEnabled",a.customCooldownEnabled,(function({customCooldownEnabled:e}){return Me.setCustomCooldown(e),x.sync("customCooldownEnabled",Me.setCustomCooldown)}))),Me.flagsInput(),x.on(o.autohide,"change",Me.toggleHide),x.on(o.close,"click",Me.close),x.on(o.status,"click",Me.submit),x.on(o.form,"submit",Me.submit),x.on(o.sjisToggle,"click",Me.toggleSJIS),x.on(o.texButton,"mousedown",Me.texPreviewShow),x.on(o.texButton,"mouseup",Me.texPreviewHide), x.on(o.addPost,"click",(()=>new Me.post(!0))),x.on(o.drawButton,"click",Me.oekaki.draw),x.on(o.fileButton,"click",Me.openFileInput),x.on(o.noFile,"click",Me.openFileInput),x.on(o.randomizeButton,"click",(()=>{Me.selected.randomizeName()})),x.on(o.compress,"click",(async()=>{Me.handleFiles([await Me.convert(Me.selected.file)])})),x.on(o.view,"click",Me.preview),x.on(o.restoreNameButton,"click",(()=>{Me.selected.restoreName()})),x.on(o.filename,"focus",(function(){return x.addClass(this.parentNode,"focus")})),x.on(o.filename,"blur",(function(){return x.rmClass(this.parentNode,"focus")})),x.on(o.spoiler,"change",(()=>Me.selected.nodes.spoiler.click())),x.on(o.oekakiButton,"click",Me.oekaki.button),x.on(o.fileRM,"click",(()=>Me.selected.rmFile())),x.on(o.urlButton,"click",(()=>Me.handleUrl(""))),x.on(o.customCooldown,"click",Me.toggleCustomCooldown),x.on(o.dumpButton,"click",(()=>o.el.classList.toggle("dump"))),x.on(o.fileInput,"change",Me.handleFiles), @@ -545,7 +545,7 @@ innerHTML:'Filter is disabled. Use < }),x("#filterTypes",t).textContent=`type:${o};`,x(".warning",t).hidden=a.Filter},sauce(e){x.extend(e,{ innerHTML:'Sauce is disabled. [expand] These parameters will be replaced by their corresponding values in the URL and displayed text: %IMG: Full image URL for GIF, JPG, and PNG; thumbnail URL for other types. %URL: Full image URL. %TURL: Thumbnail URL. %name: Original file name. %board: Current board. %MD5: MD5 hash in base64. %sMD5: MD5 hash in base64 using - and _. %hMD5: MD5 hash in hexadecimal. %$0: Matched regular expression within the filename. %$1, %$2, %$3, ... : Subexpressions within the matched regular expression. %%, %semi: Literal % and ;. Lines starting with a # will be ignored. You can specify a display text by appending ;text:[text] to the URL. You can specify the applicable boards/sites by appending ;boards:[board1],[board2]. See the Filter guide for details. You can specify the applicable file types by appending ;types:[extension1],[extension2]. You can specify a regular expression the filename must match by appending ;regexp:[regular expression]. ' }),x(".warning",e).hidden=a.Sauce;const t=x("textarea",e);x.get("sauces",a.sauces,(function(e){t.value=e.sauces,t.hidden=!1})),x.on(t,"change",x.cb.value)},advanced(e){let t,o;for(var i of(x.extend(e,{ -innerHTML:' Archives 404 Redirect is disabled. Thread redirection Thread fetching Post fetching File redirection Archive Lists: Each line below should be an archive list in this format or a URL to load an archive list from. Archive properties can be overriden by another item with the same uid (or if absent, its name). Update now Last updated: Auto-update External Catalog External Catalog is disabled. This will be used only as a fallback. URLs of external catalog sites, where %board is to be replaced by the board name. Each URL should be followed by ;boards: and optionally ;exclude: and a list of supported/excluded boards in the format explained in the Filter guide. Override 4chan Image Host Change 4chan image links to this domain. Leave blank for no change. Captcha Language Choose from list of language codes. Leave blank to autoselect. Custom Board Navigation New lines will be converted into spaces. In the following examples for /g/, g can be changed to a different board ID (a, b, etc...), the current board (current), or the Twitter link (@). Board link: g Archive link: g-archive Internal archive link: g-expired Title link: g-title Board link (Replace with title when on that board): g-replace Full text link: g-full Custom text link: g-text:"Install Gentoo" Index-only link: g-index Catalog-only link: g-catalog Index mode: g-mode:"infinite scrolling" Index sort: g-sort:"creation date rev" External link: external-text:"Google","http://www.google.com" Open in new tab: g-nt Combinations are possible: g-index-text:"Technology Index" Full board list toggle: toggle-all [ toggle-all ] [current-title] [g-title / a-title / jp-title] [x / wsg / h] [t-text:"Piracy"] will give you [ + ] [Technology] [Technology / Anime & Manga / Otaku Culture] [x / wsg / h] [Piracy] if you are on /g/. For custom styling, you can wrap groups or individual links in {{ and }}, to wrap them in a span. You can also add classes in double quotes right after the {{. For example: [g-title] {{"favorites"[a-title / jp-title]}} Results in: [<a [...] >Technology</a>] <span class="favorites">[<a [...] >Anime & Manga</a> / <a [...] >Otaku Culture</a>]</span> Time Formatting is disabled, relative time setting still applies. : Supported format specifiers: Day: %a, %A, %d, %e Month: %m, %b, %B Year: %y, %Y Hour: %k, %H, %l, %I, %p, %P Minute: %M Second: %S Literal %: %% Language tag: Relative time, like "3 minutes ago": Disabled Show when hovering on the date Show relative time, and time and date on hover Show both timestamp and relative date Show both relative date and timestamp Quote Backlinks formatting is disabled. : Default pasted content filename .png File Info Formatting is disabled. : Link: %l (truncated), %L (untruncated), %T (4chan filename) Filename: %n (truncated), %N (untruncated), %t (4chan filename) Download button: %d Quick filter MD5: %f Spoiler indicator: %p Size: %B (Bytes), %K (KB), %M (MB), %s (4chan default) Resolution: %r (Displays 'PDF' for PDF files) Tag: %g Literal %: %% Quick Reply Personas One item per line. Items will be added in the relevant input's auto-completion list. Password items will always be used, since there is no password input. Lines starting with a # will be ignored. You can use these settings with each item, separate them with semicolons: Possible items are: name, options (or equivalently email), subject and password. Wrap values of items with quotes, like this: options:"sage". Force values as defaults with the always keyword, for example: options:"sage";always. Select specific boards for an item, separated with commas, for example: options:"sage";boards:jp;always. Unread Favicon is disabled. ferongr xat- 4chanJS Mayhem Original Metro Thread Updater is disabled. Interval: seconds Custom Cooldown Time Seconds: Custom CSS For more information about customizing 4chan X's CSS, see the styling guide. Apply CSS Javascript Whitelist Sources from which Javascript is allowed to be loaded by Content Security Policy. Lines starting with a # will be ignored. Known Banners List of known banners, used for click-to-change feature. X (formerly Twitter) embeds Only applies if embeds are enabled in the main settings Service to use for embeds FxTwitter Twitframe Language to translate FxTwitter embeds to, as a two character ISO code, like en. Leave empty for no translation. FxTwitter endpoint FxTwitter maximum amount of replies include Thread updater sound Sound volume, between 0 and 1: Sound url. Can be a base64 one starting with data:. Leave empty for the default beep. ' +innerHTML:' Archives 404 Redirect is disabled. Thread redirection Thread fetching Post fetching File redirection Archive Lists: Each line below should be an archive list in this format or a URL to load an archive list from. Archive properties can be overriden by another item with the same uid (or if absent, its name). Update now Last updated: Auto-update External Catalog External Catalog is disabled. This will be used only as a fallback. URLs of external catalog sites, where %board is to be replaced by the board name. Each URL should be followed by ;boards: and optionally ;exclude: and a list of supported/excluded boards in the format explained in the Filter guide. Override 4chan Image Host Change 4chan image links to this domain. Leave blank for no change. Captcha Language Choose from list of language codes. Leave blank to autoselect. Custom Board Navigation New lines will be converted into spaces. In the following examples for /g/, g can be changed to a different board ID (a, b, etc...), the current board (current), or the Twitter link (@). Board link: g Archive link: g-archive Internal archive link: g-expired Title link: g-title Board link (Replace with title when on that board): g-replace Full text link: g-full Custom text link: g-text:"Install Gentoo" Index-only link: g-index Catalog-only link: g-catalog Index mode: g-mode:"infinite scrolling" Index sort: g-sort:"creation date rev" External link: external-text:"Google","http://www.google.com" Open in new tab: g-nt Combinations are possible: g-index-text:"Technology Index" Full board list toggle: toggle-all [ toggle-all ] [current-title] [g-title / a-title / jp-title] [x / wsg / h] [t-text:"Piracy"] will give you [ + ] [Technology] [Technology / Anime & Manga / Otaku Culture] [x / wsg / h] [Piracy] if you are on /g/. For custom styling, you can wrap groups or individual links in {{ and }}, to wrap them in a span. You can also add classes in double quotes right after the {{. For example: [g-title] {{"favorites"[a-title / jp-title]}} Results in: [<a [...] >Technology</a>] <span class="favorites">[<a [...] >Anime & Manga</a> / <a [...] >Otaku Culture</a>]</span> Time Formatting is disabled, relative time setting still applies. : Supported format specifiers: Day: %a, %A, %d, %e Month: %m, %b, %B Year: %y, %Y Hour: %k, %H, %l, %I, %p, %P Minute: %M Second: %S Literal %: %% Language tag: Relative time, like "3 minutes ago": Disabled Show when hovering on the date Show relative time, and time and date on hover Show both timestamp and relative date Show both relative date and timestamp Quote Backlinks formatting is disabled. : Default pasted content filename .png File Info Formatting is disabled. : Link: %l (truncated), %L (untruncated), %T (4chan filename) Filename: %n (truncated), %N (untruncated), %t (4chan filename) Download button: %d Quick filter MD5: %f Spoiler indicator: %p Size: %B (Bytes), %K (KB), %M (MB), %s (4chan default) Resolution: %r (Displays 'PDF' for PDF files) Tag: %g Literal %: %% Quick Reply Personas One item per line. Items will be added in the relevant input's auto-completion list. Password items will always be used, since there is no password input. Lines starting with a # will be ignored. You can use these settings with each item, separate them with semicolons: Possible items are: name, options (or equivalently email), subject and password. Wrap values of items with quotes, like this: options:"sage". Force values as defaults with the always keyword, for example: options:"sage";always. Select specific boards for an item, separated with commas, for example: options:"sage";boards:jp;always. Unread Favicon is disabled. ferongr xat- 4chanJS Mayhem Original Metro Thread Updater is disabled. Interval: seconds Custom Cooldown Time Seconds: Custom CSS For more information about customizing 4chan X's CSS, see the styling guide. Apply CSS Javascript Whitelist Sources from which Javascript is allowed to be loaded by Content Security Policy. Lines starting with a # will be ignored. Remove or comment out all lines to allow everything. Known Banners List of known banners, used for click-to-change feature. X (formerly Twitter) embeds Only applies if embeds are enabled in the main settings Service to use for embeds FxTwitter Twitframe Language to translate FxTwitter embeds to, as a two character ISO code, like en. Leave empty for no translation. FxTwitter endpoint FxTwitter maximum amount of replies include Thread updater sound Sound volume, between 0 and 1: Sound url. Can be a base64 one starting with data:. Leave empty for the default beep. ' }),S(".warning",e)))i.hidden=a[i.dataset.feature];const n=p();for(t of S("[name]",e))n[t.name]=t;x.on(n.archiveLists,"change",(function(){x.set("lastarchivecheck",0),a.lastarchivecheck=0,x.id("lastarchivecheck").textContent="never"}));const s=p();for(o in n)if(t=n[o],!["Interval","Custom CSS","timeLocale"].includes(o)){s[o]=a[o];var r="SELECT"===t.nodeName||["checkbox","radio"].includes(t.type)||"TEXTAREA"===t.nodeName&&!(o in We)?"change":"input";x.on(t,r,x.cb["checkbox"===t.type?"checked":"value"]),o in We&&x.on(t,r,We[o])}x.get(s,(function(e){for(var o in e){var a=e[o];t=n[o],t["checkbox"===t.type?"checked":"value"]=a,t.hidden=!1,o in We&&We[o].call(t)}}));const l=x.id("list-fourchanImageHost");for(var d of T.suggestions)x.add(l,x.el("option",{textContent:d}));const c=n.Interval,h=n["Custom CSS"],u=x("#apply-css",e),g=n.timeLocale;c.value=a.Interval,h.checked=a["Custom CSS"],n.usercss.disabled=!a["Custom CSS"],u.disabled=!a["Custom CSS"],g.value=a.timeLocale, x.on(c,"change",Ne.cb.interval),x.on(h,"change",We.togglecss),x.on(u,"click",(()=>N.update())),x.on(g,"change",We.setTimeLocale);const f=p();for(o of["archives","selectedArchives","lastarchivecheck"])f[o]=a[o];x.get(f,(function(t){x.extend(a,t),Xe.selectArchives(),We.addArchiveTable(e)}));const m=x("#archive-board-select",e),b=x("#archive-table",e),v=x("#update-archives",e);x.on(m,"change",(function(){x("tbody > :not([hidden])",b).hidden=!0,x(`tbody > .${this.value}`,b).hidden=!1})),x.on(v,"click",(()=>Xe.update((()=>We.addArchiveTable(e))))),x.on(n.beepVolume,"change",(()=>{Ne.playBeep(!1)})),x.on(n.beepSource,"change",(()=>{Ne.playBeep(!1)}))},addArchiveTable(e){let t,o;x("#lastarchivecheck",e).textContent=0===a.lastarchivecheck?"never":new Date(a.lastarchivecheck).toLocaleString();const n=x("#archive-board-select",e),s=x("#archive-table",e),r=x("tbody",e);x.rmAll(n),x.rmAll(r);const l=p() ;for(var{uid:d,name:c,boards:h,files:u,software:g}of a.archives)if(["fuuka","foolfuuka"].includes(g))for(t of h){o=l[t]||(l[t]={thread:[],threadJSON:[],post:[],file:[]}),o.threadJSON||(o.threadJSON=[]);var f=[d??c,c];o.thread.push(f),"foolfuuka"===g&&(o.post.push(f),o.threadJSON.push(f)),u.includes(t)&&o.file.push(f)}const m=[],b=[];for(t of Object.keys(l).sort()){var v=x.el("tr",{className:`board-${t}`});for(var A of(v.hidden=t!==i.BOARD.ID,b.push(x.el("option",{textContent:`/${t}/`,value:`board-${t}`,selected:t===i.BOARD.ID})),o=l[t],["thread","threadJSON","post","file"]))x.add(v,We.addArchiveCell(t,o,A));m.push(v)}if(0!==m.length)for(t in n.hidden=s.hidden=!1,i.BOARD.ID in l||(m[0].hidden=!1),x.add(n,b),x.add(r,m),a.selectedArchives){var w=a.selectedArchives[t];for(var y in w){var k,I=w[y];(k=x(`select[data-boardid='${t}'][data-type='${y}']`,r))&&(k.value=JSON.stringify(I),k.value||(k.value=k.firstChild.value))}}else n.hidden=s.hidden=!0},addArchiveCell(e,t,o){ @@ -626,10 +626,10 @@ if(["index","thread"].includes(i.VIEW)&&a["Mark Cross-thread Quotes"])return a[" ;if(this.isClone&&o.includes(this.thread.fullID))for(e=0;t=a[e++];)x.rm(x(".qmark-op",t));const{fullID:i}=this.context.thread;if(o.includes(i))for(e=0;t=a[e++];){var{boardID:n,postID:s}=w.postDataFromLink(t);`${n}.${s}`===i&&x.add(t,Bt.mark.cloneNode(!0))}}};const Nt={init(){if(["index","thread"].includes(i.VIEW)&&(a["Reply Hiding Buttons"]||a.Menu&&a["Reply Hiding Link"]||a.Filter))return c.Post.push({name:"Strike-through Quotes",cb:this.node})},node(){if(!this.isClone)for(var e of this.nodes.quotelinks){var{boardID:t,postID:o}=w.postDataFromLink(e);i.posts.get(`${t}.${o}`)?.isHidden&&x.addClass(e,"filtered")}}};var Lt={init(){if(["index","thread"].includes(i.VIEW)&&a["Resurrect Quotes"])return x.addClass(r,"resurrect-quotes"),a["Comment Expansion"]&&ue.callbacks.push(this.node),c.Post.push({name:"Resurrect Quotes",cb:this.node})},node(){if(this.isClone)this.nodes.archivelinks=S("a.linkify.quotelink",this.nodes.comment);else{ for(var e of S("a.linkify",this.nodes.comment))Lt.parseArchivelink.call(this,e);for(var t of S(".deadlink",this.nodes.comment))Lt.parseDeadlink.call(this,t)}},parseArchivelink(e){let t;if(!(t=e.pathname.match(/^\/([^/]+)\/thread\/S?(\d+)\/?$/)))return;if(["boards.4chan.org","boards.4channel.org"].includes(e.hostname))return;const o=t[1],a=t[2],i=e.hash.match(/^#[pq]?(\d+)$|$/)[1]||a;return Xe.to("post",{boardID:o,postID:i})?(x.addClass(e,"quotelink"),x.extend(e.dataset,{boardID:o,threadID:a,postID:i}),this.nodes.archivelinks.push(e)):void 0},parseDeadlink(e){let t,o,a,n;if(x.hasClass(e.parentNode,"prettyprint"))return void Lt.fixDeadlink(e);const s=e.textContent;if(!(n=s.match(/\d+$/)?.[0]))return;if("0"===n[0])return void Lt.fixDeadlink(e);const r=(o=s.match(/^>>>\/([a-z\d]+)/))?o[1]:this.board.ID,l=`${r}.${n}`;if(a=i.posts.get(l))a.isDead?(t=x.el("a",{href:i.SITE.Build.postURL(r,a.thread.ID,n),className:"quotelink deadlink",textContent:s}),x.add(t,ae.deadMark.cloneNode(!0)), x.extend(t.dataset,{boardID:r,threadID:a.thread.ID,postID:n})):t=x.el("a",{href:i.SITE.Build.postURL(r,a.thread.ID,n),className:"quotelink",textContent:s});else{const e=Xe.to("thread",{boardID:r,threadID:0,postID:n}),o=Xe.to("post",{boardID:r,postID:n});(e||o)&&(t=x.el("a",{href:e||"javascript:;",className:"deadlink",textContent:s}),x.add(t,ae.deadMark.cloneNode(!0)),o&&(x.addClass(t,"quotelink"),x.extend(t.dataset,{boardID:r,postID:n})))}if(this.quotes.includes(l)||this.quotes.push(l),t)return x.replace(e,t),x.hasClass(t,"quotelink")?this.nodes.quotelinks.push(t):void 0;x.add(e,ae.deadMark.cloneNode(!0))},fixDeadlink(e){let t;if(!(t=e.previousSibling)||"BR"===t.nodeName){const t=x.el("span",{className:"quote"});x.before(e,t),x.add(t,e)}return x.replace(e,[...e.childNodes])}},Pt={init(){if("www.4chan.org"==window.location.hostname)return;let e;try{let e=window;if(`${o.name} antidup`in e)return;e[`${o.name} antidup`]=!0}catch(e){}try{ -if(window.frameElement&&["","about:blank"].includes(window.frameElement.src))return}catch(e){}if(r&&x.hasClass(r,"fourchan-x"))return;x.asap(d,(function(){if(x.addClass(r,"fourchan-xt","fourchan-x","seaweedchan"),x.engine)return x.addClass(r,`ua-${x.engine}`)}));try{x.global("exposeVersion",{version:i.VERSION,buildDate:i.VERSION_DATE.getTime().toString()})}catch(e){console.error(e)}x.on(s,"4chanXInitFinished",(function(){return Pt.expectInitFinished?delete Pt.expectInitFinished:(new Ke("error",`Error: Multiple copies of ${o.name} or 4chan X are enabled.`),x.addClass(r,"tainted"))}));var t=function(){return s.removeEventListener("mounted",t,!0),Pt.isMounted=!0,Pt.mountedCBs.map((e=>(()=>{try{return e()}catch(e){}})()))};s.addEventListener("mounted",t,!0);var n=function(e,t){if(t instanceof Array)a[e]=p.clone(t[0]);else if("object"==typeof t)for(var o in t){var i=t[o];n(o,i)}else a[e]=t} +if(window.frameElement&&["","about:blank"].includes(window.frameElement.src))return}catch(e){}if(r&&x.hasClass(r,"fourchan-x"))return;x.asap(d,(function(){x.addClass(r,"fourchan-xt","fourchan-x","seaweedchan"),x.engine&&x.addClass(r,`ua-${x.engine}`),ne.ready((()=>{null!=i.BOARD?.config.ws_board&&x.addClass(r,i.BOARD.config.ws_board?"ws":"nws")}))}));try{x.global("exposeVersion",{version:i.VERSION,buildDate:i.VERSION_DATE.getTime().toString()})}catch(e){console.error(e)}x.on(s,"4chanXInitFinished",(function(){return Pt.expectInitFinished?delete Pt.expectInitFinished:(new Ke("error",`Error: Multiple copies of ${o.name} or 4chan X are enabled.`),x.addClass(r,"tainted"))}));var t=function(){return s.removeEventListener("mounted",t,!0),Pt.isMounted=!0,Pt.mountedCBs.map((e=>(()=>{try{return e()}catch(e){}})()))};s.addEventListener("mounted",t,!0);var n=function(e,t){if(t instanceof Array)a[e]=p.clone(t[0]);else if("object"==typeof t)for(var o in t){var i=t[o];n(o,i)}else a[e]=t} ;for(var l of("boards.4chan.org"===location.hostname&&x.asap(d,(()=>x.onExists(r,"iframe[srcdoc]",x.rm))),n(null,h),q.keys))a[l]=p();a.customTitles=p.clone({"4chan.org":{boards:{qa:{boardTitle:{orig:"/qa/ - Question & Answer",title:"/qa/ - 2D/Random"}}}}}),a.boardConfig={boards:p()},a.archives=Xe.archives,a.selectedArchives=p(),a.cooldowns=p(),a["Index Sort"]=p();for(let e=0;e<2;e++)a[`Last Long Reply Thresholds ${e}`]=p();a.siteProperties=p(),a["Except Archives from Encryption"]=!1,a["JSON Navigation"]=!0,a["Oekaki Links"]=!0,a["Show Name and Subject"]=!1,a["QR Shortcut"]=!0,a["Bottom QR Link"]=!0,a["Toggleable Thread Watcher"]=!0,a.siteSoftware="",a["Use Faster Image Host"]="true",a["Captcha Fixes"]=!0,a.captchaServiceDomain="",a.captchaServiceKey=p(),!/\.4chan(?:nel)?\.org$/.test(location.hostname)||Qe.yotsuba.regexp.pass.test(location.href)||Qe.yotsuba.regexp.captcha.test(location.href)||S("script:not([src])",s).filter((e=>/this\[/.test(e.textContent))).length||(x.getSync||x.get)({ -jsWhitelist:a.jsWhitelist},(({jsWhitelist:e})=>x.addCSP(`script-src ${e.replace(/^#.*$/gm,"").replace(/[\s;]+/g," ").trim()}`)));const c=p();for(e in a)c[e]=void 0;return c.previousversion=void 0,(x.getSync||x.get)(c,(function(t){return x.asap(d,(function(){for(e in x.cantSet||(null==t.previousversion?(Pt.isFirstRun=!0,Pt.ready((function(){return x.set("previousversion",i.VERSION),We.open()}))):t.previousversion!==i.VERSION&&Pt.upgrade(t)),a){var o=a[e];a[e]=t[e]??o}return Ge.init(Pt.initFeatures)}))}))},upgrade(e){const{previousversion:t}=e,a=We.upgrade(e,t);return e.previousversion=a.previousversion=i.VERSION,x.set(a,(function(){if(e["Show Updated Notifications"]??1){const e=x.el("span",{innerHTML:`${o.name} has been updated to version ${i.VERSION}.`});return new Ke("info",e,15)}}))},parseURL(e=i.SITE,t=location){const o={};if(!e)return o;if(o.siteID=e.ID,e.isBoardlessPage?.(t))return o;const a=t.pathname.split(/\/+/) -;return o.boardID=a[1],e.isFileURL(t)?o.VIEW="file":e.isAuxiliaryPage?.(t)||(["thread","res"].includes(a[2])?(o.VIEW="thread",o.threadID=o.THREADID=+a[3].replace(/\.\w+$/,"")):"archive"===a[2]&&"res"===a[3]?(o.VIEW="thread",o.threadID=o.THREADID=+a[4].replace(/\.\w+$/,""),o.threadArchived=!0):/^(?:catalog|archive)(?:\.\w+)?$/.test(a[2])?o.VIEW=a[2].replace(/\.\w+$/,""):/^(?:index|\d*)(?:\.\w+)?$/.test(a[2])&&(o.VIEW="index")),o},initFeatures(){if(x.global("initMain"),Pt.jsEnabled=x.hasClass(r,"js-enabled"),x.extend(i,Pt.parseURL()),i.boardID&&(i.BOARD=new ce(i.boardID)),i.VIEW){if("file"!==i.VIEW){for(var[e,t]of(i.threads=new H,i.posts=new H,x.onExists(r,"body",Pt.initStyle),Pt.features))if(!i.SITE.disabledFeatures||!i.SITE.disabledFeatures.includes(e))try{t.init()}catch(t){Pt.handleErrors({message:`"${e}" initialization crashed.`,error:t})}return x.ready(Pt.initReady)}x.asap((()=>"loading"!==s.readyState),(function(){let e +jsWhitelist:a.jsWhitelist},(({jsWhitelist:e})=>{const t=e.replace(/^#.*$/gm,"").replace(/[\s;]+/g," ").trim();/\S/.test(t)&&x.addCSP(`script-src ${t}`)}));const c=p();for(e in a)c[e]=void 0;return c.previousversion=void 0,(x.getSync||x.get)(c,(function(t){return x.asap(d,(function(){for(e in x.cantSet||(null==t.previousversion?(Pt.isFirstRun=!0,Pt.ready((function(){return x.set("previousversion",i.VERSION),We.open()}))):t.previousversion!==i.VERSION&&Pt.upgrade(t)),a){var o=a[e];a[e]=t[e]??o}return Ge.init(Pt.initFeatures)}))}))},upgrade(e){const{previousversion:t}=e,a=We.upgrade(e,t);return e.previousversion=a.previousversion=i.VERSION,x.set(a,(function(){if(e["Show Updated Notifications"]??1){const e=x.el("span",{innerHTML:`${o.name} has been updated to version ${i.VERSION}.`});return new Ke("info",e,15)}}))},parseURL(e=i.SITE,t=location){const o={};if(!e)return o;if(o.siteID=e.ID,e.isBoardlessPage?.(t))return o +;const a=t.pathname.split(/\/+/);return o.boardID=a[1],e.isFileURL(t)?o.VIEW="file":e.isAuxiliaryPage?.(t)||(["thread","res"].includes(a[2])?(o.VIEW="thread",o.threadID=o.THREADID=+a[3].replace(/\.\w+$/,"")):"archive"===a[2]&&"res"===a[3]?(o.VIEW="thread",o.threadID=o.THREADID=+a[4].replace(/\.\w+$/,""),o.threadArchived=!0):/^(?:catalog|archive)(?:\.\w+)?$/.test(a[2])?o.VIEW=a[2].replace(/\.\w+$/,""):/^(?:index|\d*)(?:\.\w+)?$/.test(a[2])&&(o.VIEW="index")),o},initFeatures(){if(x.global("initMain"),Pt.jsEnabled=x.hasClass(r,"js-enabled"),x.extend(i,Pt.parseURL()),i.boardID&&(i.BOARD=new ce(i.boardID)),i.VIEW){if("file"!==i.VIEW){for(var[e,t]of(i.threads=new H,i.posts=new H,x.onExists(r,"body",Pt.initStyle),Pt.features))if(!i.SITE.disabledFeatures||!i.SITE.disabledFeatures.includes(e))try{t.init()}catch(t){Pt.handleErrors({message:`"${e}" initialization crashed.`,error:t})}return x.ready(Pt.initReady)}x.asap((()=>"loading"!==s.readyState),(function(){let e ;if("yotsuba"===i.SITE.software&&a["404 Redirect"]&&i.SITE.is404?.()){const e=location.pathname.split(/\/+/);return Xe.navigate("file",{boardID:i.BOARD.ID,filename:e[e.length-1]})}(e=x("video"))&&(a["Volume in New Tab"]&&ee.setup(e),a["Loop in New Tab"]&&(e.loop=!0,e.controls=!0,e.play()))}))}else i.SITE.initAuxiliary?.()},initStyle(){if(!Pt.isThisPageLegit())return;const e=x("link[href*=mobile]",s.head);e&&(e.disabled=!0),r.dataset.host=location.host,x.addClass(r,`sw-${i.SITE.software}`),x.addClass(r,"thread"===i.VIEW?"thread-view":i.VIEW),x.onExists(r,".ad-cnt, .adg-rects > .desktop",(e=>x.onExists(e,"img, iframe",(()=>x.addClass(r,"ads-loaded"))))),a["Autohiding Scrollbar"]&&x.addClass(r,"autohiding-scrollbar"),x.ready((function(){if(s.body.clientHeight>r.clientHeight&&window.innerWidth===r.clientWidth!==a["Autohiding Scrollbar"])return a["Autohiding Scrollbar"]=!a["Autohiding Scrollbar"],x.set("Autohiding Scrollbar",a["Autohiding Scrollbar"]),x.toggleClass(r,"autohiding-scrollbar") })),x.addStyle(R.sub(R.boards),"fourchanx-css"),Pt.bgColorStyle=x.el("style",{id:"fourchanx-bgcolor-css"});let t=!1;return x.on(s,"mousedown",(()=>t=!1)),x.on(s,"keydown",(function(e){if(9===e.keyCode)return t=!0})),window.addEventListener("focus",(()=>r.classList.toggle("keyboard-focus",t)),!0),Pt.setClass()},setClass(){let e,t,o;const a=["yotsuba","yotsuba-b","futaba","burichan","photon","tomorrow","spooky"];if("yotsuba"===i.SITE.software&&"catalog"===i.VIEW&&(e=x.id("base-css"))&&(t=e.href.match(/catalog_(\w+)/)?.[1].replace("_new","").replace(/_+/g,"-"),a.includes(t)))return void x.addClass(r,t);t=e=o=null;const n=function(){if("yotsuba"===i.SITE.software){for(var n of(x.rmClass(r,t),t=null,o))if(n.href===e?.href){t=n.title.toLowerCase().replace("new","").trim().replace(/\s+/g,"-"),"_special"===t&&(t=n.href.match(/[a-z]*(?=[^/]*$)/)[0]),a.includes(t)||(t=null);break}if(t)return x.addClass(r,t),void x.rm(Pt.bgColorStyle)}const l=i.SITE.bgColoredEl();l.style.position="absolute", l.style.visibility="hidden",x.add(s.body,l);let d=window.getComputedStyle(l).backgroundColor;x.rm(l);const c=d.match(/[\d.]+/g);if(!/^rgb\(/.test(d)){const e=window.getComputedStyle(s.body);d=`${e.backgroundColor} ${e.backgroundImage} ${e.backgroundRepeat} ${e.backgroundPosition}`}let h=`.dialog, .suboption-list > div:last-of-type, :root.catalog-hover-expand .catalog-container:hover > .post {\n background: ${d};\n}\n.unread-mark-read {\n background-color: rgba(${c.slice(0,3).join(", ")}, ${.5*(c[3]||1)});\n}`;return x.luma(c)<100&&(h+=".watch-thread-link { --xt-watcher: #c8c8c8 }"),Pt.bgColorStyle.textContent=h,x.after(x.id("fourchanx-css"),Pt.bgColorStyle)};if(x.onExists(s.head,i.SITE.selectors.styleSheet,(function(t){return e=t,"yotsuba"===i.SITE.software&&(o=S('link[rel="alternate stylesheet"]',s.head)),new MutationObserver(n).observe(e,{attributes:!0,attributeFilter:["href"]}),x.on(e,"load",n),n()})),!e){for(var l of S('link[rel="stylesheet"]',s.head))x.on(l,"load",n);return n()} diff --git a/builds/4chan-XT.user.js b/builds/4chan-XT.user.js index d5275b9e3..43debbd9b 100644 --- a/builds/4chan-XT.user.js +++ b/builds/4chan-XT.user.js @@ -1,6 +1,6 @@ // ==UserScript== // @name 4chan XT -// @version 2.18.0 +// @version 2.19.0 // @minGMVer 1.14 // @minFFVer 74 // @namespace 4chan-XT @@ -169,8 +169,8 @@ 'use strict'; var version = { - "version": "2.18.0", - "date": "2024-11-20T18:50:00Z" + "version": "2.19.0", + "date": "2024-12-22T16:50:00Z" }; var meta = { @@ -1193,21 +1193,7 @@ current-archive-text:"Archive"] sjisPreview: false }, - jsWhitelist: `\ -http://s.4cdn.org -https://s.4cdn.org -http://www.google.com -https://www.google.com -https://www.gstatic.com -http://cdn.mathjax.org -https://cdn.mathjax.org -https://cdnjs.cloudflare.com -https://hcaptcha.com -https://*.hcaptcha.com -'self' -'unsafe-inline' -'unsafe-eval'\ -`, + jsWhitelist: '', captchaLanguage: '', @@ -1857,11 +1843,11 @@ https://*.hcaptcha.com } }; $.ajax = (function () { - let pageXHR; + let pageXHR = XMLHttpRequest; if (window.wrappedJSObject && !XMLHttpRequest.wrappedJSObject) { - pageXHR = XPCNativeWrapper(window.wrappedJSObject.XMLHttpRequest); - } else { - pageXHR = XMLHttpRequest; + try { + pageXHR = XPCNativeWrapper(window.wrappedJSObject.XMLHttpRequest); + } catch (e) { } } return function (url, options = {}) { if (options.responseType == null) { @@ -2647,7 +2633,7 @@ https://*.hcaptcha.com separator, h("a", { class: "reset" }, "Reset Settings"), separator, - h("input", { type: "file", hidden: true }), + h("input", { type: "file", hidden: true, accept: ".json,application/json" }), h("a", { href: meta.page, target: "_blank" }, meta.name), separator, h("a", { href: meta.changelog, target: "_blank" }, g.VERSION), @@ -2931,7 +2917,7 @@ https://*.hcaptcha.com Javascript Whitelist Sources from which Javascript is allowed to be loaded by Content Security Policy. - Lines starting with a # will be ignored. + Lines starting with a # will be ignored. Remove or comment out all lines to allow everything. @@ -3840,49 +3826,6 @@ audio.controls-added { font-size: 16px; line-height: 12px; } -@media (min-width: 1300px) { - :root.sw-yotsuba.fixed:not(.centered-links) #header-bar { - white-space: nowrap; - display: flex; - align-items: center; - } - :root.sw-yotsuba.fixed:not(.centered-links) #board-list { - flex: auto; - } - :root.sw-yotsuba.fixed:not(.centered-links) #full-board-list { - display: flex; - } - :root.sw-yotsuba.fixed:not(.centered-links) .hide-board-list-container { - flex: none; - margin-right: 5px; - } - :root.sw-yotsuba.fixed:not(.centered-links) #full-board-list > .boardList { - flex: auto; - display: flex; - width: 0px; /* XXX Fixes Edge not shrinking the board list below default size when needed */ - } - :root.sw-yotsuba.fixed:not(.centered-links) #full-board-list > .boardList > a, - :root.sw-yotsuba.fixed:not(.centered-links) #full-board-list > .boardList > span:not(.space):not(.spacer) { - flex: none; - padding: .17em; - margin: -.17em -.32em; - } - :root.sw-yotsuba.fixed:not(.centered-links) #full-board-list > .boardList > span { - pointer-events: none; - } - :root.sw-yotsuba.fixed:not(.centered-links) #full-board-list > .boardList > span.space { - flex: 0 .63 .63em; - } - :root.sw-yotsuba.fixed:not(.centered-links) #full-board-list > .boardList > span.spacer { - flex: 0 .38 .38em; - } - :root.sw-yotsuba.fixed:not(.centered-links) #shortcuts { - float: initial; - flex: none; - display: flex; - align-items: center; - } -} /* 4chan X link brackets */ .brackets-wrap::before { content: "["; @@ -6383,7 +6326,7 @@ svg.icon { TEX - + @@ -10580,7 +10523,7 @@ svg.icon { if (this.cb) { $.off(this.el, 'click', this.cb); } this.cb = function() { $.event('CloseMenu'); - return ThreadWatcher.toggle(thread); + return ThreadWatcher.toggle(thread, true); }; $.on(this.el, 'click', this.cb); return true; @@ -10643,8 +10586,8 @@ svg.icon { catalogNode() { if (ThreadWatcher.isWatched(this.thread)) { $.addClass(this.nodes.root, 'watched'); } return $.on(this.nodes.root, 'mousedown click', e => { - if ((e.button !== 0) || !e.altKey) { return; } - if (e.type === 'click') { ThreadWatcher.toggle(this.thread); } + if ((e.button !== 0) || !e.altKey) return; + if (e.type === 'click') ThreadWatcher.toggle(this.thread, true); return e.preventDefault(); }); }, // Also on mousedown to prevent highlighting thumbnail in Firefox. @@ -10682,6 +10625,16 @@ svg.icon { } $.event('CloseMenu'); }, + clear() { + if (!confirm("Delete ALL threads from watcher?")) return; + const ref = ThreadWatcher.getAll(); + for (let i = 0, len = ref.length; i < len; i++) { + const { siteID, boardID, threadID } = ref[i]; + ThreadWatcher.db.delete({ siteID, boardID, threadID }); + } + ThreadWatcher.refresh(true); + $.event('CloseMenu'); + }, pruneDeads() { if ($.hasClass(this, 'disabled')) return; for (var {siteID, boardID, threadID, data} of ThreadWatcher.getAll()) { @@ -10689,7 +10642,7 @@ svg.icon { ThreadWatcher.db.delete({siteID, boardID, threadID}); } } - ThreadWatcher.refresh(); + ThreadWatcher.refresh(true); $.event('CloseMenu'); }, pruneReadDeads() { @@ -10699,7 +10652,7 @@ svg.icon { ThreadWatcher.db.delete({ siteID, boardID, threadID }); } } - ThreadWatcher.refresh(); + ThreadWatcher.refresh(true); $.event('CloseMenu'); }, dismiss() { @@ -10712,22 +10665,24 @@ svg.icon { }, toggle() { const {thread} = Get.postFromNode(this); - ThreadWatcher.toggle(thread); + ThreadWatcher.toggle(thread, true); }, rm() { const {siteID} = this.parentNode.dataset; const [boardID, threadID] = this.parentNode.dataset.fullID.split('.'); - ThreadWatcher.rm(siteID, boardID, +threadID); + ThreadWatcher.rm(siteID, boardID, +threadID, undefined, true); }, post(e) { const {boardID, threadID, postID} = e.detail; const cb = PostRedirect.delay(); if (postID === threadID) { if (Conf['Auto Watch']) { - ThreadWatcher.addRaw(boardID, threadID, {}, cb); + ThreadWatcher.addRaw(boardID, threadID, {}, cb, true); } } else if (Conf['Auto Watch Reply']) { - ThreadWatcher.add((g.threads.get(boardID + '.' + threadID) || new Thread(threadID, g.boards[boardID] || new Board(boardID))), cb); + ThreadWatcher.add( + (g.threads.get(boardID + '.' + threadID) || new Thread(threadID, g.boards[boardID] || new Board(boardID))), + cb, true); } }, onIndexUpdate(e) { @@ -11160,7 +11115,7 @@ svg.icon { return ThreadWatcher.refreshIcon(); }, - refresh() { + refresh(manual) { ThreadWatcher.build(); g.threads.forEach(function(thread) { @@ -11177,7 +11132,7 @@ svg.icon { }); if (Conf['Pin Watched Threads']) { - return $.event('SortIndex', {deferred: Conf['Index Mode'] !== 'catalog'}); + return $.event('SortIndex', {deferred: !(manual && Conf['Index Mode'] === 'catalog')}); } }, @@ -11228,18 +11183,18 @@ svg.icon { return ThreadWatcher.db.extend({boardID, threadID, val: {isDead: true, isArchived: undefined, page: undefined, lastPage: undefined, unread: undefined, quotingYou: undefined}}, cb); }, - toggle(thread) { + toggle(thread, manual) { const siteID = g.SITE.ID; const boardID = thread.board.ID; const threadID = thread.ID; if (ThreadWatcher.db.get({boardID, threadID})) { - return ThreadWatcher.rm(siteID, boardID, threadID); + return ThreadWatcher.rm(siteID, boardID, threadID, undefined, manual); } else { - return ThreadWatcher.add(thread); + return ThreadWatcher.add(thread, undefined, manual); } }, - add(thread, cb) { + add(thread, cb, manual) { const data = {}; const siteID = g.SITE.ID; const boardID = thread.board.ID; @@ -11252,16 +11207,16 @@ svg.icon { data.isDead = true; } if (thread.OP) { data.excerpt = Get.threadExcerpt(thread); } - return ThreadWatcher.addRaw(boardID, threadID, data, cb); + return ThreadWatcher.addRaw(boardID, threadID, data, cb, manual); }, - addRaw(boardID, threadID, data, cb) { + addRaw(boardID, threadID, data, cb, manual) { const oldData = ThreadWatcher.db.get({ boardID, threadID, defaultValue: dict() }); delete oldData.last; delete oldData.modified; $.extend(oldData, data); ThreadWatcher.db.set({boardID, threadID, val: oldData}, cb); - ThreadWatcher.refresh(); + ThreadWatcher.refresh(manual); const thread = {siteID: g.SITE.ID, boardID, threadID, data, force: true}; if (Conf['Show Page'] && !data.isDead) { return ThreadWatcher.fetchBoard([thread]); @@ -11270,9 +11225,9 @@ svg.icon { } }, - rm(siteID, boardID, threadID, cb) { + rm(siteID, boardID, threadID, cb, manual) { ThreadWatcher.db.delete({siteID, boardID, threadID}, cb); - return ThreadWatcher.refresh(); + return ThreadWatcher.refresh(manual); }, menu: { @@ -11303,68 +11258,71 @@ svg.icon { return true; } }); - return $.on(entryEl, 'click', () => ThreadWatcher.toggle(g.threads.get(`${g.BOARD}.${g.THREADID}`))); + return $.on(entryEl, 'click', () => ThreadWatcher.toggle(g.threads.get(`${g.BOARD}.${g.THREADID}`), true)); }, addMenuEntries() { - const entries = []; - - // `Open all` entry - entries.push({ - text: 'Open all threads', - cb: ThreadWatcher.cb.openAll, - open() { - this.el.classList.toggle('disabled', !ThreadWatcher.list.firstElementChild); - return true; - } - }); - - // `Open Unread` entry - entries.push({ - text: 'Open unread threads', - cb: ThreadWatcher.cb.openUnread, - open() { - this.el.classList.toggle('disabled', !$('.replies-unread', ThreadWatcher.list)); - return true; - } - }); - const toggleDisabledDead = function () { this.el.classList.toggle('disabled', !$('.dead-thread', ThreadWatcher.list)); return true; }; - // `Open unread dead threads` entry - entries.push({ - text: 'Open unread dead threads', - cb: ThreadWatcher.cb.openDeads, - open: toggleDisabledDead, - }); - - // `Prune all dead threads` entry - entries.push({ - text: 'Prune all dead threads', - cb: ThreadWatcher.cb.pruneDeads, - open: toggleDisabledDead, - }); - - // `Prune read dead threads` entry - entries.push({ - text: 'Prune read dead threads', - cb: ThreadWatcher.cb.pruneReadDeads, - open: toggleDisabledDead, - }); - - // `Dismiss posts quoting you` entry - entries.push({ - text: 'Dismiss posts quoting you', - title: 'Unhighlight the thread watcher icon and threads until there are new replies quoting you.', - cb: ThreadWatcher.cb.dismiss, - open() { - this.el.classList.toggle('disabled', !$.hasClass(ThreadWatcher.shortcut, 'replies-quoting-you')); - return true; - } - }); + const entries = [ + // `Open all` entry + { + text: 'Open all threads', + cb: ThreadWatcher.cb.openAll, + open() { + this.el.classList.toggle('disabled', !ThreadWatcher.list.firstElementChild); + return true; + } + }, + { + text: 'Clear all threads', + cb: ThreadWatcher.cb.clear, + open() { + this.el.classList.toggle('disabled', !ThreadWatcher.list.firstElementChild); + return true; + } + }, + // `Open Unread` entry + { + text: 'Open unread threads', + cb: ThreadWatcher.cb.openUnread, + open() { + this.el.classList.toggle('disabled', !$('.replies-unread', ThreadWatcher.list)); + return true; + } + }, + // `Open unread dead threads` entry + { + text: 'Open unread dead threads', + cb: ThreadWatcher.cb.openDeads, + open: toggleDisabledDead, + }, + // `Prune all dead threads` entry + { + text: 'Prune all dead threads', + cb: ThreadWatcher.cb.pruneDeads, + open: toggleDisabledDead, + }, + // `Prune read dead threads` entry + { + text: 'Prune read dead threads', + cb: ThreadWatcher.cb.pruneReadDeads, + open: toggleDisabledDead, + }, + // `Dismiss posts quoting you` entry + { + text: 'Dismiss posts quoting you', + title: 'Unhighlight the thread watcher icon and threads until there are new replies quoting you.', + cb: ThreadWatcher.cb.dismiss, + open() { + this.el.classList.toggle('disabled', !$.hasClass(ThreadWatcher.shortcut, 'replies-quoting-you')); + return true; + } + }, + ]; for (var {text, title, cb, open} of entries) { var entry = { @@ -11400,8 +11358,10 @@ svg.icon { entry.el.title += '\n[Remember Last Read Post is disabled.]'; } $.on(input, 'change', $.cb.checked); - if (['Current Board', 'Show Page', 'Show Unread Count', 'Show Site Prefix'].includes(name)) { $.on(input, 'change', ThreadWatcher.refresh); } - if (['Show Page', 'Show Unread Count', 'Auto Update Thread Watcher'].includes(name)) { $.on(input, 'change', ThreadWatcher.fetchAuto); } + if (['Current Board', 'Show Page', 'Show Unread Count', 'Show Site Prefix'].includes(name)) + $.on(input, 'change', () => ThreadWatcher.refresh()); + if (['Show Page', 'Show Unread Count', 'Auto Update Thread Watcher'].includes(name)) + $.on(input, 'change', ThreadWatcher.fetchAuto); return this.menu.addEntry(entry); } } @@ -12561,18 +12521,17 @@ svg.icon { }, catalogNode() { - return $.on(this.nodes.root, 'mousedown click', e => { - if ((e.button !== 0) || !e.shiftKey) { return; } - if (e.type === 'click') { - e.preventDefault(); - if (Conf['MD5 Quick Filter in the Catalog'] && e.target.classList.contains('catalog-thumb')) { - Filter.quickFilterMD5.call(this.thread.OP); - } else { - Index.toggleHide(this.thread); - } + return $.on(this.nodes.root, 'click', e => { + if ((e.button !== 0) || !e.shiftKey) return; + e.preventDefault(); + getSelection().removeAllRanges(); + if (Conf['MD5 Quick Filter in the Catalog'] && e.target.classList.contains('catalog-thumb')) { + Filter.quickFilterMD5.call(this.thread.OP); + } else { + Index.toggleHide(this.thread); } }); - }, // Also on mousedown to prevent highlighting text. + }, toggleHide(thread) { if (Index.showHiddenThreads) { @@ -25507,7 +25466,10 @@ Enable it on boards.${location.hostname.split('.')[1]}.org in your browser's pri if (doc && $.hasClass(doc, 'fourchan-x')) { return; } $.asap(docSet, function() { $.addClass(doc, 'fourchan-xt', 'fourchan-x', 'seaweedchan'); - if ($.engine) { return $.addClass(doc, `ua-${$.engine}`); } + if ($.engine) $.addClass(doc, `ua-${$.engine}`); + BoardConfig.ready(() => { + if (g.BOARD?.config.ws_board != null) $.addClass(doc, g.BOARD.config.ws_board ? 'ws' : 'nws'); + }); }); try { $.global( @@ -25591,7 +25553,10 @@ Enable it on boards.${location.hostname.split('.')[1]}.org in your browser's pri !SW.yotsuba.regexp.captcha.test(location.href) && !$$('script:not([src])', d).filter(s => /this\[/.test(s.textContent)).length ) { - ($.getSync || $.get)({'jsWhitelist': Conf['jsWhitelist']}, ({jsWhitelist}) => $.addCSP(`script-src ${jsWhitelist.replace(/^#.*$/mg, '').replace(/[\s;]+/g, ' ').trim()}`)); + ($.getSync || $.get)({'jsWhitelist': Conf['jsWhitelist']}, ({jsWhitelist}) => { + const parsedList = jsWhitelist.replace(/^#.*$/mg, '').replace(/[\s;]+/g, ' ').trim(); + if (/\S/.test(parsedList)) $.addCSP(`script-src ${parsedList}`); + }); } // Get saved values as items diff --git a/builds/crx/manifest.json b/builds/crx/manifest.json index c6ff16322..4cf99282f 100644 --- a/builds/crx/manifest.json +++ b/builds/crx/manifest.json @@ -1,6 +1,6 @@ { "name": "4chan XT", - "version": "2.18.0", + "version": "2.19.0", "manifest_version": 2, "description": "4chan XT is a script that adds various features to anonymous imageboards.", "icons": { diff --git a/builds/crx/manifestV3.json b/builds/crx/manifestV3.json index 7150990f7..3de5811b9 100644 --- a/builds/crx/manifestV3.json +++ b/builds/crx/manifestV3.json @@ -1,6 +1,6 @@ { "name": "4chan XT", - "version": "2.18.0", + "version": "2.19.0", "manifest_version": 3, "description": "4chan XT is a script that adds various features to anonymous imageboards.", "icons": { diff --git a/builds/crx/script.js b/builds/crx/script.js index b97342b6b..c75148810 100644 --- a/builds/crx/script.js +++ b/builds/crx/script.js @@ -85,8 +85,8 @@ 'use strict'; var version = { - "version": "2.18.0", - "date": "2024-11-20T18:50:00Z" + "version": "2.19.0", + "date": "2024-12-22T16:50:00Z" }; var meta = { @@ -1109,21 +1109,7 @@ current-archive-text:"Archive"] sjisPreview: false }, - jsWhitelist: `\ -http://s.4cdn.org -https://s.4cdn.org -http://www.google.com -https://www.google.com -https://www.gstatic.com -http://cdn.mathjax.org -https://cdn.mathjax.org -https://cdnjs.cloudflare.com -https://hcaptcha.com -https://*.hcaptcha.com -'self' -'unsafe-inline' -'unsafe-eval'\ -`, + jsWhitelist: '', captchaLanguage: '', @@ -1773,11 +1759,11 @@ https://*.hcaptcha.com } }; $.ajax = (function () { - let pageXHR; + let pageXHR = XMLHttpRequest; if (window.wrappedJSObject && !XMLHttpRequest.wrappedJSObject) { - pageXHR = XPCNativeWrapper(window.wrappedJSObject.XMLHttpRequest); - } else { - pageXHR = XMLHttpRequest; + try { + pageXHR = XPCNativeWrapper(window.wrappedJSObject.XMLHttpRequest); + } catch (e) { } } return function (url, options = {}) { if (options.responseType == null) { @@ -2497,7 +2483,7 @@ https://*.hcaptcha.com separator, h("a", { class: "reset" }, "Reset Settings"), separator, - h("input", { type: "file", hidden: true }), + h("input", { type: "file", hidden: true, accept: ".json,application/json" }), h("a", { href: meta.page, target: "_blank" }, meta.name), separator, h("a", { href: meta.changelog, target: "_blank" }, g.VERSION), @@ -2781,7 +2767,7 @@ https://*.hcaptcha.com Javascript Whitelist Sources from which Javascript is allowed to be loaded by Content Security Policy. - Lines starting with a # will be ignored. + Lines starting with a # will be ignored. Remove or comment out all lines to allow everything. @@ -3690,49 +3676,6 @@ audio.controls-added { font-size: 16px; line-height: 12px; } -@media (min-width: 1300px) { - :root.sw-yotsuba.fixed:not(.centered-links) #header-bar { - white-space: nowrap; - display: flex; - align-items: center; - } - :root.sw-yotsuba.fixed:not(.centered-links) #board-list { - flex: auto; - } - :root.sw-yotsuba.fixed:not(.centered-links) #full-board-list { - display: flex; - } - :root.sw-yotsuba.fixed:not(.centered-links) .hide-board-list-container { - flex: none; - margin-right: 5px; - } - :root.sw-yotsuba.fixed:not(.centered-links) #full-board-list > .boardList { - flex: auto; - display: flex; - width: 0px; /* XXX Fixes Edge not shrinking the board list below default size when needed */ - } - :root.sw-yotsuba.fixed:not(.centered-links) #full-board-list > .boardList > a, - :root.sw-yotsuba.fixed:not(.centered-links) #full-board-list > .boardList > span:not(.space):not(.spacer) { - flex: none; - padding: .17em; - margin: -.17em -.32em; - } - :root.sw-yotsuba.fixed:not(.centered-links) #full-board-list > .boardList > span { - pointer-events: none; - } - :root.sw-yotsuba.fixed:not(.centered-links) #full-board-list > .boardList > span.space { - flex: 0 .63 .63em; - } - :root.sw-yotsuba.fixed:not(.centered-links) #full-board-list > .boardList > span.spacer { - flex: 0 .38 .38em; - } - :root.sw-yotsuba.fixed:not(.centered-links) #shortcuts { - float: initial; - flex: none; - display: flex; - align-items: center; - } -} /* 4chan X link brackets */ .brackets-wrap::before { content: "["; @@ -6233,7 +6176,7 @@ svg.icon { TEX - + @@ -10430,7 +10373,7 @@ svg.icon { if (this.cb) { $.off(this.el, 'click', this.cb); } this.cb = function() { $.event('CloseMenu'); - return ThreadWatcher.toggle(thread); + return ThreadWatcher.toggle(thread, true); }; $.on(this.el, 'click', this.cb); return true; @@ -10493,8 +10436,8 @@ svg.icon { catalogNode() { if (ThreadWatcher.isWatched(this.thread)) { $.addClass(this.nodes.root, 'watched'); } return $.on(this.nodes.root, 'mousedown click', e => { - if ((e.button !== 0) || !e.altKey) { return; } - if (e.type === 'click') { ThreadWatcher.toggle(this.thread); } + if ((e.button !== 0) || !e.altKey) return; + if (e.type === 'click') ThreadWatcher.toggle(this.thread, true); return e.preventDefault(); }); }, // Also on mousedown to prevent highlighting thumbnail in Firefox. @@ -10532,6 +10475,16 @@ svg.icon { } $.event('CloseMenu'); }, + clear() { + if (!confirm("Delete ALL threads from watcher?")) return; + const ref = ThreadWatcher.getAll(); + for (let i = 0, len = ref.length; i < len; i++) { + const { siteID, boardID, threadID } = ref[i]; + ThreadWatcher.db.delete({ siteID, boardID, threadID }); + } + ThreadWatcher.refresh(true); + $.event('CloseMenu'); + }, pruneDeads() { if ($.hasClass(this, 'disabled')) return; for (var {siteID, boardID, threadID, data} of ThreadWatcher.getAll()) { @@ -10539,7 +10492,7 @@ svg.icon { ThreadWatcher.db.delete({siteID, boardID, threadID}); } } - ThreadWatcher.refresh(); + ThreadWatcher.refresh(true); $.event('CloseMenu'); }, pruneReadDeads() { @@ -10549,7 +10502,7 @@ svg.icon { ThreadWatcher.db.delete({ siteID, boardID, threadID }); } } - ThreadWatcher.refresh(); + ThreadWatcher.refresh(true); $.event('CloseMenu'); }, dismiss() { @@ -10562,22 +10515,24 @@ svg.icon { }, toggle() { const {thread} = Get.postFromNode(this); - ThreadWatcher.toggle(thread); + ThreadWatcher.toggle(thread, true); }, rm() { const {siteID} = this.parentNode.dataset; const [boardID, threadID] = this.parentNode.dataset.fullID.split('.'); - ThreadWatcher.rm(siteID, boardID, +threadID); + ThreadWatcher.rm(siteID, boardID, +threadID, undefined, true); }, post(e) { const {boardID, threadID, postID} = e.detail; const cb = PostRedirect.delay(); if (postID === threadID) { if (Conf['Auto Watch']) { - ThreadWatcher.addRaw(boardID, threadID, {}, cb); + ThreadWatcher.addRaw(boardID, threadID, {}, cb, true); } } else if (Conf['Auto Watch Reply']) { - ThreadWatcher.add((g.threads.get(boardID + '.' + threadID) || new Thread(threadID, g.boards[boardID] || new Board(boardID))), cb); + ThreadWatcher.add( + (g.threads.get(boardID + '.' + threadID) || new Thread(threadID, g.boards[boardID] || new Board(boardID))), + cb, true); } }, onIndexUpdate(e) { @@ -11010,7 +10965,7 @@ svg.icon { return ThreadWatcher.refreshIcon(); }, - refresh() { + refresh(manual) { ThreadWatcher.build(); g.threads.forEach(function(thread) { @@ -11027,7 +10982,7 @@ svg.icon { }); if (Conf['Pin Watched Threads']) { - return $.event('SortIndex', {deferred: Conf['Index Mode'] !== 'catalog'}); + return $.event('SortIndex', {deferred: !(manual && Conf['Index Mode'] === 'catalog')}); } }, @@ -11078,18 +11033,18 @@ svg.icon { return ThreadWatcher.db.extend({boardID, threadID, val: {isDead: true, isArchived: undefined, page: undefined, lastPage: undefined, unread: undefined, quotingYou: undefined}}, cb); }, - toggle(thread) { + toggle(thread, manual) { const siteID = g.SITE.ID; const boardID = thread.board.ID; const threadID = thread.ID; if (ThreadWatcher.db.get({boardID, threadID})) { - return ThreadWatcher.rm(siteID, boardID, threadID); + return ThreadWatcher.rm(siteID, boardID, threadID, undefined, manual); } else { - return ThreadWatcher.add(thread); + return ThreadWatcher.add(thread, undefined, manual); } }, - add(thread, cb) { + add(thread, cb, manual) { const data = {}; const siteID = g.SITE.ID; const boardID = thread.board.ID; @@ -11102,16 +11057,16 @@ svg.icon { data.isDead = true; } if (thread.OP) { data.excerpt = Get.threadExcerpt(thread); } - return ThreadWatcher.addRaw(boardID, threadID, data, cb); + return ThreadWatcher.addRaw(boardID, threadID, data, cb, manual); }, - addRaw(boardID, threadID, data, cb) { + addRaw(boardID, threadID, data, cb, manual) { const oldData = ThreadWatcher.db.get({ boardID, threadID, defaultValue: dict() }); delete oldData.last; delete oldData.modified; $.extend(oldData, data); ThreadWatcher.db.set({boardID, threadID, val: oldData}, cb); - ThreadWatcher.refresh(); + ThreadWatcher.refresh(manual); const thread = {siteID: g.SITE.ID, boardID, threadID, data, force: true}; if (Conf['Show Page'] && !data.isDead) { return ThreadWatcher.fetchBoard([thread]); @@ -11120,9 +11075,9 @@ svg.icon { } }, - rm(siteID, boardID, threadID, cb) { + rm(siteID, boardID, threadID, cb, manual) { ThreadWatcher.db.delete({siteID, boardID, threadID}, cb); - return ThreadWatcher.refresh(); + return ThreadWatcher.refresh(manual); }, menu: { @@ -11153,68 +11108,71 @@ svg.icon { return true; } }); - return $.on(entryEl, 'click', () => ThreadWatcher.toggle(g.threads.get(`${g.BOARD}.${g.THREADID}`))); + return $.on(entryEl, 'click', () => ThreadWatcher.toggle(g.threads.get(`${g.BOARD}.${g.THREADID}`), true)); }, addMenuEntries() { - const entries = []; - - // `Open all` entry - entries.push({ - text: 'Open all threads', - cb: ThreadWatcher.cb.openAll, - open() { - this.el.classList.toggle('disabled', !ThreadWatcher.list.firstElementChild); - return true; - } - }); - - // `Open Unread` entry - entries.push({ - text: 'Open unread threads', - cb: ThreadWatcher.cb.openUnread, - open() { - this.el.classList.toggle('disabled', !$('.replies-unread', ThreadWatcher.list)); - return true; - } - }); - const toggleDisabledDead = function () { this.el.classList.toggle('disabled', !$('.dead-thread', ThreadWatcher.list)); return true; }; - // `Open unread dead threads` entry - entries.push({ - text: 'Open unread dead threads', - cb: ThreadWatcher.cb.openDeads, - open: toggleDisabledDead, - }); - - // `Prune all dead threads` entry - entries.push({ - text: 'Prune all dead threads', - cb: ThreadWatcher.cb.pruneDeads, - open: toggleDisabledDead, - }); - - // `Prune read dead threads` entry - entries.push({ - text: 'Prune read dead threads', - cb: ThreadWatcher.cb.pruneReadDeads, - open: toggleDisabledDead, - }); - - // `Dismiss posts quoting you` entry - entries.push({ - text: 'Dismiss posts quoting you', - title: 'Unhighlight the thread watcher icon and threads until there are new replies quoting you.', - cb: ThreadWatcher.cb.dismiss, - open() { - this.el.classList.toggle('disabled', !$.hasClass(ThreadWatcher.shortcut, 'replies-quoting-you')); - return true; - } - }); + const entries = [ + // `Open all` entry + { + text: 'Open all threads', + cb: ThreadWatcher.cb.openAll, + open() { + this.el.classList.toggle('disabled', !ThreadWatcher.list.firstElementChild); + return true; + } + }, + { + text: 'Clear all threads', + cb: ThreadWatcher.cb.clear, + open() { + this.el.classList.toggle('disabled', !ThreadWatcher.list.firstElementChild); + return true; + } + }, + // `Open Unread` entry + { + text: 'Open unread threads', + cb: ThreadWatcher.cb.openUnread, + open() { + this.el.classList.toggle('disabled', !$('.replies-unread', ThreadWatcher.list)); + return true; + } + }, + // `Open unread dead threads` entry + { + text: 'Open unread dead threads', + cb: ThreadWatcher.cb.openDeads, + open: toggleDisabledDead, + }, + // `Prune all dead threads` entry + { + text: 'Prune all dead threads', + cb: ThreadWatcher.cb.pruneDeads, + open: toggleDisabledDead, + }, + // `Prune read dead threads` entry + { + text: 'Prune read dead threads', + cb: ThreadWatcher.cb.pruneReadDeads, + open: toggleDisabledDead, + }, + // `Dismiss posts quoting you` entry + { + text: 'Dismiss posts quoting you', + title: 'Unhighlight the thread watcher icon and threads until there are new replies quoting you.', + cb: ThreadWatcher.cb.dismiss, + open() { + this.el.classList.toggle('disabled', !$.hasClass(ThreadWatcher.shortcut, 'replies-quoting-you')); + return true; + } + }, + ]; for (var {text, title, cb, open} of entries) { var entry = { @@ -11250,8 +11208,10 @@ svg.icon { entry.el.title += '\n[Remember Last Read Post is disabled.]'; } $.on(input, 'change', $.cb.checked); - if (['Current Board', 'Show Page', 'Show Unread Count', 'Show Site Prefix'].includes(name)) { $.on(input, 'change', ThreadWatcher.refresh); } - if (['Show Page', 'Show Unread Count', 'Auto Update Thread Watcher'].includes(name)) { $.on(input, 'change', ThreadWatcher.fetchAuto); } + if (['Current Board', 'Show Page', 'Show Unread Count', 'Show Site Prefix'].includes(name)) + $.on(input, 'change', () => ThreadWatcher.refresh()); + if (['Show Page', 'Show Unread Count', 'Auto Update Thread Watcher'].includes(name)) + $.on(input, 'change', ThreadWatcher.fetchAuto); return this.menu.addEntry(entry); } } @@ -12411,18 +12371,17 @@ svg.icon { }, catalogNode() { - return $.on(this.nodes.root, 'mousedown click', e => { - if ((e.button !== 0) || !e.shiftKey) { return; } - if (e.type === 'click') { - e.preventDefault(); - if (Conf['MD5 Quick Filter in the Catalog'] && e.target.classList.contains('catalog-thumb')) { - Filter.quickFilterMD5.call(this.thread.OP); - } else { - Index.toggleHide(this.thread); - } + return $.on(this.nodes.root, 'click', e => { + if ((e.button !== 0) || !e.shiftKey) return; + e.preventDefault(); + getSelection().removeAllRanges(); + if (Conf['MD5 Quick Filter in the Catalog'] && e.target.classList.contains('catalog-thumb')) { + Filter.quickFilterMD5.call(this.thread.OP); + } else { + Index.toggleHide(this.thread); } }); - }, // Also on mousedown to prevent highlighting text. + }, toggleHide(thread) { if (Index.showHiddenThreads) { @@ -25276,7 +25235,10 @@ Enable it on boards.${location.hostname.split('.')[1]}.org in your browser's pri if (doc && $.hasClass(doc, 'fourchan-x')) { return; } $.asap(docSet, function() { $.addClass(doc, 'fourchan-xt', 'fourchan-x', 'seaweedchan'); - if ($.engine) { return $.addClass(doc, `ua-${$.engine}`); } + if ($.engine) $.addClass(doc, `ua-${$.engine}`); + BoardConfig.ready(() => { + if (g.BOARD?.config.ws_board != null) $.addClass(doc, g.BOARD.config.ws_board ? 'ws' : 'nws'); + }); }); try { $.global( @@ -25360,7 +25322,10 @@ Enable it on boards.${location.hostname.split('.')[1]}.org in your browser's pri !SW.yotsuba.regexp.captcha.test(location.href) && !$$('script:not([src])', d).filter(s => /this\[/.test(s.textContent)).length ) { - ($.getSync || $.get)({'jsWhitelist': Conf['jsWhitelist']}, ({jsWhitelist}) => $.addCSP(`script-src ${jsWhitelist.replace(/^#.*$/mg, '').replace(/[\s;]+/g, ' ').trim()}`)); + ($.getSync || $.get)({'jsWhitelist': Conf['jsWhitelist']}, ({jsWhitelist}) => { + const parsedList = jsWhitelist.replace(/^#.*$/mg, '').replace(/[\s;]+/g, ' ').trim(); + if (/\S/.test(parsedList)) $.addCSP(`script-src ${parsedList}`); + }); } // Get saved values as items diff --git a/cspell.json b/cspell.json index dddf9c26c..51b54bc24 100644 --- a/cspell.json +++ b/cspell.json @@ -34,6 +34,7 @@ "deadlink", "endregion", "fappe", + "fourchan", "grecaptcha", "noti", "quotelink", diff --git a/src/General/Index.js b/src/General/Index.js index f42269ca8..e7ca4a19f 100644 --- a/src/General/Index.js +++ b/src/General/Index.js @@ -294,18 +294,17 @@ var Index = { }, catalogNode() { - return $.on(this.nodes.root, 'mousedown click', e => { - if ((e.button !== 0) || !e.shiftKey) { return; } - if (e.type === 'click') { - e.preventDefault(); - if (Conf['MD5 Quick Filter in the Catalog'] && e.target.classList.contains('catalog-thumb')) { - Filter.quickFilterMD5.call(this.thread.OP); - } else { - Index.toggleHide(this.thread); - } + return $.on(this.nodes.root, 'click', e => { + if ((e.button !== 0) || !e.shiftKey) return; + e.preventDefault(); + getSelection().removeAllRanges(); + if (Conf['MD5 Quick Filter in the Catalog'] && e.target.classList.contains('catalog-thumb')) { + Filter.quickFilterMD5.call(this.thread.OP); + } else { + Index.toggleHide(this.thread); } }); - }, // Also on mousedown to prevent highlighting text. + }, toggleHide(thread) { if (Index.showHiddenThreads) { diff --git a/src/General/Settings/SettingsHtml.tsx b/src/General/Settings/SettingsHtml.tsx index 4948e4c6e..57a270f3c 100644 --- a/src/General/Settings/SettingsHtml.tsx +++ b/src/General/Settings/SettingsHtml.tsx @@ -13,7 +13,7 @@ const settingsHtml = Export{separator} Import{separator} Reset Settings{separator} - + {meta.name}{separator} {g.VERSION}{separator} Issues{separator} diff --git a/src/Posting/QR/QuickReply.html b/src/Posting/QR/QuickReply.html index 4678089ce..a9370ac54 100644 --- a/src/Posting/QR/QuickReply.html +++ b/src/Posting/QR/QuickReply.html @@ -14,7 +14,7 @@ TEX - + diff --git a/src/css/style.css b/src/css/style.css index 6ce7a6309..91cffa5cd 100644 --- a/src/css/style.css +++ b/src/css/style.css @@ -398,49 +398,6 @@ audio.controls-added { font-size: 16px; line-height: 12px; } -@media (min-width: 1300px) { - :root.sw-yotsuba.fixed:not(.centered-links) #header-bar { - white-space: nowrap; - display: flex; - align-items: center; - } - :root.sw-yotsuba.fixed:not(.centered-links) #board-list { - flex: auto; - } - :root.sw-yotsuba.fixed:not(.centered-links) #full-board-list { - display: flex; - } - :root.sw-yotsuba.fixed:not(.centered-links) .hide-board-list-container { - flex: none; - margin-right: 5px; - } - :root.sw-yotsuba.fixed:not(.centered-links) #full-board-list > .boardList { - flex: auto; - display: flex; - width: 0px; /* XXX Fixes Edge not shrinking the board list below default size when needed */ - } - :root.sw-yotsuba.fixed:not(.centered-links) #full-board-list > .boardList > a, - :root.sw-yotsuba.fixed:not(.centered-links) #full-board-list > .boardList > span:not(.space):not(.spacer) { - flex: none; - padding: .17em; - margin: -.17em -.32em; - } - :root.sw-yotsuba.fixed:not(.centered-links) #full-board-list > .boardList > span { - pointer-events: none; - } - :root.sw-yotsuba.fixed:not(.centered-links) #full-board-list > .boardList > span.space { - flex: 0 .63 .63em; - } - :root.sw-yotsuba.fixed:not(.centered-links) #full-board-list > .boardList > span.spacer { - flex: 0 .38 .38em; - } - :root.sw-yotsuba.fixed:not(.centered-links) #shortcuts { - float: initial; - flex: none; - display: flex; - align-items: center; - } -} /* 4chan X link brackets */ .brackets-wrap::before { content: "["; diff --git a/src/main/Main.js b/src/main/Main.js index 5830683d1..0751519b4 100644 --- a/src/main/Main.js +++ b/src/main/Main.js @@ -125,7 +125,10 @@ var Main = { if (doc && $.hasClass(doc, 'fourchan-x')) { return; } $.asap(docSet, function() { $.addClass(doc, 'fourchan-xt', 'fourchan-x', 'seaweedchan'); - if ($.engine) { return $.addClass(doc, `ua-${$.engine}`); } + if ($.engine) $.addClass(doc, `ua-${$.engine}`); + BoardConfig.ready(() => { + if (g.BOARD?.config.ws_board != null) $.addClass(doc, g.BOARD.config.ws_board ? 'ws' : 'nws'); + }); }); try { $.global( diff --git a/version.json b/version.json index 31efc8a2c..1f4e43844 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "2.18.0", - "date": "2024-11-20T18:50:00Z" + "version": "2.19.0", + "date": "2024-12-22T16:50:00Z" } \ No newline at end of file
'},"[/code]":{innerHTML:"
Filter
Use < }),x("#filterTypes",t).textContent=`type:${o};`,x(".warning",t).hidden=a.Filter},sauce(e){x.extend(e,{ innerHTML:'
Sauce
%IMG
%URL
%TURL
%name
%board
%MD5
%sMD5
-
_
%hMD5
%$0
%$1
%$2
%$3
%%
%semi
%
;
#
;text:[text]
;boards:[board1],[board2]
;types:[extension1],[extension2]
;regexp:[regular expression]
404 Redirect
uid
name
External Catalog
;boards:
;exclude:
g
a
b
current
@
g-archive
g-expired
g-title
g-replace
g-full
g-text:"Install Gentoo"
g-index
g-catalog
g-mode:"infinite scrolling"
g-sort:"creation date rev"
external-text:"Google","http://www.google.com"
g-nt
g-index-text:"Technology Index"
toggle-all
[ toggle-all ] [current-title] [g-title / a-title / jp-title] [x / wsg / h] [t-text:"Piracy"]
[ + ] [Technology] [Technology / Anime & Manga / Otaku Culture] [x / wsg / h] [Piracy]
{{
}}
[g-title] {{"favorites"[a-title / jp-title]}}
[<a [...] >Technology</a>] <span class="favorites">[<a [...] >Anime & Manga</a> / <a [...] >Otaku Culture</a>]</span>
%a
%A
%d
%e
%m
%b
%B
%y
%Y
%k
%H
%l
%I
%p
%P
%M
%S
%L
%T
%n
%N
%t
%f
%K
%s
%r
%g
One item per line. Items will be added in the relevant input's auto-completion list. Password items will always be used, since there is no password input. Lines starting with a # will be ignored.
options
email
subject
password
options:"sage"
always
options:"sage";always
options:"sage";boards:jp;always
en
data: